付録A.2 コーディング例

ここでは,これまでに説明したコーディング例の機能を実現する,コーディング例を示します。

なお,(1)でクラスライブラリの処理の開始から終了までを示します。それ以降は,文書空間とクライアント環境のセッションはすでに確立されているものとして,各機能に当たる部分のコーディング例だけを示します。

コーディング例についての注意
ここに示すコーディング例はUNIXの場合の例となっています。したがって,Windowsをご使用の場合,コーディング例中の"file:///tmp/sample.txt"などのパス名,ファイル名は,"file:///c:¥temp¥sample.txt"のように読み替えてください。
<この項の構成>
(1) 文書の参照と登録
(2) 文書のバージョン管理
(3) 文書の構成管理
(4) XML文書の管理
(5) 可変長配列の操作
(6) エラー処理

(1) 文書の参照と登録

(a) 特定のフォルダへの文書の新規登録

ここでは,文書をフォルダ「業務」に格納するために,文書のパス名を業務のフォルダに関連づけるプログラムのコーディング例を示します。

図A-2に,特定のフォルダに文書を新規に登録するシーケンスを示します。

図A-2 特定のフォルダに文書を新規に登録するシーケンス

[図データ]

1 ////////////////////////////////////////////////////////////
2 //機能:特定のフォルダに文書を新規に登録する
3 ////////////////////////////////////////////////////////////
4  Bool InsertDocument(pDmaId pDocspID,
5           pDmaString_T pUsername,   //認証用ユーザID
6           pDmaString_T pPasswd,     //認証用パスワード
7           pDmaString_T pFilePath,   //登録文書パス
8           pDmaString_T pFolderName, //登録フォルダ名
9           pDmaId pTargetId,         //名前プロパティID
10          pDmaString_T  RootOIID    //ルートのフォルダID
11          )
12
13
14 {
15    CdbrSession* pSession;
16    SDBR_PROP*  pList = 0;
17    pDmaString_T pCFolderName = NULL;
18    pDmaString_T pErrorStrings = NULL;
19
20    DmaBoolean  rc;
21    pDmaString_T  pTargetOIID = NULL;
22    DmaInteger32 lTotal;
23    SDBR_DMAINFO TmpDma[2];
24    DmaInteger32 lmajor,lminor;
25
26 /////////////////////////////////////////////////////////
27 //1. 開始処理
28 /////////////////////////////////////////////////////////
29
30   //1.1 CdbrSessionオブジェクトの生成
31    pSession = new CdbrSession();
32    if(pSession == NULL){
33        return FALSE;
34    }
35   //1.2 文書空間との接続
36    rc = pSession->Connect(pDocspID,pUsername,pPasswd);
37    if(rc != DMA_TRUE){
38      lmajor = pSession->GetLastError(&lminor,&pErrorStrings);
39      printf(" ERROR !! major %x minor %x %s¥n",
40         lmajor,lminor,
41         (pErrorStrings == NULL) ? "NULL":pErrorStrings);
42      return FALSE;
43    }
44    pSession->Begin();
45 ///////////////////////////////////////////////////
46 //2. 文書の生成と登録
47 ///////////////////////////////////////////////////
48    CdbrVersionableDocument VRDoc;
49    pDmaString_T pOIID;
50    //テンプレートの作成
51    TmpDma[0].ClassId = mdmClass_ConfigHist; //すでに知っている
52    TmpDma[0].PropList.lCount = 0;      //プロパティリストは0
53    TmpDma[0].PropList.pItem = NULL;    //NULLを指定すると
54                                        //プロパティ値なしで生成
55    TmpDma[1].ClassId = mdmClass_DocVer;  //すでに知っている
56    TmpDma[1].PropList.lCount = 0;      //プロパティリストは0
57    TmpDma[1].PropList.pItem = NULL;    //NULLを指定すると
58                                        //プロパティ値なしで生成
59
60   //2.1 CdbrVersionableDocumentオブジェクトの生成
61   //                         (プロパティ値はNULL)
62    VRDoc.CreateObject(pSession,
63                      2,
64                      TmpDma,
65                      "file:///tmp/sample.txt",
66                      "MIME::text/plain",
67                      &pOIID
68    );
69
70 ///////////////////////////////////////////////////
71 //3. 登録フォルダを検索
72 ///////////////////////////////////////////////////
73
74   //3.1 ルートフォルダのOIIDの設定
75    CdbrReferentialContainer RootContainer;
76    rc = RootContainer.SetOIID(pSession,RootOIID);
77    if(rc != DMA_TRUE){
78      lmajor = RootContainer.GetLastError(&lminor,
79                                    &pErrorStrings);
80      printf(" ERROR !! major %x minor %x %s¥n",
81        lmajor,lminor,
82        (pErrorStrings == NULL) ? "NULL":pErrorStrings);
83      return FALSE;
84    }
85
86   //3.2 登録するフォルダの検索
87   //指定フォルダの子フォルダの一覧を取得する
88   //                 フォルダの個数をカウント
89    SDBR_PROPDEF PropA;
90    SDBR_PROPLIST* pPropList;
91    DmaBoolean bContinue = DMA_FALSE;
92    DmaInteger32 cnt;
93
94    PropA.PropId = dbrProp_ContaineesCount;
95
96    rc = RootContainer.GetPropertyValues(1,&PropA,&pPropList);
97    if(rc == DMA_TRUE &&
98      *pPropList->pItem[0].uniValue.plInteger32 > 0){
99        lTotal = *pPropList->pItem[0].uniValue.plInteger32;
100   }
101
102       //全子フォルダのプロパティ情報を取得
103   SDBR_OBJLIST* pObjList = NULL;
104   SDBR_PROPDEF PropB;
105   PropB.PropId = usrProp_FolderName;  //ユーザ定義のプロパティ
106   rc = RootContainer.GetContainableList(&bContinue,
107                         DBR_CONTAINMENT_REFERENTIAL,
108                         1,
109                         &PropB,
110                         lTotal,
111                         &pObjList);
112   if(rc != DMA_TRUE){
113     lmajor = RootContainer.GetLastError(&lminor,
114                                   &pErrorStrings);
115     printf(" ERROR !! major %x minor %x %s¥n",
116          lmajor,lminor,
117          (pErrorStrings == NULL) ? "NULL":pErrorStrings);
118     dbrDelete(pObjList);
119           return FALSE;
120   }
121
122       //指定された名前のフォルダを取得する
123   int j;
124   for(j = 0; j < pObjList->lCount; j++){
125      pList = pObjList->pItem[j].PropList.pItem;
126      pFolderName = GetPropValue(pList,
127      pObjList->pItem[j].PropList.lCount,pTargetId);
128
129     if(strcmp(pFolderName,pCFolderName) == 0)
130     {
131               break;
132     }
133   }
134       //フォルダのOIIDを取得する
135   pTargetOIID = pObjList->pItem[j].pOIID;
136       //目的のフォルダのOIIDの設定
137   CdbrReferentialContainer TargetContainer;
138   rc = TargetContainer.SetOIID(pSession,pTargetOIID);
139   if(rc != DMA_TRUE){
140     lmajor = TargetContainer.GetLastError(&lminor,
141                                     &pErrorStrings);
142     printf( "ERROR !! major %x minor %x %s¥n",
143          lmajor,lminor,
144          (pErrorStrings == NULL) ? "NULL":pErrorStrings);
145     return FALSE;
146   }
147   //3.3フォルダと文書の関連づけ
148   rc = TargetContainer.Link(&VRDoc);
149   if(rc != DMA_TRUE){
150     lmajor = TargetContainer.GetLastError(&lminor,
151                                     &pErrorStrings);
152     printf(" ERROR !! major %x minor %x %s¥n",
153          lmajor,lminor,
154          (pErrorStrings == NULL) ? "NULL":pErrorStrings);
155     return FALSE;
156   }
157       //ファイル実体のアップデート
158   VRDoc.UpdateContent(pFilePath,NULL);
159   //3.4 確定処理
160   pSession->Commit();
161
162 /////////////////////////////////////////////////////////
163 //4. 終了処理
164 /////////////////////////////////////////////////////////
165   //4.1 オブジェクトとの接続の解除
166   dbrDelete (pObjList);
167   VRDoc.ReleaseObject();
168   RootContainer.ReleaseObject();
169   TargetContainer.ReleaseObject();
170   //4.2 セッションの終了
171   pSession->Disconnect();
172   delete pSession;
173   return TRUE;
174 }
175 ////////////////////////////////////////////////////////
176 //SUB:プロパティIDがtargetIdであるもののプロパティ値を取得する
177 ////////////////////////////////////////////////////////
178  pDmaString_T GetPropValue(SDBR_PROP* pPropList,
179                  DmaInteger32  lListCount,
180                  pDmaId        pTargetId)
181 {
182   int i;
183   for (i = 0 ; i < lListCount; i++) {
184     //目的のプロパティIDと一致したらプロパティ値をリターンする
185     if (memcmp(&pPropList[i].PropId,
186                pTargetId,
187                sizeof *pTargetId) == 0)
188     {
189           return *pPropList[i].uniValue.ppString;
190     }
191   }
192   return NULL;
193 }

