トランザクション機能およびShunsaku Fileを使用する場合のC APIの使用例を示します。
ここでは、“5.1 トランザクションの概要”で説明した大学の講義の履修登録を例に、C APIの使用例を示します。
以下にC APIを使用したプログラミング例を示します。
#include <stdio.h> #include <string.h> #include "libshun.h" /* トランザクション処理のサンプル */ int main() { /* ハンドル変数群 */ SHUNHCON connectionHandle; SHUNHSTMT statementHandle_search; SHUNHSTMT statementHandle_update; /* 作業用変数群 */ int status; /* 入力パラメータ群 */ char *hostName; int portNo; char *ShunFileName; int startNo; int returnRequestCount; char *queryForm; char *returnForm; char *sortForm; /* 出力パラメータ群*/ int hitCount; int returnCount; int returnableCount; SHUNRECID *recID; SHUNDATA *dataInfo; SHUNPOS *firstPosition, *lastPosition; /* 更新用データ群 */ SHUNRECID courseRecID[1]; SHUNDATA courseData[1]; SHUNRECID studentRecID[1]; SHUNDATA studentData[1]; /* エラー用変数群 */ SHUNHANDLE errorHandle; int errorLevel; char *errorMessage; /* 変数の初期化 */ connectionHandle = NULL; statementHandle_search = NULL; statementHandle_update = NULL; /* コネクションハンドルの割当て */ status = ShunAllocHandle( NULL, &connectionHandle ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)connectionHandle; goto ErrorEnd; } /* ホスト名・ポート番号、Shunsakuファイル名を指定してコネクションを確立 */ hostName = "DirSvr1"; portNo = 23101; ShunFileName = "shunsakuFile1"; status = ShunConnect( connectionHandle, hostName, portNo, ShunFileName ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)connectionHandle; goto ErrorEnd; } /* データ操作ハンドルの割当て */ status = ShunAllocHandle( connectionHandle, &statementHandle_search ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)connectionHandle; goto ErrorEnd; } /* 検索件数、検索式などの指定*/ startNo = 1; returnRequestCount = 10; queryForm = "/course/name == 'Business negotiation'"; returnForm = "/"; sortForm = NULL; /* API呼出し データ検索 コース情報の検索 */ status = ShunSearch( statementHandle_search, startNo, NULL, 0, returnRequestCount, queryForm, returnForm, sortForm, &hitCount, &returnCount, &returnableCount, &recID, &dataInfo, &firstPosition, &lastPosition ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)statementHandle_search; goto ErrorEnd; } if ( hitCount > 0 ) { /* 更新データの保存 */ courseRecID[0] = recID[0]; } else { printf( "コース情報がヒットしませんでした\n" ); goto ErrorEnd2; } /* 検索件数、検索式などの指定 */ startNo = 1; returnRequestCount = 10; queryForm = "/student/e-mail == 'mary\\.tompson@example\\.com'"; returnForm = "/"; sortForm = NULL; /* API呼出し データ検索 生徒情報の検索 */ status = ShunSearch( statementHandle_search, startNo, NULL, 0, returnRequestCount, queryForm, returnForm, sortForm, &hitCount, &returnCount, &returnableCount, &recID, &dataInfo, &firstPosition, &lastPosition ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)statementHandle_search; goto ErrorEnd; } if ( hitCount > 0 ) { /* 更新データの保存 */ studentRecID[0] = recID[0]; } else { printf( "生徒情報がヒットしませんでした\n" ); goto ErrorEnd2; } /* 自動コミットを無効に設定 */ status = ShunSetConnectAttr( connectionHandle, SHUN_ATTR_AUTOCOMMIT, SHUN_FALSE ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)connectionHandle; goto ErrorEnd; } /* データ操作ハンドルの割当て */ status = ShunAllocHandle( connectionHandle, &statementHandle_update ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)connectionHandle; goto ErrorEnd; } /* コース情報データの作成 */ courseData[0].Data = "<course>" " <name>Business negotiation</name>" " <instructor>" " <first-name>Max</first-name>" " <last-name>cameron</last-name>" " </instructor>" " <capacity>40</capacity>" " <current-auditors>31</current-auditors>" "</course>"; courseData[0].Data_Len = strlen( courseData[0].Data ); /* 情報を更新(学生を追加)して更新 */ status = ShunUpdateRecId( statementHandle_update, 1, courseRecID, courseData ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)statementHandle_update; goto ErrorEnd; } printf( "コース情報の更新終了\n" ); /* 学生データの作成 */ studentData[0].Data = "<student>" " <first-name>Mary</first-name>" " <last-name>Tompson</last-name>" " <e-mail>mary.tompson@example.com</e-mail>" " <course>Chinese language</course>" " <course>Business negotiation</course>" "</student>"; studentData[0].Data_Len = strlen( studentData[0].Data ); /* 学生の追加 */ status = ShunUpdateRecId( statementHandle_update, 1, studentRecID, studentData ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)statementHandle_update; goto ErrorEnd; } printf( "学生情報の更新終了\n" ); /* ここまでの更新をコミット */ status = ShunCommit( connectionHandle ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)connectionHandle; goto ErrorEnd; } /* データ操作ハンドルの解放 */ status = ShunFreeHandle( statementHandle_search ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)statementHandle_search; goto ErrorEnd; } /* データ操作ハンドルの解放 */ status = ShunFreeHandle( statementHandle_update ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)statementHandle_update; goto ErrorEnd; } /* コネクションの切断 */ status = ShunDisconnect( connectionHandle ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)connectionHandle; goto ErrorEnd; } /* コネクションハンドルの解放 */ status = ShunFreeHandle( connectionHandle ); if ( status != SHUN_SUCCESS ) { errorHandle = (SHUNHANDLE)connectionHandle; goto ErrorEnd; } return 0; ErrorEnd: /* エラーが発生した際のエラー処理 */ /* エラー情報の取得 */ status = ShunGetErrorMessage(errorHandle, &errorLevel, &errorMessage); if ( status == SHUN_SUCCESS ) { switch ( errorLevel ) { case SHUN_ERROR_CONNECTION: printf("エラーレベル = SHUN_ERROR_CONNECTION\n"); break; case SHUN_ERROR_TRANSACTION: printf("エラーレベル = SHUN_ERROR_TRANSACTION\n"); break; case SHUN_ERROR_DATA: printf("エラーレベル = SHUN_ERROR_DATA\n"); break; } printf("エラーメッセージ = %s\n", errorMessage); } else { printf("エラーメッセージ取得エラー : %d\n", status); } if ( connectionHandle != NULL ) { status = ShunRollback( connectionHandle ); if ( status != SHUN_SUCCESS ) { printf( "ロールバック失敗\n" ); } } ErrorEnd2: /* データ操作ハンドルの解放 */ if ( statementHandle_update != NULL ) { status = ShunFreeHandle( statementHandle_update ); if ( status != SHUN_SUCCESS ) { printf("データ操作ハンドル解放エラー : %d\n", status); } } /* データ操作ハンドルの解放 */ if ( statementHandle_search != NULL ) { status = ShunFreeHandle( statementHandle_search ); if ( status != SHUN_SUCCESS ) { printf("データ操作ハンドル解放エラー : %d\n", status); } } /* コネクションハンドルの解放 */ if ( connectionHandle != NULL) { int connection_dead; status = ShunGetConnectAttr( connectionHandle, SHUN_ATTR_CONNECTION_DEAD, &connection_dead ); if ( status != SHUN_SUCCESS ) { printf("コネクションハンドル属性取得エラー : %d\n", status); } if ( connection_dead == SHUN_FALSE ) { status = ShunDisconnect( connectionHandle ); if ( status != SHUN_SUCCESS ) { printf("コネクション切断エラー : %d\n", status); } } status = ShunFreeHandle( connectionHandle ); if ( status != SHUN_SUCCESS ) { printf("コネクションハンドル解放エラー : %d\n", status); } } return 1; } |
実行結果
コース情報の更新終了 学生情報の更新終了 |