You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@empire-db.apache.org by do...@apache.org on 2012/08/28 18:23:55 UTC
svn commit: r1378205 - in
/empire-db/trunk/empire-db/src/main/java/org/apache/empire/db:
DBDatabaseDriver.java expr/column/DBCalcExpr.java
Author: doebele
Date: Tue Aug 28 16:23:55 2012
New Revision: 1378205
URL: http://svn.apache.org/viewvc?rev=1378205&view=rev
Log:
EMPIREDB-164
new function getSQLNumberString() to validate numeric values encoded in sql commands
Modified:
empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCalcExpr.java
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java?rev=1378205&r1=1378204&r2=1378205&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java Tue Aug 28 16:23:55 2012
@@ -660,10 +660,52 @@ public abstract class DBDatabaseDriver i
}
return getSQLPhrase((boolVal) ? SQL_BOOLEAN_TRUE : SQL_BOOLEAN_FALSE);
}
+ case INTEGER:
+ case DECIMAL:
+ case FLOAT:
+ return getSQLNumberString(value, type);
+ case BLOB:
+ throw new NotSupportedException(this, "getValueString(?, DataType.BLOB)");
+ case AUTOINC:
+ case UNKNOWN:
+ /* Allow expressions */
+ return value.toString();
default:
+ log.warn("Unknown DataType {} for getValueString().", type);
return value.toString();
}
}
+
+ /**
+ * encodes a numeric value for an SQL command string.
+ * @param value the numeric value
+ * @param type the number data type
+ * @return the string reprentation of the number
+ */
+ protected String getSQLNumberString(Object value, DataType type)
+ {
+ // already a number
+ if (value instanceof Number)
+ return value.toString();
+
+ // check if it is a number
+ String s = value.toString();
+ boolean integerOnly = (type==DataType.INTEGER);
+ for (int i=0; i<s.length(); i++)
+ {
+ char c = s.charAt(i);
+ if (c>='0' && c<='9')
+ continue; // OK
+ if (c=='-' || c=='+')
+ continue; // OK
+ if (c==' ' && i>0)
+ return s.substring(0,i);
+ // check
+ if (integerOnly || (c!='.' && c!=','))
+ throw new NumberFormatException(s);
+ }
+ return s;
+ }
/**
* encodes a Date value for an SQL command string.
Modified: empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCalcExpr.java
URL: http://svn.apache.org/viewvc/empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCalcExpr.java?rev=1378205&r1=1378204&r2=1378205&view=diff
==============================================================================
--- empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCalcExpr.java (original)
+++ empire-db/trunk/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCalcExpr.java Tue Aug 28 16:23:55 2012
@@ -19,6 +19,9 @@
package org.apache.empire.db.expr.column;
// Java
+import java.util.Date;
+import java.util.Set;
+
import org.apache.empire.data.DataType;
import org.apache.empire.db.DBColumn;
import org.apache.empire.db.DBColumnExpr;
@@ -26,8 +29,6 @@ import org.apache.empire.db.DBDatabase;
import org.apache.empire.db.DBExpr;
import org.w3c.dom.Element;
-import java.util.Set;
-
/**
* This class is used for performing calculations in SQL<br>
@@ -79,7 +80,18 @@ public class DBCalcExpr extends DBColumn
@Override
public DataType getDataType()
{
- return DataType.DECIMAL;
+ DataType type = expr.getDataType();
+ // Special treatment for adding days to dates
+ if (type.isDate() && ((value instanceof Date) || value instanceof DBDatabase.DBSystemDate))
+ return DataType.DECIMAL;
+ if ((value instanceof DBColumnExpr))
+ { // Use the value type?
+ DataType type2 = ((DBColumnExpr)value).getDataType();
+ if (type2.isNumeric() && type2.ordinal()>type.ordinal())
+ return type2;
+ }
+ // type
+ return type;
}
/** Returns the given expression name. */
@@ -149,7 +161,12 @@ public class DBCalcExpr extends DBColumn
// Zusammenbauen
expr.addSQL(buf, context);
buf.append(op);
- buf.append(getObjectValue(getDataType(), value, context, op));
+ // Special treatment for adding days to dates
+ DataType type = expr.getDataType();
+ if (type.isNumeric()==false && (value instanceof Number))
+ type = DataType.DECIMAL;
+ // append
+ buf.append(getObjectValue(type, value, context, op));
}
@Override