SQL Anywhere ODBC ドライバーは、拡張された一部の接続属性をサポートしています。
SA_REGISTER_MESSAGE_CALLBACK メッセージは、SQL MESSAGE 文を使用してクライアントアプリケーションからデータベースサーバーに送信できます。実行時間が長いデータベースサーバー文によってメッセージも生成できます。
メッセージハンドラールーチンを作成して、これらのメッセージを捕捉できます。メッセージハンドラーのコールバックプロトタイプを次に示します。
void SQL_CALLBACK message_handler( SQLHDBC sqlany_dbc, unsigned char msg_type, long code, unsigned short length, char * message );
msg_type に指定できる次の値は、sqldef.h で定義されています。
MESSAGE_TYPE_INFO メッセージタイプは INFO でした。
MESSAGE_TYPE_WARNING メッセージタイプは WARNING でした。
MESSAGE_TYPE_ACTION メッセージタイプは ACTION でした。
MESSAGE_TYPE_STATUS メッセージタイプは STATUS でした。
MESSAGE_TYPE_PROGRESS メッセージタイプは PROGRESS でした。このタイプのメッセージは、BACKUP DATABASE や LOAD TABLE などの実行時間が長いデータベースサーバー文によって生成されます。
メッセージに関連付けられている SQLCODE を code に指定することができます。指定がない場合、code パラメーターの値は 0 です。
メッセージの長さは length に記述されています。
メッセージへのポインターは message に記述されています。message が NULL で終了されていないことに注意してください。この問題を処理するようにアプリケーションを設計する必要があります。次はその例です。
memcpy( mybuff, msg, len ); mybuff[ len ] = '\0'; |
メッセージハンドラーを ODBC に登録するには、次のようにして SQLSetConnectAttr 関数を呼び出します。
rc = SQLSetConnectAttr( hdbc, SA_REGISTER_MESSAGE_CALLBACK, (SQLPOINTER) &message_handler, SQL_IS_POINTER ); |
メッセージハンドラーの登録を ODBC から解除するには、次のようにして SQLSetConnectAttr 関数を呼び出します。
rc = SQLSetConnectAttr( hdbc, SA_REGISTER_MESSAGE_CALLBACK, NULL, SQL_IS_POINTER ); |
SA_GET_MESSAGE_CALLBACK_PARM メッセージハンドラーのコールバックルーチンに渡される SQLHDBC 接続ハンドルの値を取得するには、SA_GET_MESSAGE_CALLBACK_PARM パラメーターを指定して SQLGetConnectAttr 関数を呼び出します。
SQLHDBC callback_hdbc = NULL; rc = SQLGetConnectAttr( hdbc, SA_GET_MESSAGE_CALLBACK_PARM, (SQLPOINTER) &callback_hdbc, 0, 0 ); |
戻り値は、メッセージハンドラーのコールバックルーチンに渡されるパラメーター値と同じです。
SA_REGISTER_VALIDATE_FILE_TRANSFER_CALLBACK これは、ファイル転送の検証コールバック関数を登録するために使用します。転送を許可する前に、ODBC ドライバーは検証コールバックが存在する場合は、それを呼び出します。ストアドプロシージャーからなどの間接文の実行中にクライアントのデータ転送が要求された場合、ODBC ドライバーはクライアントアプリケーションで検証コールバックが登録されていないかぎり転送を許可しません。どのような状況で検証の呼び出しが行われるかについては、以下でより詳しく説明します。
コールバックプロトタイプを次に示します。
int SQL_CALLBACK file_transfer_callback( void * sqlca, char * file_name, int is_write );
file_name パラメーターは、読み込みまたは書き込み対象のファイルの名前です。is_write パラメーターは、読み込み (クライアントからサーバーへの転送) が要求された場合は 0、書き込みが要求された場合は 0 以外の値になります。ファイル転送が許可されない場合、コールバック関数は 0 を返します。それ以外の場合は 0 以外の値を返します。
データのセキュリティ上、サーバーはファイル転送を要求している文の実行元を追跡します。サーバーは、文がクライアントアプリケーションから直接受信されたものかどうかを判断します。クライアントからデータ転送を開始する際に、サーバーは文の実行元に関する情報をクライアントソフトウェアに送信します。クライアント側では、クライアントアプリケーションから直接送信された文を実行するためにデータ転送が要求されている場合にかぎり、ODBC ドライバーはデータの転送を無条件で許可します。それ以外の場合は、上述の検証コールバックがアプリケーションで登録されていることが必要です。登録されていない場合、転送は拒否されて文が失敗し、エラーが発生します。データベース内に既存しているストアドプロシージャーがクライアントの文で呼び出された場合、ストアドプロシージャーそのものの実行はクライアントの文で開始されたものと見なされません。ただし、クライアントアプリケーションでテンポラリストアドプロシージャーを明示的に作成してストアドプロシージャーを実行した場合、そのプロシージャーはクライアントによって開始されたものとしてサーバーは処理します。同様に、クライアントアプリケーションでバッチ文を実行する場合も、バッチ文はクライアントアプリケーションによって直接実行されるものと見なされます。
SA_SQL_ATTR_TXN_ISOLATION これは、拡張されたトランザクションの独立性レベルを設定するために使用します。次の例は、Snapshot 独立性レベルを設定します。
SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc ); SQLSetConnectAttr( dbc, SA_SQL_ATTR_TXN_ISOLATION, SA_SQL_TXN_SNAPSHOT, SQL_IS_UINTEGER ); |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |