Interstage Shunsaku Data Manager アプリケーション開発ガイド - Microsoft(R) Windows(R) 2000/ Microsoft(R) Windows Server(TM) 2003 - - UNIX共通 -
目次 索引 前ページ次ページ

第1部 アプリケーション開発の基本> 第5章 トランザクション機能

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

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

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

[図: 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", 33101, 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リファレンス”を参照してください。

下へ5.4.1 エラー発生時の対処

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2006