(b) 特定の文書を取り出した参照

ここでは,特定の文書を指定して参照するプログラムのコーディング例を示します。文書はバージョン管理されています。ここで参照とは,文書の実体を,指定したファイルに複写することです。このコーディング例では,文書のOIIDおよびバージョン番号および取り出した文書の実体を複写するファイルを指定して,関数を発行します。

図A-3に,特定の文書を取り出して参照するシーケンスを示します。

図A-3 特定の文書を取り出して参照するシーケンス

[図データ]

1 ///////////////////////////////////////////////////////
2 //機能:特定の文書を取り出して参照する
3 ///////////////////////////////////////////////////////
4 Bool GetVersionDoc(CdbrSession* pSession,
5         pDmaString_T pVRDOCId,
6         pDmaString_T pFilePath,
7         DmaInteger32 VersionCount)
8 {
9     DmaBoolean rc;
10    SDBR_DMAINFO TmpDmaConfigHist;
11    SDBR_DMAINFO TmpDmaDocVer;
12    pDmaString_T pErrorStrings = NULL;
13 ///////////////////////////////////////////////////
14 //1. CdbrVersionableDocumentのOIIDの設定
15 ///////////////////////////////////////////////////
16    CdbrVersionableDocument VRDoc;
17    pSession->Begin();
18    //VRDOCオブジェクトのOIIDの設定
19    rc = VRDoc.SetOIID(pSession,pVRDocId);
20    if(rc != DMA_TRUE)
21    {
22      lmajor = VRDoc.GetLastError(&lminor,&pErrorStrings);
23      printf(" ERROR !! major %x minor %x %s¥n",
24           lmajor,lminor,
25           (pErrorStrings == NULL) ? "NULL":pErrorStrings);
26    return FALSE;
27    }
28
29 ///////////////////////////////////////////////////
30 //2. バージョン一覧の取得
31 ///////////////////////////////////////////////////
32    SDBR_OBJLIST* pOBJList = NULL;     //バージョンは10個
33    DmaBoolean bContinue = DMA_FALSE;
34    DmaInteger32 lFetchCount;
35    rc = VRDoc.GetVersionList(&bContinue,
36                  0,         //プロパティリストは0
37                  NULL,      //プロパティは取得しない
38                  10,
39                  &pOBJList);
40    if(rc != DMA_TRUE)
41    {
42      lmajor = VRDoc.GetLastError(&lminor,&pErrorStrings);
43      printf(" ERROR !! major %x minor %x %s¥n",
44           lmajor,lminor,
45           (pErrorStrings == NULL) ? "NULL":pErrorStrings);
46      return FALSE;
47    }
48 ///////////////////////////////////////////////////
49 //3. 特定のバージョンの文書実体の取得
50 ///////////////////////////////////////////////////
51    rc = VRDoc.GetContent(pFilePath,
52                  pOBJList->pItem[VersionCount].pOIID);
53    if(rc != DMA_TRUE){
54      lmajor = VRDoc.GetLastError(&lminor,&pErrorStrings);
55      printf(" ERROR !! major %x minor %x %s¥n",
56           lmajor,lminor,
57           (pErrorStrings == NULL) ? "NULL":pErrorStrings);
58      return FALSE;
59    }
60      dbrDelete(pOBJList);
61      VRDoc.ReleaseObject();
62    pSession->Commit();
63      return TRUE;
64 }

(c) CdbrEqlStatementクラスを使用した文書の検索

ここではCdbrEqlStatementクラスを使用して,edmSQL文で記述した検索条件を実行し,検索結果を取得するプログラムのコーディング例を示します。

次の図に,CdbrEqlStatementクラスを使用して検索するシーケンスを示します。

図A-4 CdbrEqlStatementクラスを使用して検索するシーケンス

[図データ]

