Return-Path: X-Original-To: apmail-empire-db-commits-archive@www.apache.org Delivered-To: apmail-empire-db-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 3A817DF16 for ; Tue, 28 Aug 2012 16:24:47 +0000 (UTC) Received: (qmail 38729 invoked by uid 500); 28 Aug 2012 16:24:45 -0000 Delivered-To: apmail-empire-db-commits-archive@empire-db.apache.org Received: (qmail 38634 invoked by uid 500); 28 Aug 2012 16:24:45 -0000 Mailing-List: contact commits-help@empire-db.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: empire-db-dev@empire-db.apache.org Delivered-To: mailing list commits@empire-db.apache.org Received: (qmail 38418 invoked by uid 99); 28 Aug 2012 16:24:44 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 28 Aug 2012 16:24:44 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 28 Aug 2012 16:24:39 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id DABA1238890D for ; Tue, 28 Aug 2012 16:23:55 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1378205 - in /empire-db/trunk/empire-db/src/main/java/org/apache/empire/db: DBDatabaseDriver.java expr/column/DBCalcExpr.java Date: Tue, 28 Aug 2012 16:23:55 -0000 To: commits@empire-db.apache.org From: doebele@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120828162355.DABA1238890D@eris.apache.org> 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='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
@@ -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