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 10917) +++ xwiki-platform-core/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java (working copy) @@ -154,21 +154,45 @@ * * @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 + && !wiki.isVirtualMode()) { + // substitute default db name to configurated. + // note, that we can't call getSchemaFromWikiName() here, + // becouse it ask getDatabaseProduct() which use connection + // which must be opened. But here (before connection init) + // we have no opened connections yet. + String schemaName; + if ( context.isMainWiki() ) { + schemaName = wiki.Param("xwiki.db"); + } else { + schemaName = context.getDatabase().replace('-','_'); + } + String dialect = cfg.getProperty(Environment.DIALECT); + if ("org.hibernate.dialect.MySQLDialect".equals(dialect)) { + cfg.setProperty(Environment.DEFAULT_CATALOG,schemaName); + } else { + cfg.setProperty(Environment.DEFAULT_SCHEMA,schemaName); + } + } + setConfiguration(cfg); - setSessionFactory(getConfiguration().buildSessionFactory()); + setSessionFactory(cfg.buildSessionFactory()); } /** @@ -331,12 +355,32 @@ 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; + XWiki wiki = context.getWiki(); + if (context.isMainWiki(wikiName)) { + String xwikidb = wiki.Param("xwiki.db"); + if (xwikidb!=null) { + retval=xwikidb; + }else{ + if (databaseProduct == DatabaseProduct.DERBY) { + retval = "APP"; + } else if (databaseProduct == DatabaseProduct.HSQLDB) { + retval = "PUBLIC"; + } else { + retval = wikiName.replace('-','_'); + } + } + } else { + // virtual + retval = wikiName.replace('-','_'); + } + + if (wiki.isVirtualMode()) { + String prefix = wiki.Param("xwiki.virtual.db.prefix",""); + retval = prefix + retval; + } + + return retval; } /** @@ -514,7 +558,7 @@ synchronized (this) { if (getSessionFactory() == null) { - initHibernate(); + initHibernate(context); /* Check Schema */ if (getSessionFactory() != null) { updateSchema(context);