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