ステータス ベクタの解析の例
ステータス ベクタの解析 へ戻る
次の C の例は、ステータス ベクタのシンプルで少々強引な解析を示しています。コードは、エラーの状態を強制的におこします。エラー処理ブロックでは、ステータス ベクタ配列クラスタを、クラスタごとに解析し、各クラスタのコンテンツとその解析結果を出力します。
#include <ibase.h> . . . ISC_STATUS status_vector[20]; main() { int done, v; /* end of args?, index into vector */ int c, extra; /* cluster count, 3 long cluster flag */ static char *meaning[] = {"End of error information", "n InterBase error code"," string address"," string length", " numeric value"," system code"}; /* Assume database is connected and transaction started here. */ if (status_vector[0] == 1 && status_vector[1] > 0) error_exit(); . . . void error_exit(void) { done = v = 0; c = 1; while (!done) { extra = 0; printf("Cluster %d:\n", c); printf("Status vector %d: %ld: ", v, status_vector[v]); if (status_vector[v] != gds_arg_end) printf("Next long is a"); switch (status_vector[v++]) { case gds_arg_end: printf("%s\n", meaning[0]); done = 1; break; case gds_arg_gds: printf("%s\n", meaning[1]); break; case gds_arg_string: case gds_arg_interpreted: printf("%s\n", meaning[2]); break; case gds_arg_number: printf("%s\n", meaning[4]); break; case gds_arg_cstring: printf("%s\n", meaning[3]); extra = 1; break; default: printf("%s\n", meaning[5]); break; } if (!done) { printf("Status vector %d: %ld", v, status_vector[v]); v++; /* advance vector pointer */ c++; /* advance cluster count */ if (extra) { printf(": Next long is a %s\n", meaning[2]); printf("Status vector: %d: %ld\n\n", v, status_vector[v]); v++; } else printf("\n\n"); } } isc_rollback_transaction(status_vector, &trans); isc_detach_database(&db1); return(1); }
このプログラムの出力サンプルです:
Cluster 1: Status vector 0: 1: Next long is an InterBase error code Status vector 1: 335544342 Cluster 2: Status vector 2: 4: Next long is a numeric value Status vector 3: 1 Cluster 3: Status vector 4: 1: Next long is an InterBase error code Status vector 5: 335544382 Cluster 4: Status vector 6: 2: Next long is a string address Status vector 7: 156740 Cluster 5: Status vector 8: 0: End of error information
この出力は、2 つの InterBase エラーが発生していることを示しています。最初のエラー コードは 335544342 です。エラー出力ルーチン、isc_print_status()
と isc_interprete()
は、InterBase エラー コードを使用して、対応する基本エラー メッセージを取得します。基本エラー メッセージには、置き換え可能なパラメータのためのプレースホルダが含まれています。エラー コード 335544342 の場合、基本エラー メッセージ文字列は:
"action cancelled by trigger (%ld) to preserve data integrity"
このエラー メッセージは、置き換え可能な数値パラメータ、 %ld
を使用します。
この場合、置き換えに使用する数値、1 は、2番目のクラスタの2番目の lonb に格納されます。エラー出力ルーチンは、パラメータをメッセージに入れた後、メッセージを表示します:
action cancelled by trigger (1) to preserve data integrity
2番目のエラー コードは 335544382 です。このエラー コードに対して取得される基本メッセージは:
"%s"
この場合、表示されるメッセージ全体は、置き換え可能な文字列から構成されます。4番目のクラスタの 2 番目の long には、置き換え可能な文字列のアドレス、156740 が格納されています。これは、エラーを起こしたトリガで定義されているエラー メッセージです。エラー出力ルーチンは、トリガからメッセージを、基本メッセージに入れたら、その結果をメッセージを表示します:
-Department name is missing.
- メモ: このサンプル プログラムは、ステータス ベクタの構造とその内容を示す意図のためにのみ作成されています。このプログラムのエラー処理ルーチンは、開発時にプログラムの限定的なデバッグ ツールとなりえるかもしれませんが、エンド ユーザーに有益な情報は提供しません。通常、アプリケーションのエラー処理ブロックは、エラーを解釈し、説明的なエラー メッセージを表示し、適宜、それを正すためのアクションを取ります。
たとえば、サンプル プログラムのエラー処理ルーチンが、これらのコードに関連づけられたエラー メッセージを表示するために isc_print_status()
を呼び出した場合、次のメッセージが表示されます:
action cancelled by trigger (1) to preserve data integrity -Department name is missing.