1 /////////////////////////////////////////////////////////
2 //機能:CdbrEqlStatementクラスを使用して文書を検索する
3 /////////////////////////////////////////////////////////
4 Bool SearchObject(
5        CdbrSession* pSession
6        )
7 {
8     CdbrEqlStatement* pEql = NULL;
9     DmaBoolean rc;
10    pDmaString_T pErrorStrings = NULL;
11    pSession->Begin();
12
13 /////////////////////////////////////////////////////////
14 //1. CdbrEqlStatementオブジェクトの生成
15 /////////////////////////////////////////////////////////
16   pEql = new CdbrEqlStatement();
17
18 /////////////////////////////////////////////////////////
19 //2. オブジェクトの初期化とセッションオブジェクトへの登録
20 /////////////////////////////////////////////////////////
21   rc = pEql->Initialize(pSession);
22   if ( DMA_TRUE != rc ) {
23     //エラー処理
24     lmajor = pEql->GetLastError(&lminor, &pErrorStrings);
25     printf("ERROR !! major %x minor %x %s¥n",
26           lmajor, lminor,
27         (pErrorStrings == NULL) ? "NULL":pErrorStrings);
28   }
29
30 /////////////////////////////////////////////////////////
31 //3. edmSQL文の設定
32 /////////////////////////////////////////////////////////
33   rc = pEql->Set( (pDmaString_T)
34           "Select dmaProp_OIID"
35           " From usrClass_Folder"
36           " Where (usrProp_Date = ?) Or (usrProp_No = ?)");
37   if ( DMA_TRUE != rc ) {
38     //エラー処理
39     lmajor = pEql->GetLastError(&lminor, &pErrorStrings);
40     printf("ERROR !! major %x minor %x %s¥n",
41           lmajor, lminor,
42          (pErrorStrings == NULL) ? "NULL":pErrorStrings);
43   }
44
45 /////////////////////////////////////////////////////////
46 //4. edmSQL文の?パラメタの設定
47 //   ?パラメタの値の設定(?(1):19991201 ?(2):100)
48 /////////////////////////////////////////////////////////
49   rc = pEql->SetParam(1, (pDmaString_T)"19991201");
50   if ( DMA_TRUE != rc ) {
51     //エラー処理
52     lmajor = pEql->GetLastError(&lminor, &pErrorStrings);
53     printf("ERROR !! major %x minor %x %s¥n",
54           lmajor, lminor,
55          (pErrorStrings == NULL) ? "NULL":pErrorStrings);
56   }
57
58   rc = pEql->SetParam(2, 100);
59   if ( DMA_TRUE != rc ) {
60     //エラー処理
61     lmajor = pEql->GetLastError(&lminor, &pErrorStrings);
62     printf("ERROR !! major %x minor %x %s¥n",
63           lmajor, lminor,
64          (pErrorStrings == NULL) ? "NULL":pErrorStrings);
65   }
66
67 /////////////////////////////////////////////////////////
68 //5. ロック種別の設定(Writeロック)
69 /////////////////////////////////////////////////////////
60   DmaInteger32 lLockType = DBR_LOCK_WRITE;
71   rc = pEql->ChangeLockType(lLockType);
72   if ( DMA_TRUE != rc ) {
73     //エラー処理
74     lmajor = pEql->GetLastError(&lminor, &pErrorStrings);
75     printf("ERROR !! major %x minor %x %s¥n",
76           lmajor, lminor,
77          (pErrorStrings == NULL) ? "NULL":pErrorStrings);
78   }
79
80 /////////////////////////////////////////////////////////
81 //6. 検索結果取得件数の設定(100件)
82 /////////////////////////////////////////////////////////
83   DmaInteger32 lGetObjCount = 100;
84   rc = pEql->ChangeGetObjCount(lGetObjCount);
85   if ( DMA_TRUE != rc ) {
86     //エラー処理
87     lmajor = pEql->GetLastError(&lminor, &pErrorStrings);
88     printf("ERROR !! major %x minor %x %s¥n",
89           lmajor, lminor,
90          (pErrorStrings == NULL) ? "NULL":pErrorStrings);
91   }
92
93 /////////////////////////////////////////////////////////
94 //7. アクセス制御モードの設定(DBR_QUERY_WITH_ACL)
95 /////////////////////////////////////////////////////////
96   DmaInteger32 lACLMode = DBR_QUERY_WITH_ACL;
97   rc = pEql->ChangeACLMode(lACLMode);
98   if ( DMA_TRUE != rc ) {
99     //エラー処理
100    lmajor = pEql->GetLastError(&lminor, &pErrorStrings);
101    printf("ERROR !! major %x minor %x %s¥n",
102          lmajor, lminor,
103         (pErrorStrings == NULL) ? "NULL":pErrorStrings);
104  }
105
106 /////////////////////////////////////////////////////////
107 //8. 設定済みedmSQL文の実行
108 /////////////////////////////////////////////////////////
109   pDmaString_T pErrorMessage = NULL;
110   rc = pEql->Execute(&pErrorMessage);
111   if ( DMA_TRUE != rc ) {
112     //エラー処理
113     lmajor = pEql->GetLastError(&lminor, &pErrorStrings);
114     printf("ERROR !! major %x minor %x %s¥n",
115           lmajor, lminor,
116          (pErrorStrings == NULL) ? "NULL":pErrorStrings);
117     if ((ERR_DBR == lmajor) &&
118         (ERR_EQL_BAD_STATEMENT == lminor)) {
119        printf("StatementError !! %s¥n", pErrorMessage);
120     }
121   }
122   dbrDelete(pErrorMessage);
123   pErrorMessage = NULL;
124
125 /////////////////////////////////////////////////////////
126 //9. 結果を100件ずつ最後まで取得
127 /////////////////////////////////////////////////////////
128   DmaBoolean bContinue = DMA_TRUE;
129   DmaInteger32 lSearchCount = lGetObjCount;
130   SDBR_QUERYRESULT* pQueryResult = NULL;
131
132   while ( lGetObjCount <= lSearchCount )
133   {
134     rc = pEql->GetResult( bContinue, &lSearchCount,
135                           &pQueryResult );
136     if ( DMA_TRUE != rc ) {
137       //エラー処理
138       lmajor = pEql->GetLastError(&lminor, &pErrorStrings);
139       printf("ERROR !! major %x minor %x %s¥n",
140             lmajor, lminor,
141            (pErrorStrings == NULL) ? "NULL":pErrorStrings);
142     }
143     dbrDelete(lSearchCount, pQueryResult);
144   }
145
146 /////////////////////////////////////////////////////////
147 //10. セッションオブジェクトへの登録抹消
148 /////////////////////////////////////////////////////////
149   rc = pEql->Terminate();
150   if ( DMA_TRUE != rc ) {
151     //エラー処理
152      lmajor = pEql->GetLastError(&lminor, &pErrorStrings);
153      printf("ERROR !! major %x minor %x %s¥n",
154            lmajor, lminor,
155           (pErrorStrings == NULL) ? "NULL":pErrorStrings);
156   }
157
158 /////////////////////////////////////////////////////////
159 //11. CdbrEqlStatementオブジェクトを削除
160 /////////////////////////////////////////////////////////
161   delete pEql;
162   pEql = NULL;
163
164   pSession->Commit();
165   return TRUE;
166 }

