Index: src/main/java/com/xpn/xwiki/store/DatabaseProduct.java =================================================================== --- src/main/java/com/xpn/xwiki/store/DatabaseProduct.java (revision 17953) +++ src/main/java/com/xpn/xwiki/store/DatabaseProduct.java (working copy) @@ -46,6 +46,19 @@ * The product name for HSQLDB databases. */ public static final DatabaseProduct HSQLDB = new DatabaseProduct("HSQL Database Engine"); + + /** + * The product name for DB2 databases. + * + * Per DB2 documentation at + * http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/topic/com.ibm.db2.luw.apdv.java.doc/doc/c0053013.html, + * the database product name returned by the {@link java.sql.DatabaseMetaData#getDatabaseProductName()} + * method of DB2 JDBC drivers varies by the OS and environment the product is running on. + * Hence the DB string here uses only the first 3 unique characters of the database product name. + * The {@link #toProduct(String)} method also hence checks for {@link java.lang.String#startsWith(String)} + * rather than an exact match. + */ + public static final DatabaseProduct DB2 = new DatabaseProduct("DB2/"); /** * Represents an unknown database for which we were not able to find the product name. @@ -111,6 +124,9 @@ product = DERBY; } else if (productNameAsString.equalsIgnoreCase(HSQLDB.getProductName())) { product = HSQLDB; + } else if (productNameAsString.startsWith(DB2.getProductName())) { + // See documentation above on why we check starts with for DB2 + product = DB2; } else { product = UNKNOWN; } Index: src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java =================================================================== --- src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java (revision 17953) +++ src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java (working copy) @@ -423,7 +423,7 @@ DatabaseProduct databaseProduct = getDatabaseProductName(context); if (databaseProduct == DatabaseProduct.ORACLE || databaseProduct == DatabaseProduct.HSQLDB - || databaseProduct == DatabaseProduct.DERBY) + || databaseProduct == DatabaseProduct.DERBY || databaseProduct == DatabaseProduct.DB2) { dschema = config.getProperty(Environment.DEFAULT_SCHEMA); config.setProperty(Environment.DEFAULT_SCHEMA, contextSchema); @@ -642,6 +642,19 @@ } catch (Exception e) { } } + } else if (DatabaseProduct.DB2 == databaseProduct) { + Statement stmt = null; + try { + stmt = session.connection().createStatement(); + stmt.execute("SET SCHEMA " + schemaName); + } finally { + try { + if (stmt != null) { + stmt.close(); + } + } catch (Exception e) { + } + } } else { String catalog = session.connection().getCatalog(); catalog = (catalog == null) ? null : catalog.replace('_', '-'); Index: src/main/java/com/xpn/xwiki/store/XWikiHibernateStore.java =================================================================== --- src/main/java/com/xpn/xwiki/store/XWikiHibernateStore.java (revision 17953) +++ src/main/java/com/xpn/xwiki/store/XWikiHibernateStore.java (working copy) @@ -234,6 +234,8 @@ stmt.execute("CREATE SCHEMA " + schema); } else if (DatabaseProduct.HSQLDB == databaseProduct) { stmt.execute("CREATE SCHEMA " + schema + " AUTHORIZATION DBA"); + } else if (DatabaseProduct.DB2 == databaseProduct) { + stmt.execute("CREATE SCHEMA " + schema ); } else { stmt.execute("create database " + schema); } @@ -286,6 +288,8 @@ stmt.execute("DROP SCHEMA " + schema); } else if (DatabaseProduct.HSQLDB == databaseProduct) { stmt.execute("DROP SCHEMA " + schema); + } else if (DatabaseProduct.DB2 == databaseProduct) { + stmt.execute("DROP SCHEMA " + schema + " RESTRICT"); } else { stmt.execute("DROP DATABASE " + schema); } Index: src/test/java/com/xpn/xwiki/store/DatabaseProductTest.java =================================================================== --- src/test/java/com/xpn/xwiki/store/DatabaseProductTest.java (revision 17953) +++ src/test/java/com/xpn/xwiki/store/DatabaseProductTest.java (working copy) @@ -22,6 +22,10 @@ product = DatabaseProduct.toProduct("HSQL Database Engine"); assertEquals(DatabaseProduct.HSQLDB, product); assertSame(DatabaseProduct.HSQLDB, product); + + product = DatabaseProduct.toProduct("DB2/LINUXX8664"); + assertEquals(DatabaseProduct.DB2, product); + assertSame(DatabaseProduct.DB2, product); product = DatabaseProduct.toProduct("Unknown"); assertEquals(DatabaseProduct.UNKNOWN, product);