Index: src/main/java/org/apache/jackrabbit/core/fs/db/DB2FileSystem.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/fs/db/DB2FileSystem.java (revision 586267) +++ src/main/java/org/apache/jackrabbit/core/fs/db/DB2FileSystem.java (working copy) @@ -50,7 +50,7 @@ */ public DB2FileSystem() { // preset some attributes to reasonable defaults - schema = "db2"; + schemaDDL = "db2"; driver = "com.ibm.db2.jcc.DB2Driver"; schemaObjectPrefix = ""; user = ""; Index: src/main/java/org/apache/jackrabbit/core/fs/db/DatabaseFileSystem.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/fs/db/DatabaseFileSystem.java (revision 586267) +++ src/main/java/org/apache/jackrabbit/core/fs/db/DatabaseFileSystem.java (working copy) @@ -66,11 +66,14 @@ protected static final String SCHEMA_OBJECT_PREFIX_VARIABLE = "${schemaObjectPrefix}"; + + protected static final String SCHEMA_VARIABLE = "${schema}"; protected boolean initialized; + protected String schemaDDL; + protected String schemaObjectPrefix; protected String schema; - protected String schemaObjectPrefix; // initial size of buffer used to serialize objects protected static final int INITIAL_BUFFER_SIZE = 8192; @@ -108,7 +111,7 @@ * Default constructor */ public DatabaseFileSystem() { - schema = "default"; + schemaDDL = "default"; schemaObjectPrefix = ""; initialized = false; } @@ -123,12 +126,20 @@ this.schemaObjectPrefix = schemaObjectPrefix.toUpperCase(); } - public String getSchema() { - return schema; + public String getSchemaDDL() { + return schemaDDL; } + public void setSchemaDDL(String schema) { + this.schemaDDL = schema; + } + + public String getSchema() { + return schema; + } + public void setSchema(String schema) { - this.schema = schema; + this.schema = schema; } //-------------------------------------------< java.lang.Object overrides > @@ -141,7 +152,7 @@ } if (obj instanceof DatabaseFileSystem) { DatabaseFileSystem other = (DatabaseFileSystem) obj; - if (((schema != null) ? schema.equals(other.schema) : other.schema == null) + if (((schemaDDL != null) ? schemaDDL.equals(other.schemaDDL) : other.schemaDDL == null) && ((schemaObjectPrefix != null) ? schemaObjectPrefix.equals(other.schemaObjectPrefix) : other.schemaObjectPrefix == null)) { return true; } @@ -1137,6 +1148,7 @@ } else if (metaData.storesUpperCaseIdentifiers()) { tableName = tableName.toUpperCase(); } + ResultSet rs = metaData.getTables(null, null, tableName, null); boolean schemaExists; try { @@ -1147,9 +1159,11 @@ if (!schemaExists) { // read ddl from resources - InputStream in = DatabaseFileSystem.class.getResourceAsStream(schema + ".ddl"); + InputStream in = DatabaseFileSystem.class.getResourceAsStream(schemaDDL + ".ddl"); if (in == null) { - String msg = "Configuration error: unknown schema '" + schema + "'"; + String msg = "Configuration error: unknown schemaDDL resource '" + schemaDDL + "', +\n" + + "Default DDL resource for database is 'database', +\n" + + "i.e. when using an oracle database, set the schemaDDL value 'oracle'"; log.debug(msg); throw new RepositoryException(msg); } @@ -1162,6 +1176,9 @@ if (!sql.startsWith("#") && sql.length() > 0) { // replace prefix variable sql = Text.replace(sql, SCHEMA_OBJECT_PREFIX_VARIABLE, schemaObjectPrefix); + //if schema has been set then replace the SCHEMA_VARIABLE in the sql statement + sql = Text.replace(sql, SCHEMA_VARIABLE, safeSchema()); + log.info("sql : "+sql); // execute sql stmt stmt.executeUpdate(sql); } @@ -1175,6 +1192,10 @@ } } + private String safeSchema() { + return getSchema() != null ? getSchema() + "." : ""; + } + /** * Builds the SQL statements */ @@ -1179,7 +1200,8 @@ * Builds the SQL statements */ protected void buildSQLStatements() { - insertFileSQL = "insert into " + insertFileSQL = "insert into " + + safeSchema() + schemaObjectPrefix + "FSENTRY " + "(FSENTRY_PATH, FSENTRY_NAME, FSENTRY_DATA, " + "FSENTRY_LASTMOD, FSENTRY_LENGTH) " @@ -1185,7 +1207,8 @@ + "FSENTRY_LASTMOD, FSENTRY_LENGTH) " + "values (?, ?, ?, ?, ?)"; - insertFolderSQL = "insert into " + insertFolderSQL = "insert into " + + safeSchema() + schemaObjectPrefix + "FSENTRY " + "(FSENTRY_PATH, FSENTRY_NAME, FSENTRY_LASTMOD, FSENTRY_LENGTH) " + "values (?, ?, ?, 0)"; @@ -1190,7 +1213,8 @@ + "(FSENTRY_PATH, FSENTRY_NAME, FSENTRY_LASTMOD, FSENTRY_LENGTH) " + "values (?, ?, ?, 0)"; - updateDataSQL = "update " + updateDataSQL = "update " + + safeSchema() + schemaObjectPrefix + "FSENTRY " + "set FSENTRY_DATA = ?, FSENTRY_LASTMOD = ?, FSENTRY_LENGTH = ? " + "where FSENTRY_PATH = ? and FSENTRY_NAME = ? " @@ -1196,7 +1220,8 @@ + "where FSENTRY_PATH = ? and FSENTRY_NAME = ? " + "and FSENTRY_DATA is not null"; - updateLastModifiedSQL = "update " + updateLastModifiedSQL = "update " + + safeSchema() + schemaObjectPrefix + "FSENTRY set FSENTRY_LASTMOD = ? " + "where FSENTRY_PATH = ? and FSENTRY_NAME = ? " + "and FSENTRY_DATA is not null"; @@ -1201,49 +1226,61 @@ + "where FSENTRY_PATH = ? and FSENTRY_NAME = ? " + "and FSENTRY_DATA is not null"; - selectExistSQL = "select 1 from " + selectExistSQL = "select 1 from " + + safeSchema() + schemaObjectPrefix + "FSENTRY where FSENTRY_PATH = ? " + "and FSENTRY_NAME = ?"; - selectFileExistSQL = "select 1 from " + selectFileExistSQL = "select 1 from " + + safeSchema() + schemaObjectPrefix + "FSENTRY where FSENTRY_PATH = ? " + "and FSENTRY_NAME = ? and FSENTRY_DATA is not null"; - selectFolderExistSQL = "select 1 from " + selectFolderExistSQL = "select 1 from " + + safeSchema() + schemaObjectPrefix + "FSENTRY where FSENTRY_PATH = ? " + "and FSENTRY_NAME = ? and FSENTRY_DATA is null"; - selectFileNamesSQL = "select FSENTRY_NAME from " + selectFileNamesSQL = "select FSENTRY_NAME from " + + safeSchema() + schemaObjectPrefix + "FSENTRY where FSENTRY_PATH = ? " + "and FSENTRY_DATA is not null"; - selectFolderNamesSQL = "select FSENTRY_NAME from " + selectFolderNamesSQL = "select FSENTRY_NAME from " + + safeSchema() + schemaObjectPrefix + "FSENTRY where FSENTRY_PATH = ? " + "and FSENTRY_DATA is null"; - selectFileAndFolderNamesSQL = "select FSENTRY_NAME from " + selectFileAndFolderNamesSQL = "select FSENTRY_NAME from " + + safeSchema() + schemaObjectPrefix + "FSENTRY where FSENTRY_PATH = ?"; - selectChildCountSQL = "select count(FSENTRY_NAME) from " + selectChildCountSQL = "select count(FSENTRY_NAME) from " + + safeSchema() + schemaObjectPrefix + "FSENTRY where FSENTRY_PATH = ? "; - selectDataSQL = "select FSENTRY_DATA from " + selectDataSQL = "select FSENTRY_DATA from " + + safeSchema() + schemaObjectPrefix + "FSENTRY where FSENTRY_PATH = ? " + "and FSENTRY_NAME = ? and FSENTRY_DATA is not null"; - selectLastModifiedSQL = "select FSENTRY_LASTMOD from " + selectLastModifiedSQL = "select FSENTRY_LASTMOD from " + + safeSchema() + schemaObjectPrefix + "FSENTRY where FSENTRY_PATH = ? " + "and FSENTRY_NAME = ?"; - selectLengthSQL = "select FSENTRY_LENGTH from " + selectLengthSQL = "select FSENTRY_LENGTH from " + + safeSchema() + schemaObjectPrefix + "FSENTRY where FSENTRY_PATH = ? " + "and FSENTRY_NAME = ? and FSENTRY_DATA is not null"; - deleteFileSQL = "delete from " + deleteFileSQL = "delete from " + + safeSchema() + schemaObjectPrefix + "FSENTRY where FSENTRY_PATH = ? " + "and FSENTRY_NAME = ? and FSENTRY_DATA is not null"; - deleteFolderSQL = "delete from " + deleteFolderSQL = "delete from " + + safeSchema() + schemaObjectPrefix + "FSENTRY where " + "(FSENTRY_PATH = ? and FSENTRY_NAME = ? and FSENTRY_DATA is null) " + "or (FSENTRY_PATH = ?) " @@ -1249,7 +1286,8 @@ + "or (FSENTRY_PATH = ?) " + "or (FSENTRY_PATH like ?) "; - copyFileSQL = "insert into " + copyFileSQL = "insert into " + + safeSchema() + schemaObjectPrefix + "FSENTRY " + "(FSENTRY_PATH, FSENTRY_NAME, FSENTRY_DATA, " + "FSENTRY_LASTMOD, FSENTRY_LENGTH) " @@ -1258,7 +1296,8 @@ + schemaObjectPrefix + "FSENTRY where FSENTRY_PATH = ? " + "and FSENTRY_NAME = ? and FSENTRY_DATA is not null"; - copyFilesSQL = "insert into " + copyFilesSQL = "insert into " + + safeSchema() + schemaObjectPrefix + "FSENTRY " + "(FSENTRY_PATH, FSENTRY_NAME, FSENTRY_DATA, " + "FSENTRY_LASTMOD, FSENTRY_LENGTH) " Index: src/main/java/org/apache/jackrabbit/core/fs/db/DerbyFileSystem.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/fs/db/DerbyFileSystem.java (revision 586267) +++ src/main/java/org/apache/jackrabbit/core/fs/db/DerbyFileSystem.java (working copy) @@ -70,7 +70,7 @@ */ public DerbyFileSystem() { // preset some attributes to reasonable defaults - schema = "derby"; + schemaDDL = "derby"; driver = "org.apache.derby.jdbc.EmbeddedDriver"; shutdownOnClose = true; initialized = false; Index: src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java (revision 586267) +++ src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java (working copy) @@ -96,7 +96,7 @@ */ public OracleFileSystem() { // preset some attributes to reasonable defaults - schema = "oracle"; + schemaDDL = "oracle"; driver = "oracle.jdbc.OracleDriver"; schemaObjectPrefix = ""; user = ""; @@ -183,9 +183,9 @@ if (!schemaExists) { // read ddl from resources - InputStream in = OracleFileSystem.class.getResourceAsStream(schema + ".ddl"); + InputStream in = OracleFileSystem.class.getResourceAsStream(schemaDDL + ".ddl"); if (in == null) { - String msg = "Configuration error: unknown schema '" + schema + "'"; + String msg = "Configuration error: unknown schema '" + schemaDDL + "'"; log.debug(msg); throw new RepositoryException(msg); } Index: src/main/java/org/apache/jackrabbit/core/persistence/db/DatabasePersistenceManager.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/persistence/db/DatabasePersistenceManager.java (revision 586267) +++ src/main/java/org/apache/jackrabbit/core/persistence/db/DatabasePersistenceManager.java (working copy) @@ -78,8 +78,13 @@ protected static final String SCHEMA_OBJECT_PREFIX_VARIABLE = "${schemaObjectPrefix}"; + protected static final String SCHEMA_VARIABLE = "${schema}"; + protected boolean initialized; + /* the ddl file to read to get the table creation commands */ + protected String schemaDDL; + /* the optional schema prefix to put the jcr tables in */ protected String schema; protected String schemaObjectPrefix; @@ -146,7 +151,7 @@ * Creates a new DatabasePersistenceManager instance. */ public DatabasePersistenceManager() { - schema = "default"; + schemaDDL = "default"; schemaObjectPrefix = ""; externalBLOBs = true; initialized = false; @@ -163,12 +168,20 @@ this.schemaObjectPrefix = schemaObjectPrefix.toUpperCase(); } - public String getSchema() { - return schema; + public String getSchemaDDL() { + return schemaDDL; } + public void setSchemaDDL(String schemaDDL) { + this.schemaDDL = schemaDDL; + } + + public String getSchema() { + return schema; + } + public void setSchema(String schema) { - this.schema = schema; + this.schema = schema; } public boolean isExternalBLOBs() { @@ -997,10 +1010,12 @@ if (!schemaExists) { // read ddl from resources - InputStream in = getSchemaDDL(); + InputStream in = getSchemaDDLResource(); if (in == null) { - String msg = "Configuration error: unknown schema '" + schema + "'"; - log.debug(msg); + String msg = "Configuration error: unknown schemaDDL resource '" + schemaDDL + "', +\n" + + "Default DDL resource for database is 'database', +\n" + + "i.e. when using an oracle database, set the schemaDDL value 'oracle'"; + log.info(msg); throw new RepositoryException(msg); } BufferedReader reader = new BufferedReader(new InputStreamReader(in)); @@ -1012,6 +1027,8 @@ if (!sql.startsWith("#") && sql.length() > 0) { // replace prefix variable sql = Text.replace(sql, SCHEMA_OBJECT_PREFIX_VARIABLE, schemaObjectPrefix); + //if schema has been set then replace the SCHEMA_VARIABLE in the sql statement + sql = Text.replace(sql, SCHEMA_VARIABLE, safeSchema()); // execute sql stmt stmt.executeUpdate(sql); } @@ -1031,12 +1048,16 @@ * Returns an input stream to the schema DDL resource. * @return an input stream to the schema DDL resource. */ - protected InputStream getSchemaDDL() { + protected InputStream getSchemaDDLResource() { // JCR-595: Use the class explicitly instead of using getClass() // to avoid problems when subclassed in a different package - return DatabasePersistenceManager.class.getResourceAsStream(schema + ".ddl"); + return DatabasePersistenceManager.class.getResourceAsStream(schemaDDL + ".ddl"); } + private String safeSchema() { + return getSchema() != null ? getSchema() + "." : ""; + } + /** * Builds the SQL statements */ @@ -1041,52 +1062,70 @@ * Builds the SQL statements */ protected void buildSQLStatements() { - nodeStateInsertSQL = "insert into " + nodeStateInsertSQL = "insert into " + + safeSchema() + schemaObjectPrefix + "NODE (NODE_DATA, NODE_ID) values (?, ?)"; - - nodeStateUpdateSQL = "update " + nodeStateUpdateSQL = "update " + + safeSchema() + schemaObjectPrefix + "NODE set NODE_DATA = ? where NODE_ID = ?"; - nodeStateSelectSQL = "select NODE_DATA from " + nodeStateSelectSQL = "select NODE_DATA from " + + safeSchema() + schemaObjectPrefix + "NODE where NODE_ID = ?"; - nodeStateSelectExistSQL = "select 1 from " + nodeStateSelectExistSQL = "select 1 from " + + safeSchema() + schemaObjectPrefix + "NODE where NODE_ID = ?"; - nodeStateDeleteSQL = "delete from " + nodeStateDeleteSQL = "delete from " + + safeSchema() + schemaObjectPrefix + "NODE where NODE_ID = ?"; - - propertyStateInsertSQL = "insert into " + propertyStateInsertSQL = "insert into " + + safeSchema() + schemaObjectPrefix + "PROP (PROP_DATA, PROP_ID) values (?, ?)"; - propertyStateUpdateSQL = "update " + propertyStateUpdateSQL = "update " + + safeSchema() + schemaObjectPrefix + "PROP set PROP_DATA = ? where PROP_ID = ?"; - propertyStateSelectSQL = "select PROP_DATA from " + propertyStateSelectSQL = "select PROP_DATA from " + + safeSchema() + schemaObjectPrefix + "PROP where PROP_ID = ?"; - propertyStateSelectExistSQL = "select 1 from " + propertyStateSelectExistSQL = "select 1 from " + + safeSchema() + schemaObjectPrefix + "PROP where PROP_ID = ?"; - propertyStateDeleteSQL = "delete from " + propertyStateDeleteSQL = "delete from " + + safeSchema() + schemaObjectPrefix + "PROP where PROP_ID = ?"; - nodeReferenceInsertSQL = "insert into " + nodeReferenceInsertSQL = "insert into " + + safeSchema() + schemaObjectPrefix + "REFS (REFS_DATA, NODE_ID) values (?, ?)"; - nodeReferenceUpdateSQL = "update " + nodeReferenceUpdateSQL = "update " + + safeSchema() + schemaObjectPrefix + "REFS set REFS_DATA = ? where NODE_ID = ?"; - nodeReferenceSelectSQL = "select REFS_DATA from " + nodeReferenceSelectSQL = "select REFS_DATA from " + + safeSchema() + schemaObjectPrefix + "REFS where NODE_ID = ?"; - nodeReferenceSelectExistSQL = "select 1 from " + nodeReferenceSelectExistSQL = "select 1 from " + + safeSchema() + schemaObjectPrefix + "REFS where NODE_ID = ?"; - nodeReferenceDeleteSQL = "delete from " + nodeReferenceDeleteSQL = "delete from " + + safeSchema() + schemaObjectPrefix + "REFS where NODE_ID = ?"; if (!externalBLOBs) { - blobInsertSQL = "insert into " + blobInsertSQL = "insert into " + + safeSchema() + schemaObjectPrefix + "BINVAL (BINVAL_DATA, BINVAL_ID) values (?, ?)"; - blobUpdateSQL = "update " + blobUpdateSQL = "update " + + safeSchema() + schemaObjectPrefix + "BINVAL set BINVAL_DATA = ? where BINVAL_ID = ?"; blobSelectSQL = - "select BINVAL_DATA from " + "select BINVAL_DATA from " + + safeSchema() + schemaObjectPrefix + "BINVAL where BINVAL_ID = ?"; blobSelectExistSQL = - "select 1 from " + "select 1 from " + + safeSchema() + schemaObjectPrefix + "BINVAL where BINVAL_ID = ?"; - blobDeleteSQL = "delete from " + blobDeleteSQL = "delete from " + + safeSchema() + schemaObjectPrefix + "BINVAL where BINVAL_ID = ?"; } } Index: src/main/java/org/apache/jackrabbit/core/persistence/db/DerbyPersistenceManager.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/persistence/db/DerbyPersistenceManager.java (revision 586267) +++ src/main/java/org/apache/jackrabbit/core/persistence/db/DerbyPersistenceManager.java (working copy) @@ -78,7 +78,7 @@ */ public DerbyPersistenceManager() { // preset some attributes to reasonable defaults - schema = "derby"; + schemaDDL = "derby"; driver = "org.apache.derby.jdbc.EmbeddedDriver"; schemaObjectPrefix = ""; shutdownOnClose = true; Index: src/main/java/org/apache/jackrabbit/core/persistence/db/OraclePersistenceManager.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/persistence/db/OraclePersistenceManager.java (revision 586267) +++ src/main/java/org/apache/jackrabbit/core/persistence/db/OraclePersistenceManager.java (working copy) @@ -103,7 +103,7 @@ */ public OraclePersistenceManager() { // preset some attributes to reasonable defaults - schema = "oracle"; + schemaDDL = "oracle"; driver = "oracle.jdbc.OracleDriver"; schemaObjectPrefix = ""; user = ""; @@ -311,9 +311,9 @@ if (!schemaExists) { // read ddl from resources - InputStream in = getSchemaDDL(); + InputStream in = getSchemaDDLResource(); if (in == null) { - String msg = "Configuration error: unknown schema '" + schema + "'"; + String msg = "Configuration error: unknown schema '" + schemaDDL + "'"; log.debug(msg); throw new RepositoryException(msg); } Index: src/main/resources/org/apache/jackrabbit/core/fs/db/postgresql.ddl =================================================================== --- src/main/resources/org/apache/jackrabbit/core/fs/db/postgresql.ddl (revision 586267) +++ src/main/resources/org/apache/jackrabbit/core/fs/db/postgresql.ddl (working copy) @@ -12,5 +12,5 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -create table ${schemaObjectPrefix}FSENTRY (FSENTRY_PATH varchar not null, FSENTRY_NAME varchar not null, FSENTRY_DATA bytea null, FSENTRY_LASTMOD bigint not null, FSENTRY_LENGTH bigint not null) -create unique index ${schemaObjectPrefix}FSENTRY_IDX on ${schemaObjectPrefix}FSENTRY (FSENTRY_PATH, FSENTRY_NAME) +create table ${schema}${schemaObjectPrefix}FSENTRY (FSENTRY_PATH varchar not null, FSENTRY_NAME varchar not null, FSENTRY_DATA bytea null, FSENTRY_LASTMOD bigint not null, FSENTRY_LENGTH bigint not null) +create unique index ${schemaObjectPrefix}FSENTRY_IDX on ${schema}${schemaObjectPrefix}FSENTRY (FSENTRY_PATH, FSENTRY_NAME) Index: src/main/resources/org/apache/jackrabbit/core/persistence/db/postgresql.ddl =================================================================== --- src/main/resources/org/apache/jackrabbit/core/persistence/db/postgresql.ddl (revision 586267) +++ src/main/resources/org/apache/jackrabbit/core/persistence/db/postgresql.ddl (working copy) @@ -12,11 +12,11 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -create table ${schemaObjectPrefix}NODE (NODE_ID char(36) not null, NODE_DATA bytea not null) -create unique index ${schemaObjectPrefix}NODE_IDX on ${schemaObjectPrefix}NODE (NODE_ID) -create table ${schemaObjectPrefix}PROP (PROP_ID varchar not null, PROP_DATA bytea not null) -create unique index ${schemaObjectPrefix}PROP_IDX on ${schemaObjectPrefix}PROP (PROP_ID) -create table ${schemaObjectPrefix}REFS (NODE_ID char(36) not null, REFS_DATA bytea not null) -create unique index ${schemaObjectPrefix}REFS_IDX on ${schemaObjectPrefix}REFS (NODE_ID) -create table ${schemaObjectPrefix}BINVAL (BINVAL_ID varchar not null, BINVAL_DATA bytea not null) -create unique index ${schemaObjectPrefix}BINVAL_IDX on ${schemaObjectPrefix}BINVAL (BINVAL_ID) +create table ${schema}${schemaObjectPrefix}NODE (NODE_ID char(36) not null, NODE_DATA bytea not null) +create unique index ${schemaObjectPrefix}NODE_IDX on ${schema}${schemaObjectPrefix}NODE (NODE_ID) +create table ${schema}${schemaObjectPrefix}PROP (PROP_ID varchar not null, PROP_DATA bytea not null) +create unique index ${schemaObjectPrefix}PROP_IDX on ${schema}${schemaObjectPrefix}PROP (PROP_ID) +create table ${schema}${schemaObjectPrefix}REFS (NODE_ID char(36) not null, REFS_DATA bytea not null) +create unique index ${schemaObjectPrefix}REFS_IDX on ${schema}${schemaObjectPrefix}REFS (NODE_ID) +create table ${schema}${schemaObjectPrefix}BINVAL (BINVAL_ID varchar not null, BINVAL_DATA bytea not null) +create unique index ${schemaObjectPrefix}BINVAL_IDX on ${schema}${schemaObjectPrefix}BINVAL (BINVAL_ID)