(2) 文書のバージョン管理

(a) 文書のチェックアウト

ここでは,最新バージョンの文書をチェックアウトして,編集できるようにするプログラムのコーディング例を示します。

次の図に,文書をチェックアウトするシーケンスを示します。

図A-5 文書をチェックアウトするシーケンス

[図データ]

1 ///////////////////////////////////////////////////////
2 //機能:文書をチェックアウトする
3 ///////////////////////////////////////////////////////
4 Bool GetVersionDoc(CdbrSession* pSession,
5         pDmaString_T pVRDOCId,
6         pDmaString_T pFilePath,
7         ppDmaString_T ppVersionID)
8 {
9     DmaBoolean rc;
10    CdbrVersionableDocument VRDOC;
11    ppDmaString_T ppVerId=NULL;
12    pDmaString_T pErrorStrings = NULL;
13    pSession->Begin();
14 ///////////////////////////////////////////////////
15 //1.文書のOIIDの設定
16 ///////////////////////////////////////////////////
17    rc = VRDOC.SetOIID(pSession, pVRDOCId);
18    if(rc != DMA_TRUE){
19      lmajor = VRDOC.GetLastError(&lminor,&pErrorStrings);
20      printf(" ERROR !! major %x minor %x %s¥n",
21           lmajor,lminor,
22           (pErrorStrings == NULL) ? "NULL":pErrorStrings);
23      return FALSE;
24    }
25 ///////////////////////////////////////////////////
26 //2.文書のチェックアウト
27 ///////////////////////////////////////////////////
28    rc = VRDOC.VersionCheckOut(&pVerId);
29    if(rc != DMA_TRUE){
30      lmajor = VRDOC.GetLastError(&lminor,&pErrorStrings);
31      printf(" ERROR !! major %x minor %x %s¥n",
32           lmajor,lminor,
33           (pErrorStrings == NULL) ? "NULL":pErrorStrings);
34      return FALSE;
35    }
36 ///////////////////////////////////////////////////
37 //3.最新のバージョン(チェックアウトされたもの)の文書実体の取得
38 ///////////////////////////////////////////////////
39    rc = VRDOC.GetContent(pFilePath,pVerId);
40    if(rc != DMA_TRUE){
41      lmajor = VRDOC.GetLastError(&lminor,&pErrorStrings);
42      printf(" ERROR !! major %x minor %x %s¥n",
43           lmajor,lminor,
44           (pErrorStrings == NULL) ? "NULL":pErrorStrings);
45      return FALSE;
46    }
47 ///////////////////////////////////////////////////
48 //4. 確定処理
49 ///////////////////////////////////////////////////
50    pSession->Commit();
51
52    VRDOC.ReleaseObject();
53    *ppVersionID = (char *)malloc(strlen(pVerId)+1);
54    strcpy(*ppVersionID,pVerId);
55    dbrDelete(pVerId);
56    return TRUE;
57 }

(b) チェックアウトした文書をチェックインして登録

ここでは,チェックアウトした文書を,チェックインして登録するプログラムのコーディング例を示します。

次の図に,チェックアウトした文書をチェックインして登録するシーケンスを示します。

図A-6 チェックアウトした文書をチェックインして登録するシーケンス

[図データ]

1 ///////////////////////////////////////////////////////
2 //機能:チェックアウトした文書をチェックインして登録する
3 ///////////////////////////////////////////////////////
4 Bool EntryDoc(CdbrSession* pSession,
5         pDmaString_T pFilePath,
6         pDmaString_T pVRDOCId,
7         pDmaString_T pVerId    //CheckOutメソッドで取得したもの
8 )
9 {
10    DmaBoolean rc;
11    CdbrVersionableDocument VRDOC;
12    pDmaString_T pErrorStrings = NULL;
13    pSession->Begin();
14 ///////////////////////////////////////////////////
15 //1. 文書のOIIDの設定(プロパティ値はNULL)
16 ///////////////////////////////////////////////////
17    rc = VRDOC.SetOIID(pSession, pVRDOCId);
18    if(rc != DMA_TRUE){
19      lmajor = VRDOC.GetLastError(&lminor,&pErrorStrings);
20      printf(" ERROR !! major %x minor %x %s¥n",
21           lmajor,lminor,
22           (pErrorStrings == NULL) ? "NULL":pErrorStrings);
23      return FALSE;
24    }
25
26 ///////////////////////////////////////////////////
27 //2. 最新のバージョン(チェックアウトされたもの)の文書実体の登録
28 ///////////////////////////////////////////////////
29    rc = VRDOC.UpdateContent(pFilePath,pVerId);
30    if(rc != DMA_TRUE){
31      lmajor = VRDOC.GetLastError(&lminor,&pErrorStrings);
32      printf(" ERROR !! major %x minor %x %s¥n",
33           lmajor,lminor,
34           (pErrorStrings == NULL) ? "NULL":pErrorStrings);
35      return FALSE;
36    }
37 ///////////////////////////////////////////////////
38 //3. 文書のチェックイン
39 ///////////////////////////////////////////////////
40    rc = VRDOC.VersionCheckIn();
41    if(rc != DMA_TRUE){
42      lmajor = VRDOC.GetLastError(&lminor,&pErrorStrings);
43      printf(" ERROR !! major %x minor %x %s¥n",
44           lmajor,lminor,
45           (pErrorStrings == NULL) ? "NULL":pErrorStrings);
46      return FALSE;
47    }
48 ///////////////////////////////////////////////////
49 //4. 確定処理
50 ///////////////////////////////////////////////////
51        pSession->Commit();
52        VRDOC.ReleaseObject();
53        return TRUE;
54 }

(3) 文書の構成管理

(a) 構成管理フォルダの作成

