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 3f8270e  EMPIREDB-373 PreparedStatements on Context and subquery 
parameter handling
3f8270e is described below

commit 3f8270ecec88d22a2ae8dfaf57bd9524885e72bb
Author: Rainer Döbele <[email protected]>
AuthorDate: Tue Feb 15 15:51:02 2022 +0100

    EMPIREDB-373 PreparedStatements on Context and subquery parameter handling
---
 .../empire/samples/db/advanced/CarSalesDB.java     |  5 ++-
 .../empire/samples/db/advanced/SampleAdvApp.java   |  2 +-
 .../org/apache/empire/samples/db/SampleApp.java    |  9 ++++-
 .../jsf2/websample/web/SampleApplication.java      |  2 +-
 .../org/apache/empire/rest/service/Service.java    |  6 +++
 .../org/apache/empire/jsf2/app/WebDBContext.java   | 12 +++---
 .../main/java/org/apache/empire/db/DBCmdParam.java |  9 +++++
 .../main/java/org/apache/empire/db/DBCommand.java  | 45 ++++++++++++++++------
 .../main/java/org/apache/empire/db/DBContext.java  |  2 +-
 .../main/java/org/apache/empire/db/DBDatabase.java |  2 +-
 .../main/java/org/apache/empire/db/DBQuery.java    |  6 ---
 .../main/java/org/apache/empire/db/DBReader.java   |  5 ++-
 .../main/java/org/apache/empire/db/DBUtils.java    | 26 ++++++++++++-
 .../apache/empire/db/context/DBContextBase.java    | 12 ++++--
 .../apache/empire/db/context/DBContextStatic.java  | 42 +++++++++++++++++---
 .../empire/db/expr/join/DBColumnJoinExpr.java      | 26 +++++++++++++
 .../empire/db/expr/join/DBCrossJoinExpr.java       | 24 ++++++++++++
 .../org/apache/empire/db/expr/join/DBJoinExpr.java |  7 ++++
 .../java/org/apache/empire/dbms/DBMSHandler.java   |  2 +-
 .../org/apache/empire/dbms/DBMSHandlerBase.java    | 20 +++++++++-
 .../apache/empire/dbms/derby/DBMSHandlerDerby.java | 36 ++---------------
 .../org/apache/empire/dbms/h2/DBMSHandlerH2.java   | 10 ++---
 .../apache/empire/dbms/hsql/DBMSHandlerHSql.java   | 34 +---------------
 .../apache/empire/dbms/mysql/DBMSHandlerMySQL.java | 10 ++---
 .../apache/empire/dbms/oracle/DBCommandOracle.java |  7 ++--
 .../empire/dbms/oracle/DBMSHandlerOracle.java      |  6 +--
 .../dbms/postgresql/DBMSHandlerPostgreSQL.java     | 10 ++---
 .../empire/dbms/sqlite/DBMSHandlerSQLite.java      | 10 ++---
 .../empire/dbms/sqlserver/DBMSHandlerMSSQL.java    | 10 ++---
 .../test/java/org/apache/empire/db/MockDriver.java | 14 -------
 .../java/org/apache/empire/db/SerializeTest.java   |  6 +++
 31 files changed, 254 insertions(+), 163 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 90dec27..2c02576 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 = context.createCommand(this)
+        DBCommand cmd = context.createCommand()
            .selectQualified(BRAND.NAME, MODEL.CONFIG_NAME) 
            .select  (MODEL.BASE_PRICE)
            .select  (SALES.MODEL_ID.count(), SALES.PRICE.avg())
