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; } /* トランザクション終了 */ |
(1)自動コミットを無効に切替え
コネクションハンドルを割り当てたあと、ShunSetConnectAttr関数で自動コミットを無効に切り替えます。
ポイント
コネクション確立時は、自動コミットが有効になっていますので、切替えが必要です。
再度自動コミットを有効にしたい場合は、ShunSetConnectAttr関数で、SHUN_ATTR_AUTOCOMMITにSHUN_TRUEを設定します。
(2)コミットの実行
トランザクションを終了し、それまでの操作をShunsakuに反映したい場合は、ShunCommit関数を実行します。
(3)ロールバックの実行
エラーが発生したときなど、それまでの操作をShunsakuに反映しないでトランザクションをロールバックする場合は、ShunRollback関数を実行します。
参照
C APIの詳細については、“C APIリファレンス”を参照してください。