ここでは,構成管理フォルダを新規に作成するプログラムのコーディング例を示します。

次の図に,構成管理フォルダを新規に作成するシーケンスを示します。

図A-7 構成管理フォルダを新規に作成するシーケンス

[図データ]

1 /////////////////////////////////////////////////////
2 //機能:構成管理フォルダの新規作成
3 /////////////////////////////////////////////////////
4 Bool CreateVRFolder(CdbrSession* pSession,
5          ConfiguratedReferentialContainer** ppCFRFCT)
6 {
7    SDBR_DMAINFO TmpDmaCFRFCT;
8    SDBR_PROPLIST PropList;
9    CdbrConfiguratedReferentialContainer* pCFRFContainer;
10   pCFRContainer = new CdbrConfiguratedReferentialContainer();
11   DmaBoolean rc;
12   pDmaString_T pErrorStrings = NULL;
13   pSession->Begin();
14 /////////////////////////////////////////////////////
15 //1. プロパティを初期化して構成管理フォルダを作成
16 /////////////////////////////////////////////////////
17   pDmaString_T pOIID = NULL;          //生成するフォルダのOIID
18   TmpDmaCFRFCT.ClassId = ID_ConfigHist; //すでに知っている
19   TmpDmaCFRFCT.PropList.lCount = 0;   //プロパティ値なしで生成
20   TmpDmaCFRFCT.PropList.pItem = NULL; //プロパティ値なしで生成
21
22   rc = pCFRFContainer->CreateObject(pSession,
23                           1,
24                           &TmpDmaCFRFCT,
25                           &pOIID
26   );
27   if(rc != DMA_TRUE){
28     lmajor = pCFRFContainer->GetLastError(&lminor,
29                                  &pErrorStrings);
30     printf(" ERROR !! major %x minor %x %s¥n",
31          lmajor,lminor,
32          (pErrorStrings == NULL) ? "NULL":pErrorStrings);
33     return FALSE;
34   }
35 /////////////////////////////////////////////////////
36 //2. オブジェクトのポインタを取得
37 /////////////////////////////////////////////////////
38   *ppCFRFCT = pCFRFContainer;
39
40   pCFRFContainer->ReleaseObject();
41   pSession->Commit();
42   return TRUE;
43 }

(b) 構成管理フォルダの構成要素の一覧取得

ここでは,構成管理フォルダが管理している特定のバージョンの文書の一覧を取得するプログラムのコーディング例を示します。

次の図に,構成管理フォルダの構成要素の一覧を取得するシーケンスを示します。

図A-8 構成管理フォルダの構成要素の一覧を取得するシーケンス

[図データ]

1 ///////////////////////////////////////////////////
2 //機能:構成管理フォルダの構成要素一覧の取得
3 ///////////////////////////////////////////////////
4 Bool GetContainee(CdbrSession *pSession,
5          CdbrConfiguratedReferentialContainer* pCFRFCT)
6 {
7    DmaBoolean bContinue = DMA_TRUE;
8    DmaInteger32 FetchCount;
9    DmaInteger32 ObjListCount;
10   DmaBoolean rc;
11   pDmaString_T pErrorStrings = NULL;
12   pSession->Begin();
13 ///////////////////////////////////////////////////////////
14 //1. クラスのプロパティに存在する構成要素の個数を取得する
15 ///////////////////////////////////////////////////////////
16   SDBR_PROPDEF PropA;
17   PropA.PropId = dbrProp_ContaineesCountVT;
18                                //クラスのプロパティを指定
19   PropA.lType = DMA_DATATYPE_INTEGER32;
20   PropA.lCardinality = DMA_CARDINALITY_SINGLE;
21   SDBR_PROP*     pPropT;
22   SDBR_PROPLIST* pPropList;
23   DmaInteger32 cnt;
24   DmaInteger32 iPropCount = 1;
25   rc = pCFRFCT->GetPropertyValues(NULL,
26           iPropCount,&PropA,&pPropList);   //一つだけ取得
27   if(rc == DMA_TRUE){
28     lmajor = pCFRFCT->GetLastError(&lminor,&pErrorStrings);
29     printf(" ERROR !! major %x minor %x %s¥n",
30          lmajor,lminor,
31          (pErrorStrings == NULL) ? "NULL":pErrorStrings);
32     return FALSE;
33   }
34   pPropT = &pPropList->pItem[0];
35   if (rc == DMA_TRUE && *pPropT->uniValue.plInteger32 > 0){
36         ObjListCount = *pPropT->uniValue.plInteger32;
37   }
38 ///////////////////////////////////////////////////////////
39 //2. すべての構成要素のOIIDを取得
40 ///////////////////////////////////////////////////////////
41   SDBR_VTOBJLIST* pObjList = NULL;
42   rc = pCFRFCT->GetVTContaineeList( &bContinue,
43                     NULL,       //プロパティは取得しない
44                     0,          //プロパティは取得しない
45                     NULL,
46                     ObjListCount,
47                     &pObjList
48   );
49   if(rc != DMA_TRUE){
50     lmajor = pCFRFCT->GetLastError(&lminor,&pErrorStrings);
51     printf(" ERROR !! major %x minor %x %s¥n",
52          lmajor,lminor,
53          (pErrorStrings == NULL) ? "NULL":pErrorStrings);
54     return FALSE;
55   }
56 ///////////////////////////////////////////////////////////
57 //3. 結果出力
58 ///////////////////////////////////////////////////////////
59   int i;
60   for(i = 0;i < pObjList->lCount; i++)
61   {
62        printf("Id = %s",pObjList->pItem[i].pOIID);
63   }
67   dbrDelete(pObjList);
65 ///////////////////////////////////////////////////////////
66 //4. 終了処理
67 ///////////////////////////////////////////////////////////
68   dbrDelete(pPropList);
69   pCFRFCT->ReleaseObject();
70   delete pCFRFCT;
71   pSession->Commit();
72   return TRUE;
73 }

(c) 構成管理フォルダが管理する文書の構成管理モードの切り替え

ここでは,構成管理フォルダが管理する文書のバージョンの構成管理モードである,FIXモードとFLOATINGモードを切り替えるプログラムのコーディング例を示します。

図A-9 構成管理フォルダが管理する文書の構成管理モードを切り替えるシーケンス

[図データ]

