ここでは,これまでに説明したコーディング例の機能を実現する,コーディング例を示します。
なお,(1)でクラスライブラリの処理の開始から終了までを示します。それ以降は,文書空間とクライアント環境のセッションはすでに確立されているものとして,各機能に当たる部分のコーディング例だけを示します。
ここでは,文書をフォルダ「業務」に格納するために,文書のパス名を業務のフォルダに関連づけるプログラムのコーディング例を示します。
図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 }
ここでは,特定の文書を指定して参照するプログラムのコーディング例を示します。文書はバージョン管理されています。ここで参照とは,文書の実体を,指定したファイルに複写することです。このコーディング例では,文書の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 }
ここでは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 }
ここでは,最新バージョンの文書をチェックアウトして,編集できるようにするプログラムのコーディング例を示します。
次の図に,文書をチェックアウトするシーケンスを示します。
図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 }
ここでは,チェックアウトした文書を,チェックインして登録するプログラムのコーディング例を示します。
次の図に,チェックアウトした文書をチェックインして登録するシーケンスを示します。
図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 }
ここでは,構成管理フォルダを新規に作成するプログラムのコーディング例を示します。
次の図に,構成管理フォルダを新規に作成するシーケンスを示します。
図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 }
ここでは,構成管理フォルダが管理している特定のバージョンの文書の一覧を取得するプログラムのコーディング例を示します。
次の図に,構成管理フォルダの構成要素の一覧を取得するシーケンスを示します。
図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 }
ここでは,構成管理フォルダが管理する文書のバージョンの構成管理モードである,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 }
ここでは,XML文書を新規登録する方法として,XMLファイルからDMA情報リストと構造指定検索用のインデクスデータを生成し,その情報を基に文書オブジェクトの作成と構造指定検索インデクスの登録をするコーディング例で説明します。なお,コーディング例中で使用しているエラー判定関数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 }
ここでは,CdbrVariableArrayクラスとCdbrCompoundクラスを使用したVariableArray型プロパティの操作について,コーディング例を示します。
このコーディング例では,次の図に示す,プロパティ「Name」とプロパティ「Age」を定義したedmClass_Structクラスのオブジェクトを要素に持つVariableArray型のプロパティついて説明します。
図A-11 サンプルコーディングで使用する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 }
可変長配列の要素は,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 }
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);
可変長配列の要素は,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);
可変長配列のすべての要素を一括して削除するには,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);
ここでは,エラー処理をするプログラムのコーディング例を示します。
ここでは,データベースエラーが発生した場合のエラー処理をするコーディング例を示します。
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
ここでは,データベースエラー以外が発生した場合の,単純なエラー処理をするコーディング例を示します。
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 }
ここでは,エラー発生時に詳細メッセージを取得するコーディング例を示します。
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 }