Author: challngr Date: Wed Feb 17 21:37:22 2016 New Revision: 1730949 URL: http://svn.apache.org/viewvc?rev=1730949&view=rev Log: UIMA-4577 Correctly handle keys in property files to avoid malformed CQL.
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUtil.java uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/StateServicesDb.java Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUtil.java URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUtil.java?rev=1730949&r1=1730948&r2=1730949&view=diff ============================================================================== --- uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUtil.java (original) +++ uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/DbUtil.java Wed Feb 17 21:37:22 2016 @@ -205,6 +205,9 @@ class DbUtil } + /** + * Imporant: do not pass key fields in the props or this will barf. + */ static String mkUpdate(String table, String key, Object... props) { int len = props.length; @@ -212,20 +215,21 @@ class DbUtil buf.append(table); buf.append(" SET "); + // NOTE: The property set must NOT contain any key fields or this is likely to barf. Caller + // must insure. for ( int i = 0; i < len; i+=2) { IDbProperty prop = (IDbProperty) props[i]; - if ( !prop.isPrimaryKey()) { // not allowed to update this - // we allow it in 'props' so callers can - // simply call update and expect the right - // thing to happen - buf.append(prop.columnName()); - buf.append("="); - buf.append(rep(prop, props[i+1])); - if ( i + 2 < len ) { - buf.append(","); - } + if ( prop.isPrimaryKey() ) { + throw new IllegalArgumentException("Primary key not allowed in UPDATE"); } + + buf.append(prop.columnName()); + buf.append("="); + buf.append(rep(prop, props[i+1])); + if ( i + 2 < len ) { + buf.append(","); + } } buf.append(" WHERE "); buf.append(key); Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/StateServicesDb.java URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/StateServicesDb.java?rev=1730949&r1=1730948&r2=1730949&view=diff ============================================================================== --- uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/StateServicesDb.java (original) +++ uima/sandbox/uima-ducc/trunk/uima-ducc-database/src/main/java/org/apache/uima/ducc/database/StateServicesDb.java Wed Feb 17 21:37:22 2016 @@ -349,17 +349,18 @@ public class StateServicesDb try { h = dbManager.open(); Map<IDbProperty, Object> map = mkMap(serviceId, table, converter, props); - Object[] updates = new Object[props.size()*2]; + List<Object> tmp = new ArrayList<Object>(); int i = 0; for ( IDbProperty k : map.keySet() ) { if ( logger.isTrace() ) { logger.trace(methodName, null, "Updating", k.columnName(), "with", map.get(k)); } - updates[i++] = k; - updates[i++] = map.get(k); + if ( k.isPrimaryKey() ) continue; // we do not get to update this + tmp.add(k); + tmp.add(map.get(k)); } - h.updateProperties(table, key, updates); + h.updateProperties(table, key, tmp.toArray(new Object[tmp.size()])); return true; } catch ( Exception e ) { logger.error(methodName, null, "Unable to update properties for service", key, "table", table, ":", e);