| Interstage Shunsaku Data Manager アプリケーション開発ガイド - Microsoft(R) Windows(R) 2000/ Microsoft(R) Windows Server(TM) 2003 - - UNIX共通 - |
目次
索引
![]()
|
| 第1部 アプリケーション開発の基本 | > 第5章 トランザクション機能 |
C APIを利用したアプリケーションの作成例を説明します。
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;
}
|
コネクションハンドルを割り当てたあと、ShunSetConnectAttr関数で自動コミットを無効に切り替えます。

コネクション確立時は、自動コミットが有効になっていますので、切替えが必要です。
再度自動コミットを有効にしたい場合は、ShunSetConnectAttr関数で、SHUN_ATTR_AUTOCOMMITにSHUN_TRUEを設定します。
トランザクションを終了し、それまでの操作をShunsakuに反映したい場合は、ShunCommit関数を実行します。
エラーが発生したときなど、それまでの操作をShunsakuに反映しないでトランザクションをロールバックする場合は、ShunRollback関数を実行します。

C APIの詳細については、“C APIリファレンス”を参照してください。
5.4.1 エラー発生時の対処
目次
索引
![]()
|