@@ -359,13 +359,14 @@ public class CarSalesDB extends TDatabase<CarSalesDB>
             log.info("col {} -> {}", entry.getColumn(i).getName(), 
entry.getColumn(i).getBeanPropertyName());
      
         List<QueryResult> list = context.getUtils().queryBeanList(cmd, 
QueryResult.class, null);
+        log.info("queryBeanList returnes {} items", list.size());
         
     }
     
     public void updateDemo(DBContext context)
     {
         
-        DBCommand cmd = context.createCommand(this)
+        DBCommand cmd = context.createCommand()
             .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 b52ac4c..298af0e 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
@@ -279,7 +279,7 @@ public class SampleAdvApp
      */
     private void clearDatabase()
     {
-        DBCommand cmd = context.createCommand(db);
+        DBCommand cmd = context.createCommand();
         // Delete all Employee Department History records
         context.executeDelete(T_EDH, cmd);
         // Delete all Employees (no constraints)
diff --git 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
index 0de039c..b3221be 100644
--- 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
+++ 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
@@ -106,6 +106,8 @@ public class SampleApp
     {
         // SECTION 1: Get a JDBC Connection
         log.info("Step 1: getJDBCConnection()");
+
+        db.setPreparedStatementsEnabled(true);
         
         Connection conn = getJDBCConnection();
 
@@ -114,7 +116,10 @@ public class SampleApp
         DBMSHandler dbms = getDBMSHandler(config.getDatabaseProvider(), conn);
         
         // SECTION 2.2: Create a Context
-        context = new DBContextStatic(dbms, conn, false, true); 
+        context = new DBContextStatic(dbms, conn, true)
+            // set optional context features
+            .setPreparedStatementsEnabled(db.isPreparedStatementsEnabled())
+            .setRollbackHandlingEnabled(false);
 
         // SECTION 3: Open Database 
         log.info("Step 3: Open database (and create if not existing)");
@@ -261,7 +266,7 @@ public class SampleApp
         */
        private void clearDatabase()
     {
-               DBCommand cmd = context.createCommand(db);
+               DBCommand cmd = context.createCommand();
         // Delete all Payments (no constraints)
         context.executeDelete(db.PAYMENTS, cmd);
                // Delete all Employees (no constraints)
diff --git 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
index c2b12c2..73c4138 100644
--- 
a/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
+++ 
b/empire-db-examples/empire-db-example-jsf2/src/main/java/org/apache/empire/jsf2/websample/web/SampleApplication.java
@@ -141,7 +141,7 @@ public class SampleApplication extends WebApplication {
                DBContext context = null;
                try {
                        conn = getConnection(sampleDB);
-                       context = new DBContextStatic(dbmsHandler, conn, false, 
false);
+                       context = new DBContextStatic(dbmsHandler, conn);
                        sampleDB.open(context);
                        if (!databaseExists(context)) {
                                // STEP 4: Create Database
diff --git 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java
 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java
index 9efc969..b647afb 100644
--- 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java
+++ 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java
@@ -89,6 +89,12 @@ public abstract class Service {
         {
             return db.getDbms();
         }
+        
+        @Override
+        public boolean isPreparedStatementsEnabled()
+        {
+            return false;
+        }
 
         @Override
         public boolean isRollbackHandlingEnabled()
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebDBContext.java 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebDBContext.java
index 4f30ad6..965a54e 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebDBContext.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebDBContext.java
@@ -9,7 +9,6 @@ import java.sql.Connection;
 import javax.faces.context.FacesContext;
 
 import org.apache.empire.commons.ClassUtils;
-import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.context.DBContextBase;
 import org.apache.empire.db.context.DBRollbackManager;
@@ -80,16 +79,17 @@ public class WebDBContext<DB extends DBDatabase> extends 
DBContextBase implement
         return database;
     }
 
-    public DBCommand createCommand()
-    {
-        return super.createCommand(database);
-    }
-
     @Override
     public DBMSHandler getDbms()
     {
         return dbms;
     }
+    
+    @Override
+    public boolean isPreparedStatementsEnabled()
+    {
+        return database.isPreparedStatementsEnabled();
+    }
 
     @Override
     public boolean isRollbackHandlingEnabled()
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCmdParam.java 
b/empire-db/src/main/java/org/apache/empire/db/DBCmdParam.java
index c32a6f4..b5503fb 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCmdParam.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCmdParam.java
@@ -113,6 +113,15 @@ public class DBCmdParam extends DBExpr
     }
     
     /**
+     * Returns the command this parameter belongs to
+     * @return the command
+     */
+    public DBCommand getCmd()
+    {
+        return cmd;
+    }
+
+    /**
      * Returns the data type of the command parameter
      * @return the data type
      */
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 0a49d6d..0c9e288 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
@@ -59,8 +59,6 @@ public abstract class DBCommand extends DBCommandExpr
     // Logger
     protected static final Logger log = 
LoggerFactory.getLogger(DBCommand.class);
 
-    // Database
-    private final DBDatabase         db; /* transient */  
     // Distinct Select
     protected boolean                selectDistinct = false;
     // Lists
@@ -70,7 +68,9 @@ public abstract class DBCommand extends DBCommandExpr
     protected List<DBCompareExpr>    where          = null;
     protected List<DBCompareExpr>    having         = null;
     protected List<DBColumnExpr>     groupBy        = null;
+    
     // Parameters for prepared Statements
+    protected boolean                preparedStatementsEnabled = false; /* 
flag for automatic prepared statements */
     protected List<DBCmdParam>       cmdParams      = null;
     private int                      paramUsageCount= 0;
 
@@ -79,9 +79,9 @@ public abstract class DBCommand extends DBCommandExpr
      * 
      * @param db the current database object
      */
-    protected DBCommand(DBDatabase db)
+    protected DBCommand(boolean preparedStatementsEnabled)
     {
-        this.db = db;
+        this.preparedStatementsEnabled = preparedStatementsEnabled;
     }
 
     /**
@@ -115,6 +115,12 @@ public abstract class DBCommand extends DBCommandExpr
     protected void resetParamUsage()
     {
         paramUsageCount = 0;
+        // clear subquery params
+        if (cmdParams==null)
+            return;
+        for (int i=cmdParams.size()-1; i>=0 ;i--)
+            if (cmdParams.get(i).getCmd()!=this)
+                cmdParams.remove(i);
     }
     
     /**
@@ -188,8 +194,11 @@ public abstract class DBCommand extends DBCommandExpr
                 clone.paramUsageCount = 0;
                 clone.cmdParams = new ArrayList<DBCmdParam>();
                 for (DBCmdParam p : cmdParams)
-                {
-                    DBCmdParam param = new DBCmdParam(this, p.getDataType(), 
p.getValue());
+                {   // checkCmd
+                    if (p.getCmd()!=this)
+                        continue;
+                    // copy
+                    DBCmdParam param = new DBCmdParam(clone, p.getDataType(), 
p.getValue());
                     clone.cmdParams.add(param);
                 }
             }
@@ -206,7 +215,12 @@ public abstract class DBCommand extends DBCommandExpr
     @Override
     public final DBDatabase getDatabase()
     {
-        return db;
+        if (hasSelectExpr())
+            return this.select.get(0).getDatabase();
+        if (hasSetExpr())
+            return this.set.get(0).getDatabase();
+        // not valid yet
+        return null;
     }
 
     /**
@@ -1166,11 +1180,11 @@ public abstract class DBCommand extends DBCommandExpr
     }
     
     /**
-     * returns true if prepared statements are enabled for this database
+     * returns true if prepared statements are enabled for this command
      */
     protected boolean isPreparedStatementsEnabled()
     {
-        return db.isPreparedStatementsEnabled();
+        return this.preparedStatementsEnabled;
     }
     
     /**
@@ -1279,7 +1293,7 @@ public abstract class DBCommand extends DBCommandExpr
                 continue;
             }
             if (tables.contains(table) == false && table != null)
-            { // Add table
+            {   // Add table
                 tables.add(table);
             }
         }
@@ -1515,6 +1529,15 @@ public abstract class DBCommand extends DBCommandExpr
                      buf.append( "\t" );
                  }
                  join.addSQL(buf, context);
+                 // Merge subquery params
+                 Object[] qryParams = join.getSubqueryParams();
+                 if (qryParams!=null && qryParams.length>0)
+                 {
+                     for (int p=0; p<qryParams.length; p++)
+                     {
+                         cmdParams.add(paramUsageCount++, new DBCmdParam(null, 
DataType.UNKNOWN, qryParams[p]));
+                     }
+                 }
                  // add CRLF
                  if( i!=joins.size()-1 )
                      buf.append("\r\n");
@@ -1530,7 +1553,7 @@ public abstract class DBCommand extends DBCommandExpr
         }
         if (sep==false)
         {   // add pseudo table or omitt from
-            String pseudoTable = 
db.getDbms().getSQLPhrase(DBSqlPhrase.SQL_PSEUDO_TABLE);
+            String pseudoTable = 
getDatabase().getDbms().getSQLPhrase(DBSqlPhrase.SQL_PSEUDO_TABLE);
             if (StringUtils.isNotEmpty(pseudoTable))
             {   // add pseudo table
                 buf.append(pseudoTable);
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBContext.java 
b/empire-db/src/main/java/org/apache/empire/db/DBContext.java
index b640111..52297f8 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBContext.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBContext.java
@@ -36,7 +36,7 @@ public interface DBContext
     
     <T extends DBUtils> T getUtils();
 
-    DBCommand createCommand(DBDatabase db); 
+    DBCommand createCommand(); 
     
     int executeSQL(String sqlCmd, Object[] sqlParams);
     
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java 
b/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
index 9d2c3ab..7e67076 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBDatabase.java
@@ -886,7 +886,7 @@ public abstract class DBDatabase extends DBObject
     public final DBCommand createCommand()
     {
         checkOpen(); 
-        return dbms.createCommand(this);
+        return dbms.createCommand(this.isPreparedStatementsEnabled());
     }
     
     /**
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBQuery.java 
b/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
index aa12f7e..ac1e021 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
@@ -402,8 +402,6 @@ public class DBQuery extends DBRowSet
         for (int i = 0; i < keyColumns.length; i++)
         {   // Set key column constraint
             Object value = key[i];
-            if (db.isPreparedStatementsEnabled())
-                value = cmd.addParam(keyColumns[i], value);
             cmd.where(keyColumns[i].is(value));
         }    
         // Read Record
@@ -527,8 +525,6 @@ public class DBQuery extends DBRowSet
                 if (keyColumns[i].getRowSet() == table)
                 {   // Set key column constraint
                     Object value = key[i];
-                    if (db.isPreparedStatementsEnabled())
-                        value = upd.addParam(keyColumns[i], value);
                     upd.where(keyColumns[i].is(value));
                 }
             }    
@@ -546,8 +542,6 @@ public class DBQuery extends DBRowSet
                     Object lastTS = fields[timestampIndex];
                     if (ObjectUtils.isEmpty(lastTS)==false)
                     {   // set timestamp constraint
-                        if (db.isPreparedStatementsEnabled())
-                            lastTS = upd.addParam(tsColumn, lastTS);
                         upd.where(tsColumn.is(lastTS));
                     }    
                     // Set new Timestamp
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBReader.java 
b/empire-db/src/main/java/org/apache/empire/db/DBReader.java
index acfd9d1..d4da336 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBReader.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBReader.java
@@ -24,7 +24,6 @@ import java.lang.reflect.InvocationTargetException;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -474,8 +473,9 @@ public class DBReader extends DBRecordData implements 
Closeable
             close();
         // Get the query statement
         String sqlCmd = cmd.getSelect();
-        // Collect the query parameters
         Object[] paramValues = cmd.getParamValues();
+        // Collect the query parameters
+        /*
         List<Object> subqueryParamValues = (cmd instanceof DBCommand) ? 
findSubQueryParams((DBCommand)cmd) : null;
         if (subqueryParamValues!=null && !subqueryParamValues.isEmpty())
         {   // Check Count
@@ -489,6 +489,7 @@ public class DBReader extends DBRecordData implements 
Closeable
                 throw new UnspecifiedErrorException(msg);
             }
         }
+        */
         // Execute the query
         DBUtils utils = context.getUtils();
         ResultSet queryRset = utils.executeQuery(sqlCmd, paramValues, 
scrollable);
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBUtils.java 
b/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
index 2574fa7..3c816bb 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
@@ -3,6 +3,7 @@ package org.apache.empire.db;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.SQLIntegrityConstraintViolationException;
+import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -24,17 +25,18 @@ import 
org.apache.empire.db.exceptions.QueryNoResultException;
 import org.apache.empire.db.exceptions.StatementFailedException;
 import org.apache.empire.db.exceptions.UnknownBeanTypeException;
 import org.apache.empire.db.expr.compare.DBCompareExpr;
-import org.apache.empire.db.list.DataBean;
 import org.apache.empire.db.list.DBBeanFactoryCache;
 import org.apache.empire.db.list.DBBeanListFactory;
 import org.apache.empire.db.list.DBBeanListFactoryImpl;
 import org.apache.empire.db.list.DBRecordListFactory;
 import org.apache.empire.db.list.DBRecordListFactoryImpl;
+import org.apache.empire.db.list.DataBean;
 import org.apache.empire.dbms.DBMSFeature;
 import org.apache.empire.dbms.DBMSHandler;
 import org.apache.empire.exceptions.InternalException;
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.UnexpectedReturnValueException;
+import org.apache.empire.exceptions.UnspecifiedErrorException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -116,6 +118,18 @@ public class DBUtils implements DBContextAware
     }
     
     /**
+     * internally used
+     */
+    private int getSelectParamsCount(String select)
+    {
+        int count = 0;
+        int pos = -1;
+        while ((pos=select.indexOf('?', ++pos))>0)
+            count++;
+        return count;
+    }
+    
+    /**
      * Executes a select SQL-Statement and returns a ResultSet containing the 
query results.<BR>
      * This function returns a JDBC ResultSet.<BR>
      * Instead of using this function directly you should use a DBReader 
object instead.<BR>
@@ -128,7 +142,15 @@ public class DBUtils implements DBContextAware
     public ResultSet executeQuery(String sqlCmd, Object[] sqlParams, boolean 
scrollable)
     {
         try
-        {   // Debug
+        {   // check
+            int paramCount = getSelectParamsCount(sqlCmd);
+            if (paramCount!=(sqlParams!=null ? sqlParams.length : 0))
+            {   // Wrong number of params
+                String msg = MessageFormat.format("Invalid number of 
parameters query: provided={0}, required={1}; query="+sqlCmd, paramCount, 
sqlParams.length);
+                log.error(msg);
+                throw new UnspecifiedErrorException(msg);
+            }
+            // Debug
             if (log.isDebugEnabled())
                 log.debug("Executing: " + sqlCmd);
             // Execute the Statement
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java 
b/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java
index c03464c..d1c09df 100644
--- a/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java
+++ b/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java
@@ -23,7 +23,6 @@ import java.sql.SQLException;
 
 import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBContext;
-import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBObject;
 import org.apache.empire.db.DBTable;
 import org.apache.empire.db.DBUtils;
@@ -76,14 +75,21 @@ public abstract class DBContextBase implements DBContext
     }
     
     /**
+     * returns whether DBCommmand should automatically create a prepared 
statement with command params (?) 
+     * Event if this is false, is still possible to manually add command 
params using cmd.addCmdParam();   
+     * @return true if automatic prepared Statements are enabled or false if 
not
+     */
+    public abstract boolean isPreparedStatementsEnabled();
+    
+    /**
      * Creates a new Command object for the given database
      * 
      * @return the command object.
      */
     @Override
-    public final DBCommand createCommand(DBDatabase db)
+    public final DBCommand createCommand()
     {
-        return getDbms().createCommand(db);
+        return getDbms().createCommand(isPreparedStatementsEnabled());
     }
 
     /**
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java 
b/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java
index 2085a6f..f4ad1cd 100644
--- a/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java
+++ b/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java
@@ -22,13 +22,19 @@ import java.sql.Connection;
 
 import org.apache.empire.db.context.DBRollbackManager.ReleaseAction;
 import org.apache.empire.dbms.DBMSHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class DBContextStatic extends DBContextBase
-{
+{    // Logger
+    private static final Logger log = 
LoggerFactory.getLogger(DBContextStatic.class);
+
     private final DBMSHandler dbms;
     private final Connection conn;
-    private final boolean enableRollbackHandling;
     private final boolean closeOnDiscard;
+    // features
+    private boolean enableRollbackHandling = false;
+    private boolean preparedStatementsEnabled = false;
     
     /**
      *  Global DBRollbackManager
@@ -45,7 +51,7 @@ public class DBContextStatic extends DBContextBase
      */
     public DBContextStatic(DBMSHandler dbmsHandler, Connection conn)
     {
-        this(dbmsHandler, conn, false, false);
+        this(dbmsHandler, conn, false);
     }
     
     /**
@@ -55,11 +61,10 @@ public class DBContextStatic extends DBContextBase
      * @param enableRollbackHandling
      * @param closeOnDiscard
      */
-    public DBContextStatic(DBMSHandler dbmsHandler, Connection conn, boolean 
enableRollbackHandling, boolean closeOnDiscard)
+    public DBContextStatic(DBMSHandler dbmsHandler, Connection conn, boolean 
closeOnDiscard)
     {
         this.dbms = dbmsHandler;
         this.conn = conn;
-        this.enableRollbackHandling = enableRollbackHandling;
         this.closeOnDiscard = closeOnDiscard;
     }
 
@@ -70,11 +75,38 @@ public class DBContextStatic extends DBContextBase
     }
 
     @Override
+    public boolean isPreparedStatementsEnabled()
+    {
+        return preparedStatementsEnabled;
+    }
+    
+    /**
+     * enables or disables the use of prepared statements for update and 
insert commands as well as for read operations on a DBRecord.
+     * Note: For custom SQL commands parameters must be explicitly declared 
using cmd.addCmdParam();   
+     * @param preparedStatementsEnabled
+     */
+    public DBContextStatic setPreparedStatementsEnabled(boolean enabled)
+    {
+        this.preparedStatementsEnabled = enabled;
+        // log prepared statement 
+        log.info("PreparedStatementsEnabled has been set to " + 
preparedStatementsEnabled);
+        return this;
+    }
+
+    @Override
     public boolean isRollbackHandlingEnabled()
     {
         return enableRollbackHandling;
     }
     
+    public DBContextStatic setRollbackHandlingEnabled(boolean enabled)
+    {
+        this.enableRollbackHandling = enabled;
+        // log prepared statement 
+        log.info("RollbackHandlingEnabled has been set to " + 
enableRollbackHandling);
+        return this;
+    }
+    
     @Override
     public void discard()
     {
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBColumnJoinExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBColumnJoinExpr.java
index cc54ed7..7a0629e 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBColumnJoinExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBColumnJoinExpr.java
@@ -25,6 +25,7 @@ import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBColumnExpr;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBJoinType;
+import org.apache.empire.db.DBQuery;
 import org.apache.empire.db.DBRowSet;
 import org.apache.empire.db.expr.compare.DBCompareExpr;
 import org.apache.empire.exceptions.InvalidPropertyException;
@@ -250,6 +251,31 @@ public class DBColumnJoinExpr extends DBJoinExpr
     }
 
     /**
+     * Returns the subquery Params
+     * Valid only directly after addSQL() has been called! 
+     * @return the subquery params;
+     */
+    @Override
+    public Object[] getSubqueryParams()
+    {
+        DBRowSet left = getLeftTable();
+        DBRowSet right = getRightTable();
+        Object[] leftParams  = (left  instanceof DBQuery) ? ((DBQuery)left 
).getCommandExpr().getParamValues() : null;
+        Object[] rightParams = (right instanceof DBQuery) ? 
((DBQuery)right).getCommandExpr().getParamValues() : null;
+        if (leftParams!=null && rightParams!=null)
+        {   // combine
+            Object[] both = new Object[leftParams.length+rightParams.length];
+            int index = 0;
+            for (int i=0; i<leftParams.length; i++)
+                both[index++] = leftParams[i];
+            for (int i=0; i<rightParams.length; i++)
+                both[index++] = rightParams[i];
+            return both;
+        }
+        return (leftParams!=null ? leftParams : rightParams);
+    }
+
+    /**
      * Compares two DBJoinExpr objects.
      * 
      * @param obj other DBJoinExpr object
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCrossJoinExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCrossJoinExpr.java
index 721bce3..5b0df2f 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCrossJoinExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCrossJoinExpr.java
@@ -24,6 +24,7 @@ import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBColumnExpr;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBJoinType;
+import org.apache.empire.db.DBQuery;
 import org.apache.empire.db.DBRowSet;
 
 /**
@@ -154,6 +155,29 @@ public class DBCrossJoinExpr extends DBJoinExpr
     }
 
     /**
+     * Returns the subquery Params
+     * Valid only directly after addSQL() has been called! 
+     * @return the subquery params;
+     */
+    @Override
+    public Object[] getSubqueryParams()
+    {
+        Object[] leftParams  = (left  instanceof DBQuery) ? ((DBQuery)left 
).getCommandExpr().getParamValues() : null;
+        Object[] rightParams = (right instanceof DBQuery) ? 
((DBQuery)right).getCommandExpr().getParamValues() : null;
+        if (leftParams!=null && rightParams!=null)
+        {   // combine
+            Object[] both = new Object[leftParams.length+rightParams.length];
+            int index = 0;
+            for (int i=0; i<leftParams.length; i++)
+                both[index++] = leftParams[i];
+            for (int i=0; i<rightParams.length; i++)
+                both[index++] = rightParams[i];
+            return both;
+        }
+        return (leftParams!=null ? leftParams : rightParams);
+    }
+
+    /**
      * Compares two DBJoinExpr objects.
      * 
      * @param obj other DBJoinExpr object
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBJoinExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBJoinExpr.java
index 62eef75..7cb40bf 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBJoinExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBJoinExpr.java
@@ -98,6 +98,13 @@ public abstract class DBJoinExpr extends DBExpr
     public abstract DBRowSet getOuterTable();
 
     /**
+     * Returns the subquery Params
+     * Valid only directly after addSQL() has been called! 
+     * @return the subquery params;
+     */
+    public abstract Object[] getSubqueryParams();
+    
+    /**
      * This function swaps the left and the right statements of the join 
expression.
      */
     public abstract void reverse();
diff --git a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandler.java 
b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandler.java
index 3c46b26..4102494 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandler.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandler.java
@@ -60,7 +60,7 @@ public interface DBMSHandler
      * @param db the database for which to create a command object for
      * @return a DBCommand object
      */
-    DBCommand createCommand(DBDatabase db);
+    DBCommand createCommand(boolean preparedStatementsEnabled);
 
     /**
      * This function gives the dbms a chance to provide a custom 
implementation 
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java 
b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
index 11fbd33..65b4c63 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/DBMSHandlerBase.java
@@ -80,6 +80,19 @@ public abstract class DBMSHandlerBase implements DBMSHandler
                                                            "select", "udpate", 
"insert", "alter", "delete", 
                                                            "order" };        
     protected final Set<String> reservedSQLKeywords;
+    
+    /**
+     * DBMSCommand
+     * A Default DBCommand implementation with no additional features
+     * @author doebele
+     */
+    public static final class DBMSCommand extends DBCommand 
+    {
+        protected DBMSCommand(boolean preparedStatementsEnabled)
+        {
+            super(preparedStatementsEnabled);
+        }
+    }
 
     /**
      * This class is used to emulate sequences by using a sequence table.
@@ -118,7 +131,7 @@ public abstract class DBMSHandlerBase implements DBMSHandler
             PreparedStatement stmt = null;
             try
             {   // The select Statement
-                DBCommand cmd = dbms.createCommand(db);
+                DBCommand cmd = 
dbms.createCommand(db.isPreparedStatementsEnabled());
                 DBCmdParam nameParam = cmd.addParam(SeqName);
                 cmd.select(C_SEQVALUE);
                 cmd.select(C_TIMESTAMP);
@@ -276,7 +289,10 @@ public abstract class DBMSHandlerBase implements 
DBMSHandler
      * @return a DBCommand object
      */
     @Override
-    public abstract DBCommand createCommand(DBDatabase db);
+    public DBCommand createCommand(boolean preparedStatementsEnabled)
+    {
+        return new DBMSCommand(preparedStatementsEnabled);
+    }
 
     /**
      * This function gives the dbms a chance to provide a custom 
implementation 
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/derby/DBMSHandlerDerby.java 
b/empire-db/src/main/java/org/apache/empire/dbms/derby/DBMSHandlerDerby.java
index c9ceb53..2e1f9c7 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/derby/DBMSHandlerDerby.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/derby/DBMSHandlerDerby.java
@@ -23,18 +23,17 @@ import java.util.GregorianCalendar;
 
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBColumnExpr;
-import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBDDLGenerator;
 import org.apache.empire.db.DBDDLGenerator.DDLActionType;
-import org.apache.empire.dbms.DBMSHandler;
-import org.apache.empire.dbms.DBMSHandlerBase;
-import org.apache.empire.dbms.DBMSFeature;
-import org.apache.empire.dbms.DBSqlPhrase;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBObject;
 import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTable;
 import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.dbms.DBMSFeature;
+import org.apache.empire.dbms.DBMSHandler;
+import org.apache.empire.dbms.DBMSHandlerBase;
+import org.apache.empire.dbms.DBSqlPhrase;
 import org.apache.empire.exceptions.NotSupportedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,19 +48,6 @@ public class DBMSHandlerDerby extends DBMSHandlerBase
 {
        // *Deprecated* private static final long serialVersionUID = 1L;
     private static final Logger log = 
LoggerFactory.getLogger(DBMSHandlerDerby.class);
-
-    /**
-     * Defines the Derby command type.
-     */ 
-    public static class DBCommandDerby extends DBCommand
-    {
-        // *Deprecated* private static final long serialVersionUID = 1L;
-      
-        public DBCommandDerby(DBDatabase db)
-        {
-            super(db);
-        }
-    }
     
     // Properties
     private String databaseName = null;
@@ -142,20 +128,6 @@ public class DBMSHandlerDerby extends DBMSHandlerBase
     }
 
     /**
-     * Creates a new Derby command object.
-     * 
-     * @return the new DBCommandDerby object
-     */
-    @Override
-    public DBCommand createCommand(DBDatabase db)
-    {
-        if (db == null)
-            return null;
-        // create command object
-        return new DBCommandDerby(db);
-    }
-
-    /**
      * Returns whether or not a particular feature is supported by this dbms
      * @param type type of requrested feature. @see DBMSFeature
      * @return true if the features is supported or false otherwise
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/h2/DBMSHandlerH2.java 
b/empire-db/src/main/java/org/apache/empire/dbms/h2/DBMSHandlerH2.java
index 98dd19a..87673b1 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/h2/DBMSHandlerH2.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/h2/DBMSHandlerH2.java
@@ -61,9 +61,9 @@ public class DBMSHandlerH2 extends DBMSHandlerBase
            protected int limitRows = -1;
            protected int skipRows  =  0;
         
-        public DBCommandH2(DBDatabase db)
+        public DBCommandH2(boolean preparedStatementsEnabled)
         {
-            super(db);
+            super(preparedStatementsEnabled);
         }
     
            @Override
@@ -192,12 +192,10 @@ public class DBMSHandlerH2 extends DBMSHandlerBase
      * @return the new DBCommandDerby object
      */
     @Override
-    public DBCommand createCommand(DBDatabase db)
+    public DBCommand createCommand(boolean preparedStatementsEnabled)
     {
-        if (db == null)
-            return null;
         // create command object
-        return new DBCommandH2(db);
+        return new DBCommandH2(preparedStatementsEnabled);
     }
 
     /**
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java 
b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
index d4a4a5e..2415305 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBMSHandlerHSql.java
@@ -24,7 +24,6 @@ import java.util.GregorianCalendar;
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBColumnExpr;
-import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBDDLGenerator;
 import org.apache.empire.db.DBDDLGenerator.DDLActionType;
 import org.apache.empire.db.DBDatabase;
@@ -33,9 +32,9 @@ import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTableColumn;
 import org.apache.empire.db.exceptions.QueryNoResultException;
 import org.apache.empire.db.validation.DBModelChecker;
+import org.apache.empire.dbms.DBMSFeature;
 import org.apache.empire.dbms.DBMSHandler;
 import org.apache.empire.dbms.DBMSHandlerBase;
-import org.apache.empire.dbms.DBMSFeature;
 import org.apache.empire.dbms.DBSqlPhrase;
 import org.apache.empire.exceptions.NotSupportedException;
 import org.slf4j.Logger;
@@ -52,23 +51,6 @@ public class DBMSHandlerHSql extends DBMSHandlerBase
 {
     // *Deprecated* private static final long serialVersionUID = 1L;
     private static final Logger log = 
LoggerFactory.getLogger(DBMSHandlerHSql.class);
-  
-    /**
-     * Defines the HSQLDB command type.
-     */ 
-       public static class DBCommandHSql extends DBCommand
-       {
-        // *Deprecated* private static final long serialVersionUID = 1L;
-
-        /**
-            * @param db the database
-            * @see org.apache.empire.db.DBCommand
-            */
-           public DBCommandHSql(DBDatabase db)
-           {
-               super(db);
-           }
-       }
     
     private DBDDLGenerator<?> ddlGenerator = null; // lazy creation
        
@@ -82,20 +64,6 @@ public class DBMSHandlerHSql extends DBMSHandlerBase
     }
 
     /**
-     * Creates a new HSQLDB command object.
-     * 
-     * @return the new DBCommandHSql object
-     */
-    @Override
-    public DBCommand createCommand(DBDatabase db)
-    {
-        if (db == null)
-            return null;
-        // create command object
-        return new DBCommandHSql(db);
-    }
-
-    /**
      * Returns whether or not a particular feature is supported by this dbms
      * @param type type of requested feature. @see DBMSFeature
      * @return true if the features is supported or false otherwise
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/mysql/DBMSHandlerMySQL.java 
b/empire-db/src/main/java/org/apache/empire/dbms/mysql/DBMSHandlerMySQL.java
index a53e41b..26faef5 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/mysql/DBMSHandlerMySQL.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/mysql/DBMSHandlerMySQL.java
@@ -65,9 +65,9 @@ public class DBMSHandlerMySQL extends DBMSHandlerBase
         protected int limit = -1;
         protected int skip  = -1;
         
-        public DBCommandMySQL(DBDatabase db)
+        public DBCommandMySQL(boolean preparedStatementsEnabled)
         {
-            super(db);
+            super(preparedStatementsEnabled);
         }
         
         @Override
@@ -904,12 +904,10 @@ public class DBMSHandlerMySQL extends DBMSHandlerBase
      * @return the new DBCommandMySQL object
      */
     @Override
-    public DBCommand createCommand(DBDatabase db)
+    public DBCommand createCommand(boolean preparedStatementsEnabled)
     {
-        if (db == null)
-            return null;
         // create command object
-        return new DBCommandMySQL(db);
+        return new DBCommandMySQL(preparedStatementsEnabled);
     }
 
     @Override
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBCommandOracle.java 
b/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBCommandOracle.java
index 58222c0..d5e878d 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBCommandOracle.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBCommandOracle.java
@@ -29,7 +29,6 @@ import org.apache.empire.data.DataType;
 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.DBIndex;
 import org.apache.empire.db.DBRowSet;
 import org.apache.empire.db.DBTable;
@@ -68,9 +67,9 @@ public class DBCommandOracle extends DBCommand
      * 
      * @param db the oracle database object this command belongs to
      */
-    public DBCommandOracle(DBDatabase db)
+    public DBCommandOracle(boolean preparedStatementsEnabled)
     {
-        super(db);
+        super(preparedStatementsEnabled);
     }
 
     public String getOptimizerHint()
@@ -228,7 +227,7 @@ public class DBCommandOracle extends DBCommand
     public Object[] getParamValues()
     {
         Object[] params = super.getParamValues();
-        if (limitRows<0 || !getDatabase().isPreparedStatementsEnabled())
+        if (limitRows<0 || !isPreparedStatementsEnabled())
             return params;
         // add limit and skip params
         int newSize = (params!=null ? params.length : 0)+(skipRows>0 ? 2 : 1);
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBMSHandlerOracle.java 
b/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBMSHandlerOracle.java
index eea9835..2d57c2d 100644
--- 
a/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBMSHandlerOracle.java
+++ 
b/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBMSHandlerOracle.java
@@ -151,12 +151,10 @@ public class DBMSHandlerOracle extends DBMSHandlerBase
      * @return the new DBCommandOracle object
      */
     @Override
-    public DBCommand createCommand(DBDatabase db)
+    public DBCommand createCommand(boolean preparedStatementsEnabled)
     {
-        if (db == null)
-            return null;
         // create oracle command
-        return new DBCommandOracle(db);
+        return new DBCommandOracle(preparedStatementsEnabled);
     }
 
     /**
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBMSHandlerPostgreSQL.java
 
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBMSHandlerPostgreSQL.java
index 04709c4..7770f17 100644
--- 
a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBMSHandlerPostgreSQL.java
+++ 
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBMSHandlerPostgreSQL.java
@@ -86,9 +86,9 @@ public class DBMSHandlerPostgreSQL extends DBMSHandlerBase
         protected int limit = -1;
         protected int skip  = -1;
         
-        public DBCommandPostreSQL(DBDatabase db)
+        public DBCommandPostreSQL(boolean preparedStatementsEnabled)
         {
-            super(db);
+            super(preparedStatementsEnabled);
         }
         
         @Override
@@ -293,12 +293,10 @@ public class DBMSHandlerPostgreSQL extends DBMSHandlerBase
      * @return the new DBCommandPostgreSQL object
      */
     @Override
-    public DBCommand createCommand(DBDatabase db)
+    public DBCommand createCommand(boolean preparedStatementsEnabled)
     {
-        if (db == null)
-            return null;
         // create command object
-        return new DBCommandPostreSQL(db);
+        return new DBCommandPostreSQL(preparedStatementsEnabled);
     }
 
     /**
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/sqlite/DBMSHandlerSQLite.java 
b/empire-db/src/main/java/org/apache/empire/dbms/sqlite/DBMSHandlerSQLite.java
index bd4f4af..1f549b5 100644
--- 
a/empire-db/src/main/java/org/apache/empire/dbms/sqlite/DBMSHandlerSQLite.java
+++ 
b/empire-db/src/main/java/org/apache/empire/dbms/sqlite/DBMSHandlerSQLite.java
@@ -73,9 +73,9 @@ public class DBMSHandlerSQLite extends DBMSHandlerBase
          *            the database
          * @see org.apache.empire.db.DBCommand
          */
-        public DBCommandSQLite(DBDatabase db)
+        public DBCommandSQLite(boolean preparedStatementsEnabled)
         {
-            super(db);
+            super(preparedStatementsEnabled);
         }
         
         @Override
@@ -268,12 +268,10 @@ public class DBMSHandlerSQLite extends DBMSHandlerBase
      * @return the new DBCommandSQLite object
      */
     @Override
-    public DBCommand createCommand(DBDatabase db)
+    public DBCommand createCommand(boolean preparedStatementsEnabled)
     {
-        if (db == null)
-            return null;
         // create command object
-        return new DBCommandSQLite(db);
+        return new DBCommandSQLite(preparedStatementsEnabled);
     }
     
     /**
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/DBMSHandlerMSSQL.java
 
b/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/DBMSHandlerMSSQL.java
index cf68e99..07630ec 100644
--- 
a/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/DBMSHandlerMSSQL.java
+++ 
b/empire-db/src/main/java/org/apache/empire/dbms/sqlserver/DBMSHandlerMSSQL.java
@@ -64,9 +64,9 @@ public class DBMSHandlerMSSQL extends DBMSHandlerBase
         // *Deprecated* private static final long serialVersionUID = 1L;
         protected int limit = -1;
 
-        public DBCommandMSSQL(DBDatabase db)
+        public DBCommandMSSQL(boolean preparedStatementsEnabled)
        {
-               super(db);
+               super(preparedStatementsEnabled);
        }
         
         @Override
@@ -277,12 +277,10 @@ public class DBMSHandlerMSSQL extends DBMSHandlerBase
      * @return the new DBCommandMSSQL object
      */
     @Override
-    public DBCommand createCommand(DBDatabase db)
+    public DBCommand createCommand(boolean preparedStatementsEnabled)
     {
-        if (db == null)
-            return null;
         // create command object
-        return new DBCommandMSSQL(db);
+        return new DBCommandMSSQL(preparedStatementsEnabled);
     }
 
     /**
diff --git a/empire-db/src/test/java/org/apache/empire/db/MockDriver.java 
b/empire-db/src/test/java/org/apache/empire/db/MockDriver.java
index 8724e6a..ed6521e 100644
--- a/empire-db/src/test/java/org/apache/empire/db/MockDriver.java
+++ b/empire-db/src/test/java/org/apache/empire/db/MockDriver.java
@@ -32,20 +32,6 @@ public class MockDriver extends DBMSHandlerBase {
     // *Deprecated* private static final long serialVersionUID = 1L;
     
     int seqValue = 0;
-  
-    class MockCommand extends DBCommand{
-        // *Deprecated* private static final long serialVersionUID = 1L;
-        protected MockCommand(DBDatabase db)
-        {
-            super(db);
-        }
-    }
-
-    @Override
-    public DBCommand createCommand(DBDatabase db)
-    {
-        return new MockCommand(db);
-    }
 
     @Override
     public String getConvertPhrase(DataType destType, DataType srcType, Object 
format)
diff --git a/empire-db/src/test/java/org/apache/empire/db/SerializeTest.java 
b/empire-db/src/test/java/org/apache/empire/db/SerializeTest.java
index 7c731ba..ca11abd 100644
--- a/empire-db/src/test/java/org/apache/empire/db/SerializeTest.java
+++ b/empire-db/src/test/java/org/apache/empire/db/SerializeTest.java
@@ -155,6 +155,12 @@ public class SerializeTest
         }
     
         @Override
+        public boolean isPreparedStatementsEnabled()
+        {
+            return false;
+        }
+    
+        @Override
         public boolean isRollbackHandlingEnabled()
         {
             return false;

Reply via email to