1 /////////////////////////////////////////////////////////
2 //機能:構成管理フォルダが管理する文書の構成管理モードを切り替える
3 /////////////////////////////////////////////////////////
4 Bool ChangeFix(CdbrSession* pSession,
5          CdbrConfiguratedReferentialContainer* pCFRFCT,
6          pDmaString_T pLinkId,
7          pDmaString_T pAction,
8          pDmaString_T pOIID)
9 {
10    DmaBoolean rc;
11    pDmaString_T pErrorStrings = NULL;
12    pSession->Begin();
13    pCFRFCT->SetOIID(pSession, pOIID);
14 ///////////////////////////////////////////////////
15 //1. FIXかFLOATか判断する
16 ///////////////////////////////////////////////////
17 ///////////////////////////////////////////////////
18 //2. FIXにする
19 ///////////////////////////////////////////////////
20   if(!(strcmp("FIX",pAction)))
21   {
22     rc = pCFRFCT->SetVTFix(pLinkId,NULL);
23     if(rc != DMA_TRUE)
24     {
25       lmajor = pCFRFCT->GetLastError(&lminor,&pErrorStrings);
26       printf(" ERROR !! major %x minor %x %s¥n",
27            lmajor,lminor,
28            (pErrorStrings == NULL) ? "NULL":pErrorStrings);
29       return FALSE;
30      }
31   }
32 ///////////////////////////////////////////////////
33 //3. FLOATにする
34 ///////////////////////////////////////////////////
35   else if(!(strcmp("FLOAT",pAction)))
36   {
37     rc = pCFRFCT->SetVTFloat(pLinkId);
38     if(rc != DMA_TRUE)
39     {
40       lmajor = pCFRFCT->GetLastError(&lminor,&pErrorStrings);
41       printf(" ERROR !! major %x minor %x %s¥n",
42            lmajor,lminor,
43            (pErrorStrings == NULL) ? "NULL":pErrorStrings);
44       return FALSE;
45     }
46   }else{
47      lmajor = pCFRFCT->GetLastError(&lminor,&pErrorStrings);
48      printf(" ERROR !! major %x minor %x %s¥n",
49           lmajor,lminor,
50           (pErrorStrings == NULL) ? "NULL":pErrorStrings);
51      return FALSE;
52   }
53 ///////////////////////////////////////////////////
54 //4. 確定処理
55 ///////////////////////////////////////////////////
56   pSession->Commit();
57   return TRUE;
58 }

(4) XML文書の管理

ここでは,XML文書を新規登録する方法として,XMLファイルからDMA情報リストと構造指定検索用のインデクスデータを生成し,その情報を基に文書オブジェクトの作成と構造指定検索インデクスの登録をするコーディング例で説明します。なお,コーディング例中で使用しているエラー判定関数checkAndThrowの定義は次のとおりです。

エラー判定関数checkAndThrowの定義

// 条件式の判定と例外のスロー
void checkAndThrow(int condition, CdbrCore& rObj)
{
   // 条件式が成り立たない場合,マイナーコードをスローする
   if (!condition) {
       DmaInteger32 lMinor = 0;
       rObj.GetLastError(&lMinor);
       throw DmaInteger32(lMinor);
   }
}

次の図に,XML文書を新規に登録するシーケンスを示します。

図A-10 XML文書を新規に登録するシーケンス

[図データ]

1 /////////////////////////////////////////////////////
2 // XML文書の新規登録
3 /////////////////////////////////////////////////////
4
5 void CreateObject(
6     pDmaId       pDocSpaceId, // 文書空間ID
7     pDmaString_T pUserId,     // ユーザID
8     pDmaString_T pPassword,   // パスワード
9     pDmaString_T pXmlFile,    // XMLファイル
10    pDmaString_T pMapDefId)   // マッピング定義ID
11 {
12    CdbrSession               session;
13    CdbrVersionableDocument   verDoc;
14    CdbrXmlTranslatorFactory  xmlTransFactory;
15    CdbrXmlTranslator         xmlTrans;
16    SDBR_DMAINFOLIST*         pDmaInfoList = NULL;
17    pDmaString_T              pOIID = NULL;
18    pDmaString_T              pMessage = NULL;
19    DmaBoolean                bRc;
20
21 ////////////////////////////////////////////////////
22 // 1. XML操作環境の設定と開始処理
23 ////////////////////////////////////////////////////
24   // XML管理オブジェクトの初期化
25    bRc = xmlTransFactory.Initialize(pDocSpaceId,
26                              NULL, &pMessage);
27    if (pMessage != NULL) {
28        cout << "message=" << pMessage << endl;
29    }
30    dbrDelete(pMessage);
31    checkAndThrow(bRc, xmlTransFactory);
32
33   // CdbrXmlTranslatorオブジェクトの生成
34    bRc = xmlTransFactory.CreateTranslator(&xmlTrans);
35    checkAndThrow(bRc, xmlTransFactory);
36
37   // セッションの接続
38    bRc = session.Connect(pDocSpaceId, pUserId, pPassword);
39    checkAndThrow(bRc, session);
40
41   // トランザクションの開始
42    bRc = session.Begin();
43    checkAndThrow(bRc, session);
44
45 ////////////////////////////////////////////////////////
46 // 2. XMLファイルからのDMA情報リスト,構造指定検索用データの生成
47 ////////////////////////////////////////////////////////
48    bRc = xmlTrans.GetDmaInfoList(pXmlFile,
49          DBR_XMLPARSE_NO_EXTERNAL_ENTITIES,
50          pMapDefId,DBR_INDEXTYPE_STRUCTURED,
51          "file:///tmp/NorParamFile.txt",
52          "file:///tmp/index.txt",
53          &pDmaInfoList, &pMessage);
54    if (pMessage != NULL) {
55        cout << "message=" << pMessage << endl;
56    }
57    dbrDelete(pMessage);
58    checkAndThrow(bRc, xmlTrans);
59
60 ////////////////////////////////////////////////////////
61 // 3. 文書オブジェクトの新規作成と構造指定検索インデクスの登録
62 ////////////////////////////////////////////////////////
63   // DMA情報リストを使用して文書オブジェクトを新規作成する
64    bRc = verDoc.CreateObject(&session,
65          pDmaInfoList->lCount,
66          pDmaInfoList->pItem,
67          pXmlFile, "text::xml", &pOIID);
68    dbrDelete(pDmaInfoList);
69    checkAndThrow(bRc, verDoc);
70
71   // 構造指定検索インデクスの登録
72    bRc = verDoc.CreateIndex("file:///tmp/index.txt");
73    checkAndThrow(bRc, verDoc);
74
75 ////////////////////////////////////////////////////////
76 // 4. 終了処理
77 ////////////////////////////////////////////////////////
78   // トランザクションのコミット
79    bRc = session.Commit();
80    checkAndThrow(bRc, session);
81
82   // セッションの切断
83    bRc = session.Disconnect();
84    checkAndThrow(bRc, session);
85 }

