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 afd29db  EMPIREDB-362 DBDatabaseDriver interface
afd29db is described below

commit afd29dbc6099861cf725a6ab00a9da9eb2ec5b93
Author: Rainer Döbele <[email protected]>
AuthorDate: Sun Jan 23 18:08:02 2022 +0100

    EMPIREDB-362 DBDatabaseDriver interface
---
 .../empire/samples/db/advanced/SampleAdvApp.java   |   4 -
 .../main/java/org/apache/empire/db/DBColumn.java   |   4 +-
 .../java/org/apache/empire/db/DBDDLGenerator.java  |  32 +-
 .../main/java/org/apache/empire/db/DBDatabase.java |   4 +-
 .../org/apache/empire/db/DBDatabaseDriver.java     | 935 ++-------------------
 .../main/java/org/apache/empire/db/DBTable.java    |   6 +-
 .../src/main/java/org/apache/empire/db/DBView.java |   6 +-
 .../DBDatabaseDriverBase.java}                     | 379 ++++-----
 .../db/driver/derby/DBDatabaseDriverDerby.java     |   3 +-
 .../empire/db/driver/derby/DerbyDDLGenerator.java  |   2 +-
 .../empire/db/driver/h2/DBDatabaseDriverH2.java    |   3 +-
 .../db/driver/hsql/DBDatabaseDriverHSql.java       |   5 +-
 .../empire/db/driver/hsql/HSqlDDLGenerator.java    |   2 +-
 .../db/driver/mysql/DBDatabaseDriverMySQL.java     |   3 +-
 .../empire/db/driver/mysql/MySQLDDLGenerator.java  |   2 +-
 .../db/driver/oracle/DBDatabaseDriverOracle.java   |   7 +-
 .../db/driver/oracle/OracleDDLGenerator.java       |   2 +-
 .../postgresql/DBDatabaseDriverPostgreSQL.java     |   7 +-
 .../db/driver/postgresql/PostgreDDLGenerator.java  |   4 +-
 .../db/driver/sqlite/DBDatabaseDriverSQLite.java   |   3 +-
 .../db/driver/sqlserver/DBDatabaseDriverMSSQL.java |   5 +-
 .../db/driver/sqlserver/MSSqlDDLGenerator.java     |   2 +-
 .../apache/empire/db/expr/column/DBAliasExpr.java  |   2 +-
 .../test/java/org/apache/empire/DBResource.java    |   2 +-
 .../test/java/org/apache/empire/db/MockDriver.java |   8 +-
 25 files changed, 302 insertions(+), 1130 deletions(-)

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 bf241e2..958ba5f 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
@@ -545,10 +545,6 @@ public class SampleAdvApp
      */
     private static void ddlSample(int idTestPerson)
     {
-        // Enable Column default for the database 
-        // This is needed for adding required fields to non-empty tables
-        db.getDriver().setDDLColumnDefaults(true);
-
         // First, add a new column to the Table object
         DBTableColumn C_FOO = db.T_EMPLOYEES.addColumn("FOO", 
DataType.VARCHAR, 20, false);
 
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBColumn.java 
b/empire-db/src/main/java/org/apache/empire/db/DBColumn.java
index 0cdc163..5eb9909 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBColumn.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBColumn.java
@@ -250,10 +250,8 @@ public abstract class DBColumn extends DBColumnExpr
         DBDatabaseDriver driver = getDatabase().getDriver();
         if (driver==null)
                throw new DatabaseNotOpenException(getDatabase());
-        if (quoteName==null)
-            quoteName = driver.detectQuoteName(name);
         // Append the name
-        driver.appendElementName(buf, name, quoteName.booleanValue());
+        driver.appendElementName(buf, name, quoteName);
     }
 
     /**
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBDDLGenerator.java 
b/empire-db/src/main/java/org/apache/empire/db/DBDDLGenerator.java
index 52ba39e..45a0f6d 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBDDLGenerator.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBDDLGenerator.java
@@ -54,10 +54,32 @@ public abstract class DBDDLGenerator<T extends 
DBDatabaseDriver>
     protected String  alterColumnPhrase  = " ALTER ";   // Phrase for altering 
a column
     protected String  databaseObjectName = "DATABASE";  // Database object 
name for DROP database
     
+    // Flag whether or not to set column defaults when crating DDL statements
+    protected boolean ddlColumnDefaults = false;
+    
     protected DBDDLGenerator(T driver)
     {
         this.driver = driver;
     }
+    
+    /**
+     * @return <code>true</code> if column default values are created with dll 
statements or <code>false</code> if not
+     */
+    public boolean isDDLColumnDefaults()
+    {
+        return ddlColumnDefaults;
+    }
+
+    /**
+     * Set true if column default values should be included in DDL Statements  
+     * 
+     * @param ddlColumnDefaults <code>true</code> if dll statements should 
include 
+     *   column default values or <code>false</code> if not
+     */
+    public void setDDLColumnDefaults(boolean ddlColumnDefaults)
+    {
+        this.ddlColumnDefaults = ddlColumnDefaults;
+    }
 
     // Add statements
     protected void addCreateTableStmt(DBTable table, StringBuilder sql, 
DBSQLScript script)
@@ -193,7 +215,7 @@ public abstract class DBDDLGenerator<T extends 
DBDatabaseDriver>
         if (!appendColumnDataType(c.getDataType(), c.getSize(), c, sql))
             return;
         // Default Value
-        if (driver.isDDLColumnDefaults() && !c.isAutoGenerated() && 
c.getDefaultValue()!=null)
+        if (isDDLColumnDefaults() && !c.isAutoGenerated() && 
c.getDefaultValue()!=null)
         {   sql.append(" DEFAULT ");
             sql.append(driver.getValueString(c.getDefaultValue(), 
c.getDataType()));
         }
@@ -587,16 +609,10 @@ public abstract class DBDDLGenerator<T extends 
DBDatabaseDriver>
         appendElementName(sql, name);
         script.addStmt(sql);
     }
-    
-    // Internal helpers 
-    protected boolean detectQuoteName(String name)
-    {
-        return driver.detectQuoteName(name);
-    }
 
     protected void appendElementName(StringBuilder sql, String name)
     {
-        driver.appendElementName(sql, name);
+        driver.appendElementName(sql, name, null);
     }
 
 }
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 4a01903..b465123 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
@@ -486,9 +486,9 @@ public abstract class DBDatabase extends DBObject
      * 
      * @param buf the string buffer to which to append the qualified object 
name
      * @param name the object's name
-     * @param quoteName use quotes or not
+     * @param quoteName use quotes or not. If null detectQuoteName() is called
      */
