XLAアプリケーションでトランザクション・ログの読取りを終了した後、監視中の表またはマテリアライズド・ビュー(あるいはその両方)をサブスクライブ解除し、コミットされていないトランザクションをロールバックし、すべてのハンドルを解放して、正常に終了する必要があります。プログラム終了時に、XLAブックマークを削除するかどうかは場合によります(「ブックマークの削除」を参照)。
リソースは、割当ての順序とは逆の順序で解放します。XLAによって追跡された表およびマテリアライズド・ビューの場合は、ttXlaTableStatus関数をコールし、newstatusパラメータを0(ゼロ)に設定します。これによって、表およびマテリアライズド・ビューがXLAからサブスクライブ解除されます。次に、 ttXlaClose をコールしてXLAハンドル(xla_handle)を解放します。
SQL_ROLLBACKを指定してSQLTransact関数をコールし、コミットされていないトランザクションをすべてロールバックします。次に、SQLDisconnectをコールしてTimesTenへの接続をクローズします。最後に、SQLFreeConnectおよびSQLFreeEnv関数をコールして、接続(hdbc)ハンドルおよび環境(henv)ハンドルを解放し、関連するすべてのメモリーを解放します。
たとえば、xlaSimple.c
デモのTerminateGracefully関数は、次のようになります。
void TerminateGracefully(int status)
{
SQLRETURN rc;
SQLINTEGER native_error ;
SQLINTEGER oldstatus;
SQLINTEGER newstatus = 0;
/* If the table has been subscribed to by XLA, unsubscribe it */
if (SYSTEM_TABLE_ID != 0) {
rc = ttXlaTableStatus(xla_handle, SYSTEM_TABLE_ID, 0,
&oldstatus, &newstatus);
if (rc != SQL_SUCCESS) {
/*「XLAエラーの処理」を参照 */
}
SYSTEM_TABLE_ID = 0;
}
/* Close the XLA connection. */
if (xla_handle != NULL) {
rc = ttXlaClose(xla_handle);
if (rc != SQL_SUCCESS) {
fprintf(stderr, "Error when disconnecting from XLA:<%d>",
rc);
}
xla_handle = NULL;
}
/* Disconnect from TimesTen entirely. */
if (hdbc != SQL_NULL_HDBC) {
rc = SQLTransact(henv, hdbc, SQL_ROLLBACK);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
/* 「XLAエラーの処理」を参照*/
}
rc = SQLDisconnect(hDbc);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
/* 「XLAエラーの処理」を参照*/
}
rc = SQLFreeConnect(hDbc);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
/* 「エラーのチェック」を参照*/
}
hdbc = SQL_NULL_HDBC;
}
if (henv != SQL_NULL_HENV) {
rc = SQLFreeEnv(henv);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
/* 「エラーのチェック」を参照*/
}
henv = SQL_NULL_HENV;
}
exit(status);
}