(5) 可変長配列の操作

ここでは,CdbrVariableArrayクラスとCdbrCompoundクラスを使用したVariableArray型プロパティの操作について,コーディング例を示します。

このコーディング例では,次の図に示す,プロパティ「Name」とプロパティ「Age」を定義したedmClass_Structクラスのオブジェクトを要素に持つVariableArray型のプロパティついて説明します。

図A-11 サンプルコーディングで使用するVariableArray型プロパティ

[図データ]

(a) VariableArray型プロパティの取得

可変長配列を取得するためには,CdbrDMA::GetPropertyValuesメソッドなどの,プロパティを取得するメソッドを使用します。

取得したプロパティ構造体(SDBR_PROP)が,データ型がObject型(lType = DMA_DATATYPE_OBJECT)であり,かつ基本単位がVariableArray(lCardinality = EDM_DMA_CARDINALITY_VARRAY)の場合,メンバuniValue.ppObject[0]に可変長配列クラスCdbrVariableArrayクラスのインスタンスへのポインタが格納されます。

コーディング例を示します。

1  // VariableArray型プロパティを取得するサンプルコード
2  SDBR_PROPDEF    propdef;
3  SDBR_PROPLIST*  pPropList;
4  SDBR_PROP*      pProp;
5  DmaInteger32    n;
6  pDmaString_T    pName;
7  CdbrVariableArray* pVArray;
8  CdbrCompound       CompoValue;
9  propdef.PropId = usrProp_Member;
10 dma.GetPropertyValues(1,&propdef, &pPropList);
11 pProp = &pPropList->pItem[0];
12 if (pProp->lType == DMA_DATATYPE_OBJECT
13  && pProp->lCardinality == EDM_DMA_CARDINALITY_VARRAY)
14 {
15  pVArray = (CdbrVariableArray*) pProp->uniValue.ppObject[0];
16 }

(b) 可変長配列の値の取得

可変長配列の要素は,CdbrVariableArray::GetValueメソッドにインデクスを指定して取得します。

VariableArray型プロパティから取得した可変長配列オブジェクトの要素のデータ型は,複合データ型(DBR_DATATYPE_COMPOUND)です。したがって,CdbrCompoundクラスの変数のアドレスを指定します。

複合データ型からの値は,CdbrCompound::GetValueメソッドにプロパティIDを指定して,取得します。

コーディング例を次に示します。なお,ここでは,(a)で可変長配列を取得した続きから記述します。

17 if (pVArray->GetDataType() == DBR_DATATYPE_COMPOUND) {
18 // 要素の数だけ繰り返す
19 for (int n = 0; n < pVArray->GetCount(); n++) {
20  // 要素(複合データ型)の取得
21   pVArray->GetValue(n,& CompoValue);
22  // "Name"プロパティの取得と表示
23  CompoValue.GetValue(&usrProp_Name, &pName);
24  printf("Name=%s ", pName);
25   // "Age"プロパティの取得と表示
26   CompoValue.GetValue(&usrProp_Age, &lAge);
27   printf("Age=%d¥n", lAge);
28   dbrDelete(pName);
29  }
30 }

(c) VariableArray型プロパティの設定

VariableArray型プロパティを設定する場合は,CdbrDMA::PutPropertyValuesメソッドなどの,プロパティを設定するメソッドを使用します。

次の図に可変長配列を設定するシーケンスを示します。

図A-12 可変長配列を設定するシーケンス

[図データ]

1  // 変数dmaはCdbrDMAクラスのインスタンス
2  SDBR_PROP     Prop;
3  SDBR_PROPLIST PropList;
4  Dmapv         pObj;
5  CdbrCompound CompoValue;
6  CdbrVariableArray  VArray(DBR_DATATYPE_COMPOUND);
7
8  // 要素となる複合データを作成する
9  CompoValue.SetValue( &usrProp_NAME, "中井");
10 CompoValue.SetValue( &usrProp_AGE, 25);
11 // 可変長配列の要素数を1にして,複合データを可変長配列に格納する
12 VArray.Resize(1);
13 VArray.SetValue(0,CompoValue);
14 // 可変長配列をプロパティ構造体に設定する
15 Prop.PropId = usrProp_Author;
16 Prop.lType = DMA_DATATYPE_OBJECT;
17 Prop.lCardinality = EDM_DMA_CARDINALITY_VARRAY;
18 Prop.lCount = 1;
19 pObj = &VArray;
20 Prop.uniValue.ppObject = &pObj;
21 // プロパティ構造体の値(=可変長配列)をDMAオブジェクトに設定する
22 PropList.pItem = &Prop;
23 PropList.lCount = 1;
24 dma.PutPropertyValues(&PropList);

(d) 可変長配列の要素数の追加と削除

可変長配列の要素は,CdbrVariableArray::Addメソッドによって追加できます。追加した要素は,可変長配列の末尾に追加されます。

また,可変長配列の要素の削除は,CdbrVariableArray::Deleteメソッドで,引数に削除する要素のインデクスを指定して実行します。削除された要素以降の要素は,前に詰まります。変更した内容は,PutPropertyValuesメソッドなどによってプロパティを更新した時にオブジェクトに反映されます。

コーディング例を次に示します。なお,整数リテラルを指定する場合は,型指定をするか,サフィックスを指定する必要があります。

1      CdbrVariableArray  VArray(DBR_DATATYPE_COMPOUND);
2  //要素を作成する
3      CdbrCompound  CompoValue1,CompoValue2;
4      CompoValue1.SetValue( &usrProp_NAME, "島田");
5      CompoValue1.SetValue( &usrProp_AGE, (DmaInteger32)30);
6      CompoValue2.SetValue( &usrProp_NAME, "中井");
7      CompoValue2.SetValue( &usrProp_AGE, 25L);
8  //要素を二つ追加する
9      VArray.Add(CompoValue1);
10     VArray.Add(CompoValue2);
11 //先頭の要素を削除する
12     VArray.Delete(0);

(e) すべての要素の削除

可変長配列のすべての要素を一括して削除するには,CdbrVariableArray::Resizeメソッドによって要素数に0を指定します。要素数0の可変長配列をVariableArray型プロパティに設定すると,VariableArray型プロパティのすべての要素が削除されます。

