public class SDriver
extends java.lang.Object
(Profiling suggests that memoising these generaters could produce a 5-10% improvement in bulk updates.)
There is now one driver instance per connection so one can say SSession.getDriver().setMyFavouriteParam(...)
SQL 92 standard data types, I think:- boolean, Character(n), character varying(n), date, float(p), real, double precission, smallint, int | integer, decimal(p,s), numeric(p,s), time, interval, timestamp with timezone,
Modifier and Type | Class and Description |
---|---|
static class |
SDriver.OffsetStrategy |
Modifier | Constructor and Description |
---|---|
protected |
SDriver() |
Modifier and Type | Method and Description |
---|---|
protected void |
addNull(java.lang.StringBuffer sql,
SFieldScalar fld) |
java.lang.String |
alterTableAddColumnSQL(SFieldScalar field)
These alow you to create a new SFieldMeta object at runtime and then
update the table to include it.
|
java.lang.String |
alterTableDropColumnSQL(SFieldScalar field) |
void |
appendColumnName(SFieldScalar field,
java.lang.StringBuffer buf)
name appended, quoted iff appropriate.
|
protected void |
appendQuotedIdentifier(java.lang.String ident,
java.lang.StringBuffer buf)
Wraps identifiers in "s to avoid reserved word issues.
|
protected void |
appendQuotedIdentifier(java.lang.String ident,
java.lang.StringBuffer buf,
char quote) |
void |
appendTableName(SRecordMeta table,
java.lang.StringBuffer buf)
name, quoted iff appropriate.
|
protected java.lang.String |
clauseSeparator(java.lang.String indent)
Normally newline and indent to separate clauses of large SQL statement
|
protected java.lang.String |
columnTypeSQL(SFieldScalar field,
java.lang.String defalt)
Used to override the default.
|
protected java.lang.String |
createSequenceDDL(java.lang.String name) |
java.lang.String |
createTableSQL(SRecordMeta<?> meta)
Returns a
CREATE TABLE for this table. |
protected java.lang.String |
deleteSQL(SRecordMeta from,
java.util.ArrayList where,
SRecordInstance instance,
java.lang.Object[] keyMetaValues)
Returns the SQL statement for an DELETE in a structured way.
|
protected java.lang.String |
driverName()
The driver name to be compared to getMetaData().getDriverName()
|
protected java.lang.String |
dropSequenceDDL(java.lang.String name) |
void |
dropTableNoError(java.lang.String table)
Utility routine for dropping tables called by SSession.
|
protected java.lang.String |
foreignKeysSQL(SRecordMeta meta)
Returns
FOREIGN KEY (FKCOL, FKCOL) REFERENCES FTABLE (KCOL,
KCOL)
appended to end. |
protected java.lang.String |
forUpdateSQL(boolean forUpdate)
Returns update clause, may not be valid in certain lock modes etc.
|
protected void |
fromSQL(SRecordMeta from,
SRecordMeta[] joinTables,
java.lang.StringBuffer res)
Returns the FROM Table, Table...
|
protected long |
generateKeySelectMax(SRecordMeta rec,
SFieldScalar keyFld)
Generates a new key using SELECT MAX+1.
|
protected long |
generateKeySequence(SRecordMeta<?> rec,
SFieldScalar keyFld) |
SLog |
getLogger() |
protected SDriver.OffsetStrategy |
getOffsetStrategy()
JDBC prefered, if jdbc driver has a sensible scrollable resultset implemntation
QUERY if database would handle it better via some proprietary sql extension (eg.
|
SSessionJdbc |
getSession() |
protected java.lang.String |
indexKeySQL(SRecordMeta meta)
Needed for MySQL to create indexes on foreign keys
|
protected java.lang.String |
insertSQL(java.util.ArrayList<SFieldScalar> updates,
SRecordMeta from)
Returns the SQL statement for an INSERT in a structured way.
|
protected java.lang.String |
joinSQL(SRecordMeta[] joinTables) |
protected java.lang.String |
limitSQL(long offset,
long limit)
Drivers that choose to implement a QUERY offset strategy
should return the limit statment here
|
protected void |
makeForeignKeyIndexSQL(SRecordMeta meta,
int fx,
SFieldReference fldRef,
java.lang.StringBuffer sbFkey,
java.lang.StringBuffer sbRefed,
java.lang.StringBuffer fkey) |
protected java.lang.String |
mapForeignKeys(SRecordMeta<?> meta,
boolean foreignKey) |
int |
maxIdentNameLength()
The maximum size for table names and foreign key constraint names.
|
protected java.lang.String |
postColumnSQL(SFieldMeta field)
After NOT NULL but before the ",", ie column specific annotations.
|
protected java.lang.String |
postFromSQL(boolean forUpdate)
For MSSQL.
|
protected java.lang.String |
postTablePostParenSQL(SRecordMeta meta)
Any other text to be added after the final ")".
|
protected java.lang.String |
postTablePreParenSQL(SRecordMeta meta)
Any other text to be added before the final ")"
|
protected java.lang.String |
primaryKeySQL(SRecordMeta<?> meta)
Return
PRIMARY KEY(KCOL, KCOL) appended to end. |
protected simpleorm.sessionjdbc.SQueryExecute |
queryExecuteFactory(SSessionJdbc session,
SQuery query) |
void |
registerDriver()
Add driver to the list of possible drivers that can be found by
SSession.attach.
|
protected java.lang.String |
selectSQL(SFieldScalar[] select,
SRecordMeta<?> from,
java.lang.String join,
java.lang.String where,
java.lang.String orderBy,
boolean forUpdate,
simpleorm.sessionjdbc.SQueryExecute sps) |
protected java.lang.String |
selectSQL(SFieldScalar[] select,
SRecordMeta from,
SFieldScalar[] where,
java.lang.String orderBy,
boolean forUpdate,
simpleorm.sessionjdbc.SQueryExecute sps)
Returns the SQL statement for a SELECT in a structured way.
|
boolean |
supportsKeySequences() |
boolean |
supportsLocking()
True if exclusive locks are properly supported.
|
protected java.lang.String |
updateSQL(java.util.ArrayList<SFieldScalar> updates,
SRecordMeta from,
java.util.ArrayList<SFieldScalar> where,
SRecordInstance instance,
java.lang.Object[] keyMetaValues)
Returns the SQL statement for an UPDATE in a structured way.
|
protected void |
whereSQL(java.lang.StringBuffer ret,
java.util.ArrayList<SFieldScalar> where,
SRecordInstance instance,
java.lang.Object[] keyMetaValues)
Produces the WHERE clause of UPDATE and DELETE statements.
|
protected java.lang.String |
wholeColumnSQL(SFieldScalar fld)
Returns
MY_COL VARCHAR(13) NOT NULL . |
public void registerDriver()
protected java.lang.String driverName()
protected simpleorm.sessionjdbc.SQueryExecute queryExecuteFactory(SSessionJdbc session, SQuery query)
protected void appendQuotedIdentifier(java.lang.String ident, java.lang.StringBuffer buf)
protected void appendQuotedIdentifier(java.lang.String ident, java.lang.StringBuffer buf, char quote)
public void appendColumnName(SFieldScalar field, java.lang.StringBuffer buf)
public void appendTableName(SRecordMeta table, java.lang.StringBuffer buf)
public int maxIdentNameLength()
public boolean supportsLocking()
public java.lang.String alterTableAddColumnSQL(SFieldScalar field)
public java.lang.String alterTableDropColumnSQL(SFieldScalar field)
public java.lang.String createTableSQL(SRecordMeta<?> meta)
CREATE TABLE
for this table. Delegated from
SRecord. This is split up into many sub-methods so that they can be
selectively specialized by other drivers.protected java.lang.String clauseSeparator(java.lang.String indent)
protected java.lang.String wholeColumnSQL(SFieldScalar fld)
MY_COL VARCHAR(13) NOT NULL
.#SMANDATORY
protected void addNull(java.lang.StringBuffer sql, SFieldScalar fld)
protected java.lang.String columnTypeSQL(SFieldScalar field, java.lang.String defalt)
protected java.lang.String postColumnSQL(SFieldMeta field)
protected java.lang.String primaryKeySQL(SRecordMeta<?> meta)
PRIMARY KEY(KCOL, KCOL)
appended to end.protected java.lang.String indexKeySQL(SRecordMeta meta)
protected java.lang.String foreignKeysSQL(SRecordMeta meta)
FOREIGN KEY (FKCOL, FKCOL) REFERENCES FTABLE (KCOL,
KCOL)
appended to end.protected java.lang.String mapForeignKeys(SRecordMeta<?> meta, boolean foreignKey)
protected void makeForeignKeyIndexSQL(SRecordMeta meta, int fx, SFieldReference fldRef, java.lang.StringBuffer sbFkey, java.lang.StringBuffer sbRefed, java.lang.StringBuffer fkey)
protected java.lang.String postTablePreParenSQL(SRecordMeta meta)
protected java.lang.String postTablePostParenSQL(SRecordMeta meta)
protected java.lang.String selectSQL(SFieldScalar[] select, SRecordMeta from, SFieldScalar[] where, java.lang.String orderBy, boolean forUpdate, simpleorm.sessionjdbc.SQueryExecute sps)
select
and where
are arrays
of SFieldMeta
s. Returns SQL statement as a string.
This now quotes table and column names so that they become case independent.
sps is links to the SPreparedStatement object. It can have arbitrary properties set to provide fine control over the query. Examples include limits.
protected java.lang.String selectSQL(SFieldScalar[] select, SRecordMeta<?> from, java.lang.String join, java.lang.String where, java.lang.String orderBy, boolean forUpdate, simpleorm.sessionjdbc.SQueryExecute sps)
protected java.lang.String forUpdateSQL(boolean forUpdate)
Oracle, Postgresql, and new in MS SQL 2005 support data versioning or snapshots. This means that repeatable read is achieved by caching the previous value read instead of using read locks. This approach makes it critical to add FOR UPDATE where appropriate or there is effectively no locking.
Indeed, in Oracle, you are guaranteed that several SELECTS will return the same value, but a subsequent SELECT FOR UPDATE in the same transaction may return a different value.
protected java.lang.String limitSQL(long offset, long limit)
offset
- number of rows to skiplimit
- number of rows to retrieveprotected void fromSQL(SRecordMeta from, SRecordMeta[] joinTables, java.lang.StringBuffer res)
protected java.lang.String joinSQL(SRecordMeta[] joinTables)
protected java.lang.String postFromSQL(boolean forUpdate)
protected java.lang.String updateSQL(java.util.ArrayList<SFieldScalar> updates, SRecordMeta from, java.util.ArrayList<SFieldScalar> where, SRecordInstance instance, java.lang.Object[] keyMetaValues)
updates
and where
are SSArrayLists
of SFieldMetas. Returns SQL statement as a string.protected java.lang.String insertSQL(java.util.ArrayList<SFieldScalar> updates, SRecordMeta from)
updates
and where
are SSArrayLists
of SFieldMetas. Returns SQL statement as a string.protected java.lang.String deleteSQL(SRecordMeta from, java.util.ArrayList where, SRecordInstance instance, java.lang.Object[] keyMetaValues)
where
are SSArrayLists of SFieldMetas. Returns
SQL statement as a string.protected void whereSQL(java.lang.StringBuffer ret, java.util.ArrayList<SFieldScalar> where, SRecordInstance instance, java.lang.Object[] keyMetaValues)
protected SDriver.OffsetStrategy getOffsetStrategy()
protected long generateKeySelectMax(SRecordMeta rec, SFieldScalar keyFld)
## (There is scope to optimize this at some point so that one JDBC call can both generate the sequence number and insert a new record. But that means that the new record's key is not available until insert time which causes problems for foreign keys. Alternatively one can get batches of 10 (say) sequences at a time and then use an internal counter, but this will leave big holes in the sequence. Defer this to version 1.)
protected long generateKeySequence(SRecordMeta<?> rec, SFieldScalar keyFld)
public boolean supportsKeySequences()
protected java.lang.String createSequenceDDL(java.lang.String name)
protected java.lang.String dropSequenceDDL(java.lang.String name)
public void dropTableNoError(java.lang.String table)
public SSessionJdbc getSession()
public SLog getLogger()