Author: manik.surtani(a)jboss.com
Date: 2009-08-18 06:44:01 -0400 (Tue, 18 Aug 2009)
New Revision: 8192
Modified:
core/trunk/src/main/java/org/jboss/cache/loader/JDBCCacheLoader.java
core/trunk/src/main/java/org/jboss/cache/loader/JDBCCacheLoaderConfig.java
Log:
[JBCACHE-1534] (JDBCCacheLoader does not escape wildcard characters in generated LIKE
clause) Patch submitted by Andrew Duckworth
Modified: core/trunk/src/main/java/org/jboss/cache/loader/JDBCCacheLoader.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/loader/JDBCCacheLoader.java 2009-08-18
10:43:24 UTC (rev 8191)
+++ core/trunk/src/main/java/org/jboss/cache/loader/JDBCCacheLoader.java 2009-08-18
10:44:01 UTC (rev 8192)
@@ -95,6 +95,8 @@
*/
public Object put(Fqn name, Object key, Object value) throws Exception
{
+ if (getLogger().isTraceEnabled())
+ getLogger().trace("put name=" + name + " key=" + key + "
value=" + value);
lock.acquireLock(name, true);
try
{
@@ -135,6 +137,8 @@
*/
public void put(Fqn name, Map attributes) throws Exception
{
+ if (getLogger().isTraceEnabled())
+ getLogger().trace("put name=" + name + " attr=" +
attributes);
lock.acquireLock(name, true);
Map toStore = attributes;
if (toStore != null && !(toStore instanceof HashMap)) toStore = new
HashMap(attributes);
@@ -311,9 +315,22 @@
private String getFqnWildcardString(String fqnString, Fqn fqn)
{
- return fqnString + (fqn.isRoot() ? "" : Fqn.SEPARATOR) + '%';
+ return escapeSqlLikeParameter(fqnString + (fqn.isRoot() ? "" :
Fqn.SEPARATOR)) + '%';
}
+ /**
+ * Escape all characters occurring in the FQN string that have significance to SQL
within a LIKE clause. Escape character '^'
+ * must match value in JDBCCacheLoaderConfig.constructRecursiveChildrenSql. This
method
+ * doubles any occurrence of the escape character '^' and replaces any
occurrence of wildcard characters '_' '%' with escaped version e.g.
"^_"
+ *
+ * @param res the fqn as a String
+ * @return the escaped result
+ */
+ private String escapeSqlLikeParameter(String res)
+ {
+ return res.replaceAll("([_%^])", "^$1");
+ }
+
private Map<Object, Object> readAttributes(ResultSet rs, int index) throws
SQLException
{
Map<Object, Object> result;
@@ -340,6 +357,8 @@
private void addNewSubtree(Fqn name, Map attributes) throws Exception
{
+ if (getLogger().isTraceEnabled())
+ getLogger().trace("addNewSubtree name=" + name + " attr=" +
attributes);
Fqn currentNode = name;
do
{
Modified: core/trunk/src/main/java/org/jboss/cache/loader/JDBCCacheLoaderConfig.java
===================================================================
--- core/trunk/src/main/java/org/jboss/cache/loader/JDBCCacheLoaderConfig.java 2009-08-18
10:43:24 UTC (rev 8191)
+++ core/trunk/src/main/java/org/jboss/cache/loader/JDBCCacheLoaderConfig.java 2009-08-18
10:44:01 UTC (rev 8192)
@@ -149,12 +149,12 @@
private String constructRecursiveChildrenSql()
{
- return "SELECT " + fqnColumn + "," + nodeColumn + " FROM
" + table + " WHERE " + fqnColumn + " = ? OR " + fqnColumn +
" LIKE ?";
+ return "SELECT " + fqnColumn + "," + nodeColumn + " FROM
" + table + " WHERE " + fqnColumn + " = ? OR " + fqnColumn +
" LIKE ? ESCAPE '^'";
}
@Override
protected String constructDeleteNodeSql()
{
- return "DELETE FROM " + table + " WHERE " + fqnColumn + "
= ? OR " + fqnColumn + " LIKE ?";
+ return "DELETE FROM " + table + " WHERE " + fqnColumn + "
= ? OR " + fqnColumn + " LIKE ? ESCAPE '^'";
}
}
\ No newline at end of file
Show replies by date