This is an automated email from the ASF dual-hosted git repository.
doebele pushed a commit to branch version3
in repository https://gitbox.apache.org/repos/asf/empire-db.git
The following commit(s) were added to refs/heads/version3 by this push:
new aace24e EMPIREDB-373 if prepared statements is enabled then
automatically convert where expressions
aace24e is described below
commit aace24e3d0a73d0ab90280f10c31b144f0b1c5c6
Author: Rainer Döbele <[email protected]>
AuthorDate: Tue Feb 15 12:34:10 2022 +0100
EMPIREDB-373 if prepared statements is enabled then automatically convert
where expressions
---
.../empire/samples/db/advanced/CarSalesDB.java | 4 +--
.../empire/samples/db/advanced/SampleAdvApp.java | 1 +
.../main/java/org/apache/empire/db/DBCommand.java | 14 +++++++---
.../main/java/org/apache/empire/db/DBRowSet.java | 6 ----
.../empire/db/expr/compare/DBCompareAndOrExpr.java | 12 ++++++++
.../empire/db/expr/compare/DBCompareColExpr.java | 32 ++++++++++++++++++++++
.../empire/db/expr/compare/DBCompareExpr.java | 7 +++++
.../empire/db/expr/compare/DBCompareNotExpr.java | 11 ++++++++
.../empire/db/expr/compare/DBExistsExpr.java | 10 +++++++
.../empire/db/expr/compare/DBParenthesisExpr.java | 21 +++++++++-----
10 files changed, 99 insertions(+), 19 deletions(-)
diff --git
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/CarSalesDB.java
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/CarSalesDB.java
index 0fbccc6..90dec27 100644
---
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/CarSalesDB.java
+++
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/CarSalesDB.java
@@ -334,7 +334,7 @@ public class CarSalesDB extends TDatabase<CarSalesDB>
.having(SALES.MODEL_ID.count().isGreaterThan(10))
.orderBy(BRAND.NAME.desc(), MODEL.NAME.asc());
*/
- DBCommand cmd = createCommand()
+ DBCommand cmd = context.createCommand(this)
.selectQualified(BRAND.NAME, MODEL.CONFIG_NAME)
.select (MODEL.BASE_PRICE)
.select (SALES.MODEL_ID.count(), SALES.PRICE.avg())
@@ -365,7 +365,7 @@ public class CarSalesDB extends TDatabase<CarSalesDB>
public void updateDemo(DBContext context)
{
- DBCommand cmd = createCommand()
+ DBCommand cmd = context.createCommand(this)
.set (MODEL.BASE_PRICE.to(55000)) // set the price-tag
.join (MODEL.BRAND_ID, BRAND.ID)
.where(BRAND.NAME.is("Tesla"))
diff --git
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
index c5a1484..b52ac4c 100644
---
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
+++
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
@@ -115,6 +115,7 @@ public class SampleAdvApp
db.open(context);
carSales.open(context);
carSales.queryDemo(context);
+ carSales.updateDemo(context);
// STEP 5: Clear Database (Delete all records)
System.out.println("*** Step 5: clearDatabase() ***");
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
b/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
index 7106c75..0a49d6d 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
@@ -427,7 +427,7 @@ public abstract class DBCommand extends DBCommandExpr
{
DBSetExpr chk = set.get(i);
if (chk.column.equals(expr.column))
- { // Overwrite existing value
+ { // Overwrite existing value
if (useCmdParam(expr.column, expr.value))
{ // replace parameter value
// int index = ((DBCommandParam) chk.value).index;
@@ -1176,7 +1176,7 @@ public abstract class DBCommand extends DBCommandExpr
/**
* returns true if a cmdParam should be used for the given column or false
otherwise
*/
- protected boolean useCmdParam(DBColumn col, Object value)
+ protected boolean useCmdParam(DBColumnExpr col, Object value)
{
// Cannot wrap DBExpr or DBSystemDate
if (value==null || value instanceof DBExpr || value instanceof
DBDatabase.DBSystemDate)
@@ -1195,9 +1195,15 @@ public abstract class DBCommand extends DBCommandExpr
* @param expr the DBCompareExpr object
*/
protected void setConstraint(List<DBCompareExpr> list, DBCompareExpr expr)
- { // adds a comparison to the where or having list
+ {
+ // Check if prepared statements are enabled
+ if (isPreparedStatementsEnabled())
+ { // use command params
+ expr.prepareCommand(this);
+ }
+ // adds a comparison to the where or having list
for (int i = 0; i < list.size(); i++)
- { // check expression
+ { // check expression
DBCompareExpr other = list.get(i);
if (expr.isMutuallyExclusive(other)==false)
continue;
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
b/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
index 7d9eb7f..540f0aa 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRowSet.java
@@ -761,8 +761,6 @@ public abstract class DBRowSet extends DBExpr implements
EntityType
{ // prepare key value
DBColumn column = keyColumns[i];
Object value = key[i];
- if (db.isPreparedStatementsEnabled())
- value = cmd.addParam(column, value);
// set key column constraint
cmd.where(column.is(value));
}
@@ -1034,16 +1032,12 @@ public abstract class DBRowSet extends DBExpr
implements EntityType
log.warn("updateRecord: " + name + " primary has been
modified!");
}
// set pk constraint
- if (db.isPreparedStatementsEnabled())
- value = cmd.addParam(col, value);
cmd.where(col.is(value));
}
else if (timestampColumn == col)
{ // Check the update-timestamp
if (empty==false)
{ // set timestamp constraint
- if (db.isPreparedStatementsEnabled())
- value = cmd.addParam(col, value);
cmd.where(col.is(value));
}
// set new timestamp
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
index 85b7ff7..9acf423 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
@@ -21,6 +21,7 @@ package org.apache.empire.db.expr.compare;
import java.util.Set;
import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBCommand;
import org.apache.empire.db.DBDatabase;
@@ -82,6 +83,17 @@ public class DBCompareAndOrExpr extends DBCompareExpr
}
/**
+ * Prepare function
+ * @param cmd
+ */
+ @Override
+ public void prepareCommand(DBCommand cmd)
+ {
+ left.prepareCommand(cmd);
+ right.prepareCommand(cmd);
+ }
+
+ /**
* @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
*/
@Override
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
index e650598..72fb654 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
@@ -20,9 +20,11 @@ package org.apache.empire.db.expr.compare;
import java.util.Set;
+import org.apache.empire.db.DBCmdParam;
import org.apache.empire.db.DBCmpType;
import org.apache.empire.db.DBColumn;
import org.apache.empire.db.DBColumnExpr;
+import org.apache.empire.db.DBCommand;
import org.apache.empire.db.DBDatabase;
import org.apache.empire.db.DBExpr;
import org.apache.empire.db.expr.column.DBAbstractFuncExpr;
@@ -112,6 +114,36 @@ public class DBCompareColExpr extends DBCompareExpr
}
/**
+ * Prepare function
+ * @param cmd
+ */
+ @Override
+ public void prepareCommand(DBCommand cmd)
+ {
+ // Cannot user DBExpr or DBSystemDate as parameter
+ if (value==null || value instanceof DBCmdParam || value instanceof
DBExpr || value instanceof DBDatabase.DBSystemDate)
+ return;
+ // check operator
+ switch(cmpop)
+ {
+ case EQUAL:
+ case NOTEQUAL:
+ case LESSTHAN:
+ case MOREOREQUAL:
+ case GREATERTHAN:
+ case LESSOREQUAL:
+ case LIKE:
+ case NOTLIKE:
+ // create command param
+ value = cmd.addParam(expr.getDataType(), value);
+ break;
+ default:
+ // not supported
+ return;
+ }
+ }
+
+ /**
* @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
*/
@Override
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
index c66a859..b721c4b 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
@@ -18,6 +18,7 @@
*/
package org.apache.empire.db.expr.compare;
+import org.apache.empire.db.DBCommand;
import org.apache.empire.db.DBExpr;
/**
@@ -63,5 +64,11 @@ public abstract class DBCompareExpr extends DBExpr
{
return new DBCompareNotExpr(this);
}
+
+ /**
+ * internally used for preapred statement generation
+ * @param cmd
+ */
+ public abstract void prepareCommand(DBCommand cmd);
}
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
index bd280e4..9c01eb4 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
@@ -19,6 +19,7 @@
package org.apache.empire.db.expr.compare;
import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBCommand;
import org.apache.empire.db.DBDatabase;
import java.util.Set;
@@ -61,6 +62,16 @@ public class DBCompareNotExpr extends DBCompareExpr
}
/**
+ * Prepare function
+ * @param cmd
+ */
+ @Override
+ public void prepareCommand(DBCommand cmd)
+ {
+ expr.prepareCommand(cmd);
+ }
+
+ /**
* @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
*/
@Override
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
index a56e399..032ba99 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
@@ -77,6 +77,16 @@ public class DBExistsExpr extends DBCompareExpr
}
/**
+ * Prepare function
+ * @param cmd
+ */
+ @Override
+ public void prepareCommand(DBCommand cmd)
+ {
+ /* nothing yet */
+ }
+
+ /**
* @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
*/
@Override
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBParenthesisExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBParenthesisExpr.java
index dab3138..dffdf0f 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBParenthesisExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBParenthesisExpr.java
@@ -21,6 +21,7 @@ package org.apache.empire.db.expr.compare;
import java.util.Set;
import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBCommand;
import org.apache.empire.db.DBDatabase;
/**
@@ -30,42 +31,48 @@ import org.apache.empire.db.DBDatabase;
public class DBParenthesisExpr extends DBCompareExpr
{
// *Deprecated* private static final long serialVersionUID = 1L;
- private final DBCompareExpr wrap;
+ private final DBCompareExpr wrapped;
public DBParenthesisExpr(DBCompareExpr wrap)
{
- this.wrap = wrap;
+ this.wrapped = wrap;
}
public DBCompareExpr getWrapped()
{
- return wrap;
+ return wrapped;
}
@SuppressWarnings("unchecked")
@Override
public final DBDatabase getDatabase()
{
- return wrap.getDatabase();
+ return wrapped.getDatabase();
}
@Override
public boolean isMutuallyExclusive(DBCompareExpr other)
{
- return wrap.isMutuallyExclusive(other);
+ return wrapped.isMutuallyExclusive(other);
+ }
+
+ @Override
+ public void prepareCommand(DBCommand cmd)
+ {
+ wrapped.prepareCommand(cmd);
}
@Override
public void addReferencedColumns(Set<DBColumn> list)
{
- wrap.addReferencedColumns(list);
+ wrapped.addReferencedColumns(list);
}
@Override
public void addSQL(StringBuilder buf, long context)
{
buf.append("(");
- wrap.addSQL(buf, context|CTX_NOPARENTHESES);
+ wrapped.addSQL(buf, context|CTX_NOPARENTHESES);
buf.append(")");
}
}