/* * Copyright 2001-2008 Geert Bevin (gbevin[remove] at uwyn dot com) * Licensed under the Apache License, Version 2.0 (the "License") * $Id: oracle_jdbc_driver_OracleDriver.java 3918 2008-04-14 17:35:35Z gbevin $ */ package com.uwyn.rife.cmf.dam.contentstores.textstoredrivers; import com.uwyn.rife.database.*; import com.uwyn.rife.cmf.dam.ContentDataUser; import com.uwyn.rife.cmf.dam.contentstores.exceptions.StoreContentDataErrorException; import com.uwyn.rife.cmf.dam.contentstores.exceptions.UseContentDataErrorException; import com.uwyn.rife.cmf.dam.exceptions.ContentManagerException; import com.uwyn.rife.config.RifeConfig; import com.uwyn.rife.database.exceptions.DatabaseException; import com.uwyn.rife.database.queries.CreateTable; import com.uwyn.rife.database.queries.Insert; import com.uwyn.rife.database.queries.Select; import com.uwyn.rife.tools.exceptions.InnerClassException; import java.io.CharArrayWriter; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.Writer; import java.sql.Clob; import java.sql.SQLException; import java.sql.Types; import oracle.sql.CLOB; public class oracle_jdbc_driver_OracleDriver extends generic { private Insert mStoreContentEmptyClob = null; public oracle_jdbc_driver_OracleDriver(Datasource datasource) { super(datasource); mCreateTableContent = new CreateTable(getDatasource()) .table(RifeConfig.Cmf.getTableContentStoreText()) .column("contentId", int.class, CreateTable.NOTNULL) .column(getContentSizeColumnName(), int.class, CreateTable.NOTNULL) .column("content", Clob.class) .primaryKey(("PK_"+RifeConfig.Cmf.getTableContentStoreText()).toUpperCase(), "contentId") .foreignKey(("FK_"+RifeConfig.Cmf.getTableContentStoreText()).toUpperCase(), RifeConfig.Cmf.getTableContentInfo(), "contentId", "contentId"); mStoreContentEmptyClob = new Insert(getDatasource()) .into(RifeConfig.Cmf.getTableContentStoreText()) .fieldParameter("contentId") .fieldParameter(getContentSizeColumnName()) .fieldCustom("content", "empty_clob()"); } protected String getContentSizeColumnName() { return "contentsize"; } public <ResultType> ResultType useContentData(final int id, ContentDataUser user) throws ContentManagerException { if (id < 0) throw new IllegalArgumentException("id must be positive"); if (null == user) throw new IllegalArgumentException("user can't be null"); try { return (ResultType)user.useContentData(executeQuery(mRetrieveContent, new DbPreparedStatementHandler() { public void setParameters(DbPreparedStatement statement) { statement .setInt("contentId", id); } public Object concludeResults(DbResultSet resultset) throws SQLException { if (!resultset.next()) { return null; } CharArrayWriter writer = new CharArrayWriter(); CLOB clob = (CLOB)resultset.getClob("content"); if (null == clob) { return null; } Reader reader = clob.getCharacterStream(); try { try { char[] buffer = new char[clob.getBufferSize()]; int size = 0; while ((size = reader.read(buffer)) != -1) { writer.write(buffer, 0, size); } writer.flush(); } finally { reader.close(); } } catch (IOException e) { throw new UseContentDataErrorException(id, e); } return writer.toString(); } })); } catch (DatabaseException e) { throw new UseContentDataErrorException(id, e); } } protected boolean storeContent(Insert storeContent, final int id, final String data) throws ContentManagerException { try { if (null == data) { return executeUpdate(storeContent, new DbPreparedStatementHandler() { public void setParameters(DbPreparedStatement statement) { statement .setInt("contentId", id) .setNull("content", Types.CLOB) .setInt(getContentSizeColumnName(), 0); } }) != -1; } else { Integer result = inTransaction(new DbTransactionUser() { public Object useTransaction() throws InnerClassException { int result = executeUpdate(mStoreContentEmptyClob, new DbPreparedStatementHandler() { public void setParameters(DbPreparedStatement statement) { statement .setInt("contentId", id) .setInt(getContentSizeColumnName(), data.length()); } }); executeQuery(new Select(getDatasource()) .from(mStoreContentEmptyClob.getInto()) .field("content") .where("contentId = "+id+" FOR UPDATE"), new DbResultSetHandler() { public Object concludeResults(DbResultSet resultset) throws SQLException { if (!resultset.next()) { return null; } CLOB clob = (CLOB)resultset.getClob(1); char[] buffer = new char[clob.getBufferSize()]; StringReader reader = new StringReader(data); Writer writer = clob.getCharacterOutputStream(); try { try { int size = 0; while ((size = reader.read(buffer)) != -1) { writer.write(buffer, 0, size); } } finally { writer.close(); } } catch (IOException e) { throw new DatabaseException(e); } return null; } }); return result; } }); return null != result && result != -1; } } catch (DatabaseException e) { throw new StoreContentDataErrorException(id, e); } } }