Index: xwiki-platform-core/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java =================================================================== --- xwiki-platform-core/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java (revision 10079) +++ xwiki-platform-core/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java (working copy) @@ -154,20 +154,41 @@ * * @throws org.hibernate.HibernateException */ - private void initHibernate() throws HibernateException + private void initHibernate(XWikiContext context) throws HibernateException { // Load Configuration and build SessionFactory String path = getPath(); + Configuration cfg = new Configuration(); if (path != null) - setConfiguration((new Configuration()).configure(new File(path))); + cfg.configure(new File(path)); else { URL hiburl = getHibUrl(); if (hiburl != null) - setConfiguration(new Configuration().configure(hiburl)); + cfg.configure(hiburl); else - setConfiguration(new Configuration().configure()); + cfg.configure(); } + XWiki wiki = context.getWiki(); + if (wiki!=null && wiki.Param("xwiki.db")!=null) { + // sustitute default schema name to configurated. + // note, that we can't call getSchemaFromWikiName(context), + // becouse it ask getDatabeseProduct() via connection, which + // must be opened, but here we init hibernate before any + // opened connection. + String wikiName = context.getDatabase(); + boolean isMain = context.getMainXWiki().equalsIgnoreCase(wikiName); + String schemaName ; + if (isMain) { + schemaName = wiki.Param("xwiki.db"); + } else { + schemaName = wiki.Param("xwiki.virtual.db.prefix","") + wikiName.replace('-','_'); + } + cfg.setProperty(Environment.DEFAULT_SCHEMA,schemaName); + } + + setConfiguration(cfg); + setSessionFactory(getConfiguration().buildSessionFactory()); } @@ -331,12 +352,31 @@ DatabaseProduct databaseProduct = getDatabaseProductName(context); - if (databaseProduct == DatabaseProduct.DERBY) { - return context.isMainWiki(wikiName) ? "APP" : wikiName.replace('-', '_'); - } else if (databaseProduct == DatabaseProduct.HSQLDB) { - return context.isMainWiki(wikiName) ? "PUBLIC" : wikiName.replace('-', '_'); - } else - return wikiName.replace('-', '_'); + String retval = wikiName.replace('-','_'); + boolean isMain = context.getMainXWiki().equalsIgnoreCase(wikiName); + XWiki wiki = context.getWiki(); + + if (isMain) { + String configuredMainDatabaseSchemaName = wiki.Param("xwiki.db",""); + if (configuredMainDatabaseSchemaName.length() != 0) { + retval = configuredMainDatabaseSchemaName; + } else { + if (databaseProduct == DatabaseProduct.DERBY) { + retval = "APP" ; + } else if (databaseProduct == DatabaseProduct.HSQLDB) { + retval = "PUBLIC"; + } + } + } else { + // virtual + String configuredVirtualDatabaseSchemaPrefix = + wiki.Param("xwiki.virtual.db.prefix",""); + if (configuredVirtualDatabaseSchemaPrefix.length()!=0) { + retval = configuredVirtualDatabaseSchemaPrefix + retval; + } + } + + return retval; } /** @@ -514,7 +554,7 @@ synchronized (this) { if (getSessionFactory() == null) { - initHibernate(); + initHibernate(context); /* Check Schema */ if (getSessionFactory() != null) { updateSchema(context);