次に,コーディング例を示します。なお,ここでは,(a)でVariableArray型プロパティを取得した続きを記述します。pVArrayは,可変長配列のポインタです。

17 SDBR_PROP     Prop;
18 SDBR_PROPLIST PropList;
19 Dmapv         pObj;
20
21 // 要素の数を0にする
22  pVArray->Resize(0)
23 // 変更内容をオブジェクトに反映する
24 Prop.PropId = usrProp_Author;
25 Prop.lType = DMA_DATATYPE_OBJECT;
26 Prop.lCardinality = EDM_DMA_CARDINALITY_VARRAY;
27 Prop.lCount = 1;
28 pObj = pVArray;
29 Prop.uniValue.ppObject = &pObj;
30 // プロパティ構造体の値(=可変長配列)をDMAオブジェクトに設定する
31 // VariableArray型プロパティの要素はすべて削除される
32 PropList.pItem = &Prop;
33 PropList.lCount = 1;
34 dma.PutPropertyValues(&PropList);

(6) エラー処理

ここでは,エラー処理をするプログラムのコーディング例を示します。

(a) データベースエラーが発生した場合のエラー処理

ここでは,データベースエラーが発生した場合のエラー処理をするコーディング例を示します。

1  int  MainFunc( … )
2  {
3    int retry_count = 3;
4    …
5    while (retry_count > 0) {
6        rc = UserFunc1(…);
7        If (rc == RC_RETRY) {
8           retry_count--;
9        }
10       else {
11          retry_count = 0;
12       }
13   }
14   …
15 }
16
17 Int  UserFunc1( … )
18 {
19   CdbrReferentialContainer FolderObj;
20   DmaInteger32  lmajor;
21   DmaInteger32  lminor;
22   DmaInteger32  lSQLCode;
23   pDmaString_T  pSQLState;
24
25   pSession->Begin();
26
27   brc = FolderObj.SetOIID( pSession, pOIID );
28   if  (brc == DMA_FALSE)  goto ERROR_EXIT;
29
30   brc = FolderObj.PutPropertyValues( 引数省略 );
31
32   if (brc == DMA_FALSE) {
33      lmajor = FolderObj.GetLastError(&lminor,&pErrorStrings);
34      if (lmajor == ERR_DB && (lminor == ERR_DB_LOCKED ||
35                     lminor == ERR_DB_DEADLOCK_OCCURRED) ) {
36         pSession->Rollback();      // ロールバック
37         return RC_RETRY;
38      }
39      else if (lmajor == ERR_DB && lminor == ERR_DB_FAILED) {
40         pSession->Rollback();      // ロールバック
41         FolderObj.GetDBError(&lSQLCode, &pSQLState);
42         cout << "DB ERROR! SQLCode:" << lSQLCode << endl;
43                                    //SQLCodeを出力する
44         cout << "DB ERROR! SQLState:" << pSQLState << endl;
45                                    //SQLSTATEを出力する
46         return RC_FAILED;
47      }
48      else {
49         …
50      }
51   }
52
53   pSession->Commit();              // コミット
54   return RC_OK;
55
56 ERROR_EXIT:
57    …  // 適切なエラー処理
58           return RC_FAILED;
59         }
60

(b) それ以外のエラーが発生したの場合のエラー処理

ここでは,データベースエラー以外が発生した場合の,単純なエラー処理をするコーディング例を示します。

1  int  MainFunc( … )
2  {
3      rc = UserFunc2( … );
4      If (rc == RC_FAILED) {
5         return FALSE;
6      }
7  }
8
9  Int  UserFunc2( … )
10 {
11     CdbrReferentialContainer FolderObj;
12     DmaInteger32  lmajor;
13     DmaInteger32  lminor;
14
15     pSession->Begin();
16
17     brc = FolderObj.SetOIID( pSession, pOIID );
18     if (brc == DMA_FALSE)  goto  ERROR_EXIT;
19
20     brc = FolderObj.PutPropertyValues( 引数省略 );
21     if (brc == DMA_FALSE)  goto  ERROR_EXIT;
22
23     pSession->Commit();                  //コミット
24     return RC_OK;
25
26 ERROR_EXIT:
27     pSession->Rollback();                //ロールバック
28     return RC_FAILED;
29          }

(c) 詳細メッセージを取得する場合のエラー処理

ここでは,エラー発生時に詳細メッセージを取得するコーディング例を示します。

1  int MainFunc(...)
2  {
3    /*セッションオブジェクトのポインタは*/
4    /*pSessionに格納されているものとする*/
5
6    rc = UserFunc3(pSession, ...);
7    if(rc == RC_FAILED) {
8      return FALSE;
9    }
10 }
11
12 int UserFunc3(CdbrSession* pSession,...)
13 {
14   CdbrReferentialContainer FolderObj;
15   DmaInteger32 lmajor;
16   DmaInteger32 lminor;
17   DmaInteger32 lSQLCode;
18   pDmaString_T pSQLState;
19   pDmaString_T pDetailErrorMessage = NULL;//詳細メッセージ用
20
21   pSession->Begin();
22  
23   brc = FolderObj.SetOIID(pSession,pOIID);
24   if(brc == DMA_FALSE) goto ERROR_EXIT;
25
26   brc = FolderObj.PutPropertyValues( 引数省略 );
27
28   if (brc == DMA_FALSE) {
29      lmajor = FolderObj.GetLastError(&lminor, &pErrorStrings);
30         if (lmajor == ERR_DB) {
31             FolderObj.GetDBError(&lSQLCode,&pSQLState);
32             cout << "DB ERROR! SQLCode:"<< lSQLCode << endl;
33                                        //SQLCodeを出力する
34             cout << "DB ERROR! SQLState:"<< pSQLState << endl;
35                                        //SQLStateを出力する
36
37      }
38
39     //
40     // 詳細メッセージを取得する
41     //
42     pSession->GetLastDetailError(&pDetailErrorMessage);
43     if(pDetailErrorMessage == NULL)
44     {
45        //詳細メッセージは存在しない
46      }
47     else
48     {
49        //詳細メッセージを画面に出力する
50        cout << "DETAIL ERROR :" << pDetailErrorMessage << endl;
51        dbrDelete(pDetailErrorMessage);
52     }
53
54   pSession->Rollback();  //ロールバック
55   return RC_FAILED;
56   }
57
58   pSession->Commit();    //コミット
59   return RC_OK;
60  
61 ERROR_EXIT:
62    …  //  適切なエラー処理を行う
63            return RC_FAILED;
64           }