ページの先頭行へ戻る
Interstage Shunsaku Data Manager V9.0.6 アプリケーション開発ガイド
FUJITSU Software

5.4 C APIでトランザクションを使う

C APIを利用したアプリケーションの作成例を説明します。

XML文書の削除および更新を1トランザクションとして扱う例を以下に示します。


図5.4 XML文書の削除および更新を1トランザクションとして扱う例


記述例

/*以下のように用意されていることを仮定しています      */
/* query      :検索式                                */
/* returnQuery:リターン式                            */
/* updateData :更新データ                            */
/* pResultId  :レコードIDを保持する構造体配列        */
/* pDeleteId  :削除用レコードIDを設定する構造体配列  */
/* pUpdateId  :更新用レコードIDを設定する構造体配列  */

/* コネクションハンドルの割当て */
ret = ShunAllocHandle(NULL, &ConH);
if(ret != SHUN_SUCCESS) {
   error("ShunAllocHandle ", ConH);
   return;
}
/* ホスト名・ポート番号を指定してコネクションを確立 */
ret = ShunConnect(ConH, "DirSvr1", 23101, NULL);
if(ret != SHUN_SUCCESS) {
   error("ShunConnect ", ConH);
   return;
}
/* 検索用のデータ操作ハンドル割当て */
ret = ShunAllocHandle(ConH, &searchStmtH);
if(ret != SHUN_SUCCESS) {
   error("ShunAllocHandle ", ConH);
   return;
}
/* 検索を実行 */
ret = ShunSearch(searchStmtH, 1, NULL, 0, 30, query, returnQuery,
                 NULL, &Hit_Cnt, &Return_Cnt, &Returnable_Cnt,
                 &Rec_Id_Out, &Data, &First_Pos, &Last_Pos);
if(ret != SHUN_SUCCESS) {
   error("ShunSearch ", searchStmtH);
   return;
}
/* レコードIDを保持 */
for(i=0; i< Return_Cnt; i++) {
    pResultId[i] = Rec_Id_Out[i];
}

/* 検索用のデータ操作ハンドルの解放 */
ret = ShunFreeHandle(searchStmtH);
if(ret != SHUN_SUCCESS) {
   error("ShunFreeHandle ", searchStmtH);
   return;
}

/* 自動コミットを無効に切替え */
ret = ShunSetConnectAttr(ConH, SHUN_ATTR_AUTOCOMMIT, SHUN_FALSE);       (1)
if(ret != SHUN_SUCCESS) {
   error("ShunSetConnectAttr ", ConH);
   return;
}
/* 削除用のデータ操作ハンドル割当て */
ret = ShunAllocHandle(ConH, &deleteStmtH);
if(ret != SHUN_SUCCESS) {
   error("ShunAllocHandle ", ConH);
   return;
}
/* 3番目のデータを削除対象とする */
pDeleteId[0] = pResultId[2];
/* 削除を実行 */
ret = ShunDeleteRecId(deleteStmtH, 1, pDeleteId);
if(ret != SHUN_SUCCESS) {
   error("ShunDeleteRecId ", deleteStmtH);
   return;
}
/* 削除用のデータ操作ハンドルの解放 */
ret = ShunFreeHandle(deleteStmtH);
if(ret != SHUN_SUCCESS) {
   error("ShunFreeHandle ",deleteStmtH);
   return;
}
/* 更新用のデータ操作ハンドル割当て */
ret = ShunAllocHandle(ConH, &updateStmtH);
if(ret != SHUN_SUCCESS) {
   error("ShunAllocHandle ", ConH);
   return;
}
/* 5番目のデータを更新対象とする */
pUpdateId[0] = pResultId[4];
/* データを更新 */
ret = ShunUpdateRecId(updateStmtH, 1, pUpdateId,updateData);
if(ret != SHUN_SUCCESS) {
  error("ShunUpdateRecId", updateStmtH);
  return;
}
/* 更新用のデータ操作ハンドルの解放 */
ret = ShunFreeHandle(updateStmtH);
if(ret != SHUN_SUCCESS) {
   error("ShunFreeHandle ", updateStmtH);
   return;
}
/*  トランザクション終了 */
ret = ShunCommit(ConH); (2)
if(ret != SHUN_SUCCESS) { error("ShunCommit ", ConH); return; } /* コネクションの切断*/ ret = ShunDisconnect(ConH); if(ret != SHUN_SUCCESS) { error("ShunDisconnect", ConH); return; } /* コネクションハンドルの解放 */ ret = ShunFreeHandle(ConH); if(ret != SHUN_SUCCESS) { error("ShunAllocHandle ", ConH); return; } /* エラー発生時の処理 */ void error(char* func, SHUNHANDLE handle) { printf( "%s:abnormal end\n", func ); ShunGetErrorMessage(handle, &Err_Level, &Err_Msg); printf("エラーレベル = %d\n", Err_Level); printf("エラーメッセージ = %s\n", Err_Msg); if(ConH != NULL) { ret = ShunRollback(ConH); (3) } ret = ShunFreeHandle(ConH); return; }

(1)自動コミットを無効に切替え

コネクションハンドルを割り当てたあと、ShunSetConnectAttr関数で自動コミットを無効に切り替えます。

ポイント

コネクション確立時は、自動コミットが有効になっていますので、切替えが必要です。
再度自動コミットを有効にしたい場合は、ShunSetConnectAttr関数で、SHUN_ATTR_AUTOCOMMITにSHUN_TRUEを設定します。


(2)コミットの実行

トランザクションを終了し、それまでの操作をShunsakuに反映したい場合は、ShunCommit関数を実行します。


(3)ロールバックの実行

エラーが発生したときなど、それまでの操作をShunsakuに反映しないでトランザクションをロールバックする場合は、ShunRollback関数を実行します。

参照

C APIの詳細については、“C APIリファレンス”を参照してください。