Class AbstractJDBCDatabaseInterface
- All Implemented Interfaces:
DatabaseInterface
- Direct Known Subclasses:
JDBCDatabaseInterface
This receives database commands from the JDBC layer and dispatches the queries to the database system. It also manages ResultSet maps for query results.
This implementation does not handle authentication (login) / construction of the DatabaseConnection object, or disposing of the connection.
This implementation ignores the AUTO-COMMIT flag when a query is executed. To implement AUTO-COMMIT, you should 'commit' after a command is executed.
SYNCHRONIZATION: This interface is NOT thread-safe. To make a thread-safe implementation use the LockingMechanism.
See JDBCDatabaseInterface for a standard server-side implementation of this class.
- Author:
- Tobias Downer
-
Constructor Summary
ConstructorsConstructorDescriptionAbstractJDBCDatabaseInterface
(Database database) Sets up the database interface. -
Method Summary
Modifier and TypeMethodDescriptionprotected final void
Checks if the interface is disposed, and if it is generates a friendly SQLException informing the user of this.protected final void
Clears the contents of the result set map.final DebugLogger
Debug()
Returns a DebugLogger object that can be used to log debug messages against.void
disposeResult
(int result_id) Disposes of a result of a query on the server.void
disposeStreamableObject
(int result_id, long streamable_object_id) Disposes a streamable object channel with the given identifier.Executes the query and returns a QueryResponse object that describes the result of the query.void
finalize()
Clean up if this object is GC'd.protected final Database
Returns the Database that is the context of this interface.protected final DatabaseConnection
Returns the DatabaseConnection objcet for this connection.getResultPart
(int result_id, int row_number, int row_count) Returns a part of a result set.getStreamableObjectPart
(int result_id, long streamable_object_id, long offset, int len) Returns a section of a large binary or character stream in a result set.protected final User
getUser()
Returns the User object for this connection.protected final SQLException
handleExecuteThrowable
(Throwable e, SQLQuery query) Wraps a Throwable thrown by the execution of a query in DatabaseConnection with an SQLException and puts the appropriate error messages to the debug log.protected final void
init
(User user, DatabaseConnection connection) Initializes this database interface with a User and DatabaseConnection object.protected final void
Disposes all resources associated with this object.void
pushStreamableObjectPart
(byte type, long object_id, long object_length, byte[] buf, long offset, int length) Pushes a part of a streamable object from the client onto the server.Methods inherited from class java.lang.Object
clone, equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface com.mckoi.database.jdbc.DatabaseInterface
dispose, login
-
Constructor Details
-
AbstractJDBCDatabaseInterface
Sets up the database interface.
-
-
Method Details
-
init
Initializes this database interface with a User and DatabaseConnection object. This would typically be called from inside an authentication method, or from 'login'. This must be set before the object can be used. -
getDatabase
Returns the Database that is the context of this interface. -
getUser
Returns the User object for this connection. -
Debug
Returns a DebugLogger object that can be used to log debug messages against. -
getDatabaseConnection
Returns the DatabaseConnection objcet for this connection. -
clearResultSetMap
protected final void clearResultSetMap()Clears the contents of the result set map. This removes all result_id ResultSetInfo maps. -
handleExecuteThrowable
Wraps a Throwable thrown by the execution of a query in DatabaseConnection with an SQLException and puts the appropriate error messages to the debug log. -
internalDispose
protected final void internalDispose()Disposes all resources associated with this object. This clears the ResultSet map, and NULLs all references to help the garbage collector. This method would normally be called from implementations of the 'dispose' method. -
checkNotDisposed
Checks if the interface is disposed, and if it is generates a friendly SQLException informing the user of this.- Throws:
SQLException
-
pushStreamableObjectPart
public void pushStreamableObjectPart(byte type, long object_id, long object_length, byte[] buf, long offset, int length) throws SQLException Description copied from interface:DatabaseInterface
Pushes a part of a streamable object from the client onto the server. The server stores the large object for use with a future query. For example, a sequence of with a query with large objects may operate as follows;1) Push 100 MB object (id = 104) 2) execQuery with query that contains a streamable object with id 104
Note that the client may push any part of a streamable object onto the server, however the streamable object must have been completely pushed for the query to execute correctly. For example, an 100 MB byte array may be pushed onto the server in blocks of 64K (in 1,600 separate blocks).
- Specified by:
pushStreamableObjectPart
in interfaceDatabaseInterface
- Parameters:
type
- the StreamableObject type (1 = byte array, 2 = char array)object_id
- the identifier of the StreamableObject for future queries.object_length
- the total length of the StreamableObject.buf
- the byte[] array representing the block of information being sent.offset
- the offset into of the object of this block.length
- the length of the block being pushed.- Throws:
SQLException
-
execQuery
Description copied from interface:DatabaseInterface
Executes the query and returns a QueryResponse object that describes the result of the query. The QueryResponse object describes the number of rows, describes the columns, etc. This method will block until the query has completed. The QueryResponse can be used to obtain the 'result id' variable that is used in subsequent queries to the engine to retrieve the actual result of the query.- Specified by:
execQuery
in interfaceDatabaseInterface
- Throws:
SQLException
-
getResultPart
Description copied from interface:DatabaseInterface
Returns a part of a result set. The result set part is referenced via the 'result id' found in the QueryResponse. This is used to read parts of the query once it has been found via 'execQuery'.The returned List object contains the result requested.
If the result contains any StreamableObject objects, then the server allocates a channel to the object via the 'getStreamableObjectPart' and the identifier of the StreamableObject. The channel may only be disposed if the 'disposeStreamableObject' method is called.
- Specified by:
getResultPart
in interfaceDatabaseInterface
- Throws:
SQLException
-
disposeResult
Description copied from interface:DatabaseInterface
Disposes of a result of a query on the server. This frees up server side resources allocated to a query. This should be called when the ResultSet of a query closes. We should try and use this method as soon as possible because it frees locks on tables and allows deleted rows to be reclaimed.- Specified by:
disposeResult
in interfaceDatabaseInterface
- Throws:
SQLException
-
getStreamableObjectPart
public StreamableObjectPart getStreamableObjectPart(int result_id, long streamable_object_id, long offset, int len) throws SQLException Description copied from interface:DatabaseInterface
Returns a section of a large binary or character stream in a result set. This is used to stream large values over the connection. For example, if a row contained a multi megabyte object and the client is only interested in the first few characters and the last few characters of the stream. This would require only a few queries to the database and the multi- megabyte object would not need to be downloaded to the client in its entirety.- Specified by:
getStreamableObjectPart
in interfaceDatabaseInterface
- Throws:
SQLException
-
disposeStreamableObject
Description copied from interface:DatabaseInterface
Disposes a streamable object channel with the given identifier. This should be called to free any resources on the server associated with the object. It should be called as soon as possible because it frees locks on the tables and allows deleted rows to be reclaimed.- Specified by:
disposeStreamableObject
in interfaceDatabaseInterface
- Throws:
SQLException
-
finalize
Clean up if this object is GC'd.
-