ODBCThread
ODBCThread — configures the multi-threaded ODBC interface.
Synopsis
class ODBCThread
{
Commands; // Internal variable
Callbacks; // Internal variable
OnExecuteStored; // callback
OnConnectionSucceeded; // callback
OnConnectionFailed; // callback
OnFileSystemError; // callback
OnODBCError; // callback
NCached; // Internal variable
NUncached; // Internal variable
NStoredPrimary; // Number of transactions written to level 1 cache
NStoredSecondary; // Number of transactions written to level 2 cache
NForwarded; // Number of transactions read from cache
NStoreFailPrimary; // Number of failures while writing to level 1 cache
NStoreFailSecondary; // Number of failures while writing to level 1 cache
NForwardFail; // Number of failures while writing to the database from cache
NCommands; // Number of commands ever queued to thread
NResults; // Number of commands results ever returned from thread
NRejected; // Number of commands that were rejected without queueing
ReconnectSecs; // Number of seconds to wait between database reconnection attempts
ForwardDelay; // Delay in milliseconds between transactions written from cache to database
MaxTransactions; // Maximum number of transactions to hold on queue
}
Description
![[Note]](images/note.gif) | As of this writing, the ForwardDelay member is not implemented. |
The script developer should only modify the following members:
| OnExecuteStored |
| OnConnectionSucceeded |
| OnConnectionFailed |
| OnFileSystemError |
| OnODBCError |
| ReconnectSecs |
| ForwardDelay |
| MaxTransactions |
Methods
- ODBCThread.CacheIsEmpty()
- returns non-nil if both the level 1 and level 2 cache files are
empty.
- ODBCThread.Columns
(catalog,
schema,
tablename,
columnname,
callback)
- queries the database table for its column
definitions. The catalog,
schema, tablename
and columnname are all strings. Some of
these may accept wildcard patterns depending on the database being
used. When the call completes, the callback code will be
executed. The result is available in the SQLResult for the
duration of the callback.
- ODBCThread.Configure (DSN, username, password, flags, storagefile, maxfilesize)
sets the initial configuration for the database
connection. The flags parameter can be
either 0 or
STORE_AND_FORWARD. If
STORE_AND_FORWARD is not specified then no
command on this connection will be stored, even if the individual
command specifies the STORE_AND_FORWARD flag.
The storagefile parameter specifies the
name of a file to store the level 1 cache information for store
and forward operation. The level 2 cache file name will be
created from this file name.
The
maxfilesize specifies the maximum number of
bytes that a cache file can grow to. There can in fact be 3 cache
files, each of this size, at any one time. The
maxfilesize may be exceeded by the length
of a single transaction for any file. If you set
maxfilesize to 0, then
2.1 GB will be used. If the size exceeds this amount then it will
be truncated to 2.1 GB. You may wish to intentionally limit the
file size to a lower number. In a system where the data rate is
always too high for the database to handle, a smaller cache file
size will cause the ODBCThread to go
through periods where its data is discarded while the cache file is
caught up. A smaller file will make this discard/catch-up cycle
faster.
Flags can be any combination of:
- STORE_AND_FORWARD - If
this flag is not set, then no file storage will take place. Any
transactions that cannot be written to the thread immediately will
be rejected. Any transactions in the queue that cannot be
delivered to the database will be discarded.
- NO_STORE_TO_SECONDARY -
This tells the ODBCThread to only use the
level 1 cache. If the queue between the script and the database
thread becomes full, further transactions will be rejected until
there is space in the queue. However, any transactions in the
queue that cannot be delivered to the database will be stored in
level 1 cache.
- STORE_ALWAYS - This
flag tells the ODBCThread to always store a
transaction do disk before sending it to the database. This will
normally cause the thread to read its queue faster, and write the
transactions to disk more frequently. In case of a system crash,
those transactions are more likely to be recoverable when the
script re-starts. This option imposes a speed penalty if the disk
is slow. On systems with fast disks, this penalty is normally
minimal.
- ALLOW_CACHE_RESTART -
In case of a system or application crash, the
ODBCThread will resume reading any disk
files at the point where it left off when the application
restarts. This flag tells the ODBCThread
not to track its position in the disk file, and to restart at the
beginning of the file during a crash recovery. This improves
speed on systems with a slow disk, but means that some
transactions may be sent to the database more than once. This
should only be used if disk access is slow.
NO_FLUSH_ON_WRITE - The
ODBCThread normally tries to update files
as soon as possible after a write to disk. This is not efficient,
but it improves the chance that more transactions will be
recoverable in the case of a system or application crash.
Specifying this flag will cause the
ODBCThread to store data in memory longer
and write to disk in larger blocks. This may improve performance
for systems with a slow file system, but it increases the chance
that transactions will be lost if the system crashes or shuts
down.
We recommend using either:
STORE_AND_FORWARD
or
STORE_AND_FORWARD | STORE_ALWAYS
unless the impact of disk access is
unacceptably high on the system.
- ODBCThread.Connect ()
- forces a connection attempt, even if the thread
connection timer has not expired.
- ODBCThread.DataSources (type)
lists all data sources (DSNs). The type
parameter can be one of:
- SQL_FETCH_FIRST -
retrieve all DSNs.
- SQL_FETCH_FIRST_USER -
retrieve only user DSNs.
- SQL_FETCH_FIRST_SYSTEM
- retrieve only system DSNs.
The return value is an array of lists of the form:
("dsn_name" . "dsn_driver")
- ODBCThread.Disconnect ()
- forces the thread to disconnect from the database. If
the thread is not paused then it will attempt to reconnect to the
database on the next reconnect timer cycle.
- ODBCThread.ExecDirect (flags, sql, callback)
- executes an SQL statement on the database. Flags
can be either 0 or
STORE_AND_FORWARD. If the command cannot be
executed immediately, and STORE_AND_FORWARD
is set, and STORE_AND_FORWARD is also set on
the thread, then the command will be stored to file and executed
later. The SQL statement is a string. When the statement is
executed, the callback will be called. The result is available in
the SQLResult for the duration of the callback.
- ODBCThread.GetFlags ()
- retrieves the flags set by the
.Configure method.
- ODBCThread.GetMessageCount ()
- retrieves the number of messages currently queued to the
database thread.
- ODBCThread.GetResultCount ()
- retrieves the number of results currently queued from the
database thread to the script thread.
- ODBCThread.Insert (row, callback)
- performs a database INSERT
given an instance of a class that has been mapped to a column set
in the database. The row must be an instance of a class returned
from .ClassFromResultSet,
.ClassFromTable, or
.ClassFromThreadResult. When the
insertion is complete, the callback is executed.
- ODBCThread.QueueIsFull ()
- returns non-nil if the message queue is full.
- ODBCThread.IsPaused ()
- returns non-nil if the thread is paused. See the information in
ODBCThread.Pause().
- ODBCThread.NoOp (callback)
- sends a message to the database thread, and do nothing. When the
message has arrived at the database thread, the method returns and runs the
callback. This is a mechanism to synchronize execution in the
script with actions that are queued on the database thread.
- ODBCThread.Pause ()
- pauses the thread. A paused thread will continue to
store data to disk to be forwarded later, but it will not perform
transactions on the database. If the database is disconnected and
paused, the thread will not attempt to reconnect until the thread
is resumed.
- ODBCThread.PrimaryKeys (catalog, schema, tablename, callback)
- queries the database for the primary keys for
the given catalog,
schema and
tablename. The result is available in the
SQLResult when the callback is executed.
- ODBCThread.QuoteConversion (head, tail, character, replacement)
- is used internally.
- ODBCThread.Resume ()
- resumes a thread that has been previously paused
by .Pause().
- ODBCThread.SlowInsert (row, callback)
- is an alternate (slower) method to insert data. It acts
the same as the .Insert method, except
that it recomputes the SQL statement on each insert. The
.Insert method computes the SQL statement
ahead of time.
- ODBCThread.SlowUpdate (row, callback)
- is an alternate (slower) method to update data. It acts
the same as the .Update method, except
that it recomputes the SQL statement on each update. The
.Update method computes the SQL statement
ahead of time.
- ODBCThread.Start ()
- starts the thread and begins attempting to connect.
- ODBCThread.Stop ()
- closes the connection to the database and stops the thread.
- ODBCThread.Tables (catalog, schema, tablename, tabletype, callback)
- queries the database for all tables matching the
catalog, schema,
tablename and
tabletype. It calls the
callback when the transaction completes.
Specifying an empty string ("") for any
argument indicates no preference. The tabletype must be one of
"TABLE", "VIEW" or
"TABLE,VIEW". The result of this call is
available in ODBCResult.
- ODBCThread.Update (row, callback)
- performs a database
UPDATE given an instance of a class that
has been mapped to a column set in the database. The row must be
an instance of a class returned from
.ClassFromResultSet,
.ClassFromTable or
.ClassFromThreadResult. When the update
is complete, the callback is executed. The result of this call is
available in ODBCResult.
- ODBCThread.ValueString (value)
- is used internally.
- ODBCThread.AddInitStage (sqlString, onSuccess, onFailure)
- adds an initialization stage to the sequential set of steps to be
executed as part of the initialization after the database
connections is made. See the section Configure Startup
Actions above. The return value from this function is an index
that can be given to .BeginAsyncInit.
- ODBCThread.BeginAsyncInit (stage?=0)
- starts executing the initialization stages in the order
in which they were specified. If the stage argument is non-zero,
being executing from that index in set. This index is provided as
the return value from
.AddInitStage.
- ODBCThread.cbInitStage ()
- is a provided callback that can be used to trigger the next
initialization stage in the initialization sequence. If the stage
specifies user-defined code instead of a string for the sqlString
argument of .AddInitStage, that code must at some point call
.cbInitStage in order for the sequence to continue.
- ODBCThread.ClassFromResultSet (columnresult, keyresult, superclass?=nil, symclassname?=#UnboundODBCThreadTableClass)
- creates a class from the table defined in the given
result sets. The columnresult is the
column definition for the table, and the
keyresult is the result from calling
.PrimaryKeys on the table, or the result
from querying the table through the
.Tables method. If the
superclass is non-nil, the class will be
derived from superclass, otherwise it will
have no parent class. If symclassname is
provided, that class name will be used instead of the default
UnboundODBCThreadTableClass.
The class produced by this call maps each column in the
columnresult to a member variable in the
class. In addition, information about the primary key and the
source table is held in the class. Instances of this class are
suitable for use with the .Insert method.
If the table has a primary key, then instances of this class can
also be used in the .Update method.
- ODBCThread.ClassFromTable (tablename, tables, superclass?=nil, symclassname?=#UnboundODBCThreadTableClass)
- creates a class from the table named
tablename from the table set defined in
tables. The tables
argument is the value of SQLTables from a call
to the .GetTableInfo method. See the
discussion in .ClassFromResultSet for
more information.
- ODBCThread.ClassFromThreadResult (threadresult, superclass?=nil, symclassname?=#UnboundODBCThreadTableClass)
- creates a class from an ODBCThreadResult
instance. This instance is usually obtained from a call to
.GetTableInfo or
.Columns. See the discussion in
.ClassFromResultSet for more information.
- ODBCThread.constructor ()
- is the constructor for this class. Do not override the
constructor for ODBCThread in your own
code. Instead, derive a new class from
ODBCThread and then define a constructor
for your derived class.
- ODBCThread.CreateClass (symclassname, superclass, ivars, tablename, primary_key)
- is the low-level call made from
.ClassFromResultSet,
.ClassFromTable and
.ClassFromThreadResult. It constructs
the necessary code to define a class that maps its member
variables to columns in a result set.
- ODBCThread.EvalSafe (code)
- is used internally.
- ODBCThread.GetDataSources (direction?=SQL_FETCH_FIRST)
queries the ODBC subsystem for the names of all DSNs. The type
parameter can be one of:
- SQL_FETCH_FIRST - retrieve all DSNs.
- SQL_FETCH_FIRST_USER - retrieve only user DSNs.
- SQL_FETCH_FIRST_SYSTEM - retrieve only system DSNs.
The return value is an array of lists of the form:
("dsn_name" . "dsn_driver")
This method is the only method that calls synchronously
into the ODBC subsystem. The result is available as the
return value from this function. The ODBC definition states
that this call will be entirely satisfied by the driver
manager, and so cannot block on the database. The database
does not need to be connected, and the database thread does
not have to be started for this method to succeed.
- ODBCThread.GetInsertFormat (klass)
- constructs the SQL statement that will be issued when
the .Insert method is called. If you
change the definition of the table by calling
.SetClassKey, then you must also issue
.GetInsertFormat and
.GetUpdateFormat after
.SetClassKey completes.
- ODBCThread.GetTableInfo (catalog, schema, tablename, tabletype, callback)
- produces a result that will be available in the special
variable SQLTables for the duration of the
callback. SQLTables is an array of arrays.
Each element of the result is an array of two elements containing
the table name and an instance of ODBCThreadResult
corresponding to a call to .Columns for
that table.
- ODBCThread.GetUpdateFormat (klass)
- constructs the SQL statement that will be issued when
the .Update method is called. If you
change the definition of the table by calling
.SetClassKey, then you must also issue
.GetInsertFormat and
.GetUpdateFormat after
.SetClassKey completes.
- ODBCThread.HandleColumnInfo (tablename, results, callback)
- is used internally.
- ODBCThread.HandleFinalInfo (results, callback)
- is used internally.
- ODBCThread.HandleTableInfo (results, callback)
- is used internally.
- ODBCThread.NextInitStage ()
- is used internally.
- ODBCThread.SetClassKey (klass, keysym, ignore_if_set?=t)
- sets the primary key for the class specified by
klass. The class is the result of a call
to .ClassFromResultSet,
.ClassFromTable and
.ClassFromThreadResult. Some databases
(MS-Access in particular) do not provide information about the
primary keys in a table. In order for
.Update calls to work on this type of
class, the .SetClassKey method must be
called to tell the table which column is its primary key.