Interface IDBInterface
-
- All Known Implementing Classes:
DBInterfaceHSQLDB,DBInterfaceMariaDB,DBInterfaceMySQL,DBInterfacePostgreSQL
public interface IDBInterfaceThe purpose of this interface is to provide abstracted database table modification primitives, as well as general access primitives. It is expected that the generalized database layer will provide the underlying services. This layer should provide services roughly equivalent to the former DBInterface bean, but be callable in a pure Java fashion. It is furthermore intended that all abstraction database requests go through this layer. It will therefore, over time, provide grander and grander levels of database query abstraction. Also note that the database parameters will be passed to the factory for this class, not to the individual methods.
-
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String_rcsidstatic intTRANSACTION_ENCLOSINGstatic intTRANSACTION_READCOMMITTEDstatic intTRANSACTION_REPEATABLEREADstatic intTRANSACTION_SERIALIZED
-
Method Summary
All Methods Instance Methods Abstract Methods Modifier and Type Method Description voidaddTableIndex(java.lang.String tableName, boolean unique, java.util.List<java.lang.String> columnList)Add an index to a table.voidanalyzeTable(java.lang.String tableName)Analyze a table.voidbeginTransaction()Begin a database transaction.voidbeginTransaction(int transactionType)Begin a database transaction.java.lang.StringbuildConjunctionClause(java.util.List outputParameters, ClauseDescription[] clauseDescriptions)voidcloseDatabase()Uninitialize.java.lang.StringconstructCountClause(java.lang.String column)Construct a count clause.java.lang.StringconstructDistinctOnClause(java.util.List outputParameters, java.lang.String baseQuery, java.util.List baseParameters, java.lang.String[] distinctFields, java.lang.String[] orderFields, boolean[] orderFieldsAscending, java.util.Map<java.lang.String,java.lang.String> otherFields)Construct a 'distinct on (x)' filter.java.lang.StringconstructDoubleCastClause(java.lang.String value)Construct a cast to a double value.java.lang.StringconstructIndexHintClause(java.lang.String tableName, IndexDescription description)Construct index hint clause.java.lang.StringconstructIndexOrderByClause(java.lang.String[] fieldNames, boolean direction)Construct ORDER-BY clause meant for reading from an index.java.lang.StringconstructOffsetLimitClause(int offset, int limit)Construct an offset/limit clause.java.lang.StringconstructOffsetLimitClause(int offset, int limit, boolean afterOrderBy)Construct an offset/limit clause.java.lang.StringconstructRegexpClause(java.lang.String column, java.lang.String regularExpression, boolean caseInsensitive)Construct a regular-expression match clause.java.lang.StringconstructSubstringClause(java.lang.String column, java.lang.String regularExpression, boolean caseInsensitive)Construct a regular-expression substring clause.voidcreateUserAndDatabase(java.lang.String adminUserName, java.lang.String adminPassword, StringSet invalidateKeys)Create user and database.voiddropUserAndDatabase(java.lang.String adminUserName, java.lang.String adminPassword, StringSet invalidateKeys)Drop user and database.voidendTransaction()End a database transaction, either performing a commit or a rollback or nothing (depending on whether signalRollback() was called within the transaction or performCommit() or none of the above).intfindConjunctionClauseMax(ClauseDescription[] otherClauseDescriptions)StringSetgetAllTables(StringSet cacheKeys, java.lang.String queryClass)Get a database's tables.java.lang.StringgetDatabaseCacheKey()Get the database general cache key.java.lang.StringgetDatabaseName()Get the database name.intgetMaxInClause()Obtain the maximum number of individual items that should be present in an IN clause.intgetMaxOrClause()Obtain the maximum number of individual clauses that should be present in a sequence of OR clauses.longgetSleepAmt()Get a random time, in milliseconds, for backoff from deadlock.java.util.Map<java.lang.String,IndexDescription>getTableIndexes(java.lang.String tableName, StringSet cacheKeys, java.lang.String queryClass)Get a table's indexes.java.util.Map<java.lang.String,ColumnDescription>getTableSchema(java.lang.String tableName, StringSet cacheKeys, java.lang.String queryClass)Get a table's schema.java.lang.StringgetTransactionID()Get the current transaction id.intgetWindowedReportMaxRows()For windowed report queries, e.g.voidnoteModifications(java.lang.String tableName, int insertCount, int modifyCount, int deleteCount)Note a number of inserts, modifications, or deletions to a specific table.voidopenDatabase()Initialize.voidperformAddIndex(java.lang.String indexName, java.lang.String tableName, IndexDescription description)Add an index to a table.voidperformAlter(java.lang.String tableName, java.util.Map<java.lang.String,ColumnDescription> columnMap, java.util.Map<java.lang.String,ColumnDescription> columnModifyMap, java.util.List<java.lang.String> columnDeleteList, StringSet invalidateKeys)Perform a table alter operation.voidperformCommit()Perform the transaction commit.voidperformCreate(java.lang.String tableName, java.util.Map<java.lang.String,ColumnDescription> columnMap, StringSet invalidateKeys)Perform a table creation operation.voidperformDelete(java.lang.String tableName, java.lang.String whereClause, java.util.List whereParameters, StringSet invalidateKeys)Perform a delete operation.voidperformDrop(java.lang.String tableName, StringSet invalidateKeys)Perform a table drop operation.voidperformInsert(java.lang.String tableName, java.util.Map<java.lang.String,java.lang.Object> parameterMap, StringSet invalidateKeys)Perform an insert operation.voidperformModification(java.lang.String query, java.util.List params, StringSet invalidateKeys)Perform a general database modification query.IResultSetperformQuery(java.lang.String query, java.util.List params, StringSet cacheKeys, java.lang.String queryClass)Perform a general "data fetch" query.IResultSetperformQuery(java.lang.String query, java.util.List params, StringSet cacheKeys, java.lang.String queryClass, int maxResults, ILimitChecker returnLimit)Perform a general "data fetch" query.IResultSetperformQuery(java.lang.String query, java.util.List params, StringSet cacheKeys, java.lang.String queryClass, int maxResults, ResultSpecification resultSpec, ILimitChecker returnLimit)Perform a general "data fetch" query.voidperformRemoveIndex(java.lang.String indexName, java.lang.String tableName)Remove an index.voidperformUpdate(java.lang.String tableName, java.util.Map<java.lang.String,java.lang.Object> parameterMap, java.lang.String whereClause, java.util.List whereParameters, StringSet invalidateKeys)Perform an update operation.voidreindexTable(java.lang.String tableName)Reindex a table.voidsignalRollback()Signal that a rollback should occur on the next endTransaction().voidsleepFor(long time)Sleep for a specified time, as part of backoff from deadlock.
-
-
-
Field Detail
-
_rcsid
static final java.lang.String _rcsid
- See Also:
- Constant Field Values
-
TRANSACTION_ENCLOSING
static final int TRANSACTION_ENCLOSING
- See Also:
- Constant Field Values
-
TRANSACTION_READCOMMITTED
static final int TRANSACTION_READCOMMITTED
- See Also:
- Constant Field Values
-
TRANSACTION_SERIALIZED
static final int TRANSACTION_SERIALIZED
- See Also:
- Constant Field Values
-
TRANSACTION_REPEATABLEREAD
static final int TRANSACTION_REPEATABLEREAD
- See Also:
- Constant Field Values
-
-
Method Detail
-
openDatabase
void openDatabase() throws ManifoldCFExceptionInitialize. This method is called once per JVM instance, in order to set up database communication.- Throws:
ManifoldCFException
-
closeDatabase
void closeDatabase() throws ManifoldCFExceptionUninitialize. This method is called during JVM shutdown, in order to close all database communication.- Throws:
ManifoldCFException
-
getDatabaseName
java.lang.String getDatabaseName()
Get the database name.- Returns:
- the database name.
-
getTransactionID
java.lang.String getTransactionID()
Get the current transaction id.- Returns:
- the current transaction identifier, or null if no transaction.
-
getDatabaseCacheKey
java.lang.String getDatabaseCacheKey()
Get the database general cache key.- Returns:
- the general cache key for the database.
-
performInsert
void performInsert(java.lang.String tableName, java.util.Map<java.lang.String,java.lang.Object> parameterMap, StringSet invalidateKeys) throws ManifoldCFExceptionPerform an insert operation.- Parameters:
tableName- is the name of the table.invalidateKeys- are the cache keys that should be invalidated.parameterMap- is the map of column name/values to write.- Throws:
ManifoldCFException
-
performUpdate
void performUpdate(java.lang.String tableName, java.util.Map<java.lang.String,java.lang.Object> parameterMap, java.lang.String whereClause, java.util.List whereParameters, StringSet invalidateKeys) throws ManifoldCFExceptionPerform an update operation.- Parameters:
tableName- is the name of the table.invalidateKeys- are the cache keys that should be invalidated.parameterMap- is the map of column name/values to write.whereClause- is the where clause describing the match (including the WHERE), or null if none.whereParameters- are the parameters that come with the where clause, if any.- Throws:
ManifoldCFException
-
performDelete
void performDelete(java.lang.String tableName, java.lang.String whereClause, java.util.List whereParameters, StringSet invalidateKeys) throws ManifoldCFExceptionPerform a delete operation.- Parameters:
tableName- is the name of the table to delete from.invalidateKeys- are the cache keys that should be invalidated.whereClause- is the where clause describing the match (including the WHERE), or null if none.whereParameters- are the parameters that come with the where clause, if any.- Throws:
ManifoldCFException
-
performCreate
void performCreate(java.lang.String tableName, java.util.Map<java.lang.String,ColumnDescription> columnMap, StringSet invalidateKeys) throws ManifoldCFExceptionPerform a table creation operation.- Parameters:
tableName- is the name of the table to create.columnMap- is the map describing the columns and types. NOTE that these are abstract types, which will be mapped to the proper types for the actual database inside this layer. The types are ColumnDefinition objects.invalidateKeys- are the cache keys that should be invalidated, if any.- Throws:
ManifoldCFException
-
performAlter
void performAlter(java.lang.String tableName, java.util.Map<java.lang.String,ColumnDescription> columnMap, java.util.Map<java.lang.String,ColumnDescription> columnModifyMap, java.util.List<java.lang.String> columnDeleteList, StringSet invalidateKeys) throws ManifoldCFExceptionPerform a table alter operation.- Parameters:
tableName- is the name of the table to alter.columnMap- is the map describing the columns and types to add. These are in the same form as for performCreate.columnModifyMap- is the map describing the columns to be changed. The key is the existing column name, and the value is the new type of the column. Data will be copied from the old column to the new.columnDeleteList- is the list of column names to delete.invalidateKeys- are the cache keys that should be invalidated, if any.- Throws:
ManifoldCFException
-
addTableIndex
void addTableIndex(java.lang.String tableName, boolean unique, java.util.List<java.lang.String> columnList) throws ManifoldCFExceptionAdd an index to a table.- Parameters:
tableName- is the name of the table to add the index for.unique- is a boolean that if true describes a unique index.columnList- is the list of columns that need to be included in the index, in order.- Throws:
ManifoldCFException
-
performAddIndex
void performAddIndex(java.lang.String indexName, java.lang.String tableName, IndexDescription description) throws ManifoldCFExceptionAdd an index to a table.- Parameters:
tableName- is the name of the table to add the index for.indexName- is the optional name of the table index. If null, a name will be chosen automatically.description- is the index description.- Throws:
ManifoldCFException
-
performRemoveIndex
void performRemoveIndex(java.lang.String indexName, java.lang.String tableName) throws ManifoldCFExceptionRemove an index.- Parameters:
indexName- is the name of the index to remove.tableName- is the table the index belongs to.- Throws:
ManifoldCFException
-
analyzeTable
void analyzeTable(java.lang.String tableName) throws ManifoldCFExceptionAnalyze a table.- Parameters:
tableName- is the name of the table to analyze/calculate statistics for.- Throws:
ManifoldCFException
-
reindexTable
void reindexTable(java.lang.String tableName) throws ManifoldCFExceptionReindex a table.- Parameters:
tableName- is the name of the table to rebuild indexes for.- Throws:
ManifoldCFException
-
performDrop
void performDrop(java.lang.String tableName, StringSet invalidateKeys) throws ManifoldCFExceptionPerform a table drop operation.- Parameters:
tableName- is the name of the table to drop.invalidateKeys- are the cache keys that should be invalidated, if any.- Throws:
ManifoldCFException
-
createUserAndDatabase
void createUserAndDatabase(java.lang.String adminUserName, java.lang.String adminPassword, StringSet invalidateKeys) throws ManifoldCFExceptionCreate user and database.- Parameters:
adminUserName- is the admin user name.adminPassword- is the admin password.invalidateKeys- are the cache keys that should be invalidated, if any.- Throws:
ManifoldCFException
-
dropUserAndDatabase
void dropUserAndDatabase(java.lang.String adminUserName, java.lang.String adminPassword, StringSet invalidateKeys) throws ManifoldCFExceptionDrop user and database.- Parameters:
adminUserName- is the admin user name.adminPassword- is the admin password.invalidateKeys- are the cache keys that should be invalidated, if any.- Throws:
ManifoldCFException
-
getTableSchema
java.util.Map<java.lang.String,ColumnDescription> getTableSchema(java.lang.String tableName, StringSet cacheKeys, java.lang.String queryClass) throws ManifoldCFException
Get a table's schema.- Parameters:
tableName- is the name of the table.cacheKeys- are the keys against which to cache the query, or null.queryClass- is the name of the query class, or null.- Returns:
- a map of column names and ColumnDescription objects, describing the schema.
- Throws:
ManifoldCFException
-
getTableIndexes
java.util.Map<java.lang.String,IndexDescription> getTableIndexes(java.lang.String tableName, StringSet cacheKeys, java.lang.String queryClass) throws ManifoldCFException
Get a table's indexes.- Parameters:
tableName- is the name of the table.cacheKeys- are the keys against which to cache the query, or null.queryClass- is the name of the query class, or null.- Returns:
- a map of index names and IndexDescription objects, describing the indexes.
- Throws:
ManifoldCFException
-
getAllTables
StringSet getAllTables(StringSet cacheKeys, java.lang.String queryClass) throws ManifoldCFException
Get a database's tables.- Parameters:
cacheKeys- are the cache keys for the query, or null.queryClass- is the name of the query class, or null.- Returns:
- the set of tables.
- Throws:
ManifoldCFException
-
performModification
void performModification(java.lang.String query, java.util.List params, StringSet invalidateKeys) throws ManifoldCFExceptionPerform a general database modification query.- Parameters:
query- is the query string.params- are the parameterized values, if needed.invalidateKeys- are the cache keys to invalidate.- Throws:
ManifoldCFException
-
performQuery
IResultSet performQuery(java.lang.String query, java.util.List params, StringSet cacheKeys, java.lang.String queryClass) throws ManifoldCFException
Perform a general "data fetch" query.- Parameters:
query- is the query string.params- are the parameterized values, if needed.cacheKeys- are the cache keys, if needed (null if no cache desired).queryClass- is the LRU class name against which this query would be cached, or null if no LRU behavior desired.- Returns:
- a resultset.
- Throws:
ManifoldCFException
-
performQuery
IResultSet performQuery(java.lang.String query, java.util.List params, StringSet cacheKeys, java.lang.String queryClass, int maxResults, ILimitChecker returnLimit) throws ManifoldCFException
Perform a general "data fetch" query.- Parameters:
query- is the query string.params- are the parameterized values, if needed.cacheKeys- are the cache keys, if needed (null if no cache desired).queryClass- is the LRU class name against which this query would be cached, or null if no LRU behavior desired.maxResults- is the maximum number of results returned (-1 for all).returnLimit- is a description of how to limit the return result, or null if no limit.- Returns:
- a resultset.
- Throws:
ManifoldCFException
-
performQuery
IResultSet performQuery(java.lang.String query, java.util.List params, StringSet cacheKeys, java.lang.String queryClass, int maxResults, ResultSpecification resultSpec, ILimitChecker returnLimit) throws ManifoldCFException
Perform a general "data fetch" query.- Parameters:
query- is the query string.params- are the parameterized values, if needed.cacheKeys- are the cache keys, if needed (null if no cache desired).queryClass- is the LRU class name against which this query would be cached, or null if no LRU behavior desired.maxResults- is the maximum number of results returned (-1 for all).resultSpec- is a result specification, or null for the standard treatment.returnLimit- is a description of how to limit the return result, or null if no limit.- Returns:
- a resultset.
- Throws:
ManifoldCFException
-
constructIndexHintClause
java.lang.String constructIndexHintClause(java.lang.String tableName, IndexDescription description) throws ManifoldCFExceptionConstruct index hint clause. On most databases this returns an empty string, but on MySQL this returns a USE INDEX hint. It requires the name of an index.- Parameters:
tableName- is the table the index is from.description- is the description of an index, which is expected to exist.- Returns:
- the query chunk that should go between the table names and the WHERE clause.
- Throws:
ManifoldCFException
-
constructIndexOrderByClause
java.lang.String constructIndexOrderByClause(java.lang.String[] fieldNames, boolean direction)Construct ORDER-BY clause meant for reading from an index. Supply the field names belonging to the index, in order. Also supply a corresponding boolean array, where TRUE means "ASC", and FALSE means "DESC".- Parameters:
fieldNames- are the names of the fields in the index that is to be used.direction- is a boolean describing the sorting order of the first term.- Returns:
- a query chunk, including "ORDER BY" text, which is appropriate for at least ordering by the FIRST column supplied.
-
constructDoubleCastClause
java.lang.String constructDoubleCastClause(java.lang.String value)
Construct a cast to a double value. On most databases this cast needs to be explicit, but on some it is implicit (and cannot be in fact specified).- Parameters:
value- is the value to be cast.- Returns:
- the query chunk needed.
-
constructCountClause
java.lang.String constructCountClause(java.lang.String column)
Construct a count clause. On most databases this will be COUNT(col), but on some the count needs to be cast to a BIGINT, so CAST(COUNT(col) AS BIGINT) will be emitted instead.- Parameters:
column- is the column string to be counted.- Returns:
- the query chunk needed.
-
constructRegexpClause
java.lang.String constructRegexpClause(java.lang.String column, java.lang.String regularExpression, boolean caseInsensitive)Construct a regular-expression match clause. This method builds a regular-expression match expression.- Parameters:
column- is the column specifier string.regularExpression- is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.caseInsensitive- is true if the regular expression match is to be case insensitive.- Returns:
- the query chunk needed, not padded with spaces on either side.
-
constructSubstringClause
java.lang.String constructSubstringClause(java.lang.String column, java.lang.String regularExpression, boolean caseInsensitive)Construct a regular-expression substring clause. This method builds an expression that extracts a specified string section from a field, based on a regular expression.- Parameters:
column- is the column specifier string.regularExpression- is the properly-quoted regular expression string, or "?" if a parameterized value is to be used.caseInsensitive- is true if the regular expression match is to be case insensitive.- Returns:
- the expression chunk needed, not padded with spaces on either side.
-
constructOffsetLimitClause
java.lang.String constructOffsetLimitClause(int offset, int limit, boolean afterOrderBy)Construct an offset/limit clause. This method constructs an offset/limit clause in the proper manner for the database in question.- Parameters:
offset- is the starting offset number.limit- is the limit of result rows to return.afterOrderBy- is true if this offset/limit comes after an ORDER BY.- Returns:
- the proper clause, with no padding spaces on either side.
-
constructOffsetLimitClause
java.lang.String constructOffsetLimitClause(int offset, int limit)Construct an offset/limit clause. This method constructs an offset/limit clause in the proper manner for the database in question.- Parameters:
offset- is the starting offset number.limit- is the limit of result rows to return.- Returns:
- the proper clause, with no padding spaces on either side.
-
constructDistinctOnClause
java.lang.String constructDistinctOnClause(java.util.List outputParameters, java.lang.String baseQuery, java.util.List baseParameters, java.lang.String[] distinctFields, java.lang.String[] orderFields, boolean[] orderFieldsAscending, java.util.Map<java.lang.String,java.lang.String> otherFields)Construct a 'distinct on (x)' filter. This filter wraps a query and returns a new query whose results are similar to POSTGRESQL's DISTINCT-ON feature. Specifically, for each combination of the specified distinct fields in the result, only the first such row is included in the final result.- Parameters:
outputParameters- is a blank list into which to put parameters. Null may be used if the baseParameters parameter is null.baseQuery- is the base query, which is another SELECT statement, without parens, e.g. "SELECT ..."baseParameters- are the parameters corresponding to the baseQuery.distinctFields- are the fields to consider to be distinct. These should all be keys in otherFields below.orderFields- are the otherfield keys that determine the ordering.orderFieldsAscending- are true for orderFields that are ordered as ASC, false for DESC.otherFields- are the rest of the fields to return, keyed by the AS name, value being the base query column value, e.g. "value AS key"- Returns:
- a revised query that performs the necessary DISTINCT ON operation. The list outputParameters will also be appropriately filled in.
-
findConjunctionClauseMax
int findConjunctionClauseMax(ClauseDescription[] otherClauseDescriptions)
-
buildConjunctionClause
java.lang.String buildConjunctionClause(java.util.List outputParameters, ClauseDescription[] clauseDescriptions)
-
getMaxInClause
int getMaxInClause()
Obtain the maximum number of individual items that should be present in an IN clause. Exceeding this amount will potentially cause the query performance to drop.- Returns:
- the maximum number of IN clause members.
-
getMaxOrClause
int getMaxOrClause()
Obtain the maximum number of individual clauses that should be present in a sequence of OR clauses. Exceeding this amount will potentially cause the query performance to drop.- Returns:
- the maximum number of OR clause members.
-
getWindowedReportMaxRows
int getWindowedReportMaxRows()
For windowed report queries, e.g. maxActivity or maxBandwidth, obtain the maximum number of rows that can reasonably be expected to complete in an acceptable time.- Returns:
- the maximum number of rows.
-
beginTransaction
void beginTransaction() throws ManifoldCFExceptionBegin a database transaction. This method call MUST be paired with an endTransaction() call, or database handles will be lost. If the transaction should be rolled back, then signalRollback() should be called before the transaction is ended. It is strongly recommended that the code that uses transactions be structured so that a try block starts immediately after this method call. The body of the try block will contain all direct or indirect calls to executeQuery(). After this should be a catch for every exception type, including Error, which should call the signalRollback() method, and rethrow the exception. Then, after that a finally{} block which calls endTransaction(). (The kind of transaction started by this method is the current default transaction type, which is "read committed" if not otherwise determined).- Throws:
ManifoldCFException
-
beginTransaction
void beginTransaction(int transactionType) throws ManifoldCFExceptionBegin a database transaction. This method call MUST be paired with an endTransaction() call, or database handles will be lost. If the transaction should be rolled back, then signalRollback() should be called before the transaction is ended. It is strongly recommended that the code that uses transactions be structured so that a try block starts immediately after this method call. The body of the try block will contain all direct or indirect calls to executeQuery(). After this should be a catch for every exception type, including Error, which should call the signalRollback() method, and rethrow the exception. Then, after that a finally{} block which calls endTransaction().- Parameters:
transactionType- is the kind of transaction desired.- Throws:
ManifoldCFException
-
performCommit
void performCommit() throws ManifoldCFExceptionPerform the transaction commit. Calling this method does not relieve the coder of the responsibility of calling endTransaction(), as listed below. The purpose of a separate commit operation is to allow handling of situations where the commit generates a TRANSACTION_ABORT signal.- Throws:
ManifoldCFException
-
signalRollback
void signalRollback()
Signal that a rollback should occur on the next endTransaction().
-
endTransaction
void endTransaction() throws ManifoldCFExceptionEnd a database transaction, either performing a commit or a rollback or nothing (depending on whether signalRollback() was called within the transaction or performCommit() or none of the above).- Throws:
ManifoldCFException
-
noteModifications
void noteModifications(java.lang.String tableName, int insertCount, int modifyCount, int deleteCount) throws ManifoldCFExceptionNote a number of inserts, modifications, or deletions to a specific table. This is so we can decide when to do appropriate maintenance.- Parameters:
tableName- is the name of the table being modified.insertCount- is the number of inserts.modifyCount- is the number of updates.deleteCount- is the number of deletions.- Throws:
ManifoldCFException
-
getSleepAmt
long getSleepAmt()
Get a random time, in milliseconds, for backoff from deadlock.- Returns:
- the random time.
-
sleepFor
void sleepFor(long time) throws ManifoldCFExceptionSleep for a specified time, as part of backoff from deadlock.- Parameters:
time- is the amount to sleep.- Throws:
ManifoldCFException
-
-