-    public void appendQualifiedName(StringBuilder buf, String name, boolean 
quoteName)
+    public void appendQualifiedName(StringBuilder buf, String name, Boolean 
quoteName)
     {
         // Check driver
         if (driver==null)
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java 
b/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
index 2d8f59d..7e5bd57 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
@@ -19,41 +19,17 @@
 package org.apache.empire.db;
 
 import java.sql.Connection;
-import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.sql.Statement;
 import java.sql.Timestamp;
-import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
 
-import org.apache.empire.commons.DateUtils;
-import org.apache.empire.commons.ObjectUtils;
-import org.apache.empire.commons.StringUtils;
 import org.apache.empire.data.DataType;
-import org.apache.empire.db.exceptions.EmpireSQLException;
-import org.apache.empire.db.exceptions.QueryFailedException;
-import org.apache.empire.exceptions.InvalidArgumentException;
-import org.apache.empire.exceptions.NotImplementedException;
-import org.apache.empire.exceptions.NotSupportedException;
-import org.apache.empire.exceptions.UnexpectedReturnValueException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
- * The DBDatabaseDriver class is an abstract base class for all database 
drivers.
- * Its purpose is to handle everything that is - or might be - database vendor 
specific. 
+ * The DBDatabaseDriver interface implements all RDBMS specific logic
  */
-public abstract class DBDatabaseDriver // *Deprecated* implements Serializable
+public interface DBDatabaseDriver
 {
-    // *Deprecated* private static final long serialVersionUID = 1L;
-    private static final Logger log = 
LoggerFactory.getLogger(DBDatabaseDriver.class);
-  
     // sql-phrases
     public static final int SQL_NULL_VALUE       = 1;   // Oracle: null
     public static final int SQL_PARAMETER        = 2;   // Oracle: ?
@@ -113,149 +89,23 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
     public static final int SQL_FUNC_DECODE_PART = 152; // Oracle: "{0}, {1}"  
    SQL: "when {0} then {1}"
     public static final int SQL_FUNC_DECODE_ELSE = 153; // Oracle: "{0}"       
    SQL: "else {0}"
     
-    // Flag whether or not to set column defaults when crating DDL statements
-    protected boolean ddlColumnDefaults = false;
-
-    // Illegal name chars and reserved SQL keywords
-    protected static final char[]   ILLEGAL_NAME_CHARS   = new char[] { '@', 
'?', '>', '=', '<', ';', ':', 
-                                                                    '/', '.', 
'-', ',', '+', '*', ')', '(',
-                                                                    '\'', '&', 
'%', '!', ' '
-                                                                  };        
-    protected static final String[] GENERAL_SQL_KEYWORDS = new String[] { 
"user", "group", 
-                                                           "table", "column", 
"view", "index", "constraint", 
-                                                           "select", "udpate", 
"insert", "alter", "delete", 
-                                                           "order" };        
-    protected final Set<String> reservedSQLKeywords;
-
-    /**
-     * This interface is used to set the auto generated keys when executing 
insert statements.
-     */
-    public interface DBSetGenKeys
-    {
-        void set(Object value);
-    }
     
     /**
-     * This class is used to emulate sequences by using a sequence table.
-     * It is used with the executeSQL function and only required for insert 
statements
+     * Called when a database is opened
      */
-    public static class DBSeqTable extends DBTable
-    {
-        // *Deprecated* private static final long serialVersionUID = 1L;
-      
-        public DBColumn C_SEQNAME;
-        public DBColumn C_SEQVALUE;
-        public DBColumn C_TIMESTAMP;
-
-        /**
-         * Constructor
-         * 
-         * @param tableName the table name
-         * @param db the database object
-         */
-        public DBSeqTable(String tableName, DBDatabase db)
-        {
-            super(tableName, db);
-            // Add all Colums
-            C_SEQNAME   = addColumn("SeqName",  DataType.VARCHAR,   40, true);
-            C_SEQVALUE  = addColumn("SeqValue", DataType.INTEGER,    0, true);
-            C_TIMESTAMP = addColumn("SeqTime",  DataType.DATETIME,   0, true);
-            // Primary Key
-            setPrimaryKey(new DBColumn[] { C_SEQNAME });
-        }
+    void attachDatabase(DBDatabase db, Connection conn);
 
-        // Overrideable
-        public Object getNextValue(String SeqName, long minValue, Connection 
conn)
-        {
-            DBDatabaseDriver driver = db.getDriver();
-            // Create a Command
-            PreparedStatement stmt = null;
-            try
-            {   // The select Statement
-                DBCommand cmd = driver.createCommand(db);
-                DBCmdParam nameParam = cmd.addParam(SeqName);
-                cmd.select(C_SEQVALUE);
-                cmd.select(C_TIMESTAMP);
-                cmd.where (C_SEQNAME.is(nameParam));
-                String selectCmd = cmd.getSelect();
-                // Get the next Value
-                long seqValue = 0;
-                while (seqValue == 0)
-                {
-                    // stmt = 
conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
ResultSet.CONCUR_READ_ONLY);
-                    stmt = conn.prepareStatement(selectCmd, 
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
-                    stmt.setString(1, SeqName);
-                    // Query existing value
-                    ResultSet rs = stmt.executeQuery();
-                    if (rs.next())
-                    { // Read the Sequence Value
-                        seqValue = Math.max(rs.getLong(1) + 1, minValue);
-                        java.sql.Timestamp current = rs.getTimestamp(2);
-                        driver.closeResultSet(rs);
-                        // Update existing Record
-                        cmd.clear();
-                        DBCmdParam name = cmd.addParam(SeqName);
-                        DBCmdParam time = cmd.addParam(current);
-                        cmd.set(C_SEQVALUE.to(seqValue));
-                        cmd.set(C_TIMESTAMP.to(DBDatabase.SYSDATE));
-                        cmd.where(C_SEQNAME.is(name));
-                        cmd.where(C_TIMESTAMP.is(time));
-                        if (driver.executeSQL(cmd.getUpdate(), 
cmd.getParamValues(), conn, null) < 1)
-                            seqValue = 0; // Try again
-                    } 
-                    else
-                    { // Close Reader
-                        driver.closeResultSet(rs);
-                        // sequence does not exist
-                        seqValue = minValue;
-                        log.warn("Sequence {} does not exist! Creating 
sequence with start-value of {}", SeqName, seqValue);
-                        // create a new sequence entry
-                        cmd.clear();
-                        cmd.set(C_SEQNAME.to(SeqName));
-                        cmd.set(C_SEQVALUE.to(seqValue));
-                        cmd.set(C_TIMESTAMP.to(DBDatabase.SYSDATE));
-                        if (driver.executeSQL(cmd.getInsert(), 
cmd.getParamValues(), conn, null) < 1)
-                            seqValue = 0; // Try again
-                    }
-                    // check for concurrency problem
-                    if (seqValue == 0)
-                        log.warn("Failed to increment sequence {}. Trying 
again!", SeqName);
-                    // close
-                    driver.closeStatement(stmt);
-                    cmd.clear();
-                    rs = null;
-                }
-                if (log.isInfoEnabled())
-                    log.info("Sequence {} incremented to {}.", SeqName, 
seqValue);
-                return new Long(seqValue);
-            } catch (SQLException e) {
-                // throw exception
-                throw new EmpireSQLException(this, e);
-            } finally
-            { // Cleanup
-                driver.closeStatement(stmt);
-            }
-        }
-    }
-    
     /**
-     * Constructor
+     * Called when a database is closed
      */
-    public DBDatabaseDriver()
-    {
-        // Initialize List of reserved Keywords
-        reservedSQLKeywords = new HashSet<String>(GENERAL_SQL_KEYWORDS.length);
-        for (String keyWord:GENERAL_SQL_KEYWORDS){
-             reservedSQLKeywords.add(keyWord);
-        }
-    }
-
+    void detachDatabase(DBDatabase db, Connection conn);
+    
     /**
      * This function creates a DBCommand derived object this database
      * @param db the database for which to create a command object for
      * @return a DBCommand object
      */
-    public abstract DBCommand createCommand(DBDatabase db);
+    DBCommand createCommand(DBDatabase db);
 
     /**
      * This function gives the driver a chance to provide a custom 
implementation 
@@ -265,73 +115,23 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param left the right command
      * @return a DBCommandExpr object
      */
-    public DBCommandExpr createCombinedCommand(DBCommandExpr left, String 
keyWord, DBCommandExpr right)
-    {
-       return new DBCombinedCmd(left, keyWord, right);
-    }
+    DBCommandExpr createCombinedCommand(DBCommandExpr left, String keyWord, 
DBCommandExpr right);
 
     /**
      * Returns whether or not a particular feature is supported by this driver
      * @param type type of requested feature. @see DBDriverFeature
      * @return true if the features is supported or false otherwise
      */
-    public abstract boolean isSupported(DBDriverFeature type);
-
-    /**
-     * Detects whether a table or column name needs to be quoted or not<br>
-     * By default all reserved SQL keywords as well as names 
-     * containing a "-", "/", "+" or " " require quoting.<br>
-     * Overrides this function to add database specific keywords like "user" 
or "count"  
-     */
-    protected boolean detectQuoteName(String name)
-    {
-        // Check for reserved names
-        if (reservedSQLKeywords.contains(name.toLowerCase()))
-            return true;
-        // Check for illegalNameChars
-        int len = name.length();
-        for (int i=0; i<len; i++)
-        {   char c = name.charAt(i);
-            for (int j=0; j<ILLEGAL_NAME_CHARS.length; j++)
-            {   char ic = ILLEGAL_NAME_CHARS[j]; 
-                if (c>ic)
-                    break;
-                if (c==ic)
-                    return true;
-            }    
-        }
-        // Quoting not necessary
-        return false;
-    }
+    boolean isSupported(DBDriverFeature type);
 
     /**
      * Appends a table, view or column name to an SQL phrase. 
      * 
      * @param sql the StringBuilder containing the SQL phrase.
      * @param name the name of the object (table, view or column)
-     * @param useQuotes use quotes or not
-     */
-    public void appendElementName(StringBuilder sql, String name, boolean 
useQuotes)
-    {
-        // Check whether to use quotes or not
-        if (useQuotes)
-            sql.append(getSQLPhrase(DBDatabaseDriver.SQL_QUOTES_OPEN));
-        // Append Name
-        sql.append(name);
-        // End Quotes
-        if (useQuotes)
-            sql.append(getSQLPhrase(DBDatabaseDriver.SQL_QUOTES_CLOSE));
-    }
-
-    /**
-     * Appends a table, view or column name to an SQL phrase. 
-     * @param sql the StringBuilder containing the SQL phrase.
-     * @param name the name of the object (table, view or column)
+     * @param useQuotes use quotes or not. When null is passed then 
detectQuoteName() is called
      */
-    public final void appendElementName(StringBuilder sql, String name)
-    {
-        appendElementName(sql, name, detectQuoteName(name));
-    }
+    void appendElementName(StringBuilder sql, String name, Boolean useQuotes);
     
     /**
      * Returns an sql phrase template for this database system.<br>
@@ -341,7 +141,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param phrase the identifier of the phrase  
      * @return the phrase template
      */
-    public abstract String getSQLPhrase(int phrase);
+    String getSQLPhrase(int phrase);
 
     /**
      * Returns a data type convertion phrase template for this driver<br>
@@ -351,27 +151,26 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param format additional formatting information (optional) 
      * @return the data conversion phrase template
      */
-    public abstract String getConvertPhrase(DataType destType, DataType 
srcType, Object format);
+    String getConvertPhrase(DataType destType, DataType srcType, Object 
format);
 
     /**
-     * Returns the next value of a named sequence The numbers are used for 
fields of type DBExpr.DT_AUTOINC.<BR>
-     * If a driver supports this function it must return true for 
isSupported(DBDriverFeature.SEQUENCES).
+     * Creates a sql string for a given value. 
+     * Text will be enclosed in single quotes and existing single quotes will 
be doubled.
+     * Empty strings are treated as null.
+     * Syntax of Date, Datetime and Boolean values are vendor specific.
      * 
-     * @param db the database
-     * @param SeqName the name of the sequence
-     * @param minValue the minimum value of the sequence
-     * @param conn a valid database connection
-     * @return a new unique sequence value or null if an error occurred
+     * @param value the value which is inserted to the new String
+     * @param type the sql data type of the supplied value
+     * @return the sql string representing this value
      */
-    public abstract Object getNextSequenceValue(DBDatabase db, String SeqName, 
int minValue, Connection conn);
-    
+    String getValueString(Object value, DataType type);
+
     /**
-     * Returns an expression for creating a sequence value.
-     * This is intended for the use with INSERT INTO statements where many 
records are affected. 
-     * @param col the column for which to obtain an expression providing the 
next sequence value
-     * @return an expression for the next sequence value
+     * Returns a DMBS-Timestamp that is used for record updates.
+     * @param conn the connection that might be used 
+     * @return the current date and time.
      */
-    public abstract DBColumnExpr getNextSequenceValueExpr(DBTableColumn 
column);
+    Timestamp getUpdateTimestamp(Connection conn);
     
     /**
      * Returns an auto-generated value for a particular column
@@ -381,161 +180,29 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param conn a valid database connection
      * @return the auto-generated value
      */
-    public Object getColumnAutoValue(DBDatabase db, DBTableColumn column, 
Connection conn)
-    {
-        // Supports sequences?
-        DataType type = column.getDataType();
-        if (type == DataType.AUTOINC)
-        {   // Use a numeric sequence
-            if (isSupported(DBDriverFeature.SEQUENCES)==false)
-                return null; // Create Later
-            String sequenceName = column.getSequenceName();
-            return getNextSequenceValue(db, sequenceName, 1, conn);
-        }
-        else if (type== DataType.UNIQUEID)
-        {   // emulate using java.util.UUID
-            return UUID.randomUUID();
-        }
-        else if (type==DataType.DATE || type==DataType.DATETIME || 
type==DataType.TIMESTAMP)
-        {   if (conn==null)
-                return null; // No connection
-            // Get database system's date and time
-            Date ts = getUpdateTimestamp(conn);
-            return (type==DataType.DATE ? DateUtils.getDateOnly(ts) : ts);
-        }
-        // Other types
-        throw new NotSupportedException(this, "getColumnAutoValue() for 
"+type);
-    }
-
-    /**
-     * Prepares an sql statement by setting the supplied objects as parameters.
-     * 
-     * @param pstmt the prepared statement
-     * @param sqlParams list of objects
-     */
-    protected void prepareStatement(PreparedStatement pstmt, Object[] 
sqlParams) 
-       throws SQLException
-       {
-        for (int i=0; i<sqlParams.length; i++)
-        {
-            Object value = sqlParams[i];
-            try {
-                addStatementParam(pstmt, i+1, value); // , conn
-            } catch(SQLException e) {
-                log.error("SQLException: Unable to set prepared statement 
parameter {} to '{}'", i+1, StringUtils.toString(value));
-                throw e;
-            }
-        }
-       }
-
-    /**
-     * Adds a statement parameter to a prepared statement
-     * 
-     * @param pstmt the prepared statement
-     * @param paramIndex the parameter index
-     * @param value the parameter value
-     */
-    protected void addStatementParam(PreparedStatement pstmt, int paramIndex, 
Object value)
-               throws SQLException
-       {
-        if (value instanceof DBBlobData)
-        {
-            // handling for blobs
-            DBBlobData blobData = (DBBlobData)value;
-            pstmt.setBinaryStream(paramIndex, blobData.getInputStream(), 
blobData.getLength());
-            // log
-            if (log.isDebugEnabled())
-                log.debug("Statement param {} set to BLOB data", paramIndex);
-        }
-        else if(value instanceof DBClobData)
-        {
-            // handling for clobs
-            DBClobData clobData = (DBClobData)value;
-            pstmt.setCharacterStream(paramIndex, clobData.getReader(), 
clobData.getLength());
-            // log
-            if (log.isDebugEnabled())
-                log.debug("Statement param {} set to CLOB data", paramIndex);
-        }
-        else if(value instanceof Date && !(value instanceof Timestamp))
-        {
-            // handling for dates
-            Timestamp ts = new Timestamp(((Date)value).getTime());
-            pstmt.setObject(paramIndex, ts);
-            // log
-            if (log.isDebugEnabled())
-                log.debug("Statement param {} set to date '{}'", paramIndex, 
ts);
-        }
-        else if((value instanceof Character) 
-                || (value instanceof Enum<?>))
-        {
-            // Objects that need String conversion
-            String strval = value.toString();
-            pstmt.setObject(paramIndex, strval);
-            // log
-            if (log.isDebugEnabled())
-                log.debug("Statement param {} set to '{}'", paramIndex, 
strval);
-        }
-        else
-        {   // simple parameter value 
-            pstmt.setObject(paramIndex, value);
-            // log
-            if (log.isDebugEnabled())
-                log.debug("Statement param {} set to '{}'", paramIndex, value);
-        }
-       }
+    Object getColumnAutoValue(DBDatabase db, DBTableColumn column, Connection 
conn);
     
     /**
-     * Extracts native error message of an sqlExeption.
+     * Executes an select SQL-command that returns only one scalar value
      * 
-     * @param e the SQLException
-     * @return the error message of the database 
+     * @param sqlCmd the SQL-Command
+     * @param sqlParams array of sql command parameters used for prepared 
statements (Optional).
+     * @param dataType the requested return type
+     * @param conn a valid connection to the database.
+     * @return the scalar result value
      */
-    public String extractErrorMessage(SQLException e)
-    {
-        return e.getMessage();
-    }
+    public Object querySingleValue(String sqlCmd, Object[] sqlParams, DataType 
dataType, Connection conn);
     
     /**
-     * <P>
-     * Reads a single column value from the given JDBC ResultSet and returns a 
value object of desired data type.<BR> 
-     * See {@link DBExpr#getValueClass(DataType)} for java class type mapping.
-     * <P>
-     * This gives the driver the opportunity to change the value
-     * i.e. to simulate missing data types with other types.
-     * <P>
-     * @param rset the sql Resultset with the current data row
-     * @param columnIndex one based column Index of the desired column
-     * @param dataType the required data type
-     * 
-     * @return the value of the Column 
-     * 
-     * @throws SQLException if a database access error occurs
+     * This interface is used to set the auto generated keys when executing 
insert statements.
      */
-    public Object getResultValue(ResultSet rset, int columnIndex, DataType 
dataType)
-        throws SQLException
+    public interface DBSetGenKeys
     {
-        if (dataType == DataType.DATETIME || dataType == DataType.TIMESTAMP)
-        { // Get Timestamp (do not use getObject()!) 
-            return rset.getTimestamp(columnIndex);
-        } 
-        else if (dataType == DataType.CLOB)
-        {
-            java.sql.Clob clob = rset.getClob(columnIndex);
-            return ((clob != null) ? clob.getSubString(1, (int) clob.length()) 
: null);
-        } 
-        else if (dataType == DataType.BLOB)
-        { // Get bytes of a binary large object
-            java.sql.Blob blob = rset.getBlob(columnIndex);
-            return ((blob != null) ? blob.getBytes(1, (int) blob.length()) : 
null);
-        } 
-        else
-        {
-               return rset.getObject(columnIndex);
-        }
+        void set(Object value);
     }
     
     /**
-     * Executes the select, update or delete SQL-Command with a Statement 
object.
+     * Executes an insert, update or delete SQL-command
      * 
      * @param sqlCmd the SQL-Command
      * @param sqlParams array of sql command parameters used for prepared 
statements (Optional).
@@ -546,48 +213,8 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * 
      * @throws SQLException if a database access error occurs
      */
-    public int executeSQL(String sqlCmd, Object[] sqlParams, Connection conn, 
DBSetGenKeys genKeys)
-        throws SQLException
-    {   // Execute the Statement
-        Statement stmt = null;
-        try
-        {
-            int count = 0;
-            if (sqlParams!=null)
-            {   // Use a prepared statement
-                PreparedStatement pstmt = (genKeys!=null) 
-                    ? conn.prepareStatement(sqlCmd, 
Statement.RETURN_GENERATED_KEYS)
-                    : conn.prepareStatement(sqlCmd);
-               stmt = pstmt;
-                   prepareStatement(pstmt, sqlParams); 
-                   count = pstmt.executeUpdate(); 
-            }
-            else
-            {   // Execute a simple statement
-                stmt = conn.createStatement();
-                count = (genKeys!=null)
-                    ? stmt.executeUpdate(sqlCmd, 
Statement.RETURN_GENERATED_KEYS)
-                    : stmt.executeUpdate(sqlCmd);
-            }
-            // Retrieve any auto-generated keys
-            if (genKeys!=null && count>0)
-            {   // Return Keys
-                ResultSet rs = stmt.getGeneratedKeys();
-                try {
-                    while(rs.next())
-                    {
-                        genKeys.set(rs.getObject(1));
-                    }
-                } finally {
-                    rs.close();
-                }
-            }
-            // done
-            return count;
-        } finally {
-            closeStatement(stmt);
-        }
-    }
+    int executeSQL(String sqlCmd, Object[] sqlParams, Connection conn, 
DBSetGenKeys genKeys)
+        throws SQLException;
 
     /**
      * Executes a list of sql statements as batch
@@ -598,434 +225,55 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @throws SQLException
      */
     public int[] executeBatch(String[] sqlCmd, Object[][] sqlCmdParams, 
Connection conn)
-        throws SQLException
-    {   // Execute the Statement
-        if (sqlCmdParams!=null)
-        {   // Use a prepared statement
-               PreparedStatement pstmt = null;
-               try
-               {
-               int pos=0;
-               String lastCmd = null;
-               int[] result = new int[sqlCmd.length];
-               for (int i=0; i<=sqlCmd.length; i++)
-               {       // get cmd
-                       String cmd = (i<sqlCmd.length ? sqlCmd[i] : null);
-                       if (StringUtils.compareEqual(cmd, lastCmd, true)==false)
-                       {       // close last statement
-                               if (pstmt!=null)
-                               {       // execute and close
-                                               log.debug("Executing batch 
containing {} statements", i-pos);
-                                       int[] res = pstmt.executeBatch();
-                                       for (int j=0; j<res.length; j++)
-                                               result[pos+j]=res[j];
-                                       pos+=res.length;
-                                       closeStatement(pstmt);
-                                       pstmt = null;
-                               }
-                               // has next?
-                                       if (cmd==null)
-                                               break;
-                                       // new statement
-                                       log.debug("Creating prepared statement 
for batch: "+cmd);
-                               pstmt = conn.prepareStatement(cmd);
-                               lastCmd = cmd;
-                       }
-                       // add batch
-                       if (sqlCmdParams[i]!=null)
-                       {       
-                               prepareStatement(pstmt, sqlCmdParams[i]); 
-                       }       
-                               log.debug("Adding batch with {} params.", 
(sqlCmdParams[i]!=null ? sqlCmdParams[i].length : 0));
-                       pstmt.addBatch();
-               }
-                   return result; 
-            } finally {
-                   closeStatement(pstmt);
-               }
-        }
-        else
-        {   // Execute a simple statement
-            Statement stmt = conn.createStatement();
-            try {
-               for (int i=0; i<sqlCmd.length; i++)
-               {
-                       String cmd = sqlCmd[i];
-                       log.debug("Adding statement to batch: "+cmd);
-                       stmt.addBatch(cmd);
-               }
-                       log.debug("Executing batch containing {} statements", 
sqlCmd.length);
-                   int result[] = stmt.executeBatch();
-                   return result;
-            } finally {
-                   closeStatement(stmt);
-               }
-        }
-    }
+        throws SQLException;
     
     /**
-     * Query a sql ResultSet
-     * @param sqlCmd
-     * @param sqlParams
-     * @param scrollable
-     * @param conn
-     * @return
+     * Executes an select SQL-command and returns the query results
+     * 
+     * @param sqlCmd the SQL-Command
+     * @param sqlParams array of sql command parameters used for prepared 
statements (Optional).
+     * @param scrollable true if scrollable or false otherwise
+     * @param conn a valid connection to the database.
+     * @return the JDBC resultset
      * @throws SQLException
      */
     public ResultSet executeQuery(String sqlCmd, Object[] sqlParams, boolean 
scrollable, Connection conn)
-        throws SQLException
-    {
-        Statement stmt = null;
-        try
-        {   // Set scroll type
-            int type = (scrollable ? ResultSet.TYPE_SCROLL_INSENSITIVE
-                                   : ResultSet.TYPE_FORWARD_ONLY);
-            // Create an execute a query statement
-               if (sqlParams!=null)
-               {       // Use prepared statement
-                   PreparedStatement pstmt = conn.prepareStatement(sqlCmd, 
type, ResultSet.CONCUR_READ_ONLY);
-                   stmt = pstmt;
-                   prepareStatement(pstmt, sqlParams); 
-                   return pstmt.executeQuery();
-               } else
-               {       // Use simple statement
-                   stmt = conn.createStatement(type, 
ResultSet.CONCUR_READ_ONLY);
-                   return stmt.executeQuery(sqlCmd);
-               }
-        } catch(SQLException e) {
-            // close statement (if not null)
-            log.error("Error executing query '"+sqlCmd+"' --> 
"+e.getMessage(), e);
-            closeStatement(stmt);
-            throw e;
-        }
-    }
+        throws SQLException;
 
     /**
-     * Query a single value 
-     * @return the value of the first column in the first row of the query 
-     */
-    public Object querySingleValue(String sqlCmd, Object[] sqlParams, DataType 
dataType, Connection conn)
-    {
-        ResultSet rs = null;
-        try
-        {   // Get the next Value
-            rs = executeQuery(sqlCmd, sqlParams, false, conn);
-            if (rs == null)
-                throw new UnexpectedReturnValueException(rs, 
"driver.executeQuery()");
-            // Check Result
-            if (rs.next() == false)
-            {   // no result
-                log.debug("querySingleValue returned no result");
-                return ObjectUtils.NO_VALUE;
-            }
-            // Read value
-            return getResultValue(rs, 1, dataType);
-        } catch (SQLException sqle) 
-        {   // Error
-            throw new QueryFailedException(this, sqlCmd, sqle);
-        } finally {
-            // Cleanup
-            closeResultSet(rs);
-        }
-    }
-    
-     /**
-     * Convenience function for closing a JDBC Resultset<BR>
-     * Use it instead of stmt.close()<BR> 
      * <P>
-     * @param stmt a Statement object
-     */
-    public void closeStatement(Statement stmt)
-    {
-        try
-        { // Statement close
-            if (stmt != null)
-                stmt.close();
-            // done
-            return;
-        } catch (SQLException sqle) { 
-            // Commit failed!
-            throw new EmpireSQLException(this, sqle);
-        }
-    }
-
-    /**
-     * Convenience function for closing a JDBC Resultset<BR>
-     * Use it instead of rset.close() and stmt.close()<BR> 
+     * Reads a single column value from the given JDBC ResultSet and returns a 
value object of desired data type.<BR> 
+     * See {@link DBExpr#getValueClass(DataType)} for java class type mapping.
      * <P>
-     * @param rset a ResultSet object
-     */
-    public void closeResultSet(ResultSet rset)
-    {
-        try
-        {   // check ResultSet
-            if (rset == null)
-                return; // nothing to do
-            // close Resultset
-            Statement stmt = rset.getStatement();
-            rset.close();
-            // check Statement
-            if (stmt == null)
-                return;
-            // close Statement
-            stmt.close();
-            // done
-            return;
-        } catch (SQLException sqle) { 
-            // Commit failed!
-            throw new EmpireSQLException(this, sqle);
-        }
-    }
-   
-    /**
-     * Creates a sql string for a given value. 
-     * Text will be enclosed in single quotes and existing single quotes will 
be doubled.
-     * Empty strings are treated as null.
-     * Syntax of Date, Datetime and Boolean values are vendor specific.
+     * This gives the driver the opportunity to change the value
+     * i.e. to simulate missing data types with other types.
+     * <P>
+     * @param rset the sql Resultset with the current data row
+     * @param columnIndex one based column Index of the desired column
+     * @param dataType the required data type
      * 
-     * @param value the value which is inserted to the new String
-     * @param type the sql data type of the supplied value
-     * @return the sql string representing this value
-     */
-    public String getValueString(Object value, DataType type)
-    { 
-        if (value instanceof Enum<?>)
-        {   // convert enum
-            log.warn("Enum of type {} supplied for getValueString. Converting 
value...", value.getClass().getName());
-            value = ObjectUtils.getEnumValue((Enum<?>)value, type.isNumeric());
-        }
-        if (ObjectUtils.isEmpty(value))
-        {   // null
-            return getSQLPhrase(SQL_NULL_VALUE);
-        }
-        // set string buffer
-        switch (type)
-        {
-            case DATE:
-                return getSQLDateTimeString(value, SQL_DATE_TEMPLATE, 
SQL_DATE_PATTERN, SQL_CURRENT_DATE);
-            case DATETIME:
-                // Only date (without time) provided?
-                if (!DBDatabase.SYSDATE.equals(value) && !(value instanceof 
Date) && ObjectUtils.lengthOf(value)<=10)
-                    return getSQLDateTimeString(value, SQL_DATE_TEMPLATE, 
SQL_DATE_PATTERN, SQL_CURRENT_TIMESTAMP);
-                // Complete Date-Time Object with time 
-                return getSQLDateTimeString(value, SQL_DATETIME_TEMPLATE, 
SQL_DATETIME_PATTERN, SQL_CURRENT_TIMESTAMP);
-            case TIMESTAMP:
-                return getSQLDateTimeString(value, SQL_TIMESTAMP_TEMPLATE, 
SQL_TIMESTAMP_PATTERN, SQL_CURRENT_TIMESTAMP);
-            case VARCHAR:
-            case CHAR:
-            case CLOB:
-            case UNIQUEID:
-            {   // Text value
-                return getSQLTextString(type, value);
-            }
-            case BOOL:
-            {   // Get Boolean value   
-                boolean boolVal = false;
-                if (value instanceof Boolean)
-                {   boolVal = ((Boolean) value).booleanValue();
-                } 
-                else
-                { // Boolean from String
-                    boolVal = stringToBoolean(value.toString());
-                }
-                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. 
-     * @param value
-     * @param sqlTemplate
-     * @param sqlPattern
-     * @param sqlCurrentDate
-     * @return
-     */
-    protected String getSQLDateTimeString(Object value, int sqlTemplate, int 
sqlPattern, int sqlCurrentDate)
-    {
-        // is it a sysdate expression
-        if (DBDatabase.SYSDATE.equals(value))
-            return getSQLPhrase(sqlCurrentDate);
-        // Format the date (ymd)
-        Timestamp ts; 
-        if ((value instanceof Timestamp)) 
-        {   // We have a timestamp
-            ts = (Timestamp)value;
-        }
-        else if ((value instanceof Date))
-        {   // Convert Date to Timestamp
-            ts = new Timestamp(((Date)value).getTime());
-        }
-        else if ((value instanceof LocalDate))
-        {   // Convert LocalDate to Timestamp
-            ts = java.sql.Timestamp.valueOf(((LocalDate)value).atStartOfDay());
-        }
-        else if ((value instanceof LocalDateTime))
-        {   // Convert LocalDateTime to Timestamp
-            ts = java.sql.Timestamp.valueOf((LocalDateTime)value);
-        }
-        else 
-        {   // "Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]"
-            String dtValue = value.toString().trim();
-            try
-            {   // parse timestamp
-                ts = Timestamp.valueOf(dtValue);
-            } catch (Throwable e) {
-                // Invalid date
-                log.error("Unable to parse date value "+dtValue, e);
-                throw new InvalidArgumentException("value", value);
-            }
-        }
-        // Convert to String
-        String pattern = getSQLPhrase(sqlPattern);
-        SimpleDateFormat sqlFormat = new 
SimpleDateFormat(getSQLPhrase(sqlPattern));
-        String datetime = sqlFormat.format(ts);
-        // Add micro / nanoseconds
-        int nanos = (ts.getNanos() % 1000000);
-        if (pattern.endsWith(".SSS") && nanos>0)
-        {   // Add nanoseconds
-            if (((nanos) % 100)>0)
-                datetime += String.format("%06d", nanos);
-            else
-                datetime += String.format("%04d",(nanos/100));
-        }
-        // Now Build String
-        String template = getSQLPhrase(sqlTemplate);
-        return StringUtils.replace(template, "{0}", datetime);
-    }
-
-    /**
-     * encodes Text values for an SQL command string.
-     * @param type date type (can only be TEXT, CHAR, CLOB and UNIQUEID)
-     * @param value the text to be encoded
-     * @return the encoded sql value
-     */
-    protected String getSQLTextString(DataType type, Object value)
-    {
-        StringBuilder valBuf = new StringBuilder();
-        valBuf.append("'");
-        if (DBDatabase.EMPTY_STRING.equals(value)==false)
-            appendSQLTextValue(valBuf, value.toString());
-        valBuf.append("'");
-        return valBuf.toString();
-    }
-
-    /** 
-     * this helper function doubles up single quotes for SQL 
-     */
-    protected void appendSQLTextValue(StringBuilder buf, String value)
-    {
-        if (value.indexOf('\'') >= 0)
-        { // a routine to double up single quotes for SQL
-            int len = value.length();
-            for (int i = 0; i < len; i++)
-            {
-                if (value.charAt(i) == '\'')
-                    buf.append("''");
-                else
-                    buf.append(value.charAt(i));
-            }
-        } 
-        else
-        {
-            buf.append(value);
-        }
-    }
-
-    /**
-     * this function converts a string containing a boolean expression to a 
boolean. 
-     * @param value the string containing a boolean expression
-     * @return true if the string contains either "true", "y" or "1" or false 
otherwise
-     */
-    protected boolean stringToBoolean(final String value) 
-    {
-        return "1".equals(value) ||
-               "true".equalsIgnoreCase(value) ||
-               "y".equalsIgnoreCase(value);
-    }
-    
-    /**
-     * Called when a database is opened
+     * @return the value of the Column 
+     * 
+     * @throws SQLException if a database access error occurs
      */
-    protected void attachDatabase(DBDatabase db, Connection conn)
-    {
-        // Override to implement attaching behaviour
-    }
+    Object getResultValue(ResultSet rset, int columnIndex, DataType dataType)
+        throws SQLException;
 
     /**
-     * Called when a database is closed
+     * Closes the provided JDBC Resultset
+     * Use it instead of rset.close() and stmt.close() 
+     * <P>
+     * @param rset a ResultSet object
      */
-    protected void detachDatabase(DBDatabase db, Connection conn)
-    {
-        // Override to implement closing behaviour
-    }
+    void closeResultSet(ResultSet rset);
 
     /**
-     * Checks the database whether or not it is consistent with the 
description.
-     * 
-     * @param db the database
-     * @param owner the owner
-     * @param conn the connection
-     */
-    public void checkDatabase(DBDatabase db, String owner, Connection conn)
-    {
-        throw new NotImplementedException(this, "checkDatabase");
-    }
-    
-    /**
      * Appends the required DLL commands to create, drop or alter an object to 
the supplied DBDQLScript.
      * @param type operation to perform (CREATE, DROP, ALTER)
      * @param dbo the object for which to perform the operation (DBDatabase, 
DBTable, DBView, DBColumn, DBRelation) 
      * @param script the script to which to add the DDL command(s)
      */
-    public void getDDLScript(DBCmdType type, DBObject dbo, DBSQLScript script)
-    {
-        throw new NotImplementedException(this, "getDDLScript");
-    }
+    void getDDLScript(DBCmdType type, DBObject dbo, DBSQLScript script);
     
     /**
      * Appends a statement to enable or disable a foreign key relation.<br>
@@ -1035,45 +283,14 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param enable true to enable the relation or false to disable
      * @param script the script to which to add the DDL command(s)
      */
-    public void addEnableRelationStmt(DBRelation r, boolean enable, 
DBSQLScript script)
-    {
-        if (enable)
-            getDDLScript(DBCmdType.CREATE, r, script);
-        else
-            getDDLScript(DBCmdType.DROP, r, script);
-    }
-    
-    /**
-     * @return <code>true</code> if column default values are created with dll 
statements or <code>false</code> if not
-     */
-    public boolean isDDLColumnDefaults()
-    {
-        return ddlColumnDefaults;
-    }
-
-    /**
-     * Set true if column default values should be included in DDL Statements  
-     * 
-     * @param ddlColumnDefaults <code>true</code> if dll statements should 
include 
-     *   column default values or <code>false</code> if not
-     */
-    public void setDDLColumnDefaults(boolean ddlColumnDefaults)
-    {
-        this.ddlColumnDefaults = ddlColumnDefaults;
-    }
-
+    void addEnableRelationStmt(DBRelation r, boolean enable, DBSQLScript 
script);
+     
     /**
-     * Returns a timestamp that is used for record updates.
-     * 
-     * @param conn the connection that might be used 
+     * Extracts native error message of an sqlExeption.
      * 
-     * @return the current date and time.
+     * @param e the SQLException
+     * @return the error message of the database 
      */
-    public java.sql.Timestamp getUpdateTimestamp(Connection conn)
-    {
-        // Default implementation
-        java.util.Date date = new java.util.Date();
-        return new java.sql.Timestamp(date.getTime());
-    }
-
+    String extractErrorMessage(SQLException e);
+ 
 }
\ No newline at end of file
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBTable.java 
b/empire-db/src/main/java/org/apache/empire/db/DBTable.java
index 1777aa2..d3bdb86 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBTable.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBTable.java
@@ -547,11 +547,7 @@ public class DBTable extends DBRowSet implements Cloneable
     {
         // Append Name
         if ((context & CTX_NAME|CTX_FULLNAME)!=0)
-        {   // Append the name
-            DBDatabaseDriver driver = getDatabase().getDriver();
-            if (quoteName==null)
-                quoteName = driver.detectQuoteName(name);
-            // append Qualified Name 
+        {   // append Qualified Name 
             db.appendQualifiedName(buf, name, quoteName);
         }
         // Append Alias
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBView.java 
b/empire-db/src/main/java/org/apache/empire/db/DBView.java
index fa0860d..9372e6d 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBView.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBView.java
@@ -378,11 +378,7 @@ public abstract class DBView extends DBRowSet
     {
         // Append Name
         if ((context & CTX_NAME|CTX_FULLNAME)!=0)
-        {   // Append the name
-            DBDatabaseDriver driver = getDatabase().getDriver();
-            if (quoteName==null)
-                quoteName = driver.detectQuoteName(name);
-            // append Qualified Name 
+        {   // append Qualified Name 
             db.appendQualifiedName(buf, name, quoteName);
         }
         // Append Alias
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java 
b/empire-db/src/main/java/org/apache/empire/db/driver/DBDatabaseDriverBase.java
similarity index 77%
copy from empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
copy to 
empire-db/src/main/java/org/apache/empire/db/driver/DBDatabaseDriverBase.java
index 2d8f59d..c17778d 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/DBDatabaseDriverBase.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.empire.db;
+package org.apache.empire.db.driver;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
@@ -36,6 +36,24 @@ import org.apache.empire.commons.DateUtils;
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.StringUtils;
 import org.apache.empire.data.DataType;
+import org.apache.empire.db.DBBlobData;
+import org.apache.empire.db.DBClobData;
+import org.apache.empire.db.DBCmdParam;
+import org.apache.empire.db.DBCmdType;
+import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBColumnExpr;
+import org.apache.empire.db.DBCombinedCmd;
+import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBCommandExpr;
+import org.apache.empire.db.DBDatabase;
+import org.apache.empire.db.DBDatabaseDriver;
+import org.apache.empire.db.DBDriverFeature;
+import org.apache.empire.db.DBExpr;
+import org.apache.empire.db.DBObject;
+import org.apache.empire.db.DBRelation;
+import org.apache.empire.db.DBSQLScript;
+import org.apache.empire.db.DBTable;
+import org.apache.empire.db.DBTableColumn;
 import org.apache.empire.db.exceptions.EmpireSQLException;
 import org.apache.empire.db.exceptions.QueryFailedException;
 import org.apache.empire.exceptions.InvalidArgumentException;
@@ -49,73 +67,10 @@ import org.slf4j.LoggerFactory;
  * The DBDatabaseDriver class is an abstract base class for all database 
drivers.
  * Its purpose is to handle everything that is - or might be - database vendor 
specific. 
  */
-public abstract class DBDatabaseDriver // *Deprecated* implements Serializable
+public abstract class DBDatabaseDriverBase implements DBDatabaseDriver
 {
-    // *Deprecated* private static final long serialVersionUID = 1L;
     private static final Logger log = 
LoggerFactory.getLogger(DBDatabaseDriver.class);
-  
-    // sql-phrases
-    public static final int SQL_NULL_VALUE       = 1;   // Oracle: null
-    public static final int SQL_PARAMETER        = 2;   // Oracle: ?
-    public static final int SQL_RENAME_TABLE     = 3;   // Oracle: AS
-    public static final int SQL_RENAME_COLUMN    = 4;   // Oracle: AS
-    public static final int SQL_DATABASE_LINK    = 5;   // Oracle: @
-    public static final int SQL_QUOTES_OPEN      = 6;   // Oracle: "; MSSQL: [
-    public static final int SQL_QUOTES_CLOSE     = 7;   // Oracle: "; MSSQL: ]
-    public static final int SQL_CONCAT_EXPR      = 8;   // Oracle: ||
-    public static final int SQL_PSEUDO_TABLE     = 9;   // Oracle: "DUAL"
-    // data types
-    public static final int SQL_BOOLEAN_TRUE      = 10; // Oracle: "'Y'"; 
MSSQL: "1"
-    public static final int SQL_BOOLEAN_FALSE     = 11; // Oracle: "'N'"; 
MSSQL: "0"
-    public static final int SQL_CURRENT_DATE      = 20; // Oracle: "sysdate"
-    public static final int SQL_DATE_PATTERN      = 21; // "yyyy-MM-dd"  // 
SimpleDateFormat
-    public static final int SQL_DATE_TEMPLATE     = 22; // Oracle: 
"TO_DATE('{0}', 'YYYY-MM-DD')"
-    public static final int SQL_DATETIME_PATTERN  = 23; // "yyyy-MM-dd 
HH:mm:ss.SSS"  // SimpleDateFormat
-    public static final int SQL_DATETIME_TEMPLATE = 24; // Oracle: 
"TO_DATE('{0}', 'YYYY-MM-DD HH24:MI:SS')"
-    public static final int SQL_CURRENT_TIMESTAMP = 25; // Oracle: 
"systimestamp"
-    public static final int SQL_TIMESTAMP_PATTERN = 26; // "yyyy-MM-dd 
HH:mm:ss.SSS" // SimpleDateFormat
-    public static final int SQL_TIMESTAMP_TEMPLATE= 27; // Oracle: 
"TO_TIMESTAMP('{0}', 'YYYY.MM.DD HH24:MI:SS.FF')";
-    // functions
-    public static final int SQL_FUNC_COALESCE    = 100; // Oracle: nvl(?, {0})
-    public static final int SQL_FUNC_SUBSTRING   = 101; // Oracle: 
substr(?,{0})
-    public static final int SQL_FUNC_SUBSTRINGEX = 102; // Oracle: 
substr(?,{0},{1})
-    public static final int SQL_FUNC_REPLACE     = 103; // Oracle: 
replace(?,{0},{1})
-    public static final int SQL_FUNC_REVERSE     = 104; // Oracle: reverse(?) 
-    public static final int SQL_FUNC_STRINDEX    = 105; // Oracle: instr(?, 
{0})
-    public static final int SQL_FUNC_STRINDEXFROM= 106; // Oracle: instr(?, 
{0}, {1}) 
-    public static final int SQL_FUNC_LENGTH      = 107; // Oracle: 
length(?,{0})
-    public static final int SQL_FUNC_UPPER       = 110; // Oracle: upper(?)
-    public static final int SQL_FUNC_LOWER       = 111; // Oracle: lower(?)
-    public static final int SQL_FUNC_TRIM        = 112; // Oracle: trim(?)
-    public static final int SQL_FUNC_LTRIM       = 113; // Oracle: ltrim(?)
-    public static final int SQL_FUNC_RTRIM       = 114; // Oracle: rtrim(?)
-    public static final int SQL_FUNC_ESCAPE      = 119; // Oracle: ? escape 
'{0}'
-    // Numeric
-    public static final int SQL_FUNC_ABS         = 120; // Oracle: abs(?,{0})
-    public static final int SQL_FUNC_ROUND       = 121; // Oracle: round(?, 
{0})
-    public static final int SQL_FUNC_TRUNC       = 122; // Oracle: trunc(?, 
{0})
-    public static final int SQL_FUNC_FLOOR       = 123; // Oracle: floor(?)
-    public static final int SQL_FUNC_CEILING     = 124; // Oracle: ceil(?)
-    public static final int SQL_FUNC_MODULO      = 125; // Oracle: mod(?)
-    public static final int SQL_FUNC_FORMAT      = 126; // Oracle: TO_CHAR(?)
-    // Date
-    public static final int SQL_FUNC_DAY         = 132; // MSSQL: month(?)
-    public static final int SQL_FUNC_MONTH       = 133; // MSSQL: month(?)
-    public static final int SQL_FUNC_YEAR        = 134; // MSSQL: year (?)
-    // Aggregation
-    public static final int SQL_FUNC_SUM         = 140; // Oracle: sum(?)
-    public static final int SQL_FUNC_MAX         = 142; // Oracle: max(?)
-    public static final int SQL_FUNC_MIN         = 143; // Oracle: min(?)
-    public static final int SQL_FUNC_AVG         = 144; // Oracle: avg(?)
-    // Decode
-    public static final int SQL_FUNC_DECODE      = 150; // Oracle: "decode(? 
{0})" SQL: "case ?{0} end"
-    public static final int SQL_FUNC_DECODE_SEP  = 151; // Oracle: ","         
    SQL: " "
-    public static final int SQL_FUNC_DECODE_PART = 152; // Oracle: "{0}, {1}"  
    SQL: "when {0} then {1}"
-    public static final int SQL_FUNC_DECODE_ELSE = 153; // Oracle: "{0}"       
    SQL: "else {0}"
-    
-    // Flag whether or not to set column defaults when crating DDL statements
-    protected boolean ddlColumnDefaults = false;
-
+      
     // Illegal name chars and reserved SQL keywords
     protected static final char[]   ILLEGAL_NAME_CHARS   = new char[] { '@', 
'?', '>', '=', '<', ';', ':', 
                                                                     '/', '.', 
'-', ',', '+', '*', ')', '(',
@@ -128,14 +83,6 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
     protected final Set<String> reservedSQLKeywords;
 
     /**
-     * This interface is used to set the auto generated keys when executing 
insert statements.
-     */
-    public interface DBSetGenKeys
-    {
-        void set(Object value);
-    }
-    
-    /**
      * This class is used to emulate sequences by using a sequence table.
      * It is used with the executeSQL function and only required for insert 
statements
      */
@@ -221,7 +168,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
                     if (seqValue == 0)
                         log.warn("Failed to increment sequence {}. Trying 
again!", SeqName);
                     // close
-                    driver.closeStatement(stmt);
+                    closeStatement(stmt);
                     cmd.clear();
                     rs = null;
                 }
@@ -233,7 +180,24 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
                 throw new EmpireSQLException(this, e);
             } finally
             { // Cleanup
-                driver.closeStatement(stmt);
+                closeStatement(stmt);
+            }
+        }
+
+        /*
+         * cleanup
+         */
+        private void closeStatement(Statement stmt)
+        {
+            try
+            { // Statement close
+                if (stmt != null)
+                    stmt.close();
+                // done
+                return;
+            } catch (SQLException sqle) { 
+                // Commit failed!
+                throw new EmpireSQLException(this, sqle);
             }
         }
     }
@@ -241,7 +205,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
     /**
      * Constructor
      */
-    public DBDatabaseDriver()
+    protected DBDatabaseDriverBase()
     {
         // Initialize List of reserved Keywords
         reservedSQLKeywords = new HashSet<String>(GENERAL_SQL_KEYWORDS.length);
@@ -249,12 +213,31 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
              reservedSQLKeywords.add(keyWord);
         }
     }
+    
+    /**
+     * Called when a database is opened
+     */
+    @Override
+    public void attachDatabase(DBDatabase db, Connection conn)
+    {
+        /* Nothing here */
+    }
+
+    /**
+     * Called when a database is closed
+     */
+    @Override
+    public void detachDatabase(DBDatabase db, Connection conn)
+    {
+        /* Nothing here */
+    }
 
     /**
      * This function creates a DBCommand derived object this database
      * @param db the database for which to create a command object for
      * @return a DBCommand object
      */
+    @Override
     public abstract DBCommand createCommand(DBDatabase db);
 
     /**
@@ -265,9 +248,10 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param left the right command
      * @return a DBCommandExpr object
      */
+    @Override
     public DBCommandExpr createCombinedCommand(DBCommandExpr left, String 
keyWord, DBCommandExpr right)
     {
-       return new DBCombinedCmd(left, keyWord, right);
+        return new DBCombinedCmd(left, keyWord, right);
     }
 
     /**
@@ -275,6 +259,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param type type of requested feature. @see DBDriverFeature
      * @return true if the features is supported or false otherwise
      */
+    @Override
     public abstract boolean isSupported(DBDriverFeature type);
 
     /**
@@ -283,7 +268,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * containing a "-", "/", "+" or " " require quoting.<br>
      * Overrides this function to add database specific keywords like "user" 
or "count"  
      */
-    protected boolean detectQuoteName(String name)
+    public boolean detectQuoteName(String name)
     {
         // Check for reserved names
         if (reservedSQLKeywords.contains(name.toLowerCase()))
@@ -311,8 +296,11 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param name the name of the object (table, view or column)
      * @param useQuotes use quotes or not
      */
-    public void appendElementName(StringBuilder sql, String name, boolean 
useQuotes)
+    @Override
+    public void appendElementName(StringBuilder sql, String name, Boolean 
useQuotes)
     {
+        if (useQuotes==null)
+            useQuotes = detectQuoteName(name);
         // Check whether to use quotes or not
         if (useQuotes)
             sql.append(getSQLPhrase(DBDatabaseDriver.SQL_QUOTES_OPEN));
@@ -322,16 +310,6 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
         if (useQuotes)
             sql.append(getSQLPhrase(DBDatabaseDriver.SQL_QUOTES_CLOSE));
     }
-
-    /**
-     * Appends a table, view or column name to an SQL phrase. 
-     * @param sql the StringBuilder containing the SQL phrase.
-     * @param name the name of the object (table, view or column)
-     */
-    public final void appendElementName(StringBuilder sql, String name)
-    {
-        appendElementName(sql, name, detectQuoteName(name));
-    }
     
     /**
      * Returns an sql phrase template for this database system.<br>
@@ -341,19 +319,10 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param phrase the identifier of the phrase  
      * @return the phrase template
      */
+    @Override
     public abstract String getSQLPhrase(int phrase);
 
     /**
-     * Returns a data type convertion phrase template for this driver<br>
-     * The returned template must contain a '?' which will be replaced by a 
column expression.
-     * @param destType the target data type
-     * @param srcType the source data type
-     * @param format additional formatting information (optional) 
-     * @return the data conversion phrase template
-     */
-    public abstract String getConvertPhrase(DataType destType, DataType 
srcType, Object format);
-
-    /**
      * Returns the next value of a named sequence The numbers are used for 
fields of type DBExpr.DT_AUTOINC.<BR>
      * If a driver supports this function it must return true for 
isSupported(DBDriverFeature.SEQUENCES).
      * 
@@ -381,6 +350,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param conn a valid database connection
      * @return the auto-generated value
      */
+    @Override
     public Object getColumnAutoValue(DBDatabase db, DBTableColumn column, 
Connection conn)
     {
         // Supports sequences?
@@ -414,8 +384,8 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param sqlParams list of objects
      */
     protected void prepareStatement(PreparedStatement pstmt, Object[] 
sqlParams) 
-       throws SQLException
-       {
+        throws SQLException
+    {
         for (int i=0; i<sqlParams.length; i++)
         {
             Object value = sqlParams[i];
@@ -426,7 +396,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
                 throw e;
             }
         }
-       }
+    }
 
     /**
      * Adds a statement parameter to a prepared statement
@@ -436,8 +406,8 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param value the parameter value
      */
     protected void addStatementParam(PreparedStatement pstmt, int paramIndex, 
Object value)
-               throws SQLException
-       {
+        throws SQLException
+    {
         if (value instanceof DBBlobData)
         {
             // handling for blobs
@@ -466,7 +436,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
                 log.debug("Statement param {} set to date '{}'", paramIndex, 
ts);
         }
         else if((value instanceof Character) 
-                || (value instanceof Enum<?>))
+             || (value instanceof Enum<?>))
         {
             // Objects that need String conversion
             String strval = value.toString();
@@ -482,7 +452,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
             if (log.isDebugEnabled())
                 log.debug("Statement param {} set to '{}'", paramIndex, value);
         }
-       }
+    }
     
     /**
      * Extracts native error message of an sqlExeption.
@@ -490,6 +460,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param e the SQLException
      * @return the error message of the database 
      */
+    @Override
     public String extractErrorMessage(SQLException e)
     {
         return e.getMessage();
@@ -511,6 +482,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * 
      * @throws SQLException if a database access error occurs
      */
+    @Override
     public Object getResultValue(ResultSet rset, int columnIndex, DataType 
dataType)
         throws SQLException
     {
@@ -530,7 +502,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
         } 
         else
         {
-               return rset.getObject(columnIndex);
+            return rset.getObject(columnIndex);
         }
     }
     
@@ -546,6 +518,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * 
      * @throws SQLException if a database access error occurs
      */
+    @Override
     public int executeSQL(String sqlCmd, Object[] sqlParams, Connection conn, 
DBSetGenKeys genKeys)
         throws SQLException
     {   // Execute the Statement
@@ -558,9 +531,9 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
                 PreparedStatement pstmt = (genKeys!=null) 
                     ? conn.prepareStatement(sqlCmd, 
Statement.RETURN_GENERATED_KEYS)
                     : conn.prepareStatement(sqlCmd);
-               stmt = pstmt;
-                   prepareStatement(pstmt, sqlParams); 
-                   count = pstmt.executeUpdate(); 
+                stmt = pstmt;
+                prepareStatement(pstmt, sqlParams); 
+                count = pstmt.executeUpdate(); 
             }
             else
             {   // Execute a simple statement
@@ -597,81 +570,84 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @return
      * @throws SQLException
      */
+    @Override
     public int[] executeBatch(String[] sqlCmd, Object[][] sqlCmdParams, 
Connection conn)
         throws SQLException
     {   // Execute the Statement
         if (sqlCmdParams!=null)
         {   // Use a prepared statement
-               PreparedStatement pstmt = null;
-               try
-               {
-               int pos=0;
-               String lastCmd = null;
-               int[] result = new int[sqlCmd.length];
-               for (int i=0; i<=sqlCmd.length; i++)
-               {       // get cmd
-                       String cmd = (i<sqlCmd.length ? sqlCmd[i] : null);
-                       if (StringUtils.compareEqual(cmd, lastCmd, true)==false)
-                       {       // close last statement
-                               if (pstmt!=null)
-                               {       // execute and close
-                                               log.debug("Executing batch 
containing {} statements", i-pos);
-                                       int[] res = pstmt.executeBatch();
-                                       for (int j=0; j<res.length; j++)
-                                               result[pos+j]=res[j];
-                                       pos+=res.length;
-                                       closeStatement(pstmt);
-                                       pstmt = null;
-                               }
-                               // has next?
-                                       if (cmd==null)
-                                               break;
-                                       // new statement
-                                       log.debug("Creating prepared statement 
for batch: "+cmd);
-                               pstmt = conn.prepareStatement(cmd);
-                               lastCmd = cmd;
-                       }
-                       // add batch
-                       if (sqlCmdParams[i]!=null)
-                       {       
-                               prepareStatement(pstmt, sqlCmdParams[i]); 
-                       }       
-                               log.debug("Adding batch with {} params.", 
(sqlCmdParams[i]!=null ? sqlCmdParams[i].length : 0));
-                       pstmt.addBatch();
-               }
-                   return result; 
+            PreparedStatement pstmt = null;
+            try
+            {
+                int pos=0;
+                String lastCmd = null;
+                int[] result = new int[sqlCmd.length];
+                for (int i=0; i<=sqlCmd.length; i++)
+                {   // get cmd
+                    String cmd = (i<sqlCmd.length ? sqlCmd[i] : null);
+                    if (StringUtils.compareEqual(cmd, lastCmd, true)==false)
+                    {   // close last statement
+                        if (pstmt!=null)
+                        {   // execute and close
+                            log.debug("Executing batch containing {} 
statements", i-pos);
+                            int[] res = pstmt.executeBatch();
+                            for (int j=0; j<res.length; j++)
+                                result[pos+j]=res[j];
+                            pos+=res.length;
+                            closeStatement(pstmt);
+                            pstmt = null;
+                        }
+                        // has next?
+                        if (cmd==null)
+                            break;
+                        // new statement
+                        log.debug("Creating prepared statement for batch: 
"+cmd);
+                        pstmt = conn.prepareStatement(cmd);
+                        lastCmd = cmd;
+                    }
+                    // add batch
+                    if (sqlCmdParams[i]!=null)
+                    {   
+                        prepareStatement(pstmt, sqlCmdParams[i]); 
+                    }   
+                    log.debug("Adding batch with {} params.", 
(sqlCmdParams[i]!=null ? sqlCmdParams[i].length : 0));
+                    pstmt.addBatch();
+                }
+                return result; 
             } finally {
-                   closeStatement(pstmt);
-               }
+                closeStatement(pstmt);
+            }
         }
         else
         {   // Execute a simple statement
             Statement stmt = conn.createStatement();
             try {
-               for (int i=0; i<sqlCmd.length; i++)
-               {
-                       String cmd = sqlCmd[i];
-                       log.debug("Adding statement to batch: "+cmd);
-                       stmt.addBatch(cmd);
-               }
-                       log.debug("Executing batch containing {} statements", 
sqlCmd.length);
-                   int result[] = stmt.executeBatch();
-                   return result;
+                for (int i=0; i<sqlCmd.length; i++)
+                {
+                    String cmd = sqlCmd[i];
+                    log.debug("Adding statement to batch: "+cmd);
+                    stmt.addBatch(cmd);
+                }
+                log.debug("Executing batch containing {} statements", 
sqlCmd.length);
+                int result[] = stmt.executeBatch();
+                return result;
             } finally {
-                   closeStatement(stmt);
-               }
+                closeStatement(stmt);
+            }
         }
     }
     
     /**
-     * Query a sql ResultSet
-     * @param sqlCmd
-     * @param sqlParams
-     * @param scrollable
-     * @param conn
-     * @return
+     * Executes an select SQL-command and returns the query results
+     * 
+     * @param sqlCmd the SQL-Command
+     * @param sqlParams array of sql command parameters used for prepared 
statements (Optional).
+     * @param scrollable true if scrollable or false otherwise
+     * @param conn a valid connection to the database.
+     * @return the JDBC resultset
      * @throws SQLException
      */
+    @Override
     public ResultSet executeQuery(String sqlCmd, Object[] sqlParams, boolean 
scrollable, Connection conn)
         throws SQLException
     {
@@ -681,17 +657,17 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
             int type = (scrollable ? ResultSet.TYPE_SCROLL_INSENSITIVE
                                    : ResultSet.TYPE_FORWARD_ONLY);
             // Create an execute a query statement
-               if (sqlParams!=null)
-               {       // Use prepared statement
-                   PreparedStatement pstmt = conn.prepareStatement(sqlCmd, 
type, ResultSet.CONCUR_READ_ONLY);
-                   stmt = pstmt;
-                   prepareStatement(pstmt, sqlParams); 
-                   return pstmt.executeQuery();
-               } else
-               {       // Use simple statement
-                   stmt = conn.createStatement(type, 
ResultSet.CONCUR_READ_ONLY);
-                   return stmt.executeQuery(sqlCmd);
-               }
+            if (sqlParams!=null)
+            {   // Use prepared statement
+                PreparedStatement pstmt = conn.prepareStatement(sqlCmd, type, 
ResultSet.CONCUR_READ_ONLY);
+                stmt = pstmt;
+                prepareStatement(pstmt, sqlParams); 
+                return pstmt.executeQuery();
+            } else
+            {   // Use simple statement
+                stmt = conn.createStatement(type, ResultSet.CONCUR_READ_ONLY);
+                return stmt.executeQuery(sqlCmd);
+            }
         } catch(SQLException e) {
             // close statement (if not null)
             log.error("Error executing query '"+sqlCmd+"' --> 
"+e.getMessage(), e);
@@ -704,6 +680,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * Query a single value 
      * @return the value of the first column in the first row of the query 
      */
+    @Override
     public Object querySingleValue(String sqlCmd, Object[] sqlParams, DataType 
dataType, Connection conn)
     {
         ResultSet rs = null;
@@ -755,6 +732,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * <P>
      * @param rset a ResultSet object
      */
+    @Override
     public void closeResultSet(ResultSet rset)
     {
         try
@@ -787,6 +765,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param type the sql data type of the supplied value
      * @return the sql string representing this value
      */
+    @Override
     public String getValueString(Object value, DataType type)
     { 
         if (value instanceof Enum<?>)
@@ -987,22 +966,6 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
                "true".equalsIgnoreCase(value) ||
                "y".equalsIgnoreCase(value);
     }
-    
-    /**
-     * Called when a database is opened
-     */
-    protected void attachDatabase(DBDatabase db, Connection conn)
-    {
-        // Override to implement attaching behaviour
-    }
-
-    /**
-     * Called when a database is closed
-     */
-    protected void detachDatabase(DBDatabase db, Connection conn)
-    {
-        // Override to implement closing behaviour
-    }
 
     /**
      * Checks the database whether or not it is consistent with the 
description.
@@ -1022,6 +985,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param dbo the object for which to perform the operation (DBDatabase, 
DBTable, DBView, DBColumn, DBRelation) 
      * @param script the script to which to add the DDL command(s)
      */
+    @Override
     public void getDDLScript(DBCmdType type, DBObject dbo, DBSQLScript script)
     {
         throw new NotImplementedException(this, "getDDLScript");
@@ -1035,6 +999,7 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
      * @param enable true to enable the relation or false to disable
      * @param script the script to which to add the DDL command(s)
      */
+    @Override
     public void addEnableRelationStmt(DBRelation r, boolean enable, 
DBSQLScript script)
     {
         if (enable)
@@ -1042,34 +1007,14 @@ public abstract class DBDatabaseDriver // *Deprecated* 
implements Serializable
         else
             getDDLScript(DBCmdType.DROP, r, script);
     }
-    
-    /**
-     * @return <code>true</code> if column default values are created with dll 
statements or <code>false</code> if not
-     */
-    public boolean isDDLColumnDefaults()
-    {
-        return ddlColumnDefaults;
-    }
-
-    /**
-     * Set true if column default values should be included in DDL Statements  
-     * 
-     * @param ddlColumnDefaults <code>true</code> if dll statements should 
include 
-     *   column default values or <code>false</code> if not
-     */
-    public void setDDLColumnDefaults(boolean ddlColumnDefaults)
-    {
-        this.ddlColumnDefaults = ddlColumnDefaults;
-    }
 
     /**
      * Returns a timestamp that is used for record updates.
-     * 
      * @param conn the connection that might be used 
-     * 
      * @return the current date and time.
      */
-    public java.sql.Timestamp getUpdateTimestamp(Connection conn)
+    @Override
+    public Timestamp getUpdateTimestamp(Connection conn)
     {
         // Default implementation
         java.util.Date date = new java.util.Date();
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/derby/DBDatabaseDriverDerby.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/derby/DBDatabaseDriverDerby.java
index afafa4b..5701744 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/derby/DBDatabaseDriverDerby.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/derby/DBDatabaseDriverDerby.java
@@ -33,6 +33,7 @@ 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.db.driver.DBDatabaseDriverBase;
 import org.apache.empire.exceptions.NotSupportedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -43,7 +44,7 @@ import org.slf4j.LoggerFactory;
  * 
  *
  */
-public class DBDatabaseDriverDerby extends DBDatabaseDriver
+public class DBDatabaseDriverDerby extends DBDatabaseDriverBase
 {
        // *Deprecated* private static final long serialVersionUID = 1L;
     private static final Logger log = 
LoggerFactory.getLogger(DBDatabaseDriverDerby.class);
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/derby/DerbyDDLGenerator.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/derby/DerbyDDLGenerator.java
index 4d2cd40..f6080e3 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/derby/DerbyDDLGenerator.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/derby/DerbyDDLGenerator.java
@@ -74,7 +74,7 @@ public class DerbyDDLGenerator extends 
DBDDLGenerator<DBDatabaseDriverDerby>
         if (!appendColumnDataType(c.getDataType(), c.getSize(), c, sql))
             return;
         // Default Value
-        if (driver.isDDLColumnDefaults() && !c.isAutoGenerated() && 
c.getDefaultValue()!=null)
+        if (isDDLColumnDefaults() && !c.isAutoGenerated() && 
c.getDefaultValue()!=null)
         {   sql.append(" DEFAULT ");
             sql.append(driver.getValueString(c.getDefaultValue(), 
c.getDataType()));
         }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/h2/DBDatabaseDriverH2.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/h2/DBDatabaseDriverH2.java
index ee9d436..2e38021 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/h2/DBDatabaseDriverH2.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/h2/DBDatabaseDriverH2.java
@@ -33,6 +33,7 @@ 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.db.driver.DBDatabaseDriverBase;
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.exceptions.NotSupportedException;
 import org.slf4j.Logger;
@@ -44,7 +45,7 @@ import org.slf4j.LoggerFactory;
  * 
  *
  */
-public class DBDatabaseDriverH2 extends DBDatabaseDriver
+public class DBDatabaseDriverH2 extends DBDatabaseDriverBase
 {
     // *Deprecated* private static final long serialVersionUID = 1L;
     private static final Logger log = 
LoggerFactory.getLogger(DBDatabaseDriverH2.class);
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/hsql/DBDatabaseDriverHSql.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/hsql/DBDatabaseDriverHSql.java
index 4e4fe76..87e797f 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/hsql/DBDatabaseDriverHSql.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/hsql/DBDatabaseDriverHSql.java
@@ -33,6 +33,7 @@ import org.apache.empire.db.DBDriverFeature;
 import org.apache.empire.db.DBObject;
 import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.driver.DBDatabaseDriverBase;
 import org.apache.empire.db.exceptions.QueryNoResultException;
 import org.apache.empire.exceptions.NotSupportedException;
 import org.slf4j.Logger;
@@ -45,7 +46,7 @@ import org.slf4j.LoggerFactory;
  *
  * 
  */
-public class DBDatabaseDriverHSql extends DBDatabaseDriver
+public class DBDatabaseDriverHSql extends DBDatabaseDriverBase
 {
     // *Deprecated* private static final long serialVersionUID = 1L;
     private static final Logger log = 
LoggerFactory.getLogger(DBDatabaseDriverHSql.class);
@@ -241,7 +242,7 @@ public class DBDatabaseDriverHSql extends DBDatabaseDriver
         StringBuilder sql = new StringBuilder(80);
         sql.append("SELECT ");
         sql.append("NEXT VALUE FOR ");
-        db.appendQualifiedName(sql, seqName, detectQuoteName(seqName));
+        db.appendQualifiedName(sql, seqName, null);
         sql.append(" FROM INFORMATION_SCHEMA.SYSTEM_SEQUENCES WHERE 
SEQUENCE_NAME='").append(seqName).append("'");
         // Query next sequence value
         String sqlCmd = sql.toString();
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/hsql/HSqlDDLGenerator.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/hsql/HSqlDDLGenerator.java
index 923b40c..17dac74 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/hsql/HSqlDDLGenerator.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/hsql/HSqlDDLGenerator.java
@@ -114,7 +114,7 @@ public class HSqlDDLGenerator extends 
DBDDLGenerator<DBDatabaseDriverHSql>
         sql.append(c.toString());
         sql.append(" --\r\n");
         sql.append("CREATE SEQUENCE ");
-        db.appendQualifiedName(sql, seqName, detectQuoteName(seqName));
+        db.appendQualifiedName(sql, seqName, null);
         sql.append(" START WITH 1");
         // executeDLL
         script.addStmt(sql);
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/mysql/DBDatabaseDriverMySQL.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/mysql/DBDatabaseDriverMySQL.java
index f7eddc9..b0fe4ec 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/mysql/DBDatabaseDriverMySQL.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/mysql/DBDatabaseDriverMySQL.java
@@ -37,6 +37,7 @@ 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.db.driver.DBDatabaseDriverBase;
 import org.apache.empire.db.exceptions.EmpireSQLException;
 import org.apache.empire.exceptions.NotSupportedException;
 import org.slf4j.Logger;
@@ -48,7 +49,7 @@ import org.slf4j.LoggerFactory;
  * 
  *
  */
-public class DBDatabaseDriverMySQL extends DBDatabaseDriver
+public class DBDatabaseDriverMySQL extends DBDatabaseDriverBase
 {
     // *Deprecated* private static final long serialVersionUID = 1L;
     private static final Logger log = 
LoggerFactory.getLogger(DBDatabaseDriverMySQL.class);
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/mysql/MySQLDDLGenerator.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/mysql/MySQLDDLGenerator.java
index 1635496..51c28ea 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/mysql/MySQLDDLGenerator.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/mysql/MySQLDDLGenerator.java
@@ -33,7 +33,7 @@ import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTable;
 import org.apache.empire.db.DBTableColumn;
 import org.apache.empire.db.DBView;
-import org.apache.empire.db.DBDatabaseDriver.DBSeqTable;
+import org.apache.empire.db.driver.DBDatabaseDriverBase.DBSeqTable;
 import org.apache.empire.exceptions.NotSupportedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/oracle/DBDatabaseDriverOracle.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/oracle/DBDatabaseDriverOracle.java
index 883ffe9..f155c40 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/oracle/DBDatabaseDriverOracle.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/oracle/DBDatabaseDriverOracle.java
@@ -44,6 +44,7 @@ import org.apache.empire.db.DBTable;
 import org.apache.empire.db.DBTableColumn;
 import org.apache.empire.db.DBView;
 import org.apache.empire.db.context.DBContextStatic;
+import org.apache.empire.db.driver.DBDatabaseDriverBase;
 import org.apache.empire.db.exceptions.EmpireSQLException;
 import org.apache.empire.db.exceptions.QueryNoResultException;
 import org.apache.empire.db.expr.column.DBValueExpr;
@@ -56,7 +57,7 @@ import org.slf4j.LoggerFactory;
  * This class provides support for the Oracle database system.<br>
  * Oracle Version 9 or higher is required.
  */
-public class DBDatabaseDriverOracle extends DBDatabaseDriver
+public class DBDatabaseDriverOracle extends DBDatabaseDriverBase
 {
     // *Deprecated* private static final long serialVersionUID = 1L;
     private static final Logger log = 
LoggerFactory.getLogger(DBDatabaseDriverOracle.class);
@@ -325,7 +326,7 @@ public class DBDatabaseDriverOracle extends DBDatabaseDriver
     { // Use Oracle Sequences
         StringBuilder sql = new StringBuilder(80);
         sql.append("SELECT ");
-        db.appendQualifiedName(sql, seqName, detectQuoteName(seqName));
+        db.appendQualifiedName(sql, seqName, null);
         sql.append(".NEXTVAL FROM DUAL");
         // Query next sequence value
         String sqlCmd = sql.toString();
@@ -351,7 +352,7 @@ public class DBDatabaseDriverOracle extends DBDatabaseDriver
         if (StringUtils.isEmpty(seqName))
             throw new InvalidArgumentException("column", column);
         StringBuilder sql = new StringBuilder(80);
-        column.getDatabase().appendQualifiedName(sql, seqName, 
detectQuoteName(seqName));
+        column.getDatabase().appendQualifiedName(sql, seqName, null);
         sql.append(".NEXTVAL");
         return new DBValueExpr(column.getDatabase(), sql.toString(), 
DataType.UNKNOWN);
     }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/oracle/OracleDDLGenerator.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/oracle/OracleDDLGenerator.java
index 6ed8723..ddfa022 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/oracle/OracleDDLGenerator.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/oracle/OracleDDLGenerator.java
@@ -146,7 +146,7 @@ public class OracleDDLGenerator extends 
DBDDLGenerator<DBDatabaseDriverOracle>
         sql.append(c.getFullName());
         sql.append(" --\r\n");
         sql.append("CREATE SEQUENCE ");
-        db.appendQualifiedName(sql, seqName, detectQuoteName(seqName));
+        db.appendQualifiedName(sql, seqName, null);
         sql.append(" INCREMENT BY 1 START WITH 1 MINVALUE 0 NOCYCLE NOCACHE 
NOORDER");
         // executeDLL
         script.addStmt(sql);
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/postgresql/DBDatabaseDriverPostgreSQL.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/postgresql/DBDatabaseDriverPostgreSQL.java
index 5e25c08..45c6a74 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/postgresql/DBDatabaseDriverPostgreSQL.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/postgresql/DBDatabaseDriverPostgreSQL.java
@@ -36,6 +36,7 @@ import org.apache.empire.db.DBDriverFeature;
 import org.apache.empire.db.DBObject;
 import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.driver.DBDatabaseDriverBase;
 import org.apache.empire.db.exceptions.EmpireSQLException;
 import org.apache.empire.db.exceptions.QueryNoResultException;
 import org.apache.empire.db.expr.column.DBValueExpr;
@@ -49,7 +50,7 @@ import org.slf4j.LoggerFactory;
  * 
  *
  */
-public class DBDatabaseDriverPostgreSQL extends DBDatabaseDriver
+public class DBDatabaseDriverPostgreSQL extends DBDatabaseDriverBase
 {
     // *Deprecated* private static final long serialVersionUID = 1L;
   
@@ -429,7 +430,7 @@ public class DBDatabaseDriverPostgreSQL extends 
DBDatabaseDriver
         // Use PostgreSQL Sequences
         StringBuilder sql = new StringBuilder(80);
         sql.append("SELECT nextval('");
-        db.appendQualifiedName(sql, seqName, detectQuoteName(seqName));
+        db.appendQualifiedName(sql, seqName, null);
         sql.append("')");
         // Query next sequence value
         String sqlCmd = sql.toString();
@@ -456,7 +457,7 @@ public class DBDatabaseDriverPostgreSQL extends 
DBDatabaseDriver
             throw new InvalidArgumentException("column", column);
         StringBuilder sql = new StringBuilder(80);
         sql.append("nextval('");
-        column.getDatabase().appendQualifiedName(sql, seqName, false);
+        column.getDatabase().appendQualifiedName(sql, seqName, null);
         sql.append("')");
         return new DBValueExpr(column.getDatabase(), sql.toString(), 
DataType.UNKNOWN);
     }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/postgresql/PostgreDDLGenerator.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/postgresql/PostgreDDLGenerator.java
index 98d8ba5..b7905dc 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/postgresql/PostgreDDLGenerator.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/postgresql/PostgreDDLGenerator.java
@@ -110,7 +110,7 @@ public class PostgreDDLGenerator extends 
DBDDLGenerator<DBDatabaseDriverPostgreS
         sql.append(c.getFullName());
         sql.append(" --\r\n");
         sql.append("CREATE SEQUENCE ");
-        db.appendQualifiedName(sql, seqName, detectQuoteName(seqName));
+        db.appendQualifiedName(sql, seqName, null);
         
 //        create sequence foo_id_seq;
 //        select setval('foo_id_seq', (select max(id) from foo));
@@ -135,7 +135,7 @@ public class PostgreDDLGenerator extends 
DBDDLGenerator<DBDatabaseDriverPostgreS
         if (!appendColumnDataType(c.getDataType(), c.getSize(), c, sql))
             return;
         // Default Value
-        if (driver.isDDLColumnDefaults() && !c.isAutoGenerated() && 
c.getDefaultValue()!=null)
+        if (isDDLColumnDefaults() && !c.isAutoGenerated() && 
c.getDefaultValue()!=null)
         {   sql.append(" DEFAULT ");
             sql.append(driver.getValueString(c.getDefaultValue(), 
c.getDataType()));
         }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/sqlite/DBDatabaseDriverSQLite.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/sqlite/DBDatabaseDriverSQLite.java
index 14ddb28..d9f1afd 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/sqlite/DBDatabaseDriverSQLite.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/sqlite/DBDatabaseDriverSQLite.java
@@ -42,6 +42,7 @@ import org.apache.empire.db.DBJoinType;
 import org.apache.empire.db.DBObject;
 import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.driver.DBDatabaseDriverBase;
 import org.apache.empire.db.expr.join.DBColumnJoinExpr;
 import org.apache.empire.db.expr.join.DBJoinExpr;
 import org.apache.empire.exceptions.NotImplementedException;
@@ -54,7 +55,7 @@ import org.slf4j.LoggerFactory;
  * This class provides support for the SQLite database system.<br>
  * 
  */
-public class DBDatabaseDriverSQLite extends DBDatabaseDriver
+public class DBDatabaseDriverSQLite extends DBDatabaseDriverBase
 {
     // *Deprecated* private static final long serialVersionUID = 1L;
     private static final Logger log              = 
LoggerFactory.getLogger(DBDatabaseDriverSQLite.class);
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/sqlserver/DBDatabaseDriverMSSQL.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/sqlserver/DBDatabaseDriverMSSQL.java
index b200780..5eb8384 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/sqlserver/DBDatabaseDriverMSSQL.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/sqlserver/DBDatabaseDriverMSSQL.java
@@ -39,6 +39,7 @@ import org.apache.empire.db.DBRelation;
 import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTable;
 import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.driver.DBDatabaseDriverBase;
 import org.apache.empire.db.exceptions.EmpireSQLException;
 import org.apache.empire.exceptions.NotSupportedException;
 import org.slf4j.Logger;
@@ -50,7 +51,7 @@ import org.slf4j.LoggerFactory;
  *
  * 
  */
-public class DBDatabaseDriverMSSQL extends DBDatabaseDriver
+public class DBDatabaseDriverMSSQL extends DBDatabaseDriverBase
 {
     // *Deprecated* private static final long serialVersionUID = 1L;
     private static final Logger log = 
LoggerFactory.getLogger(DBDatabaseDriverMSSQL.class);
@@ -221,7 +222,7 @@ public class DBDatabaseDriverMSSQL extends DBDatabaseDriver
     /** {@inheritDoc} */
     @SuppressWarnings("unused")
     @Override
-    protected void attachDatabase(DBDatabase db, Connection conn)
+    public void attachDatabase(DBDatabase db, Connection conn)
     {
         // Prepare
         try
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/driver/sqlserver/MSSqlDDLGenerator.java
 
b/empire-db/src/main/java/org/apache/empire/db/driver/sqlserver/MSSqlDDLGenerator.java
index 3695012..47dbdc0 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/driver/sqlserver/MSSqlDDLGenerator.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/driver/sqlserver/MSSqlDDLGenerator.java
@@ -26,11 +26,11 @@ import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBDDLGenerator;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBExpr;
-import org.apache.empire.db.DBDatabaseDriver.DBSeqTable;
 import org.apache.empire.db.DBIndex;
 import org.apache.empire.db.DBIndex.DBIndexType;
 import org.apache.empire.db.DBSQLScript;
 import org.apache.empire.db.DBTableColumn;
+import org.apache.empire.db.driver.DBDatabaseDriverBase.DBSeqTable;
 
 public class MSSqlDDLGenerator extends DBDDLGenerator<DBDatabaseDriverMSSQL>
 {
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAliasExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAliasExpr.java
index d3117c9..f963cb0 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAliasExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAliasExpr.java
@@ -172,7 +172,7 @@ public class DBAliasExpr extends DBColumnExpr
             if (asExpr!=null)
             {
                 buf.append(asExpr);
-                driver.appendElementName(buf, alias);
+                driver.appendElementName(buf, alias, null);
             }
         } 
         else
diff --git a/empire-db/src/test/java/org/apache/empire/DBResource.java 
b/empire-db/src/test/java/org/apache/empire/DBResource.java
index 4bde3c1..5c51218 100644
--- a/empire-db/src/test/java/org/apache/empire/DBResource.java
+++ b/empire-db/src/test/java/org/apache/empire/DBResource.java
@@ -138,7 +138,7 @@ public class DBResource extends ExternalResource
         
         private DB(final String jdbcClass, final String jdbcURL, final Class<? 
extends DBDatabaseDriver> driver)
         {
-               this(jdbcClass, jdbcURL, driver, null, null);
+            this(jdbcClass, jdbcURL, driver, null, null);
         }
         
         private DB(final String jdbcClass, final String jdbcURL, final Class<? 
extends DBDatabaseDriver> driver, final String username, final String password)
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 2c7df53..bc6d881 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
@@ -18,11 +18,12 @@
  */
 package org.apache.empire.db;
 
-import org.apache.empire.data.DataType;
-
 import java.sql.Connection;
 
-public class MockDriver extends DBDatabaseDriver{
+import org.apache.empire.data.DataType;
+import org.apache.empire.db.driver.DBDatabaseDriverBase;
+
+public class MockDriver extends DBDatabaseDriverBase {
     // *Deprecated* private static final long serialVersionUID = 1L;
   
     class MockCommand extends DBCommand{
@@ -31,7 +32,6 @@ public class MockDriver extends DBDatabaseDriver{
         {
             super(db);
         }
-        
     }
 
     @Override

Reply via email to