On 02/16/2011 10:09 AM, tmortagne (SVN) wrote:
Author: tmortagne Date: 2011-02-16 10:09:31 +0100 (Wed, 16 Feb 2011) New Revision: 34718
Modified: platform/core/branches/xwiki-core-2.7/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java platform/core/branches/xwiki-core-2.7/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateStore.java Log: XWIKI-5976: Cannot create subwiki named "lines" Better (but a lot less elegant...) fix
Modified: platform/core/branches/xwiki-core-2.7/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java =================================================================== --- platform/core/branches/xwiki-core-2.7/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java 2011-02-16 09:09:21 UTC (rev 34717) +++ platform/core/branches/xwiki-core-2.7/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateBaseStore.java 2011-02-16 09:09:31 UTC (rev 34718) @@ -504,7 +504,6 @@ } } catch (Exception e) { } - ; try { if (bTransaction) { endTransaction(context, true); @@ -600,13 +599,14 @@
if (context.getDatabase() != null) { String schemaName = getSchemaFromWikiName(context); + String escapedSchemaName = escapeSchema(schemaName, context);
DatabaseProduct databaseProduct = getDatabaseProductName(context); if (DatabaseProduct.ORACLE == databaseProduct) { Statement stmt = null; try { stmt = session.connection().createStatement(); - stmt.execute("alter session set current_schema = " + schemaName); + stmt.execute("alter session set current_schema = " + escapedSchemaName); } finally { try { if (stmt != null) { @@ -620,7 +620,7 @@ Statement stmt = null; try { stmt = session.connection().createStatement(); - stmt.execute("SET SCHEMA " + schemaName); + stmt.execute("SET SCHEMA " + escapedSchemaName); } finally { try { if (stmt != null) { @@ -648,6 +648,29 @@ }
/** + * Escape schema name depending of the database engine. + * + * @param schema the schema name to escape + * @param context the XWiki context to get database engine identifier + * @return the escaped version + */ + protected String escapeSchema(String schema, XWikiContext context) + { + DatabaseProduct databaseProduct = getDatabaseProductName(context); + + String escapedSchema;
You should use this instead: escapedSchema = dialect.openQuote() + schema + dialect.closeQuote(); I think nobody wants to use ` or " in the wiki name, so there shouldn't be a need for doubling them. BTW, SQLServer uses [ ] for quoting.
+ if (DatabaseProduct.MYSQL == databaseProduct) { + // MySQL does not use SQL92 escaping syntax by default + escapedSchema = "`" + schema.replace("`", "``") + "`"; + } else { + // Use SQL92 escape syntax + escapedSchema = "\"" + schema.replace("\"", "\"\"") + "\""; + } + + return escapedSchema; + } + + /** * Begins a transaction * * @param context
-- Sergiu Dumitriu http://purl.org/net/sergiu/