604
J2X1-1153-04Z0(00) 20104Windows/Solaris/Linux Interstage Shunsaku Data Manager アプリケーション開発ガイド

Interstage Shunsaku Data Manager - Fujitsusoftware.fujitsu.com/jp/manual/manualfiles/M100008/J2X...まえがき 本書の目的 本書は、Interstage Shunsaku Data Manager(以降、Shunsakuと略します)のAPIを使用したアプリケーションの作成方法に

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

J2X1-1153-04Z0(00)2010年4月

Windows/Solaris/Linux

Interstage Shunsaku Data Manager

アプリケーション開発ガイド

まえがき

本書の目的

本書は、Interstage Shunsaku Data Manager(以降、Shunsakuと略します)のAPIを使用したアプリケーションの作成方法に

ついて説明しています。

本書の読者

本書は、以下の読者を対象としています。

・ Shunsakuを利用して、システムを設計する人

・ Shunsakuを利用して、アプリケーションを開発する人

前提知識

本書を読む場合、以下の知識が必要です。

・ XMLに関する知識

・ Java言語に関する知識

・ .NETに関する知識

・ C言語に関する知識

・ インターネットに関する基本的な知識

Windowsの場合

・ Windowsに関する知識

Linuxの場合

・ Linuxに関する知識

Solarisの場合

・ Solaris(TM) オペレーティングシステムに関する知識

本書の構成

本書は以下の構成になっています。

第1部 アプリケーション開発の基本

第1章 概要

Shunsakuの機能概要について説明しています。

第2章 環境設定

Shunsakuのアプリケーションを作成するための環境設定について説明しています。

第3章 データを検索する方法

Shunsakuが提供するAPIの引数として指定する検索式、リターン式およびソート式を使用してデータを検索する方

法について説明しています。

第4章 データを更新する方法

ShunsakuのAPIを使用してデータを更新する方法について説明しています。

- i -

第5章 トランザクション機能

トランザクション機能の概要および利用方法について説明しています。

第6章 ダイレクトアクセス機能

ダイレクトアクセス機能の概要および利用方法について説明しています。

第7章 Shunsaku File

Shunsaku Fileの概要および利用方法について説明しています。

第8章 アプリケーションのデバッグ

アプリケーションのデバッグについて説明しています。

第2部 APIでのアプリケーション開発

第9章 Java APIのアプリケーション開発

ShunsakuのJava APIを利用したアプリケーション開発について説明しています。

第10章 .NET APIのアプリケーション開発

Shunsakuの.NET APIを利用したアプリケーション開発について説明しています。

第11章 C APIのアプリケーション開発

ShunsakuのC APIを利用したアプリケーション開発について説明しています。

第3部 その他のアプリケーション開発

第12章 XML変換機能

データベースまたはCSVファイルから、XML文書を格納しているテキストファイルを作成する方法について説明し

ています。

付録A API用動作環境ファイルの実行パラメタ

API用動作環境ファイルに定義する実行パラメタについて説明しています。

付録B 検索式、リターン式およびソート式の書式

ShunsakuのAPIの引数として指定する検索式、リターン式およびソート式の書式について説明しています。

付録C 定量値

Shunsakuのアプリケーション開発に関連する定量値について説明しています。

付録D 資源の見積り

アプリケーションでデータを検索、追加および削除する場合の資源の見積りについて説明しています。

付録E XML文書についての留意事項

Shunsakuに格納するXML文書の留意事項について説明しています。

付録F Java サンプルプログラム

Java APIを使用したサンプルプログラムを示しています。

付録G C# .NET サンプルプログラム

C# .NETを使用したサンプルプログラムを示しています。

付録H VB .NET サンプルプログラム

VB .NETを使用したサンプルプログラムを示しています。

付録I C++ .NET サンプルプログラム

C++ .NETを使用したサンプルプログラムを示しています。

- ii -

付録J C サンプルプログラム

C APIを使用したサンプルプログラムを示しています。

付録K XML変換機能のAPI

Shunsakuが提供するXML変換機能のAPIについて説明しています。

付録L XML変換機能のマッピングルール

XML変換機能で使用するマッピングルールの定義方法、適用例および変換例について説明しています。

付録M V6.0L20以前のJava API

V6.0L20以前に提供された、Javaのデータ検索および更新用APIの一覧を記載しています。

付録N V6.0L30以前のC API

V6.0L30以前に提供された、C言語で作成されたアプリケーションから利用するAPIの一覧を記載しています。

付録O V9.0.1以前のC API

V7.0からV9.0.1以前に提供された、C言語で作成されたアプリケーションから利用するAPIの一覧を記載しています。

出版年月および版数

平成19年 6月 初版

平成19年 8月 第2版

平成20年 6月 第3版

平成22年 4月 第4版

著作権表示

Copyright 2007-2010 FUJITSU LIMITED

- iii -

目 次

第1部 アプリケーション開発の基本.............................................................................................................................................1

第1章 概要................................................................................................................................................................................21.1 Shunsakuのアプリケーション機能.......................................................................................................................................................21.2 提供するAPI種別................................................................................................................................................................................41.3 Shunsakuのアプリケーションでできること............................................................................................................................................41.4 アプリケーションの設計.......................................................................................................................................................................5

第2章 環境設定.........................................................................................................................................................................62.1 APIの構成...........................................................................................................................................................................................6

2.1.1 Java API........................................................................................................................................................................................62.1.2 .NET API......................................................................................................................................................................................62.1.3 C API............................................................................................................................................................................................6

2.2 セットアップ..........................................................................................................................................................................................82.3 環境変数の設定..................................................................................................................................................................................8

2.3.1 環境変数の設定(Java API).........................................................................................................................................................82.3.2 環境変数の設定(C API)..............................................................................................................................................................8

2.4 動作環境ファイルの設定....................................................................................................................................................................92.4.1 APIがインストールされているマシン単位に指定する.................................................................................................................92.4.2 起動するアプリケーション単位に指定する................................................................................................................................102.4.3 実行パラメタの優先度................................................................................................................................................................11

2.5 アプリケーションの移行.....................................................................................................................................................................12

第3章 データを検索する方法....................................................................................................................................................133.1 データ検索の概要.............................................................................................................................................................................133.2 文字列で検索する.............................................................................................................................................................................14

3.2.1 キーワードを含む文書を検索する.............................................................................................................................................153.2.1.1 パス式、テキスト式または属性式の例................................................................................................................................163.2.1.2 キーワードの指定形式と検索方法.....................................................................................................................................17

3.2.2 キーワードと完全に一致する文書を検索する..........................................................................................................................233.2.3 キーワードと大小比較を行う......................................................................................................................................................23

3.3 数値で検索する.................................................................................................................................................................................243.4 複数の条件を論理演算子で結合して検索する...............................................................................................................................253.5 検索結果をソートする.......................................................................................................................................................................27

3.5.1 文字列でソートする....................................................................................................................................................................273.5.2 数値でソートする........................................................................................................................................................................303.5.3 複数のキー指定でソートする.....................................................................................................................................................32

3.6 検索結果を取り出す.........................................................................................................................................................................333.6.1 XML形式で取り出す.................................................................................................................................................................33

3.6.1.1 XML文書全体を取り出す...................................................................................................................................................333.6.1.2 要素ノードを指定してXML形式で取り出す......................................................................................................................34

3.6.2 テキスト形式でデータを取り出す...............................................................................................................................................363.7 集計した結果を取り出す...................................................................................................................................................................38

3.7.1 検索結果をグループ化する.......................................................................................................................................................383.7.1.1 文字列でグループ化する...................................................................................................................................................383.7.1.2 数値でグループ化する.......................................................................................................................................................403.7.1.3 複数のキー指定でグループ化する....................................................................................................................................41

3.7.2 検索結果を集計する..................................................................................................................................................................42

第4章 データを更新する方法....................................................................................................................................................464.1 データ更新の概要.............................................................................................................................................................................464.2 データを追加する..............................................................................................................................................................................474.3 データを削除する..............................................................................................................................................................................484.4 データを更新する..............................................................................................................................................................................49

第5章 トランザクション機能.......................................................................................................................................................51

- iv -

5.1 トランザクションの概要......................................................................................................................................................................515.1.1 トランザクションとは.....................................................................................................................................................................515.1.2 トランザクションの開始と終了.....................................................................................................................................................535.1.3 自動コミットと手動コミット............................................................................................................................................................545.1.4 更新されたデータの見え方.......................................................................................................................................................555.1.5 トランザクションの同時実行制御...............................................................................................................................................555.1.6 トランザクションとリカバリの関係................................................................................................................................................56

5.2 Java APIでトランザクションを使う......................................................................................................................................................565.2.1 エラー発生時の対処..................................................................................................................................................................60

5.3 .NET APIでトランザクションを使う....................................................................................................................................................605.3.1 エラー発生時の対処..................................................................................................................................................................64

5.4 C APIでトランザクションを使う...........................................................................................................................................................645.4.1 エラー発生時の対処..................................................................................................................................................................68

第6章 ダイレクトアクセス機能...................................................................................................................................................696.1 ダイレクトアクセス機能の概要...........................................................................................................................................................696.2 ダイレクトアクセスキー環境の構築...................................................................................................................................................70

6.2.1 ダイレクトアクセスキー定義ファイルの作成...............................................................................................................................716.2.2 ダイレクトアクセスキー定義ファイルの設定...............................................................................................................................726.2.3 ダイレクトアクセスキー定義ファイルの確認...............................................................................................................................74

6.3 ダイレクトアクセスキーの形式...........................................................................................................................................................746.4 ダイレクトアクセスキーでデータを検索する.....................................................................................................................................75

6.4.1 Java APIの場合..........................................................................................................................................................................766.4.2 .NET APIの場合........................................................................................................................................................................786.4.3 C APIの場合...............................................................................................................................................................................79

6.5 ダイレクトアクセスキーでデータを削除する.....................................................................................................................................816.5.1 Java APIの場合..........................................................................................................................................................................826.5.2 .NET APIの場合........................................................................................................................................................................836.5.3 C APIの場合...............................................................................................................................................................................85

6.6 ダイレクトアクセスキーでデータを更新する.....................................................................................................................................866.6.1 Java APIの場合..........................................................................................................................................................................876.6.2 .NET APIの場合........................................................................................................................................................................886.6.3 C APIの場合...............................................................................................................................................................................90

6.7 ダイレクトアクセス機能を使用したアプリケーション開発..................................................................................................................916.7.1 ダイレクト検索を使用したデータ削除/更新の使い方...............................................................................................................916.7.2 ダイレクト削除またはダイレクト更新の使い方...........................................................................................................................95

第7章 Shunsaku File...............................................................................................................................................................977.1 Shunsaku Fileの概要.........................................................................................................................................................................977.2 Shunsaku Fileへのアクセス方法.......................................................................................................................................................97

7.2.1 コネクション単位に指定する方法..............................................................................................................................................977.2.1.1 Java APIでの指定方法.......................................................................................................................................................977.2.1.2 .NET APIでの指定方法......................................................................................................................................................987.2.1.3 C APIでの指定方法............................................................................................................................................................99

7.2.2 API用動作環境ファイルに指定する方法..................................................................................................................................997.2.3 Shunsaku Fileが指定されていないアプリケーションのアクセス範囲の設定..........................................................................100

7.3 Shunsaku Fileを切り替える方法......................................................................................................................................................1017.3.1 Java APIでの指定方法............................................................................................................................................................1017.3.2 .NET APIでの指定方法...........................................................................................................................................................1027.3.3 C APIでの指定方法.................................................................................................................................................................103

7.4 複数のShunsaku Fileを1つのトランザクションで扱う方法..............................................................................................................1037.4.1 Java APIの記述例....................................................................................................................................................................1047.4.2 .NET APIの記述例..................................................................................................................................................................1067.4.3 C APIの記述例.........................................................................................................................................................................107

7.5 Shunsaku Fileの使用上の注意.......................................................................................................................................................1097.5.1 Shunsaku Fileを作成する場合の注意.....................................................................................................................................1097.5.2 APIによるデータ更新における注意........................................................................................................................................1107.5.3 ダイレクトアクセスにおける注意...............................................................................................................................................110

- v -

7.5.4 複数のShunsaku Fileを扱う場合の注意..................................................................................................................................1107.5.5 32ビットから64ビットへの移行時の注意...................................................................................................................................111

第8章 アプリケーションのデバッグ..........................................................................................................................................1138.1 アプリケーションのデバッグ方法.....................................................................................................................................................113

8.1.1 デバッガを利用したデバッグ...................................................................................................................................................1138.1.2 アプリケーションのデバッグ情報を利用したデバッグ.............................................................................................................1138.1.3 APIスナップを利用したデバッグ..............................................................................................................................................1138.1.4 Java APIのメソッド情報.............................................................................................................................................................1158.1.5 .NET APIのメソッド情報...........................................................................................................................................................1188.1.6 C APIの関数情報.....................................................................................................................................................................122

第2部 APIでのアプリケーション開発.......................................................................................................................................126

第9章 Java APIのアプリケーション開発..................................................................................................................................1279.1 Java APIの概要...............................................................................................................................................................................1279.2 StudioまたはApworksを利用したアプリケーション開発方法.........................................................................................................128

9.2.1 StudioまたはApworksで開発するメリット.................................................................................................................................1289.2.2 StudioまたはApworksを利用した開発の流れ.........................................................................................................................128

9.3 Java APIの使用方法.......................................................................................................................................................................1319.3.1 コネクションの確立...................................................................................................................................................................131

9.3.1.1 API用動作環境ファイルの設定によりコネクションを確立する方法................................................................................1319.3.1.2 JavaのPropertiesの設定によりコネクションを確立する方法.............................................................................................1329.3.1.3 ホスト名とポート番号を直接指定する方法.......................................................................................................................132

9.3.2 データの検索............................................................................................................................................................................1339.3.2.1 条件に一致するXML文書の件数を取得する.................................................................................................................1339.3.2.2 件数に応じて検索した結果を取得する............................................................................................................................1369.3.2.3 条件を追加しながら検索した結果を取得する.................................................................................................................1409.3.2.4 ヒット件数の上限値を設定する.........................................................................................................................................1419.3.2.5 レコードIDの取出し...........................................................................................................................................................1439.3.2.6 レコードIDを利用してXML文書全体を取得する............................................................................................................1459.3.2.7 データをソートして取得する..............................................................................................................................................1479.3.2.8 条件に一致するXML文書を連続して取得する..............................................................................................................1529.3.2.9 条件に一致するデータの内容を集計する.......................................................................................................................156

9.3.3 データの更新............................................................................................................................................................................1609.3.3.1 データを追加する..............................................................................................................................................................1609.3.3.2 レコードIDを指定してデータを削除する..........................................................................................................................1629.3.3.3 レコードIDを指定してデータを更新する..........................................................................................................................163

9.3.4 コネクションの切断...................................................................................................................................................................1659.3.5 エラー発生時の対処................................................................................................................................................................166

9.3.5.1 エラー発生時の対処例.....................................................................................................................................................1679.4 アプリケーションのデバッグ.............................................................................................................................................................1689.5 Java APIで使用する文字コード......................................................................................................................................................168

第10章 .NET APIのアプリケーション開発...............................................................................................................................17010.1 .NET APIの概要...........................................................................................................................................................................17010.2 Microsoft(R) Visual Studio(R) .NETを利用したアプリケーション開発方法...............................................................................172

10.2.1 Microsoft(R) Visual Studio(R) .NETで開発するメリット........................................................................................................17210.2.2 Microsoft(R) Visual Studio(R) .NETを利用した開発...........................................................................................................173

10.2.2.1 Shunsakuと連携するWebアプリケーションの構成..........................................................................................................17310.2.2.2 Shunsakuと連携するWebアプリケーションの開発の流れ..............................................................................................174

10.3 .NET APIの使用方法...................................................................................................................................................................17510.3.1 コネクションの確立.................................................................................................................................................................175

10.3.1.1 API用動作環境ファイルの設定によりコネクションを確立する方法..............................................................................17510.3.1.2 ホスト名とポート番号をプロパティで指定する方法........................................................................................................17610.3.1.3 ホスト名とポート番号をコンストラクタで指定する方法....................................................................................................176

10.3.2 データの検索..........................................................................................................................................................................17710.3.2.1 条件に一致するXML文書の件数を取得する...............................................................................................................177

- vi -

10.3.2.2 件数に応じて検索した結果を取得する..........................................................................................................................17810.3.2.3 条件を追加しながら検索した結果を取得する...............................................................................................................18110.3.2.4 データをソートして取得する............................................................................................................................................18210.3.2.5 レコードIDを利用してXML文書全体を取得する..........................................................................................................18510.3.2.6 ヒット件数の上限値を設定する.......................................................................................................................................18810.3.2.7 条件に一致するXML文書を連続して取得する............................................................................................................19010.3.2.8 条件に一致するデータの内容を集計する.....................................................................................................................194

10.3.3 データの更新..........................................................................................................................................................................19610.3.3.1 データを追加する............................................................................................................................................................19710.3.3.2 レコードIDを指定してデータを削除する........................................................................................................................19910.3.3.3 レコードIDを指定してデータを更新する........................................................................................................................201

10.3.4 コネクションの切断.................................................................................................................................................................20410.3.5 エラー発生時の対処..............................................................................................................................................................205

10.4 アプリケーションのデバッグ...........................................................................................................................................................20710.5 .NET APIで使用する文字コード..................................................................................................................................................208

第11章 C APIのアプリケーション開発.....................................................................................................................................20911.1 C APIの概要..................................................................................................................................................................................209

11.1.1 ハンドルの使用方法...............................................................................................................................................................21011.1.2 コネクションハンドル...............................................................................................................................................................21211.1.3 データ操作ハンドル...............................................................................................................................................................21211.1.4 共通関数................................................................................................................................................................................213

11.2 C APIの使用方法..........................................................................................................................................................................21311.2.1 コネクションの確立.................................................................................................................................................................213

11.2.1.1 API用動作環境ファイルの設定によりコネクションを確立する方法..............................................................................21311.2.1.2 ホスト名とポート番号を直接指定する方法.....................................................................................................................214

11.2.2 データの検索..........................................................................................................................................................................21411.2.2.1 条件に一致するXML文書の件数を取得する...............................................................................................................21511.2.2.2 件数に応じて検索した結果を取得する..........................................................................................................................21611.2.2.3 条件を追加しながら検索した結果を取得する...............................................................................................................21711.2.2.4 ヒット件数の上限値を設定する.......................................................................................................................................21811.2.2.5 レコードIDを利用してXML文書全体を取得する..........................................................................................................22011.2.2.6 データをソートして取得する............................................................................................................................................22211.2.2.7 条件に一致するXML文書を連続して取得する............................................................................................................22411.2.2.8 条件に一致するデータの内容を集計する.....................................................................................................................227

11.2.3 データの更新..........................................................................................................................................................................22911.2.3.1 データを追加する............................................................................................................................................................22911.2.3.2 レコードIDを指定してデータを削除する........................................................................................................................23011.2.3.3 レコードIDを指定してデータを更新する........................................................................................................................232

11.2.4 コネクションの切断.................................................................................................................................................................23311.2.5 エラー発生時の対処..............................................................................................................................................................233

11.2.5.1 エラー発生時の対処例...................................................................................................................................................23411.3 アプリケーションのデバッグ...........................................................................................................................................................23611.4 C APIで使用する文字コード........................................................................................................................................................236

第3部 その他のアプリケーション開発......................................................................................................................................237

第12章 XML変換機能............................................................................................................................................................23812.1 XML変換機能の概要...................................................................................................................................................................238

12.1.1 データベースからXML文書への変換...................................................................................................................................23812.1.2 CSVファイルからXML文書への変換....................................................................................................................................239

12.2 XML変換機能の設計...................................................................................................................................................................23912.2.1 入力データソースの決定.......................................................................................................................................................23912.2.2 XML文書構造の決定............................................................................................................................................................24012.2.3 XML文書の出力形式を決定................................................................................................................................................242

12.3 XML変換機能のAPIのセットアップ.............................................................................................................................................24212.3.1 APIの構成..............................................................................................................................................................................24312.3.2 環境変数の設定.....................................................................................................................................................................243

- vii -

12.4 マッピングルールファイルの作成.................................................................................................................................................24412.5 アプリケーションの設計.................................................................................................................................................................244

12.5.1 API一覧..................................................................................................................................................................................24612.5.2 XML変換機能を用いたアプリケーションの処理手順..........................................................................................................246

12.5.2.1 データベースからXML文書に変換する場合の処理手順.............................................................................................24612.5.2.2 CSVファイルからXML文書に変換する場合の処理手順..............................................................................................248

12.6 APIの使用例.................................................................................................................................................................................25012.6.1 起動開始からResultSetの取得まで(データベースのレコード).............................................................................................25112.6.2 起動開始からResultSetの取得まで(CSVファイル)................................................................................................................25212.6.3 XMLGeneratorの生成からXML文書の取得........................................................................................................................25312.6.4 XML変換機能のサンプルプログラム....................................................................................................................................257

12.7 XML変換機能の対応するデータ型............................................................................................................................................25712.8 XML変換機能の対応するCSV形式............................................................................................................................................259

付録A API用動作環境ファイルの実行パラメタ........................................................................................................................262A.1 API用動作環境ファイルの実行パラメタの種類............................................................................................................................262A.2 API用動作環境ファイルの実行パラメタの意味............................................................................................................................263A.3 API用動作環境ファイルの実行パラメタの記述例........................................................................................................................265

付録B 検索式、リターン式およびソート式の書式.....................................................................................................................267B.1 文法の表記方法.............................................................................................................................................................................267B.2 共通の書式.....................................................................................................................................................................................267

B.2.1 パス式.......................................................................................................................................................................................268B.2.2 テキスト式.................................................................................................................................................................................269B.2.3 属性式......................................................................................................................................................................................271B.2.4 単一行関数指定......................................................................................................................................................................272

B.3 検索式.............................................................................................................................................................................................274B.3.1 条件式......................................................................................................................................................................................275B.3.2 キーワード................................................................................................................................................................................277B.3.3 エスケープ文字.......................................................................................................................................................................278B.3.4 パターン...................................................................................................................................................................................279B.3.5 文字列......................................................................................................................................................................................286B.3.6 数値..........................................................................................................................................................................................288B.3.7 互換形式..................................................................................................................................................................................290B.3.8 フィルタ式.................................................................................................................................................................................290

B.4 リターン式........................................................................................................................................................................................293B.4.1 集計を行わない場合の書式...................................................................................................................................................293B.4.2 集計を行わない場合のリターン式指定例..............................................................................................................................295B.4.3 集計を行う場合の書式............................................................................................................................................................300B.4.4 集計を行う場合のリターン式指定例.......................................................................................................................................303

B.5 ソート式...........................................................................................................................................................................................306B.5.1 ソート式の書式.........................................................................................................................................................................306B.5.2 ソート式の指定例.....................................................................................................................................................................310

付録C 定量値........................................................................................................................................................................315C.1 検索式およびリターン式の定量値.................................................................................................................................................315C.2 ソート依頼における定量値.............................................................................................................................................................315C.3 集計依頼における定量値..............................................................................................................................................................317C.4 ダイレクトアクセスにおける定量値.................................................................................................................................................318

付録D 資源の見積り..............................................................................................................................................................320D.1 Java APIを使用した場合のローカルメモリ量の見積り..................................................................................................................320D.2 .NET APIを使用した場合のローカルメモリ量の見積り.................................................................................................................321D.3 C APIを使用した場合のローカルメモリ量の見積り.......................................................................................................................322

付録E XML文書についての留意事項.....................................................................................................................................324E.1 XML文書の書式............................................................................................................................................................................324E.2 データベース上のXML文書..........................................................................................................................................................324

- viii -

E.3 テキストファイルのXML文書..........................................................................................................................................................325E.4 XML形式に関する留意事項.........................................................................................................................................................327

E.4.1 DTD宣言に属性のデフォルト値を設定した場合...................................................................................................................327E.4.2 要素名の 初の文字に@を使用している場合......................................................................................................................328

付録F Java サンプルプログラム.............................................................................................................................................330F.1 データの検索..................................................................................................................................................................................330

F.1.1 検索条件に一致するXML文書の件数を求める....................................................................................................................332F.1.2 検索条件に一致するXML文書を指定した形式で取得する.................................................................................................334F.1.3 特定のXML文書をすべて取得する.......................................................................................................................................337F.1.4 検索条件に一致するXML文書をソートして取得する............................................................................................................340F.1.5 検索条件に一致するXML文書の値を集計して取得する.....................................................................................................342F.1.6 ヒット件数の上限値を設定する................................................................................................................................................345

F.2 データの更新..................................................................................................................................................................................348F.2.1 データを追加する....................................................................................................................................................................348F.2.2 データを削除する....................................................................................................................................................................350F.2.3 データを更新する....................................................................................................................................................................353

F.3 拡張的なアプリケーション...............................................................................................................................................................356F.3.1 トランザクションとShunsaku Fileを使ったサンプル..................................................................................................................356F.3.2 ダイレクトアクセスキーを使用してデータを検索する..............................................................................................................361F.3.3 ダイレクトアクセスキーを使用してデータを削除する..............................................................................................................363F.3.4 ダイレクトアクセスキーを使用してデータを更新する..............................................................................................................366

付録G C# .NET サンプルプログラム......................................................................................................................................369G.1 データの検索..................................................................................................................................................................................369

G.1.1 検索条件に一致するXML文書の件数を求める....................................................................................................................371G.1.2 検索条件に一致するXML文書を指定した形式で取得する.................................................................................................372G.1.3 特定のXML文書をすべて取得する.......................................................................................................................................374G.1.4 検索条件に一致するXML文書をソートして取得する...........................................................................................................376G.1.5 検索条件に一致するXML文書の値を集計して取得する.....................................................................................................377G.1.6 ヒット件数の上限値を設定する...............................................................................................................................................379

G.2 データの更新..................................................................................................................................................................................380G.2.1 データを追加する....................................................................................................................................................................381G.2.2 データを削除する....................................................................................................................................................................382G.2.3 データを更新する....................................................................................................................................................................384

G.3 拡張的なアプリケーション..............................................................................................................................................................385G.3.1 トランザクションとShunsaku Fileを使ったサンプル.................................................................................................................385G.3.2 ダイレクトアクセスキーを使用してデータを検索する.............................................................................................................388G.3.3 ダイレクトアクセスキーを使用してデータを削除する.............................................................................................................389G.3.4 ダイレクトアクセスキーを使用してデータを更新する.............................................................................................................391

付録H VB .NET サンプルプログラム......................................................................................................................................394H.1 データの検索..................................................................................................................................................................................394

H.1.1 検索条件に一致するXML文書の件数を求める....................................................................................................................396H.1.2 検索条件に一致するXML文書を指定した形式で取得する.................................................................................................397H.1.3 特定のXML文書をすべて取得する.......................................................................................................................................399H.1.4 検索条件に一致するXML文書をソートして取得する...........................................................................................................401H.1.5 検索条件に一致するXML文書の値を集計して取得する.....................................................................................................402H.1.6 ヒット件数の上限値を設定する...............................................................................................................................................404

H.2 データの更新..................................................................................................................................................................................405H.2.1 データを追加する....................................................................................................................................................................406H.2.2 データを削除する....................................................................................................................................................................407H.2.3 データを更新する....................................................................................................................................................................409

H.3 拡張的なアプリケーション..............................................................................................................................................................411H.3.1 トランザクションとShunsaku Fileを使ったサンプル.................................................................................................................411H.3.2 ダイレクトアクセスキーを使用してデータを検索する.............................................................................................................413H.3.3 ダイレクトアクセスキーを使用してデータを削除する.............................................................................................................415H.3.4 ダイレクトアクセスキーを使用してデータを更新する.............................................................................................................416

- ix -

付録I C++ .NET サンプルプログラム......................................................................................................................................419I.1 データの検索...................................................................................................................................................................................419

I.1.1 検索条件に一致するXML文書の件数を求める.....................................................................................................................421I.1.2 検索条件に一致するXML文書を指定した形式で取得する..................................................................................................422I.1.3 特定のXML文書をすべて取得する........................................................................................................................................424I.1.4 検索条件に一致するXML文書をソートして取得する.............................................................................................................426I.1.5 検索条件に一致するXML文書の値を集計して取得する......................................................................................................428I.1.6 ヒット件数の上限値を設定する.................................................................................................................................................430

I.2 データの更新...................................................................................................................................................................................431I.2.1 データを追加する.....................................................................................................................................................................432I.2.2 データを削除する.....................................................................................................................................................................433I.2.3 データを更新する.....................................................................................................................................................................435

I.3 拡張的なアプリケーション................................................................................................................................................................437I.3.1 トランザクションとShunsaku Fileを使ったサンプル...................................................................................................................437I.3.2 ダイレクトアクセスキーを使用してデータを検索する...............................................................................................................439I.3.3 ダイレクトアクセスキーを使用してデータを削除する...............................................................................................................441I.3.4 ダイレクトアクセスキーを使用してデータを更新する...............................................................................................................443

付録J C サンプルプログラム..................................................................................................................................................446J.1 データの検索...................................................................................................................................................................................446

J.1.1 検索条件に一致するXML文書の件数を求める.....................................................................................................................448J.1.2 検索条件に一致するXML文書を指定した形式で取得する..................................................................................................451J.1.3 特定のXML文書をすべて取得する........................................................................................................................................454J.1.4 検索条件に一致するXML文書をソートして取得する............................................................................................................459J.1.5 検索条件に一致するXML文書の値を集計して取得する......................................................................................................462J.1.6 ヒット件数の上限値を設定する.................................................................................................................................................466

J.2 データの更新...................................................................................................................................................................................470J.2.1 データを追加する.....................................................................................................................................................................470J.2.2 データを削除する.....................................................................................................................................................................473J.2.3 データを更新する.....................................................................................................................................................................477

J.3 拡張的なアプリケーション................................................................................................................................................................481J.3.1 トランザクションとShunsaku Fileを使ったサンプル...................................................................................................................481J.3.2 ダイレクトアクセスキーを使用してデータを検索する...............................................................................................................486J.3.3 ダイレクトアクセスキーを使用してデータを削除する...............................................................................................................490J.3.4 ダイレクトアクセスキーを使用してデータを更新する...............................................................................................................493

付録K XML変換機能のAPI....................................................................................................................................................497K.1 DocumentFountainインタフェース..................................................................................................................................................499

K.1.1 getXMLDocument...................................................................................................................................................................499K.1.2 hasXMLDocument...................................................................................................................................................................500K.1.3 setDestination...........................................................................................................................................................................500K.1.4 setEncoding..............................................................................................................................................................................501

K.2 CSVSourceクラス............................................................................................................................................................................502K.2.1 CSVSource...............................................................................................................................................................................502K.2.2 setEncoding..............................................................................................................................................................................502K.2.3 setDelimiter..............................................................................................................................................................................503K.2.4 setQuote...................................................................................................................................................................................504K.2.5 setNullCharacter......................................................................................................................................................................505K.2.6 setFirstRecordToColumn.........................................................................................................................................................506K.2.7 setRandomMode......................................................................................................................................................................506K.2.8 getResultSet.............................................................................................................................................................................507K.2.9 setEnableEscapeChar...............................................................................................................................................................508

K.3 GeneratorMapクラス........................................................................................................................................................................509K.3.1 GeneratorMap..........................................................................................................................................................................509

K.4 XMLGeneratorクラス......................................................................................................................................................................509K.4.1 XMLGenerator.........................................................................................................................................................................509K.4.2 createDocumentFountain.........................................................................................................................................................510

K.5 XMLConverterExceptionクラス......................................................................................................................................................511

- x -

K.5.1 getCode....................................................................................................................................................................................511K.5.2 getException............................................................................................................................................................................512K.5.3 getMessage...............................................................................................................................................................................512

K.6 CSVExceptionクラス.......................................................................................................................................................................513K.6.1 CSVException..........................................................................................................................................................................513

K.7 XMLGenExceptionクラス...............................................................................................................................................................515K.7.1 XMLGenException..................................................................................................................................................................515

K.8 XML変換機能のAPI使用時に出力されるエラーコード...............................................................................................................517

付録L XML変換機能のマッピングルール................................................................................................................................524L.1 マッピングルールファイルの定義書式...........................................................................................................................................524

L.1.1 MappingRule............................................................................................................................................................................525L.1.2 parentRule................................................................................................................................................................................526L.1.3 columnRule..............................................................................................................................................................................527L.1.4 attributeRule.............................................................................................................................................................................531L.1.5 documentRule...........................................................................................................................................................................533L.1.6 extensionRule...........................................................................................................................................................................534

L.2 マッピングルールの適用例............................................................................................................................................................535L.3 マッピングルールの変換例............................................................................................................................................................537

L.3.1 タグ階層なしの抽出パターン..................................................................................................................................................537L.3.2 タグ階層ありの抽出パターン...................................................................................................................................................538L.3.3 固定値を抽出するパターン.....................................................................................................................................................539L.3.4 列のデータを属性として抽出するパターン............................................................................................................................540L.3.5 列のデータを固定属性として抽出するパターン....................................................................................................................541L.3.6 列名を属性として抽出するパターン.......................................................................................................................................542L.3.7 集約によるタグ階層ありの抽出パターン.................................................................................................................................544L.3.8 バイナリデータを抽出するパターン........................................................................................................................................545

付録M V6.0L20以前のJava API............................................................................................................................................547M.1 ShunSearchクラス...........................................................................................................................................................................548

M.1.1 create.......................................................................................................................................................................................548M.1.2 executeSearch1........................................................................................................................................................................549M.1.3 executeSearch2........................................................................................................................................................................550M.1.4 executeSearch3........................................................................................................................................................................551M.1.5 getHitCount.............................................................................................................................................................................552M.1.6 getRetNum..............................................................................................................................................................................553M.1.7 getRecNo.................................................................................................................................................................................553M.1.8 getRecData..............................................................................................................................................................................554

M.2 ShunBatchクラス.............................................................................................................................................................................555M.2.1 ShunBatch...............................................................................................................................................................................555M.2.2 executeAdd..............................................................................................................................................................................557M.2.3 executeDelete..........................................................................................................................................................................557

M.3 文字コード......................................................................................................................................................................................559M.4 出力されるエラーコード.................................................................................................................................................................559

付録N V6.0L30以前のC API.................................................................................................................................................563N.1 shunadd...........................................................................................................................................................................................563N.2 shundeletebyrecid...........................................................................................................................................................................564N.3 shunsearch1.....................................................................................................................................................................................566N.4 shunsearch2.....................................................................................................................................................................................567N.5 shunsearch3.....................................................................................................................................................................................571N.6 shunsort...........................................................................................................................................................................................576N.7 出力されるエラーコード..................................................................................................................................................................581

付録O V9.0.1以前のC API....................................................................................................................................................583O.1 ShunGetConnectAttr.......................................................................................................................................................................583O.2 ShunSetConnectAttr.......................................................................................................................................................................584

索引......................................................................................................................................................................................587

- xi -

第1部 アプリケーション開発の基本第1部では、ShunsakuのAPIを使用したアプリケーション開発の基本的な利用方法について説明します。

第1章 概要....................................................................................................................................2

第2章 環境設定.............................................................................................................................6

第3章 データを検索する方法.......................................................................................................13

第4章 データを更新する方法.......................................................................................................46

第5章 トランザクション機能..........................................................................................................51

第6章 ダイレクトアクセス機能.......................................................................................................69

第7章 Shunsaku File..................................................................................................................97

第8章 アプリケーションのデバッグ..............................................................................................113

- 1 -

第1章 概要

本章では、ShunsakuのAPIを使用したアプリケーション開発の概要について説明します。

1.1 Shunsakuのアプリケーション機能

Shunsakuのアプリケーション機能では、以下を提供しています。

・ データの検索

・ データの更新

・ ダイレクトアクセス

・ Shunsaku File

・ データのXML変換機能

データの検索

ShunsakuのAPIを使用して、データ検索を行うアプリケーションを作成できます。

データの検索の詳細については、“第3章 データを検索する方法”を参照してください。

データの更新

ShunsakuのAPIを使用して、データ更新を行うアプリケーションを作成できます。また、複数のデータを更新する場合、

データの整合性を保証するために、トランザクション機能を利用することもできます。

- 2 -

データの更新の詳細については、“第4章 データを更新する方法”を参照してください。

トランザクションの詳細については、“第5章 トランザクション機能”を参照してください。

ダイレクトアクセス

XML文書中でデータを特定できるキー(ダイレクトアクセスキー)を使用して、データの検索および更新を行うことができま

す。アプリケーションからのキー情報により、Shunsakuではサーチサーバの全データを検索することなく、ダイレクトにdirectorからデータを返却することができます。通常のデータ検索および更新処理と比べ、対象XML文書のレコードIDを取得す

る必要がないので、より迅速なデータ検索およびデータ更新を行うことができます。

ダイレクトアクセスの詳細については、“第6章 ダイレクトアクセス機能”を参照してください。

Shunsaku File

複数のdirectorが持つディレクタデータをグルーピングし、Fileとして定義します。アプリケーションにShunsaku File名を指

定してShunsakuに接続することで、グルーピングされたディレクタデータにアクセスすることができます。また、接続中に

アクセスするShunsaku Fileを切り替えることもできるため、関連しあうディレクタデータを同時に処理することもできます。

Shunsaku Fileの詳細については、“第7章 Shunsaku File”を参照してください。

- 3 -

データのXML変換機能

RDBMSに格納されているデータまたはCSVファイルに格納されているデータを、XML文書に変換するAPIを提供して

います。

データのXML変換の詳細については、“第12章 XML変換機能”を参照してください。

1.2 提供するAPI種別

Shunsakuでは、以下のAPIを提供しています。

・ Java API

・ .NET API

・ C API

Shunsakuシステムのサーバ環境や業務の目的に合わせて、使用する言語やAPIを選択してください。

図1.1 Shunsakuが対応しているアプリケーション開発環境

各APIの詳細については、“第2部 APIでのアプリケーション開発”を参照してください。

1.3 Shunsakuのアプリケーションでできること

ShunsakuのAPIで使用できる機能について、以下に示します。

表1.1 表:ShunsakuのAPIで使用できる機能

機能 Java API .NET API C API 参照箇所

データ検索 ○ ○ ○ 第3章

データ更新 ○ ○ ○ 第4章

- 4 -

機能 Java API .NET API C API 参照箇所

トランザクション ○ ○ ○ 第5章

ダイレクトアクセス ○ ○ ○ 第6章

Shunsaku File ○ ○ ○ 第7章

データのXML変換

○ × × 第12章

アプリケーション

のデバッグ○ ○ ○ 第8章

参照箇所 第9章 第10章 第11章 -

○:使用できる

×:使用できない

1.4 アプリケーションの設計

ShunsakuのAPIを使用したアプリケーションの設計に関しては、一般のアプリケーションと同じです。現在使用しているア

プリケーションサーバ製品のマニュアルを参照してください。

特に、ShunsakuのAPIで注意すべき事項について、以下に説明します。

文字コード系の考慮

アプリケーションが使用する文字コード系と、Shunsakuに格納されるデータの文字コード系が異なる場合、どこで、変換

するかなど注意する必要があります。

Shunsakuで扱える文字コードについては、“導入・運用ガイド”の“文字コードの決定”を参照してください。

APIごとに使用する文字コードについては、以下を参照してください。

・ Java APIで使用する文字コード

・ .NET APIで使用する文字コード

・ C APIで使用する文字コード

アプリケーションとコマンドの競合関係

同一データに対して、アプリケーションおよびコマンドが同時に動作した場合に、それぞれの処理を矛盾なく実行するために

Shunsakuが制御を行います。

詳細については、“導入・運用ガイド”の“アプリケーションとコマンドの競合関係”を参照してください。

64ビット用のアプリケーションの作成

64ビット用のアプリケーションを新規作成する場合は、本書の付録に掲載されている以下のAPIは使用しないでください。

・ 付録M V6.0L20以前のJava API

・ 付録N V6.0L30以前のC API

・ 付録O V9.0.1以前のC API

- 5 -

第2章 環境設定

本章では、Shunsakuのアプリケーションを作成するための環境設定について説明します。

2.1 APIの構成

ShunsakuのAPIの構成について説明します。

2.1.1 Java APIJava APIの構成について説明します。

Java APIのファイル構成

ShunsakuのAPIをインストールすると、以下のようなjar形式のファイルが作成されます。

Shunsakuのインストール先のフォルダ\Shunsaku\lib\shunapi.jar

/opt/FJSVshnsk/lib/shunapi.jar

APIパッケージ(shunapi.jar)

アプリケーションを作成するためのJavaクラスが格納されています。

ShunsakuのAPIが提供する各メソッドを用いることで使用できる機能については、“Java APIリファレンス”を参照してくだ

さい。

2.1.2 .NET API.NET APIの構成について説明します。

.NET APIのファイル構成

ShunsakuのAPIをインストールすると、以下のアセンブリファイルが格納されます。

Shunsakuのインストール先のフォルダ\Shunsaku\lib:

- Fujitsu.Shunsaku.dll(Shunsaku APIアセンブリ)

- policy.8.0.Fujitsu.Shunsaku.dll (Shunsaku API発行者ポリシーアセンブリ)

ShunsakuのAPIが提供する各メソッドを用いることで使用できる機能については、“.NET APIリファレンス”を参照して

ください。

2.1.3 C APIC APIの構成について説明します。

- 6 -

C APIのディレクトリ構成

ShunsakuのAPIをインストールすると、以下のようなディレクトリにインクルードファイルおよびライブラリが作成されます。

Shunsakuのインストール先のフォルダ\Shunsaku\include :

ShunsakuのAPIが提供するインクルードファイル

Shunsakuのインストール先のフォルダ\Shunsaku\lib :

ShunsakuのAPIが提供するライブラリ

/opt/FJSVshnsk/include :

ShunsakuのAPIが提供するインクルードファイル

/opt/FJSVshnsk/lib :

ShunsakuのAPIが提供するライブラリ

インクルードファイル

ShunsakuのAPIの各関数が参照するインクルードファイルが格納されています。

ShunsakuのAPIが提供するインクルードファイルを以下に示します。

インクルードファイル名 用途

libshun.h ShunsakuのAPIが提供する関数から参

照されます。

ライブラリ

アプリケーションを作成するためのC関数ライブラリとして、以下のファイルが格納されています。

・ f3hyshun.lib

・ f3hyshun64.lib(注)

・ libshun.so

・ libshun64.so(注)

注)64ビット用の基本ソフトウェアにインストールした場合に格納されます。

ポイント

Windows環境でアプリケーションを作成する場合、マルチスレッド用のコンパイラオプションには、“/MD”を指定してくだ

さい。

ShunsakuのAPIが提供するライブラリを用いることで使用できる機能については、“C APIリファレンス”を参照してくださ

い。

- 7 -

2.2 セットアップ

アプリケーションを配置するサーバへのShunsakuのAPIのインストールについては、“インストールガイド”を参照してくだ

さい。

2.3 環境変数の設定

ShunsakuのAPIを使用するのに必要な環境変数の設定について説明します。

2.3.1 環境変数の設定(Java API)ShunsakuのJava APIを使用するのに必要な環境変数を設定します。

環境変数CLASSPATHにshunapi.jarを追加します。

以下に、環境変数の設定例を示します。

Shunsakuを標準インストールした場合

SET CLASSPATH=C:\InterstageShunsaku\Shunsaku\lib\shunapi.jar;%CLASSPATH%

例1

bash、BシェルまたはKシェルの場合

CLASSPATH=/opt/FJSVshnsk/lib/shunapi.jar:$CLASSPATH; export CLASSPATH

例2

Cシェルの場合

setenv CLASSPATH /opt/FJSVshnsk/lib/shunapi.jar:$CLASSPATH

2.3.2 環境変数の設定(C API)ShunsakuのC APIを使用するのに必要な環境変数を設定します。

環境変数LD_LIBRARY_PATHに/opt/FJSVshnsk/libを追加します。

以下に、環境変数の設定例を示します。

例1

bash、BシェルまたはKシェルの場合

LD_LIBRARY_PATH=/opt/FJSVshnsk/lib:$LD_LIBRARY_PATH ; export LD_LIBRARY_PATH

例2

Cシェルの場合

- 8 -

setenv LD_LIBRARY_PATH /opt/FJSVshnsk/lib:$LD_LIBRARY_PATH

2.4 動作環境ファイルの設定

Java API、.NET APIおよびC APIの動作環境ファイル(以降、API用動作環境ファイルと略します)の設定について説明

します。

API用動作環境ファイルには、以下の情報を設定します。

・ 接続先のホスト名およびポート番号

・ 接続先のShunsaku File名

・ Shunsakuからの 大応答待ち時間

・ APIスナップ機能の設定

API用動作環境ファイルを設定することにより、アプリケーションをリコンパイルすることなく動作環境の変更が可能となり

ます。

API用動作環境ファイルの指定方法には以下の2つがあります。

・ APIがインストールされているマシン単位に指定する方法

・ 起動するアプリケーション単位に指定する方法

参照

API用動作環境ファイルの設定内容については、“付録A API用動作環境ファイルの実行パラメタ”を参照してください。

2.4.1 APIがインストールされているマシン単位に指定する

APIがインストールされているマシン単位に指定する方法について説明します。

1. API用動作環境ファイルは、以下のサンプルのAPI用動作環境ファイルを複写して、編集します。

Shunsakuのインストール先のフォルダ\Shunsaku\etc\api\api.cfg-sample

/etc/opt/FJSVshnsk/etc/api/api.cfg-sample

2. 編集したAPI用動作環境ファイルは、サンプルと同じフォルダにapi.cfgというファイル名で格納します。

Shunsakuのインストール先のフォルダ\Shunsaku\etc\api\api.cfg

/etc/opt/FJSVshnsk/etc/api/api.cfg

- 9 -

注意

API用動作環境ファイルが存在しない場合もAPIは動作します。この場合は、APIで保持している省略値で動作します。

詳細については、“Java APIリファレンス”、“.NET APIリファレンス”、“C APIリファレンス”または“付録A API用動作環境

ファイルの実行パラメタ”を参照してください。

2.4.2 起動するアプリケーション単位に指定する

起動するアプリケーション単位に指定する方法について説明します。

API用動作環境ファイルは、以下のサンプルのAPI用動作環境ファイルを複写して、編集します。

Shunsakuのインストール先のフォルダ\Shunsaku\etc\api\api.cfg-sample

/etc/opt/FJSVshnsk/etc/api/api.cfg-sample

アプリケーション単位にAPI用動作環境ファイルを指定する場合は、サンプルと同じフォルダに格納する必要はありませ

ん。利用するAPIの種別ごとに、以下のように指定してください。

Java API

アプリケーション実行時に、Dオプションにより、システムプロパティ “com.fujitsu.shunsaku.api.configfile”にAPI用動作環

境ファイルのパスを絶対パスで指定します。

アプリケーション“app”で使用するAPI用動作環境ファイルに“D:\temp\api\api.cfg”を指定する場合

java -Dcom.fujitsu.shunsaku.api.configfile=D:\temp\api\api.cfg app

アプリケーション“app”で使用するAPI用動作環境ファイルに“/tmp/api/api.cfg”を指定する場合

java -Dcom.fujitsu.shunsaku.api.configfile=/tmp/api/api.cfg app

.NET API

環境変数SHUN_API_CONFIGにAPI用動作環境ファイルの絶対パスを指定します。

使用するAPI用動作環境ファイルに“D:\temp\api\api.cfg”を指定する場合

SET SHUN_API_CONFIG=D:\temp\api\api.cfg

- 10 -

C API

環境変数SHUN_API_CONFIGにAPI用動作環境ファイルの絶対パスを指定します。

使用するAPI用動作環境ファイルに“D:\temp\api\api.cfg”を指定する場合

SET SHUN_API_CONFIG=D:\temp\api\api.cfg

使用するAPI用動作環境ファイルに“/tmp/api/api.cfg”を指定する場合

bash、BシェルまたはKシェルの場合

SHUN_API_CONFIG=/tmp/api/api.cfg; export SHUN_API_CONFIG

Cシェルの場合

setenv SHUN_API_CONFIG /tmp/api/api.cfg

2.4.3 実行パラメタの優先度

ホスト名やポート番号は、API用動作環境ファイルと、ShunsakuのAPIの両方で指定できます。このような両方で指定でき

る実行パラメタの優先度は、以下のようになります。

1. ShunsakuのAPIで指定した値

2. API用動作環境ファイルで指定した値

参照

実行パラメタの省略値については、“Java APIリファレンス”、“.NET APIリファレンス”、“C APIリファレンス”または“付録A API用動作環境ファイルの実行パラメタ”を参照してください。

注意

・ API用動作環境ファイルの指定は、APIがインストールされたマシン単位の指定より、アプリケーション起動時の指定

が優先されます。この場合は、インストールされたマシン単位のAPI用動作環境ファイルは無効となります。

・ API用動作環境ファイルおよびShunsakuのAPIの両方とも指定されなかった場合は、API内部で保持している省略値

が有効となります。

- 11 -

参照

ホスト名やポート番号の省略値については、“Java APIリファレンス”、“.NET APIリファレンス”、“C APIリファレンス”また

は“付録A API用動作環境ファイルの実行パラメタ”を参照してください。

2.5 アプリケーションの移行

ShunsakuのC APIを使用しているアプリケーションを、32ビットから64ビットへ移行するには、作業が必要な場合がありま

す。

移行作業が必要な場合

以下の条件のいずれかを満たす場合、プログラムソースの書換えが必要になります。

- ShunGetConnectAttr関数の第2引数の属性に SHUN_ATTR_SHUNSAKU_FILEを指定している場合

- ShunSetConnectAttr関数の第2引数の属性に SHUN_ATTR_SHUNSAKU_FILEを指定している場合

上記条件に当てはまらない場合、Shunsakuとしての移行作業は必要ありません。

各動作OSで必要なアプリケーションの64ビット対応(64ビットへの移植)作業を実施してください。

参照

移行作業については、“7.5.5 32ビットから64ビットへの移行時の注意”を参照してください。

- 12 -

第3章 データを検索する方法

本章では、Shunsakuが提供するAPIの引数として指定する検索式、リターン式およびソート式を使用してデータを検索す

る方法を説明します。

3.1 データ検索の概要

Shunsakuに格納しているXML文書を検索する基本的な考え方について説明します。

・ Shunsakuに格納しているXML文書から検索したいXML文書を選択する場合は、検索式を指定します。

・ XML文書の返却順を変更する場合は、ソート式を指定します。

・ 検索結果のXML文書から取り出す要素や集計する要素を決める場合は、リターン式を指定します。

・ 集計する場合は、検索条件に一致したXML文書をグループ化するためのキーである、グループキーを決めます。グ

ループキーはソート式に指定します。

Shunsakuに格納しているXML文書のデータ検索の概要について以下の図に示します。

図3.1 Shunsakuに格納しているXML文書のデータ検索の概要

検索式、ソート式およびリターン式の詳細については、“付録B 検索式、リターン式およびソート式の書式”を参照してく

ださい。

以降の説明では、“出張報告”を例にします。以下のXML文書が存在するものとします。

- 13 -

ドキュメントサンプル

<doc>

<employee eno= "従業員番号" position = "地位" > ・・・・従業員情報

<name>従業員氏名</name>

<namekana>氏名ひらがな</namekana>

<department sno= "部署番号" >部署名</department>

<phone>内線</phone>

<email>e-mailアドレス</email>

</employee>

<basic date= "出張日" expense= "出張費用" > ・・・・基本情報

<classification code= "分類コード" >分類</classification>

</basic>

<detail> ・・・・詳細情報

<destination area= "出張エリア">出張先</destination>

<purpose>出張目的</purpose>

<train>交通費</train>

<taxi>タクシー代</taxi>

<hotel>宿泊費</hotel>

<comment>コメント</comment>

</detail>

<report>出張レポート</report> ・・・・和文レポート

<reportE>英文出張レポート</reportE> ・・・・英文レポート

</doc>

<doc>

:

:

3.2 文字列で検索する

Shunsakuに格納しているXML文書から条件を満たすXML文書を検索するには、検索式を指定します。

検索式の詳細については、“B.3 検索式”を参照してください。

XML文書中の任意の要素ノードまたはその要素ノードの属性ノードが持つ文字列に対して条件を指定して、XML文書

を検索することができます。文字列に対する条件の指定には、以下の3つの方法があります。

・ キーワードを含む文書を検索する

・ キーワードと完全に一致する文書を検索する

・ キーワードと大小比較を行う

例として以下の文書があるものとします。

文書A

<doc>

:

<basic date="2006年01月30日" >

<classification code="0001">Area-A</classification>

:

</basic>

<detail>

<destination area="東京都千代田区" >東京営業所</destination>

<purpose>Interstage Shunsaku販売推進会議出席</purpose>

<train>7200円</train>

<taxi></taxi>

<hotel>8500円</hotel>

<comment>ホテル宿泊は親睦会に出席したため</comment>

</detail>

- 14 -

<report>会議において、A社IT部門のシステム担当者は、検索レスポンス10秒以内を要求した。</report>

<reportE>The Systems Manager of the IT Department of Company A requested

the search response within 10 seconds in the meeting.</reportE>

</doc>

文書B

<doc>

:

<basic date="2006年01月31日">

<classification code="0003">Area-C</classification>

:

</basic>

<detail>

<destination area="大阪府大阪市阿倍野区">大阪支店</destination>

<purpose>V7.0L10導入報告</purpose>

<train>14200円</train>

<taxi>1820円</taxi>

<hotel></hotel>

<comment>自宅に直帰予定</comment>

</detail>

<report>短期間での導入であったため、顧客は要求仕様である検索

レスポンス18秒の達成を疑問視していたが、実際には検索レスポンス14秒を

達成できた。</report>

<reportE>Because of short-term introduction, our clients had doubted

that we had got 18 seconds which had been requested for the search

response but the actual search response we could get was

14 seconds.</reportE>

</doc>

文書C

<doc>

:

<basic date="2006年03月02日">

<classification code="0002">Area-B</classification>

:

</basic>

<detail>

<destination area="神奈川県横浜市港北区">本社</destination>

<purpose>Interstage定例会議</purpose>

<train>2400円</train>

<taxi>2100円</taxi>

<hotel></hotel>

<comment>販売会議資料の事前検証</comment>

</detail>

<report>事前検証は統括部門の承認を得るよう要請された。</report>

<reportE>They were requested to get advance approval from the Sales

Coordination Department to verify the materials.</reportE>

</doc>

3.2.1 キーワードを含む文書を検索する

XML文書の任意の要素ノードまたはその要素ノードの属性ノードが持つ文字列中に、検索したいキーワードを含む文書

を検索することができます。このような検索を部分一致検索といいます。部分一致検索は、パス式、テキスト式または属性

式と、検索するキーワードを比較演算子で指定します。比較演算子には、“=”、“!= ”が指定できます。

- 15 -

キーワードにさまざまな指定形式を記述することにより、より詳細な検索条件を指定することができます。より詳細な検索

条件を指定する、この形式のことをパターンと呼びます。

3.2.1.1 パス式、テキスト式または属性式の例

パス式、テキスト式または属性式の指定例について、説明します。

パス式の詳細については、“B.2.1 パス式”を参照してください。

テキスト式の詳細については、“B.2.2 テキスト式”を参照してください。

属性式の詳細については、“B.2.3 属性式”を参照してください。

部分一致および比較演算子の詳細については、“B.3.2 キーワード”の“パターン”を参照してください。

例1

出張目的(purpose)に“Shunsaku”というキーワードを含む文書を検索します。

/doc/detail/purpose = 'Shunsaku'

結果:文書Aが返却されます。

パス式中に“//”を指定すると、任意の要素ノード配下のすべての階層の要素ノードを対象にして、検索を行うことができ

ます。また、パス式中に“*”を指定すると、任意の要素ノード直下に位置するすべての要素ノードを対象にして検索を行

うことができます。

参考

特定の要素ノードではなく、XML文書全体を対象にして、どこかの要素ノードに検索したいキーワードを含む文書を検

索する場合に“//”を指定すると便利です。

例2

詳細情報(detail)配下のどこかに“販売会議”というキーワードを含む文書を検索します。

/doc/detail/* = '販売会議'

結果:文書Cが返却されます。

例3

XML文書のどこかに“導入報告”というキーワードを含む文書を検索します。

/doc// = '導入報告'

結果:文書Bが返却されます。

参考

対象としたい要素ノードを特定するときに、階層構造で表現しなくても一意に決まるような場合は、“//”を指定すると便利

です。

- 16 -

例4

出張先(destination)に“大阪”というキーワードを含む文書を検索します。

//destination = '大阪'

結果:文書Bが返却されます。

3.2.1.2 キーワードの指定形式と検索方法

キーワードの指定形式には、大きく分けて以下の3つがあります。

文字列検索

ある文字列を含む文書を検索します。文字列検索では、改行などの検索対象ではない文字は無視して検索すること

ができます。

なお、検索対象外として取り扱う文字は、SkipCharで変更することができます。

SkipCharの詳細については、“導入・運用ガイド”の“システム用動作環境ファイルの実行パラメタ”および“director用動作環境ファイルの実行パラメタ”を参照してください。

ワード検索

英文のXML文書を対象として検索します。単語の区切り文字を意識して検索することができます。

なお、単語の区切り文字は、SeparateCharで変更することができます。

SeparateCharの詳細については、“導入・運用ガイド”の“システム用動作環境ファイルの実行パラメタ”および“director用動作環境ファイルの実行パラメタ”を参照してください。

論理演算検索

“文字列検索”および“ワード検索”を複数組み合わせて検索することができます。

参考

キーワードに、より詳細な検索条件を指定する形式のことをパターンと呼びます。パターンを使った検索をパターン検

索と呼びます。パターンによる検索の詳細については、“B.3.4 パターン”を参照してください。

キーワードの指定形式と検索方法について以下の表に示します。

表3.1 キーワードの指定形式と検索方法の一覧

指定形式 検索方法

文字列検索 文字列一致指定検索

前方一致指定検索

後方一致指定検索

任意文字指定検索

文字間隔指定検索

部分文字指定検索

文字範囲指定検索

数値範囲指定検索

- 17 -

指定形式 検索方法

ワード検索 ワード一致指定検索

ワード間隔指定検索

論理演算検索 論理積指定検索

論理和指定検索

否定指定検索

文字列一致指定検索

検索したいキーワードを含む文書を検索することができます。

文字列一致指定検索の詳細については、“B.3.4 パターン”の“文字列一致指定”を参照してください。

出張目的(purpose)の中に“V7.0L10”というキーワードを含む文書を検索します。

/doc/detail/purpose = 'V7\.0L10'

結果:文書Bが返却されます。

注意

“\”は“.”を検索するためのエスケープ文字です。

エスケープ文字の詳細については、“B.3.3 エスケープ文字”を参照してください。

前方一致指定検索

検索したいキーワードから始まる文書を検索することができます。

前方一致指定検索の詳細については、“B.3.4 パターン”の“前方一致指定”を参照してください。

出張目的(purpose)が“Interstage”というキーワードから始まる文書を検索します。

/doc/detail/purpose = '^Interstage'

結果:文書Aと文書Cが返却されます。

後方一致指定検索

検索したいキーワードで終わる文書を検索することができます。

後方一致指定検索の詳細については、“B.3.4 パターン”の“後方一致指定”を参照してください。

出張先(destination)が“支店”というキーワードで終わる文書を検索します。

/doc/detail/destination = '支店$'

結果:文書Bが返却されます。

- 18 -

参考

“前方一致指定検索”および“後方一致指定検索”を組み合わせることによって、要素ノードの文字列が、指定したキー

ワードと完全に一致する文書を検索することができます。

例1

出張先(destination)が“大阪支店”というキーワードのみの文書を検索します。

/doc/detail/destination = '^大阪支店$'

結果:文書Bが返却されます。

例2

宿泊費(hotel)が空文字“”の文書を検索します。

/doc/detail/hotel = '^$'

結果:文書Bと文書Cが返却されます。

任意文字指定検索

検索したい2つのキーワードが、任意の文字の前後に存在する文書を検索することができます。

任意文字指定検索の詳細については、“B.3.4 パターン”の“任意文字指定”を参照してください。

例1

詳細情報(detail)配下のどこかに、“販売”と“会議”の間に0文字以上の文字が存在するキーワードを含む文書を検

索します。

/doc/detail/* = '販売.*会議'

結果:文書Aと文書Cが返却されます。

例2

詳細情報(detail)配下のどこかに、“販売”と“会議”の間に2文字の文字が存在するキーワードを含む文書を検索しま

す。

/doc/detail/* = '販売..会議'

結果:文書Aが返却されます。文書Cのコメント(comment)中の“販売会議”はキーワード間の文字数が2文字ではない

ため、文書Cは返却されません。

文字間隔指定検索

検索したい2つのキーワードの間に、指定した文字数以内の文字が存在する文書を検索することができます。

文字間隔指定検索の詳細については、“B.3.4 パターン”の“文字間隔指定”を参照してください。

出張目的(purpose)の中に“Interstage”と“会議”の間の文字数が2文字以内のキーワードを含む文書を検索します。

/doc/detail/purpose = 'Interstage,2C,会議'

- 19 -

結果:文書Cが返却されます。文書Aはキーワード間の文字数が3文字以上であるため返却されません。

部分文字指定検索

検索したい2つのキーワードの間に、指定した文字列のいずれかを含む文書を検索することができます。

部分文字指定検索の詳細については、“B.3.4 パターン”の“部分文字指定”を参照してください。

出張エリア(area)に“東京都千代田区”または“東京都港区”というキーワードを含む文書を検索します。

/doc/detail/destination/@area = '東京都(千代田|港)区'

結果:文書Aが返却されます。

文字範囲指定検索

検索したいキーワードの一部の文字が、指定した範囲の文字である文字列を含む文書を検索することができます。

文字範囲指定検索の詳細については、“B.3.4 パターン”の“文字範囲指定”を参照してください。

分類(classification)に“Area-A”、“Area-B”または“Area-C”というキーワードを含む文書を検索します。

/doc/basic/classification = 'Area\-[A-C]'

結果:文書A、文書Bおよび文書Cが返却されます。

参考

この例では、“部分文字指定検索”で、“Area\-(A|B|C)”と記述するのと同じです。

数値範囲指定検索

検索したいキーワードの一部の文字が、指定した範囲の数値である文字列のいずれかを含む文書を検索することがで

きます。

数値範囲指定検索の詳細については、“B.3.4 パターン”の“数値範囲指定”を参照してください。

出張レポート(report)に“検索レスポンス1秒”、“検索レスポンス2秒”、“検索レスポンス3秒”、…、“検索レスポンス11秒”または“検索レスポンス12秒” というキーワードを含む文書を検索します。

/doc/report = '検索レスポンス[1,12]秒'

結果:文書Aが返却されます。

参考

この例では、“部分文字指定検索”で、“検索レスポンス(1|2|3|…|11|12)秒”と記述するのと同じです。

- 20 -

注意

数値範囲指定検索を行う場合は、数値の前後に文字を指定してください。たとえば、“検索レスポンス[1,12]”で検索する

と、文書Bの“検索レスポンス18秒”に1が含まれるため返却されます。

ワード一致指定検索

検索したい単語を含む文書を検索することができます。

ワード検索の場合は、空白などの区切り文字で区切られた文字列を、キーワードと識別して、単語単位の検索をします。

ワード一致指定検索の詳細については、“B.3.4 パターン”の“ワード一致指定”を参照してください。

英文レポート(reportE)に“Manager”というキーワードを含む文書を検索します。

/doc/reportE = '\<Manager\>'

結果:文書Aが返却されます。

参考

キーワードを連続して記述することで、連続した単語(フレーズ)を含む文書を検索することができます。

英文レポート(reportE)に“IT Department of Company A”というキーワードを含む文書を検索します。

/doc/reportE = '\<IT\>\<Department\>\<of\>\<Company\>\<A\>'

結果:文書Aが返却されます。

ワード間隔指定検索

検索したい2つのキーワードの間に、指定した単語数以内の任意の単語が入ったフレーズを含む文書を検索することが

できます。

ワード間隔指定検索の詳細については、“B.3.4 パターン”の“ワード間隔指定”を参照してください。

英文レポート(reportE)に“response”という単語で始まり、“seconds”という単語で終わる、途中に5つ以内の単語が入っ

たフレーズを含む文書を検索します。

/doc/reportE = '\<response\>,5W,\<seconds\>'

結果:文書Aと文書Bが返却されます。

論理積指定検索

パス式で指定した要素ノードの文字列が、複数指定したすべての条件と一致する文書を検索することができます。

論理積指定検索の詳細については、“B.3.4 パターン”の“論理積”を参照してください。

- 21 -

例1

コメント(comment)が“販売会議”というキーワードから始まり、かつ、“検証”というキーワードを含む文書を検索します。

/doc/detail/comment = '^販売会議&検証'

結果:文書Cが返却されます。

例2

詳細情報(detail)配下のどこかに、“Interstage”というキーワードを含み、かつ、“販売”と“会議”の間の文字数が2文字

以内のキーワードを含む文書を検索します。

/doc/detail// = 'Interstage&販売,2C,会議'

結果:文書Aと文書Cが返却されます。

参考

下記のように“AND”を使用しても例2と同じ検索をすることができます。

/doc/detail// = 'Interstage' AND /doc/detail// = '販売,2C,会議'

結果:文書Aと文書Cが返却されます。

論理和指定検索

パス式で指定した要素ノードの文字列が、指定したいずれかの条件と一致する文書を検索することができます。

論理和指定検索の詳細については、“B.3.4 パターン”の“論理和”を参照してください。

出張エリア(area)に“大阪府大阪市”、“大阪府堺市”または“神奈川県”というキーワードを含む文書を検索します。

/doc/detail/destination/@area = '大阪府(大阪|堺)市|神奈川県'

結果:文書Bと文書Cが返却されます。

否定指定検索

指定した条件に一致しない文書を検索することができます。

否定指定検索の詳細については、“B.3.4 パターン”の“否定”を参照してください。

例1

出張先(destination)に“本社”を含まない文書を検索します。

/doc/detail/destination = '~(本社)'

結果:文書Aと文書Bが返却されます。

- 22 -

例2

出張エリア(area)に“東京都”を含み、“港区”を含まない文書を検索します。

/doc/detail/destination/@area = '東京都&~(港区)'

結果:文書Aが返却されます。

3.2.2 キーワードと完全に一致する文書を検索する

XML文書の任意の要素ノードまたはその要素ノードの属性ノードが持つ文字列が、任意のキーワードと一致している文

書を検索することができます。このような検索を完全一致検索といいます。完全一致検索は、パス式、テキスト式または属

性式と、検索するキーワードを比較演算子で指定します。比較演算子には、“==”、“!==”が指定できます。

パス式の詳細については、“B.2.1 パス式”を参照してください。

テキスト式の詳細については、“B.2.2 テキスト式”を参照してください。

属性式の詳細については、“B.2.3 属性式”を参照してください。

完全一致および比較演算子の詳細については、“B.3.2 キーワード”の“文字列”を参照してください。

例1

出張先(destination)が“本社”である文書を検索します。

/doc/detail/destination == '本社'

結果:文書Cが返却されます。

例2

分類コード(code)が“0001”である文書を検索します。

/doc/basic/classification/@code == '0001'

結果:文書Aが返却されます。

3.2.3 キーワードと大小比較を行う

XML文書の任意の要素ノードまたはその要素ノードの属性ノードが持つ文字列と、任意のキーワードとの大小関係を比

較して、条件を満たす文書を検索することができます。文字列の大小関係とは、文字列の文字コード値の大小関係で

す。このような検索を大小比較検索といいます。大小比較検索は、パス式、テキスト式または属性式と、検索するキーワー

ドを比較演算子で指定します。比較演算子には、“<”、“<=”、“>”、“>=”が指定できます。

パス式の詳細については、“B.2.1 パス式”を参照してください。

テキスト式の詳細については、“B.2.2 テキスト式”を参照してください。

属性式の詳細については、“B.2.3 属性式”を参照してください。

大小比較および比較演算子の詳細については、“B.3.2 キーワード”の“文字列”を参照してください。

出張日(date)が“2006年02月01日”よりも遅い(大きい)文書を検索します。

/doc/basic/@date > '2006年02月01日'

結果:文書Cが返却されます。

- 23 -

注意

文字コードで大小比較を行うため、比較する文字列は同じ書式でなければなりません。たとえば、'2006年2月1日'と指定

すると意図した文書を検索することができません。

3.3 数値で検索する

Shunsakuに格納しているXML文書から条件を満たすXML文書を検索するには、検索式を指定します。

検索式の詳細については、“B.3 検索式”を参照してください。

XML文書の任意の要素ノードまたはその要素ノードの属性ノードが持つデータと、数値のキーワードとの大小関係を比

較して、条件を満たす文書を検索することができます。数値で検索する場合は、XML文書中の任意の要素ノードまたは

その要素ノードの属性ノードが持つ文字列を数値とみなします。このため、文字列の大小比較検索のように書式を意識

する必要はありません。

パス式、テキスト式または属性式で指定した要素ノードまたはその要素ノードの属性ノードが持つデータを数値とみなし

て、キーワードに指定した数値と比較します。パス式、テキスト式または属性式と、検索するキーワードを比較演算子で指

定します。

比較演算子には、“=”、“!=”、“<”、“<=”、“>”、“>=”が指定できます。

キーワードには、数値を引用符で囲まずに指定します。

パス式の詳細については、“B.2.1 パス式”を参照してください。

テキスト式の詳細については、“B.2.2 テキスト式”を参照してください。

属性式の詳細については、“B.2.3 属性式”を参照してください。

数値および比較演算子の詳細については、“B.3.2 キーワード”の“数値”を参照してください。

例として以下の文書があるものとします。

文書A

<doc>

<employee eno="19980120" position="general manager">

<name>鈴木太郎</name>

<namekana>すずきたろう</namekana>

<department sno="1001">開発部</department>

<phone>2201-1101</phone>

<email>[email protected]</email>

</employee>

<basic date="2006年02月16日" expense="15700円">

:

</basic>

:

<detail>

:

<taxi>1360円</taxi>

:

</detail>

</doc>

文書B

- 24 -

<doc>

<employee eno="20012111" position="manager">

<name>佐藤花子</name>

<namekana>さとうはなこ</namekana>

<department sno="2002">人事部</department>

<phone>2201-1204</phone>

<email>[email protected]</email>

</employee>

<basic date="2006年02月18日" expense="8500円">

:

</basic>

:

<detail>

:

<taxi>950円</taxi>

:

</detail>

</doc>

例1

タクシー代(taxi)が1000円より安い(小さい)文書を検索します。

/doc/detail/taxi < 1000

結果:文書Bが返却されます。

例2

部署番号(sno)が1001である文書を検索します。

/doc/employee/department/@sno = 1001

結果:文書Aが返却されます。

3.4 複数の条件を論理演算子で結合して検索する

Shunsakuに格納しているXML文書から条件を満たすXML文書を検索するには、検索式を指定します。

複数の条件を論理演算子で結合して検索することができます。論理演算子を指定することで、条件1と条件2の両方を満たす

XML文書を検索したり、条件1または条件2を満たすXML文書を検索したりすることができます。

論理演算子には、“AND”および“OR”があります。“AND”と“OR”を検索式に指定した場合は、“AND”が“OR”より優先

して判定されます。

検索式および論理演算子の詳細については、“B.3 検索式”を参照してください。

例として以下の文書があるものとします。

文書A

<doc>

:

<basic date="2006年01月30日" expense="15700円">

:

</basic>

<detail>

<destination area="東京都千代田区">東京営業所</destination>

- 25 -

<purpose>Interstage Shunsaku販売推進会議出席</purpose>

:

</detail>

:

</doc>

文書B

<doc>

:

<basic date="2006年02月16日" expense="16020円">

:

</basic>

<detail>

<destination area="大阪府大阪市阿倍野区">大阪支店</destination>

<purpose>V7.0L10導入報告</purpose>

:

</detail>

:

</doc>

文書C

<doc>

:

<basic date="2006年03月02日" expense="2400円">

:

</basic>

<detail>

<destination area="神奈川県横浜市港北区">本社</destination>

<purpose>Interstage定例会議</purpose>

:

</detail>

:

</doc>

例1

出張目的(purpose)に“Interstage”または“Shunsaku”という文字列を含む文書を検索します。

/doc/detail/purpose = 'Interstage' OR

/doc/detail/purpose = 'Shunsaku'

結果:文書Aと文書Cが返却されます。

例2

出張エリア(area)に“東京都”または“神奈川県”という文字列を含む文書を検索します。

/doc/detail/destination/@area = '東京都' OR

/doc/detail/destination/@area = '神奈川県'

結果:文書Aと文書Cが返却されます。

例3

出張費用(expense)が10000円以上で、かつ、出張エリア(area)に“大阪市”を含む文書を検索します。

- 26 -

/doc/basic/@expense >= 10000 AND

/doc/detail/destination/@area = '大阪市'

結果:文書Bが返却されます。

参考

“OR”を優先させたい場合は、条件式を括弧でくくります。

例4

出張先(destination)が“本社”または“大阪支店”で、かつ、出張日(date)に“2006年02月”を含む文書を検索します。

(/doc/detail/destination == '本社' OR

/doc/detail/destination == '大阪支店') AND

/doc/basic/@date = '2006年02月'

結果:文書Bが返却されます。

参考

パス式で指定した要素ノードに閉じた範囲で、条件を指定する場合はフィルタ式を指定します。

フィルタ式の詳細については、“B.3.8 フィルタ式”を参照してください。

3.5 検索結果をソートする

検索式でヒットしたXML文書を任意のキーでソートして返却したい場合は、Shunsakuが提供するAPIにソート式を指定し

ます。ソート式には、ソートするキーとなるテキスト式、属性式または単一行関数指定を指定します。

ソート式の詳細については、“B.5 ソート式”を参照してください。

3.5.1 文字列でソートする

XML文書中の任意の要素ノードまたはその要素ノードの属性ノードが持つ文字列でソートすることができます。文字列

の大小関係は、文字列の文字コード値の大小関係です。文字列でソートする場合は、ソート式のキー指定にテキスト式、

属性式または単一行関数指定のrlen関数を指定します。

キー指定の詳細については、“B.5.1 ソート式の書式”を参照してください。

例として以下の文書があるものとします。

文書A

<doc>

:

<namekana>たなかあいこ</namekana>

:

<basic date="2006年01月22日">

:

</basic>

- 27 -

<detail>

:

<destination area="東京都千代田区八重洲">東京営業所</destination>

:

</detail>

:

</doc>

文書B

<doc>

:

<namekana>すずきいちろう</namekana>

:

<basic date="2006年02月03日">

:

</basic>

<detail>

:

<destination area="大阪府大阪市阿倍野区阿倍野元町">大阪支店</destination>

:

</detail>

:

</doc>

文書C

<doc>

:

<namekana>すずきたろう</namekana>

:

<basic date="2006年01月13日">

:

</basic>

<detail>

:

<destination area="北海道札幌市中央区">北海道支店</destination>

:

</detail>

:

</doc>

文書D

<doc>

:

<namekana>さとうはなこ</namekana>

:

<basic date="">

:

</basic>

<detail>

:

<destination area="愛知県名古屋市千種区覚王山">愛知支店</destination>

:

</detail>

:

</doc>

- 28 -

例1

氏名ひらがな(namekana)を昇順にソートします。

/doc/namekana/text()

結果:文書D、B、C、Aの順に返却されます。

例2

出張日(date)の早い順(昇順)にソートします。

/doc/basic/@date

結果:文書C、A、B、Dの順に返却されます。

文字コードの大きい順(降順)にソートしたい場合は、キー指定のあとに“DESC”を指定します。

例3

氏名ひらがな(namekana)を降順にソートします。

/doc/namekana/text() DESC

結果:文書A、C、B、Dの順に返却されます。

例4

出張日(date)の遅い順(降順)にソートします。

/doc/basic/@date DESC

結果:文書B、A、C、Dの順に返却されます。

参考

XML文書中にテキスト式で指定したテキストノードがない場合は、“DESC”の指定の有無にかかわらず、そのXML文書

は 後に返却されます。上記の例では、文書Dは、出張日の早い順でも遅い順でも 後に返却されます。

ポイント

文字列でソートする場合、文字列の先頭20バイトをキーにしてソートを実施します。このため、指定したキー指定の文字

列の長さが20バイトよりも大きい場合、XML文書は20バイト目以降の文字で正しくソートされません。このような場合は、

キー指定にrlen関数を指定して、先頭から何文字をソートキーとするかを指定できます。

rlen関数の詳細については、“B.2.4 単一行関数指定”を参照してください。

例5

出張先(destination)でソートしたい場合

rlen(/doc/detail/destination/text(),10)

上記のように指定すると、出張先の先頭から10文字をソートキーとして利用します。

- 29 -

例6

出張エリア(area)でソートしたい場合

rlen(/doc/detail/destination/@area,30)

上記のように指定すると、出張エリアの先頭から30文字をソートキーとして利用します。

3.5.2 数値でソートする

XML文書の任意の要素ノードまたはその要素ノードの属性ノードが持つ文字列を数値とみなしてソートすることができま

す。数値とみなしてソートするには、ソート式のキー指定に、単一行関数指定のval関数を指定します。val関数の引数に

は、テキスト式または属性式を指定します。

単一行関数指定の詳細については、“B.2.4 単一行関数指定”を参照してください。

例として以下の文書があるものとします。

文書A

<doc>

<basic expense="7650円">

:

</basic>

<detail>

:

<taxi>1890円</taxi>

:

</detail>

</doc>

文書B

<doc>

<basic expense="12980円">

:

</basic>

<detail>

:

<taxi>11150円</taxi>

:

</detail>

</doc>

文書C

<doc>

<basic expense="出張費不要">

:

</basic>

<detail>

:

<taxi>3750円</taxi>

:

</detail>

</doc>

- 30 -

文書D

<doc>

<basic expense="480円">

:

</basic>

<detail>

:

<taxi>7400円</taxi>

:

</detail>

</doc>

例1

タクシー代(taxi)の安い順(昇順)にソートします。

val(/doc/detail/taxi/text())

結果:文書A、C、D、Bの順に返却されます。

例2

出張費用(expense)の安い順(昇順)にソートします。

val(/doc/basic/@expense)

結果:文書C、D、A、Bの順に返却されます。

参考

テキスト式で指定したXML文書中のテキストノードの文字列に数字を含まない場合は、val関数はその値を0とみなしま

す。この例では、文書Cの出張費用は0として扱われています。

また、テキスト式で指定したXML文書中のテキストノードがない場合は、そのXML文書は 後に返却されます。

数値の大きい順(降順)にソートしたい場合は、キー指定のあとに“DESC”を指定します。

例3

タクシー代(taxi)の高い順(降順)にソートします。

val(/doc/detail/taxi/text()) DESC

結果:文書 B、D、C、Aの順に返却されます。

例4

出張費用(expense)の高い順(降順)にソートします。

val(/doc/basic/@expense) DESC

結果:文書 B、A、D、Cの順に返却されます。

- 31 -

3.5.3 複数のキー指定でソートする

XML文書中の複数の要素ノードまたはその要素ノードの属性ノードの値でソートすることができます。ソート式に“,”で区

切って複数のキー指定を指定します。それぞれのキー指定は、数値でも文字列でもかまいません。

複数のキー指定を指定することで、検索するXML文書を属性ノード1の値の昇順に並べ、もし属性ノード1の値が同じで

あった場合は、属性ノード2の値の昇順に並べるといったソートが可能になります。

キー指定は8個まで指定できます。

例として以下の文書があるものとします。

文書A

<doc>

<basic date="2006年03月03日" expense="7650円">

:

</basic>

:

<detail>

:

<hotel>9600円</hotel>

:

</detail>

</doc>

文書B

<doc>

<basic date="2006年03月03日" expense="11500円">

:

</basic>

:

<detail>

:

<hotel>8900円</hotel>

:

</detail>

</doc>

文書C

<doc>

<basic date="2006年03月10日" expense="7650円">

:

</basic>

:

<detail>

:

<hotel>14090円</hotel>

:

</detail>

</doc>

例1

出張日(date)の順で、同じ出張日(date)である場合は宿泊費(hotel)が高い順(降順)となるようにソートします。

- 32 -

/doc/basic/@date,val(/doc/detail/hotel/text()) DESC

結果:文書A、B、Cの順に返却されます。

例2

出張日(date)の順で、同じ出張日(date)である場合は出張費用(expense)が高い順(降順)となるようにソートします。

/doc/basic/@date,val(/doc/basic/@expense) DESC

結果:文書B、A、Cの順に返却されます。

3.6 検索結果を取り出す

Shunsakuに格納しているXML文書を検索して、XML形式やテキスト形式でデータを取り出すことができます。検索結果

の取出しは、Shunsakuが提供するAPIのリターン式で指定します。

リターン式の詳細については、“B.4.1 集計を行わない場合の書式”を参照してください。

3.6.1 XML形式で取り出す

検索したXML文書をXML形式で取り出すことにより、DOMやSAXなどのXMLデータを操作するAPIを利用できます。XML形式で取り出すには、リターン項目にパス式を指定します。以下の2つの方法があります。状況に応じて使い分けてくだ

さい。

・ XML文書全体を取り出す

Shunsakuに格納されているオリジナルのXML文書を、そのままの形式で取り出します。通常は、この取出し方法を使

います。

・ 要素ノードを指定してXML形式で取り出す

指定された要素ノードをXML形式で取り出します。

3.6.1.1 XML文書全体を取り出す

リターン式に“/”のみを指定するとXML文書全体をそのまま取り出すことができます。

XML文書全体を取り出します。

/

結果

<doc>

<employee eno="19980120">

<name>鈴木太郎</name>

<namekana>すずきたろう</namekana>

<department sno= "1001"></department>

<phone>2201-1101</phone>

<email>[email protected]</email>

</employee>

<basic date="2006年02月16日" expense="7200円">

</basic>

<detail>

- 33 -

<destination area="神奈川県横浜市港北区">本社</destination>

<purpose>プロジェクト定例会</purpose>

<train>6600円</train>

<taxi>600円</taxi>

<hotel></hotel>

<comment>特になし</comment>

</detail>

<report>次回までに販売実績チャートの作成/報告が必要</report>

</doc>

参考

ソート式を指定している場合は、検索式でヒットしたXML文書がソート式に従って並べ替えられて返却されます。

3.6.1.2 要素ノードを指定してXML形式で取り出す

リターン項目にパス式を指定して、XML文書中の任意のノード配下のデータをXML形式で取り出すことができます。パ

ス式が示す要素ノード配下のデータは、XML文書のルートタグ配下の要素として、XML形式で表現されます。

例として、検索式により下記の1件のXML文書がヒットしたものとして説明します。

<doc>

<employee eno="19980120">

<name>鈴木太郎</name>

<namekana>すずきたろう</namekana>

<department sno="1001"></department>

<phone>2201-1101</phone>

<email>[email protected]</email>

</employee>

<basic date="2006年02月16日" expense="7200円">

</basic>

<detail>

<destination area="神奈川県横浜市港北区">本社</destination>

<purpose>プロジェクト定例会</purpose>

<train>6600円</train>

<taxi>600円</taxi>

<hotel></hotel>

<comment>特になし</comment>

</detail>

<report>次回までに販売実績チャートの作成/報告が必要</report>

</doc>

例1

従業員氏名(name)を取り出します。

/doc/employee/name

- 34 -

リターン式にリターン項目を複数指定することができます。それぞれのパス式は“,”で区切ります。

例2

従業員氏名(name)、基本情報(basic)および出張目的(purpose)を取り出します。

/doc/employee/name,/doc/basic,/doc/detail/purpose

結果

<doc><name>鈴木太郎</name><basic date="2006年02月16日" expense="7200円">

</basic><purpose>プロジェクト定例会</purpose></doc>

参考

ソート式を指定している場合は、検索式でヒットしたXML文書がソート式に従って並べ替えられて返却されます。

注意

・ リターン項目を複数指定する場合は、すべてのリターン項目がパス式でなければなりません。テキスト式や単一行関

数指定(テキスト形式での返却)と混在して指定することはできません。

・ リターン項目に複数の要素が該当するような指定(複数のパス式指定や、“//”,“*”の指定)をした場合、以下のよう

に、取り出された各要素の対応関係をアプリケーションで判断できなくなります。

- 一部の要素が存在しない場合、どの要素が存在しないのか判断できません。

- 取り出された要素のパスが判断できません。

・ このような場合、XML文書全体を取り出すか、リターン項目に1つの要素を特定する指定にして取り出してください。

- 35 -

3.6.2 テキスト形式でデータを取り出す

リターン式にテキスト式を指定して、XML文書中の任意のノード配下またはその要素ノードの属性ノードのデータをテキ

スト形式で取り出すことができます。

リターン式に単一行関数指定を指定することもできます。単一行関数指定を指定すると、rlen関数やval関数の結果をテ

キスト形式で取り出すことができます。

単一行関数指定の詳細については、“B.2.4 単一行関数指定”を参照してください。

例として、検索式により下記の1件のXML文書がヒットしたものとして説明します。

<doc>

<employee eno="19980120" position="general manager">

<name>鈴木太郎</name>

<namekana>すずきたろう</namekana>

<department sno="1001">開発部</department>

<phone>2201-1101</phone>

<email>[email protected]</email>

</employee>

<basic date="2006年02月16日" expense="7200円">

</basic>

<detail>

<destination area="神奈川県横浜市港北区">本社</destination>

<purpose>プロジェクト定例会</purpose>

<train>6600円</train>

<taxi>600円</taxi>

<hotel></hotel>

<comment>特になし</comment>

</detail>

<report>次回までに販売実績チャートの作成/報告が必要</report>

</doc>

例1

出張レポート(report)を取り出します。

/doc/report/text()

結果

次回までに販売実績チャートの作成/報告が必要

例2

出張エリア(area)を取り出します。

/doc/detail/destination/@area

結果

神奈川県横浜市港北区

例3

出張費用(expense)から数値を取り出します。

val(/doc/basic/@expense)

結果

- 36 -

7200

リターン式に、リターン項目を複数指定することができます。各リターン項目は“,”で区切ります。複数のリターン項目を指

定した場合は、結果として返すそれぞれのリターン項目の値は区切り文字で区切られます。

・ Java APIを使用する場合は、“,”で区切られます

・ .NET APIを使用する場合は、16進数の0x0001で区切られます

・ C APIを使用する場合は、文字コード“\001”の文字で区切られます

例4

従業員番号(eno)、従業員氏名(name)、出張日(date)、出張目的(purpose)を取り出します。

/doc/employee/@eno,/doc/employee/name/text(),/doc/basic/@date,/doc/detail/purpose/text()

結果:Java APIの場合

19980120,鈴木太郎,2006年02月16日,プロジェクト定例会

結果:.NET APIの場合

19980120 \1 鈴木太郎 \1 2006年02月16日 \1 プロジェクト定例会

結果:C APIの場合

19980120 \1 鈴木太郎 \1 2006年02月16日 \1 プロジェクト定例会 \1

例5

従業員番号(eno)、部署番号(sno)および出張日(date)を取り出します。

/doc/employee/@eno,/doc/employee/department/@sno,/doc/basic/@date

結果:Java APIの場合

19980120,1001,2006年02月16日

結果:.NET APIの場合

19980120 \1 1001 \1 2006年02月16日

結果:C APIの場合

19980120 \1 1001 \1 2006年02月16日 \1

参考

ソート式を指定している場合は、検索結果がソート式に従って並べ替えられて返却されます。

注意

リターン項目を複数指定する場合は、すべてのリターン項目は、テキスト式または単一行関数指定でなければなりませ

ん。パス式(XML形式での返却)と混在して指定することはできません。

- 37 -

3.7 集計した結果を取り出す

検索式でヒットしたXML文書は、任意のキーでグループ化して集計することができます。集計を行うには、リターン式に

集合関数指定を指定します。また、ソート式にグループキーを指定する必要があります。集合関数指定の結果は、グルー

プキーが同じXML文書を1つのグループと考えて、そのグループごとに、集合関数指定の引数に指定したテキスト式ま

たは属性式の示すデータを数値とみなして、合計、平均などを求めたものになります。

リターン式の詳細については、“B.4.3 集計を行う場合の書式”を参照してください。

集計のイメージを以下に示します。

このように、集計を行う場合は、検索結果を何でグループ化し、何を集計するのかを指定します。

・ 検索結果をグループ化する

・ 検索結果を集計する

3.7.1 検索結果をグループ化する

検索式でヒットしたXML文書を任意のキーでグループ化します。グループ化を行うキーは、ソート式に指定します。

3.7.1.1 文字列でグループ化する

XML文書中の任意の要素ノードまたはその要素ノードの属性ノードの値でグループ化を行うことができます。文字列で

グループ化を行う場合は、ソート式のキー指定にテキスト式または属性式を指定します。

例として以下の文書があるものとします。

文書A

<doc>

<employee eno="19980120" position="general manager">

- 38 -

:

<name>鈴木太郎</name>

:

</employee>

:

<detail>

:

<destination area="愛知県名古屋市千種区覚王山">愛知支店</destination>

:

</detail>

:

</doc>

文書B

<doc>

<employee eno="19980120" position="general manager">

:

<name>鈴木太郎</name>

:

</employee>

:

<detail>

:

<destination area="東京都千代田区八重洲">東京支店</destination>

:

</detail>

:

</doc>

文書C

<doc>

<employee eno="20012111" position="manager">

:

<name>佐藤花子</name>

:

</employee>

:

<detail>

:

<destination area="東京都千代田区八重洲">東京支店</destination>

:

</detail>

:

</doc>

文書D

<doc>

<employee eno="20012111" position="manager">

:

<name>佐藤花子</name>

:

</employee>

:

<detail>

:

<destination area="愛知県名古屋市千種区今池">愛知支社 </destination>

- 39 -

:

</detail>

:

</doc>

例1

従業員氏名(name)でグループ化します

/doc/employee/name/text()

結果:文書AとBが1つのグループ、文書CとDが1つのグループとして扱われます。

例2

地位(position)でグループ化します。

/doc/employee/@position

結果:文書AとBが1つのグループ、文書CとDが1つのグループとして扱われます。

ポイント

文字列でグループ化を行う場合、文字列の先頭20バイトをキーにしてグループ化します。キー指定が示すXML文書中

の値が20バイトよりも大きくなる可能性がある場合は、20バイト目以降が異なる文字列であるのに同一グループとみなさ

れることがあります。このような場合は、キー指定にrlen関数を指定して、先頭から何文字をキーとするかを指定できます。

rlen関数の詳細については、“B.2.4 単一行関数指定”を参照してください。

例3

出張エリア(area)でグループ化したい場合

rlen(/doc/detail/destination/@area,30)

上記のように指定すると、出張エリアの先頭から30文字でグループ化します。

3.7.1.2 数値でグループ化する

XML文書の任意の要素ノードまたはその要素ノードの属性ノードの値を数値とみなしてグループ化します。数値でグ

ループ化するには、ソート式のキー指定に単一行関数指定のval関数を指定します。val関数の引数には、テキスト式ま

たは属性式を指定します。

val関数の詳細については、“B.2.4 単一行関数指定”を参照してください。

例として以下の文書があるものとします。

文書A

<doc>

<employee>

:

<department sno="2001">開発部</department>

:

</employee>

- 40 -

:

</doc>

文書B

<doc>

<employee>

:

<department sno="2002">人事部</department>

:

</employee>

:

</doc>

文書C

<doc>

<employee>

:

<department sno="2001">開発部</department>

:

</employee>

:

</doc>

文書D

<doc>

<employee>

:

<department sno="2002">人事部</department>

:

</employee>

:

</doc>

部署番号(sno)が同じXML文書をグループ化したい場合

val(/doc/employee/department/@sno)

結果:文書AとCが1つのグループ、文書BとDが1つのグループとして扱われます。

3.7.1.3 複数のキー指定でグループ化する

複数のキーでグループ化するには、ソート式に“,”で区切って複数のキー指定を指定します。それぞれのキー指定は、

数値でも文字列でもかまいません。複数のキー指定を指定すると、指定したすべてのキー指定の値が同じであるXML文書を

1つのグループとして扱います。キー指定は8個まで指定できます。

例として以下の文書があるものとします。

文書A

- 41 -

<doc>

<basic date="2006年03月03日">

:

</basic>

<detail>

:

<destination area="神奈川県">本社</destination>

:

</detail>

:

</doc>

文書B

<doc>

<basic date="2006年03月03日">

:

</basic>

<detail>

:

<destination area="神奈川県">本社</destination>

:

</detail>

:

</doc>

文書C

<doc>

<basic date="2006年03月10日">

:

</basic>

<detail>

:

<destination area="神奈川県">本社</destination>

:

</detail>

:

</doc>

出張先(destination)と出張日(date)でグループ化します

/doc/detail/destination/text(),/doc/basic/@date

結果:文書AとBが1つのグループ、文書Cが1つのグループとして扱われます。

3.7.2 検索結果を集計する

集計を行う場合、グループキーも同時に取り出すのが一般的です。リターン式には、集合関数指定と、ソート式で指定し

たキー指定が指定できます。各リターン項目は“,”で区切ります。複数のリターン項目を指定した場合は、結果として返す

各リターン項目の値が区切り文字で区切られます。

・ Java APIを使用する場合は、“,”で区切られます

・ .NET APIを使用する場合は、16進数の0x0001で区切られます

- 42 -

・ C APIを使用する場合は、文字コード'\001'の文字で区切られます

例として、検索式により以下の6件のXML文書がヒットしたものとして説明します。

文書A

<doc>

:

<basic date="2006年11月3日" expense="15500円">

:

</basic>

<detail>

<destination area="神奈川県横浜市港北区">本社</destination>

:

<train>8600円</train><taxi></taxi><hotel>6900円</hotel>

:

</detail>

:

</doc>

文書B

<doc>

:

<basic date="2006年10月11日" expense="1000円">

:

</basic>

<detail>

<destination area="神奈川県横浜市港北区">本社</destination>

:

<train>900円</train><taxi></taxi><hotel></hotel>

:

</detail>

:

</doc>

文書C

<doc>

:

<basic date="2006年11月25日" expense="21000円">

:

</basic>

<detail>

<destination area="神奈川県横浜市港北区">本社</destination>

:

<train>13000円</train><taxi></taxi><hotel>8000円</hotel>

:

</detail>

:

</doc>

文書D

<doc>

:

<basic date="2006年9月29日" expense="4200円">

- 43 -

:

</basic>

<detail>

<destination area="東京都千代田区">東京営業所</destination>

:

<train>1600円</train><taxi>600円</taxi><hotel></hotel>

:

</detail>

:

</doc>

文書E

<doc>

:

<basic date="2006年11月12日" expense="1300円">

:

</basic>

<detail>

<destination area="東京都千代田区">東京営業所</destination>

:

<train>400円</train><taxi>900円</taxi><hotel></hotel>

:

</detail>

:

</doc>

文書F

<doc>

:

<basic date="2006年10月30日" expense="9500円">

:

</basic>

<detail>

<destination area="東京都千代田区">東京営業所</destination>

:

<train>280円</train><taxi>680円</taxi><hotel>8500円</hotel>

:

</detail>

:

</doc>

以降の例の共通事項として、次のソート式が指定されているものとします。

ソート式 : /doc/detail/destination/@area

参考

集計を行う場合のソート式は、グループ化するキーを指定しますが、指定したキーでソートも行います。集計のためのソー

ト式にも、“DESC”が指定できます。“DESC”を指定すると、グループ化キーの大きいものから集計結果を取り出すことが

できます。

- 44 -

注意

以下は、文字コード“UTF-8”を使用した場合の結果例です。

例1

交通費(train)の平均を求めます。

リターン式 : /doc/detail/destination/@area,avg(/doc/detail/train/text())

結果:Java APIの場合

神奈川県横浜市港北区,7500

東京都千代田区,760

例2

タクシーの利用者数を数えます。

リターン式 :/doc/detail/destination/@area,count(/doc/detail/taxi/text())

結果:Java APIの場合

神奈川県横浜市港北区,0

東京都千代田区,3

参考

集合関数の引数となるテキスト式が示す値がない場合は、集計の対象に含めません。上記の例では、本社に出張した

人は誰もタクシーを利用していません。このため、countの結果は0になります。

taxi要素ノードに“0”という値を格納している場合は、集計の対象になります。このようなデータを格納している場合は、検

索式にタクシー料金が0より大きいという条件を指定して、検索の対象から除外することで集計の対象から除外できます。

例3

タクシー料金(taxi)の 大値と宿泊費(hotel)の合計、および出張回数を求めます。

リターン式 : /doc/detail/destination/@area,max(/doc/detail/taxi/text()),sum(/doc/detail/hotel/

text()),count(/doc/detail/destination/text())

結果:Java APIの場合

神奈川県横浜市港北区,,14900,3

東京都千代田区,900,8500,3

ポイント

集合関数の引数となるテキスト式が示す値がない場合は、集計の対象に含めません。上記の例では、本社に出張した

人は誰もタクシーを利用していません。このため、 大の値がありません。

- 45 -

第4章 データを更新する方法

本章では、ShunsakuのAPIを使用してデータを更新する方法について説明します。

4.1 データ更新の概要

Shunsakuに格納しているXML文書の更新に関する基本的な考え方について説明します。

Shunsakuでは、XML文書を更新する方法として以下の3種類があります。

・ アプリケーションを使用してXML文書の追加、削除および更新を行う。

・ ダイレクトアクセスキー機能(注1)を使用してXML文書の削除および更新を行う。

・ コマンドまたは管理コンソール(注2)を使用して、XML文書の追加および削除を行う。

注1) ダイレクトアクセスキー機能の詳細については、“第6章 ダイレクトアクセス機能”を参照してください。

注2) 管理コンソールおよび管理サーバ機能は、Windows版のShunsakuでのみ使用可能です。

Shunsakuに格納しているXML文書の更新の概要について以下の図に示します。

図4.1 Shunsakuに格納しているXML文書の更新

XML文書の更新処理は、XML文書を検索するアプリケーションを待たせることなく実行することができます。

アプリケーションを用いた更新処理どうし、アプリケーションを用いた更新処理と管理コンソール、またはアプリケーション

を用いた更新処理とコマンドを用いた更新処理は、同時に実行することができます。

XML文書の更新処理が同時に動作した場合には、更新するXML文書が異なれば競合することなく実行することができ

ます。更新するXML文書が同じ場合には、いずれか一方の処理を行い、他の処理にはエラーを通知します。

アプリケーションとコマンドの競合関係の詳細については、“導入・運用ガイド”を参照してください。

管理コンソール機能は、Windows版のShunsakuでのみ提供しています。

管理コンソールを使用したXML文書の追加および削除については、“管理コンソール操作ガイド”を参照してください。

- 46 -

コマンドを使用したXML文書の追加および削除はshundimportコマンドを利用します。shundimportコマンドの詳細につ

いては、“コマンドリファレンス”を参照してください。

4.2 データを追加する

APIを用いたデータの追加はについて説明します。

データにはXML文書を指定します。このときデータには複数のXML文書を指定することができます。また、データを複

数指定して追加することができます。

複数のXML文書を追加する場合は、データに複数のXML文書を指定するか、または、複数のデータを指定して同時に

追加するか、選択できます。

APIを用いたデータの追加で複数のXML文書を指定する方法について以下の図に示します。

図4.2 APIを用いたデータの追加で複数のXML文書を指定する方法

複数のdirectorを使用しているときには、管理コンソールの“データを挿入するdirector”、または、conductor用動作環境

ファイルのInsertPointパラメタで指定されるdirectorに対して、XML文書の追加を行います。

管理コンソール機能は、Windows版のShunsakuでのみ提供しています。

管理コンソールの詳細については、“管理コンソール操作ガイド”を参照してください。

- 47 -

conductor用動作環境ファイルの詳細については、“導入・運用ガイド”を参照してください。

複数のdirectorを使用している場合に、conductor用動作環境ファイルのInsertPointパラメタでデータ挿入先となるdirectorを指定する方法について、以下の図に示します。

図4.3 conductor用動作環境ファイルを用いてデータ挿入先となるdirectorを指定する方法

4.3 データを削除する

APIを用いたデータの削除を行う場合の流れについて、以下の図に示します。

図4.4 APIを用いたデータの削除を行う場合の流れ

1. 削除するXML文書を特定し、レコードIDを取得する

データの検索を行い削除するXML文書を特定し、削除対象となるXML文書のレコードIDを取得します。

- 48 -

2. レコードIDを指定してXML文書を削除する

取得したレコードIDを指定して削除を行うAPIを呼び出し、XML文書を削除します。

削除対象となるXML文書のレコードIDは、一度に複数指定することができます。

4.4 データを更新する

APIを用いたデータの更新を行う場合の流れを、以下の図に示します。

図4.5 APIを用いたデータの更新を行う場合の流れ

1. 更新するXML文書を特定し、レコードIDとXML文書を取得する

データの検索を行い更新するXML文書を特定し、更新対象となるXML文書とレコードIDを取得します。

2. レコードIDとXML文書を指定してXML文書を更新する

取得したレコードIDと置き換えるXML文書を指定して更新を行うAPIを呼び出し、XML文書を更新します。

更新対象となるXML文書のレコードIDと置き換えるXML文書は、一度に複数指定することができます。

XML文書を取得した以降にXML文書が置き換えられている場合、Shunsakuはデータの整合性を保つためにエラーを

通知します。

Shunsakuがデータの整合性を保つためにエラーを通知する流れについて以下の図に示します。

- 49 -

図4.6 Shunsakuがデータの整合性を保つためにエラーを通知する流れ

更新処理でエラーとなった場合は、以下の対処を行ってください。

更新処理でエラーとなった場合の対処の流れについて以下の図に示します。

図4.7 更新処理でエラーとなった場合の対処の流れ

1. 更新するXML文書を再特定し、レコードIDとXML文書を再取得する

検索条件を指定したデータの検索を再度行い更新するXML文書を再特定し、更新対象となる 新のXML文書

とレコードIDを再取得します。また、検索条件に指定した項目が更新されないことがわかっている場合には、レコード

IDを指定して更新対象となる 新のXML文書とレコードIDを再取得することも可能です。

2. レコードIDとXML文書を指定してXML文書を更新する

再取得したレコードIDと置き換えるXML文書を指定して更新を行うAPIを呼び出し、XML文書を更新します。

- 50 -

第5章 トランザクション機能

本章では、Shunsakuが提供するトランザクションの機能と、アプリケーション開発時のトランザクションの使用方法につい

て説明します。

5.1 トランザクションの概要

Shunsakuのトランザクション機能について、以下の内容を説明します。

・ トランザクションとは

・ トランザクションの開始と終了

・ 自動コミットと手動コミット

・ 更新されたデータの見え方

・ トランザクションの同時実行制御

・ トランザクションとリカバリの関係

なお、トランザクション機能を使用したサンプルプログラムについては、“付録F Java サンプルプログラム”、“付録G C# .NETサンプルプログラム”、“付録H VB .NET サンプルプログラム”、“付録I C++ .NET サンプルプログラム”または“付録J Cサンプルプログラム”を参照してください。

5.1.1 トランザクションとは

トランザクションとは、業務ルール上意味のある、これ以上分解できない作業の 小単位です。

ここでは、教育コースの受講受付を行うため、以下のような2つのXML文書の更新をする必要がある場合を例に挙げま

す。

・ コース情報を管理するXML文書(各コースに関する定員数や受付済みの受講者数などを示すもの)

・ 生徒情報を管理するXML文書(各生徒に関する受講コースなどを示すもの)

コース情報を管理するXML文書

<course>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

.

.

.

<capacity>40</capacity>

<current-auditors>30</current-auditors>

.

.

.

</course>

<course>

.

- 51 -

.

.

生徒情報を管理するXML文書

<student>

<first-name>Jack</first-name>

<last-name>Wilson</last-name>

<e-mail>[email protected]</e-mail>

<course>Japanese language</course>

.

.

.

<course>Business negotiation</course>

.

.

.

</student>

<student>

<first-name>Mary</first-name>

<last-name>Tompson</last-name>

<e-mail>[email protected]</e-mail>

<course>Chinese language</course>

.

.

.

</student>

<student>

.

.

.

ここで、Mary Tompsonのビジネス交渉術コースの受講申込みに伴う更新処理を行います。結果のXML文書は以下のよ

うになります。

コース情報を管理するXML文書

<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>

<course>

.

.

.

- 52 -

生徒情報を管理するXML文書

<student>

<first-name>Jack</first-name>

<last-name>Wilson</last-name>

<e-mail>[email protected]</e-mail>

<course>Japanese language</course>

.

.

.

<course>Business negotiation</course>

.

.

.

</student>

<student>

<first-name>Mary</first-name>

<last-name>Tompson</last-name>

<e-mail>[email protected]</e-mail>

<course>Chinese language</course>

.

.

.

<course>Business negotiation</course>

.

.

.

</student>

<student>

.

.

.

この例では、Maryの生徒情報にビジネス交渉術コースを受講中コースとして追加し、また、ビジネス交渉術コースのコー

ス情報の受講者数を増やしています。この2つのデータ操作は両方そろって意味をなすものであり、どちらか一方だけで

は正しい事実を生み出しません。どちらか一方のデータ操作でも失敗した場合、データは論理的に正しくない状態となっ

てしまいます。

このようなときにトランザクションを用います。Shunsakuのトランザクションは、一連のデータ変更からなります。Shunsakuは、トランザクションを構成するデータ変更がすべて有効となるか、すべて無効となるようにします。ひとまとまりとして意味

のある一連のデータ操作を1つのトランザクションにすることで、データの論理的一貫性を保つことができます。

5.1.2 トランザクションの開始と終了

トランザクションは、コネクション確立後、または前のトランザクション終了後、データに対する初回の更新操作によって自

動的に開始されます。以降のデータ更新はトランザクションが終了されるまで、このトランザクションの一部となります。

トランザクションは、コミットまたはロールバックすることで終了されます。

コミットとは、すべての変更を有効にすることです。

ロールバックとは、すべての変更を取り消すことです。

コミットおよびロールバックは、以下のAPIを使用します。これらのAPIを用いることで、アプリケーションはいつでもトランザ

クションを終了することができます。

- 53 -

種別 API名

Java APIcommit

rollback

.NET APICommit

Rollback

C APIShunCommit

ShunRollback

このほか、トランザクションは以下のような場合に終了します。

終了要因と動作について説明します。

終了要因 動作

アプリケーションプロセスが消滅した

場合

そのアプリケーションプロセスが実行中の

トランザクションはロールバックされます。アプリケーションを配置したサーバの

ダウンや通信障害により、アプリケー

ションプロセスが消滅したとconductorが判断した場合(注)

トランザクションを継続できないエラー

が発生した場合

そのトランザクションはロールバックされ、

そのことがAPIの結果としてアプリケーショ

ンに通知されます。

注)復旧方法の詳細については、“トラブルシューティング集”の“Shunsakuシステムの復旧”を参照してください。

5.1.3 自動コミットと手動コミット

トランザクションのコミットの方法には、自動コミットと手動コミットがあります。

自動コミットとは、1つのデータ操作、つまりAPIの呼び出しごとにトランザクションの開始と終了をShunsakuが自動的に行

うことです。

手動コミットとは、アプリケーションがcommit、CommitまたはShunCommitを実行してコミットを行うことです。

複数の更新操作を1つのトランザクションとするには、手動コミットを使用します。

コネクションの確立時は自動コミットが有効になっています。

自動コミットが有効な場合は自動コミットとなり、自動コミットが無効な場合は手動コミットとなります。

自動コミットと手動コミットの切替えは、以下のAPIで設定します。

種別 API名

Java API setAutoCommit

.NET API AutoCommit

C API ShunSetConnectAttr

- 54 -

5.1.4 更新されたデータの見え方

更新の結果は、それがコミットされるまでは見えません。見えるのは更新前のデータです。このデータの見え方のルール

は、1つのトランザクション内での更新後の参照にも当てはまります。

たとえば、あるトランザクション内でXML文書を追加し、それを検索しようとしたとします。しかし、そのトランザクションはま

だコミットしていないため、検索結果には追加されたXML文書は現れません。一度コミットされれば、その追加されたXML文書は検索結果に現れるようになります。

5.1.5 トランザクションの同時実行制御

同時に実行している複数のトランザクションが同じデータを操作するときには、矛盾した結果を生じないよう、それらの間

で適切な調整が必要です。Shunsakuはそのための制御を自動的に行います。そのルールは次のようなものです。

・ 同じXML文書に対する参照と更新の操作は同時に動作します。このとき、一方が他方を待たせることはありません。

・ まだ完了していないほかのトランザクションが更新しているXML文書を更新しようとするとエラーになります。

・ あるアプリケーションによって参照されたXML文書が、別のトランザクションによって更新されコミットされることがあり

ます。この場合、参照を行ったアプリケーションが同じXML文書を参照しても、先程の結果と異なります。これは、参

照を行ったアプリケーションがトランザクションを実行中であっても同じです。

つまり、トランザクションの実行中であるか否かにかかわらず、同じXML文書を複数回参照すると、それぞれの参照

は異なるデータを見ることがあります。

・ 1つのトランザクションの実行中に同じ検索式による検索を2回行ったとき、その間に別のトランザクションが検索式に

合致するデータを追加しコミットすると、2回目の結果には1回目の結果に含まれていなかったXML文書が含まれま

す。

図5.1 トランザクションによるデータの整合性保証

以下の表は、同時に実行する2つのトランザクションによる同一のXML文書へのアクセスが競合するかどうかを示します。

検索 追加 削除 更新

検索 ○ - ○ ○

追加 - - - -

- 55 -

検索 追加 削除 更新

削除 ○ - × ×

更新 ○ - × ×

○:競合しない。同時に動作する

×:競合する。あとに実行された操作がエラーになる

-:当てはまる状況はない

注意

コミット処理と検索が同時に動いた場合、コミット処理を行っているトランザクションが行った処理のうち、一部の結果がコ

ミットされている状態を、検索することがあります。

5.1.6 トランザクションとリカバリの関係

システム運用中にOSまたはShunsakuがダウンした場合、Shunsakuは、ダウンしたシステムでのトランザクション状態を認

識して、再起動時にデータをリカバリします。Shunsakuシステムは、ダウン時のトランザクションの状態により、そのトランザ

クションを有効または無効にします。

有効または無効の選択基準は以下のとおりです。

・ ダウン時にコミット処理が完了していないトランザクションは無効になります。

トランザクション中に行われたデータ処理は無効になります。

・ ダウン時にコミット処理が完了しているトランザクションは完結します。

トランザクション中に行われたデータ処理は有効になります。

5.2 Java APIでトランザクションを使う

Java APIを利用したアプリケーションの作成例を説明します。

XML文書の削除および更新を1トランザクションとして扱う例を以下に示します。

- 56 -

図5.2 XML文書の削除および更新を1トランザクションとして扱う例

記述例

/*

* 以下のように用意されていることを仮定しています。

* sQuery :検索式を格納した文字列

* sReturn :リターン式を格納した文字列

* updateData :更新データを格納した文字列

*/

ShunConnection con = null;

ShunPreparedStatement searchStmt = null;

ShunResultSet rs = null;

ShunPreparedRecordID deleteRecId = null;

ShunPreparedRecordID updateRecId = null;

try {

// ShunConnectionオブジェクトを作成

con = new ShunConnection("DirSvr1", 23101);

// ShunPreparedStatementオブジェクトを作成

searchStmt = con.prepareSearch(sQuery, sReturn);

// 返信要求件数を設定

searchStmt.setRequest(1, 30);

// 検索を実行し、ShunResultSetオブジェクトを作成

rs = searchStmt.executeSearch();

// レコードIDを取得

String[] idList = new String[rs.getReturnCount()];

- 57 -

int count = 0;

while (rs.next()) {

idList[count] = rs.getRecordID();

count++;

}

rs.close();

searchStmt.close();

// 自動コミットを無効に切替え

con.setAutoCommit(false); (1)

// 削除用のShunPreparedRecordIDオブジェクトを作成

deleteRecId = con.prepareDeleteRecordID();

// 3番目のデータを削除対象に設定

deleteRecId.add(idList[2]);

// データを削除

if (0 < deleteRecId.getCount()) {

deleteRecId.deleteByRecordID();

System.out.println("削除終了");

}

deleteRecId.close();

// 更新用のShunPreparedRecordIDオブジェクトを作成

updateRecId = con.prepareUpdateRecordID();

// 5番目のデータを更新対象に設定

updateRecId.add(idList[4], updateData);

// データを更新

if (0 < updateRecId.getCount()) {

updateRecId.updateByRecordID();

System.out.println("更新終了");

}

updateRecId.close();

// コミットの実行

con.commit(); (2)

con.close();

} catch (ShunException ex) {

try {

// ロールバックの実行

if (!con.getAutoCommit()) {

con.rollback(); (3)

}

} catch (ShunException e) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

case ShunException.SHUN_ERROR_TRANSACTION_ROLLEDBACK:

System.out.println("エラーレベル :

SHUN_ERROR_TRANSACTION_ROLLEDBACK");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

e.printStackTrace();

}

// エラー情報取得

- 58 -

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

case ShunException.SHUN_ERROR_TRANSACTION_ROLLEDBACK:

System.out.println("エラーレベル :

SHUN_ERROR_TRANSACTION_ROLLEDBACK");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

// 回収処理

finally {

try {

if (rs != null)rs.close();

if (searchStmt != null)searchStmt.close();

if (deleteRecId != null)deleteRecId.close();

if (updateRecId != null)updateRecId.close();

if (con != null)con.close();

} catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

case ShunException.SHUN_ERROR_TRANSACTION_ROLLEDBACK:

System.out.println("エラーレベル :

SHUN_ERROR_TRANSACTION_ROLLEDBACK");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

(1)自動コミットを無効に切替え

ShunConnectionクラスのsetAutoCommitメソッドで、自動コミットを無効に切り替えます。

ポイント

コネクションの確立時は、自動コミットが有効になっていますので、切替えが必要です。

再度自動コミットを有効にしたい場合は、setAutoCommitメソッドにtrueを設定します。

(2)コミットの実行

トランザクションを終了し、それまでの操作をShunsakuに反映したい場合は、commitメソッドを実行します。

- 59 -

(3)ロールバックの実行

エラーが発生したときなど、それまでの操作をShunsakuに反映しないでトランザクションをロールバックする場合は、rollbackメソッドを実行します。

参照

Java APIの詳細については、“Java APIリファレンス”を参照してください。

5.2.1 エラー発生時の対処

エラー発生時の対処については、“9.3.5 エラー発生時の対処”を参照してください。

5.3 .NET APIでトランザクションを使う

.NET APIを利用したアプリケーションの作成例を説明します。

XML文書の削除および更新を1トランザクションとして扱う例を以下に示します。

図5.3 XML文書の削除および更新を1トランザクションとして扱う例

- 60 -

C# .NETでの記述例

/*

* 以下のように用意されていることを仮定しています。

* sQuery :検索式を格納した文字列

* sReturn :リターン式を格納した文字列

* updateData :更新データを格納した文字列

*/

ShunService service = null;

try {

// ShunServiceを作成

service = new ShunService();

service.Host = "DirSvr1";

service.Port = 23101;

service.Connect();

// ShunSearchRequirementを作成

ShunSearchRequirement req = new ShunSearchRequirement();

req.QueryExpression = sQuery;

req.ReturnExpression = sReturn;

req.ReplyNumber = 1;

req.RequestCount = 30;

// 検索を実行

ShunResultSet rs = service.Search( req );

// 自動コミットを無効に切替え

service.AutoCommit = false; (1)

try {

// 3番目のデータを削除対象に設定

ShunRecordCollection deleteRecCol = new ShunRecordCollection();

deleteRecCol.Add( rs.Records[2] );

// データを削除

service.Delete( deleteRecCol );

// 5番目のデータを更新対象に設定

ShunRecordCollection updateRecCol = new ShunRecordCollection();

ShunRecord record = rs.Records[4];

record.Data = updateData;

updateRecCol.Add( record );

// データを更新

service.Update( updateRecCol );

// コミットの実行

service.Commit(); (2)

}

catch {

if ( service.State == ShunConnectionState.Open ) {

// ロールバックの実行

service.Rollback(); (3)

}

throw;

}

service.Disconnect();

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

- 61 -

try {

if( service != null && service.State == ShunConnectionState.Open ) {

service.Disconnect();

}

}

catch( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunTransactionRolledbackException e ) {

// ShunTransactionRolledbackExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open ) {

service.Disconnect();

}

}

catch( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

VB .NETでの記述例

' 以下のように用意されていることを仮定しています。

' sQuery :検索式を格納した文字列

' sReturn :リターン式を格納した文字列

' updateData :更新データを格納した文字列

Dim service As ShunService = Nothing

Try

' ShunServiceを作成

service = New ShunService()

service.Host = "DirSvr1"

service.Port = 23101

service.Connect()

' ShunSearchRequirementを作成

Dim req As ShunSearchRequirement = New ShunSearchRequirement()

req.QueryExpression = sQuery

req.ReturnExpression = sReturn

req.ReplyNumber = 1

req.RequestCount = 30

' 検索を実行

Dim rs As ShunResultSet = service.Search( req )

' 自動コミットを無効に切替え

service.AutoCommit = False (1)

Try

' 3番目のデータを削除対象に設定

Dim deleteRecCol As ShunRecordCollection = New ShunRecordCollection()

deleteRecCol.Add( rs.Records(2) )

- 62 -

' データを削除

service.Delete( deleteRecCol )

' 5番目のデータを更新対象に設定

Dim updateRecCol As ShunRecordCollection = New ShunRecordCollection()

Dim record As ShunRecord = rs.Records(4)

record.Data = updateData

updateRecCol.Add( record )

' データを更新

service.Update( updateRecCol )

' コミットの実行

service.Commit() (2)

Catch

If service.State = ShunConnectionState.Open

' ロールバックの実行

service.Rollback() (3)

End If

Throw

End Try

service.Disconnect()

Catch e As ShunContinuousException

' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State = ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine("エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine("エラーメッセージ : {0}", e.Message )

Catch e As ShunTransactionRolledbackException

' ShunTransactionRolledbackExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State = ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine("エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine("エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException

' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message )

End Try

(1)自動コミットを無効に切替え

ShunServiceクラスのAutoCommitプロパティで、自動コミットを無効に切り替えます。

- 63 -

ポイント

ShunServiceオブジェクト作成時は、自動コミットが有効になっていますので、切替えが必要です。

再度自動コミットを有効にしたい場合は、AutoCommitプロパティにtrueを設定します。

(2)コミットの実行

トランザクションを終了し、それまでの操作をShunsakuに反映したい場合は、Commitメソッドを実行します。

(3)ロールバックの実行

エラーが発生したときなど、それまでの操作をShunsakuに反映しないでトランザクションをロールバックする場合は、Rollbackメソッドを実行します。

参照

.NET APIの詳細については、“.NET APIリファレンス”を参照してください。

5.3.1 エラー発生時の対処

エラー発生時の対処については、“10.3.5 エラー発生時の対処”を参照してください。

5.4 C APIでトランザクションを使う

C APIを利用したアプリケーションの作成例を説明します。

XML文書の削除および更新を1トランザクションとして扱う例を以下に示します。

- 64 -

図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;

- 65 -

}

/* 検索を実行 */

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);

- 66 -

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;

}

(1)自動コミットを無効に切替え

コネクションハンドルを割り当てたあと、ShunSetConnectAttr関数で自動コミットを無効に切り替えます。

ポイント

コネクション確立時は、自動コミットが有効になっていますので、切替えが必要です。

再度自動コミットを有効にしたい場合は、ShunSetConnectAttr関数で、SHUN_ATTR_AUTOCOMMITにSHUN_TRUEを設定します。

(2)コミットの実行

トランザクションを終了し、それまでの操作をShunsakuに反映したい場合は、ShunCommit関数を実行します。

(3)ロールバックの実行

エラーが発生したときなど、それまでの操作をShunsakuに反映しないでトランザクションをロールバックする場合は、

ShunRollback関数を実行します。

- 67 -

参照

C APIの詳細については、“C APIリファレンス”を参照してください。

5.4.1 エラー発生時の対処

エラー発生時の対処については、“11.2.5 エラー発生時の対処”を参照してください。

- 68 -

第6章 ダイレクトアクセス機能

本章では、ShunsakuのAPIによるダイレクトアクセスキーを使用したデータの検索、削除、更新を行う方法について説明

します。

6.1 ダイレクトアクセス機能の概要

ダイレクトアクセスキーを使用して、Shunsakuに格納しているXML文書を操作する基本的な考え方について説明します。

Shunsakuに格納したXML文書内に、従業員番号や口座番号などといったデータを一意に特定できるキーが存在する場

合があります。また、コンテンツ統合モデルとしてShunsakuを利用する場合に、オリジナルデータの格納庫としてSymfowareServerなどのデータベースが使用され、Shunsakuは検索システムとして使用される場合もあります。このようなデータに

は、一意性を保証した検索キーが存在するので、その検索キーをXML文書の1要素としてShunsakuに格納します。

それらの一意に特定できるキーまたは検索キーを、Shunsakuではダイレクトアクセスキーと呼びます。ダイレクトアクセス

キーを使用してShunsakuに格納しているXML文書を操作することで、データの検索や更新の性能が格段に向上します。

ダイレクトアクセスキーを使用する場合のShunsakuシステムについて、以下の図に示します。

図6.1 ダイレクトアクセスキーを使用する場合のShunsakuシステム

ダイレクトアクセスキー

XML文書中で一意性が保証されている要素ノードです。

Shunsakuでは、APIからダイレクトアクセスキーを使用してデータを操作する方法として以下の3種類があります。

・ ダイレクトアクセスキーを使用したデータの検索

・ ダイレクトアクセスキーを使用したデータの削除

・ ダイレクトアクセスキーを使用したデータの更新

- 69 -

データの追加に関しては、“4.2 データを追加する”で示した方法で処理できます。

参照

Symfowareデータベースと連携してダイレクトアクセス機能を使ったシステム例については、“データベース連携ガイド”

を参照してください。

注意

Shunsaku Fileに対してのダイレクトアクセスキーを指定したデータ操作は実行可能ですが、横断検索を目的としたDomainに対してのダイレクトアクセスキーを指定したデータ操作はできません。

6.2 ダイレクトアクセスキー環境の構築

ダイレクトアクセスキーを使用する場合には、ディレクタサーバにおいて以下の手順を行う必要があります。

参照

Shunsakuの停止と起動については、“導入・運用ガイド”の“起動と停止”を参照してください。

- 70 -

6.2.1 ダイレクトアクセスキー定義ファイルの作成

ダイレクトアクセスキー定義ファイルは、XML文書中に存在する一意性が保証された要素ノードをテキスト式または属性

式で指定し、ダイレクトアクセスキー名と対応づけるファイルです。

ダイレクトアクセスキー定義ファイルの内容は、以下の形式で記述してください。

図6.2 ダイレクトアクセスキー定義ファイルの定義

参照

・ テキスト式の詳細な書式は、“B.2.2 テキスト式”を参照してください。

・ 属性式の詳細な書式は、“B.2.3 属性式”を参照してください。

・ 定義時の定量値については、“C.4 ダイレクトアクセスにおける定量値”を参照してください。

ダイレクトアクセスキー定義ファイルを変更した場合は、Shunsakuシステムを再起動してください。

以下に、ダイレクトアクセスキー定義ファイルの指定方法について、説明します。

・ 1行に1つのダイレクトアクセスキー名を定義してください。

・ ダイレクトアクセスキー名は、32バイト以内の半角英数字で指定します。

・ 1行の 大長は4095バイトです。(改行は含みません。)

・ ダイレクトアクセスキーは、XML文書中で一意性が保証される必要があります。なお、Shunsaku Fileを使用している

場合は、1File内で一意となる必要があります。

・ Symfoware Serverと連携する場合は、ダイレクトアクセスキーにSymfoware Serverの一意性制約(PRIMARY KEY)を指定してください。

・ 1つのダイレクトアクセスキー名の定義に、 大64個のテキスト式または属性式が記述できます。

・ テキスト式または属性式には、“//”や“*”を指定することはできません。

・ 同一名のダイレクトアクセスキー名を複数回定義することはできません。

・ 行の先頭が“#”の場合、その行はコメントとして扱われます。

・ 行の途中に“#”を指定してコメントを記述することはできません。

・ ダイレクトアクセスキー定義ファイルには、1つ以上のダイレクトアクセスキー名の定義を記述してください。

- 71 -

・ ダイレクトアクセスキーに指定するテキストノードまたは属性ノードがマルチバイト文字の場合、システム用動作環境

ファイルに指定されたキャラクタ識別コード“CharacterCode”と同じ文字コードで記述してください。

注意

・ ダイレクトアクセスキー定義ファイルは、director用動作環境ファイルと同時にバックアップする必要があります。

・ ダイレクトアクセス機能を使用する場合には、directorがダイレクトアクセスキー情報をメモリ上に展開するため、ディレ

クタサーバにおける使用メモリ量が増加します。

このため、directorのメモリ使用量を見積もり、Shunsakuシステムの構成を設計する必要があります。

directorのメモリ使用量の見積りの詳細については、“導入・運用ガイド”の“資源の見積り”を参照してください。

・ Shunsakuでは、ダイレクトアクセスキーの一意性チェックは行いません。ダイレクトアクセスキーの一意性が保証され

ていない場合、同じダイレクトアクセスキーを要素ノードに持つすべてのXML文書が操作対象になるので、注意して

ください。

以下にダイレクトアクセスキー定義ファイルの例を記述します。

# ダイレクトアクセスキー定義ファイル

key1 /doc/news/day/text(),/doc/news/number/text()

注意

テキスト式で指定したテキストノードまたは属性式で指定した属性ノードが同一文書中に複数存在する場合は、先頭の

テキストノードの値または属性ノードの値を利用します。以下の場合、先頭のデータだけがアクセスの対象になり、それ以

降のデータはアクセス対象外です。

6.2.2 ダイレクトアクセスキー定義ファイルの設定

director用動作環境ファイルに以下の実行パラメタを記述して、ダイレクトアクセスキー定義ファイルを設定します。

- 72 -

実行パラメタ名 意味 説明

DirectKeyListFileダイレクトアクセス

キー定義ファイル

ダイレクトアクセスキー

定義ファイル名を指定

します。

注意

システム用動作環境ファイルまたはdirector用動作環境ファイルの以下の実行パラメタは、ダイレクトアクセスキーを指定した

APIでは有効となりません。

・ SkipChar

・ ANKmix

・ KNJmix

ダイレクトアクセスキー定義ファイルは、以下のディレクトリに配置してください。

Shunsakuのインストール先のフォルダ\Shunsaku\etc\director\

/etc/opt/FJSVshnsk/etc/director/

Shunsakuシステムのダイレクトアクセスキーを使用したデータ操作を実施する全directorのdirector用動作環境ファイル

に、同じダイレクトアクセスキー定義ファイルを指定してください。同一のダイレクトアクセスキー定義ファイルが指定され

ない場合には、ダイレクトアクセスキーを使用した操作がエラーとなったり、正しい結果が返信されない場合があります。

- 73 -

参照

実行パラメタの詳細については、“導入・運用ガイド”の“director用動作環境ファイルの実行パラメタ”を参照してくださ

い。

6.2.3 ダイレクトアクセスキー定義ファイルの確認

ダイレクトアクセスキー定義ファイルを確認します。

ディレクタサーバにてshundstateコマンドを実行して実行パラメタDirectKeyListFileが設定されていることを確認します。

6.3 ダイレクトアクセスキーの形式

アプリケーションで設定する際のダイレクトアクセスキーの形式について説明します。

ダイレクトアクセスキー対象要素(注),ダイレクトアクセスキー対象要素,…

注) ダイレクトアクセスを行う場合にアプリケーションで指定するダイレクトアクセスキーの値のことです。

・ ダイレクトアクセスキー対象要素が複数ある場合には、カンマ(,)で区切ってください。

・ ダイレクトアクセスキー対象要素として空文字を指定したい場合は、引用符('')を指定してください。

- 74 -

・ ダイレクトアクセスキー対象要素内にエスケープが必要となる文字が存在する場合は、エスケープ文字(\)を付加し

てください。エスケープが必要となる文字については、“B.3.3 エスケープ文字”を参照してください。

・ ダイレクトアクセスキーの長さは、1~32768バイトの範囲で指定してください。

・ ダイレクトアクセスキー対象要素に、コメント、処理命令またはCDATAセクションが存在する場合には、ダイレクトアク

セスキーにも同じ内容(エスケープが必要な文字はエスケープを付加して)を指定してください。

・ ダイレクトアクセスキー対象要素に実体参照が含まれる場合に、ダイレクトアクセスキーに実体参照が表す記号を指

定した場合には、正しい結果が返信されません。ダイレクトアクセスキーには、XML文書中の要素ノードと同じ内容

を指定してください。

ダイレクトアクセスキー、ダイレクトアクセスキー名およびとダイレクトアクセス対象要素の関係を、以下に示します。

6.4 ダイレクトアクセスキーでデータを検索する

Shunsakuに格納されているXML文書から、ダイレクトアクセスキーと一致するXML文書を検索する(以降、ダイレクト検索

と呼びます)には、Shunsakuが提供するAPIにダイレクトアクセスキーを指定します。

ダイレクト検索処理は、レコードIDによる検索処理の影響を受けないため、より高速な検索処理を実現することができま

す。

ダイレクト検索の流れ

ダイレクト検索の流れについて以下の図に示します。

- 75 -

図6.3 ダイレクト検索を行う場合の流れ

ポイント

・ ダイレクト検索APIに指定されたダイレクトアクセスキー名が、ダイレクトアクセスキー定義ファイルに記述したダイレク

トアクセスキー名と一致しない場合には、ダイレクトアクセスキーを使用したAPIはエラーとなります。Shunsakuシステ

ム配下のすべてのdirector用動作環境ファイルに同じダイレクトアクセスキー定義ファイルを指定してください。

・ Shunsaku Fileを使用している場合には、Shunsaku Fileに定義されたすべてのdirector用動作環境ファイルに同じダ

イレクトアクセスキー定義ファイルを指定してください。別のShunsaku Fileに定義されているdirectorには、同じダイレ

クトアクセスキー定義ファイルを指定する必要はありません。

・ ダイレクト検索APIに指定されたダイレクトアクセスキーが存在しない場合には、検索結果件数は0件となります。

・ ダイレクトアクセスキー定義ファイルに記述されている、ダイレクトアクセスキー対象要素ノード数と、APIに記述したダ

イレクトアクセスキー対象要素の数が異なる場合には、ダイレクトアクセスキーを使用した検索APIはエラーとなりま

す。

・ ダイレクトアクセスキー定義ファイルに記述されている、ダイレクトアクセスキー対象要素ノードの順番に、ダイレクトア

クセスキー対象要素を指定してください。順番が正しくない場合には、正常な検索結果が返信されません。

・ ダイレクト検索のAPIは、一度に複数のダイレクトアクセスキーを指定した検索をすることができます。

・ ダイレクトアクセスキーの一意性が保証されていない場合、同じダイレクトアクセスキーを要素ノードに持つすべてのXML文書が返信されます。

以降に、Java API、.NET API、C APIそれぞれについて説明します。

6.4.1 Java APIの場合

ダイレクト検索には、searchByKeyメソッドを使用します。

Java APIでのダイレクト検索の流れについて、以下の図に示します。

- 76 -

図6.4 ダイレクト検索の流れ

記述例

ShunConnection con = new ShunConnection();

ShunPreparedKey preSkey = con.prepareSearchKey(“key1”, “/”); (1)

preSkey.add(“20061101,00000001”); (2)

preSkey.add(“20061101,00000002”); (2)

preSkey.add(“20061101,00000003”); (2)

preSkey.setSearchType(ShunPreparedKey.SHUN_KEY_COMPLETE_MATCH);

ShunResultSet rs = preSkey.searchByKey(); (3)

System.out.println("[結果件数] = " + rs.getReturnCount());

while (rs.next()) {

System.out.println("[結果] = " + rs.getString());

}

rs.close();

preSkey.close(); (4)

con.close();

(1) ShunPreparedKeyオブジェクトの作成

ShunPreparedKeyオブジェクトは、prepareSearchKeyメソッドのパラメタにダイレクトアクセスキー名とリターン式を指定

して作成します。

(2) ダイレクトアクセスキーの設定

ダイレクトアクセスキーの設定は、addメソッドを使用します。

addメソッドで複数のダイレクトアクセスキーを設定できます。

ポイント

addメソッドで複数のダイレクトアクセスキーを指定することで、一度に複数のXML文書を取得することができます。

(3) 検索の実行(ShunResultSetオブジェクトの作成)

検索の実行はsearchByKeyメソッドを使用します。検索した結果としてShunResultSetオブジェクトが作成されます。

- 77 -

(4) ShunPreparedKeyオブジェクトの解放

ShunPreparedKeyオブジェクトは、使用後にcloseメソッドで必ず解放します。

参照

ダイレクトアクセスのサンプルプログラムは、“F.3.2 ダイレクトアクセスキーを使用してデータを検索する”を参照してくださ

い。

6.4.2 .NET APIの場合

ダイレクト検索には、SearchByKeyメソッドを使用します。

.NET APIでのダイレクト検索の流れについて、以下の図に示します。

図6.5 ダイレクト検索の流れ

記述例

ShunService service = new ShunService();

service.Connect();

ShunRecord record1 = new ShunRecord();

ShunRecord record2 = new ShunRecord();

ShunRecord record3= new ShunRecord();

record1.Key = "20061101,00000001"; (1)

record2.Key = "20061101,00000002"; (1)

record3.Key = "20061101,00000003"; (1)

ShunKeyRequirement keyReq = new ShunKeyRequirement(); (2)

keyReq.KeyName = "key1"; (3)

keyReq.SearchType = ShunKeySearchType.CompleteMatch; (3)

keyReq.Records.Add( record1 ); (3)

keyReq.Records.Add( record2 ); (3)

keyReq.Records.Add( record3 ); (3)

- 78 -

ShunResultSet rs = service.SearchByKey( keyReq, "/" ); (4)

Console.WriteLine( "[結果件数] = " + rs.ReturnCount );

foreach ( ShunRecord record in rs.Records ) {

Console.WriteLine( "[結果] = " + record.Data );

}

service.Disconnect();

(1) ダイレクトアクセスキーの設定

ShunRecordオブジェクトにダイレクトアクセスキーを設定します。

(2) ShunKeyRequirementオブジェクトの作成

ShunKeyRequirementオブジェクトを作成します。

(3) ShunKeyRequirementオブジェクトへの設定

ShunKeyRequirementオブジェクトにダイレクトアクセスキー名、ShunRecordオブジェクトを設定します。

ポイント

Addメソッドで複数のShunRecordオブジェクトを指定することで、一度に複数のXML文書を取得することができます。

(4) 検索の実行(ShunResultSetオブジェクトの作成)

リターン式とShunKeyRequirementオブジェクトをSearchByKeyメソッドに指定し、検索の実行をします。検索した結果

としてShunResultSetオブジェクトが作成されます。

参照

ダイレクトアクセスのサンプルプログラムは、以下を参照してください。

・ C# .NETの場合:“G.3.2 ダイレクトアクセスキーを使用してデータを検索する”

・ VB .NETの場合:“H.3.2 ダイレクトアクセスキーを使用してデータを検索する”

・ C++ .NETの場合:“I.3.2 ダイレクトアクセスキーを使用してデータを検索する”

6.4.3 C APIの場合

ダイレクト検索には、ShunSearchKey関数を使用します。

C APIでのダイレクト検索の流れについて、以下の図に示します。

- 79 -

図6.6 ダイレクト検索の流れ

記述例

/* 以下のように用意されていることを仮定しています */

/* pKey :ダイレクトアクセスキーを設定する構造体配列 */

SHUNHSTMT StmtH;

/* データ操作ハンドルの割当て */

ShunAllocHandle(ConH, &StmtH);

/* ダイレクトアクセスキーによる検索を実行 */

pKey[0].Key = "20061101,00000001"; (1)

pKey[0].Key_Len = strlen( pKey[0].Key );

pKey[1].Key = "20061101,00000002"; (1)

pKey[1].Key_Len = strlen( pKey[1].Key );

pKey[2].Key = "20061101,00000003"; (1)

pKey[2].Key_Len = strlen( pKey[2].Key );

ShunSearchKey(StmtH, "key1", SHUN_KEY_COMPLETE_MATCH, 3, pKey, "/",

&Return_Cnt, &Rec_Id_Out, &Data, &Key_Out); (2)

/* 検索した結果の取出し */

printf("結果件数 = %d\n", Return_Cnt);

if(Return_Cnt > 0) {

for (i = 0; i < Return_Cnt; i++) {

printf("[結果]%d件目 = %s\n", i+1, Data[i].Data); (3)

}

}

/* データ操作ハンドルの解放 */

ShunFreeHandle(StmtH);

ダイレクトアクセスキーの設定

構造体SHUNKEYにダイレクトアクセスキーを設定します。

(1) 検索の実行

ShunSearchKey関数のパラメタに、データ操作ハンドル、ダイレクトアクセスキー名、リターン式、依頼ダイレクトアクセ

スキー数、依頼ダイレクトアクセスキーの配列を指定して検索を実行します。

- 80 -

ポイント

ShunSearchKey関数では、複数のダイレクトアクセスキーを指定することで、一度に複数のXML文書を取得すること

もできます。

(2) 検索結果の取出し

ShunSearchKey関数では、検索した結果のアドレスを返却します。

検索した結果は、構造体の配列で構成されていますので、これをもとにデータを取り出します。また、XML文書が存

在しない場合、配列の要素であるデータへのポインタにはNULLが、データサイズには0が設定されます。

参照

ダイレクトアクセスのサンプルプログラムは、“J.3.2 ダイレクトアクセスキーを使用してデータを検索する”を参照してくださ

い。

6.5 ダイレクトアクセスキーでデータを削除する

あらかじめ削除対象のXML文書の内容がわかっている場合は、ダイレクトアクセスキーを使用したデータ削除処理(以降、ダイレクト削除と呼びます)を実行します。ダイレクト削除は、通常のレコードIDによる“4.3 データを削除する”とは異

なり、削除対象のXML文書のレコードIDを取得する必要はありません。

これにより、レコードIDを取得する検索処理が不要となり、削除処理を簡単、かつ、高速に実現することができます。

ダイレクト削除の流れ

ダイレクト削除の流れについて以下の図に示します。

図6.7 ダイレクト削除を行う場合の流れ

ポイント

・ ダイレクト削除を行うAPIは、一度に複数のダイレクトアクセスキーを指定した削除が可能です。

・ ダイレクト削除APIに指定されたダイレクトアクセスキーを含むXML文書が存在しない場合には、削除APIは、正常に

終了します。

・ ダイレクト削除APIに指定されたダイレクトアクセスキーを含むXML文書が、ほかのアプリケーションにより更新中の

場合には、Shunsakuのデータの整合性を保証するために、削除APIはエラーとなります。その場合には、しばらく待っ

てから再実行してください。

- 81 -

・ ダイレクトアクセスキーの一意性が保証されていない場合、同じダイレクトアクセスキーを要素ノードに持つすべてのXML文書が削除されます。

注意

ダイレクト削除では、XML文書単位で処理するため、特定項目だけの削除はできません。

以降に、Java API、.NET API、C APIそれぞれについて説明します。

6.5.1 Java APIの場合

ダイレクト削除には、deleteByKeyメソッドを使用します。

Java APIでのダイレクト削除の流れについて、以下の図に示します。

図6.8 ダイレクト削除の流れ

記述例

ShunConnection con = new ShunConnection();

ShunPreparedKey preDkey = con.prepareDeleteKey(“key1”); (1)

preDkey.add(“20061101,00000001”); (2)

preDkey.add(“20061101,00000002”); (2)

preDkey.add(“20061101,00000003”); (2)

preDkey.setSearchType(ShunPreparedKey.SHUN_KEY_COMPLETE_MATCH);

preDkey.deleteByKey(); (3)

preDkey.close(); (4)

con.close();

(1) ShunPreparedKeyオブジェクトの作成

ShunPreparedKeyオブジェクトは、prepareDeleteKeyメソッドのパラメタにダイレクトアクセスキー名を指定して作成しま

す。

- 82 -

(2)ダイレクトアクセスキーの設定

ダイレクトアクセスキーの設定は、addメソッドを使用します。

addメソッドで複数のダイレクトアクセスキーを設定できます。

ポイント

addメソッドで複数のダイレクトアクセスキーを指定することで、一度に複数のXML文書を削除することができます。

(3) 削除の実行

削除の実行はdeleteByKeyメソッドを使用します。

(4) ShunPreparedKeyオブジェクトの解放

ShunPreparedKeyオブジェクトは、使用後にcloseメソッドで必ず解放します。

参照

ダイレクトアクセスのサンプルプログラムは、“F.3.3 ダイレクトアクセスキーを使用してデータを削除する”を参照してくださ

い。

6.5.2 .NET APIの場合

ダイレクト削除には、DeleteByKeyメソッドを使用します。

.NET APIでのダイレクト削除の流れについて、以下の図に示します。

図6.9 ダイレクト削除の流れ

- 83 -

記述例

ShunService service = new ShunService();

service.Connect();

ShunRecord record1 = new ShunRecord();

ShunRecord record2 = new ShunRecord();

ShunRecord record3 = new ShunRecord();

record1.Key = "20061101,00000001"; (1)

record2.Key = "20061101,00000002"; (1)

record3.Key = "20061101,00000003"; (1)

ShunKeyRequirement keyReq = new ShunKeyRequirement(); (2)

keyReq.KeyName = "key1"; (3)

keyReq.SearchType = ShunKeySearchType.CompleteMatch; (3)

keyReq.Records.Add( record1 ); (3)

keyReq.Records.Add( record2 ); (3)

keyReq.Records.Add( record3 ); (3)

service.DeleteByKey( keyReq ); (4)

service.Disconnect();

(1) ダイレクトアクセスキーの設定

ShunRecordオブジェクトにダイレクトアクセスキーを設定します。

(2) ShunKeyRequirementオブジェクトの作成

ShunKeyRequirementオブジェクトを作成します。

(3) ShunKeyRequirementオブジェクトへの設定

ShunKeyRequirementオブジェクトにダイレクトアクセスキー名、ShunRecordオブジェクトを設定します。

ポイント

Addメソッドで複数のShunRecordオブジェクトを指定することで、一度に複数のXML文書を削除することができます。

(4) 削除の実行

ShunKeyRequirementオブジェクトをDeleteByKeyメソッドに指定し、削除の実行をします。

参照

ダイレクトアクセスのサンプルプログラムは、以下を参照してください。

・ C# .NETの場合:“G.3.3 ダイレクトアクセスキーを使用してデータを削除する”

・ VB .NETの場合:“H.3.3 ダイレクトアクセスキーを使用してデータを削除する”

・ C++ .NETの場合:“I.3.3 ダイレクトアクセスキーを使用してデータを削除する”

- 84 -

6.5.3 C APIの場合

ダイレクト削除には、ShunDeleteKey関数を使用します。

C APIでのダイレクト削除の流れについて、以下の図に示します。

図6.10 ダイレクト削除の流れ

記述例

/* 以下のように用意されていることを仮定しています */

/* pKey :ダイレクトアクセスキーを設定する構造体配列 */

SHUNHSTMT StmtH;

/* データ操作ハンドルの割当て */

ShunAllocHandle(ConH, &StmtH);

/* ダイレクトアクセスキーによる削除を実行 */

pKey[0].Key = "20061101,00000001"; (1)

pKey[0].Key_Len = strlen( pKey[0].Key );

pKey[1].Key = "20061101,00000002"; (1)

pKey[1].Key_Len = strlen( pKey[1].Key );

pKey[2].Key = "20061101,00000003"; (1)

pKey[2].Key_Len = strlen( pKey[2].Key );

ShunDeleteKey(StmtH, "key1", SHUN_KEY_COMPLETE_MATCH, 3, pKey); (2)

/* データ操作ハンドルの解放 */

ShunFreeHandle(StmtH);

(1)ダイレクトアクセスキーの設定

構造体SHUNKEYにダイレクトアクセスキーを設定します。

(2) XML文書の削除

ShunDeleteKey関数に、データ操作ハンドル、ダイレクトアクセスキー名、削除するデータ件数、削除するダイレクトア

クセスキーを指定し、削除を実行します。

- 85 -

ポイント

ShunDeleteKey関数では、複数のダイレクトアクセスキーを指定することで、一度に複数のXML文書を削除すること

ができます。

参照

ダイレクトアクセスのサンプルプログラムは、“J.3.3 ダイレクトアクセスキーを使用してデータを削除する”を参照してくださ

い。

6.6 ダイレクトアクセスキーでデータを更新する

あらかじめ更新対象のXML文書の内容がわかっている場合は、ダイレクトアクセスキーを使用したデータ更新処理(以降、ダイレクト更新と呼びます)を実行します。ダイレクト更新は、通常のレコードIDによる“4.4 データを更新する”とは異

なり、更新対象のXML文書のレコードIDを取得する必要はありません。このため、直接、更新するXML文書をAPIに指

定することで、更新処理を、簡単、かつ、高速に実現することができます。

ダイレクト更新の流れ

ダイレクト更新の流れについて以下の図に示します。

図6.11 ダイレクト更新の流れ

ポイント

・ ダイレクト更新を行うAPIは、一度に複数のダイレクトアクセスキーを指定した更新が可能です。

・ ダイレクト更新APIに指定されたダイレクトアクセスキーを含むXML文書が存在しない場合には、更新APIは、エラー

となります。その場合には、ダイレクト検索APIによりデータを確認してください。

・ ダイレクト更新APIに指定されたダイレクトアクセスキーを含むXML文書が、ほかのアプリケーションにより更新中の

場合には、Shunsakuのデータの整合性を保証するために、更新APIはエラーとなります。その場合には、ダイレクトア

クセスキーを指定した検索APIによりデータを確認したあとに、置き換えるXML文書を作成し、再実行してください。

・ ダイレクトアクセスキーの一意性が保証されていない場合、同じダイレクトアクセスキーを要素ノードに持つすべてのXML文書が更新されます。

注意

ダイレクト削除では、XML文書単位で処理するため、特定項目だけの削除はできません。

以降に、Java API、.NET API、C APIそれぞれについて説明します。

- 86 -

6.6.1 Java APIの場合

ダイレクト更新には、updateByKeyメソッドを使用します。

Java APIでのダイレクト更新の流れについて、以下の図に示します。

図6.12 ダイレクト更新の流れ

記述例

ShunConnection con = new ShunConnection();

ShunPreparedKey preUkey = con.prepareUpdateKey(“key1”); (1)

preUkey.add(“20061101,00000001”, updateData1); (2)

preUkey.add(“20061101,00000002”, updateData2); (2)

preUkey.add(“20061101,00000003”, updateData3); (2)

preUkey.setSearchType(ShunPreparedKey.SHUN_KEY_COMPLETE_MATCH);

preUkey.updateByKey(); (3)

preUkey.close(); (4)

con.close();

(1) ShunPreparedKeyオブジェクトの作成

ShunPreparedKeyオブジェクトは、prepareUpdateKeyメソッドのパラメタにダイレクトアクセスキー名を指定して作成しま

す。

(2) ダイレクトアクセスキーおよび更新するデータの設定

ダイレクトアクセスキーおよび更新するデータの設定は、addメソッドを使用します。

addメソッドで複数のダイレクトアクセスキーおよび更新データを設定できます。

- 87 -

ポイント

addメソッドで複数のダイレクトアクセスキーおよび更新データを指定することで、一度に複数のXML文書を更新する

ことができます。

(3) 更新の実行

更新の実行はupdateByKeyメソッドを使用します。

(4) ShunPreparedKeyオブジェクトの解放

ShunPreparedKeyオブジェクトは、使用後にcloseメソッドで必ず解放します。

参照

ダイレクトアクセスのサンプルプログラムは、“F.3.4 ダイレクトアクセスキーを使用してデータを更新する”を参照してくださ

い。

6.6.2 .NET APIの場合

ダイレクト更新には、UpdateByKeyメソッドを使用します。

.NET APIでのダイレクト更新の流れについて、以下の図に示します。

図6.13 ダイレクト更新の流れ

記述例

ShunService service = new ShunService();

service.Connect();

ShunRecord record1 = new ShunRecord();

ShunRecord record2 = new ShunRecord();

ShunRecord record3 = new ShunRecord();

- 88 -

record1.Key = "20061101,00000001"; (1)

record2.Key = "20061101,00000002"; (1)

record3.Key = "20061101,00000003"; (1)

record1.Data = updateData1; (2)

record2.Data = updateData2; (2)

record3.Data = updateData3; (2)

ShunKeyRequirement keyReq = new ShunKeyRequirement(); (3)

keyReq.KeyName = "key1"; (4)

keyReq.SearchType = ShunKeySearchType.CompleteMatch; (4)

keyReq.Records.Add( record1 ); (4)

keyReq.Records.Add( record2 ); (4)

keyReq.Records.Add( record3 ); (4)

service.UpdateByKey( keyReq ); (5)

service.Disconnect();

(1) ダイレクトアクセスキーの設定

ShunRecordオブジェクトにダイレクトアクセスキーを設定します。

(2) 更新するデータの設定

ShunRecordオブジェクトに更新するデータを設定します。

(3) ShunKeyRequirementオブジェクトの作成

ShunKeyRequirementオブジェクトを作成します。

(4) ShunKeyRequirementオブジェクトへの設定

ShunKeyRequirementオブジェクトにダイレクトアクセスキー名、ShunRecordオブジェクトを設定します。

ポイント

Addメソッドで複数のShunRecordオブジェクトを指定することで、一度に複数のXML文書を更新することができます。

(5) 更新の実行

ShunKeyRequirementオブジェクトをUpdateByKeyメソッドに指定し、更新の実行をします。

参照

ダイレクトアクセスのサンプルプログラムは、以下を参照してください。

・ C# .NETの場合:“G.3.4 ダイレクトアクセスキーを使用してデータを更新する”

・ VB .NETの場合:“H.3.4 ダイレクトアクセスキーを使用してデータを更新する”

・ C++ .NETの場合:“I.3.4 ダイレクトアクセスキーを使用してデータを更新する”

- 89 -

6.6.3 C APIの場合

ダイレクト更新には、ShunUpdateKey関数を使用します。

C APIでのダイレクト更新の流れについて、以下の図に示します。

図6.14 ダイレクト更新の流れ

記述例

/* 以下のように用意されていることを仮定しています */

/* updateData :更新データ */

/* pKey :ダイレクトアクセスキーを設定する構造体配列 */

SHUNHSTMT StmtH;

/* データ操作ハンドルの割当て */

ShunAllocHandle(ConH, &StmtH);

/* ダイレクトアクセスキーによる更新を実行 */

pKey[0].Key = "20061101,00000001"; (1)

pKey[0].Key_Len = strlen( pKey[0].Key );

pKey[1].Key = "20061101,00000002"; (1)

pKey[1].Key_Len = strlen( pKey[1].Key );

pKey[2].Key = "20061101,00000003"; (1)

pKey[2].Key_Len = strlen( pKey[2].Key );

ShunUpdateKey(StmtH, "key1", SHUN_KEY_COMPLETE_MATCH, 3, pKey, updateData); (2)

/* データ操作ハンドルの解放 */

ShunFreeHandle(StmtH);

(1) ダイレクトアクセスの設定

構造体SHUNKEYにダイレクトアクセスキーを設定します。

(2) XML文書の更新

ShunUpdateKey関数に、データ操作ハンドル、ダイレクトアクセスキー名、更新するデータ件数、更新するダイレクトア

クセスキー、更新するデータを指定し、更新を実行します。

- 90 -

ポイント

ShunUpdateKey関数では、複数のダイレクトアクセスキー、対応するデータを指定することで、一度に複数のXML文書を更新することができます。

参照

ダイレクトアクセスのサンプルプログラムは、“J.3.4 ダイレクトアクセスキーを使用してデータを更新する”を参照してくださ

い。

6.7 ダイレクトアクセス機能を使用したアプリケーション開発

ダイレクトアクセス機能を使用したアプリケーション開発の例について説明します。

6.7.1 ダイレクト検索を使用したデータ削除/更新の使い方

ダイレクト検索を使用したレコードIDによるデータ削除または更新処理について説明します。

まず、ダイレクト検索APIを発行して、対象データのレコードIDとデータ全体を取得します。

次に、取得したレコードID情報を使用して、対象データの削除または更新を実行します。

処理の流れ

ダイレクト検索とレコードID削除・更新の流れについて以下の図に示します。

図6.15 ダイレクト検索を使用したデータ削除/更新の流れ

データ操作の効果

通常のレコードIDによるデータ操作と比較して、ダイレクト検索を使用したデータ操作の効果について、以下に示しま

す。

- 91 -

図6.16 図:ダイレクト検索を使用したデータ操作の効果

通常のレコードIDを取得の検索処理がダイレクト検索に代わることで、searcherへのアクセスが不要になり、高速な処理

が実現できます。

以下に、Java API、.NET API、C APIの記述例を示します。

Java APIの場合

ダイレクト検索を使用してデータ削除を行う場合の記述例

ShunConnection con = new ShunConnection();

ShunPreparedKey preSkey = con.prepareSearchKey("key1", "/");

preSkey.add("20061101,00000001");

ShunResultSet rs = preSkey.searchByKey();

ShunPreparedRecordID prid = con.prepareDeleteRecordID();

while (rs.next()) {

prid.add(rs.getRecordID());

}

prid.deleteByRecordID();

prid.close();

rs.close();

preSkey.close();

con.close();

ダイレクト検索を使用してデータ更新を行う場合の記述例

- 92 -

ShunConnection con = new ShunConnection();

ShunPreparedKey preSkey = con.prepareSearchKey("key1", "/");

preSkey.add("20061101,00000001");

ShunResultSet rs = preSkey.searchByKey();

ShunPreparedRecordID prid = con.prepareUpdateRecordID();

while (rs.next()) {

prid.add(rs.getRecordID(), updateData);

}

prid.updateByRecordID();

prid.close();

rs.close();

preSkey.close();

con.close();

.NET APIの場合

ダイレクト検索を使用してデータ削除を行う場合の記述例

ShunService service = new ShunService();

service.Connect();

ShunRecord searchRecord = new ShunRecord();

searchRecord.Key = "20061101,00000001";

ShunKeyRequirement keyReq = new ShunKeyRequirement();

keyReq.KeyName = "key1";

keyReq.SearchType = ShunKeySearchType.CompleteMatch;

keyReq.Records.Add( searchRecord );

ShunResultSet rs = service.SearchByKey( keyReq, "/" );

ShunRecordCollection deleteRecords = new ShunRecordCollection();

foreach ( ShunRecord record in rs.Records ) {

deleteRecords.Add( record );

}

service.Delete( deleteRecords );

service.Disconnect();

ダイレクト検索を使用してデータ更新を行う場合の記述例

ShunService service = new ShunService();

service.Connect();

ShunRecord searchRecord = new ShunRecord();

searchRecord.Key = "20061101,00000001";

ShunKeyRequirement keyReq = new ShunKeyRequirement();

keyReq.KeyName = "key1";

keyReq.SearchType = ShunKeySearchType.CompleteMatch;

keyReq.Records.Add( searchRecord );

ShunResultSet rs = service.SearchByKey( keyReq, "/" );

ShunRecordCollection updateRecords = new ShunRecordCollection();

- 93 -

foreach ( ShunRecord record in rs.Records ) {

record.Data = updateData;

updateRecords.Add( record );

}

service.Update( updateRecords );

service.Disconnect();

C APIの場合

ダイレクト検索を使用してデータ削除を行う場合の記述例

/* 以下のように用意されていることを仮定しています */

/* pKey :ダイレクトアクセスキーを設定する構造体配列 */

SHUNHSTMT StmtH_Search;

SHUNHSTMT StmtH_Delete;

/* データ操作ハンドルの割当て */

ShunAllocHandle( ConH, &StmtH_Search );

ShunAllocHandle( ConH, &StmtH_Delete );

/* ダイレクトアクセスキーによる検索を実行 */

pKey[0].Key = "20061101,00000001";

pKey[0].Key_Len = strlen( pKey[0].Key );

ShunSearchKey( StmtH_Search, "key1", SHUN_KEY_COMPLETE_MATCH, 1, pKey, "/",

&Return_Cnt, &Rec_Id_Out, &Data, &Key_Out );

/* レコードIDによる削除を実行 */

if ( Return_Cnt > 0 ) {

ShunDeleteRecId( StmtH_Delete, Return_Cnt, Rec_Id_Out);

}

/* データ操作ハンドルの解放 */

ShunFreeHandle( StmtH_Search );

ShunFreeHandle( StmtH_Delete );

ダイレクト検索を使用してデータ更新を行う場合の記述例

/*以下のように用意されていることを仮定しています */

/* pKey :ダイレクトアクセスキーを設定する構造体配列 */

SHUNHSTMT StmtH_Search;

SHUNHSTMT StmtH_Update;

/* データ操作ハンドルの割当て */

ShunAllocHandle( ConH, &StmtH_Search );

ShunAllocHandle( ConH, &StmtH_Update );

/* ダイレクトアクセスキーによる検索を実行 */

pKey[0].Key = "20061101,00000001";

pKey[0].Key_Len = strlen( pKey[0].Key );

ShunSearchKey( StmtH_Update, "key1", SHUN_KEY_COMPLETE_MATCH, 1, pKey, "/",

&Return_Cnt, &Rec_Id_Out, &Data, &Key_Out);

/* レコードIDによる更新を実行 */

if ( Return_Cnt > 0 ) {

ShunUpdateRecId( StmtH_Update, Return_Cnt, Rec_Id_Out, updateData );

- 94 -

}

/* データ操作ハンドルの解放 */

ShunFreeHandle( StmtH_Search );

ShunFreeHandle( StmtH_Update );

6.7.2 ダイレクト削除またはダイレクト更新の使い方

ダイレクト削除またはダイレクト更新を使用したデータの削除および更新処理について説明します。

ダイレクトアクセスキーと削除または更新データを指定して、ダイレクト削除またはダイレクト更新APIを発行します。

ダイレクト削除またはダイレクト更新は、以下に示した2つの条件を満たしているときにご利用ください。

・ 削除または更新するデータの内容が判明している場合

・ アプリケーションを単独で実行する場合(アプリケーションの多重実行が発生しない環境)

処理の流れ

ダイレクト削除またはダイレクト更新の流れについて以下の図に示します。

図6.17 ダイレクト削除またはダイレクト更新の流れ

データ操作の効果

通常のレコードIDによるデータ操作と比較してダイレクト削除・ダイレクト更新を使用したデータ操作の効果について、以

下に示します。

- 95 -

図6.18 ダイレクト削除・ダイレクト更新を使用したデータ操作の効果

ダイレクト削除またはダイレクト更新では、事前のレコードIDによるデータ検索処理が不要なので、より高速に処理を実行

することができます。

- 96 -

第7章 Shunsaku File本章では、Shunsaku Fileの概要およびアクセス方法について説明します。

7.1 Shunsaku Fileの概要

複数の業務をShunsakuで同時に構築・運用する際、業務ごとに運用形態やハードウェアリソースを個別に決定したい場

合、Shunsaku Fileを利用します。

参照

Shunsaku Fileの機能概要および環境設定の詳細については、“導入・運用ガイド”の“Shunsaku File”を参照してくださ

い。

7.2 Shunsaku Fileへのアクセス方法

Shunsaku Fileにアクセスする方法について説明します。Shunsaku Fileにアクセスするためには、アプリケーションにShunsakuFileを指定します。

アプリケーションにShunsaku Fileを指定する方法は、以下の3種類の方法があります。

・ コネクション単位に指定する方法

・ API用動作環境ファイルに指定する方法

・ Shunsaku Fileが指定されていないアプリケーションのアクセス範囲の設定

以降に、Shunsaku Fileの指定方法について説明します。

7.2.1 コネクション単位に指定する方法

Shunsakuに接続する際に、APIのパラメタとしてShunsaku Fileを指定します。

・ Java APIでの指定方法

・ .NET APIでの指定方法

・ C APIでの指定方法

7.2.1.1 Java APIでの指定方法

ShunConnectionオブジェクトの作成時に、Shunsaku File名を指定します。

以降に、Shunsaku File名をコンストラクタに直接指定する方法を説明します。

記述形式

ShunConnection オブジェクト名 = new ShunConnection(ホスト名,ポート番号, Shunsaku File名);

- 97 -

引数

ホスト名

接続先のホスト名またはIPアドレスを指定します。

ポート番号

接続先のポート番号を指定します。

Shunsaku File名

接続先のShunsaku File名を指定します。

記述例

ホスト名“DirSvr1”、ポート番号“23101”、Shunsaku File名“fileA”の場合

ShunConnection con = new ShunConnection("DirSvr1",23101, "fileA");

ポイント

JavaのPropertiesで指定することも可能です。詳細は、“Java APIリファレンス”を参照してください。

7.2.1.2 .NET APIでの指定方法

ShunServiceオブジェクトを作成し、Shunsaku File名をプロパティで指定します。

C# .NETの記述例

ホスト名“DirSvr1”、ポート番号“23101”、Shunsaku File名“fileA”の場合

ShunService service = new ShunService();

service.Host = "DirSvr1";

service.Port = 23101;

service.ShunsakuFile = "fileA";

service.Connect();

VB .NETの記述例

ホスト名“DirSvr1”、ポート番号“23101”、Shunsaku File名“fileA”の場合

Dim service As New ShunService()

service.Host = "DirSvr1"

service.Port = 23101

service.ShunsakuFile = "fileA"

service.Connect()

- 98 -

ポイント

ShunServiceクラスのコンストラクタで指定することも可能です。詳細は、“.NET APIリファレンス”を参照してください。

7.2.1.3 C APIでの指定方法

ShunConnect関数のパラメタにShunsaku File名を指定します。

記述形式

ShunConnect(コネクションハンドル, ホスト名, ポート番号, Shunsaku File名);

引数

コネクションハンドル

コネクションを確立する対象のコネクションハンドルを指定します。

ホスト名

接続先のホスト名またはIPアドレスを指定します。

ポート番号

接続先のポート番号を指定します。

Shunsaku File名

接続先のShunsaku File名を指定します。

記述例

ホスト名“DirSvr1”、ポート番号“23101”、Shunsaku File名“fileA”の場合

SHUNHANDLE ConH;

/* コネクションハンドルの割当て */

ShunAllocHandle(NULL, &ConH)

/* ホスト名、ポート番号、Shunsaku File名を指定してコネクション確立 */

ShunConnect(ConH, "DirSvr1",23101, "fileA");

7.2.2 API用動作環境ファイルに指定する方法

API用動作環境ファイルのShunsakuFileパラメタにShunsaku File名を指定します。

API用動作環境ファイルの指定方法は、Java API、.NET APIおよびC APIで共通です。

API用動作環境ファイルの指定形式

ShunsakuFile Shunsaku File名

- 99 -

指定項目

ShunsakuFile

接続先のShunsaku File名を指定します。

指定例

Shunsaku File名が“fileA”の場合

# ファイル名を指定する場合

ShunsakuFile fileA

ポイント

・ API用動作環境ファイルにShunsaku File名を指定した場合は、APIのパラメタで指定する必要はありません。アプリ

ケーションを変更することなく、アクセスするShunsaku Fileを変更できます。

・ API用動作環境ファイルの変更結果を反映するためには、アプリケーションのプロセスの再起動を行います。

API用動作環境ファイルの詳細は、“導入・運用ガイド”の“API用動作環境ファイルの実行パラメタ”を参照してください。

7.2.3 Shunsaku Fileが指定されていないアプリケーションのアクセス範囲の設定

Shunsaku Fileが指定されていないアプリケーションのアクセス範囲を設定するには、conductor用動作環境ファイルの

DefaultFileパラメタにShunsaku File名を指定します。

特定のShunsaku Fileを、Shunsaku Fileが指定されていないアプリケーションのアクセス範囲に設定する手順を以下に示

します。

- 100 -

1. Shunsaku Fileが指定されていないアプリケーションのアクセス範囲に設定するShunsaku Fileを決定します。

2. conductor用動作環境ファイルの編集を行います。

Shunsaku Fileが指定されていないアプリケーションのアクセス範囲を設定する場合、DefaultFileパラメタを追加し

てください。

変更する場合には、DefaultFileパラメタを編集してください。

追加または編集する実行パラメタには以下のものがあります。

実行パラメタ名 意味

DefaultFileShunsaku Fileが指定されていないアプリケーショ

ンのアクセス範囲

参照

conductor用動作環境ファイルの実行パラメタの詳細については、“導入・運用ガイド”の“conductor用動作環境ファ

イルの実行パラメタ”を参照してください。

3. Shunsaku Fileの情報をconductorに反映するために、conductorを配置しているディレクタサーバでshunsyscfgeditコマンドを実行します。

shunsyscfgedit -n Shunsakuシステム名

7.3 Shunsaku Fileを切り替える方法

Shunsaku Fileは、コネクションの確立時に指定するほかに、コネクションの確立後に切り替えることも可能です。

以降に、Java API、.NET APIおよびC APIそれぞれについて説明します。

7.3.1 Java APIでの指定方法

setShunsakuFileNameメソッドのパラメタにShunsaku Fileを指定します。

- 101 -

記述形式

ShunConnectionオブジェクト.setShunsakuFileName( Shunsaku File名 );

引数

Shunsaku File名

切替え後のShunsaku File名を指定します。

記述例

Shunsaku File“fileA”からShunsaku File“fileB”へ切り替える場合

//fileAでコネクション確立

ShunConnection con = new ShunConnection("DirSvr1",23101, "fileA");

//fileBに切替え

con.setShunsakuFileName("fileB");

7.3.2 .NET APIでの指定方法

ChangeShunsakuFileメソッドのパラメタにShunsaku Fileを指定します。

記述形式

ShunServiceオブジェクト. ChangeShunsakuFile ( Shunsaku File名 );

引数

Shunsaku File名

切替え後のShunsaku File名を指定します。

記述例

Shunsaku File“fileA”からShunsaku File“fileB”へ切り替える場合

//fileAでコネクション確立

ShunService service = new ShunService();

service.Host = "DirSvr1";

service.Port = 23101;

service.ShunsakuFile = "fileA";

service.Connect();

:

//fileBに切替え

service.ChangeShunsakuFile("fileB");

:

- 102 -

7.3.3 C APIでの指定方法

ShunSetShunsakuFile関数のパラメタにShunsaku File名を指定します。

記述形式

ShunSetShunsakuFile(コネクションハンドル, Shunsaku File名);

引数

コネクションハンドル

コネクションハンドルを指定します。

Shunsaku File名

切り替え後のShunsaku File名を指定します。

記述例

Shunsaku File“fileA”からShunsaku File“fileB”へ切り替える場合

SHUNHANDLE ConH;

/* コネクションハンドルの割当て */

ShunAllocHandle(NULL, &ConH);

/* ホスト名、ポート番号、Shunsaku File名を指定してコネクション確立 */

ShunConnect(ConH, "DirSvr1",23101, "fileA");

/* fileBに切り替え */

ShunSetShunsakuFile(ConH, "fileB");

7.4 複数のShunsaku Fileを1つのトランザクションで扱う方法

複数のShunsaku Fileに対する更新処理を、1つのトランザクションとして取り扱う方法について説明します。

工場A~工場Cを所有するある会社の従業員情報管理を例に、説明します。

「データの関連性」を考慮し、Shunsaku Fileの構成を以下のようにしたとします。

・ 工場ごとに、FileA、FileBおよびFileCを設定

・ 会社全体の従業員の集計結果としてFileDを設定

ここで、工場Aの従業員が1人増えたとします。このとき、FileAに従業員の情報を追加し、集計結果であるFileDの従業員

の人数を増やす処理が必要です。しかし、この2つの更新処理は同期をとって実施する必要があります。このような場合

に、複数のShunsaku Fileを1つのトランザクションとして扱います。

- 103 -

図7.1 複数のShunsaku Fileに対する操作を1つのトランザクションで扱う例

7.4.1 Java APIの記述例

1つのトランザクションを扱うJava APIの場合の記述例について、以下に示します。

/*

* 以下のように用意されていることを仮定しています。

* sPerson :追加したい従業員の情報

* sQuery :検索式を格納した文字列

* sReturn :リターン式を格納した文字列

* updateData :更新データを格納した文字列

*/

ShunConnection con = null;

ShunPreparedStatement pstmt_insert = null;

ShunPreparedStatement pstmt_search = null;

ShunPreparedRecordID rid = null;

ShunResultSet rs = null;

try

{

// ShunConnectionオブジェクトを作成

// 接続先のホスト名:DirSvr1

// ポート番号:23101

// Shunsaku File名: fileA

con = new ShunConnection("DirSvr1", 23101, "fileA");

// 自動コミットを無効に設定

con.setAutoCommit(false);

// データ追加

pstmt_insert = con.prepareInsert();

pstmt_insert.add(sPerson);

pstmt_insert.executeInsert();

pstmt_insert.close();

//接続先のShunsaku FileをfileDに切替え

- 104 -

con.setShunsakuFileName("fileD");

// 更新用のデータを検索

pstmt_search = con.prepareSearch(sQuery, sReturn);

rs = pstmt_search.executeSearch();

//レコードIDを取得

String updateDataRecordID = null;

while(rs.next()) {

updateDataRecordID = rs.getRecordID();

}

pstmt_search.close();

rs.close();

//データ更新

rid = con.prepareUpdateRecordID();

rid.add(updateDataRecordID, updateData);

rid.updateByRecordID();

rid.close();

// ここまでの更新をコミット

con.commit();

con.close();

}

// アプリケーション実行時にエラーが発生した場合の処理

catch (ShunException ex)

{

//ロールバックを実施

if (con != null)

{

try

{

con.rollback();

}

catch (ShunException e)

{

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル:SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_TRANSACTION_ROLLEDBACK :

System.out.println("エラーレベル:

SHUN_ERROR_TRANSACTION_ROLLEDBACK");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル:SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_TRANSACTION_ROLLEDBACK :

System.out.println("エラーレベル :SHUN_ERROR_TRANSACTION_ROLLEDBACK");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

- 105 -

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex)

{

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

finally

{

try

{

if (rs != null)rs.close();

if (pstmt_insert != null)pstmt_insert.close();

if (pstmt_search != null)pstmt_search.close();

if (rid != null)rid.close();

if (con != null)con.close();

}

catch (ShunException ex)

{

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_TRANSACTION_ROLLEDBACK :

System.out.println("エラーレベル :SHUN_ERROR_TRANSACTION_ROLLEDBACK");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

7.4.2 .NET APIの記述例

1つのトランザクションを扱う.NET APIの場合の記述例について、以下に示します。

/*

* 以下のように用意されていることを仮定しています。

* sPerson :追加したい従業員の情報

* sQuery :検索式を格納した文字列

* sReturn :リターン式を格納した文字列

* updateData :更新データを格納した文字列

*/

// ShunServiceオブジェクトを作成

// 接続先のホスト名:DirSvr1

// ポート番号:23101

// Shunsaku File名: fileA

ShunService service = new ShunService();

service.Host = "DirSvr1";

service.Port = 23101;

service.ShunsakuFile = "fileA";

- 106 -

service.Connect();

// 自動コミットを無効に設定

service.AutoCommit = false;

ShunRecordCollection insertRecords = new ShunRecordCollection();

ShunRecord personRecord = new ShunRecord( sPerson );

insertRecords.Add( personRecord );

// データ追加

service.Insert( insertRecords );

//接続先のShunsaku FileをfileDに切替え

service.ChangeShunsakuFile("fileD");

ShunSearchRequirement req = new ShunSearchRequirement();

req.QueryExpression = sQuery;

req.ReturnExpression = sReturn;

// 更新用のデータを検索

ShunResultSet rs = service.Search( req );

ShunRecord updateRecord = null;

foreach ( ShunRecord record in rs.Records ) {

updateRecord = record;

}

updateRecord.Data = updateData;

ShunRecordCollection updateRecords = new ShunRecordCollection();

updateRecords.Add( updateRecord );

//データ更新

service.Update( updateRecords );

// ここまでの更新をコミット

service.Commit();

service.Disconnect();

7.4.3 C APIの記述例

1つのトランザクションを扱うC APIの場合の記述例について、以下に示します。

/*以下のように用意されていることを仮定しています */

/* personData :追加したい従業員の情報 */

/* query :検索式 */

/* returnQuery:リターン式 */

/* updateData :更新データ */

/* pResultId :レコードIDを保持する構造体配列 */

/* pUpdateId :更新用レコードIDを設定する構造体配列 */

/* コネクションハンドルの割当て */

ret = ShunAllocHandle(NULL, &ConH);

if(ret != SHUN_SUCCESS) {

error("ShunAllocHandle ", ConH);

return;

}

/* ホスト名・ポート番号・Shunsaku Fileを指定してコネクションを確立 */

ret = ShunConnect(ConH, "DirSvr1", 23101, "FileA");

if(ret != SHUN_SUCCESS) {

error("ShunConnect ", ConH);

return;

- 107 -

}

/* 追加用のデータ操作ハンドル割当て */

ret = ShunAllocHandle(ConH, &insertStmtH);

if(ret != SHUN_SUCCESS) {

error("ShunAllocHandle ", ConH);

return;

}

/* 自動コミットを無効に切替え */

ret = ShunSetConnectAttr(ConH, SHUN_ATTR_AUTOCOMMIT, SHUN_FALSE);

if(ret != SHUN_SUCCESS) {

error("ShunSetConnectAttr ", ConH);

return;

}

/* データ追加 */

ret = ShunInsert(insertStmtH, 1, personData);

if(ret != SHUN_SUCCESS) {

error("ShunInsert ", insertStmtH);

return;

}

/*追加用のデータ操作ハンドルの解放 */

ret = ShunFreeHandle(insertStmtH);

if(ret != SHUN_SUCCESS) {

error("ShunFreeHandle ", insertStmtH);

return;

}

/* Shunsaku FileをFileDに切替え */

ret = ShunSetShunsakuFile(ConH, "FileD");

if(ret != SHUN_SUCCESS) {

error("ShunSetShunsakuFile", 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 = ShunAllocHandle(ConH, &updateStmtH);

if(ret != SHUN_SUCCESS) {

error("ShunAllocHandle ", ConH);

return;

}

/* 0番目のデータを更新対象とする */

pUpdateId[0] = pResultId[0];

- 108 -

/* データを更新 */

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);

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);

}

ret = ShunFreeHandle(ConH);

return;

}

7.5 Shunsaku Fileの使用上の注意

Shunsaku Fileの使用上の注意について説明します。

7.5.1 Shunsaku Fileを作成する場合の注意

Shunsaku Fileを作成する場合は、必ず以下の1から3のいずれかの方法で指定してください。

1. コネクション単位の指定

2. API用動作環境ファイルに指定

3. conductor用動作環境ファイルのDefaultFileの指定

なお、指定における優先順位は、上記の1から3の順で有効になります。

- 109 -

7.5.2 APIによるデータ更新における注意

APIによるデータの更新はFileに対して行ってください。Domainに対しては検索業務のみ行うことができます。

7.5.3 ダイレクトアクセスにおける注意

Shunsaku File に対してのダイレクトアクセスキーを指定したデータ操作は実行可能ですが、横断検索を目的としたDomainに対してのダイレクトアクセスキーを指定したデータ操作はできません。

7.5.4 複数のShunsaku Fileを扱う場合の注意

複数のShunsaku Fileに対する更新を、1つのトランザクションとして取り扱う場合の注意事項について説明します。

複数のShunsaku Fileを1つのトランザクションで扱う例で、fileAを動的変更(shunsyscfgeditコマンドを実行)する場合に

は、以下のような動作となります。

図7.2 トランザクションに関係するShunsaku Fileの場合

注意

複数のShunsaku Fileに対する更新処理を、1つのトランザクションで実施する場合、Shunsaku Fileを切り替えるときに、切

替え前のShunsaku Fileに対してもアクセスが実行されます。このため、切替え前のShunsaku Fileに異常が発生している

場合には、Shunsaku Fileの切替えに失敗しトランザクションはロールバックされます。

- 110 -

トランザクションに関係するShunsaku Fileの動的変更を実施した場合、コネクションは切断され、トランザクションもロール

バックされます。

図7.3 トランザクションに関係のないShunsaku Fileの場合

上記の図のようにトランザクションが発生していなければ、コネクションは継続し、エラーも発生しません。

参照

アプリケーションとshunsyscfgeditコマンドの競合関係の詳細については、“導入・運用ガイド”の“競合関係”を参照してく

ださい。

7.5.5 32ビットから64ビットへの移行時の注意

Shunsaku の C API を使用しているアプリケーションを、32ビットから64ビットに移行する作業について説明します。

移行作業が必要な場合について

以下の条件のいずれかを満たす場合、プログラムソースの書換えが必要になります。

・ ShunGetConnectAttr関数の第2引数の属性に SHUN_ATTR_SHUNSAKU_FILEを指定している場合

・ ShunSetConnectAttr関数の第2引数の属性に SHUN_ATTR_SHUNSAKU_FILEを指定している場合

上記条件に当てはまらない場合、Shunsakuとしての移行作業は必要ありません。

各動作OSで必要なアプリケーションの64ビット対応(64ビットへの移植)作業を実施してください。

- 111 -

移行作業

ShunGetConnectAttr関数の移行作業

ShunGetConnectAttr関数の第2引数の属性に SHUN_ATTR_SHUNSAKU_FILEを指定している場合、代わりに

ShunGetShunsakuFile 関数を使用します。ShunGetConnectAttr関数の第3引数に指定しているShunsaku File 名の領

域へのポインタを、ShunGetShunsakuFile関数の第2引数に指定します。

記述例

移行前

ret = ShunGetConnectAttr( ConH, SHUN_ATTR_SHUNSAKU_FILE, (int*)&filename );

移行後

ret = ShunGetShunsakuFile( ConH, &filename );

ShunSetConnectAttr関数の移行作業

ShunSetConnectAttr関数の第2引数の属性に SHUN_ATTR_SHUNSAKU_FILEを指定している場合、代わりに

ShunSetShunsakuFile 関数を使用します。ShunSetConnectAttr関数の第3引数に指定しているShunsaku File 名を、

ShunSetShunsakuFile関数の第2引数に指定します。

記述例

移行前

ret = ShunSetConnectAttr( ConH, SHUN_ATTR_SHUNSAKU_FILE, (int)"file1" );

移行後

ret = ShunSetShunsakuFile( ConH, "file1" );

- 112 -

第8章 アプリケーションのデバッグ

本章では、アプリケーションのデバッグについて説明します。

8.1 アプリケーションのデバッグ方法

アプリケーションのデバッグ方法について説明します。

8.1.1 デバッガを利用したデバッグ

デバッガを利用してデバッグする方法です。

デバッガを利用すると、開発したアプリケーションを実行させながら、処理の論理的な誤りを検出することができます。

通常、プログラムソース上に中断点を設定し、中断点で停止した状態でプログラム中の変数を参照あるいは、変更しなが

らデバッグを行います。

Java APIの場合

Java APIの場合は、StudioまたはApworksが提供するデバッガなどを利用してデバッグします。

デバッガを利用したデバッグの詳細については、以下のStudioまたはApworksのオンラインマニュアルを参照してくださ

い。

・ Apdesignerユーザーズガイド

.NET APIの場合

.NETアプリケーションは、統合開発環境であるMicrosoft(R) Visual Studio(R) .NETを利用すると、効率よく開発すること

ができます。

.NET APIの場合は、Microsoft(R) Visual Studio(R) .NETが提供するデバッガを利用してデバッグします。

注意

Webアプリケーションをデバッグする場合は、開発環境にInternet Information Serviceがインストールされている必要があ

ります。

8.1.2 アプリケーションのデバッグ情報を利用したデバッグ

アプリケーションの開発時に、あらかじめデバッグ情報を標準出力や標準エラー出力に出力する処理を記述しておき、

その情報をもとにデバッグする方法です。

8.1.3 APIスナップを利用したデバッグ

APIスナップは、Java API、.NET APIまたはC APIの各種入出力情報のロギングを行う機能です。

ロギングを行った情報から以下の情報を読み取ることができ、Java API、.NET APIまたはC APIを利用したアプリケーショ

ンを開発する際のデバッグ情報として使用できます。

- 113 -

・ メソッドまたは関数の呼出しシーケンス

・ メソッドまたは関数の復帰情報、パラメタ情報、発生した例外またはエラー情報

・ メソッドまたは関数の実行時間

・ 性能ログに出力されている依頼番号(Shunsakuシステム内で一意な番号)

APIスナップが出力する情報

APIスナップには以下の情報が出力されます。

表8.1 APIスナップが出力する情報の一覧

種別 内容

Java APIの各種入出力情報 アプリケーションから呼び出されたJavaAPIの、以下のメソッド情報を出力しま

す。(注)

・ メソッド呼出し時の情報

・ メソッド復帰時の情報

・ メソッドで例外が発生したときの情報

出力内容、出力形式、出力例などの詳

細は、“8.1.4 Java APIのメソッド情報”を

参照してください。

.NET APIの各種入出力情報 アプリケーションから呼び出された.NETAPIの、以下のメソッド情報を出力しま

す。(注)

・ メソッド呼出し時の情報

・ メソッド復帰時の情報

・ メソッドで例外が発生したときの情報

出力内容、出力形式、出力例などの詳

細は、“8.1.5 .NET APIのメソッド情報”を

参照してください。

C APIの各種入出力情報 アプリケーションから呼び出されたC APIの、以下の関数情報を出力します。

・ 関数呼出し時の情報

・ 関数復帰時の情報

・ 関数でエラーが発生したときの情報

出力内容、出力形式、出力例などの詳

細は、“8.1.6 C APIの関数情報”を参照

してください。

注) ShunExceptionクラスの各種入出力情報は出力されません。

参照

性能ログの出力内容については、“導入・運用ガイド”の“性能ログの出力情報”を参照してください。

- 114 -

APIスナップの環境設定

APIスナップを出力する場合は、API用動作環境ファイルに、以下の実行パラメタを設定します。

・ SnapLevel

・ LogFile

・ LogFileSize

・ LogFileBackup

・ PfmLog

参照

API用動作環境ファイルの詳細は、“2.4 動作環境ファイルの設定”または“付録A API用動作環境ファイルの実行パラメ

タ”を参照してください。

8.1.4 Java APIのメソッド情報

アプリケーションから呼び出されたメソッド情報は、アプリケーションからの呼出し時、復帰時、および例外発生時に出力

されます。

出力形式

APIスナップは、CSV形式で出力します。

以下に、出力レベルごとの出力形式を説明します。

レベル1

メソッド呼出し時

完全修飾クラス名,コネクションID,スレッド名,日付,時間,Call,クラス名,メソッド名

メソッド復帰時

完全修飾クラス名,コネクションID,スレッド名,日付,時間,Return,クラス名,メソッド名,メソッド実行時間,,性能情

エラー復帰時

完全修飾クラス名,コネクションID,スレッド名,日付,時間,Throw,クラス名,メソッド名,メソッド実行時間,例外クラ

ス名: 例外詳細文字列,性能情報

レベル2

メソッド呼出し時

完全修飾クラス名,コネクションID,スレッド名,日付,時間,Call,クラス名,メソッド名,,パラメタ情報

- 115 -

メソッド復帰時

完全修飾クラス名,コネクションID,スレッド名,日付,時間,Return,クラス名,メソッド名,メソッド実行時間,復帰値情

報,性能情報

エラー復帰時

完全修飾クラス名,コネクションID,スレッド名,日付,時間,Throw,クラス名,メソッド名,メソッド実行時間,例外クラ

ス名 : 例外詳細文字列,性能情報

出力内容

以下に出力される項目と内容を説明します。

表8.2 Java APIのメソッド情報の出力内容の一覧

出力項目 内容 出力レベル

レベル1 レベル2

完全修飾クラ

ス名

APIを呼び出した完全修飾クラス名

を表示します。○ ○

コネクションID コネクションオブジェクトのIDを出

力します。○ ○

スレッド名 スレッド名を出力します。 ○ ○

日付 メソッド呼出しの開始/終了の日付

を“年/月/日”の形式で出力します。○ ○

時間 メソッド呼出しの開始/終了の時間

を“時:分:秒.ミリ秒”の形式で出力

します。

○ ○

CallReturnThrow

“Call”:メソッド呼出し時の情報で

あることを示します。

“Return”:メソッド復帰時の情報で

あることを示します。

“Throw”:メソッドで例外が発生し

たことを示します。

○ ○

クラス名 呼び出されたJava APIのクラス名を

出力します。○ ○

メソッド名 呼び出されたJava APIのメソッド名

を出力します。○ ○

メソッド実行時

メソッド呼出しから復帰までにかかっ

た時間を出力します。単位は秒で

す。

○ ○

パラメタ情報 メソッド呼出し時のパラメタ情報(パ

ラメタの型、値)を以下の形式で出

力します。

・ (パラメタの型)値

または

・ (パラメタの型)<Object>

× ○

- 116 -

出力項目 内容 出力レベル

レベル1 レベル2

パラメタがない場合は、本項目は

表示されません。

復帰値情報 メソッドの復帰値情報(復帰値の

型、値)を以下の形式で出力しま

す。

・ (復帰値の型)値

または

・ (復帰値の型)<Object>

voidの場合は、本項目は出力され

ません。

× ○

例外クラス名 メソッド呼出しで例外が発生した場

合の例外クラス名を出力します。

また、発生した例外に詳細文字列

が含まれている場合は、その詳細

文字列も出力されます。

○ ○

性能情報 性能ログに出力されている依頼番

号(Shunsakuシステム内で一意な

番号)を出力します。(注1)依頼番号は、conductorおよび

directorで採番されます。(注2)

○(注2) ○(注2)

○:出力される項目

×:出力されない項目

注1) 性能ログの出力内容については、“導入・運用ガイド”の“性能ログの出力情報”を参照してください。

注2) 性能情報を出力したい場合は、API用動作環境ファイルのPfmLogパラメタの設定が必要です。

出力例

スナップに出力する情報は、Java APIが動作するプラットフォームの文字コードで出力します。

以下に、出力例を出力レベルごとに示します。

レベル1

正常終了時

"JavaAPISample2",

2951274,"main","2006/10/22","10:06:53.975","Call","ShunConnection","ShunConnection"

"JavaAPISample2",

2951274,"main","2006/10/22","10:06:54.385","Return","ShunConnection","ShunConnection",

0.41,,"42d234c100000100"

異常終了時

"JavaAPISample2",2951274,"main","2006/10/22","14:55:07.001","Call","ShunConnection","ShunConnection"

"JavaAPISample2",2951274,"main","2006/10/22","14:55:09.144","Throw","ShunConnection","ShunConnection",2.143,

"com.fujitsu.shun.common.ShunException: shn30606u:Either the director or the conductorhas not been started, or

the port number is incorrect.

at com.fujitsu.shun.core.AccessStreamBasic.connect(AccessStreamBasic.java:181)

at com.fujitsu.shun.core.AccessStream.connect(AccessStream.java:133)

- 117 -

at com.fujitsu.shun.core.AccessStream.<init>(AccessStream.java:124)

at com.fujitsu.shun.ShunConnection.openConnection(ShunConnection.java:1600)

at com.fujitsu.shun.ShunConnection.<init>(ShunConnection.java:391)

at JavaAPISample2.main(JavaAPISample2.java:33)

",

レベル2

正常終了時

"JavaAPISample2",

2951274,"main","2006/10/22","10:07:55.103","Call","ShunConnection","ShunConnection",,"(String)local

host,(int)10007,(String)file1"

"JavaAPISample2",

2951274,"main","2006/10/22","10:07:55.523","Return","ShunConnection","ShunConnection",

0.42,"","42d234c100000100"

異常終了時

"JavaAPISample2",

2951274,"main","2006/10/22","14:55:07.001","Call","ShunConnection","ShunConnection",,"

(String)localhost,(int)10007,(String)file1"

"JavaAPISample2",

2951274,"main","2006/10/22","14:55:09.144","Throw","ShunConnection","ShunConnection",2.143,

"com.fujitsu.shun.common.ShunException: shn30606u:Either the director or the conductor has not been

started, or the port number is incorrect.

at com.fujitsu.shun.core.AccessStreamBasic.connect(AccessStreamBasic.java:181)

at com.fujitsu.shun.core.AccessStream.connect(AccessStream.java:133)

at com.fujitsu.shun.core.AccessStream.<init>(AccessStream.java:124)

at com.fujitsu.shun.ShunConnection.openConnection(ShunConnection.java:1600)

at com.fujitsu.shun.ShunConnection.<init>(ShunConnection.java:391)

at JavaAPISample2.main(JavaAPISample2.java:33)

",

ポイント

・ 文字列項目は二重引用符(")で囲みます。

・ 数値項目は二重引用符(")で囲みません。

参考

採取したログファイルは、コネクションIDでフィルタを掛けることにより、コネクションごとの操作を時系列でトレースすること

が可能です。

8.1.5 .NET APIのメソッド情報

アプリケーションから呼び出されたメソッド情報は、アプリケーションからの呼出し時、復帰時、および例外発生時に出力

されます。

- 118 -

出力形式

APIスナップは、CSV形式で出力します。

以下に、出力レベルごとの出力形式を説明します。

レベル1

メソッド呼出し時

プログラム名,サービスID,スレッド名,日付,時間,Call,クラス名,メソッド名

メソッド復帰時

プログラム名,サービスID,スレッド名,日付,時間,Return,クラス名,メソッド名,メソッド実行時間,,性能情報

エラー復帰時

プログラム名,サービスID,スレッド名,日付,時間,Throw,クラス名,メソッド名,メソッド実行時間,例外クラス名: 例

外詳細文字列,性能情報

レベル2

メソッド呼出し時

プログラム名,サービスID,スレッド名,日付,時間,Call,クラス名,メソッド名,,パラメタ情報

メソッド復帰時

プログラム名,サービスID,スレッド名,日付,時間,Return,クラス名,メソッド名,メソッド実行時間,復帰値情報,性能

情報

エラー復帰時

プログラム名,サービスID,スレッド名,日付,時間,Throw,クラス名,メソッド名,メソッド実行時間,例外クラス名 : 例

外詳細文字列,性能情報

出力内容

以下に出力される項目と内容を説明します。

表8.3 .NET APIのメソッド情報の出力内容の一覧

出力項目 内容 出力レベル

レベル1 レベル2

プログラム名 APIを呼び出したプログラム名を出

力します。○ ○

サービスID ShunServiceオブジェクトのIDを出

力します。(注1)○ ○

スレッド名 スレッド名を出力します。 ○ ○

- 119 -

出力項目 内容 出力レベル

レベル1 レベル2

日付 メソッド呼出しの開始/終了の日付

を“年/月/日”の形式で出力します。○ ○

時間 メソッド呼出しの開始/終了の時間

を“時:分:秒.ミリ秒”の形式で出力

します。

○ ○

CallReturnThrow

“Call”:メソッド呼出し時の情報で

あることを示します。

“Return”:メソッド復帰時の情報で

あることを示します。

“Throw”:メソッドで例外が発生し

たことを示します。

○ ○

クラス名 呼び出された.NET APIのクラス名

を出力します。○ ○

メソッド名 呼び出された.NET APIのメソッド名

を出力します。

プロパティの取得または設定時は、

それぞれ対応したメソッド名が出力

されます。

○ ○

メソッド実行時

メソッド呼出しから復帰までにかかっ

た時間を出力します。単位は秒で

す。

○ ○

パラメタ情報 メソッド呼出し時のパラメタ情報(パ

ラメタの型、値)を以下の形式で出

力します。

・ (パラメタの型)値

または

・ (パラメタの型)<Object>

パラメタがない場合は、本項目は出

力されません。

× ○

復帰値情報 メソッドの復帰値情報(復帰値の

型、値)を以下の形式で出力しま

す。

・ (復帰値の型)値

または

・ (復帰値の型)<Object>

voidの場合は、本項目は出力され

ません。

× ○

例外クラス名 メソッド呼出しで例外が発生した場

合の例外クラス名を出力します。

また、発生した例外に詳細文字列

が含まれている場合は、その詳細

文字列も出力されます。

○ ○

性能情報 性能ログに出力されている依頼番

号(Shunsakuシステム内で一意な

番号)を出力します。(注2)○(注3) ○(注3)

- 120 -

出力項目 内容 出力レベル

レベル1 レベル2

依頼番号は、conductorおよび

directorで採番されます。(注2)

○:出力される項目

×:出力されない項目

注1) ShunServiceオブジェクトに関係なく作成されたオブジェクトは、そのメソッド情報のサービスIDには0が出力され

ます。

注2) 性能ログの出力内容については、“導入・運用ガイド”の“性能ログの出力情報”を参照してください。

注3) 性能情報を出力したい場合は、API用動作環境ファイルのPfmLogパラメタの設定が必要です。

出力例

スナップに出力する情報は、.NET APIが動作するプラットフォームの文字コードで出力します。

以下に、出力例を出力レベルごとに示します。

レベル1

正常終了時

"sample.exe",

2,"(3964)","2006/04/19","21:32:35.151","Call","ShunService","GetHitCount",

,,

"sample.exe",

2,"(3964)","2006/04/19","21:32:35.198","Return","ShunService","GetHitCount

",0.046875,,"44462b7f00000002"

異常終了時

"sample.exe",

2,"(3964)","2006/04/19","21:32:35.198","Call","ShunService","GetHitCount",

,,

"sample.exe",

2,"(3964)","2006/04/19","21:32:35.214","Throw","ShunService","GetHitCount"

,0.015625,"InvalidOperationException:

shn30910u:Connection has not been connected.",

レベル2

正常終了時

"sample.exe",

2,"(3436)","2006/04/19","21:33:37.417","Call","ShunService","GetHitCount",

,"(String) /document/base/prefecture == '大阪' ",

"sample.exe",

2,"(3436)","2006/04/19","21:33:37.448","Return","ShunService","GetHitCount

",0.03125,"(Int32) 5 ","44462b7f00000004"

異常終了時

- 121 -

"sample.exe",

2,"(3436)","2006/04/19","21:33:37.448","Call","ShunService","GetHitCount",

,"(String) /document/base/prefecture == '大阪' ",

"sample.exe",

2,"(3436)","2006/04/19","21:33:37.464","Throw","ShunService","GetHitCount"

,0.015625,"InvalidOperationException:

shn30910u:Connection has not been connected.",

ポイント

・ 文字列項目は二重引用符(")で囲みます。

・ 数値項目は二重引用符(")で囲みません。

参考

採取したスナップは、サービスIDやスレッド名を利用することで操作を時系列でトレースすることが可能です。

8.1.6 C APIの関数情報

アプリケーションから呼び出された関数の情報は、アプリケーションからの呼出し時、復帰時、および関数の実行でエラー

が発生したときに出力されます。

出力形式

APIスナップは、CSV形式で出力します。

以下に、出力レベルごとの出力形式を説明します。

レベル1

関数呼出し時

プログラム名,コネクションハンドルID,スレッドID,日付,時間,Call,関数名

関数復帰時

プログラム名,コネクションハンドルID,スレッドID,日付,時間,Return,関数名,関数実行時間,復帰値,,性能情報

エラー復帰時

プログラム名,コネクションハンドルID,スレッドID,日付,時間,Error,関数名,関数実行時間,復帰値,エラー詳細文字

列,性能情報

レベル2

関数呼出し時

プログラム名,コネクションハンドルID,スレッドID,日付,時間,Call,関数名,,,入力パラメタ情報

- 122 -

関数復帰時

プログラム名,コネクションハンドルID,スレッドID,日付,時間,Return,関数名,関数実行時間,復帰値,出力パラメタ情

報,性能情報

エラー復帰時

プログラム名,コネクションハンドルID,スレッドID,日付,時間,Error,関数名,関数実行時間,復帰値,エラー詳細文字

列,性能情報

出力内容

以下に出力される項目と内容を説明します。

表8.4 C APIの関数情報の出力内容の一覧

出力項目 内容 出力レベル

レベル1 レベル2

プログラム名 呼出し元プログラムの名前を表示し

ます。○ ○

コネクション

ハンドルIDコネクションハンドルのIDを出力し

ます。

コネクションハンドルの割当て時に

ShunAllocHandle関数が返す値で

す。

○ ○

スレッドID スレッドIDを出力します。 ○ ○

日付 関数呼出しの開始/終了の日付

を“年/月/日”の形式で出力します。○ ○

時間 関数呼出しの開始/終了の時間

を“時:分:秒.ミリ秒”の形式で出力し

ます。

○ ○

CallReturnError

“Call”:関数呼出し時の情報である

ことを示します。

“Return”:関数復帰時の情報である

ことを示します。

“Error”:関数の実行時にエラーが

発生したことを示します。

○ ○

関数名 呼び出されたC APIの関数名を出

力します。○ ○

関数実行時

関数呼出しから復帰までにかかっ

た時間を出力します。単位は秒で

す。

○ ○

復帰値 復帰値を出力します。

“SHUN_SUCCESS”:関数が正常

に終了したことを示します。

“SHUN_ERROR”:関数の実行時

に問題が検出されたことを示しま

す。

○ ○

エラー詳細

文字列

関数呼出しでエラーが発生した場

合の詳細文字列を出力します。○ ○

- 123 -

出力項目 内容 出力レベル

レベル1 レベル2

詳細文字列が含まれていない場合

は、本項目は出力しません。

入力パラメタ

情報

関数呼出し時の入力パラメタ情報

(パラメタの型、値)を以下の形式で

出力します。

・ (パラメタの型)値

パラメタの型が、ハンドルや構造体

のポインタの場合は、以下の形式で

出力します。

・ (パラメタの型)値[値の16進数表

現]

× ○

出力パラメタ

情報

関数復帰時の出力パラメタ情報(パ

ラメタの型、値)を以下の形式で出

力します。

・ (パラメタの型)値

出力パラメタがない場合は、本項目

は出力されません。

× ○

性能情報 性能ログに出力されている依頼番号

(Shunsakuシステム内で一意な番

号)を出力します。(注1)依頼番号は、conductorおよび

directorで採番されます。(注2)

○(注2) ○(注2)

○:出力される項目

×:出力されない項目

注1) 性能ログの出力内容については、“導入・運用ガイド”の“性能ログの出力情報”を参照してください。

注2) 性能情報を出力したい場合は、API用動作環境ファイルのPfmLogパラメタの設定が必要です。

出力例

以下に、出力例を出力レベルごとに示します。

レベル1

正常終了時

"sample_hit_count",9449912,2820,"2006/10/22","11:58:10.380","Call","ShunConnect"

"sample_hit_count",9449912,2820,"2006/10/22","11:58:10.380","Return","ShunConnect",

0.015,"SHUN_SUCCESS",,"42d234c100000100"

異常終了時

"sample_hit_count",9449912,3540,"2006/10/22","14:34:37.270","Call","ShunConnect"

"sample_hit_count",9449912,3540,"2006/10/22","14:34:38.286","Error","ShunConnect",

1.016,

"SHUN_ERROR","shn30654u:Either the director or the conductor has not been started,

or the port number is incorrect. <ShunConnect>",

- 124 -

レベル2

正常終了時

"sample_hit_count",

9449912,3116,"2006/10/22","11:58:19.661","Call","ShunConnect",,,"(SHUNHCON)3554328[

00363C18] (char*)DirSvr1 (int)23101 (char*)shunsakuFile1"

"sample_hit_count",9449912,3116,"2006/10/22","11:58:19.661","Return","ShunConnect",

0.015,"SHUN_SUCCESS","","42d234c100000100"

異常終了時

"sample_hit_count",9449912,3540,"2006/10/22","14:34:37.270","Call","ShunConnect",,,

"(SHUNHCON)3427440[00344C70] (char*) localhost (int)10007 (char*)file1"

"sample_hit_count",9449912,3540,"2006/10/22","14:34:38.286","Error","ShunConnect",

1.016,

"SHUN_ERROR","shn30654u:Either the director or the conductor has not been started,

or the port number is incorrect. <ShunConnect>",

ポイント

・ 文字列項目は二重引用符(")で囲みます。

・ 数値項目は二重引用符(")で囲みません。

参考

採取したログファイルは、コネクションハンドルIDでフィルタを掛けることにより、コネクションごとの操作を時系列でトレー

スすることが可能です。

- 125 -

第2部 APIでのアプリケーション開発第2部では、ShunsakuのAPIを使用したアプリケーション開発についてAPI別に説明します。

第9章 Java APIのアプリケーション開発.....................................................................................127

第10章 .NET APIのアプリケーション開発...................................................................................170

第11章 C APIのアプリケーション開発........................................................................................209

- 126 -

第9章 Java APIのアプリケーション開発

本章では、ShunsakuのJava APIを利用したアプリケーション開発について説明します。

9.1 Java APIの概要

Java APIとは、Java言語で作成したアプリケーションからShunsakuのデータを操作するためのインタフェースです。

Java APIのクラスの一覧を以下の表に示します。

表9.1 Java APIのクラスの一覧

クラス名 説明

ShunConnection Shunsakuとのコネクションを表現するクラスです。

ShunPreparedKey ダイレクトアクセスキーによりデータの検索、XML文書の更

新およびXML文書の削除を行うクラスです。

ShunPreparedRecordID レコードIDによりXML文書の検索、XML文書の更新および

XML文書の削除を行うクラスです。

ShunPreparedStatement 検索式によるデータの検索およびXML文書を追加するク

ラスです。

ShunResultSet 検索した結果を表現するクラスです。

ShunException Shunsaku Java APIで発生するエラー情報を提供するクラス

です。

参照

ShunsakuのJava APIの詳細については、“Java APIリファレンス”を参照してください。

Java APIを使用することでオブジェクトが作成されます。各クラスのオブジェクトの作成・解放契機の一覧を以下の表に示

します。

表9.2 各クラスのオブジェクトの作成・解放契機の一覧

オブジェクト名 作成契機 解放契機

ShunConnection コンストラクタによりShunConnectionオブジェクトを作成します。

ShunConnectionクラスのcloseメソッドによりShunConnectionオブジェクトを解放します。

ShunPreparedKey ShunConnectionクラスの

prepareDeleteKeyメソッド、

prepareSearchKeyメソッドおよび

prepareUpdateKeyメソッドにより

ShunPreparedKeyオブジェクトを作成

します。

ShunPreparedKeyクラスのcloseメソッドによりShunPreparedKeyオブジェクトを解放します。

ShunPreparedRecordID

ShunConnectionクラスの

prepareDeleteRecordIDメソッド、

prepareSearchRecordIDメソッドおよ

びprepareUpdateRecordIDメソッドに

ShunPreparedRecordIDクラス

のcloseメソッドにより

ShunPreparedRecordIDオブ

ジェクトを解放します。

- 127 -

オブジェクト名 作成契機 解放契機

よりShunPreparedRecordIDオブジェ

クトを作成します。

ShunPreparedStatement

ShunConnectionクラスの

prepareInsertメソッドおよび

prepareSearchメソッドにより

ShunPreparedStatementオブジェクト

を作成します。

ShunPreparedStatementクラス

のcloseメソッドにより

ShunPreparedStatementオブ

ジェクトを解放します。

ShunResultSet ShunPreparedRecordIDクラスの

searchByRecordIDメソッドおよび

ShunPreparedStatementクラスの

executeSearchメソッドにより

ShunResultSetオブジェクトを作成しま

す。

ShunResultSetクラスのcloseメソッドによりShunResultSetオブ

ジェクトを解放します。

ShunException Java APIでエラーが発生した場合に

作成されるオブジェクトです。

アプリケーション終了時に解放

します。

9.2 StudioまたはApworksを利用したアプリケーション開発方法

Shunsakuのアプリケーションは、Java統合開発環境であるStudioまたはApworksを利用すると、効率よく開発することがで

きます。StudioまたはApworksのShunsakuのアプリケーション開発支援機能は、対話形式のウィザードを操作することで

アプリケーションのひな形を自動生成するため、必要 小限の開発量で効率的に開発することができます。

9.2.1 StudioまたはApworksで開発するメリット

StudioまたはApworksを利用してShunsakuのアプリケーション開発をすることで次のようなメリットがあります。

・ Shunsakuから検索結果を返すクラスのひな形を自動生成します。

・ 自動生成したソースに対してビジネスロジックを追加するだけで、業務アプリケーションを簡単に構築できます。

・ Interstage Application ServerおよびFramework Suiteと連携するWebアプリケーションを容易に開発できます。

9.2.2 StudioまたはApworksを利用した開発の流れ

StudioまたはApworksを利用したWebアプリケーション開発の簡単な流れを以下に説明します。詳細はInterstage StudioまたはApworksの以下のオンラインマニュアルを参照してください。

・ Apdesigner プログラマーズガイド

・ Apdesigner ユーザーズガイド

・ Apdesigner チュートリアル

StudioまたはApworksを利用した開発の流れを以下の図に示します。

- 128 -

図9.1 StudioまたはApworksを利用した開発の流れ

プロジェクト作成

作成するアプリケーションに沿ったプロジェクトを作成します。プロジェクトの作成は、生成ウィザードとの対話で簡単に作

成することができます。ShunsakuのWebアプリケーションを開発する場合には、「Webアプリケーションプロジェクト

(Apcoordinator)」を選択してください。

ソース生成・編集

Shunsakuからの検索結果を画面表示するWebアプリケーションのひな形を自動生成します。開発者は、必要 小限の

開発量で効率的に開発することができます。Shunsakuに対する更新処理については、StudioまたはApworksによるひな

形生成を行わないため、自動生成されたShunsakuアクセスクラスやビジネスクラスにJava APIを使用した更新処理を、開

発者が記述してください。

Shunsakuアクセスクラスの作成

Java APIのXML文書を検索できるインタフェースを扱いやすいようにしたクラスです。Shunsakuアクセスソース生成

ウィザードで作成します。

検索メソッドの作成

Shunsakuアクセスソース生成ウィザードの[検索メソッドの作成]ページで、検索メソッドをShunsakuアクセスクラスに追

加します。検索メソッドは、複数作成することができます。

ソート式の作成

Shunsakuアクセスソース生成ウィザードの[ソート式の作成]ページで、ソート式をShunsakuアクセスクラスに追加しま

す。

- 129 -

データクラスの作成

検索結果のXML文書とレコードIDを格納するクラスです。

データクラスは、Shunsakuアクセスソース生成ウィザードの[データクラスの定義]ページで定義した情報をもとに生成

されます。

データBeanの作成

Webアプリケーションがクライアントとの間で入出力するデータを格納するクラスです。

com.fujitsu.uji.DataBeanクラスを継承して作成し、JavaBean形式でプロパティを作成します。

入出力ページ(JSP)の作成

Webアプリケーションに必要な画面を作成します。エラー表示画面も作成することができます。

ビジネスクラスの作成

クライアントから入力されたデータの処理を記述するクラスです。

ビジネスロジックは、自動生成されたビジネスクラスのひな形に開発者が記述してください。

Shunsakuにアクセスする代表的なモデルを例に自動生成されるWebアプリケーションの構成図を以下に示します。

図9.2 自動生成されるWebアプリケーションがShunsakuにアクセスする構成

各処理の内容は以下のとおりです。

(1)検索画面に入力された文字列をアプリケーションに渡す。

(2)取得した文字列をアクセスクラスに渡し、検索条件などを設定する。

(3)Shunsakuから検索結果を取得する。

(4)各検索結果のXML構造を解析し、適切なデータクラスを作成する。

(5)検索結果をもとにリストを作成し、データBeanに設定する。

(6)検索結果リストを表示する。

(7)検索結果リストから選択された結果を取得する。

- 130 -

(8)選択された結果のデータ全体を、結果のデータクラスに合わせたJSPファイルを使用して表示する。

ビルド

作成・編集したソースコードを簡単にビルドできます。

実行

作成したWebアプリケーションを簡単に実行できます。

デバッグ

作成したWebアプリケーションに誤りがあった場合、デバッガを使用して論理的な誤りを検出することができます。

9.3 Java APIの使用方法

Java APIの使用方法について説明します。

9.3.1 コネクションの確立

コネクションを確立するには、ShunConnectionオブジェクトを作成します。接続先のホスト名とポート番号を指定するには

以下の方法があります。

・ API用動作環境ファイルに指定する方法

・ JavaのPropertiesに指定する方法

・ ホスト名とポート番号を直接指定する方法

9.3.1.1 API用動作環境ファイルの設定によりコネクションを確立する方法

API用動作環境ファイルの設定により、コネクションを確立する方法について説明します。

記述形式

ShunConnection オブジェクト名 = new ShunConnection();

記述例

ShunConnection con = new ShunConnection();

StudioまたはApworks利用時の記述例

StudioまたはApworksを使用する場合は、ビジネスクラスに上記の記述例のようなコードを記述します。

参照

API用動作環境ファイルの設定の詳細については、“2.4 動作環境ファイルの設定”を参照してください。

- 131 -

9.3.1.2 JavaのPropertiesの設定によりコネクションを確立する方法

JavaのPropertiesの設定により、コネクションを確立する方法について説明します。

JavaのPropertiesの指定形式

connection.host=ホスト名またはIPアドレス

connection.port=ポート番号

指定項目

connection.host

接続先のホスト名またはIPアドレスを指定します。

connection.port

接続先のポート番号を指定します。

指定例

ホスト名“DirSvr1”、ポート番号“23101”の場合

connection.host=DirSvr1

connection.port=23101

記述例

// ファイル名を指定

String sFileName = "Property.txt";

// ファイルからホスト名とポート番号をロード

Properties property = new Properties();

property.load(new FileInputStream(sFileName));

// ShunConnectionオブジェクトを作成

ShunConnection con = new ShunConnection(property);

StudioまたはApworks利用時の記述例

StudioまたはApworksを使用する場合は、ビジネスクラスに上記の記述例のようなコードを記述します。

9.3.1.3 ホスト名とポート番号を直接指定する方法

ホスト名とポート番号を直接指定して、接続する方法について説明します。

記述形式

ShunConnection オブジェクト名 = new ShunConnection(ホスト名,ポート番号);

- 132 -

引数

ホスト名

接続先のホスト名またはIPアドレスを指定します。

ポート番号

接続先のポート番号を指定します。

記述例

ホスト名“DirSvr1”、ポート番号“23101”の場合

ShunConnection con = new ShunConnection("DirSvr1",23101);

StudioまたはApworks利用時の記述例

StudioまたはApworksを使用する場合は、ビジネスクラスに上記の記述例のようなコードを記述します。

9.3.2 データの検索

Java APIでは、以下に示す操作ができます。

・ 検索条件に一致するXML文書の件数を取得する

・ 検索条件に一致するXML文書を指定した形式で取得する

・ 特定のXML文書をすべて取得する

・ 検索条件に一致するXML文書をソートして取得する

・ 検索条件に一致するXML文書を連続して取得する

・ 検索条件に一致するXML文書の値を集計して取得する

これらの操作を組み合わせることによって、さまざまなアプリケーションを作成することができます。

参考

ダイレクトアクセスキーを使ったデータ検索も可能です。

ダイレクトアクセスキー機能の詳細については、“第6章 ダイレクトアクセス機能”を参照してください。

データを検索するサンプルプログラムは、“F.1 データの検索”を参照してください。

以降に、データの検索を行うアプリケーションの作成方法について説明します。

9.3.2.1 条件に一致するXML文書の件数を取得する

条件に一致するデータを取り出す前に、件数のみ取得したい場合があります。

このような場合、setRequestメソッドの返信要求件数(requestCount)に0を指定し、件数のみを取得します。

条件に一致するXML文書の件数を取得する場合の流れについて、以下の図に示します。

- 133 -

図9.3 条件に一致するXML文書の件数を取得する場合の流れ

記述例

ShunConnection con = new ShunConnection();

String queryExpression = "/document/base/prefecture == '大阪'";

String returnExpression = "/";

ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression); (1)

pstmt.setRequest(1,0); (2)

ShunResultSet rs = pstmt.executeSearch(); (3)

System.out.println("[ヒット件数] = " + rs.getHitCount()); (4)

rs.close(); (5)

pstmt.close(); (5)

con.close();

(1) ShunPreparedStatementオブジェクトの作成

ShunPreparedStatementオブジェクトは、prepareSearchメソッドのパラメタに検索式とリターン式を指定して作成します。

検索式およびリターン式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。

(2) 返信開始番号と返信要求件数の設定

setRequestメソッドに返信開始番号と返信要求件数を指定します。返信要求件数に0を指定して、件数のみ取得しま

す。

(3) 検索の実行(ShunResultSetオブジェクトの作成)

検索の実行はexecuteSearchメソッドを使用します。検索した結果としてShunResultSetオブジェクトが作成されます。

(4) 検索条件に一致するXML文書のヒット件数の取得

getHitCountメソッドで、検索条件に一致するXML文書の件数を取得します。

- 134 -

(5) ShunResultSetオブジェクトおよびShunPreparedStatementオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedStatementオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放し

ます。

StudioまたはApworks利用時の記述例

以下に、StudioまたはApworksの対話形式のウィザードで作成されたShunsakuアクセスクラスを使ったビジネスクラスの記

述例と、ビジネスクラスで使用しているShunsakuアクセスクラスのひな形を示します。

ビジネスクラス

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);

controller.search(key);

int hitCount = controller.getHitCount();

controller.close();

con.close();

ShunPreparedStatementオブジェクト

public class ShunsakuAccessController {

:

private ShunPreparedStatement pstmt;

:

}

Shunsakuアクセスクラスのsearchメソッド

public void search(java.lang.String keys) throws ShunException {

:

queryString = "/document/base/prefecture == ’ " + keys + "’";

(a)

returnString = "/";

(b)

:

getPreparedStatement(queryString, returnString);

:

}

private void getPreparedStatement(String queryString, String returnString) {

:

pstmt = con.preparedSearch(queryString, returnString);

(1)

:

}

(a)検索式

対話形式のウィザードで定義します。複雑な検索式も対話形式のウィザードで作成することができます。

- 135 -

(b)リターン式

XML文書全体を取り出す“/”が指定されます。

ShunsakuアクセスクラスのgetHitCountメソッド

public int getHitCount() throws ShunException {

:

resultSet = getResultSet(ShunsakuAccessController.SORT_NONE, 1, 0);

:

hitCount = resultSet.getHitCount();

(4)

:

resultSet.close();

(5)

}

public ShunResultSet getResultSet(String sortString, int position, int

requestCount)

throws ShunException {

:

pstmt.setRequest(position, requestCount);

(2)

:

return pstmt.executeSearch();

(3)

}

Shunsakuアクセスクラスのcloseメソッド

public void close() throws ShunException {

:

pstmt.close(); (5)

:

}

9.3.2.2 件数に応じて検索した結果を取得する

Webアプリケーションでは、画面にすべての検索結果を表示するのではなく、任意の件数ごとにページを制御することが

一般的です。

このような場合、setRequestメソッドに返信開始番号(position)と返信要求件数(requestCount)を指定して、取得するデータ

の件数を制御します。

件数に応じて検索した結果を取得する場合の流れについて、以下の図に示します。

- 136 -

図9.4 件数に応じて検索した結果を取得する場合の流れ

記述例

ShunConnection con = new ShunConnection();

String queryExpression = "/document/base/prefecture == '大阪'";

String returnExpression = "/document/base/name, /document/base/price";

ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression); (1)

pstmt.setRequest(11,5); (2)

ShunResultSet rs = pstmt.executeSearch(); (3)

System.out.println("[ヒット件数] = " + rs.getHitCount()); (3)

while(rs.next()) { (4)

System.out.println("[検索結果] = " + rs.getString()); (4)

}

rs.close(); (5)

pstmt.close(); (5)

con.close();

(1) ShunPreparedStatementオブジェクトの作成

ShunPreparedStatementオブジェクトは、prepareSearchメソッドのパラメタに検索式とリターン式を指定して作成します。

検索式およびリターン式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。

- 137 -

(2) 返信開始番号と返信要求件数の設定

setRequestメソッドに返信開始番号と返信要求件数を指定します。setRequestメソッドを省略した場合、返信要求件数は

conductor用動作環境ファイルまたはdirector用動作環境ファイルのAnsMaxに設定された値が指定されます。

ポイント

返信要求件数には、1画面に表示する件数を指定します。

(3) 検索の実行(ShunResultSetオブジェクトの作成)

検索の実行はexecuteSearchメソッドを使用します。検索した結果としてShunResultSetオブジェクトが作成されます。

ポイント

検索条件に一致するXML文書のヒット件数は、getHitCountメソッドで取得できます。この値を使用して、検索した結

果のページ数などを求めることができます。

(4) 検索した結果の取出し

検索した結果を取り出す前には、必ずnextメソッドを使用します。nextメソッドは、次のデータが存在する場合はtrueを返し、それ以上データがない場合はfalseを返します。

XML文書を取り出すには、目的に応じて以下のメソッドを使用します。使用可能なメソッドについては以下の表を参

照してください。

表9.3 XML文書を取り出す場合に使用可能なメソッド一覧

メソッド名 機能説明

getString XML文書をStringオブジェクトで取り出します。

getStringArray XML文書をStringオブジェクトの2次元配列で取り出しま

す。

getStream XML文書をInputStreamオブジェクトで取り出します。

備考.getStringArrayメソッドは、検索した結果をテキスト形式で取り出す場合に有効です。

ポイント

検索した結果とともにデータを一意に識別するレコードIDをgetRecordIDメソッドで取得できます。レコードIDは、対応する

XML文書の全体を取り出したり、削除、更新する場合に使用します。

(5) ShunResultSetオブジェクトおよびShunPreparedStatementオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedStatementオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放し

ます。

StudioまたはApworks利用時の記述例

以下に、StudioまたはApworksの対話形式のウィザードで作成されたShunsakuアクセスクラスを使ったビジネスクラスの記

述例と、ビジネスクラスで使用しているShunsakuアクセスクラスのひな形を示します。

- 138 -

ビジネスクラス

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);

controller.search(key);

Object[] resultData =

controller.getResultData(ShunsakuAccessController.SORT_NONE, 11,

5);

controller.close();

con.close();

ShunPreparedStatementオブジェクト

public class ShunsakuAccessController {

:

private ShunPreparedStatement pstmt;

:

}

Shunsakuアクセスクラスのsearchメソッド

public void search(String keys) throws ShunException {

:

queryString = "/document/base/prefecture == ’ " + keys + "’";

(a)

returnString = "/";

(b)

:

getPreparedStatement(queryString, returnString);

:

}

private void getPreparedStatement(String queryString, String returnString) {

:

pstmt = con.preparedSearch(queryString, returnString);

(1)

:

}

(a)検索式

対話形式のウィザードで定義します。複雑な検索式も対話形式のウィザードで作成することができます。

(b)リターン式

XML文書全体を取り出す“/”が指定されます。

ShunsakuアクセスクラスのgetResultDataメソッド

public Object[] getResultData(String sortString,

int position,

int requestCount)

throws ShunException {

:

- 139 -

ShunResultSet resultSet = getResultSet(sortString, position, requestCount);

:

Object[] resultData = parseResultSet(resultSet); (4)

:

resultSet.close(); (5)

:

}

public ShunResultSet getResultSet(String sortString,

int position,

int requestCount)

throws ShunException {

if(!sortString.equals(SORT_NONE)) {

pstmt.setSort(sortString);

}

pstmt.setRequest(position, requestCount); (2)

return pstmt.executeSearch(); (3)

}

Shunsakuアクセスクラスのcloseメソッド

public void close() throws ShunException {

:

pstmt.close(); (5)

:

}

9.3.2.3 条件を追加しながら検索した結果を取得する

検索した結果の件数が非常に多いとき、さらに条件を追加して件数を絞りたい場合があります。

このような場合、prepareSerachメソッドに指定する検索式に条件を追加して新しい検索式を作成し、再度検索する処理を

行います。この操作を繰り返すことで、画面に表示された検索結果を参照しながら検索結果を絞り込むことができます。

条件を追加しながら検索した結果を取得する場合の流れについて、以下の図に示します。

- 140 -

図9.5 条件を追加しながら検索した結果を取得する場合の流れ

記述例

条件を追加しながら検索した結果を取得する場合の記述例については、“9.3.2.2 件数に応じて検索した結果を取得す

る”を参照してください。

条件を追加する場合には、prepareSearchメソッドに指定する検索式に条件を追加してください。

StudioまたはApworks利用時の記述例

条件を追加しながら検索した結果を取得する場合のStudioまたはApworks利用時の記述例については、“9.3.2.2 件数

に応じて検索した結果を取得する”を参照してください。

条件を追加する場合には、Shunsakuアクセスクラスのsearchメソッドで指定する検索式に条件を追加してください。

9.3.2.4 ヒット件数の上限値を設定する

ヒット件数の上限値を設定することで、ソートまたは集計の応答性能を安定させることができます。ヒット件数が上限値を

超えた場合には、ソートまたは集計を中断し検索条件に一致したヒット件数を通知します。

ヒット件数が上限値を超えないように検索式に条件を追加し、ソートまたは集計の検索範囲を絞り込みます。

ヒット件数の上限値を設定するには、setHitCountLimitメソッドを使用します。

ヒット件数の上限値を設定する場合の流れについて、以下の図に示します。

- 141 -

図9.6 ヒット件数の上限値を設定する場合の流れ

記述例

ShunConnection con = new ShunConnection();

String queryExpression = "/document/base/prefecture == '大阪'";

String returnExpression = "/document/base/name, /document/base/price";

String sortExpression = "val(/document/base/price/text()) DESC";

ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression);

pstmt.setSort(sortExpression);

/* ヒット件数の上限値を設定 */

pstmt.setHitCountLimit(10000); (1)

ShunResultSet rs = pstmt.executeSearch();

/* ヒット件数が上限値を超えているかの確認 */

if (rs.isHitCountLimitOver() ) { (2)

System.out.println("ヒット件数が上限値を超えました");

System.out.println("[ヒット件数] = " + rs.getHitCount()); (3)

}

else {

System.out.println("[ヒット件数] = " + rs.getHitCount());

while(rs.next()) {

System.out.println("[検索結果] = " + rs.getString());

}

}

- 142 -

rs.close();

pstmt.close();

con.close();

(1) ヒット件数の上限値設定

setHitCountLimitメソッドのパラメタにヒット件数の上限値を設定します。

注意

ソート式が設定されていない場合には、executeSearchメソッド実行時にエラーとなります。

(2) ヒット件数が上限値を超えているの確認

isHitCountLimitOverメソッドでヒット件数が上限値を超えているかの確認をします。

(3) ヒット件数の取出し

ヒット件数が上限値を超えている場合は、ヒット件数のみ取出し可能です。

9.3.2.5 レコードIDの取出し

レコードIDはXML文書全体の取得、データの削除、更新をする場合に使用します。レコードIDの取得はgetRecordIDメ

ソッドを使用します。

レコードIDの取出し方法について、以下の図に示します。

図9.7 レコードIDの取出し方法

記述例

ShunConnection con = new ShunConnection();

String queryExpression = "/document/base/prefecture == '大阪'";

String returnExpression = "/document/base/name, /document/base/price";

ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression); (1)

pstmt.setRequest(11,5); (2)

- 143 -

ShunResultSet rs = pstmt.executeSearch(); (3)

while(rs.next()) { (4)

System.out.println("[レコードID] = " + rs.getRecordID()); (4)

}

rs.close(); (5)

pstmt.close(); (5)

con.close();

(1) ShunPreparedStatementオブジェクトの作成

ShunPreparedStatementオブジェクトは、prepareSearchメソッドのパラメタに検索式とリターン式を指定して作成します。

検索式およびリターン式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。

(2) 返信開始番号と返信要求件数の設定

setRequestメソッドに返信開始番号と返信要求件数を指定します。setRequestメソッドを省略した場合、返信要求件数は

conductor用動作環境ファイルまたはdirector用動作環境ファイルのAnsMaxに設定された値が指定されます。

ポイント

返信要求件数には、1画面に表示する件数を指定します。

(3) 検索の実行(ShunResultSetオブジェクトの作成)

検索の実行はexecuteSearchメソッドを使用します。検索した結果としてShunResultSetオブジェクトが作成されます。

(4) 検索した結果の取出し

検索した結果を取り出すのと同様にレコードIDを取り出す前にも、必ずnextメソッドを使用します。nextメソッドは、次

のデータが存在する場合はtrueを返し、それ以上データがない場合はfalseを返します。

(5) ShunResultSetオブジェクトおよびShunPreparedStatementオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedStatementオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放し

ます。

StudioまたはApworks利用時の記述例

レコードID取出し方法についてビジネスクラスの記述例を以下に示します。Shunsakuアクセスクラスについては、Studioまたは

Apworksの対話形式のウィザードで作成されたひな形を使用してください。Shunsakuアクセスクラスのひな形について

は“9.3.2.2 件数に応じて検索した結果を取得する”を参照してください。

ビジネスクラス

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);

controller.search(key);

Object[] resultData =

controller.getResultData(ShunsakuAccessController.SORT_NONE, 11, 5);

ShunAddressListModel listData = new ShunAddressListModel(resultData);

- 144 -

dataBean.setResultList(listData);

ListModel resultList = dataBean.getResultList();

for(int i = 0; i < resultList.getSize(); i++) {

Object result = resultList.getElementAt(i);

AddressData new_result = (AddressData)result;

String recordID = new_result.getRecordID();

}

controller.close();

con.close();

9.3.2.6 レコードIDを利用してXML文書全体を取得する

XML文書の中から必要なXML文書を検索する場合、はじめからXML文書の全体を取得するのではなく、XML文書を

識別するのに有効な部分情報を取得します。利用者は、これらの部分情報から詳細情報を取得したいXML文書を特定

します。

XML文書の全体を取り出すには、部分情報を取り出したときに一緒に返却されるレコードIDを使用します。レコードIDを

利用することで目的のXML文書の全体を取り出すことができます。

レコードIDを利用してXML文書全体を取得する場合の流れについて、以下の図に示します。

図9.8 レコードIDを利用してXML文書全体を取得する場合の流れ

- 145 -

記述例

ShunConnection con = new ShunConnection();

ShunPreparedRecordID prid = con.prepareSearchRecordID(); (1)

prid.add(recordID); (2)

ShunResultSet rs = prid.searchByRecordID(); (3)

while (rs.next()) { (4)

System.out.println("[結果] = " + rs.getString()); (4)

}

rs.close(); (5)

prid.close(); (5)

con.close();

(1) ShunPreparedRecordIDオブジェクトの作成

ShunPreparedRecordIDオブジェクトの作成は、prepareSearchRecordIDメソッドを使用します。

(2) レコードIDの設定

レコードIDの設定は、addメソッドを使用します。レコードIDはgetRecordIDメソッドで取得します。

addメソッドで複数のレコードIDを設定できます。すでに同一のレコードIDが設定されている場合は上書きします。

ポイント

addメソッドで複数のレコードIDを指定することで、一度に複数のXML文書を取得することができます。

(3) 検索の実行(ShunResultSetオブジェクトの作成)

検索の実行はsearchByRecordIDメソッドを使用します。検索した結果としてShunResultSetオブジェクトが作成されま

す。

(4) 検索した結果の取出し

検索した結果を取り出す前には、必ずnextメソッドを使用します。nextメソッドは、次のデータが存在する場合はtrueを返し、それ以上データがない場合はfalseを返します。

XML文書を取り出すには、目的に応じて以下のメソッドを使用します。使用可能なメソッドについては以下の表を参

照してください。

表9.4 XML文書を取り出す場合に使用可能なメソッド一覧

メソッド名 機能説明

getString XML文書をStringオブジェクトで取り出します。

getStream XML文書をInputStreamオブジェクトで取り出します。

(5) ShunResultSetオブジェクトおよびShunPreparedRecordIDオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedRecordIDオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放し

ます。

- 146 -

StudioまたはApworks利用時の記述例

レコードIDを用いてXML文書全体を取り出す方法についてビジネスクラス、Shunsakuアクセスクラスの記述例を以下に

示します。

ビジネスクラス

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);

Object[] resultData = controller.detail(recordID);

controller.close();

con.close();

Shunsakuアクセスクラス

public Object[] detail(String recordID) throws ShunException {

Object[] resultData = null;

ShunPreparedRecordID prid = con.prepareSearchRecordID(); (1)

prid.add(recordID); (2)

ShunResultSet rs = prid.searchByRecordID(); (3)

try {

resultData = paeseResultSet(rs); (4)

} finally {

rs.close(); (5)

}

prid.close(); (5)

return resultData;

}

9.3.2.7 データをソートして取得する

検索した結果をある特定の要素をキーとしてソートして取得したい場合があります。

データの部分情報をソートして取得するには、setSortメソッドを使用します。

データをソートして取得する場合の流れについて、以下の図に示します。

- 147 -

図9.9 データをソートして取得する場合の流れ

ポイント

ソートを行う場合には、検索条件に一致したすべてのXML文書を参照してソート処理を行います。検索式には、結果件

数が適正な値となるような条件を指定し、ソート対象のデータを絞ることが応答性能をよくするポイントです。ソートを実施

する前に検索条件に一致したXML文書の件数を調べるには、setRequestメソッドの返信要求件数に0を指定します。

記述例

ShunConnection con = new ShunConnection();

String queryExpression = "/document/base/prefecture == '大阪'";

String returnExpression = "/document/base/name, /document/base/price";

String sortExpression = "val(/document/base/price/text()) DESC"; (1)

ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression); (2)

pstmt.setSort(sortExpression); (3)

ShunResultSet rs = pstmt.executeSearch(); (4)

while(rs.next()) { (5)

System.out.println("[検索結果] = " + rs.getString()); (5)

}

rs.close(); (6)

pstmt.close(); (6)

con.close();

- 148 -

(1) ソート式の作成

ソート式を作成します。

ソート式の詳細は、“B.5 ソート式”を参照してください。

(2) ShunPreparedStatementオブジェクトの作成

ShunPreparedStatementオブジェクトの作成は、検索式とリターン式を指定し、prepareSearchメソッドを使用します。

検索式およびリターン式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。

(3) ソート式の設定

ソート式の設定は、setSortメソッドを使用します。

注意

ソート式に指定したキーの長さによって返却できる件数が決まります。 大件数は1000件です。返信開始番号や返

信要求件数に返却可能な 大件数を超える値を指定しても、それ以上のデータは返却することができません。返却

可能なデータの 大件数は、getReturnableCountメソッドで取得できます。

キーの長さと返却可能なデータ件数の目安については、“付録C 定量値”を参照してください。

参考

取得開始位置を指定することにより、続きのデータを取り出すことができます。これにより1000件以上のデータを取り

出すことができます。詳細については、“9.3.2.8 条件に一致するXML文書を連続して取得する”を参照してください。

(4) 検索の実行(ShunResultSetオブジェクトの作成)

検索の実行はexecuteSearchメソッドを使用します。検索した結果としてShunResultSetオブジェクトが作成されます。

(5) 検索した結果の取出し

検索した結果を取り出す前には、必ずnextメソッドを使用します。nextメソッドは、次のデータが存在する場合はtrueを返し、それ以上データがない場合はfalseを返します。

XML文書を取り出すには、目的に応じて以下のメソッドを使用します。使用可能なメソッドについては以下の表を参

照してください。

表9.5 XML文書を取り出す場合に使用可能なメソッド一覧

メソッド名 機能説明

getString XML文書をStringオブジェクトで取り出します。

getStringArray XML文書をStringオブジェクトの2次元配列で取り出しま

す。

getStream XML文書をInputStreamオブジェクトで取り出します。

備考.getStringArrayメソッドは、検索した結果をテキスト形式で取り出す場合に有効です。

- 149 -

ポイント

検索した結果とともにデータを一意に識別するレコードIDをgetRecordIDメソッドで取得できます。レコードIDは、対応する

XML文書の全体を取り出したり、削除したりする場合に使用します。

(6) ShunResultSetオブジェクトおよびShunPreparedStatementオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedStatementオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放し

ます。

StudioまたはApworks利用時の記述例

以下に、StudioまたはApworksの対話形式のウィザードで作成されたShunsakuアクセスクラスを使ったビジネスクラスの記

述例と、ビジネスクラスで使用しているShunsakuアクセスクラスのひな形を示します。

ビジネスクラス

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);

controller.search(key);

Object[] resultData =

controller.getResultData(ShunsakuAccessController.SORT_1);

controller.close();

con.close();

ShunPreparedStatementオブジェクト

public class ShunsakuAccessController {

:

private ShunPreparedStatement pstmt;

:

}

Shunsakuアクセスクラスのsearchメソッド

public void search(String keys) throws ShunException {

:

queryString = "/document/base/prefecture == ’ " + keys + "’"; (a)

returnString = “/”; (b)

:

getPreparedStatement(queryString, returnString);

:

}

private void getPreparedStatement(String queryString, String returnString) {

:

pstmt = con.preparedSearch(queryString, returnString); (2)

:

}

- 150 -

(a) 検索式

対話形式のウィザードで定義します。複雑な検索式も対話形式のウィザードで作成することができます。

(b) リターン式

XML文書全体を取り出す“/”が指定されます。

ShunsakuアクセスクラスのgetResultDataメソッド

public Object[] getResultData(String sortString) throws ShunException {

:

resultSet = getResultSet(sortString);

:

resultData = parseResultSet(resultSet); (5)

:

resultSet.close(); (6)

}

public ShunResultSet getResultSet(String sortString) throws ShunException {

return getResultSet(sortString, 1, Integer.MAX_VALUE);

}

public ShunResultSet getResultSet(String sortString,

int position,

int requestCount)

throws ShunException {

:

if(!sortString.equals(SORT_NONE)) {

pstmt.setSort(sortString); (3)

}

:

return pstmt.executeSearch(); (4)

:

}

ソート式

ソート式は、対話形式のウィザードで作成し、ソート識別子としてShunsakuアクセスクラスの定数として定義されます。

public class ShunsakuAccessController {

:

public static final String SORT_NONE = ""; (1)

public static final String SORT_1 = "val(/document/base/price/text())"; (1)

:

}

Shunsakuアクセスクラスのcloseメソッド

public void close() throws ShunException {

:

pstmt.close(); (6)

:

}

- 151 -

9.3.2.8 条件に一致するXML文書を連続して取得する

Webアプリケーションでは、検索した結果を一定件数ごとに区切って、前後に連続したデータを取得したい場合がありま

す。

このような場合、setRequestメソッドのパラメタである取得開始位置、または、取得終了位置に、その直前の検索処理に

よって取得した 終位置情報、または、先頭位置情報を指定してXML文書を連続して取得します。

条件に一致するXML文書を連続して取得する場合の流れについて、以下の図に示します。

図9.10 条件に一致するXML文書を連続して取得する場合の流れ

記述例

String queryExpression = "/document/base/prefecture == '大阪'";

String returnExpression = "/document/base/name, /document/base/price";

String sortExpression = "val(/document/base/price/text()) DESC";

ShunConnection con = new ShunConnection();

ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression);

pstmt.setSort(sortExpression);

//取出し方向

- 152 -

int direction = 0;

// 先頭位置情報

String sFirstPos = null;

// 終位置情報

String sLastPos = null;

// どのページを表示するかによってsetRequestの設定を変更

// 次のページを表示する場合は directionがNEXT、前のページを表示する場合は directionがPREVとする

if(direction == NEXT) {

// 次のページを表示する場合 (2)

pstmt.setRequest(sLastPos, 30, pstmt.SHUN_DIRECTION_FORWARD_EXCLUSIVE);

}else if(direction == PREV) {

// 前のページを表示する場合 (3)

pstmt.setRequest(sFirstPos, 30, pstmt.SHUN_DIRECTION_BACKWARD_EXCLUSIVE);

}else{

// 初のページを表示する場合 (1)

pstmt.setRequest(null, 30, 0);

}

// 検索の実行 (4)

ShunResultSet rs = pstmt.executeSearch();

// 検索した結果の取出し (5)

System.out.println("[ヒット件数] = " + rs.getHitCount());

while(rs.next()) {

System.out.println("[検索結果] = " + rs.getString());

}

// 先頭位置情報と 終位置情報を格納 (6)

sFirstPos = rs.getFirstPosition();

sLastPos = rs.getLastPosition();

// ShunResultSetオブジェクトの解放 (7)

// ShunPreparedStatementオブジェクトの解放

rs.close();

pstmt.close();

con.close();

(1) 初のページを表示する場合

setRequestメソッドにデータの取得位置と返信要求件数を指定します。 初のページを表示する検索処理では、

初のデータから取出しを行うため、データの取得位置(取得開始位置または取得終了位置)にはnullを指定します。

取得位置にnullを指定すると、1件目からデータを取り出します。

(2) 次のページを表示する場合

setRequestメソッドにデータの取得位置、返信要求件数および取出し方向を指定します。 次のページを表示する検

索処理では、前回検索時の 終位置情報をgetLastPositionメソッドで取得しておき、データの取得位置(取得開始位

置)に指定します。この指定により前回取得したデータの続きのデータを取得します。

(3) 前のページを表示する場合

setRequestメソッドにデータの取得位置、返信要求件数および取出し方向を指定します。 前のページを表示する検

索処理では、前回検索時の先頭位置情報をgetFirstPositionメソッドで取得しておき、データの取得位置(取得終了

位置)に指定します。この指定により前回取得したデータの前の部分のデータを取得します。

- 153 -

(4) 検索の実行

executeSearchメソッドで検索を実行します。検索した結果としてShunResultSetオブジェクトが作成されます。

(5) 検索した結果の取出し

1. 検索した結果を取り出す前には、必ずnextメソッドを使用します。nextメソッドは、次のデータが存在する場合は

trueを返し、それ以上データがない場合はfalseを返します。

2. XML文書を取り出すために、getStringメソッドを使用します。

(6) 先頭位置情報と 終位置情報を格納

1. getFirstPositionメソッドを使用して先頭位置情報を格納します。

2. getLastPositionメソッドを使用して 終位置情報を格納します。

(7) ShunResultSetオブジェクトおよびShunPreparedStatementオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedStatementオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放し

ます。

StudioまたはApworks利用時の記述例

ビジネスクラス

// 次のページのデータの検索

public void next(DispatchContext context, shunProduct.ShunProductBean dataBean) {

execute(context, dataBean, ShunAccessController.FORWARD);

}

// 前のページのデータの検索

public void back(DispatchContext context, shunProduct.ShunProductBean dataBean) {

execute(context, dataBean, ShunAccessController.BACKWARD);

}

// 検索実行

private void execute(DispatchContext context, shunProduct.ShunProductBean dataBean,

int direction)

{

String key = dataBean.getKey();

ShunConnection connection = null;

ShunsakuAccessController accessController = null;

//Shunsakuサーバへ接続

connection = new ShunConnection("localhost", 23101);

accessController = new ShunsakuAccessController(connection);

//検索の準備

accessController.search(key);

//データの取得位置を取得

String dataPosition = null;

if(direction == ShunsakuAccessController.FORWARD)

{

dataPosition = dataBean.getLastPosition();

}

else if(direction == ShunsakuAccessController.BACKWARD)

{

dataPosition = dataBean.getFirstPosition();

}

//検索を実行

- 154 -

Object[] resultData = accessController.getResultData(ShunAccessController.SORT_1,

dataPosition, 30, direction);

int hit = resultData.length;

//データBeanに、ヒット件数、取得開始位置、取得終了位置を設定

dataBean.setHitCount(hit);

dataBean.setFirstPosition(accessController.getFirstPosition());

dataBean.setLastPosition(accessController.getLastPosition());

accessController.close();

connection.close();

//結果データを作成、設定し、次の画面へ遷移

ShunProductListModel listData = new ShunProductListModel(resultData);

dataBean.setResultList(listData);

dataBean.setVerb("output");

context.setResponseBean("body", dataBean);

}

ソート式

public class ShunsakuAccessController {

:

public static final String SORT_NONE = ""l;

public static final String SORT_1 = "val(/document/base/price/text()) DESC";

:

}

Shunsakuアクセスクラス

public void search(String keys) throws ShunException {

:

queryString = "/document/base/prefecture == '" + keys + "'";

returnString = "/";

:

getPreparedStatement(queryString, returnString);

:

}

private void getPreparedStatement(String queryString, String returnString)

{

:

pstmt = con.preparedSearch(queryString, returnString);

:

}

public Object[] getResultData(String sortString, String dataPosition, int

requestCount, int direction)throws ShunException

{

ShunResultSet resultSet;

Object[] resultData = null;

// 検索の実行

resultSet = getResultSet(sortString, dataPosition,requestCount,direction);

this.lastPosition = resultSet.getLastPosition();

this.firstPosition = resultSet.getFirstPosition();

:

resultData = parseResultSet(resultSet);

:

return resultData;

- 155 -

}

public ShunResultSet getResultSet(String sortString, String dataPosition, int

requestCount, int direction)throws ShunException

{

ShunResultSet resultSet;

Object[] resultData = null;

//ソート式を指定

if (!sortString.equals(SORT_NON)) {

this.fPreparedStatement.setSort(sortString);

}

//返信要求件数を設定

this.fPreparedStatement.setRequest(dataPosition, requestCount, direction);

//検索を実行し、ShunResultSetオブジェクトを作成

return this.fPreparedStatement.executeSearch();

}

public String getFirstPosition()

{

return firstPosition;

}

public String getLastPosition()

{

return lastPosition;

}

9.3.2.9 条件に一致するデータの内容を集計する

検索した結果をある特定の要素の値で集計して取得したい場合があります。

データの内容を集計するには、setSortメソッドを使用します。prepareSearchメソッドのパラメタであるリターン式に集合関数

指定を指定すると、検索した結果が集計されて返却されます。集計処理では、合計値、平均値、 大値、 小値または

件数を求めることができます。

条件に一致するデータの内容を集計する場合の流れについて、以下の図に示します。

図9.11 条件に一致するデータの内容を集計する場合の流れ

- 156 -

記述例

ShunConnection con = new ShunConnection();

String queryExpression = "/document/base/prefecture == '大阪'";

String returnExpression = "max(/document/base/price/text())"; (1)

String sortExpression = "/document/base/prefecture/text()"; (2)

ShunPreparedStatement pstmt = con.prepareSearch(queryExpression, returnExpression); (3)

pstmt.setSort(sortExpression); (4)

ShunResultSet rs = pstmt.executeSearch(); (5)

while(rs.next()) { (6)

System.out.println("[検索結果] = " + rs.getString()); (6)

}

rs.close(); (7)

pstmt.close(); (7)

con.close();

(1) リターン式の作成

リターン式を作成します。集計を行う場合は、リターン式に集合関数指定を指定します。

リターン式および集合関数指定の詳細については、“B.4 リターン式”を参照してください。

(2) ソート式の作成

ソート式を作成します。

ソート式の詳細については、“B.5 ソート式”を参照してください。

(3) ShunPreparedStatementオブジェクトの作成

ShunPreparedStatementオブジェクトの作成は、検索式とリターン式を指定し、prepareSearchメソッドを使用します。

検索式およびリターン式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。

(4) ソート式の設定

ソート式の設定は、setSortメソッドを使用します。

注意

ソート式に指定したキーの長さによって返却できるグループの数が決まります。 大グループ数は1000グループで

す。返信開始番号や返信要求件数に返却可能な 大グループ数を超える値を指定しても、それ以上のデータは返

却することができません。返却可能なデータの 大件数は、getReturnableCountメソッドで取得できます。

キーの長さと返却可能なグループ数の目安については、“付録C 定量値を参照してください。

参考

取得開始位置を指定することにより、続きのデータを取り出すことができます。これにより1000グループ以上のデータ

を取り出すことができます。詳細については、“9.3.2.8 条件に一致するXML文書を連続して取得する”を参照してく

ださい。

- 157 -

(5) 検索の実行(ShunResultSetオブジェクトの作成)

検索の実行はexecuteSearchメソッドを使用します。検索した結果としてShunResultSetオブジェクトが作成されます。

(6) 検索した結果の取出し

検索した結果を取り出す前には、必ずnextメソッドを使用します。nextメソッドは、次のデータが存在する場合はtrueを返し、それ以上データがない場合はfalseを返します。

XML文書を取り出すには、目的に応じて以下のメソッドを使用します。使用可能なメソッドについては以下の表を参

照してください。

表9.6 XML文書を取り出す場合に使用可能なメソッド一覧

メソッド名 機能説明

getString XML文書をStringオブジェクトで取り出します。

getStringArray XML文書をStringオブジェクトの2次元配列で取り出しま

す。

getStream XML文書をInputStreamオブジェクトで取り出します。

(7) ShunResultSetオブジェクトおよびShunPreparedStatementオブジェクトの解放

ShunResultSetオブジェクトとShunPreparedStatementオブジェクトは、使用後にそれぞれのcloseメソッドで必ず解放し

ます。

StudioまたはApworks利用時の記述例

この処理を実現させるためには、自動生成されたShunsakuアクセスクラスのリターン式に集合関数を指定します。以下

に、リターン式に集合関数を指定したShunsakuアクセスクラスとビジネスクラスの記述例を示します。

ビジネスクラス

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);

controller.search(key);

ShunResultSet resultData =

controller.getResultSet(ShunsakuAccessController.SORT_1);

controller.close();

con.close();

ShunPreparedStatementオブジェクト

public class ShunsakuAccessController {

:

private ShunPreparedStatement pstmt;

:

}

Shunsakuアクセスクラスのsearchメソッド

- 158 -

public void search(String keys) throws ShunException {

:

queryString = "/document/base/prefecture == ’ " + keys + "’"; (a)

returnString = "max(/document/base/price/text())"; (1)(b)

:

getPreparedStatement(queryString, returnString);

:

}

private void getPreparedStatement(String queryString, String returnString) {

:

pstmt = con.preparedSearch(queryString, returnString); (3)

:

}

(a) 検索式

対話形式のウィザードで定義します。複雑な検索式も対話形式のウィザードで作成することができます。

(b) リターン式

集合関数を指定します。

ShunsakuアクセスクラスのgetResultDataメソッド

public ShunResultSet getResultSet(String sortString) throws ShunException {

return getResultSet(sortString, 1, Integer.MAX_VALUE);

}

public ShunResultSet getResultSet(String sortString,

int position,

int requestCount)

throws ShunException {

:

if(!sortString.equals(SORT_NONE)) {

pstmt.setSort(sortString); (4)

}

:

return pstmt.executeSearch(); (5)

:

}

ソート式

ソート式は、対話形式のウィザードで作成し、ソート識別子としてShunsakuアクセスクラスの定数として定義されます。

public class ShunsakuAccessController {

:

public static final String SORT_NONE = ""; (2)

public static final String SORT_1 = "val(/document/base/prefecture/text())"; (2)

:

}

Shunsakuアクセスクラスのcloseメソッド

- 159 -

public void close() throws ShunException {

:

pstmt.close(); (7)

:

}

9.3.3 データの更新

Java APIでは、以下に示すデータの更新ができます。

・ XML文書の追加

・ レコードIDによるXML文書の削除

・ レコードIDによるXML文書の更新

参考

ダイレクトアクセスキーを使ったデータ更新も可能です。

ダイレクトアクセスキー機能の詳細については、“第6章 ダイレクトアクセス機能”を参照してください。

データを更新するサンプルプログラムは、“F.2 データの更新”を参照してください。

以降に、データの更新を行うアプリケーションの作成方法について説明します。

9.3.3.1 データを追加する

データを追加するには、prepareInsertメソッドを使用します。

データを追加する場合の流れについて、以下の図に示します。

図9.12 データを追加する場合の流れ

記述例

ShunConnection con = new ShunConnection();

ShunPreparedStatement pstmt = con.prepareInsert(); (1)

// ファイルからデータを読み込む

- 160 -

FileInputStream oFIS = new FileInputStream("newData.xml");

pstmt.add(oFIS); (2)

pstmt.executeInsert(); (3)

pstmt.close(); (4)

con.close();

(1) ShunPreparedStatementオブジェクトの作成

ShunPreparedStatementオブジェクトの作成は、prepareInsertメソッドを使用します。

(2) 追加するデータの設定

データを追加するメソッドとして、以下があります。

表9.7 データを追加する場合に使用可能なメソッド一覧

メソッド名 機能説明

add(String data) Stringオブジェクトのデータを追加します。

add(InputStream data) InputStreamオブジェクトのデータを追加します。

addメソッドで指定するデータには複数のデータを含むことができます。また、複数のファイルに格納したデータを一

度に追加したい場合は、addメソッドを複数回実行することができます。ただし、1つのデータを分割し、複数のaddメソッドに分けて指定することはできません。

(3) 追加の実行

追加の実行はexecuteInsertメソッドを使用します。

(4) ShunPreparedStatementオブジェクトの解放

ShunPreparedStatementオブジェクトは、使用後にcloseメソッドで必ず解放します。

StudioまたはApworks利用時の記述例

以下に、StudioまたはApworks利用時の記述例を示します。

ビジネスクラス

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);

controller.insert(data);

controller.close();

con.close();

Shunsakuアクセスクラス

public void insert(String data) throws ShunException {

ShunPreparedStatement pstmti = fConnection.prepareInsert(); (1)

pstmti.add(data); (2)

pstmti.executeInsert(); (3)

- 161 -

pstmti.close(); (4)

}

9.3.3.2 レコードIDを指定してデータを削除する

データを削除するには、prepareDeleteRecordIDメソッドを使用します。

Java APIでは、レコードIDを使用してデータを削除します。データを削除する前にgetRecordIDメソッドを使用して、削除

したいデータのレコードIDを取得しておく必要があります。

レコードIDを指定してデータを削除する場合の流れについて、以下の図に示します。

図9.13 レコードIDを指定してデータを削除する場合の流れ

記述例

ShunConnection con = new ShunConnection();

ShunPreparedRecordID prid = con.prepareDeleteRecordID(); (1)

prid.add(recordID); (2)

prid.deleteByRecordID(); (3)

prid.close(); (4)

con.close();

- 162 -

(1) ShunPreparedRecordIDオブジェクトの作成

ShunPreparedRecordIDオブジェクトの作成は、prepareDeleteRecordIDメソッドを使用します。

(2) 削除するデータのレコードIDの設定

レコードIDの設定は、addメソッドを使用します。レコードIDはgetRecordIDメソッドで取得します。

addメソッドで複数のレコードIDを設定できます。すでに同一のレコードIDが設定されている場合は上書きします。

ポイント

addメソッドで複数のレコードIDを指定することで、一度に複数のXML文書を削除することができます。

(3) 削除の実行

削除の実行はdeleteByRecordIDメソッドを使用します。

(4) ShunPreparedRecordIDオブジェクトの解放

ShunPreparedRecordIDオブジェクトは、使用後にcloseメソッドで必ず解放します。

StudioまたはApworks利用時の記述例

以下に、StudioまたはApworks利用時の記述例を示します。

ビジネスクラス

String recordID = dataBean.getDetailButton();

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);

controller.delete(recordID);

con.close();

Shunsakuアクセスクラス

public void delete(String recordID) throws ShunException {

ShunPreparedRecordID prid = con.prepareDeleteRecordID(); (1)

prid.add(recordID); (2)

prid.deleteByRecordID(); (3)

prid.close(); (4)

}

9.3.3.3 レコードIDを指定してデータを更新する

XML文書を更新するには、prepareUpdateRecordIDメソッドを使用します。

- 163 -

Java APIでは、レコードIDを使用してデータを更新します。データを更新する前にgetRecordIDメソッドを使用して、更新

したいデータのレコードIDを取得しておく必要があります。レコードIDによるXML文書の更新とは、新しいXML文書で既存の

XMLを置換することを指します。既存のXML文書中のデータを部分的に更新することはできません。

レコードIDを指定してデータを更新する場合の流れについて、以下の図に示します。

図9.14 レコードIDを指定してデータを更新する場合の流れ

記述例

ShunConnection con = new ShunConnection();

ShunPreparedRecordID prid = con.prepareUpdateRecordID(); (1)

prid.add(recordID, updateData); (2)

prid.updateByRecordID(); (3)

prid.close(); (4)

con.close();

(1) ShunPreparedRecordIDオブジェクトの作成

ShunPreparedRecordIDオブジェクトの作成は、prepareUpdateRecordIDメソッドを使用します。

- 164 -

(2) レコードID、および更新するデータの設定

レコードID、および更新するデータの設定は、addメソッドを使用します。レコードIDはgetRecordIDメソッドで取得しま

す。

addメソッドで複数のレコードIDおよび更新データを設定できます。すでに同一のレコードIDが設定されている場合は

レコードIDおよび更新データを上書きします。

ポイント

addメソッドで複数のレコードIDおよび更新データを指定することで、一度に複数のXML文書を更新することができま

す。

(3) 更新の実行

更新の実行はupdateByRecordIDメソッドを使用します。

(4) ShunPreparedRecordIDオブジェクトの解放

ShunPreparedRecordIDオブジェクトは、使用後にcloseメソッドで必ず解放します。

StudioまたはApworks利用時の記述例

以下に、StudioまたはApworks利用時の記述例を示します。

ビジネスクラス

String recordID = dataBean.getDetailButton();

ShunConnection con = new ShunConnection();

ShunsakuAccessController controller = new ShunsakuAccessController(con);

controller.update(recordID, updateData);

con.close();

Shunsakuアクセスクラス

public void update(String recordID, String updateData)

throws ShunException {

ShunPreparedRecordID prid = con.prepareUpdateRecordID(); (1)

prid.add(recordID, updateData); (2)

prid.updateByRecordID(); (3)

prid.close(); (4)

}

9.3.4 コネクションの切断

データの検索またはデータの更新が終わったら、コネクションの切断を行います。コネクションの切断はcloseメソッドを使

用します。

- 165 -

記述例

ShunConnection con = new ShunConnection();

con.close();

StudioまたはApworks利用時の記述例

StudioまたはApworksを使用する場合は、ビジネスクラスに上記の記述例のようなコードを記述します。

9.3.5 エラー発生時の対処

Java APIを使用したアプリケーションでエラーが発生した場合、ShunExceptionを通知します。ShunExceptionクラスのメ

ソッドを使用することで、以下の情報を取得することができます。

・ エラーレベル

・ エラーメッセージ

記述例

try {

} catch (ShunException ex) {

int errorLevel = ex.getErrLevel(); (1)

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_TRANSACTION_ROLLEDBACK :

System.out.println("エラーレベル :SHUN_ERROR_TRANSACTION_ROLLEDBACK");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage()); (2)

}

(1) エラーレベル

getErrLevelメソッドを使用することで、エラーレベルを取得することができます。

エラーの発生により、コネクションが強制切断される場合があります。エラーレベルを調べることで、ユーザはエラー発

生後のアプリケーションの状態を知ることができます。

エラーレベルとして、以下の3つを返却しています。

定数名 意味

SHUN_ERROR パラメタ間違いなど、警告レベルのエラーが

発生したことを意味します。エラーの発生箇

所から再実行してください。

- 166 -

定数名 意味

SHUN_ERROR_TRANSACTION_ROLLEDBACK

エラーの発生により、トランザクションがキャン

セルされた状態です。トランザクションの開始

点から再実行してください。

SHUN_ERROR_CONNECTION_TERMINATED

エラーの発生により、コネクションが強制切断

された状態です。エラーが発生した

ShunConnectionオブジェクトを解放したあと、

コネクションの確立から再実行してください。

(2) エラーメッセージ

getMessageメソッドを使用することで、エラーメッセージを取得することができます。

エラーメッセージの詳細は、“メッセージ集”の“API実行時に出力されるメッセージ”を参照してください。

9.3.5.1 エラー発生時の対処例

エラー発生時の対処例について説明します。

処理の流れ

エラー発生時は、取得したエラーレベルによって再実行する箇所を切り分けます。エラーレベルによる再実行処理の切

分けについて、以下の図に示します。

図9.15 エラー発生時の対処

(1) パラメタ間違いなどのエラーが発生した場合

SHUN_ERRORが返却されます。この場合、パラメタなどを修正後、失敗した処理を再実行します。

- 167 -

(2) トランザクションがキャンセルされた場合

SHUN_ERROR_TRANSACTION_ROLLEDBACK(注1)が返却されます。この場合、トランザクションを開始した位置

(注2)から再実行します。

注1) 自動コミットを無効にした場合のみ、返却するエラーレベルです。自動コミットが有効の場合は、本エラーレベル

は返却しません。

注2) APIからは、明示的にトランザクションを開始することはできません。自動コミットを無効にした後、データに対す

る初回の更新操作によって自動的に開始されます。

(3) Shunsakuとの接続が強制切断された場合

SHUN_ERROR_CONNECTION_TERMINATEDが返却されます。この場合、エラーが発生したShunConnectionオブジェクトを解放し、コネクションの確立を再実行します。

9.4 アプリケーションのデバッグ

アプリケーションのデバッグの詳細については、“第8章 アプリケーションのデバッグ”を参照してください。

9.5 Java APIで使用する文字コード

Java APIで使用する文字コードについて説明します。

検索式、リターン式およびソート式で使用する文字コードは、Unicodeを指定してください。

検索した結果は、Unicodeで返却します。

全体の文字コードの関係を以下の図に示します。

- 168 -

図9.16 Java APIで使用する文字コードの関係

- 169 -

第10章 .NET APIのアプリケーション開発

本章では、Shunsakuの.NET APIを利用したMicrosoft .NET Framework上で動作するアプリケーション(以降、.NETアプ

リケーションと略します)開発について説明します。

10.1 .NET APIの概要

.NET APIとは、.NETアプリケーションからShunsakuのデータを操作するためのインタフェースです。

図10.1 .NET APIの位置付け

.NET APIのクラスの一覧を以下の表に示します。

表10.1 .NET APIのクラスの一覧

クラス名 説明

ShunKeyRequirement ダイレクトアクセスキーの条件を保持しま

す。

ShunPosition 検索した結果の位置情報と検索方向を保

持します。

ShunRecord Shunsakuの1件分のデータを表現するクラ

スです。

ShunRecordIDとデータを保持します。

ShunRecordCollection ShunRecordのコレクションを表現します。

ShunRecordEnumerator ShunRecordCollection内のShunRecordを列挙するために使用するクラスです。

ShunRecordID ShunsakuのレコードIDを表現するクラスで

す。

ShunResultSet 検索した結果を表現するクラスです。

ShunSearchRequirement 検索条件を保持します。

- 170 -

クラス名 説明

ShunService Shunsakuに接続し、データ操作を行うメソッ

ドを提供するクラスです。

ShunAPIConfigException API用動作環境ファイルに誤りがあるとき

にスローされる例外です。

ShunConnectionTerminatedException Shunsakuとの接続が強制切断されたとき

にスローされる例外です。

ShunContinuousException 警告レベルのエラーが発生したときにス

ローされる例外です。エラーの原因を取り

除き、エラーの発生箇所から再実行してく

ださい。

ShunException Shunsakuの例外クラスすべての基底クラス

です。

ShunSystemException 想定外のエラーが発生し、Shunsakuとの接続が強制切断されたときにスローされる

例外です。

ShunTimeoutException Shunsakuとの接続がタイムアウトにより強

制切断されたときにスローされる例外で

す。

ShunTransactionRolledbackException トランザクションがキャンセルされたときに

スローされる例外です。

- 171 -

図10.2 .NET APIの主なクラスの関連

参照

例外クラスについては、“10.3.5 エラー発生時の対処”を参照してください。

.NET APIの詳細については、“.NET APIリファレンス”を参照してください。

10.2 Microsoft(R) Visual Studio(R) .NETを利用したアプリケーション開発方法

.NETアプリケーションは、統合開発環境であるMicrosoft(R) Visual Studio(R) .NETを利用すると、効率よく開発すること

ができます。

10.2.1 Microsoft(R) Visual Studio(R) .NETで開発するメリット

Microsoft(R) Visual Studio(R) .NETを利用してShunsakuと連携するアプリケーションを開発することで次のようなメリットが

あります。

- 172 -

・ 一般的な.NETアプリケーション開発の流れに沿って開発できます。

・ コード補完機能やGUIデザイナなど、Microsoft(R) Visual Studio(R) .NETの開発ツールを使ってアプリケーションを

構築できます。

・ .NET Framework上で動作するWebアプリケーションを容易に開発できます。

参考

Microsoft(R) Visual Studio(R) .NETを利用してShunsakuと連携するアプリケーションを開発する場合には、Shunsakuのコンポーネントへの参照を追加しておく必要があります。

10.2.2 Microsoft(R) Visual Studio(R) .NETを利用した開発

Microsoft(R) Visual Studio(R) .NETを利用した、Shunsakuと連携するWebアプリケーションの構成と開発のおおまかな流

れを以下に説明します。

10.2.2.1 Shunsakuと連携するWebアプリケーションの構成

Shunsakuと連携するWebアプリケーションの構成について説明します。

図10.3 Shunsakuと連携するWebアプリケーションの構成

・ Webフォーム

Webフォームは、.aspxファイルとクラスファイルが含まれ、ユーザインタフェースを構成します。画面枚数分、作成しま

す。

.aspxファイルには、HTMLテキストとコントロールが含まれます。クラスファイルには、ボタンをクリックした際の処理な

ど、画面遷移などのイベント処理を記述します。(画面遷移の処理は、ASP.NETフレームワークの状態管理機能を利

用します。)クラスファイルの拡張子はプロジェクトで指定した言語によって異なり、C# .NETの場合は.aspx.cs、VB .NETの場合は .aspx.vbとなります。

- 173 -

・ データアクセスコンポーネント

.NET APIのコンポーネントを追加し、Shunsakuとの接続処理や、データ操作の処理を記述します。

・ ビジネスロジックオブジェクト

ビジネス ルールを実装したメソッドまたはサブルーチンを記述します。業務単位に作成します。

10.2.2.2 Shunsakuと連携するWebアプリケーションの開発の流れ

Shunsakuと連携するWebアプリケーションの開発の流れを以下に示します。

図10.4 開発の流れ

・ プロジェクトの作成

作成するアプリケーションに沿ったプロジェクトを作成します。プロジェクトの作成は、ウィザードとの対話で簡単に作

成することができます。

・ Webフォームの作成

プロジェクトにWebフォームのひな型を追加します。

作成されたWebフォームに、ツールボックスからコンポーネントをドラッグ&ドロップして画面を構成します。

・ データアクセスコンポーネントの作成

プロジェクトにコンポーネントのひな型を追加します。

作成されたコンポーネントに、ツールボックスから.NET APIのコンポーネントを追加し、Shunsakuとの接続処理や、

データ操作の処理を記述します。

- 174 -

・ ビジネスロジックオブジェクトの作成

プロジェクトにクラスのひな型を追加します。

ビジネス ルールを実装したメソッドまたはサブルーチンを記述します。

・ イベント処理の追加

Webフォームのクラスファイルに、イベント処理を追加します。

・ ビルド

プロジェクトをビルドします。

・ 実行

アプリケーションを実行します。

・ デバッグ

作成したWebアプリケーションに誤りがあった場合、デバッガを使用して論理的な誤りを検出することができます。

参照

デバッグについては、“8.1.1 デバッガを利用したデバッグ”を参照してください。

10.3 .NET APIの使用方法

.NET APIの使用方法について説明します。

なお、本節では、C# .NETおよびVB .NETの記述例を載せています。C++ .NETの記述例に関しては、“付録I C++ .NETサンプルプログラム”を参照してください。

10.3.1 コネクションの確立

コネクションを確立するには、ShunServiceオブジェクトを作成し、Connectメソッドを使用します。接続先のホスト名とポート番号

を指定するには以下の方法があります。

・ API用動作環境ファイルに指定する方法

・ ホスト名とポート番号をプロパティで指定する方法

・ ホスト名とポート番号をコンストラクタで指定する方法

10.3.1.1 API用動作環境ファイルの設定によりコネクションを確立する方法

API用動作環境ファイルの設定により、コネクションを確立する方法について説明します。

C# .NETの記述例

ShunService service = new ShunService();

service.Connect();

- 175 -

VB .NETの記述例

Dim service As New ShunService ()

service.Connect()

参照

API用動作環境ファイルの設定の詳細については、“2.4 動作環境ファイルの設定”を参照してください。

10.3.1.2 ホスト名とポート番号をプロパティで指定する方法

ホスト名とポート番号をプロパティで指定して、接続する方法について説明します。

C# .NETの記述例

ホスト名“DirSvr1”、ポート番号“23101”の場合

ShunService service = new ShunService();

service.Host = "DirSvr1";

service.Port = 23101;

service.Connect();

VB .NETの記述例

ホスト名“DirSvr1”、ポート番号“23101”の場合

Dim service As New ShunService()

service.Host = "DirSvr1"

service.Port = 23101

service.Connect()

10.3.1.3 ホスト名とポート番号をコンストラクタで指定する方法

ホスト名とポート番号をShunServiceクラスのコンストラクタで指定して、接続する方法について説明します。

C# .NETの記述例

ホスト名“DirSvr1”、ポート番号“23101”の場合

ShunService service = new ShunService( "DirSvr1", 23101, null );

service.Connect();

VB .NETの記述例

ホスト名“DirSvr1”、ポート番号“23101”の場合

Dim service As New ShunService( "DirSvr1", 23101, Nothing )

service.Connect()

- 176 -

10.3.2 データの検索

.NET APIでは、以下に示す操作ができます。

・ 検索条件に一致するXML文書の件数を取得する

・ 検索条件に一致するXML文書を指定した形式で取得する

・ 特定のXML文書をすべて取得する

・ 検索条件に一致するXML文書をソートして取得する

・ 検索条件に一致するXML文書を連続して取得する

・ 検索条件に一致するXML文書の値を集計して取得する

これらの操作を組み合わせることによって、さまざまなアプリケーションを作成することができます。

参考

ダイレクトアクセスキーを使ったデータ検索も可能です。

ダイレクトアクセスキー機能の詳細については、“第6章 ダイレクトアクセス機能”を参照してください。

C# .NETでのデータを検索するサンプルプログラムについては、“G.1 データの検索”、VB .NETでのデータを検索する

サンプルプログラムについては、“H.1 データの検索”、C++ .NETでのデータを検索するサンプルプログラムについて

は、“I.1 データの検索”を参照してください。

以降に、データの検索を行うアプリケーションの作成方法について説明します。

10.3.2.1 条件に一致するXML文書の件数を取得する

条件に一致するデータを取り出す前に、件数のみ取得したい場合があります。

このような場合、GetHitCountメソッドで検索式を指定し、件数のみを取得します。

条件に一致するXML文書の件数を取得する場合の流れについて、以下の図に示します。

- 177 -

図10.5 条件に一致するXML文書の件数を取得する場合の流れ

C# .NETの記述例

ShunService service = new ShunService();

service.Connect();

int hitCount = service.GetHitCount( "/document/base/prefecture == '大阪'" ); (1)

Console.WriteLine( "[ヒット件数] = {0}", hitCount );

service.Disconnect();

VB .NETの記述例

Dim service As New ShunService()

service.Connect()

Dim hitCount As Integer = service.GetHitCount( "/document/base/prefecture == '大

阪'" ) (1)

Console.WriteLine( "[ヒット件数] = {0}", hitCount )

service.Disconnect()

(1) 検索条件に一致するXML文書のヒット件数の取得

GetHitCountの引数に検索式を指定して、ヒット件数を取得します。

検索式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。

10.3.2.2 件数に応じて検索した結果を取得する

Webアプリケーションでは、画面にすべての検索結果を表示するのではなく、任意の件数ごとにページを制御することが

一般的です。

このような場合、ShunSearchRequirementオブジェクトの返信開始番号(ReplyNumber)と返信要求件数(RequestCount)を指定して、取得するデータの件数を制御します。

- 178 -

件数に応じて検索した結果を取得する場合の流れについて、以下の図に示します。

図10.6 件数に応じて検索した結果を取得する場合の流れ

C# .NETの記述例

ShunService service = new ShunService();

service.Connect();

ShunSearchRequirement req = new ShunSearchRequirement();

(1)

req.QueryExpression = "/document/base/prefecture == '大阪'";

(1)

req.ReturnExpression = "/document/base/name, /document/base/price";

(1)

req.ReplyNumber = 11;

(1)

req.RequestCount = 5;

(1)

ShunResultSet rs = service.Search( req );

(2)

Console.WriteLine( "[ヒット件数] = {0}", rs.HitCount );

int i = 0;

foreach ( ShunRecord record in rs.Records )

{ (3)

- 179 -

++i;

Console.WriteLine( "[結果] {0}件目 = {1}", i, record.Data );

(3)

}

service.Disconnect();

VB .NETの記述例

Dim service As New ShunService()

service.Connect()

Dim req As New ShunSearchRequirement()

(1)

req.QueryExpression = "/document/base/prefecture == '大

阪'" (1)

req.ReturnExpression = "/document/base/name, /document/base/

price" (1)

req.ReplyNumber = 11

(1)

req.RequestCount = 5

(1)

Dim rs As ShunResultSet = service.Search( req )

(2)

Console.WriteLine( "[ヒット件数] = {0}", rs.HitCount )

Dim i As Integer = 0

For Each record As ShunRecord In rs.Records

(3)

i += 1

Console.WriteLine( "[結果] {0}件目 = {1}", i, record.Data )

(3)

Next

service.Disconnect()

(1) 検索条件の設定

ShunSearchRequirementオブジェクトを作成し、検索条件として以下のプロパティを設定します。

表10.2 プロパティ一覧

プロパティ 説明

QueryExpression 検索式を指定します。省略はできま

せん。

ReturnExpression リターン式を指定します。

ReplyNumber 返信開始番号を指定します。省略し

た場合、1が指定されます。

RequestCount 返信要求件数を指定します。省略し

た場合、検索した結果から得られる件

数はconductor用動作環境ファイルま

たはdirector用動作環境ファイルの

AnsMaxに設定された値となります。

検索式およびリターン式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。

- 180 -

ポイント

返信要求件数には、1画面に表示する件数を指定します。

(2) 検索の実行(ShunResultSetオブジェクトの作成)

検索は、Searchメソッドに検索条件を設定したShunSearchRequirementオブジェクトを指定し、使用します。検索した結

果としてShunResultSetオブジェクトが作成されます。

ポイント

検索条件に一致するXML文書のヒット件数は、ShunResultSetオブジェクトのHitCountプロパティで取得できます。こ

の値を使用して、検索した結果のページ数などを求めることができます。

(3) 検索した結果の取出し

ShunResultSetオブジェクトから1件分のデータに相当するShunRecordオブジェクトを取り出し、ShunRecordオブジェク

トからXML文書を取り出します。

XML文書を取り出すには、目的に応じて以下のプロパティまたはメソッドを使用します。使用可能なプロパティおよび

メソッドについては以下の表を参照してください。

表10.3 XML文書を取り出す場合に使用可能なプロパティおよびメソッド

プロパティ名またはメソッド名 機能説明

Dataプロパティ XML文書をStringオブジェクトで取り

出します。

GetDividedDataメソッド XML文書をStringオブジェクトの2次元配列で取り出します。

GetStreamメソッド XML文書をStreamオブジェクトで取

り出します。

備考. GetDividedDataメソッドは、検索した結果をテキスト形式で取り出す場合に有効です。

10.3.2.3 条件を追加しながら検索した結果を取得する

検索した結果の件数が非常に多いとき、さらに条件を追加して件数を絞りたい場合があります。

このような場合、ShunSearchRequirementオブジェクトに指定する検索式に条件を追加して新しい検索式を作成し、再度

検索する処理を行います。この操作を繰り返すことで、画面に表示された検索結果を参照しながら検索結果を絞り込む

ことができます。

条件を追加しながら検索した結果を取得する場合の流れについて、以下の図に示します。

- 181 -

図10.7 条件を追加しながら検索した結果を取得する場合の流れ

C# .NETおよびVB .NETの記述例

条件を追加しながら検索した結果を取得する場合の記述例については、“10.3.2.2 件数に応じて検索した結果を取得す

る”を参照してください。

条件を追加する場合には、ShunSearchRequirementオブジェクトに指定する検索式に条件を追加してください。

10.3.2.4 データをソートして取得する

検索した結果をある特定の要素をキーとしてソートして取得したい場合があります。

データの部分情報をソートして取得するには、ShunSearchRequirementオブジェクトのSortExpressionプロパティを使用し

ます。

データをソートして取得する場合の流れについて、以下の図に示します。

- 182 -

図10.8 データをソートして取得する場合の流れ

ポイント

ソートを行う場合には、検索条件に一致したすべてのXML文書を参照してソート処理を行います。検索式には、結果件

数が適正な値となるような条件を指定し、ソート対象のデータを絞ることが応答性能をよくするポイントです。ソートを実施

する前に検索条件に一致したXML文書の件数を調べるには、GetHitCountメソッドに検索条件を設定して使用します。

C# .NETの記述例

ShunService service = new ShunService();

service.Connect();

ShunSearchRequirement req = new ShunSearchRequirement();

(1)

req.QueryExpression = "/document/base/prefecture == '大阪'";

(1)

req.ReturnExpression = "/document/base/name, /document/base/price";

(1)

req.SortExpression = "val(/document/base/price/text()) DESC";

(1)

ShunResultSet rs = service.Search( req );

(2)

Console.WriteLine ( "[ヒット件数] = {0}", rs.HitCount );

- 183 -

int i = 0;

foreach ( ShunRecord record in rs.Records )

{ (3)

++i;

Console.WriteLine( "[結果] {0}件目 = {1}", i, record.Data );

(3)

}

service.Disconnect();

VB .NETの記述例

Dim service As New ShunService()

service.Connect()

Dim req As New ShunSearchRequirement()

(1)

req.QueryExpression = "/document/base/prefecture == '大

阪'" (1)

req.ReturnExpression = "/document/base/name, /document/base/

price" (1)

req.SortExpression = "val(/document/base/price/text())

DESC" (1)

Dim rs As ShunResultSet = service.Search( req )

(2)

Console.WriteLine( "[ヒット件数] = {0}", rs.HitCount )

Dim i As Integer = 0

For Each record As ShunRecord In rs.Records

(3)

i += 1

Console.WriteLine( "[結果] {0}件目 = {1}", i, record.Data )

(3)

Next

service.Disconnect()

(1) 検索条件の設定

ShunSearchRequirementオブジェクトを作成し、検索条件として以下のプロパティを設定します。ソートを行う場合は、

SortExpressionプロパティにソート式を設定します。

表10.4 プロパティ一覧

プロパティ 説明

QueryExpression 検索式を指定します。省略はできま

せん。

ReturnExpression リターン式を指定します。

SortExpression ソート式を指定します。ソートしない場

合は、省略します。

ReplyNumber 返信開始番号を指定します。省略し

た場合、1が指定されます。

RequestCount 返信要求件数を指定します。省略し

た場合、検索した結果から得られる件

数はconductor用動作環境ファイルま

- 184 -

プロパティ 説明

たはdirector用動作環境ファイルの

AnsMaxに設定された値となります。

検索式およびリターン式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。

ソート式の詳細は、“B.5 ソート式”を参照してください。

注意

ソート式に指定したキーの長さによって返却できる件数が決まります。 大件数は1000件です。返信開始番号や返

信要求件数に返却可能な 大件数を超える値を指定しても、それ以上のデータは返却することができません。返却

可能なデータの 大件数は、ReturnableCountプロパティで取得できます。

キーの長さと返却可能なデータ件数の目安については、“付録C 定量値”を参照してください。

参考

取得開始位置を指定することにより、続きのデータを取り出すことができます。これにより1000件以上のデータを取り

出すことができます。詳細については、“10.3.2.7 条件に一致するXML文書を連続して取得する”を参照してくださ

い。

(2) 検索の実行(ShunResultSetオブジェクトの作成)

検索は、Searchメソッドに検索条件を設定したShunSearchRequirementオブジェクトを指定し、使用します。検索した結

果としてShunResultSetオブジェクトが作成されます。

(3) 検索した結果の取出し

ShunResultSetオブジェクトから1件分のデータに相当するShunRecordオブジェクトを取り出し、ShunRecordオブジェク

トからXML文書を取り出します。

XML文書を取り出すには、目的に応じて以下のプロパティまたはメソッドを使用します。使用可能なプロパティおよび

メソッドについては以下の表を参照してください。

表10.5 XML文書を取り出す場合に使用可能なプロパティおよびメソッド

プロパティ名またはメソッド名 機能説明

Dataプロパティ XML文書をStringオブジェクトで取り出しま

す。

GetDividedDataメソッド XML文書をStringオブジェクトの2次元配列

で取り出します。

GetStreamメソッド XML文書をStreamオブジェクトで取り出しま

す。

10.3.2.5 レコードIDを利用してXML文書全体を取得する

XML文書の中から必要なXML文書を検索する場合、はじめからXML文書の全体を取得するのではなく、XML文書を

識別するのに有効な部分情報を取得します。利用者は、これらの部分情報から詳細情報を取得したいXML文書を特定

します。

- 185 -

XML文書の全体を取り出すには、部分情報を取り出したShunRecordオブジェクトをShunRecordCollectionオブジェクトに

設定し、SearchByRecordIDメソッドを使用することで目的のXML文書の全体を取り出すことができます。

レコードIDを利用してXML文書全体を取得する場合の流れについて、以下の図に示します。

図10.9 レコードIDを利用してXML文書全体を取得する場合の流れ

C# .NETの記述例

ShunService service = new ShunService();

service.Connect();

ShunSearchRequirement req = new

ShunSearchRequirement();

req.QueryExpression = "/document/base/prefecture == '大

阪'";

req.ReturnExpression = "/document/base/name/text()";

ShunResultSet rs =

service.Search( req );

Console.WriteLine("[ヒット件数] = " +

rs.HitCount);

ShunRecordCollection recCol = new ShunRecordCollection();

(1)

foreach ( ShunRecord record in rs.Records )

{ (2)

if ( record.Data == "ホテル1" )

- 186 -

{ (2)

recCol.Add( record );

(2)

}

}

rs = service.SearchByRecordID( recCol );

(3)

foreach ( ShunRecord record in rs.Records )

{ (4)

Console.WriteLine( "[詳細] = " + record.Data );

(4)

}

service.Disconnect();

VB .NETの記述例

Dim service As New ShunService()

service.Connect()

Dim req As New ShunSearchRequirement()

req.QueryExpression = "/document/base/prefecture == '大阪'"

req.ReturnExpression = "/document/base/name/text()"

Dim rs As ShunResultSet = service.Search( req )

Console.WriteLine( "[ヒット件数] = {0}", rs.HitCount )

Dim recCol As New ShunRecordCollection()

(1)

For Each record As ShunRecord In rs.Records

(2)

If record.Data = "ホテル1" Then

(2)

recCol.Add( record )

(2)

End If

Next

rs = service.SearchByRecordID( recCol )

(3)

For Each record As ShunRecord In rs.Records

(4)

Console.WriteLine( "[詳細] = {0}", record.Data)

(4)

Next

service.Disconnect()

(1) ShunRecordCollectionオブジェクトの作成

ShunRecordCollectionオブジェクトを作成します。

(2) レコードIDを保持するShunRecordオブジェクトを設定

ShunRecordオブジェクトを、ShunRecordCollectionオブジェクトに設定します。

ShunRecordオブジェクトを設定するには、以下のメソッドを使用します。使用可能なメソッドについては以下の表を参

照してください。

- 187 -

表10.6 ShunRecordオブジェクトを設定するメソッド一覧

メソッド名またはプロパティ名 機能説明

Add(ShunRecord record) ShunRecord を ShunRecordCollection の末尾

に追加します。

AddRange(ShunRecord[ ] records) ShunRecord 配列の要素を

ShunRecordCollection の末尾にコピーしま

す。

Insert(int index, ShunRecord record) ShunRecordCollection 内の指定したインデッ

クス位置に、 ShunRecord を挿入します。

Item[int index] 指定したインデックス位置のShunRecordを置

き換えます。

C# .NETでは、このプロパティは

ShunRecordCollectionクラスのインデクサにな

ります。

(3) 検索の実行(ShunRecordCollectionオブジェクトの作成)

検索の実行はSearchByRecordIDメソッドを使用します。検索した結果としてShunRecordCollectionオブジェクトが作成

されます。

(4) 検索した結果を取出し

ShunRecordCollectionオブジェクトから1件分のデータに相当するShunRecordオブジェクトを取り出し、ShunRecordオブジェクトからXML文書を取り出します。

XML文書を取り出すには、目的に応じて以下のプロパティまたはメソッドを使用します。使用可能なプロパティおよび

メソッドについては以下の表を参照してください。

表10.7 XML文書を取り出す場合に使用可能なプロパティおよびメソッド

プロパティ名またはメソッド名 機能説明

Dataプロパティ XML文書をStringオブジェクトで取り

出します。

GetDividedDataメソッド XML文書をStringオブジェクトの2次元配列で取り出します。

GetStreamメソッド XML文書をStreamオブジェクトで取

り出します。

備考. GetDividedDataメソッドは、検索した結果をテキスト形式で取り出す場合に有効です。

10.3.2.6 ヒット件数の上限値を設定する

ヒット件数の上限値を設定することで、ソートまたは集計の応答性能を安定させることができます。ヒット件数が上限値を

超えた場合には、ソートまたは集計を中断し検索条件に一致したヒット件数を通知します。

ヒット件数が上限値を超えないように検索式に条件を追加し、ソートまたは集計の検索範囲を絞り込みます。

ヒット件数の上限値を設定するには、HitCountLimitプロパティを使用します。

ヒット件数の上限値を設定する場合の流れについて、以下の図に示します。

- 188 -

図10.10 ヒット件数の上限値を設定する場合の流れ

記述例

ShunService service = new ShunService();

service.Connect();

ShunSearchRequirement req = new ShunSearchRequirement();

req.QueryExpression = "/document/base/prefecture == '大阪'";

req.ReturnExpression = "/document/base/name, /document/base/price";

req.SortExpression = "val(/document/base/price/text()) DESC";

req.HitCountLimit = 10000;

(1)

ShunResultSet rs = service.Search( req );

if ( rs.IsHitCountLimitOver )

{ (2)

Console.WriteLine ("ヒット件数が上限を超えました");

Console.WriteLine ("[ヒット件数] = " + rs.HitCount);

(3)

}

else{

Console.WriteLine("[ヒット件数] = " + rs.HitCount);

int i = 0;

foreach ( ShunRecord record in rs.Records ) {

++i;

Console.WriteLine( "[結果] {0}件目 = {1}", i, record.Data );

}

- 189 -

}

service.Disconnect();

(1) ヒット件数の上限値設定

HitCountLimitプロパティのパラメタにヒット件数の上限値を設定します。

注意

ソート式が設定されていない場合には、Searchメソッド実行時にエラーとなります。

(2) ヒット件数が上限値を超えているの確認

IsHitCountLimitOverプロパティでヒット件数が上限値を超えているかの確認をします。

(3) ヒット件数の取出し

ヒット件数が上限値を超えている場合は、ヒット件数のみ取出し可能です。

10.3.2.7 条件に一致するXML文書を連続して取得する

Webアプリケーションでは、検索した結果を一定件数ごとに区切って、前後に連続したデータを取得したい場合がありま

す。

このような場合、ShunSearchRequirementオブジェクトのPositionプロパティに、その直前の検索処理によって取得した

終位置情報、または、先頭位置情報を指定してXML文書を連続して取得します。

条件に一致するXML文書を連続して取得する場合の流れについて、以下の図に示します。

- 190 -

図10.11 条件に一致するXML文書を連続して取得する場合の流れ

C# .NETの記述例

ShunService service = new ShunService();

service.Connect();

ShunSearchRequirement req = new ShunSearchRequirement();

req.QueryExpression = "/document/base/prefecture == '大阪'";

req.ReturnExpression = "/document/base/name, /document/base/price";

req.SortExpression = "val(/document/base/price/text()) DESC";

req.ReplyNumber = 5;

// 先頭位置情報

ShunPosition firstPosition = null;

// 終位置情報

ShunPosition lastPosition = null;

// どのページを表示するかによってpositionの設定を変更

// 次のページを表示する場合は directionがNEXT、前のページを表示する場合は directionがPREV

とする

switch ( direction ) {

case NEXT:

// 次のページを表示する場

合 (2)

- 191 -

req.Position = lastPosition;

break;

case PREV:

// 前のページを表示する場

合 (3)

req.Position = firstPosition;

break;

default:

// 初のページを表示する場

合 (1)

req.Position = null;

break;

}

ShunResultSet rs = service.Search( req );

(4)

Console.WriteLine ( "[ヒット件数] = {0}", rs.HitCount );

int i = 0;

foreach ( ShunRecord record in rs.Records )

{ (5)

++i;

Console.WriteLine( "[結果] {0}件目 = {1}", i, record.Data );

(5)

}

// 先頭位置情報と 終位置情報を格納

firstPosition = rs.FirstPosition;

(6)

lastPosition = rs.LastPosition;

(6)

service.Disconnect();

VB .NETの記述例

Dim service As New ShunService()

service.Connect()

Dim req As New ShunSearchRequirement()

req.QueryExpression = "/document/base/prefecture == '大阪'"

req.ReturnExpression = "/document/base/name, /document/base/price"

req.SortExpression = "val(/document/base/price/text()) DESC"

req.ReplyNumber = 5

' 先頭位置情報

Dim firstPosition As ShunPosition = Nothing

' 終位置情報

Dim lastPosition As ShunPosition = Nothing

' どのページを表示するかによってpositionの設定を変更

' 次のページを表示する場合は directionがNEXT、前のページを表示する場合は directionがPREV

とする

Select Case direction

Case NEXT

' 次のページを表示する場合

(2)

req.Position = lastPosition

Case PREV

- 192 -

' 前のページを表示する場合

(3)

req.Position = firstPosition

Case Else

' 初のページを表示する場合

(1)

req.Position = Nothing

End Select

Dim rs As ShunResultSet = service.Search(req)

(4)

Console.WriteLine( "[ヒット件数] = {0}", rs.HitCount )

Dim i As Integer = 0

For Each record As ShunRecord In rs.Records

(5)

i += 1

Console.WriteLine( "[結果] {0}件目 = {1}", i, record.Data )

(5)

Next

' 先頭位置情報と 終位置情報を格納

firstPosition = rs.FirstPosition

(6)

lastPosition = rs.LastPosition

(6)

service.Disconnect()

(1) 初のページを表示する場合

Positionプロパティにデータの取得位置を指定します。 初のページを表示する検索処理では、 初のデータから

取り出しを行うため、データの取得位置(取得開始位置または取得終了位置)にはnullを指定します。取得位置にnullを指定すると、1件目からデータを取り出します。

(2) 次のページを表示する場合

Positionプロパティにデータの取得位置を指定します。次のページを表示する検索処理では、前回検索時の 終位

置情報をLastPositionプロパティで取得しておき、データの取得位置(取得開始位置)に指定します。この指定により

前回取得したデータの続きのデータを取得します。

(3) 前のページを表示する場合

Positionプロパティにデータの取得位置を指定します。前のページを表示する検索処理では、前回検索時の先頭位

置情報をFirstPositionプロパティで取得しておき、データの取得位置(取得終了位置)に指定します。この指定により

前回取得したデータの前の部分のデータを取得します。

(4) 検索の実行

検索は、Searchメソッドに検索条件を設定したShunSearchRequirementオブジェクトを指定し、使用します。検索した結

果としてShunResultSetオブジェクトが作成されます。

(5) 検索した結果の取出し

ShunResultSetオブジェクトから1件分のデータに相当するShunRecordオブジェクトを取り出し、ShunRecordオブジェク

トからXML文書を取り出します。

- 193 -

XML文書を取り出すには、目的に応じて以下のプロパティまたはメソッドを使用します。使用可能なプロパティおよび

メソッドについては以下の表を参照してください。

表10.8 XML文書を取り出す場合に使用可能なプロパティおよびメソッド

プロパティ名またはメソッド名 機能説明

Dataプロパティ XML文書をStringオブジェクトで取り

出します。

GetDividedDataメソッド XML文書をStringオブジェクトの2次元配列で取り出します。

GetStreamメソッド XML文書をStreamオブジェクトで取

り出します。

備考. GetDividedDataメソッドは、検索した結果をテキスト形式で取り出す場合に有効です。

(6) 先頭位置情報と 終位置情報を格納

FirstPositionプロパティで先頭位置情報を取得します。

LastPositionプロパティで 終位置情報を取得します。

10.3.2.8 条件に一致するデータの内容を集計する

検索した結果をある特定の要素の値で集計して取得したい場合があります。

データの内容を集計するには、ShunSearchRequirementオブジェクトのSortExpressionプロパティを使用します。

ShunSearchRequirementオブジェクトのプロパティであるリターン式に集合関数指定を指定すると、検索した結果が集計

されて返却されます。集計処理では、合計値、平均値、 大値、 小値または件数を求めることができます。

条件に一致するデータの内容を集計する場合の流れについて、以下の図に示します。

図10.12 条件に一致するXML文書を連続して取得する場合の流れ

- 194 -

C# .NETの記述例

ShunService service = new ShunService();

service.Connect();

ShunSearchRequirement req = new ShunSearchRequirement();

(1)

req.QueryExpression = "/document/base/prefecture == '大阪'";

(1)

req.ReturnExpression = "max(/document/base/price/text())";

(1)

req.SortExpression = " /document/base/prefecture/text()";

(1)

ShunResultSet rs = service.Search( req );

(2)

foreach ( ShunRecord record in rs.Records )

{ (3)

String[][] data = record.GetDividedData();

(3)

Console.WriteLine( "[結果] {0}", data[0][0] );

(3)

}

service.Disconnect();

VB .NETの記述例

Dim service As New ShunService()

service.Connect()

Dim req As New ShunSearchRequirement()

(1)

req.QueryExpression = "/document/base/prefecture == '大

阪'" (1)

req.ReturnExpression = "max(/document/base/price/

text())" (1)

req.SortExpression = " /document/base/prefecture/

text()" (1)

Dim rs As ShunResultSet = service.Search( req )

(2)

For Each record As ShunRecord In rs.Records

(3)

Dim data()() As String = record.GetDividedData()

(3)

Console.WriteLine( "[結果] {0}", data(0)(0) )

(3)

Next

service.Disconnect()

(1) 検索条件の設定

ShunSearchRequirementオブジェクトを作成し、検索条件として以下のプロパティを設定します。集計を行う場合は、リ

ターン式に集合関数指定を指定し、ソート式にグループキーを指定する必要があります。

リターン式および集合関数指定の詳細については、“B.4 リターン式”を参照してください。ソート式の詳細は、“B.5ソート式”を参照してください。

- 195 -

表10.9 プロパティ一覧

プロパティ 説明

QueryExpression 検索式を指定します。省略はできま

せん。

ReturnExpression リターン式を指定します。

SortExpression ソート式を指定します。ソートしない場

合は、省略します。

ReplyNumber 返信開始番号を指定します。省略し

た場合、1が指定されます。

RequestCount 返信要求件数を指定します。省略し

た場合、検索した結果から得られる件

数はconductor用動作環境ファイルま

たはdirector用動作環境ファイルの

AnsMaxに設定された値となります。

検索式およびリターン式の詳細は、“付録B 検索式、リターン式およびソート式の書式”を参照してください。

(2) 検索の実行(ShunResultSetオブジェクトの作成)

検索は、Searchメソッドに検索条件を設定したShunSearchRequirementオブジェクトを指定し、使用します。検索した結

果としてShunResultSetオブジェクトが作成されます。

(3) 検索した結果の取出し

ShunResultSetオブジェクトから1件分のデータに相当するShunRecordオブジェクトを取り出し、ShunRecordオブジェク

トからXML文書を取り出します。

XML文書を取り出すには、目的に応じて以下のプロパティまたはメソッドを使用します。使用可能なプロパティおよび

メソッドについては以下の表を参照してください。

表10.10 XML文書を取り出す場合に使用可能なプロパティおよびメソッド

プロパティ名またはメソッド名 機能説明

Dataプロパティ XML文書をStringオブジェクトで取り出しま

す。

GetDividedDataメソッド XML文書をStringオブジェクトの2次元配列

で取り出します。

GetStreamメソッド XML文書をStreamオブジェクトで取り出しま

す。

10.3.3 データの更新

.NET APIでは、以下に示すデータの更新ができます。

・ XML文書の追加

・ レコードIDによるXML文書の削除

・ レコードIDによるXML文書の更新

- 196 -

参考

ダイレクトアクセスキーを使ったデータ更新も可能です。

ダイレクトアクセスキー機能の詳細については、“第6章 ダイレクトアクセス機能”を参照してください。

C# .NETのデータを更新するサンプルプログラムは、“G.2 データの更新”、VB .NETのデータを更新するサンプルプロ

グラムは、“H.2 データの更新”、C++ .NETのデータを更新するサンプルプログラムは、“I.2 データの更新”を参照してく

ださい。

以降に、データの更新を行うアプリケーションの作成方法について説明します。

10.3.3.1 データを追加する

データを追加するには、Insertメソッドを使用します。

データを追加する場合の流れについて、以下の図に示します。

図10.13 データを追加する場合の流れ

C# .NETの記述例

ShunService service = new ShunService();

service.Connect();

String data = "<document>"

+" <base>"

:

+" </base>"

+" <information>"

:

+" </information>"

+"</document>";

ShunRecordCollection recCol = new ShunRecordCollection();

(1)

ShunRecord record = new ShunRecord( data );

(2)

recCol.Add( record );

(3)

- 197 -

service.Insert( recCol );

(4)

service.Disconnect();

VB .NETの記述例

Dim service As New ShunService()

service.Connect()

Dim data As String = "<document>" _

&" <base>" _

:

&" </base>" _

&" <information>" _

:

&" </information>" _

&"</document>"

Dim recCol As New ShunRecordCollection()

(1)

Dim record As New ShunRecord( data )

(2)

recCol.Add( record )

(3)

service.Insert( recCol )

(4)

service.Disconnect()

(1) ShunRecordCollectionオブジェクトの作成

ShunRecordCollectionオブジェクトを作成します。

(2) 追加するデータの設定

追加したいXML文書をShunRecordオブジェクトに設定します。XML文書を設定するには、以下のメソッドを使用しま

す。使用可能なメソッドについては以下の表を参照してください。

表10.11 XML文書を設定するメソッド一覧

メソッド名またはプロパティ名 機能説明

ShunRecord(String data) XML文書をコンストラクタの引数に指定して

ShunRecordオブジェクトを生成します。

ShunRecord(Stream stream) XML文書をコンストラクタの引数に指定して

ShunRecordオブジェクトを生成します。

Dataプロパティ XML文書を指定します。

setData(Stream stream) XML文書を指定します。

- 198 -

(3) ShunRecordオブジェクトの設定

ShunRecordオブジェクトを、ShunRecordCollectionオブジェクトに設定します。

ShunRecordオブジェクトを設定するには、以下のメソッドを使用します。使用可能なメソッドについては以下の表を参

照してください。

表10.12 ShunRecordオブジェクトを設定するメソッド一覧

メソッド名またはプロパティ名 機能説明

Add(ShunRecord record) ShunRecordをShunRecordCollection の末尾

に追加します。

AddRange(ShunRecord[ ] records) ShunRecord配列の要素を

ShunRecordCollectionの末尾にコピーしま

す。

Insert(int index, ShunRecord record) ShunRecordCollection 内の指定したインデッ

クス位置に、ShunRecord を挿入します。

Item[int index] 指定したインデックス位置のShunRecordを置

き換えます。

C# .NETでは、このプロパティは

ShunRecordCollectionクラスのインデクサにな

ります。

(4) 追加の実行

追加の実行はInsertメソッドを使用します。

10.3.3.2 レコードIDを指定してデータを削除する

データを削除するには、Deleteメソッドを使用します。

.NET APIでは、レコードIDを使用してデータを削除します。データを削除する前に、削除したいデータのレコードIDを取

得しておく必要があります。

レコードIDを指定してデータを削除する場合の流れについて、以下の図に示します。

- 199 -

図10.14 レコードIDを指定してデータを削除する場合の流れ

C# .NETの記述例

ShunService service = new ShunService();

service.Connect();

ShunRecordCollection recCol = new ShunRecordCollection();

(1)

recCol.Add( record );

(2)

service.Delete( recCol );

(3)

service.Disconnect();

VB .NETの記述例

Dim service As New ShunService()

service.Connect()

Dim recCol As New ShunRecordCollection()

(1)

recCol.Add( record )

(2)

service.Delete( recCol )

- 200 -

(3)

service.Disconnect()

(1) ShunRecordCollectionオブジェクトの作成

ShunRecordCollectionオブジェクトを作成します。

(2) ShunRecordオブジェクトの設定

削除したいShunRecordオブジェクトを、ShunRecordCollectionオブジェクトに設定します。

ShunRecordオブジェクトを設定するには、以下のメソッドを使用します。使用可能なメソッドについては以下の表を参

照してください。

表10.13 ShunRecordオブジェクトを設定するメソッド一覧

メソッド名またはプロパティ名 機能説明

Add(ShunRecord record) ShunRecord を ShunRecordCollection の末尾

に追加します。

AddRange(ShunRecord[ ] records) ShunRecord 配列の要素を

ShunRecordCollection の末尾にコピーしま

す。

Insert(int index, ShunRecord record) ShunRecordCollection 内の指定したインデッ

クス位置に、 ShunRecord を挿入します。

Item[int index] 指定したインデックス位置のShunRecordを置

き換えます。

C# .NETでは、このプロパティは

ShunRecordCollectionクラスのインデクサにな

ります。

(3) 削除の実行

削除の実行はDeleteメソッドを使用します。

10.3.3.3 レコードIDを指定してデータを更新する

XML文書を更新するには、Updateメソッドを使用します。

.NET APIでは、レコードIDを使用してデータを更新します。データを更新する前に、更新したいデータのレコードIDを取

得しておく必要があります。レコードIDによるXML文書の更新とは、新しいXML文書で既存のXMLを置換することを指

します。既存のXML文書中のデータを部分的に更新することはできません。

レコードIDを指定してデータを更新する場合の流れについて、以下の図に示します。

- 201 -

図10.15 レコードIDを指定してデータを更新する場合の流れ

C# .NETの記述例

ShunService service = new ShunService();

service.Connect();

ShunSearchRequirement req = new ShunSearchRequirement();

req.QueryExpression = "/document/base/prefecture == '大阪'";

req.ReturnExpression = "/";

ShunResultSet rs = service.Search( req );

(1)

ShunRecord updateRecord = null;

(1)

foreach ( ShunRecord record in rs.Records )

{ (1)

if ( record.Data == "ホテル1" )

{ (1)

updateRecord = record;

(1)

}

}

updateRecord.Data = updateData ;

(2)

ShunRecordCollection recCol = new ShunRecordCollection();

(3)

recCol.Add( updateRecord );

(4)

- 202 -

service.Update( recCol );

(5)

service.Disconnect();

VB .NETの記述例

Dim service As New ShunService()

service.Connect()

Dim req As New ShunSearchRequirement()

req.QueryExpression = "/document/base/prefecture == '大阪'"

req.ReturnExpression = "/"

Dim rs As ShunResultSet = service.Search( req )

(1)

Dim updateRecord As ShunRecord = Nothing

(1)

For Each record As ShunRecord In rs.Records

(1)

If record.Data = "ホテル1" Then

(1)

updateRecord = record

(1)

End If

Next

updateRecord.Data = updateData

(2)

Dim recCol As New ShunRecordCollection()

(3)

recCol.Add( updateRecord )

(4)

service.Update( recCol )

(5)

service.Disconnect()

(1) 更新対象のShunRecordオブジェクトの取得

更新対象のShunRecordオブジェクトを取得します。

(2) 更新するデータの設定

更新したいXML文書をShunRecordオブジェクトに設定します。XML文書を設定するには、以下のメソッドを使用しま

す。使用可能なメソッドについては以下の表を参照してください。

表10.14 XML文書を設定するメソッド一覧

メソッド名またはプロパティ名 機能説明

ShunRecord(String data) XML文書をコンストラクタの引数に指定して

ShunRecordオブジェクトを生成します。

ShunRecord(ShunRecordID recordID, Stringdata)

レコードIDとXML文書をコンストラクタの引数

に指定してShunRecordオブジェクトを生成し

ます。

- 203 -

メソッド名またはプロパティ名 機能説明

ShunRecord(ShunRecordID recordID,Stream stream)

レコードIDとXML文書をコンストラクタの引数

に指定してShunRecordオブジェクトを生成し

ます。

Dataプロパティ XML文書を指定します。

(3) ShunRecordCollectionオブジェクトの作成

ShunRecordCollectionオブジェクトを作成します。

(4) ShunRecordオブジェクトの設定

ShunRecordオブジェクトを、ShunRecordCollectionオブジェクトに設定します。

ShunRecordオブジェクトを設定するには、以下のメソッドを使用します。使用可能なメソッドについては以下の表を参

照してください。

表10.15 ShunRecordオブジェクトを設定するメソッド一覧

メソッド名またはプロパティ名 機能説明

Add(ShunRecord record) ShunRecord を ShunRecordCollection の末尾

に追加します。

AddRange(ShunRecord[ ] records) ShunRecord 配列の要素を

ShunRecordCollection の末尾にコピーしま

す。

Insert(int index, ShunRecord record) ShunRecordCollection 内の指定したインデッ

クス位置に、 ShunRecord を挿入します。

Item[int index] 指定したインデックス位置のShunRecordを置

き換えます。

C# .NETでは、このプロパティは

ShunRecordCollectionクラスのインデクサにな

ります。

(5) 更新の実行

更新の実行はUpdateメソッドを使用します。

10.3.4 コネクションの切断

データの検索またはデータの更新が終わったら、コネクションの切断を行います。コネクションの切断はDisconnectメソッ

ドを使用します。

C# .NETの記述例

ShunService service = new ShunService();

service.Connect() ;

service.Disconnect();

- 204 -

VB .NETの記述例

Dim service As New ShunService ()

service.Connect()

service.Disconnect()

10.3.5 エラー発生時の対処

.NET APIは、エラーの内容によって発生する例外が異なります。キャッチする例外を切り分けて、発生した例外ごとに処

理することが可能です。.NET APIがスローする例外は、主に.NET APIの例外と、それ以外の一般的な例外があります。

以下に、.NET APIの例外の継承関係と、例外の意味について説明します。

図10.16 .NET APIの例外クラスの継承関係

表10.16 .NET APIの例外一覧

例外 意味

ShunException Shunsakuの例外クラスすべての基

底クラスです。

Shunsaku独自のエラーをすべて

キャッチしたいときに使用します。

ShunConnectionTerminatedException Shunsakuとの接続が強制切断され

たときにスローされる例外です。コ

ネクションの確立から再実行してく

ださい。

ShunTimeoutException Shunsakuとの接続がタイムアウトに

より強制切断されたときにスローさ

れる例外です。コネクションの確立

から再実行してください。

ShunTransactionRolledbackException トランザクションがキャンセルされた

ときにスローされる例外です。トラン

- 205 -

例外 意味

ザクションの開始点から再実行して

ください。

ShunContinuousException 警告レベルのエラーが発生したと

きにスローされる例外です。エラー

の原因を取り除き、エラーの発生箇

所から再実行してください。

ShunAPIConfigException API用動作環境ファイルに誤りがあ

ります。エラーの原因を取り除き、

再実行してください。

ShunSystemException 想定外のエラーが発生した場合に

スローされる例外です。エラーメッ

セージを取得し、当社技術員(SE)に連絡してください。

参照

各メソッドでスローされる例外の詳細は、“.NET API リファレンス”を参照してください。

C# .NETの記述例

try {

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if ( service != null ) {

if ( service.State == ShunConnectionState.Open ) {

if ( !service.AutoCommit ) { service.Rollback(); }

service.Disconnect();

}

}

}

catch( ShunException ex ) {

Console.WriteLine( "エラーメッセージ : " + ex.Message );

(1)

}

Console.WriteLine( "エラーメッセージ : " + e.Message );

}

catch ( ShunTransactionRolledbackException e ) {

// ShunTransactionRolledbackExceptionが発生した場合の処理を記述

try {

if( service != null ) {

if( service.State == ShunConnectionState.Open ) {

service.Disconnect();

}

}

}

catch( ShunException ex ) {

Console.WriteLine( "エラーメッセージ : " + ex.Message );

}

Console.WriteLine( "エラーメッセージ : " + e.Message );

}

catch (ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

- 206 -

Console.WriteLine( "エラーメッセージ : " + e.Message );

}

VB .NETの記述例

Try

Catch e As ShunContinuousException

' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing Then

If service.State = ShunConnectionState.Open Then

If Not service.AutoCommit Then

service.Rollback()

End If

service.Disconnect()

End If

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : " + ex.Message )

(1)

End Try

Console.WriteLine( "エラーメッセージ : " + e.Message )

Catch e As ShunTransactionRolledbackException

' ShunTransactionRolledbackExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing Then

If service.State = ShunConnectionState.Open Then

service.Disconnect()

End If

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : " + ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : " + e.Message )

Catch e As ShunConnectionTerminatedException

' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine( "エラーメッセージ : " + e.Message )

End Try

(1) エラーメッセージ

Messgaeプロパティを使用することで、エラーメッセージを取得することができます。

エラーメッセージの詳細は、“メッセージ集”の“API実行時に出力されるメッセージ”を参照してください。

10.4 アプリケーションのデバッグ

アプリケーションのデバッグの詳細については、“第8章 アプリケーションのデバッグ”を参照してください。

- 207 -

10.5 .NET APIで使用する文字コード

.NET APIで使用する文字コードについて説明します。

検索式、リターン式およびソート式で使用する文字コードは、Unicodeを指定してください。

検索した結果は、Unicodeで返却します。

全体の文字コードの関係を以下の図に示します。

図10.17 .NET APIで使用する文字コードの関係

- 208 -

第11章 C APIのアプリケーション開発

本章では、ShunsakuのC APIを利用したアプリケーション開発について説明します。

11.1 C APIの概要

C APIとは、C言語で作成したアプリケーションからShunsakuのデータ操作を行うためのインタフェースです。

C APIを使用したアプリケーションは、コネクションハンドルを作成してShunsakuに接続し、データ操作ハンドルを作成し

て検索および更新を実行します。

C APIの概要について以下の図に示します。

図11.1 C APIの概要

上記のように、C APIのハンドルはコネクションハンドルおよびデータ操作ハンドルの2種類があります。

表11.1 C APIのハンドル一覧

ハンドル 概要 作成単位

コネクションハンドル コネクションの確立または切断の操作

を行います。

コネクションごとに作成しま

す。

- 209 -

ハンドル 概要 作成単位

データ操作ハンドル データの検索およびデータの更新を

実行し、検索した結果を保持します。

データの操作ごとに作成し

ます。

2種類のハンドルは、親子関係を持っています。データ操作ハンドルは、コネクションハンドルを元に割り当てます。コネ

クションハンドルを解放すると、データ操作ハンドルも解放されます。

図11.2 コネクションハンドルとデータ操作ハンドルの関係

11.1.1 ハンドルの使用方法

ハンドルの使用方法について説明します。

処理の流れ

コネクションの確立から切断までの、処理シーケンスの推奨パターンを以下に示します。

- 210 -

図11.3 コネクション確立から切断までの処理の流れ

(1) コネクションハンドルの割当て

ShunAllocHandle関数で、コネクションハンドルを割り当てます。これにより、コネクションハンドルは利用可能な状態と

なります。

(2) コネクションの確立

コネクションハンドルを割り当てた後、ShunConnect関数でShunsakuとのコネクションを確立します。

(3) データ操作ハンドルの割当て

コネクションの確立後、ShunAllocHandle関数でデータ操作ハンドルを割り当てます。

これにより、データ操作ハンドルは利用可能な状態となり、Shunsakuに対してデータの検索および更新ができます。

(4) データ操作ハンドルの解放

ShunFreeHandle関数で、データ操作ハンドルを解放します。データ操作ハンドルを解放すると、そのハンドルが持つ

リソース(レコードID、データ、位置情報、ダイレクトアクセスキー)も解放されます。

(5) コネクションの切断

ShunDisconnect関数で、コネクションを切断します。

(6) コネクションハンドルの解放

ShunFreeHandle関数で、コネクションハンドルを解放します。指定したハンドルのコネクションが確立されている場合

は、そのコネクションは切断されます。

- 211 -

注意事項

・ データ操作ハンドルを割り当てることができる期間

データ操作ハンドルを割り当てることができるのは、コネクションの確立後からコネクションを切断するまでです。それ

以外のタイミングでデータ操作ハンドルを割り当てようとすると、SHUN_ERRORが返却されます。

・ データ操作ハンドルが解放されるタイミング

データ操作ハンドルを解放せずにコネクションを切断すると、そのコネクション内で割り当てたデータ操作ハンドルは

すべて解放されます。データ操作ハンドルで保持しているリソースをコネクションの切断後も利用する場合は、別の

領域にコピーしてください。

・ 通信異常が発生した場合のデータ操作ハンドルの状態

通信異常が発生し、コネクションの確立から再実行すると、そのコネクション内で割り当てたデータ操作ハンドルはす

べて解放されます。再度コネクションを確立したあとに、データ操作ハンドルを割り当ててください。

11.1.2 コネクションハンドル

コネクションハンドルは接続情報を保持します。コネクションハンドルを用いて、コネクションの確立または切断を行うこと

ができます。たとえば、コネクションを確立すると、接続先のホスト情報(ホスト名、ポート番号)を保持します。また、1つの

プロセスで複数のコネクションハンドルを作成することができるため、マルチスレッド環境下でも利用することができます。

コネクションハンドルを用いて、以下の操作を行うことができます。

表11.2 コネクションハンドルの一覧

関数名称 概要

ShunSetConnectAttr コネクション属性の設定

ShunGetConnectAttr コネクション属性の取得

ShunConnect コネクションの確立

ShunDisconnect コネクションの切断

ShunCommit トランザクションの終了

ShunRollback トランザクションのキャンセル

11.1.3 データ操作ハンドル

データ操作ハンドルを用いて、データの検索および更新を行うことができます。また、データ操作ハンドルは検索した結

果のデータを保持します。

データ操作ハンドルを用いて、以下の操作を行うことができます。

表11.3 データ操作ハンドルの一覧

関数名称 概要

ShunSetStatementAttr データ操作ハンドルの属性の設定

ShunGetStatementAttr データ操作ハンドルの属性の取得

ShunGetHitCount 検索式によるヒット件数の取得

ShunSearch 検索式によるデータの検索

ShunSearchRecId レコードIDによるXML文書の検索

- 212 -

関数名称 概要

ShunInsert XML文書の追加

ShunDeleteRecId レコードIDによるXML文書の削除

ShunUpdateRecId レコードIDによるXML文書の更新

ShunSearchKey ダイレクトアクセスキーによるXML文書の検索

ShunDeleteKey ダイレクトアクセスキーによるXML文書の削除

ShunUpdateKey ダイレクトアクセスキーによるXML文書の更新

11.1.4 共通関数

コネクションハンドルとデータ操作ハンドルとで、共通して用いることができる操作もあります。

共通関数を用いて、以下の操作を行うことができます。

表11.4 共通関数の一覧

関数名称 概要

ShunAllocHandle ハンドルの割当て

ShunFreeHandle ハンドルの解放

ShunGetErrorMessage

エラー情報の取得

11.2 C APIの使用方法

C APIの使用方法について説明します。

11.2.1 コネクションの確立

コネクションを確立するには、コネクションハンドルを割り当て、ShunConnect関数に接続先のホスト情報(ホスト名、ポート

番号)を指定して実行します。接続先のホスト情報は、指定したコネクションハンドルに保持されます。

接続先のホスト名とポート番号を指定するには以下の方法があります。

・ API用動作環境ファイルに指定する方法

・ ホスト名とポート番号を直接指定する方法

11.2.1.1 API用動作環境ファイルの設定によりコネクションを確立する方法

API用動作環境ファイルの設定により、コネクションを確立する方法について説明します。

記述例

SHUNHCON ConH;

/* コネクションハンドルの割当て */

ShunAllocHandle(NULL, &ConH);

- 213 -

/* ホスト名とポート番号をAPI用動作環境ファイルに指定してコネクションを確

立 */

ShunConnect(ConH, NULL, 0, NULL);

参照

API用動作環境ファイルの設定の詳細については、“2.4 動作環境ファイルの設定”または“付録A API用動作環境ファ

イルの実行パラメタ”を参照してください。

11.2.1.2 ホスト名とポート番号を直接指定する方法

ホスト名とポート番号を直接指定する方法について説明します。

記述例

ホスト名“DirSvr1”、ポート番号“23101”の場合

SHUNHCON ConH;

/* コネクションハンドルの割当て */

ShunAllocHandle(NULL, &ConH);

/* ホスト名・ポート番号を指定してコネクションを確立 */

ShunConnect(ConH, "DirSvr1", 23101, NULL);

11.2.2 データの検索

C APIでは、以下に示す操作ができます。

・ 検索条件に一致するXML文書の件数を取得する

・ 検索条件に一致するXML文書を指定した形式で取得する

・ 特定のXML文書をすべて取得する

・ 検索条件に一致するXML文書をソートして取得する

・ 検索条件に一致するXML文書を連続して取得する

・ 検索条件に一致するXML文書の値を集計して取得する

これらの操作を組み合わせることによって、さまざまなアプリケーションを作成することができます。

参考

ダイレクトアクセスキーを使ったデータ検索も可能です。

ダイレクトアクセスキー機能の詳細については、“第6章 ダイレクトアクセス機能”を参照してください。

データを検索するサンプルプログラムは、“J.1 データの検索”を参照してください。

以降に、データの検索を行うアプリケーションの作成方法について説明します。

- 214 -

11.2.2.1 条件に一致するXML文書の件数を取得する

条件に一致するデータを取り出す前に、件数のみ取得したい場合があります。

このような場合、ShunGetHitCount関数の引数に条件式を指定して、件数のみを取得します。

条件に一致するXML文書の件数を取得する場合の流れについて、以下の図に示します。

図11.4 条件に一致するXML文書の件数を取得する場合の流れ

記述例

SHUNHSTMT StmtH;

/* データ操作ハンドルの割当て */

ShunAllocHandle(ConH, &StmtH); (1)

/* 検索式を指定してヒット件数を取得 */

ShunGetHitCount(StmtH,

"/document/base/prefecture == '大阪'",

&Hit_Cnt); (2)

/* ヒット件数の取出し */

printf("ヒット件数 = %d\n", Hit_Cnt);

/* データ操作ハンドルの解放 */

ShunFreeHandle(StmtH); (3)

(1) データ操作ハンドルの割当て

事前にデータ操作ハンドルを割り当てます。データ操作ハンドルは、ShunAllocHandle関数に、親ハンドルとなるコネ

クションハンドルを指定して割り当てます。

(2) 検索の実行

ShunGetHitCount関数のパラメタに、データ操作ハンドル、検索式を指定して検索を実行します。ヒット件数のみを返

却します。

(3) データ操作ハンドルの解放

データの検索および結果の取出しが完了したら、ShunFreeHandle関数でデータ操作ハンドルを解放します。

- 215 -

11.2.2.2 件数に応じて検索した結果を取得する

Webアプリケーションでは、画面にすべての検索結果を表示するのではなく、任意の件数ごとにページ制御することが一

般的です。

このような場合、ShunSearch関数の引数に返信開始番号と返信要求件数を指定して、取得するデータの件数を制御し

ます。

件数に応じて検索した結果を取得する場合の流れについて、以下の図に示します。

図11.5 件数に応じて検索した結果を取得する場合の流れ

記述例

SHUNHSTMT StmtH;

/* データ操作ハンドルの割当て */

ShunAllocHandle(ConH, &StmtH); (1)

/* 検索を実行 */

ShunSearch(StmtH, 11, NULL, 0, 5,

"/document/base/prefecture == '大阪'",

"/document/base/name, /document/base/price",

NULL,

&Hit_Cnt, &Return_Cnt, &Returnable_Cnt,

- 216 -

&Rec_Id_Out, &Data,

&First_Pos, &Last_Pos); (2)

/* 検索した結果の取出し */

printf("ヒット件数 = %d\n", Hit_Cnt); (3)

if(Hit_Cnt > 0) {

for (i = 0; i < Return_Cnt; i++) {

printf("[結果]%d件目 = %s\n", i+1, Data[i].Data);

}

}

/* データ操作ハンドルの解放 */

ShunFreeHandle(StmtH); (4)

(1) データ操作ハンドルの割当て

事前にデータ操作ハンドルを割り当てます。データ操作ハンドルは、ShunAllocHandle関数に、親ハンドルとなるコネ

クションハンドルを指定して割り当てます。

(2) 検索の実行

ShunSearch関数のパラメタに、データ操作ハンドル、データの取得位置(取得開始位置または取得終了位置)、デー

タの 大件数、検索式およびリターン式を指定して検索を実行します。

ポイント

- ShunSearch関数では、検索条件に一致したXML文書のヒット件数も返却します。この値を利用して、検索結果の

ページ数などを求めることができます。

- 返信要求件数には、1画面に表示する件数を指定します。

(3) 検索した結果の取出し

ShunSearch関数では、検索した結果のアドレスを返却します。

検索した結果は、構造体の配列で構成されていますので、これをもとにデータを取り出します。

ポイント

ShunSearch関数では、検索結果とともにXML文書を一意に識別するレコードID(コンダクタ制御情報および返信レ

コード識別子)を返却します。レコードIDは、対応するXML文書の全体を取り出したり、削除、更新する場合に使用し

ます。

(4) データ操作ハンドルの解放

データの検索および結果の取出しが完了したら、ShunFreeHandle関数でデータ操作ハンドルを解放します。

11.2.2.3 条件を追加しながら検索した結果を取得する

検索した結果の件数が非常に多いとき、さらに条件を追加して件数を絞りたい場合があります。

- 217 -

このような場合、ShunSearch関数の引数に指定する検索式に条件を追加して新しい検索式を作成し、再度検索する処

理を行います。この操作を繰り返すことで、画面に表示された検索結果を参照しながら検索結果を絞り込むことができま

す。

条件を追加しながら検索した結果を取得する場合の流れについて、以下の図に示します。

図11.6 条件を追加しながら検索した結果を取得する場合の流れ

記述例

条件を追加しながら検索した結果を取得する場合の記述例については“11.2.2.2 件数に応じて検索した結果を取得す

る”を参照してください。

ポイント

ShunSearch関数では、検索結果とともにXML文書を一意に識別するレコードID(コンダクタ制御情報および返信レコー

ド識別子)を返却します。レコードIDは、対応するXML文書の全体を取り出したり、削除、更新する場合に利用します。

11.2.2.4 ヒット件数の上限値を設定する

ヒット件数の上限値を設定することで、ソートまたは集計の応答性能を安定させることができます。ヒット件数が上限値を

超えた場合には、ソートまたは集計を中断し検索条件に一致したヒット件数を通知します。

ヒット件数が上限値を超えないように検索式に条件を追加し、ソートまたは集計の検索範囲を絞り込みます。

- 218 -

ヒット件数の上限値を設定するには、ShunSetStatementAttr関数を使用します。

ヒット件数の上限値を設定する場合の流れについて、以下の図に示します。

図11.7 ヒット件数の上限値を設定する場合の流れ

記述例

SHUNHSTMT StmtH;

/* データ操作ハンドルの割当て */

ShunAllocHandle(ConH, &StmtH);

/* ヒット件数の上限値を設定 */

ShunSetStatementAttr(StmtH, SHUN_ATTR_HIT_COUNT_LIMIT,10000); (1)

/* ソート式を指定して検索を実行 */

ShunSearch(StmtH, 1, NULL, 0, 30,

"/document/base/prefecture == '大阪'",

"/document/base/name, /document/base/price",

"/document/base/price/text() DESC",

&Hit_Cnt, &Return_Cnt, &Returnable_Cnt,

&Rec_Id_Out, &Data,

&First_Pos, &Last_Pos);

/* ヒット件数が上限値を超えているかの確認 */

ShunGetStatementAttr(StmtH, SHUN_ATTR_HIT_COUNT_LIMIT_OVER,&Attr_Value); (2)

if(Attr_Value == SHUN_TRUE) {

- 219 -

printf("ヒット件数が上限値を超えました\n");

printf("ヒット件数 = %d\n", Hit_Cnt); (3)

}

else {

/* 検索した結果の取出し */

printf("ヒット件数 = %d\n", Hit_Cnt);

if(Hit_Cnt > 0) {

for (i = 0; i < Return_Cnt; i++) {

printf("[結果]%d件目 = %s\n", i+1, Data[i].Data);

}

}

}

/* データ操作ハンドルの解放 */

ShunFreeHandle(StmtH);

(1) ヒット件数の上限値設定

ShunSetStatementAttr関数のパラメタにヒット件数の上限値を設定します。

注意

ソート式が設定されていない場合には、ShunSearch関数実行時にエラーとなります。

(2) ヒット件数が上限値を超えているかの確認

ShunGetStatementAttr関数でヒット件数が上限値を超えているかの確認をします。

(3) ヒット件数の取出し

ヒット件数が上限値を超えている場合は、ヒット件数のみ取出し可能です。

11.2.2.5 レコードIDを利用してXML文書全体を取得する

XML文書の中から必要なXML文書を検索する場合、はじめからXML文書全体を取得するのではなく、XML文書を識

別するのに有効な部分情報を取得します。利用者は、これらの部分情報から、詳細情報を取得したいXML文書を特定

します。

XML文書の全体を取り出すには、部分情報を取り出したときに一緒に返却されるレコードID(コンダクタ制御情報および

返信レコード識別子)を利用します。ShunSearchRecId関数の引数にレコードIDを指定することで目的のXML文書の全

体を取り出すことができます。

レコードIDを利用してXML文書全体を取得する場合の流れについて、以下の図に示します。

レコードIDを利用してXML文書全体を取得する場合の流れ

- 220 -

記述例

SHUNHSTMT StmtH;

/* データ操作ハンドルの割当て */

ShunAllocHandle(ConH, &StmtH); (1)

/* レコードIDを指定して検索を実行 */

ShunSearchRecId(StmtH, 1, Rec_Id_In, &Rec_Id_Out, &Data); (2)

/* 検索した結果の取出し */

printf("[結果] = %s\n", Data[0].Data); (3)

/* データ操作ハンドルの解放 */

ShunFreeHandle(StmtH); (4)

(1) データ操作ハンドルの割当て

事前にデータ操作ハンドルを割り当てます。データ操作ハンドルは、ShunAllocHandle関数に、親ハンドルとなるコネ

クションハンドルを指定して割り当てます。

(2) 検索の実行

ShunSearchRecId関数のパラメタに、データ操作ハンドル、依頼レコード数、依頼レコードIDの配列を指定して検索を

実行します。

- 221 -

ポイント

ShunSearchRecId関数では、複数のレコードIDを指定することで、一度に複数のXML文書を取得することもできます。

(3) 検索結果の取出し

ShunSearchRecId関数では、検索した結果のアドレスを返却します。

検索した結果は、構造体の配列で構成されていますので、これをもとにデータを取り出します。また、XML文書が存

在しない場合、以下のように結果が返却されます。

- 指定したレコードIDに対応するデータがすべてが存在しない場合

Rec_Id_Out指定した領域がNULLに設定されます。

- 指定したレコードIDに対応するデータの一部が存在しない場合

取り出したレコードIDに対応するデータのデータサイズ(Data[x].Data_Len)に0が設定され、データへのアドレス

(Data[x].Data)にはNULLが設定されます。

(4) データ操作ハンドルの解放

データの検索および結果の取出しが完了したら、ShunFreeHandle関数でデータ操作ハンドルを解放します。

11.2.2.6 データをソートして取得する

検索した結果をある特定の要素をキーとしてソートして取得したい場合があります。

データの部分情報をソートして取得するには、ShunSearch関数にソート式を指定して実行します。

データをソートして取得する場合の流れについて、以下の図に示します。

- 222 -

図11.8 データをソートして取得する場合の流れ

記述例

SHUNHSTMT StmtH;

/* データ操作ハンドルの割当て */

ShunAllocHandle(ConH, &StmtH); (1)

/* ソート式を指定して検索を実行 */

ShunSearch(StmtH, 1, NULL, 0, 30,

"/document/base/prefecture == '大阪'",

"/document/base/name, /document/base/price",

"/document/base/price/text() DESC",

&Hit_Cnt, &Return_Cnt, &Returnable_Cnt,

&Rec_Id_Out, &Data,

&First_Pos, &Last_Pos); (2)

/* 検索した結果の取出し */

printf("ヒット件数 = %d\n", Hit_Cnt); (3)

if(Hit_Cnt > 0) {

for (i = 0; i < Return_Cnt; i++) {

printf("[結果]%d件目 = %s\n", i+1, Data[i].Data);

}

}

/* データ操作ハンドルの解放 */

ShunFreeHandle(StmtH); (4)

- 223 -

(1) データ操作ハンドルの割当て

事前にデータ操作ハンドルを割り当てます。データ操作ハンドルは、ShunAllocHandle関数に、親ハンドルとなるコネ

クションハンドルを指定して割り当てます。

(2) 検索の実行

ShunSearch関数のパラメタに、データ操作ハンドル、データの取得位置(取得開始位置または取得終了位置)、デー

タの 大件数、検索式およびリターン式を指定して検索を実行します。

ポイント

ShunSearch関数にソート式を指定した場合、検索条件に一致したすべてのXML文書を参照してソート処理を行いま

す。検索式には、結果件数が適正な値となるような条件を指定し、ソート対象のデータを絞ることが応答性能をよくす

るポイントです。ソートを実施する前に検索条件に一致したXML文書の件数を調べるには、ShunGetHitCount関数を

利用します。

注意

ソート式に指定したキーの長さによって返却できる件数が決まります。 大件数は1000件です。データの取得位置や

データの 大件数に返却可能な 大件数を超える値を指定しても、それ以上のデータは返却することができませ

ん。

返却可能なデータの 大件数は、ShunSearch関数の出力パラメタに返却されます。キーの長さと返却可能なデータ

件数の目安については、“付録C 定量値”を参照してください。

参考

データの取得位置を指定することにより、続きのデータを取り出すことができます。これにより1000件以上のデータを

取り出すことができます。詳細については、“11.2.2.7 条件に一致するXML文書を連続して取得する”を参照してくだ

さい。

(3) 検索した結果の取出し

ShunSearch関数では、検索した結果のアドレスを返却します。

検索した結果は、構造体の配列で構成されていますので、これをもとにデータを取り出します。

ポイント

ShunSearch関数では、検索結果とともにXML文書を一意に識別するレコードID(コンダクタ制御情報および返信レ

コード識別子)を返却します。レコードIDは、対応するXML文書の全体を取り出したり、削除、更新する場合に利用し

ます。

(4) データ操作ハンドルの解放

データの検索および結果の取出しが完了したら、ShunFreeHandle関数でデータ操作ハンドルを解放します。

11.2.2.7 条件に一致するXML文書を連続して取得する

Webアプリケーションでは、検索した結果を一定件数ごとに区切って、前後に連続したデータを取得したい場合がありま

す。

- 224 -

XML文書を連続して取得するには、ShunSearch関数を利用します。ShunSearch関数の引数である取得開始位置、また

は、取得終了位置に、その直前の検索処理によって取得した 終位置情報、または、先頭位置情報を指定します。

条件に一致するXML文書を連続して取得する場合の流れについて、以下の図に示します。

図11.9 条件に一致するXML文書を連続して取得する場合の流れ

記述例

SHUNHSTMT StmtH;

SHUNPOS *First_Pos, *Last_Pos;

int iDirection, Direction;

SHUNPOS *sFirst_Pos, *sLast_Pos, Reply_Pos;

/* データ操作ハンドルの割当て */ (1)

ShunAllocHandle(ConH, &StmtH);

// どのページを表示するかによってShunSearchの第3パラメタと第4パラメタの設定を変更

// 次のページを表示する場合は iDirectionがNEXT、前のページを表示する場合は iDirectionがPREV

とする

if(iDirection == NEXT) {

// 次のページを表示する場合 (3)

Reply_Pos = sLast_Pos;

Direction = SHUN_DIRECTION_FORWARD_EXCLUSIVE;

- 225 -

}else if(iDirection == PREV) {

// 前のページを表示する場合 (4)

Reply_Pos = sFirst_Pos;

Direction = SHUN_DIRECTION_BACKWARD_EXCLUSIVE;

}else{

// 初のページを表示する場合 (2)

Reply_Pos = NULL;

Direction = 0;

}

/* 検索の実行 */ (5)

ShunSearch(StmtH, 1, Reply_Pos, Direction, 30,

Search_Exp, Return_Exp, Sort_Exp,

&Hit_Cnt, &Return_Cnt, &Returnable_Cnt,

&Rec_Id_Out,

&Data, &First_Pos, &Last_Pos);

/* 検索した結果の取出し */ (6)

printf("ヒット件数 = %d\n", Hit_Cnt);

if(Hit_Cnt != 0) {

for (i = 0; i < Return_Cnt; i++) {

printf("[結果] %s\n", Data[i].Data);

}

}

/* 先頭位置情報と 終位置情報を格納 */ (7)

sLast_Pos = Last_Pos;

sFirst_Pos = First_Pos;

/* データ操作ハンドルの解放 */ (8)

ShunFreeHandle(StmtH);

(1) データ操作ハンドルの割当て

事前にデータ操作ハンドルを割り当てます。データ操作ハンドルは、ShunAllocHandle関数に、親ハンドルとなるコネ

クションハンドルを指定して割り当てます。

(2) 初のページを表示する場合

初のページを表示する検索処理では、 初のデータから取出しを行うため、データの取得位置(取得開始位置ま

たは取得終了位置)にはNULLを指定します。取得位置にNULLを指定すると、返信開始番号に指定した位置から

データを取り出します。

(3) 次のページを表示する場合

次のページを表示する検索処理では、前回の検索時に取得した 終位置情報を取得開始位置に指定します。この

指定により前回取得したデータの次のページのデータを取得します。

(4) 前のページを表示する場合

前のページを表示する検索処理では、前回の検索時に取得した先頭位置情報を取得終了位置に指定します。この

指定により前回取得したデータの前の部分のデータを取得します。

- 226 -

(5) 検索の実行

ShunSearch関数のパラメタに、データ操作ハンドル、データの取得位置(取得開始位置または取得終了位置)、デー

タの 大件数、検索式、リターン式、先頭位置情報および 終位置情報を受け取るための領域を指定して検索を実

行します。

ポイント

先頭位置情報または 終位置情報を受け取るための領域には、取得開始位置または取得終了位置に指定した領

域と同じ領域を指定することができます。そのときには、古い位置情報は取得開始位置を特定するために使用された

あと破棄され、今回の検索で新たな位置情報が設定されます。

(6) 検索した結果の取出し

ShunSearch関数では、検索した結果のアドレスを返却します。検索した結果は、構造体の配列で構成されています

ので、これをもとにデータを取り出します。

(7) 先頭位置情報と 終位置情報を格納

先頭位置情報と 終位置情報を格納します。

(8) データ操作ハンドルの解放

データの検索および結果の取出しが完了したら、ShunFreeHandle関数でデータ操作ハンドルを解放します。

11.2.2.8 条件に一致するデータの内容を集計する

検索した結果をある特定の要素の値で集計して取得したい場合があります。

データの内容を集計するには、ShunSearch関数を利用します。ShunSearch関数の引数であるリターン式に集合関数指

定を指定すると、検索した結果が集計されて返却されます。集計処理では、合計値、平均値、 大値、 小値または件

数を求めることができます。

条件に一致するデータの内容を集計する場合の流れについて、以下の図に示します。

図11.10 条件に一致するデータの内容を集計する場合の流れ

- 227 -

記述例

SHUNHSTMT StmtH;

/* データ操作ハンドルの割当て */

ShunAllocHandle(ConH, &StmtH); (1)

/* 集計を実行 */

ShunSearch(StmtH, 1, NULL, 0, 30,

"/document/base/prefecture == '大阪'",

"max(/document/base/price/text())",

"/document/base/prefecture/text()",

&Hit_Cnt, &Return_Cnt, &Returnable_Cnt,

&Rec_Id_Out, &Data,

&First_Pos, &Last_Pos); (2)

/* 集計した結果の取出し */

printf("ヒット件数 = %d\n", Hit_Cnt); (3)

if(Hit_Cnt > 0) {

for (i = 0; i < Return_Cnt; i++) {

printf("[結果]%d件目 = %s\n", i+1, Data[i].Data);

}

}

/* データ操作ハンドルの解放 */

ShunFreeHandle(StmtH); (4)

(1) データ操作ハンドルの割当て

事前にデータ操作ハンドルを割り当てます。データ操作ハンドルは、ShunAllocHandle関数に、親ハンドルとなるコネ

クションハンドルを指定して割り当てます。

(2) 集計の実行

ShunSearch関数のパラメタに、データ操作ハンドル、データの取得位置(取得開始位置または取得終了位置)、デー

タの 大件数、検索式およびリターン式を指定して検索を実行します。リターン式には集合関数指定を指定します。

注意

ソート式に指定したキーの長さによって返却できるグループの数が決まります。 大グループ数は1000グループで

す。データの取得位置やデータの 大件数に返却可能な 大グループ数を超える値を指定しても、それ以上のデー

タは返却することができません。

返却可能なデータの 大件数は、ShunSearch関数の出力パラメタに返却されます。キーの長さと返却可能なグルー

プ件数の目安については、“付録C 定量値”を参照してください。

参考

データの取得位置を指定することにより、続きのデータを取り出すことができます。これにより1000グループ以上の

データを取り出すことができます。詳細については、“11.2.2.7 条件に一致するXML文書を連続して取得する”を参

照してください。

(3) 集計した結果の取出し

ShunSearch関数では、集計した結果のアドレスを返却します。

- 228 -

集計した結果は、構造体の配列で構成されていますので、これをもとにデータを取り出します。

(4) データ操作ハンドルの解放

データの検索および結果の取出しが完了したら、ShunFreeHandle関数でデータ操作ハンドルを解放します。

11.2.3 データの更新

C APIでは、以下に示すデータの更新ができます。

・ XML文書の追加

・ レコードIDによるXML文書の削除

・ レコードIDによるXML文書の更新

参考

ダイレクトアクセスキーを使ったデータ更新も可能です。

ダイレクトアクセスキー機能の詳細については、“第6章 ダイレクトアクセス機能”を参照してください。

データを更新するサンプルプログラムは、“J.2 データの更新”を参照してください。

以降に、データの更新を行うアプリケーションの作成方法について説明します。

11.2.3.1 データを追加する

データを追加するには、ShunInsert関数を利用します。

データを追加する場合の流れについて、以下の図に示します。

図11.11 データを追加する場合の流れ

記述例

SHUNHSTMT StmtH;

/* データ操作ハンドルの割当て */

ShunAllocHandle(ConH, &StmtH); (1)

/* XML文書の追加 */

- 229 -

SHUNDATA Data[1];

Data[0].Data =

"<document>"

" <base>"

:

" </base>"

" <information>"

:

" </information>"

"</document>";

Data[0].Data_Len = strlen( Data[0].Data );

ShunInsert(StmtH, 1, Data); (2)

/* データ操作ハンドル解放 */

ShunFreeHandle(StmtH); (3)

(1) データ操作ハンドルの割当て

事前にデータ操作ハンドルを割り当てします。データ操作ハンドルは、ShunAllocHandle関数に、親ハンドルとなるコ

ネクションハンドルを指定して割り当てます。

(2) XML文書の追加

ShunInsert関数に、データ操作ハンドル、追加するデータ件数、追加するXML文書を指定し、追加します。

ポイント

ShunInsert関数では、一度に複数のXML文書を追加することができます。次のいずれの形式も指定できます。

- 1つの追加データ領域に複数のXML形式の文書を連続して記述する。

- 複数の追加データ領域を指定する。

(3) データ操作ハンドルの解放

データの追加が完了したら、ShunFreeHandle関数でデータ操作ハンドルを解放します。

11.2.3.2 レコードIDを指定してデータを削除する

データを削除するには、ShunDeleteRecId関数を利用します。

ShunDeleteRecId関数では、レコードID(コンダクタ制御情報および返信レコード識別子)を利用してデータを削除します。

ShunDeleteRecId関数を実行する前に、ShunSearch関数を利用して、削除したいデータのレコードIDを取得しておく必要

があります。

レコードIDを指定してデータを削除する場合の流れについて、以下の図に示します。

- 230 -

図11.12 レコードIDを指定してデータを削除する場合の流れ

記述例

SHUNHSTMT StmtH;

/* データ操作ハンドルの作成 */

ShunAllocHandle(ConH, &StmtH); (1)

/* レコードIDによる削除を実行 */

ShunDeleteRecId(StmtH, 1, Rec_Id_In); (2)

/* データ操作ハンドルの解放 */

ShunFreeHandle(StmtH); (3)

(1) データ操作ハンドルの割当て

事前にデータ操作ハンドルを割り当てます。データ操作ハンドルは、ShunAllocHandle関数に、親ハンドルとなるコネ

クションハンドルを指定して割り当てます。

(2) XML文書の削除

ShunDeleteRecId関数に、データ操作ハンドル、削除するデータ件数、削除するレコードIDを指定し、削除を実行し

ます。

- 231 -

ポイント

ShunDeleteRecId関数では、複数のレコードIDを指定することで、一度に複数のXML文書を削除することができま

す。

(3) データ操作ハンドルの解放

データの削除が完了したら、ShunFreeHandle関数でデータ操作ハンドルを解放します。

11.2.3.3 レコードIDを指定してデータを更新する

XML文書を更新するには、ShunUpdateRecId関数を利用します。

ShunUpdateRecId関数では、レコードID(コンダクタ制御情報および返信レコード識別子)を利用してデータを更新しま

す。ShunUpdateRecId関数を実行する前に、ShunSearch関数を利用して、更新したいデータのレコードIDを取得してお

く必要があります。レコードIDによるXML文書の更新とは、新しいXML文書で既存のXMLを置換することを指します。既

存のXML文書中のデータを部分的に更新することはできません。

データを更新する場合の流れについて、以下の図に示します。

図11.13 データを更新する場合の流れ

- 232 -

記述例

SHUNHSTMT StmtH;

/* データ操作ハンドルの作成 */

ShunAllocHandle(ConH, &StmtH); (1)

/* レコードIDによる更新を実行 */

ShunUpdateRecId(StmtH, 1, Rec_Id_In, Data); (2)

/* データ操作ハンドルの解放 */

ShunFreeHandle(StmtH); (3)

(1) データ操作ハンドルの割当て

事前にデータ操作ハンドルを割り当てます。データ操作ハンドルは、ShunAllocHandle関数に、親ハンドルとなるコネ

クションハンドルを指定して割り当てます。

(2) XML文書の更新

ShunUpdateRecId関数に、データ操作ハンドル、更新するデータ件数、更新するレコードID、更新するデータを指定

し、更新を実行します。

ポイント

ShunUpdateRecId関数では、複数のレコードID、対応するデータを指定することで、一度に複数のXML文書を更新

することができます。

(3) データ操作ハンドルの解放

データの更新が完了したら、ShunFreeHandle関数でデータ操作ハンドルを解放します。

11.2.4 コネクションの切断

データの検索またはデータの更新が終わったら、コネクションの切断を行います。コネクションを切断するには、

ShunDisconnect関数を実行後、コネクションハンドルを解放します。

記述例

/* コネクション切断 */

ShunDisconnect(ConH);

/* コネクションハンドルの解放 */

ShunFreeHandle(ConH);

11.2.5 エラー発生時の対処

C APIの操作中に警告やエラーが発生した場合、各関数の実行時に、正常終了以外の値を返却します。正常終了以外

の値が返却された場合は、ShunGetErrorMessage関数を利用して、以下の情報を取得できます。

- 233 -

・ エラーレベル

・ エラーメッセージ

記述例

if(ret != SHUN_SUCCESS) {

/* エラー情報の取得 */

ShunGetErrorMessage(StmtH, &Err_Level, &Err_Msg); (1) (2)

switch ( Err_Level ) {

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", Err_Msg);

}

エラー情報の取得

各関数を実行した際の復帰値を判定し、エラーの場合はエラー情報を取得します。

(1) エラーレベル

エラーレベルを調べることで、ユーザはエラー発生後のアプリケーションの状態を知ることができます。

エラーレベルとして、以下の4つを返却します。

定数名 意味

SHUN_INFORMATION 正常終了したことを意味します。

SHUN_ERROR_DATA パラメタ間違いなど、警告レベルのエラーが発生し

たことを意味します。エラーの発生箇所から再実行

してください。

SHUN_ERROR_TRANSACTION エラーの発生により、トランザクションがキャンセルさ

れた状態です。トランザクションの開始点から再実

行してください。

SHUN_ERROR_CONNECTION エラーの発生により、コネクションが強制切断された

状態です。エラーが発生したコネクションハンドルを

破棄し、作成し直してから、コネクションの接続から

再実行してください。

(2) エラーメッセージ

エラーメッセージの詳細は、“メッセージ集”の“API実行時に出力されるメッセージ”を参照してください。

11.2.5.1 エラー発生時の対処例

エラー発生時の対処例について説明します。

- 234 -

処理の流れ

エラー発生時は、取得したエラーレベルによって再実行する箇所を切り分けます。エラーレベルによる再実行処理の切

分けについて、以下の図に示します。

図11.14 エラー発生時の対処

(1) パラメタ間違いなどのエラーが発生した場合

SHUN_ERROR_DATAが返却されます。この場合、パラメタなどを修正後、失敗した処理を再実行します。

(2) トランザクションがキャンセルされた場合

SHUN_ERROR_TRANSACTION(注1)が返却されます。この場合、トランザクションを開始した位置(注2)から再実行

します。

注1) 自動コミットを無効にした場合のみ、返却するエラーレベルです。自動コミットが有効の場合は、本エラーレベル

は返却しません。

注2) APIからは、明示的にトランザクションを開始することはできません。自動コミットを無効にした後、データに対す

る初回の更新操作によって自動的に開始されます。

(3) Shunsakuとの接続が強制切断された場合

SHUN_ERROR_CONNECTIONが返却されます。この場合、エラーが発生したコネクションハンドルを解放し、再度

コネクションハンドルを割り当て、コネクションの確立を再実行します。

注意事項

コネクションの確立時に(マシン未起動やconductor未起動による)通信エラーが発生した場合はSHUN_ERROR_DATAが返却されます。この場合は、SHUN_ERROR_CONNECTIONが返却された場合と同様に、コネクションの確立から再

実行してください。

- 235 -

11.3 アプリケーションのデバッグ

アプリケーションのデバッグの詳細については、“第8章 アプリケーションのデバッグ”を参照してください。

11.4 C APIで使用する文字コード

C APIの検索式、リターン式およびソート式で使用する文字コードは、Shunsakuに格納されているXML文書の文字コー

ドと同じ文字コードを使用してください。

- 236 -

第3部 その他のアプリケーション開発第3部では、ShunsakuのAPIを使用したアプリケーション開発の拡張的な利用方法について説明します。

第12章 XML変換機能...............................................................................................................238

- 237 -

第12章 XML変換機能

本章では、データのXML変換機能について説明します。

12.1 XML変換機能の概要

XML変換機能は、データベースまたはCSVファイルに格納されているデータをXML文書に変換する機能です。

データ変換時には、入力データと出力されるXML文書の対応を定義したマッピングルールを使用します。マッピングルー

ルについては、“付録L XML変換機能のマッピングルール”を参照してください。

XML変換機能はJavaのAPIを提供しています。アプリケーションからこのAPIを呼び出して利用します。

XML変換機能の構成の概念図を、以下に示します。

図12.1 XML変換機能の構成の概念図

12.1.1 データベースからXML文書への変換

XML変換機能は、データベースより返却される結果を、指定されたマッピングルールに基づき、XML文書に変換しま

す。

データベースより返却される結果は、ResultSetオブジェクトとして得ることができます。ResultSetオブジェクトは、データ

ベースのスキーマや検索方法にかかわらず、行と列からなる単一の2次元の表形式です。この2次元の表を“結果表”と

呼びます。

XML変換機能では、このResultSetオブジェクトを、指定された変換ルールに従ってXML文書に変換します。

変換ルールはXML形式によるマッピングルールとしてユーザが作成するものであり、マッピングルールファイルとしてあ

らかじめ用意しておく必要があります。

マッピングルール内には、結果表のどの列がXML文書のどの要素または属性に対応するのかを示す変換ルールを記

述します。

マッピングルールの詳細については、“付録L XML変換機能のマッピングルール”を参照してください。

- 238 -

図12.2 マッピングルール

12.1.2 CSVファイルからXML文書への変換

XML変換機能は、CSVファイル内に指定されたデータより返却される結果を、指定されたマッピングルールに基づき、XML文書に変換します。

また、XML変換機能は、CSVファイルで使用される代表的な区切り文字、引用符文字およびnull文字に対応していま

す。

CSVファイル内に指定されたデータより返却される結果は、ResultSetオブジェクトとして得ることができます。ResultSetオブジェクトは、行と列からなる単一の2次元の表形式です。この2次元の表を“結果表”と呼びます。

12.2 XML変換機能の設計

XML変換機能を使用する場合、以下の内容を決定してください。

・ 入力データソースの決定

・ XML文書構造の決定

・ XML文書の出力形式を決定

12.2.1 入力データソースの決定

入力データソースとして、データベースまたはCSVファイルのどちらか一方を選択します。

- 239 -

12.2.2 XML文書構造の決定

テキストファイルに出力するXML文書の構造を決定します。

以下の内容を決定してください。

・ XML文書の数

・ XML宣言の出力の有無

・ XML文書の階層関係

・ 結果表の列とXML文書との対応関係

・ XML文書の要素

・ XML文書の属性

参考

・ XML文書の階層構造

XML文書は、1つのルート要素を持ち、その配下に子要素や要素データが存在する構造を持ちます。それぞれの

要素はすべて関係を持っており、親子関係または兄弟関係などで表現することができます。

階層構造にて、上位に位置するタグは“親”であり、下位に位置するタグは“子”となります。共通の親を持つ同位置

の要素は“兄弟”となります。

XML文書の例を階層構造で表すと、以下の図のように表現することができます。

図12.3 XML文書の階層構造

- 240 -

・ 親子要素の対応付け

マッピングルールでは、出力されるXML文書の中で、要素データを持つ要素を“カラム要素”、他の要素を持つ要素

を“ペアレント要素”と呼びます。

以下の図では、ペアレント要素は“PERSON”、“DETAIL”の2つです。カラム要素は、“PERSON”、“DETAIL”要素

配下の“NUM”、“NAME”、“JOB”、“LOCNUM”、“LOC”の5つになります。

図12.4 親子要素の対応付け

- 241 -

12.2.3 XML文書の出力形式を決定

アプリケーションがXML変換機能から受け取る出力形式を決定します。

出力形式は、以下から選択します。

・ String

・ Stream

・ ファイル

・ DOMツリー

・ SAX

注意

Shunsakuの検索用データを作成するには、データをファイルで用意します。

12.3 XML変換機能のAPIのセットアップ

XML変換機能のAPIのセットアップについて説明します。

- 242 -

12.3.1 APIの構成

XML変換機能のAPIの構成について説明します。

ShunsakuのAPIをインストールすると、以下のAPIが作成されます。

・ XML変換機能のAPIパッケージ

・ XMLプロセッサ

注意

XML変換機能のAPIを使用したアプリケーションを使用する場合、上記のAPIパッケージ以外に、使用するデータベー

スに対応するJDBCドライバが必要です。使用するデータベースのJDBCドライバを用意してください。

XML変換機能のAPIパッケージ

ShunsakuのAPIをインストールすると、XML変換機能のためのAPIパッケージとして、以下のようなjar形式のファイルが作

成されます。

Shunsakuのインストール先のフォルダ\Shunsaku\lib\xmlconv.jar

/opt/FJSVshnsk/lib/xmlconv.jar

XMLプロセッサ

ShunsakuのAPIをインストールすると、JAXP(Java API for XML Processing)対応のXMLプロセッサとして、以下のような2つのjar形式のファイルが作成されます。

Shunsakuのインストール先のフォルダ\Shunsaku\lib\xml-apis.jarShunsakuのインストール先のフォルダ\Shunsaku\lib\xercesImpl.jar

/opt/FJSVshnsk/lib/xml-apis.jar/opt/FJSVshnsk/lib/xercesImpl.jar

12.3.2 環境変数の設定

XML変換機能のAPIを使用するのに必要な環境変数を設定します。

・ 環境変数CLASSPATHに以下のjarファイルを追加します。

- xmlconv.jar

- xml-apis.jar

- xercesImpl.jar

- JDBCドライバのjarファイル

なお、 “ xercesImpl.jar ”以外の XML プロセッサが CLASSPATH に設定されている場合、 “ xercesImpl.jar ”は、“xercesImpl.jar”以外のXMLプロセッサより前に設定してください。

- 243 -

以下に環境変数の設定例を示します。

この例では、JDBCドライバとして、Oracle 8i/9i JDBCドライバJDK1.3用(classes12.zip)を使用しています。

ShunsakuのAPIを“C:\InterstageShunsaku”にインストールする場合

SET CLASSPATH=C:\\InterstageShunsaku\lib\classes12.zip;%CLASSPATH%

SET CLASSPATH=C:\InterstageShunsaku\lib\xercesImpl.jar;%CLASSPATH%

SET CLASSPATH=C:\InterstageShunsaku\lib\xml-apis.jar;%CLASSPATH%

SET CLASSPATH=C:\InterstageShunsaku\lib\xmlconv.jar;%CLASSPATH%

例1

bash、BシェルまたはKシェルの場合

CLASSPATH=/opt/FJSVshnsk/lib/classes12.zip:$CLASSPATH

CLASSPATH=/opt/FJSVshnsk/lib/xercesImpl.jar:$CLASSPATH

CLASSPATH=/opt/FJSVshnsk/lib/xml-apis.jar:$CLASSPATH

CLASSPATH=/opt/FJSVshnsk/lib/xmlconv.jar:$CLASSPATH

export CLASSPATH

例2

Cシェルの場合

setenv CLASSPATH /opt/FJSVshnsk/lib/classes12.zip:${CLASSPATH}

setenv CLASSPATH /opt/FJSVshnsk/lib/xercesImpl.jar:${CLASSPATH}

setenv CLASSPATH /opt/FJSVshnsk/lib/xml-apis.jar:${CLASSPATH}

setenv CLASSPATH /opt/FJSVshnsk/lib/xmlconv.jar:${CLASSPATH}

12.4 マッピングルールファイルの作成

マッピングルールファイルを作成します。

マッピングルールファイルの定義方法については、“付録L XML変換機能のマッピングルール”を参照してください。

12.5 アプリケーションの設計

XML変換機能の入出力のオブジェクトを以下に示します。

- 244 -

図12.5 XML変換機能の入出力のオブジェクト

ResultSetオブジェクトは、java.sql.ResultSetインタフェース実装クラスのインスタンスです。その他のオブジェクトは、XML変換機能が提供するクラスのインスタンスです。

変換の元となる結果表は、ResultSetオブジェクトです。

XMLGeneratorオブジェクトは、GeneratorMapオブジェクトとResultSetオブジェクトを入力として、複数のXML文書の集合

であるDocumentFountainオブジェクトを生成します。ユーザはDocumentFountainオブジェクトから、目的のXML文書を取

り出します。

また、CSVファイルからResultSetオブジェクトを作成する場合、アプリケーションを作成する必要があります。

CSVファイルからResultSetオブジェクト作成時の入出力のオブジェクトを以下に示します。

図12.6 CSVファイルからResultSetオブジェクト作成時の入出力のオブジェクト

CSVResultSetオブジェクトは、java.sql.ResultSetインタフェースを実装したものであり、XMLGeneratorへの入力とすること

ができます。

XMLGeneratorは、マッピングルールの指定によって多様な形式でXML文書を取り出すことができます。また、完全なXML文書ではなく、その一部分として取り出したり、1つの結果表から複数のXML文書に分割することも可能です。

以下の出力形式でXML文書を取り出すことができます。

・ String

・ Stream

・ ファイル

・ DOMツリー

・ SAX

- 245 -

注意

Shunsakuの検索用データを作成するには、データをファイルで用意します。

12.5.1 API一覧

XML変換機能は、Java言語で作成されたAPIを提供します。

参照

APIの詳細については、“付録K XML変換機能のAPI”を参照してください。

12.5.2 XML変換機能を用いたアプリケーションの処理手順

XML変換機能を用いたアプリケーションは、以下の流れで処理を行います。

各クラスおよびメソッドの詳細については、“付録K XML変換機能のAPI”を参照してください。

注意

変換データ量が多い場合には、Java実行環境のヒープ領域が不足する場合があります。その場合には、Java実行環境

のヒープサイズを大きくすることで回避できます。

Java実行環境のヒープサイズは、Javaコマンドのオプションで指定することにより変更できます。

Javaコマンドの実行例を以下に示します。

Javaアプリケーション(AppClass)のJavaヒープサイズの 大サイズを256MBに設定する場合

Java -Xmx256m AppClass

12.5.2.1 データベースからXML文書に変換する場合の処理手順

データベースからXML文書に変換する場合の処理手順を、以下に示します。

- 246 -

1. データベースへの接続

データベースへの接続要求を行い、接続を確立します。

2. ResultSetオブジェクトの作成

SQLによりデータベース検索を行い、ResultSetオブジェクトを取得します。

注意

XML変換機能は、スクロール可能なResultSetオブジェクトを対象としています。

JDBCで、Statementオブジェクトを作成する場合、ResultSetクラスの定数にTYPE_FORWORD_ONLYを指定する

と、XML変換機能はResultSetにデータがない旨のエラーを出力します。

この場合、TYPE_SCROLL_SENSITIVEまたはTYPE_SCROLL_INSENSITIVEを指定してください。

3. GeneratorMapオブジェクトの作成

マッピングルールファイルを指定し、GeneratorMapオブジェクトを作成します。

4. XMLGeneratorオブジェクトの作成

XMLGeneratorオブジェクトを作成します。

5. DocumentFountainオブジェクトの作成

XMLGeneratorオブジェクトの文書生成メソッドcreateDocumentFountain()を呼び出します。その際、引数として、

ResultSetオブジェクトおよびGeneratorMapオブジェクトのほかに、出力形式および出力形式に応じた必要な情報

を指定します。その結果、DocumentFountainオブジェクトが生成され、アプリケーションに返却されます。

なお、DocumentFountainオブジェクトから取り出すXML文書の出力形式は、この時点で決定されます。

6. 出力時の文字コードの設定

アプリケーションから、DocumentFountainオブジェクトの文字コードの設定メソッドsetEncoding()を呼び出し、生成

されるXML文書の文字コードを指定します。

文字コードを指定しない場合は、“UTF-8”が指定されたとみなします。

- 247 -

7. XML文書の出力

DocumentFountainオブジェクトの文書取出しメソッドgetXMLDocument()を呼び出し、以下のいずれかの形式でXML文書を受け取ります。

- String

- Stream

- ファイル

- DOMツリー

- SAX

なお、1つのResultSetオブジェクトから複数のXML文書を生成する場合は、文書取出しメソッドgetXMLDocument()を複

数回呼び出すことで、順にXML文書が生成され、アプリケーションに返却されます。

12.5.2.2 CSVファイルからXML文書に変換する場合の処理手順

CSVファイルからXML文書に変換する場合の処理手順を、以下に示します。

1. CSVSourceオブジェクトの作成

指定されたCSVファイル名から、CSVSourceオブジェクトを作成します。

2. CSVファイル情報の設定

作成したCSVSourceオブジェクトに対して、以下の設定を行います。

a. 文字コードの設定

設定内容に基づいてCSVファイルを読み込み、読み込まれたCSVファイルの内容をString型に変換しま

- 248 -

す。

文字コードを指定しない場合は、システムのデフォルトエンコーディングが指定されたとみなします。

b. 区切り文字の設定

CSVファイル内で使用される区切り文字を設定します。

カンマ(,)、タブ(\t)、空白( )を指定可能です。

デフォルトは、カンマ(,)です。

c. 引用符文字の設定

CSVファイル内で使用される引用符文字を設定します。

単一引用符(\’)、二重引用符(\”)を指定可能です。

デフォルトは、引用符文字は設定されません。

d. 区切り文字、引用符文字、「\」のデータ記述方法の設定

区切り文字、引用符文字、「\」をデータとして記述する方法を設定します。

デフォルトは、各文字の前に「\」を付加する方法です。

e. null表現の文字を設定

CSVファイル内で使用されるnull値を表現する文字を設定します。

空白文字以外の表示可能な文字列を指定可能です。

デフォルトは、空文字("")です。

f. 列名の設定

CSVファイル内の1行目を列名とするか否かを設定します。

デフォルトは、「列名としない」です。

g. データ保持方法の設定

CSVResultSet内でのデータ保持方法を設定します。

保持方法は以下の2種類のいずれかから選択します。

- シーケンシャルに読み込む

メモリ消費が少ないが、処理性能が悪い場合があります。

- メモリ上に展開する

処理性能が良いが、メモリを多く消費する場合があります。

デフォルトは、「シーケンシャルに読み込む」です。

3. CSVResultSetオブジェクトの作成

作成したCSVSourceオブジェクトから、CSVResultSetを取得します。

4. GeneratorMapオブジェクトの作成

マッピングルールファイルを指定し、GeneratorMapオブジェクトを作成します。

5. XMLGeneratorオブジェクトの作成

XMLGeneratorオブジェクトを作成します。

6. DocumentFountainオブジェクトの作成

XMLGeneratorオブジェクトの文書生成メソッドcreateDocumentFountain()を呼び出します。その際、引数として、

- 249 -

ResultSetオブジェクトおよびGeneratorMapオブジェクトのほかに、出力形式および出力形式に応じた必要な情報

を指定します。その結果、DocumentFountainオブジェクトが生成され、アプリケーションに返却されます。

なお、DocumentFountainオブジェクトから取り出すXML文書の出力形式は、この時点で決定されます。

7. 出力時の文字コードの設定

アプリケーションから、DocumentFountainオブジェクトの文字コードの設定メソッドsetEncoding()を呼び出し、生成

されるXML文書の文字コードを指定します。

文字コードを指定しない場合は、“UTF-8”が指定されたとみなします。

8. XML文書の出力

DocumentFountainオブジェクトの文書取出しメソッドgetXMLDocument()を呼び出し、以下のいずれかの形式でXML文書を受け取ります。

- String

- Stream

- ファイル

- DOMツリー

- SAX

なお、1つのResultSetオブジェクトから複数のXML文書を生成する場合は、文書取出しメソッドgetXMLDocument()を複

数回呼び出すことで、順にXML文書が生成され、アプリケーションに返却されます。

注意

CSVファイルに格納されているデータについて

XML変換機能の対応するCSV形式については、“12.8 XML変換機能の対応するCSV形式”を参照してください。

12.6 APIの使用例

XML変換機能のAPIを用いたアプリケーションの使用例について説明します。

- 250 -

12.6.1 起動開始からResultSetの取得まで(データベースのレコード)データベースへの接続を行い、指定したテーブルのすべての列データをResultSetオブジェクトとして得るまでの例を以

下に示します。

この例では、データベースとしてOracle 9iを使用しています。データベース上にはあらかじめ、テーブルを作成しておく

必要があります。

// Test program for XMLconverter

//

import java.sql.DriverManager;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

import oracle.jdbc.OracleDriver;

import com.fujitsu.xmlconverter.XMLGenerator;

import com.fujitsu.xmlconverter.GeneratorMap;

import com.fujitsu.xmlconverter.DocumentFountain;

public class Conv_Test

{

public static void main(String[] args)

{

ResultSet rs = null;

try

{

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection dbcon=null;

dbcon = DriverManager.getConnection(

"jdbc:oracle:thin:@xx.yy.zz.fujitsu.com:1521:DB",

"username","password" );

Statement stmt

- 251 -

= dbcon.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE,

ResultSet.CONCUR_UPDATABLE);

rs = stmt.executeQuery("SELECT * FROM PERSON");

}

catch(Exception e)

{

e.printStackTrace();

return;

}

12.6.2 起動開始からResultSetの取得まで(CSVファイル)指定したCSVファイルに格納されているデータを、ResultSetオブジェクトとして得るまでの例を以下に示します。

この例では、CSVファイルの1行目を列名としません。

また、CSVファイル内には以下のように、区切り文字、引用符文字、「\」がデータとして記述されている行があるものとしま

す。

区切り文字、引用符文字、「\」がデータとして記述されている行

"""",",","\"

// Test program for XMLconverter

//

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

import com.fujitsu.xmlconverter.XMLGenerator;

import com.fujitsu.xmlconverter.GeneratorMap;

import com.fujitsu.xmlconverter.DocumentFountain;

import com.fujitsu.xmlconverter.CSVSource;

public class Conv_Test

{

public static void main(String[] args)

{

ResultSet rs = null;

try

{

// CSVSourceオブジェクトの生成

CSVSource csvSource = new CSVSource("source.csv") ;

csvSource.setEncoding("SJIS"); // Encodingの設定

csvSource.setDelimiter(','); // 区切り文字の設定

csvSource.setQuote('\"'); // 引用符文字の設定

csvSource.setEnableEscapeChar(false); // 区切り文字、引用符文字、「\」の

// データ記述方法の設定

csvSource.setFirstRecordToColumn(false); // 列名の設定( default )

// ResultSetオブジェクト取得

rs = csvSource.getResultSet(); // ResultSet取得

}

catch(Exception e)

{

e.printStackTrace();

return;

}

- 252 -

12.6.3 XMLGeneratorの生成からXML文書の取得

XMLGeneratorの生成からXML文書の取得までのAPIの使用例を、以下に示します。

・ Stringの場合

・ Streamの場合

・ ファイルの場合

・ DOMツリーの場合

・ SAXの場合

Stringの場合

データベースまたはCSVファイルに格納されているデータから取得したResultSetオブジェクトを基に、XMLGeneratorによる変換を行ったあと、XML文書をStringにより取り出し、出力する例を以下に示します。

XMLGenerator gen = null;

GeneratorMap map = null;

DocumentFountain df = null;

try

{

gen = new XMLGenerator();

map = new GeneratorMap("map01.xml");

df = gen.createDocumentFountain( DocumentFountain.TYPE_STRING ,rs, map );

df.setEncoding("SJIS");

}

catch(Exception e)

{

e.printStackTrace();

return;

}

String ResultStr = null;

try

{

while(df.hasXMLDocument())

{

ResultStr = (String)df.getXMLDocument();

System.out.println("Result:"+ResultStr);

}

rs.close(); // 入力がデータベースの場合は、Connection切断も必要

}

catch(Exception e)

{

e.printStackTrace();

return;

}

}

}

Streamの場合

データベースまたはCSVファイルに格納されているデータから取得したResultSetオブジェクトを基に、XMLGeneratorによる変換を行ったあと、XML文書をStreamにより取り出し、出力する例を以下に示します。

- 253 -

import java.io.File;

import java.io.FileOutputStream;

:

XMLGenerator gen = null;

GeneratorMap map = null;

DocumentFountain df = null;

try

{

gen = new XMLGenerator();

map = new GeneratorMap("map01.xml");

df = gen.createDocumentFountain( DocumentFountain.TYPE_STREAM, rs, map );

df.setEncoding("SJIS");

}

catch(Exception e)

{

e.printStackTrace();

return;

}

FileOutputStream ResultStream = null;

try

{

ResultStream = new FileOutputStream(new File("filename"));

df.setDestination(ResultStream);

while(df.hasXMLDocument())

{

df.getXMLDocument();

}

ResultStream.close();

rs.close(); // 入力がデータベースの場合は、Connection切断も必要

}

catch(Exception e)

{

e.printStackTrace();

return;

}

}

}

ファイルの場合

データベースまたはCSVファイルに格納されているデータから取得したResultSetオブジェクトを基に、XMLGeneratorによる変換を行ったあと、XML文書をファイル出力する例を以下に示します。

ファイルの場合、1レコード1ファイルに出力します。そのため、出力先のファイル名を順次変更する必要があります。

XMLGenerator gen = null;

GeneratorMap map = null;

DocumentFountain df = null;

try

{

gen = new XMLGenerator();

map = new GeneratorMap("map01.xml");

df = gen.createDocumentFountain( DocumentFountain.TYPE_FILE, rs, map );

df.setEncoding("SJIS");

}

catch(Exception e)

{

e.printStackTrace();

- 254 -

return;

}

try

{

int i = 1;

while(df.hasXMLDocument())

{

df.setDestination("result" + i + ".xml");

df.getXMLDocument();

i++;

}

rs.close(); // 入力がデータベースの場合は、Connection切断も必要

}

catch(Exception e)

{

e.printStackTrace();

return;

}

}

}

DOMツリーの場合

データベースまたはCSVファイルに格納されているデータから取得したResultSetオブジェクトを基に、XMLGeneratorによる変換を行ったあと、XML文書をDOMツリーとして取り出し、アプリケーションで利用する例を以下に示します。

import org.w3c.dom.Document;

:

XMLGenerator gen = null;

GeneratorMap map = null;

DocumentFountain df = null;

try

{

gen = new XMLGenerator();

map = new GeneratorMap("map01.xml");

df = gen.createDocumentFountain( DocumentFountain.TYPE_DOM, rs, map );

df.setEncoding("SJIS");

}

catch(Exception e)

{

e.printStackTrace();

return;

}

Document docRoot = null;

try

{

while(df.hasXMLDocument())

{

docRoot = (Document)df.getXMLDocument();

// ここでは、DOMツリーとして受信したdocRootを利用する

// アプリケーション処理を記載する。

}

rs.close(); // 入力がデータベースの場合は、Connection切断も必要

}

catch(Exception e)

{

e.printStackTrace();

return;

- 255 -

}

}

}

SAXの場合

データベースまたはCSVファイルに格納されているデータから取得したResultSetオブジェクトを基に、XMLGeneratorによる変換を行ったあと、XML文書をSAXとして取り出し、アプリケーションで利用する例を以下に示します。

なお、setDestination()メソッドの引数には、org.xml.sax.ContentHandlerインタフェースを実装したクラスのインスタンスを設

定してください。

以下の例では、SAXhandlerクラスはorg.xml.sax.ContentHandlerインタフェースを別途実装しているものとします。

import org.xml.sax.helpers.DefaultHandler;

:

XMLGenerator gen = null;

GeneratorMap map = null;

DocumentFountain df = null;

try

{

gen = new XMLGenerator();

map = new GeneratorMap("map01.xml");

df = gen.createDocumentFountain( DocumentFountain.TYPE_SAX,rs, map );

df.setEncoding("SJIS");

}

catch(Exception e)

{

e.printStackTrace();

return;

}

try

{

while(df.hasXMLDocument())

{

// ここでは、SAXイベントとして受信した

// アプリケーション処理を記載する。

SAXhandler sh = new SAXhandler();

df.setDestination(sh);

df.getXMLDocument();

}

rs.close(); // 入力がデータベースの場合は、Connection切断も必要

}

catch(Exception e)

{

e.printStackTrace();

return;

}

}

}

class SAXhandler extends DefaultHandler

{

:

}

- 256 -

12.6.4 XML変換機能のサンプルプログラム

XML変換機能のサンプルプログラムは、ShunsakuのCD-ROMに格納されています。

Windowsの場合

CD-ROMドライブ:\sample

Solaris/Linuxの場合

/CD-ROMをマウントしたディレクトリ/sample

ポイント

XML変換機能のサンプルプログラムの詳細については、サンプルプログラムと同じディレクトリに格納されてい

る“Readme.txt”を参照してください。

12.7 XML変換機能の対応するデータ型

結果表の列データは、SQL型で表現されます。SQL型はjava.sql.Typesにて定義されています。

結果表のSQL型がXML変換機能で対応していないデータ型の場合、XML変換機能はXML変換時に例外を通知しま

す。

XML変換機能と結果表のデータ型の対応

結果表のSQL型が、XML変換機能で使用できるか否かの対応表を以下に示します。

表12.1 表:XML変換機能と結果表のデータ型の対応表

結果表のSQL型 説明XML変換機能で

の対応

ARRAY 配列オブジェクト ×

BIGINT 64ビット整数 ○

BINARY(注) 固定長バイナリ ○

BIT 1ビット整数 ○

BLOB(注) 巨大バイナリ ○

CHAR 固定長文字列 ○

CLOB 巨大文字列 ○

DATE 日付 ○

DECIMAL 10進数 ○

DISTINCT ユーザ定義型 ×

DOUBLE 倍精度浮動小数点数 ○

FLOAT 倍精度浮動小数点数 ○

INTEGER 32ビット整数 ○

- 257 -

結果表のSQL型 説明XML変換機能で

の対応

JAVA_OBJECT Java固有オブジェクト ×

LONGVARBINARY(注)

可変長バイナリ○

LONGVARCHAR 可変長文字列 ○

NULL null ×

NUMERIC 10進数 ○

OTHER 未定義の型 ×

REAL 単精度浮動小数点数 ○

REF OIDコンテナ ×

SMALLINT 16ビット整数 ○

STRUCT 構造体オブジェクト ×

TIME 時刻 ○

TIMESTAMP 日付と時刻 ○

TINYINT 8ビット整数 ○

VARBINARY(注) 可変長バイナリ ○

VARCHAR 可変長文字列 ○

○:対応する

×:対応しない

注)バイナリデータ

結果表とデータベースのデータ型の対応

結果表に取り出せるSQL型とデータベースでのデータ型の対応表を、以下に示します。

表12.2 表:結果表とデータベースのデータ型の対応表

結果表に取り出せ

るSQL型

データベースでのデータ型

SymfowareServer

PostgreSQL Oracle SQL Server

ARRAY - - - -

BIGINT - int8 - bigint

BINARY-

bytea-

binary、timestamp

BIT - bool - bit

BLOB - - BLOB -

CHAR CHARACTER、NCHAR

bpchar CHAR、NCHAR

char、nchar、uniqueidentifier

CLOB- -

CLOB、NCLOB

DATE DATE date DATE -

- 258 -

結果表に取り出せ

るSQL型

データベースでのデータ型

SymfowareServer

PostgreSQL Oracle SQL Server

DECIMAL DECIMAL- -

smallmoney、money

DISTINCT - - - -

DOUBLE FLOAT(52)、DOUBLEPRECISION

float8、money - -

FLOAT - float4 - -

INTEGER INTEGER int4、serial、oid

int

JAVA_OBJECT - - - -

LONGVARBINARY

- -LONG RAW image

LONGVARCHAR

- -LONG text、

ntext

NULL - - - -

NUMERIC NUMERIC numeric、decimal

NUMBER numeric

OTHER - - - -

REAL REAL、FLOAT(23)

- -real、float(5)

REF - - - -

SMALLINT SMALLINT int2 - smallint

STRUCT - - - -

TIME TIME time - -

TIMESTAMP TIMESTAMP timestamp、timestampz、datetime

TIMESTAMP、TIMESTAMP(6)

datetime、smalldatetime

TINYINT - - - tinyint

VARBINARY BLOB - RAW varbinary

VARCHAR VARCHAR、NCHARVARYING

text、varchar、lztext

VARCHAR2、NVARCHAR

varchar、nvarchar、sql_variant

- : 対応しない

12.8 XML変換機能の対応するCSV形式

XML変換機能の対応するCSV形式について、以下に示します。

・ 区切り文字

- 259 -

・ 引用符文字

・ データの両端の空白

・ 文字データ

・ 改行文字

区切り文字

区切り文字で区切られた区間のデータが、1データとして扱われます。

参照

区切り文字に指定できる文字などの詳細については、“K.2.3 setDelimiter”を参照してください。

引用符文字

引用符を指定する場合、CSVのデータは引用符で囲まれたデータと囲まれないデータが混在可能です。

参照

引用符文字に指定できる文字などの詳細については、“K.2.4 setQuote”を参照してください。

データの両端の空白

データの両端の空白文字(スペース、タブ)は削除されます。空白文字をデータに含める場合は、引用符で囲む必要が

あります。

文字データ

区切り文字、引用符文字、「\」を文字データとして記述する方法には、以下の2つがあります。

CSVSourceクラスのsetEnableEscapeChar()に指定する引数の値により、いずれかを選択します。

・ 引数の値がfalseの場合

- 区切り文字をデータとして記述する方法

データを引用符文字で囲みます。

- 引用符文字をデータとして記述する方法

データを引用符文字で囲み、データとして処理する引用符文字を2文字続けて記述します。

データの途中に引用符文字を記述する場合には、データが引用符文字で囲まれていない場合に限り、そのまま

記述することも可能です。

- 「\」をデータとして記述する方法

「\」をそのまま記述します。

・ 引数の値がtrueの場合

- 区切り文字をデータとして記述する方法

データを引用符文字で囲むか、区切り文字の前に「\」を付加します。

- 260 -

- 引用符文字をデータとして記述する方法

データとして処理する引用符文字の前に「\」を付加します。

データの途中に引用符文字を記述する場合には、データが引用符文字で囲まれていない場合に限り、そのまま

記述することも可能です。

- 「\」をデータとして記述する方法

データとして処理する「\」の前に「\」を付加します。

区切り文字、引用符文字、「\」をデータとして記述する具体例を以下に示します(例では、区切り文字に「,」を指定してい

ることを前提にしています)。

「$1,200」、「He said "Hello."」、「\100」をデータとしたい場合、以下のようにCSVファイルに記述してください。

1. CSVSourceクラスのsetEnableEscapeChar()の引数の値がfalseの場合

"$1,200", "He said ""Hello.""", "\100"

2. CSVSourceクラスのsetEnableEscapeChar()の引数の値がtrueの場合(注)

"$1,200", "He said \"Hello.\"", "\\100"

注)「"$1,200"」の代わりに「$1\,200」と記述することもできます。

改行文字

引用符で囲まれたデータ内の改行文字(CR/LF/CRLF)は、出力先が属性値および要素にかかわらず、そのままXML文書へ出力されます。

引用符で囲まれたデータ内の改行文字(CR/LF/CRLF)は、文字参照(&#x0d; &#x0a;)には変換されません。

改行文字を含むデータを持つXML文書を、XMLプロセッサに与えた場合、XML1.0により以下のように変換されます。

・ データを要素に指定した場合:

要素に改行文字(CR/LF/CRLF)を含む場合、すべてLF(0x0A)に変換されます。

・ データを属性値に指定した場合:

属性値に改行文字(CR/LF/CRLF)を含む場合、すべて空白(0x20)に変換されます。

- 261 -

付録A API用動作環境ファイルの実行パラメタ

API用動作環境ファイルに定義する実行パラメタについて説明します。

実行パラメタの記述形式

API用動作環境ファイルに定義する実行パラメタの記述形式を以下に示します。

実行パラメタ 指定値

注意

・ 1つの実行パラメタの定義を複数行にまたがって記述することはできません。

・ 1つの実行パラメタの定義は4095バイト以内で記述してください。(改行は含みません。)

・ 実行パラメタと指定値の間は、半角の空白またはタブを記述してください。

・ 行の先頭が“#”の場合、その行はコメント行として扱われます。また、行の途中に“#”が指定されている場合、そ

の“#”以降、行末までがコメントとして扱われます。

・ 単一指定の実行パラメタが複数回出現した場合、文法エラーとなります。

以下の場合、行の途中に“#”が指定されているため、“2006.02.10更新”はコメント扱いとなります。

Port 1 #2006.02.10更新

A.1 API用動作環境ファイルの実行パラメタの種類

以下に、API用動作環境ファイルの実行パラメタを示します。

表A.1 API用動作環境ファイルの実行パラメタの一覧

実行パラメタ 意味 記述の省略 記述例 備考

Host接続先のホスト名または

IPアドレス可 DirSvr1 省略時:localhost

Port 接続先のポート番号 可 23101 省略時:23101

ShunsakuFile

接続先のShunsaku File名

可 File1Shunsaku Fileを使用

しない場合は省略

WaitTimerShunsakuからの 大応

答待ち時間(秒)可 300

省略時:0指定範囲:0~10000

SnapLevelAPIスナップの出力レベ

ル可 1 省略時:0

LogFileAPIスナップを出力する

ログファイル可

"C:\api\api.log"

/api/api.log

SnapLevelに1または

2を指定した場合、本

パラメタは必ず指定

する必要があります。

- 262 -

実行パラメタ 意味 記述の省略 記述例 備考

LogFileSize

APIスナップを出力する

ログファイルの切替えサ

イズ(MB)可 100

省略時:100指定可能範囲:1~500

LogFileBackup

APIスナップを出力する

ログファイルのバックアッ

プ数

可 3省略時:1指定可能範囲: 0~2147483647

PfmLog 性能情報の出力 可 1

省略時:00:APIスナップに性能

情報を出力しない

1:APIスナップに性能

情報を出力する

A.2 API用動作環境ファイルの実行パラメタの意味Host

接続先のホスト名またはIPアドレスを指定します。

本パラメタを省略した場合、localhostが指定されたとみなします。

Port

接続先のポート番号を指定します。

本パラメタを省略した場合、23101が指定されたとみなします。

ShunsakuFile

接続先のShunsaku File名として、File名またはDomain名を指定します。

注意

ShunsakuFileの指定は、以下の順に優先されます。

1. ShunConnectionクラスのコンストラクタ、ShunServiceクラスのConnectメソッド、またはShunConnect関数での指定

2. 本パラメタでの指定

3. conductor用動作環境ファイルのDefaultFileでの指定

WaitTimer

Shunsakuからの 大応答待ち時間を指定します。指定できる範囲は、0~10000です。単位は、秒です。設定した時

間を過ぎてもShunsakuから応答がない場合は、タイムアウトとなりアプリケーションにエラーを通知し、コネクションは自

動的に切断されます。

0を指定した場合は、応答があるまで待ち続けます。

本パラメタを省略した場合、0が指定されたとみなします。

SnapLevel

APIスナップの出力レベルを指定します。

- 263 -

表A.2 APIスナップの一覧

SnapLevel 出力される内容

0 APIスナップは出力しません。

1 APIの呼出しシーケンスを出力します。

2レベル1の情報に加え、メソッドまたは関数実行時のパラメタ情報、デー

タ操作の情報を出力します。

本パラメタを省略した場合、0が指定されたとみなします。

ポイント

レベル0を指定した場合は、実行パラメタLogFile、LogFileSize、LogFileBackupおよびPfmLogを指定する必要はあり

ません。

LogFile

APIスナップを出力するログファイルを絶対パスで指定します。

絶対パス名には、全角文字は指定できません。

LogFileSizeで指定したサイズを契機に循環利用します。

SnapLevelに1または2を指定した場合、本パラメタは必ず指定してください。本パラメタを省略した場合、APIスナップ

は出力されません。

APIスナップはアプリケーションのプロセスごとに作成されます。

以下の例のようにファイル名にプロセスIDを付加します。

LogFileに指定した絶対パス名

C:\api\api.log

実際に作成されるログファイル

C:\api\api_2435.log

LogFileに指定した絶対パス名

/api/api.log

実際に作成されるログファイル

/api/api_2435.log

注意

- 本パラメタにはローカルディスクのフォルダを指定してください。

- 264 -

- フォルダ名に空白または“#”を含む場合は、フォルダ名全体を二重引用符(“ “)で囲んでください。

- ディレクトリ名には、“#”または空白を含むことはできません。

LogFileSize

APIスナップを出力するログファイルの切替えを行うファイルサイズを指定します。単位はMB(メガバイト)です。指定

できる範囲は1~500です。

本パラメタを省略した場合は、100が指定されたとみなします。

たとえば、1を指定すると、ファイルサイズが1MBを超えると自動的にバックアップファイルが作成されます。

LogFileBackup

APIスナップを出力するログファイルのバックアップ数を指定します。指定できる範囲は、0~2147483647です。本パ

ラメタに指定した数を超えると、一番古いバックアップファイルの内容は失われます。

たとえば、本パラメタに3を指定した場合は、api_2435.log.1、api_2435.log.2、api_2435.log.3というバックアップファイ

ルが生成されます。次にバックアップが必要になった場合、api_2435.log.3の内容が失われます。

本パラメタを省略した場合は、1が指定されたものとみなします。

PfmLog

APIスナップに性能情報として、性能ログに出力されている依頼番号(Shunsakuシステム内で一意な番号)を出力す

るかどうかを指定します。

0:APIスナップに性能情報を出力しない

1:APIスナップに性能情報を出力する

SnapLevelに1または2を指定した場合、本パラメタは有効となります。

本パラメタを省略した場合、0が指定されたとみなします。

参照

性能ログの出力内容については、“導入・運用ガイド”の“性能ログの出力情報”を参照してください。

A.3 API用動作環境ファイルの実行パラメタの記述例

Windowsの場合

#---接続先のホスト名またはIPアドレス---#

Host DirSvr1

#---接続先のポート番号---#

Port 23101

- 265 -

#---接続先のShunsaku File名---#

ShunsakuFile File1

#---Shunsakuからの 大応答待ち時間(秒)---#

WaitTimer 300

#---APIスナップの出力レベル---#

SnapLevel 1

#---APIスナップを出力するログファイル---#

LogFile "C:\api\api.log"

#---APIスナップを出力するログファイルの切替えサイズ(MB)---#

LogFileSize 100

#---APIスナップを出力するログファイルのバックアップ数---#

LogFileBackup 3

#---性能情報---#

PfmLog 1

Solaris/Linuxの場合

#---接続先のホスト名またはIPアドレス---#

Host DirSvr1

#---接続先のポート番号---#

Port 23101

#---接続先のShunsaku File名---#

ShunsakuFile File1

#---Shunsakuからの 大応答待ち時間(秒)---#

WaitTimer 300

#---APIスナップの出力レベル---#

SnapLevel 1

#---APIスナップを出力するログファイル---#

LogFile /api/api.log

#---APIスナップを出力するログファイルの切替えサイズ(MB)---#

LogFileSize 100

#---APIスナップを出力するログファイルのバックアップ数---#

LogFileBackup 3

#---性能情報---#

PfmLog 1

- 266 -

付録B 検索式、リターン式およびソート式の書式

ShunsakuのAPIの引数として指定する検索式、リターン式およびソート式の書式について説明します。

B.1 文法の表記方法

文を構成する各要素の並べ方を示します。

記述形式で使用している記号の意味を以下に示します。

表B.1 文法の表記方法

記号 意味

線の下に分岐している部分は、省略可能な要素を示して

います。

例:

上下に並列に分岐した部分は、そのうちの1つを選択す

る要素を示しています。

例:

線の上に延びている矢印付きの線は、その要素が繰り返

されることを示しています。

例:

複数の構文要素をまとめて表現しています。

例:

構文が完結することを示しています。

B.2 共通の書式

検索式、リターン式およびソート式に共通の書式について説明します。

- 267 -

B.2.1 パス式

XML文書は、その構造を階層で表現します。

パス式は、階層構造にあるXML文書中の特定の要素ノードの位置を指定するものです。

パス式の定義を以下の図に示します。

図B.1 パス式の定義

パス要素

パス要素は、XML文書中の要素ノードを識別するものです。

パス要素の説明を以下の表に示します。

パス要素 説明

要素名 要素ノードの名前を意味します。

* 上位ノード直下のすべての要素ノードを意味します。

パス演算子

パス演算子は、パス要素のつながりを表現します。

パス演算子の説明を以下の表に示します。

パス演算子 説明

/ 上位ノード配下にあるノードが対象となります。

// 上位ノード配下の任意の階層にあるすべてのノードが対象と

なります。

注意

パス式には、“//”と“*”を続けて記述できません。

- 268 -

パス式の記述例を以下に示します。

文書

<company>

<name>fujitsu</name>

<employee>

<name>tanaka</name>

<id>2000</id>

</employee>

</company>

/company/employee/name

“ルートノード”配下の“company要素ノード”配下の“employee要素ノード”配下の“name要素ノード”を示します。図中の

(1)を指します。

//name

“ルートノード”配下の任意の階層にある“name要素ノード”を示します。図中の(1)および(2)を指します。

/company/*/id

“ルートノード”配下の“company要素ノード”配下の任意の要素ノード(図では“name要素ノード”か“employee要素ノー

ド”)配下の“id要素ノード”を示します。図中の(3)を指します。

B.2.2 テキスト式

テキスト式とは、パス式で示すXML文書中の特定の要素ノード直下のテキストノードの値(文字列)を指すための記述で

す。

テキスト式の定義を以下の図に示します。

- 269 -

図B.2 テキスト式の定義

注意

パス式の 後に、パス演算子“//”を記述する場合は、パス式の後ろの“/”を省略します。

パス式

パス式は、階層構造にあるXML文書中の特定の要素ノードの位置を識別するものです。

・ パス式の詳細な記述については、“B.2.1 パス式”を参照してください。

text()

パス式で指定した要素ノード直下のテキストノードの値を指します。テキスト式では、text()を必ず指定します。

テキスト式の記述例を以下に示します。

文書

<company>

<name>fujitsu</name>

<employee>

<name>tanaka</name>

<id>2000</id>

</employee>

</company>

- 270 -

/company/employee/name/text()

“ルートノード”配下の“company要素ノード”配下の“employee要素ノード”配下の“name要素ノード”の配下にある“テ

キストノード”の値を示します。図中の(1)“tanaka”を指します。

B.2.3 属性式

属性式とは、パス式で示すXML文書中の特定の要素ノードの属性ノードの値を示すための記述です。

属性式の定義を以下に示します。

図B.3 属性式の定義

注意

パス式の 後に、パス演算子“//”を記述する場合は、パス式の後ろの“/”を省略します。

パス式

パス式は、階層構造にあるXML文書中の特定の要素ノードの位置を識別するものです。

パス式の詳細な記述については、“B.2.1 パス式”を参照してください。

属性名

パス式で指定した要素ノードの属性ノードの名前を指定します。属性名の前には@を必ず指定します。“*”を指定する

と、パス式で指定した特定の要素ノードのすべての属性ノードを意味します。

注意

属性式中のパス要素に@から始まる要素名は指定できません。

属性式の記述例を以下に示します。

<company>

<name>fujitsu</name>

<employee position="chief">

<name>tanaka</name>

<id>2000</id>

</employee>

</company>

- 271 -

/company/employee/@position

“employee要素ノード”の属性ノード“position”の値を示します。図中の(1)“chief”を指します。

B.2.4 単一行関数指定

単一行関数指定は、テキスト式または属性式で指定した値を関数の機能に従って変換した結果を返します。

単一行関数指定の定義を以下の図に示します。

図B.4 単一行関数指定の定義

- 272 -

rlen関数

rlen関数は、テキスト式または属性式で示す文字列の1文字目から、指定した文字数の文字列を返却します。

・ 文字数に指定できる値は1~2147483647です。文字数には、改行コードを含む制御文字の数も含みます。

・ テキスト式または属性式で示す文字列の長さが、文字数に指定した長さに満たない場合は、テキスト式で示す文字

列をそのまま返します。

・ テキスト式または属性式には、パス演算子“//”は指定できません。

・ テキスト式には、パス要素“*”は指定できません。

・ 属性式で指定する属性名に“*”は指定できません。

例1

rlen(/company/name/text(),16)

例2

rlen(/company/employee/@position,16)

val関数

val関数は、テキスト式または属性式で示す文字列から数値のみを抜き出します。

・ テキスト式または属性式で示す文字列から 初に見つけた以下の形式の文字列を数値として抜き出します。

val関数の定義を以下の図に示します。

図B.5 val関数の定義

・ 整数部に出現するカンマは無視します。小数点が指定されている場合、それ以降 初に出現した数字以外の文字

の前までを小数部とみなします。

・ テキスト式または属性式で示す文字列に数字を含まない場合は0として扱います。

・ 先頭の0を除き、整数部が18桁を超えるとエラーとなります。

・ 小数部は18桁まで有効です。19桁以降は切り捨てます。

・ テキスト式または属性式には、パス演算子“//”は指定できません。

- 273 -

・ テキスト式または属性式には、パス要素“*”は指定できません。

・ 属性式で指定する属性名に“*”は指定できません。

val(/company/employee/id/text())

B.3 検索式

検索式とは、“ある条件を満たすXML文書”を検索するための条件を表現したものです。

検索式は、単一または複数の条件式およびフィルタ式から成り立ちます。

条件式、フィルタ式についての詳細は、それぞれ“B.3.1 条件式”、“B.3.8 フィルタ式”を参照してください。

複数の条件式またはフィルタ式を指定するには、論理演算子を使用します。

論理演算子についての詳細は、“論理演算子”を参照してください。

検索式の定義を以下の図に示します。

図B.6 検索式の定義

注意

検索式は、1つ以上の条件式またはフィルタ式が必要です。

論理演算子

論理演算子は、条件式やフィルタ式を複数指定した場合に、式どうしのつながりを示すものです。

論理演算子を以下の表に示します。

- 274 -

論理演算子 論理種別 説明

AND AND演算 条件式どうしをAND演算子でつなげます。

両方の条件式の結果が真のときに真となります。

どちらか一方でも偽である場合は偽となります。

OR OR演算 条件式どうしをOR演算子でつなげます。

両方の条件式の結果が偽のときに偽となります。

どちらか一方でも真である場合は真となります。

・ 検索式にAND演算およびOR演算を混在して指定した場合、AND演算を優先します。

・ 論理演算の優先順位を変更する場合は、“()”を利用します。

以下の例では、[条件式2] OR [条件式3]を優先します。

[条件式1]△AND△([条件式2] △ OR △[条件式3])…

△:半角空白

B.3.1 条件式

条件式は、パス式で指定した要素ノードの値またはテキスト式で指定したテキストノードの値とキーワードを比較する場合

に使用します。また、属性式で指定した属性のノードの値とキーワードを比較する場合にも使用します。

条件式の定義を以下の図に示します。

図B.7 条件式の定義

条件式は、パス式、テキスト式または属性式、比較演算子およびキーワードから成り立ちます。

パターンおよび文字列は、二重引用符(")または引用符(')で囲みます。二重引用符(")と引用符(')は混在して使用できま

せん。

- 275 -

以下に条件式で定義する項目について説明します。

・ パス式

・ テキスト式

・ 属性式

パス式

パス式は、XML文書中の要素ノードの位置を識別するものです。

比較対象となるXML文書中の要素ノードを指定します。

パス式の詳細な書式は、“B.2.1 パス式”を参照してください。

・ キーワードにパターンを指定したときのみ、パス式の 後にパス演算子“//”を指定できます。パス式の 後にパス演

算子“//”を指定すると、パス式の指す要素ノード配下のすべての要素ノードを意味します。

・ キーワードにパターンを指定したときのみ、パス式の 後にパス要素“*”を指定できます。

テキスト式

テキスト式はXML文書中の要素ノード直下のテキストノードの値(文字列)を指すための記述です。比較対象となるXML文書中の要素ノード直下のテキストノードを指定します。テキスト式の詳細な書式は、“B.2.2 テキスト式”を参照してくだ

さい。

・ キーワードにパターンを指定したときのみ、パス式の 後にパス演算子“//”を指定できます。パス式の 後にパス演

算子“//”を指定すると、パス式の指す要素ノード配下のすべての要素ノードを意味します。

・ キーワードにパターンを指定したときのみ、パス式の 後にパス要素“*”を指定できます。

注意

条件式に、パス式が同じテキスト式を指定すると、同じ結果が返却されます。

条件式の例を以下に示します。

パス式 :/root/company/name='Yamada'

テキスト式:/root/company/name/text()='Yamada'

結果:上記は同じ結果が返却されます。

属性式

属性式はXML文書中の特定の属性ノードの値を示すための記述です。比較対象となるXML文書中の特定の属性ノー

ドの値を指定します。属性式の詳細な書式は、“B.2.3 属性式”を参照してください。

- 276 -

・ キーワードにパターンを指定したときのみ、属性式で指定する属性名に“*”を指定できます。

B.3.2 キーワード

キーワードは、パス式で示すXML文書中の要素ノードの値、テキスト式で示すXML文書中のテキストノードの値または

属性式で示すXML文書中の属性ノードの値と比較するパターン、文字列または数値です。

エスケープ文字

パターンおよび文字列に、以下に示す文字を指定する場合には、エスケープ文字を付加します。エスケープ文字は“\”

です。

エスケープ文字については、“B.3.3 エスケープ文字”を参照してください。

実体参照

XML文書中に記述された文字を表す実体参照は、その実体参照が表す文字として検索します。キーワードには、その

文字そのものを指定することも、以下の表の実体参照の形式を指定することもできます。

表B.2 実体参照の一覧

実体参照 表す記号

&lt; <

&gt; >

&amp; &

&apos; '

&quot; "

注意

・ “実体参照”をキーワードに指定する場合は、“&”にエスケープ文字を付加する必要があります。

・ “表す記号”をキーワードに指定する場合は、“&”、“'”、“"”にエスケープ文字を付加する必要があります。

キーワードと比較演算子

キーワードと比較演算子の組合せ方により、さまざまな検索条件を指定することができます。それぞれの組合せでの意味

を以下の表に示します。

B.3.4 パターン

比較演算子 種類 説明

= 部分一致 要素ノードの値、テキストノードの値または属性

ノードの値にキーワードで指定したパターンに

一致する文字列が含まれれば真です。

!= 要素ノードの値、テキストノードの値または属性

ノードの値にキーワードで指定したパターンに

一致する文字列が含まれなければ真です。

- 277 -

B.3.5 文字列

比較演算子 種類 説明

== 完全一致 要素ノードの値、テキストノードの値または属性

ノードの値とキーワードで指定した文字列が完

全に一致すれば真です。

!== 要素ノードの値、テキストノードの値または属性

ノードの値とキーワードで指定した文字列が一

部でも異なれば真です。

<、<=、>、>= 大小比較 要素ノードの値、テキストノードの値または属性

ノードの値とキーワードで指定した文字列を文

字コードで大小比較します。

B.3.6 数値

比較演算子 種類 説明

= 一致 要素ノードの値、テキストノードの値または属性

ノードの値中の数値とキーワードで指定した数

値が一致すれば真です。

!= 要素ノードの値、テキストノードの値または属性

ノードの値中の数値とキーワードで指定した数

値が一致しなければ真です。

<、<=、>、>= 大小比較 要素ノードの値、テキストノードの値または属性

ノードの値中の数値とキーワードで指定した数

値を大小比較します。

B.3.3 エスケープ文字

パターンおよび文字列に、以下に示す文字を指定する場合には、エスケープ文字を付加します。エスケープ文字は“\”

です。

たとえば、“abc\\”が指定された場合、“abc\”が検索対象文字列となります。

“\”が必要となる文字を以下の表に示します。

表B.3 エスケープ文字を付加する文字の一覧

文字 指定方法 文字 指定方法

" \" . \.

$ \$ ? \?

& \& [ \[

' \' \ \\

( \( ] \]

) \) ^ \^

* \* { \{

- 278 -

文字 指定方法 文字 指定方法

+ \+ | \|

, \, } \}

- \- ~ \~

B.3.4 パターン

パターンによる検索では、要素ノードの値、テキストノードの値または属性ノードの値が、パターンで示されるさまざまな条

件に合致する文書を検索します。部分的な一致の検索や単語の検索など、複雑な条件を記述して検索することができ

ます。

パターン

パターンの定義を以下の図に示します。

図B.8 パターンの定義

・ 論理積

・ 論理和

・ 否定

文字列検索

文字列検索の定義を以下の図に示します。

検索対象外として取り扱う文字は、SkipCharで変更することができます。

- 279 -

SkipCharの詳細については、“導入・運用ガイド”の“システム用動作環境ファイルの実行パラメタ”および“director用動作環境ファイルの実行パラメタ”を参照してください。

図B.9 文字列検索の定義

- 文字列一致指定

- 前方一致指定

- 後方一致指定

- 任意文字指定

- 文字間隔指定

- 部分文字指定

- 文字範囲指定

- 数値範囲指定

ワード検索

ワード検索の定義を以下の図に示します。

単語の区切り文字は、SeparateCharで変更することができます。

ワード検索中に記述できる文字は、単語の区切り文字を除く制御文字以外のASCII文字です。

SeparateCharの詳細については、“導入・運用ガイド”の“システム用動作環境ファイルの実行パラメタ”および“director用動作環境ファイルの実行パラメタ”を参照してください。

- 280 -

図B.10 ワード検索の定義

- ワード一致指定

- ワード間隔指定

論理積

パス式で指定した要素ノードの値、テキスト式で指定したテキストノードの値、または属性式で指定した属性ノードの値

が、指定されたすべてのパターンを含むかどうかを調べます。

/root/text = '高速&検索'

/root/textが示す要素ノードの値が“高速”および“検索”という文字列を両方含む場合に真となります。

論理和

パス式で指定した要素ノードの値、テキスト式で指定したテキストノードの値、または属性式で指定した属性ノードの値

が、指定されたいずれかのパターンを含むかどうかを調べます。

/root/text = '高速|検索'

/root/textが示す要素ノードの値が“高速”または“検索”という文字列を含む場合に真となります。

否定

パス式で指定した要素ノードの値、テキスト式で指定したテキストノードの値または属性式で指定した属性ノードの値が、

指定されたパターンを含まないかどうかを調べます。

/root/text = '~(高速|検索)'

/root/textが示す要素ノードの値に“高速”という文字列も“検索”という文字列も含まない場合に真となります。

- 281 -

ポイント

パターン検索には、論理積、論理和、否定を組み合わせて使用することができます。このときの評価順序は以下のとおり

です。

1. 否定

2. 論理積

3. 論理和

また、括弧(“(”および“) ”)を使用して評価順序を指定することができます。括弧の中の条件は、優先的に評価されます。

文字列一致指定

要素ノードの値、テキストノードの値または属性ノードの値に、指定されたキーワードが含まれるかどうかを調べます。

/root/text = '富士通'

/root/textが示す要素ノードの値に“富士通”という文字列を含む場合に真となります。

前方一致指定

要素ノードの値、テキストノードの値または属性ノードの値の先頭に、指定されたキーワードが存在するかどうかを調べま

す。

/root/text = '^富士通'

/root/textが示す要素ノードの値の先頭が“富士通”という文字列で始まる場合に真となります。

後方一致指定

要素ノードの値、テキストノードの値または属性ノードの値の末尾に、指定されたキーワードが存在するかどうかを調べま

す。

/root/text = '富士通$'

/root/textが示す要素ノードの値の末尾が“富士通”という文字列である場合に真となります。

任意文字指定

要素ノードの値、テキストノードの値または属性ノードの値に、任意の文字が入ったキーワードを含んでいるかどうかを調

べます。

- 282 -

キーワードに含む任意の文字の指定には、以下の表の4種類を指定できます。

記号 意味 連続使用

. 任意の1文字 ○

.? 任意の0~1文字 ○

.+ 任意の1文字以上 ×

.* 任意の0文字以上 ×

○:使用可

×:使用不可

/root/text = '富士.*会社'

/root/textが示す要素ノードの値に“富士”と“会社”という文字列を含み、かつ、その2つの文字列の間の文字数が0文字以上の場合に真となります。

注意

連続使用不可な記号を連続して使用した場合は、構文エラーとなります。

参考

任意文字指定は、自由に組み合わせることができます。任意文字指定の組合せと真偽の例を以下の表に示します。な

お、以下の表は比較演算子に“=”を指定した場合の結果です。

キーワード例データ例

AB AXB AYYB AZZZB

'A.' ○ ○ ○ ○

'A.B' × ○ × ×

'A.?B' ○ ○ × ×

'A.+B' × ○ ○ ○

'A.*B' ○ ○ ○ ○

'A..?B' × ○ ○ ×

'A..+B' × × ○ ○

'A..*B' × ○ ○ ○

'A.?.+B' × ○ ○ ○

'A.?.*B' ○ ○ ○ ○

○:真

×:偽

- 283 -

文字間隔指定

要素ノードの値、テキストノードの値または属性ノードの値に、指定された2つのキーワードが指定された文字数以内の間

隔をおいて連続して出現するかどうかを調べます。

文字間隔指定の数値に指定できる値は、0~1024です。

/root/text = 'アルコール,10C,濃度'

/root/textが示す要素ノードの値に“アルコール”と“濃度”という文字列を含み、かつ、その2つの文字列の間の文字数が

10文字以内である場合に真となります。

注意

・ 文字列検索に文字間隔指定は、一度だけ指定することができます。

・ 文字間隔指定の直前または直後に、任意文字指定を記述することはできません。

部分文字指定

要素ノードの値、テキストノードの値または属性ノードの値に、指定されたキーワードが含まれるかどうかを調べます。キー

ワードの一部は、複数の文字列のいずれかで構成されます。

/root/text = '高(田|山|見沢)太郎'

/root/textが示す要素ノードの値に“高田太郎”、“高山太郎”または“高見沢太郎”という文字列を含む場合に真となり

ます。

注意

・ 部分文字指定、文字範囲指定および数値範囲指定の検索を実行する場合には、searcherが多くのメモリを使用する

ことがあります。searcherを配置したサーバに十分なメモリが用意されていない場合には、Shunsakuのシステム全体の

検索レスポンスに影響が発生し、場合によってはアプリケーションがタイムアウトエラーを検出することがあります。

・ 部分文字指定、文字範囲指定または数値範囲指定の検索を実行する場合に、使用する 大のメモリサイズは以下

の計算で算出可能です。

部分文字の数、文字の範囲または数値の範囲×キーワードの文字数×1キロバイト

部分文字指定、文字範囲指定または数値範囲指定が複数指定されている場合には、各部分文字の数、各文字の範囲

または各数値の範囲を乗算した値が、範囲となります。

・ 部分文字指定、文字範囲指定および数値範囲指定を組み合わせて検索を実行する場合には、使用する 大のメ

モリサイズは以下の計算で算出可能です。

部分文字の数×文字の範囲×数値の範囲×キーワードの文字数×1キロバイト

- 284 -

文字範囲指定

要素ノードの値、テキストノードの値または属性ノードの値に、指定されたキーワードが含まれるかどうかを調べます。キー

ワードの一部は、指定された範囲の文字のいずれかで構成されます。

文字1と文字2には、ともに制御文字以外のASCII文字を1文字指定します。指定する場合にはエスケープ文字は付加し

ません。また、文字1の文字コードの値は、文字2の文字コードの値より小さくなければなりません。

/root/text = 'class[A-C]'

/root/textが示す要素ノードの値に“classA”、“classB”または“classC”という文字列を含む場合に真となります。

注意

文字範囲指定の検索を実行する場合に、searcherが多くのメモリを使用することがあります。

メモリサイズの詳細については、“部分文字指定”を参照してください。

数値範囲指定

要素ノードの値、テキストノードの値または属性ノードの値に、指定されたキーワードが含まれるかどうかを調べます。キー

ワードの一部は、指定された範囲の数値のいずれかで構成されます。

数値1と数値2には、ともに半角数字を指定します。数値1と数値2に指定できる値は、0~999です。また、数値1は、数値2より小さくなければなりません。

/root/text = 'アルコール[9,11]%'

/root/textが示す要素ノードの値に“アルコール9%” “アルコール10%”または“アルコール11%”という文字列を含む

場合に真となります。

ポイント

数値の前後に文字を指定すると、正しい検索結果が得られます。

注意

数値範囲指定の検索を実行する場合に、searcherが多くのメモリを使用することがあります。

メモリサイズの詳細については、“部分文字指定”を参照してください。

- 285 -

ワード一致指定

要素ノードの値、テキストノードの値または属性ノードの値に、指定されたキーワードと一致する単語が含まれるかどうか

を調べます。ワード検索の場合は、区切り文字で区切られた文字列を、単語として識別します。

/root/text = '\<the\>'

/root/textが示す要素ノードの値に“the”という単語を含む場合に真となります。たとえば、“mother”の“the”は単語の

途中にあるため偽となります。

ワード間隔指定

要素ノードの値、テキストノードの値または属性ノードの値に、指定された2つのキーワードが指定された単語数以内の間

隔をおいて連続して出現するかどうかを調べます。

ワード間隔指定の数値に指定できる値は、0~1024です。

/root/text = '\<search\>,10W,\<shunsaku\>'

/root/textが示す要素ノードの値に“search”と“shunsaku”という単語を含み、かつ、その2つの単語の間の単語数が10ワード以内である場合に真となります。

注意

ワード検索にワード間隔指定は、一度だけ指定することができます。

B.3.5 文字列

文字列による検索では、要素ノードの値、テキストノードの値または属性ノードの値が、文字列で指定された値と完全に

一致する文書や大小関係にある文書を検索します。文字列による大小比較を行うことができるため、日付の検索などの

数字と文字とが混在した値の検索に利用できます。

文字列の定義を以下の図に示します。

図B.11 文字列の定義

完全一致

要素ノードの値、テキストノードの値または属性ノードの値と文字列が等しいかどうかを調べます。

- 286 -

/root/date == '2006年03月09日'

/root/dateが示す要素ノードの値が“2006年03月09日”という文字列と等しい場合に真となります。

ポイント

XML文書の任意の要素ノードが“長さ0バイトの空文字”である場合も、完全一致で検索することができます。

/doc/detail/taxi == ''

/doc/detail/taxiが示す要素ノードの値が空文字と等しい場合に真となります。

大小比較

要素ノードの値、テキストノードの値または属性ノードの値と文字列を文字コード値で文字列の左から右の順に大小比較

します。日付と時間は以下の形式である必要があります。

・ 日付:’YYYY/MM/DD’

・ 時間:’hh:mm:ss’

/root/date > '2006年03月09日'

/root/dateが示す要素ノードの値(文字コード値)と“2006年03月09日”の文字列の文字コード値を左から順に1文字ず

つ比較し、/root/dateが示す要素ノードの文字コード値が大きい場合に真になります。

注意

文字列比較の場合は、XML文書中の検索対象とする要素ノードの値、テキストノードの値または属性ノードの値と、キー

ワードで指定する文字列の桁数をそろえておく必要があります。

以下の場合、検索対象の文書は条件式と一致しません。

条件式

/root/date <= '2006年03月09日'

検索対象の文書

<date>2006年3月1日</date>

- 287 -

B.3.6 数値

数値による検索では、要素ノードの値、テキストノードの値または属性ノードの値から数値部分を抽出し、その値と指定さ

れた数値が一致する文書や大小関係にある文書を検索します。要素ノードの値、テキストノードの値または属性ノードの

値から数値部分を自動的に抽出するため、さまざまな書き方の数値の検索に利用できます。

数値の定義を以下の図に示します。

図B.12 数値の定義

数字

数字には、半角文字の0~9までを指定します。

数値比較

数値比較ではパス式に指定した要素ノードの値、テキスト式に指定したテキストノードの値または属性式に指定した属性

ノードの値から数値を抜き出し、キーワードに指定した数値との比較を行います。

・ パス式に指定した要素ノードの値、テキスト式に指定したテキストノードの値または属性式に指定した属性ノードの値

から 初に見つけた上記の形式の文字列を数値として扱います。

・ 整数部に出現するカンマは無視します。小数点が指定されている場合、それ以降 初に出現した数字以外の文字

の前までを小数部とみなします。

/doc/money = 1000

/doc/moneyが示す要素ノードの値から数値を抜き出し、1000と一致するものを真とします。

以下の例では、パス式に指定した要素ノードの値に、複数の数値を含みます。このような場合は、 初に見つけた数

値を値とみなします。

文書A

<money>ABC123,456@789</money>

123456とみなします。

- 288 -

文書B

<money>123456 7890123</money>

123456とみなします。

文書C

<money>1,500千円</money>

1500とみなします。

・ 検索データに有効な数値文字列が存在しない場合、その条件は偽となります。

以下の検索対象文字列の場合は、有効な数値文字列が存在しません。

<money></money>

注意

・ 数値比較ではパス式の 後に、パス演算子“//”は指定できません。

・ 数値比較ではパス式の 後に、パス要素“*”は指定できません。

・ 数値比較では属性式で指定する属性名に“*”は指定できません。

・ キーワードで指定する数値文字と、パス式で指定した要素ノードの値の桁数をそろえる必要はありません。

キーワード

/root/money > 1000

パス式で指定した要素ノードが以下の場合、条件に一致しているとみなします。

<money>1000.5</money>

・ 複数のXML文書間で要素ノードの値、テキストノードの値または属性ノードの値の整数部および小数部ともに桁数

をそろえる必要はありません。

文書A

<money>1000.1</money>

文書B

<money>2000.05</money>

文書C

<money>10.5</money>

- 289 -

B.3.7 互換形式

システム用動作環境ファイルの“ExtendedQuery”に“1(互換形式のクエリを使用する)”を指定すると、条件式には以下の

違いが発生します。

エスケープ文字

以下に示す文字を文字列に指定するにはエスケープ文字を付加します。エスケープ文字は“\”です。

たとえば、“abc\\”が指定された場合、“abc\”が検索対象文字列となります。

“\”が必要となる文字を以下の表に示します。

表B.4 エスケープ文字を付加する文字の一覧

文字 指定方法

. \.

\ \\

" \"

' \'

パターン

パターンの形式を以下の図に示します。

図B.13 パターンの形式

トリプルドット

トリプルドット“...”は、文字列の間に0文字以上の任意の文字を含む文字列を検索対象としたい場合に指定します。

B.3.8 フィルタ式

フィルタ式は、パス式で指定した要素ノードに閉じた範囲で、条件を指定する場合に使用します。

フィルタ式の定義を以下の図に示します。

- 290 -

図B.14 フィルタ式の定義

注意

・ フィルタ式には2つ以上の条件式が必要です。

・ フィルタ式の条件にフィルタ式を入れ子にできます。その場合の入れ子の階層は、8階層までです。

以下にフィルタ式を含んだ検索式の例を示します。

文書A

<root>

<company>

<employee

position="manager">

<name>tanaka</name>

<id>1000</id>

<skill

kind="0017">2005.1</skill>

<skill

kind="0023">2002.3</skill>

<skill

kind="0009">1998.8</skill>

</employee>

</company>

<company>

<employee

position="chief">

<name>suzuki</name>

<id>2000</id>

<skill

kind="0033">2004.7</skill>

<skill

kind="0012">2001.9</skill>

</employee>

</company>

</root>

文書B

<root>

<company>

<employee

- 291 -

position="chief">

<name>tanaka</name>

<id>2000</id>

<skill

kind="0002">2003.2</skill>

<skill

kind="0010">2002.3</skill>

</employee>

</company>

<company>

<employee

position="manager">

<name>suzuki</name>

<id>3000</id>

<skill

kind="0001">1995.2</skill>

</employee>

</company>

</root>

検索式1

/root/company/employee{/name = '^tanaka' AND /id = '1000'}

結果

文書Aは条件に該当し、文書Bは条件に該当しません。

“/root/company/employee”で1つの区切りと考えます。文書Aの場合は、中括弧の条件に該当するデータが存在しま

す。文書Bの場合は、中括弧の条件(/name = '^tanaka' AND /id = '1000')に該当するデータが存在しません。

検索式2

/root/company/employee{/@position = '^manager' AND /id = '3000'}

結果

文書Bは条件に該当し、文書Aは条件に該当しません。

検索式3

/root/company/employee/skill{/@kind = '^0001' AND /text() = '1995.2'}

結果

文書Bは条件に該当し、文書Aは条件に該当しません。

注意

・ フィルタ式にテキストノードを指定するときは、’/text()’を条件式の終端に付与します。

- 292 -

以下に、フィルタ式内にテキスト式を含んだ検索式の例を示します。

/root/company/employee/skill{/text() = '1995.2' AND /@kind = '0001'}

“/root/company/employee/skill”が示す要素ノードのテキストノードの値が“1995.2”であり、かつ、属性ノードの値

が“0001”である場合に真となります。

・ フィルタ式のパス式の 後の要素に、パス要素“*”は指定できません。必ず要素名を指定してください。

以下の場合、パス式の 後のパス要素に“*”を指定しているので、エラーになります。

/root//company/*{/name = '^tanaka' AND /id = '1000'}

B.4 リターン式

リターン式とは、ある検索条件を満たしたXML文書の中から、特定の要素だけを抜き出したり、集計したりするためにデー

タの取出し形式を指定する記述です。

リターン式は、集計を行う場合と行わない場合で書式が異なります。

B.4.1 集計を行わない場合の書式

レコード全体を返信させる場合は、リターン式に“/”を指定します。

また、空文字 “”を指定しても、レコード全体を返信します。

図B.15 集計を行わない場合の書式

- 293 -

特定の要素ノードまたは要素値を返信する場合は、パス式またはテキスト式を記述します。特定の属性値を返信する場

合は、属性式を記述します。要素値または属性値を変換する場合は、単一行関数指定を指定します。上記の定義に示

すように“,”で区切って複数指定することができます。

リターン項目について、以下に示します。

・ パス式

・ テキスト式

・ 属性式

・ 単一行関数指定

パス式

パス式は、返信する要素ノードを指定するために使用します。パス式で指定した要素ノードの値をXML形式で返信しま

す。

・ 後にパス要素“*”は指定できません。

・ 後にパス演算子“//”は指定できません。

パス式の詳細な書式は、“B.2.1 パス式”を参照してください。

/root/company/name

テキスト式

テキスト式は、返信するテキストノードを指定するために使用します。テキスト式で指定したテキストノードの値(文字列)を、テキスト形式で返信します。

・ パス式の 後にパス要素“*”は指定できません。

・ パス式の 後にパス演算子“//”は指定できません。

テキスト式の詳細な書式は、“B.2.2 テキスト式”を参照してください。

/root/company/name/text()

属性式

属性式は、返信する属性ノードを指定するために使用します。属性式で指定した属性ノードの値を、テキスト形式で返信

します。

・ パス式の 後にパス要素“*”は指定できません。

- 294 -

・ パス式の 後にパス演算子“//”は指定できません。

・ 属性式で指定する属性名に“*”は指定できません。

属性式の詳細な書式は、“B.2.3 属性式”を参照してください。

/root/company/employee/@position

単一行関数指定

単一行関数指定は、引数のテキスト式または属性式が示す値を関数の機能に従って変換するために使用します。単一

行関数指定の結果を、テキスト形式で返信します。

単一行関数指定の詳細な書式は、“B.2.4 単一行関数指定”を参照してください。

例1

rlen(/root/company/name/text(),10)

例2

rlen(/root/company/employee/@position,10)

B.4.2 集計を行わない場合のリターン式指定例

以下にリターン式の例を示します。

文書

<doc>

<companyname>fujitsu</companyname>

<employee position="manager">

<name>tanaka</name>

<id>2000</id>

<age>30才</age>

</employee>

</doc>

返信される形式ごとの指定例を以下に示します。

・ XML形式の返却指定

・ テキスト形式の返却指定

XML形式の返却指定

リターン項目にパス式を指定した場合、該当する要素ノードをXML形式で返信します。

- 295 -

リターン項目に複数のパス式を指定した場合、指定した順に要素を返信します。

文書ごとにルートタグで囲んで返信します。

該当する要素が存在しない場合、要素は返信されません。

例1

リターン式

/

結果:レコード全体を返信します。

<doc>

<companyname>fujitsu</companyname>

<employee position="manager">

<name>tanaka</name>

<id>2000</id>

<age>30才</age>

</employee>

</doc>

例2

リターン式

/doc/employee/name

結果

<doc><name>tanaka</name></doc>

例3

リターン式

/doc/employee

結果

<doc><employee position="manager"><name>tanaka</name><id>2000</id><age>30才</age></employee></doc>

例4

リターン式

/doc/companyname,/doc/employee/id

結果

- 296 -

<doc><companyname>fujitsu</companyname><id>2000</id></doc>

注意

・ リターン式にパス式を記述する場合は、すべてのリターン項目がパス式である必要があります。テキスト式、属性式ま

たは単一行関数指定と混在して指定できません。

・ リターン項目に複数の要素が該当するような指定(複数のパス式指定や、“//”,“*”の指定)をした場合、以下のよう

に、取り出された各要素の対応関係をアプリケーションで判断できなくなります。このような場合、XML文書全体を取

り出すか、リターン項目に1つの要素を特定する指定にして取り出してください。

例1

一部の要素が存在しない場合、どの要素が存在しないのか判断できません。

この例では、/doc/president/nameが存在しないため、/doc/employee/nameだけが返却されます。このように、返却され

た要素が/doc/president/nameなのか、/doc/employee/nameなのか判断できません。

リターン式

/doc/president/name,/doc/employee/name

結果

<doc><name>tanaka</name></doc>

例2

取り出された要素のパスが判断できません。

この例では、どちらのname要素が、/doc/president/nameなのか/doc/employee/nameなのか判断できません。

文書

以下のXML文書がヒットしたものとして説明します。

<doc>

<companyname>fujitsu</

companyname>

<president>

<name>kurokawa</name>

<id>1849</id>

<age>61才</age>

</president>

<employee>

<name>tanaka</name>

<id>2000</id>

<age>30才</age>

</employee>

</doc>

リターン式

//name

- 297 -

結果

<doc><name>kurokawa</name><name>tanaka</name></doc>

テキスト形式の返却指定

リターン項目にテキスト式、属性式または単一行関数指定を指定した場合、該当するテキスト式、属性式または単一行

関数指定の結果を文字列で返信します。

リターン項目に複数のパス式を指定した場合、指定した順に文字列を返信します。

該当する要素が存在しない場合は、空エントリとして区切り文字で区切られます。

・ Java APIの場合

- getStringメソッドまたはgetStreamメソッドで検索した結果を取り出す場合

- 各リターン項目で返す値は、 “,”で区切られます。

- 指定された要素が1文書内に複数存在する場合は、それぞれの要素が“|”で区切られます。

- getStringArrayメソッドで検索した結果を取り出す場合

- リターン項目単位にStringの2次元配列として返却します。上位配列の要素数は、リターン式の数です。下位

配列の要素数は、指定されたリターン式に該当するデータが1文書内に存在する数です。

・ .NET APIの場合

- DataプロパティまたはgetStreamメソッドで検索した結果を取り出す場合

- 各リターン項目で返す値は、16進数の0x0001で区切られます。

- 指定された要素が1文書内に複数存在する場合は、それぞれの要素が16進数の0x0002で区切られます。

- getDividedDataメソッドで検索した結果を取り出す場合

- リターン項目単位にStringのジャグ配列として返却します。上位配列の要素数は、リターン式の数です。下位

配列の要素数は、指定されたリターン式に該当するデータが1文書内に存在する数です。

・ C APIの場合

- 各リターン項目で返す値は、文字コード“\001”の文字で区切られます。

- 指定した要素が1文書内に複数存在する場合は、それぞれの要素が文字コード“\002”の文字で区切られます。

- 返却される値の 後には必ず“\001”の文字が付加されます。

以下の例では、文字コード“\001”の文字は“\1”、文字コード“\002”の文字は“\2”と表現します。

例1 リターン項目の例

リターン式

/doc/employee/name/text()

結果

Java APIの場合

- 298 -

tanaka

.NET APIの場合

tanaka

C APIの場合

tanaka \1

例2 リターン項目に属性式を指定した場合の例

リターン式

/doc/employee/@position

結果

Java APIの場合

manager

.NET APIの場合

manager

C APIの場合

manager \1

例3 リターン項目にテキスト式、単一行関数指定、属性式を混在した場合の例

リターン式

/doc/employee/name/text(),val(/doc/employee/age/text()),/doc/employee/@position

結果

Java APIの場合

tanaka,30,manager

.NET APIの場合

tanaka \1 30 \1 manager

C APIの場合

tanaka \1 30 \1 manager \1

注意

リターン式に複数の要素が該当するような指定(複数のパス式指定や、“//”,“*”の指定など)をした場合、取り出された各

要素の対応関係をアプリケーションで判断できなくなります。

- 299 -

以下の文書では、suzukiには“age要素ノード”がないため、3つ目のリターン項目に対する結果の“30”が、tanakaのデータなのか、suzukiのデータなのかわかりません。

文書

<doc>

<companyname>fujitsu</companyname>

<employee>

<name>tanaka</name>

<id>2000</id>

<age>30才</age>

</employee>

<employee>

<name>suzuki</name>

<id>1000</id>

</employee>

</doc>

リターン式

/doc/companyname/text(),/doc/employee/name/text(),val(/doc/employee/age/text())

結果

Java APIの場合

fujitsu,tanaka|suzuki,30

.NETの場合

fujitsu \1 tanaka \2 suzuki \1 30

C APIの場合

fujitsu \1 tanaka \2 suzuki \1 30 \1

B.4.3 集計を行う場合の書式

集計を行う場合は、テキスト式、属性式、単一行関数指定または集合関数指定をリターン式に指定します。“,”で区切っ

て複数指定することができます。1つ以上の集合関数指定を含む必要があります。

集計を行う場合にはソート式を指定する必要があります。

ソート式の詳細は、“B.5 ソート式”を参照してください。

集計は、ソート式に指定したテキスト式、属性式または単一行関数指定をキーとしてソートを実施して、ソートキーが同じものを

1つのグループとみなして集合関数指定の結果を求めます。

- 300 -

図B.16 集計を行う場合の書式

リターン項目について、以下に示します。

・ テキスト式

・ 属性式

・ 単一行関数指定

・ 集合関数指定

テキスト式

テキスト式は、集計のキーを取り出す場合に指定します。

テキスト式の詳細な書式は、“B.2.2 テキスト式”を参照してください。

・ テキスト式には、ソート式に指定したテキスト式のみ指定できます。集計のキーとして使用した値を返却します。

/doc/company/employee/dept/text()

属性式

属性式は、集計のキーを取り出す場合に指定します。

属性式の詳細な書式は、“B.2.3 属性式”を参照してください。

・ 属性式で指定する属性名に“*”は指定できません。

・ 属性式には、ソート式に指定した属性式のみ指定できます。集計のキーとして使用した値を返却します。

- 301 -

/doc/company/employee/@position

単一行関数指定

単一行関数指定は、集計のキーとして単一行関数指定を使用したとき、その値を取り出す場合に指定します。

単一行関数指定の詳細な書式は、“B.2.4 単一行関数指定”を参照してください。

・ 単一行関数指定には、ソート式に指定した単一行関数指定のみ指定できます。集計のキーとして使用した値を返却

します。

例1

rlen(/doc/company/employee/name/text(),3)

例2

rlen(/doc/company/employee/@position,3)

集合関数指定

集合関数指定は、引数のテキスト式または属性式で指定した値を集計します。

以下に集合関数指定の定義を以下の図に示します。

図B.17 集合関数指定の定義

・ テキスト式で指定したテキストノードまたは属性式で指定した属性ノードが文書中にない場合は、集計の対象に含め

ません。

・ 集合関数の引数となるテキスト式または属性式が示す値がない場合は、集計の対象に含めません。

- 302 -

・ avg関数、sum関数、max関数、min関数は、テキスト式または属性式で指定した文字列から数値を抜き出して、その

数値を集計します。テキスト式または属性式で指定した文字列から数値を抜き出す規則は、単一行関数指定のval関数と同じです。

・ 集合関数の結果は、整数部が18桁を超えるとエラーとなります。集計の途中結果の整数部が18桁を超えてもエラー

にはなりません。

avg関数

テキスト式または属性式で示す文字列から数値のみを抜き出し、その数値の平均を求めます。

sum関数

テキスト式または属性式で示す文字列から数値のみを抜き出し、その数値の合計を求めます。

max関数

テキスト式または属性式で示す文字列から数値のみを抜き出し、その数値の 大を求めます。

min関数

テキスト式または属性式で示す文字列から数値のみを抜き出し、その数値の 小を求めます。

count関数

テキスト式または属性式で指定した要素の件数を求めます。

注意

・ テキスト式または属性式中にパス演算子“//”は指定できません。

・ テキスト式または属性式中にパス要素“*”は指定できません。

B.4.4 集計を行う場合のリターン式指定例

以下にリターン式の例を示します。

文書A

<doc>

<companyname>fujitsu</companyname>

<employee position="manager">

<name>tanaka</name>

<id>2000</id>

<age>30才</age>

<comment></comment>

</employee>

</doc>

- 303 -

文書B

<doc>

<companyname>fujitsu</companyname>

<employee position="chief">

<name>suzuki</name>

<id>1000</id>

<age>35才</age>

<comment>team leader</comment>

</employee>

</doc>

例1 avg関数の例

リターン式

avg(/doc/employee/age/text())

ソート式

/doc/companyname/text()

結果

32.5

例2 count関数に属性式を指定した例

リターン式

count(/doc/employee/@position)

ソート式

/doc/employee/text()

結果

2

複数のリターン項目を指定した場合は、結果として返す各リターン項目の値が区切り文字で区切られます。

・ Java APIの場合

- getStringメソッドまたはgetStreamメソッドで検索した結果を取り出す場合

- 各リターン項目で返す値は、“,”で区切られます。

- getStringArrayメソッドで検索した結果を取り出す場合

- リターン項目単位にStringの2次元配列として返却します。

- 上位配列の要素数は、リターン式の数です。下位配列の要素数は、1です。

- 304 -

・ .NET APIの場合

- DataプロパティまたはgetStreamメソッドで検索した結果を取り出す場合

- 各リターン項目で返す値は、16進数の0x0001で区切られます。

- getDividedDataメソッドで検索した結果を取り出す場合

- リターン項目単位にStringのジャグ配列として返却します。

- 上位配列の要素数は、リターン式の数です。下位配列の要素数は、1です。

・ C APIの場合

- 各リターン項目で返す値は、文字コード“\001”の文字で区切られます。

- 返却される値の 後には必ず“\001”の文字が付加されます。

例3 複数のリターン項目を指定した場合の例

リターン式

avg(/doc/employee/age/text()),count(/doc/employee/name/text())

ソート式

/doc/companyname/text()

結果

32.5,2

注意

テキスト式で指定したテキストノードまたは属性式で指定した属性ノードが同一文書中に複数存在する場合は、先頭の

テキストノードの値または属性ノードの値を利用します。

以下の場合、avg関数の引数“/student/subject/test/score/text()”の値は、文書Aは集計の対象外、文書Bは80、文書Cは0として扱います。

文書A

<student>

<name>tanaka</name>

<subject>

<subjectname>science</subjectname>

</subject>

<name>tanaka</name>

</student>

文書B

<student>

<name>suzuki</name>

<subject>

- 305 -

<subjectname>science</subjectname>

<test>

<date>2006年01月12日</date>

<score>80</score>

</test>

<test>

<date>2005年12月08日</date>

<score>70</score>

</test>

</subject>

</student>

文書C

<student>

<name>satou</name>

<subject>

<subjectname>science</subjectname>

<test>

<date>2006年01月12日</date>

<score>--</score>

</test>

</subject>

</student>

リターン式

avg(/student/subject/test/score/text())

ソート式

/student/subject/subjectname/text()

結果

40

B.5 ソート式

ソート式は、検索結果のソートまたは集計を行う場合に、ソートまたは集計のキーを指定します。

B.5.1 ソート式の書式

ソート式には、テキスト式、属性式または単一行関数指定が指定できます。それぞれに対して取出し順序(昇順または降

順)を指定できます。“,”で区切って複数指定することができます。

ソート式の定義を以下の図に示します。

- 306 -

図B.18 ソート式の定義

注意

ソート式には、キー指定を8個まで指定できます。

以下にソート式で定義する項目について説明します。

・ テキスト式

・ 単一行関数指定

・ 属性式

・ DESC

・ ソートを行う場合

・ 集計を行う場合

テキスト式

テキスト式は、ソートを行うキーとなるテキストノードを指定します。

テキスト式の詳細については、“B.2.2 テキスト式”を参照してください。

・ テキスト式中にパス演算子“//”は指定できません。

・ テキスト式中にパス要素“*”は指定できません。

/company/employee/dept/text()

単一行関数指定

単一行関数指定は、単一行関数の結果でソートを行いたい場合に指定します。

- 307 -

単一行関数指定の詳細については、“B.2.4 単一行関数指定”を参照してください。

例1

rlen(/company/name/text(),16)

例2

rlen(/company/employee/@position,16)

属性式

属性式は、ソートを行うキーとなる属性ノードを指定します。

属性式の詳細については、“B.2.3 属性式”を参照してください。

・ 属性式中にパス演算子“//”は指定できません。

・ 属性式中にパス要素“*”は指定できません。

・ 属性式で指定する属性名に“*”は指定できません。

/company/employee/@position

DESC

結果を降順で返却する場合に指定します。省略した場合は昇順に返却されます。

/company/employee/dept/text() DESC

ソートを行う場合

テキスト式で行う場合

- テキスト式を指定すると、テキスト式が示すテキストノードが持つ文字列でソートを行います。

- テキスト式で指定したテキストノードが持つ文字列は、左端から20バイトが有効です。有効長を変更したい場合は

rlen関数を利用して文字数を変更します。指定できる文字数は1~128です。

- テキスト式で指定したテキストノードが持つ文字列に含まれる空白、全角空白、改行コードおよびタブは有効な値

として区別します。

- テキスト式で指定したテキストノードが同一文書中に複数存在する場合は、先頭のテキストノードを利用します。

- テキスト式で指定したテキストノードが文書中にない場合は、取出し順序の指定にかかわらず、 後に返却しま

す。

- 数値としてソートしたい場合は、val関数を指定します。val関数を指定すると数値としてデータを扱うため、桁合わ

せの必要がありません。

属性式で行う場合

- 属性式を指定すると、属性式が示す属性ノードが持つ文字列でソートを行います。

- 308 -

- 属性式で指定した属性ノードが持つ文字列は、左端から20バイトが有効です。有効長を変更したい場合はrlen関数を利用して文字数を変更します。指定できる文字数は1~128です。

- 属性式で指定した属性ノードが持つ文字列に含まれる空白、全角空白、改行コードおよびタブは有効な値として

区別します。

- 属性式で指定した属性ノードが同一文書中に複数存在する場合は、先頭の属性ノードを利用します。

- 属性式で指定した属性ノードが文書中にない場合は、取出し順序の指定にかかわらず、 後に返却します。

- 数値としてソートしたい場合は、val関数を指定します。val関数を指定すると数値としてデータを扱うため、桁合わ

せの必要がありません。

以下に示す2つの文書を文字列としてソートすると“100”よりも“20”の方が大きくなります。ソート式にval(/value/text())と指定すると、100および20といった数値でソートするため、20よりも100の方が大きくなります。

<value>100</value>

<value>20</value>

集計を行う場合

テキスト式の場合

- テキスト式を指定すると、テキスト式が示すテキストノードが持つ文字列が同じ文書を、1つのグループとして扱い

ます。

- テキスト式で指定したテキストノードが持つ文字列は、左端から20バイトが有効です。有効長を変更したい場合

は、rlen関数を利用して文字数を変更します。指定できる文字数は1~128です。

- テキスト式で指定したテキストノードが持つ文字列に含まれる空白、全角空白、改行コードおよびタブは有効な値

として区別します。

- テキスト式で指定したテキストノードが同一文書中に複数存在する場合は、先頭のテキストノードを利用します。

- テキスト式で指定したテキストノードが文書中にない場合は、値のないグループキーを持つ1つのグループとして

扱います。

- 数値をキーとして集計したい場合は、val関数を指定します。val関数を指定すると数値としてデータを扱うため、

文字列に数値以外を含む場合や、小数点以下の位取りが異なる場合でも、数値が同じものは同じグループとし

て扱うことができます。

属性式の場合

- 属性式を指定すると、属性式が示す属性ノードが持つ文字列が同じ文書を、1つのグループとして扱います。

- 属性式で指定した属性ノードが持つ文字列は、左端から20バイトが有効です。有効長を変更したい場合は、rlen関数を利用して文字数を変更します。指定できる文字数は1~128です。

- 属性式で指定した属性ノードが持つ文字列に含まれる空白、全角空白、改行コードおよびタブは有効な値として

区別します。

- 属性式で指定した属性ノードが同一文書中に複数存在する場合は、先頭の属性ノードを利用します。

- 属性式で指定した属性ノードが文書中にない場合は、値のないグループキーを持つ1つのグループとして扱い

ます。

- 309 -

- 数値をキーとして集計したい場合は、val関数を指定します。val関数を指定すると数値としてデータを扱うため、

文字列に数値以外を含む場合や、小数点以下の位取りが異なる場合でも、数値が同じものは同じグループとし

て扱うことができます。

以下に示す2つの文書を/doc/key/text()をキーとして集計すると、それぞれ別グループになります。ソート式にval(/doc/key/text())と指定すると、どちらも1000という数値として扱うため同じグループとして集計します。

<doc>

<key>net1000.00g</key>

<ship>2000個</ship>

</doc>

<doc>

<key>1,000g</key>

<ship>1000個</ship>

</doc>

B.5.2 ソート式の指定例

以下にソートまたは集計を行う場合のソート式の例を示します。

文書A

<employee>

<name>tanaka</name><age>33</age><dept id="0001">sales</dept>

</employee>

文書B

<employee>

<name>suzuki</name><age>30</age><dept id="0002">general affairs</

dept>

</employee>

文書C

<employee>

<name>satou</name><age>22</age><dept id="0001">sales</dept>

</employee>

- 310 -

文書D

<employee>

<name>yamada</name><age>56</age><dept id="0001">sales</dept>

</employee>

文書E

<employee>

<name>itou</name><dept id="0002">general affairs</dept>

</employee>

文書F

<employee>

<name>nakamura</name><age>42</age><dept id="0002">general affairs</

dept>

</employee>

ソートを行う場合の記述例

例1

リターン式

/employee/name/text(),/employee/age/text()

ソート式

val(/employee/age/text())

結果

Java APIの場合

satou,22

suzuki,30

tanaka,33

nakamura,42

yamada,56

itou,

.NET APIの場合

satou \1 22

- 311 -

suzuki \1 30

tanaka \1 33

nakamura \1 42

yamada \1 56

itou \1

C APIの場合

satou \1 22 \1

suzuki \1 30 \1

tanaka \1 33 \1

nakamura \1 42 \1

yamada \1 56 \1

itou \1 \1

例2

リターン式

/employee/name,/employee/age

ソート式

val(/employee/age/text())

結果

<employee><name>satou</name><age>22</age></employee>

<employee><name>suzuki</name><age>30</age></employee>

<employee><name>tanaka</name><age>33</age></employee>

<employee><name>nakamura</name><age>42</age></employee>

<employee><name>yamada</name><age>56</age></employee>

<employee><name>itou</name></employee>

例3

リターン式

/employee/name/text(),/employee/age/text(),val(/employee/dept/@id)

ソート式

- 312 -

val(/employee/dept/@id),val(/employee/age/text())

結果

satou,22,0001

tanaka,33,0001

yamada,56,0001

suzuki,30,0002

nakamura,42,0002

itou,,0002

集計を行う場合の記述例

例1

リターン式

avg(/employee/age/text()),count(/employee/age/text()),/employee/dept/text()

ソート式

/employee/dept/text()

結果

Java APIの場合

36,2,general affairs

37,3,sales

.NET APIの場合

36 \1 2 \1 general affairs

37 \1 3 \1 sales

C APIの場合

36 \1 2 \1 general affairs \1

37 \1 3 \1 sales \1

例2

リターン式

avg(/employee/age/text()),count(/employee/age/text()),/employee/dept/@id

- 313 -

ソート式

/employee/dept/@id

結果

Java APIの場合

37,3,0001

36,2,0002

.NET APIの場合

37 \1 3 \1 0001

36 \1 2 \1 0002

C APIの場合

37 \1 3 \1 0001 \1

36 \1 2 \1 0002 \1

- 314 -

付録C 定量値

Shunsakuのアプリケーション開発に関連する定量値について説明します。

C.1 検索式およびリターン式の定量値

検索式およびリターン式に関連する定量値について以下の表に示します。

表C.1 検索式およびリターン式に関連する定量値

項目 値

検索式の長さ 1,048,575バイト以内(\0は含まない)

リターン式の長さ 1,048,575バイト以内(\0は含まない)

C.2 ソート依頼における定量値

ソート依頼に関連する定量値について以下の表に示します。

表C.2 ソート依頼に関連する定量値

項目 値 備考

キー指定数 大8個 -

ソート式 65,535バイト以内(\0含まない)

ソートキーの合計長 1~2,000バイト ソートキーの合計長は、各キー指定

のソートキーの長さの合計になりま

す。

ソートキーの合計長による返信可能

件数については、“ソートキーの合計

長と返信可能件数の関係”を参照し

てください。

キー指定にrlen関数を指定した場合

の文字数

1~128 rlen関数の結果の文字列の長さにつ

いては、“表C.3 文字コードとrlen関数の結果の文字列の長さ”を参照し

てください。

返信可能件数 100~1,000レコード ソートキーの合計長が200バイト以内

の場合、上位1,000件に該当するレ

コードを返信できます。

全体のソートキー長が200バイトを超

える場合は、“ソートキーの合計長と

返信可能件数の関係”に示す件数

のレコードが返信できます。

ソートキーの合計長と返信可能件数の関係

ソートキーの合計長は、各キー指定のソートキーの長さの合計です。各ソートキーの長さは、キー指定の指定形式によ

り、以下の値になります。

- 315 -

キー指定の指定形式 ソートキーの長さ 備考

val関数 16バイト -

テキスト式 20バイト 先頭20バイトをキーとしてソー

トします。20バイトを超える文

字列でソートしたい場合は、

ソート式のキー指定にrlen関数を指定します。rlen関数を

指定することにより、128文字

までの長さの文字列をキーと

してソートすることができます。

rlen関数 rlen関数の結果の文字列の

長さについては、“表C.3 文字コードとrlen関数の結果の

文字列の長さ”を参照してく

ださい。

rlen関数の結果の文字列の長さは、ディレクタデータの文字コードにより、1文字当たりの長さを以下の値として計算しま

す。

表C.3 文字コードとrlen関数の結果の文字列の長さ

文字コード 1文字当たりのバイト長 例

UTF-8 4バイト rlen(/root/name/text(),50)

200バイトとして扱いますGB18030

SHIFT-JIS 2バイト rlen(/root/name/text(),50)

100バイトとして扱いますGB2312

big5

KSC5601

EUC 3バイト rlen(/root/name/text(),50)

150バイトとして扱います

ソートキーの合計長により、Shunsakuが返信できるレコード件数は以下のようになります。

表C.4 ソートキーの合計長とShunsakuが返信できる件数

ソートキーの合計長(バイト) 返信できる件数(件)

1~200 1,000

201~300 700

301~400 500

401~500 400

501~700 300

701~1,000 200

1,001~2,000 100

- 316 -

C.3 集計依頼における定量値

集計依頼に関連する定量値について以下の表に示します。

項目 値 備考

キー指定数 大8個 -

ソート式 65,535バイト以内(\0含まない)

グループキーの合計

1~2,000バイト グループキーの合計長は、各キー指

定のグループキーの長さの合計にな

ります。

各キー指定のグループキーの長さ

は、“グループキーの合計長と返信可

能件数の関係”を参照してください。

キー指定にrlen関数を

指定した場合の文字

1~128 rlen関数の結果の文字列の長さにつ

いては、“表C.5 文字コードとrlen関数

の結果の文字列の長さ”を参照してく

ださい。

返信可能件数 100~1,000レコード グループキーの合計長が200バイト以

内の場合、上位1,000グループに該当

するレコードを返信できます。

全体のグループキー長が200バイトを

超える場合は、“グループキーの合計

長と返信可能件数の関係”に示す件

数のグループが返信できます。

グループキーの合計長と返信可能件数の関係

グループキーの合計長は、各キー指定のグループキーの長さの合計です。各グループキーの長さは、キー指定の指定

形式により、以下の値になります。

キー指定の指定形式 グループキーの長さ 備考

val関数 16バイト -

テキスト式 20バイト 先頭20バイトをキーとしてグ

ループ化します。20バイトを

超える文字列でグループ化

したい場合は、ソート式の

キー指定にrlen関数を指定し

ます。rlen関数を指定するこ

とにより、128文字までの長さ

の文字列をキーとしてグルー

プ化することができます。

rlen関数 rlen関数の結果の文字列の

長さについては、“表C.5 文字コードとrlen関数の結果の

文字列の長さ”を参照してく

ださい。

- 317 -

rlen関数の結果の文字列の長さは、ディレクタデータの文字コードにより、1文字当たりの長さを以下の値として計算しま

す。

表C.5 文字コードとrlen関数の結果の文字列の長さ

文字コード 1文字当たりのバイト長 例

UTF-8 4バイト rlen(/root/name/text(),50)

200バイトとして扱いますGB18030

SHIFT-JIS 2バイト rlen(/root/name/text(),50)

100バイトとして扱いますGB2312

big5

KSC5601

EUC 3バイト rlen(/root/name/text(),50)

150バイトとして扱います

グループキーの合計長により、Shunsakuが返信できるグループ数は以下のようになります。

表C.6 グループキーの長さとShunsakuが返信できるグループ数

グループキーの長さ(バイト) 返信できるグループ数(件)

1~200 1,000

201~300 700

301~400 500

401~500 400

501~700 300

701~1,000 200

1,001~2,000 100

C.4 ダイレクトアクセスにおける定量値

ダイレクトアクセスに関連する定量値について以下の表に示します。

項目 値

ダイレクトアクセスキー名 32バイト以内(半角英数字)

ダイレクトアクセスキー定義ファイル名

の長さ

32バイト以内(注)

ダイレクトアクセスキー定義ファイル1行の長さ

4095バイト以内(改行を含まない)

ダイレクトアクセスキー定義ファイルに

書けるダイレクトアクセスキー名の数

無制限

- 318 -

項目 値

1つのダイレクトアクセスキー名の定義

に書けるテキスト式または属性式数

大64個

ダイレクトアクセスキーの長さ 32,768バイト以内

注意

・ ダイレクトアクセスキー定義ファイル名には、全角文字は指定できません。

・ ダイレクトアクセスキー定義ファイル名に空白または“#”を含む場合は、フォルダ名全体を二重引用符(“ “)で囲んで

ください。

・ ダイレクトアクセスキー定義ファイル名には、空白または“#”を含むことはできません。

- 319 -

付録D 資源の見積り

アプリケーションでデータを検索、更新する場合の資源の見積りについて説明します。

D.1 Java APIを使用した場合のローカルメモリ量の見積り

アプリケーション実行時に、ShunsakuのAPIが使用するメモリ量の概算は、以下のように見積もってください。

Java API使用時のメモリ使用量の見積り式について以下の表に示します。

表D.1 JavaAPI使用時におけるメモリ使用量の見積り式の一覧

アプリケーションか

らの利用方法

変動要因 見積り式(キロバイト)

データの検索 ・取得する1件のXML形式

またはテキスト形式の 大

データ長

・1画面に表示する件数

・多重度

2.1×取得する1件のXML形式ま

たはテキスト形式の 大データ長

(キロバイト)×1画面に表示する件

数(件)×多重度(注)

データの更新 ・追加する1件のXML形式

の 大データ長

・1回のexecuteInsertで追

加する件数

・多重度

4.8×追加する1件のXML形式の

大データ長(キロバイト)×1回の

executeInsertで追加する件数

(件)×多重度

注意

検索の実行から結果の取得までのメモリ使用量です。検索終了後もResultSetオブジェクトを保持しておき、次のデータ

参照を実行する場合は、保持しているデータ長×件数分のメモリが追加で必要となります。

見積り例

Java APIを使用した場合のローカルメモリ量の見積り例を以下に示します。

変動要因が以下の場合

・ 取得する1件のXML形式またはテキスト形式の 大データ長:1キロバイト

・ 追加する一件のXML形式の 大データ長:1キロバイト

・ 1画面に表示する件数:100件

・ 1回のexecuteInsertで追加する件数:100件

・ 多重度:100

データの検索

2.1 × 1 × 100 × 100 = 21000 Kバイト (約20メガバイト)

データの更新

- 320 -

4.8 × 1 × 100 × 100 = 48000 Kバイト (約50メガバイト)

Java APIで使用するメモリは、すべてJavaVMが管理するヒープ領域と呼ばれる領域を使用します。算出したメモリ使用

量に合わせて、Javaのヒープサイズを変更してください。ヒープサイズの変更方法については、以下を参照してください。

ヒープサイズの変更方法

Javaヒープサイズの初期値(J2SDK1.3以降では、初期サイズ:2メガバイト、 大サイズ:64メガバイト)はあらかじめ決まっ

ています。Javaコマンドのオプションで指定することにより変更することができます。オプションの説明を以下の表に示しま

す。

表D.2 Javaコマンドのオプションの一覧

項目 オプション 説明

初期サイズ -Xms Javaヒープサイズの初期サイズをバイト数で指定します。

指定する値は、1メガバイトより大きい1024の倍数にしなけ

ればなりません。キロバイトを指定するには、文字“k(小文

字)”または“K(大文字)”を追加します。 メガバイトを指定

する場合は、文字“m(小文字)”または“M(大文字)”を追

加します。既定値は2メガバイトです。

大サイズ -Xmx Javaヒープサイズの 大サイズをバイト数で指定します。

指定する値は、2Mバイトより大きい1024の倍数にしなけ

ればなりません。キロバイトを指定するには、文字“k(小文

字)”または“K(大文字)”を追加します。メガバイトを指定

する場合は、文字“m(小文字)”または“M(大文字)”を追

加します。既定値は64メガバイトです。

Javaコマンドの実行例を以下に示します。

Javaアプリケーション(AppClass)のJavaヒープサイズの 大サイズを128メガバイトに設定する場合

Java -Xmx128m AppClass

D.2 .NET APIを使用した場合のローカルメモリ量の見積り

アプリケーション実行時に、ShunsakuのAPIが使用するメモリ量の概算は、以下のように見積もってください。

.NET API使用時のメモリ使用量の見積り式について以下の表に示します。

- 321 -

表D.3 .NET API使用時におけるメモリ使用量の一覧

アプリケーションからの利用方

変動要因 見積り式(キロバイト)

データの参照 ・ 取得する1件のXML形式

またはテキスト形式の 大

データ長

・ 1画面に表示する件数

・ 多重度

3×取得する1件のXML形式

またはテキスト形式の 大

データ長(キロバイト)×1画面

に表示する件数(件)×多重度

データの更新 ・ 追加する1件のXML形式

の 大データ長

・ 1回のShunInsertで追加す

る件数

・ 多重度

3×追加する1件のXML形式

の 大データ長(キロバイト)×1回のShunInsertで追加する

件数(件)×多重度

見積り例

.NET APIを使用した場合のローカルメモリ量の見積り例を以下に示します。

変動要因が以下の場合

・ 取得する一件のXML型式またはテキスト型式の 大データ長:1キロバイト

・ 追加する一件のXML型式の 大データ長:1キロバイト

・ 1画面に表示する件数:100件

・ 1回のShunInsertで追加する件数:100件

・ 多重度:100

データの参照

3 × 100 × 100 = 30000 Kバイト (約30メガバイト)

データの更新

3 × 100 × 100 = 30000 Kバイト (約30メガバイト)

注意

上記のほかに、アプリケーションで獲得するローカルメモリが必要です。

D.3 C APIを使用した場合のローカルメモリ量の見積り

アプリケーション実行時に、ShunsakuのAPIが使用するメモリ量の概算は、以下のように見積もってください。

C API使用時のメモリ使用量の見積り式について以下の表に示します。

- 322 -

表D.4 C API使用時におけるメモリ使用量の一覧

アプリケーションからの

利用方法

変動要因 見積り式(キロバイト)

データの参照 ・取得する1件のXML形式またはテ

キスト形式の 大データ長

・1画面に表示する件数

・多重度

取得する1件のXML形式または

テキスト形式の 大データ長(キロバイト)×1画面に表示する件数

(件)×多重度

データの更新 ・追加する1件のXML形式の 大

データ長

・1回のShunInsertで追加する件数

・多重度

追加する1件のXML形式の 大

データ長(キロバイト)×1回の

ShunInsertで追加する件数

(件)×多重度

API スナップを利用す

なし 2250

見積り例

C APIを使用した場合のローカルメモリ量の見積り例を以下に示します。

変動要因が以下の場合

・ 取得する一件のXML型式またはテキスト型式の 大データ長:1キロバイト

・ 追加する一件のXML型式の 大データ長:1キロバイト

・ 1画面に表示する件数:100件

・ 1回のShunInsertで追加する件数:100件

・ 多重度:100

データの参照

1 × 100 × 100 = 10000 Kバイト (約10メガバイト)

データの更新

1 × 100 × 100 = 10000 Kバイト (約10メガバイト)

注意

上記のほかに、アプリケーションで獲得するローカルメモリが必要です。

- 323 -

付録E XML文書についての留意事項

Shunsakuに格納するXML文書および検索時の留意事項について説明します。

E.1 XML文書の書式

Shunsakuに格納するXML文書は、整形式のXML文書(well-formed XML document)です。

整形式のXML文書とは、XML文書の仕様に準拠するための以下の基準を満たした文書のことです。また、XML宣言や

DTDなどの前書きがない、本文だけのXML文書も格納することができます。

・ ルート要素が1つだけ存在する

・ 開始タグがあれば、必ず終了タグが存在する

・ タグの入れ子が正しく記述されている

Shunsakuでは、“<”で始まる文字をルート要素の開始タグとみなし、対応する終了タグまでをXML文書とします。XML文書内では空白、タグおよび改行などを含めたそのままの形式で扱います。

図E.1 XML文書の書式

上記の例では、“<!—”のコメントから、ルート要素の終了タグである“</doc>”までをXML文書とします。終了タグのあとの

コメントはXML文書には含まれません。また、終了タグのあとに改行がついている場合、改行もXML文書には含まれま

せん。

E.2 データベース上のXML文書

Symfoware ServerにXML文書を格納し、Shunsakuと連携する場合は、データベース上にBLOB型の列としてXML文書

を格納しておく必要があります。

このデータベース上の1つのXML文書が、Shunsakuでは1レコードとして管理されます。

- 324 -

注意

データベース上のBLOB型の列には、XML文書を格納してください。

XML形式以外の文書を格納した場合、shundimportコマンド実行時にエラーとなる場合があります。

E.3 テキストファイルのXML文書

テキストファイルからShunsakuにXML文書を直接取り込む場合は、1ファイルに複数のXML文書を連続して格納してお

くことにより、1回の操作で複数のXML文書を取り込むことが可能です。

Shunsakuは、1ファイルに格納された複数のXML文書を、1文書ごとに区切って格納します。

注意

・ ルート要素の終了タグのあとにある次のXML文書のXML宣言や“<!—”で記述されるコメントなどは、次のXML文書

として扱われます。

・ ルート要素の終了タグから次のXML文書のルート要素の開始タグまでの間に記述された以下の文字は無視されま

す。

- 改行

- 空白行

- XML宣言およびコメント以外の文字

例1

ルート要素の開始タグの前および終了タグの後にコメントが含まれている複数のXML文書を1ファイルにしてShunsakuに取り込んだ場合

文書A

<!-- Starting A -->

<A>

<B>aaam</B>

</A>

<!-- End A -->

文書B

<!-- Starting B -->

<A>

<C>bbbm</C>

</A>

<!-- End B -->

上記の2つの文書を1ファイルに格納して取込み操作を行った場合、文書Aの終了はルート要素の終了タグ</A>が出現

した時点と判断されます。

そのため、文書B全体を取り出す場合、文書Aの<!--End A-->を含んで返信されます。

文書A全体の取出し

- 325 -

<!-- Starting A -->

<A>

<B>aaam</B>

</A>

文書B全体の取出し

<!-- End A -->

<!-- Starting B -->

<A>

<C>bbbm</C>

</A>

例2

ルート要素の開始タグの前および終了タグの後に文字列が含まれている複数のXML文書を1ファイルにしてShunsakuに取り込んだ場合

文書A

Document A Start

<A>

<B>aaam</B>

</A>

Document A End

文書B

Document B Start

<A>

<C>bbbm</C>

</A>

Document B End

上記の2つの文書を1ファイルに格納して取込み操作を行った場合、文書Aおよび文書Bは、<A>から</A>までと判断さ

れ、それ以外の文字は無視されます。

そのため、文書A、文書Bを取り出す場合、Shunsakuは、<A>から</A>までを文書として返信します。

文書A全体の取出し

<A>

<B>aaam</B>

</A>

文書B全体の取出し

<A>

<C>bbbm</C>

</A>

- 326 -

E.4 XML形式に関する留意事項

Shunsakuに格納されたXML文書のXML形式に関する留意事項は以下のとおりです。

・ XML宣言やDTDなどの前書きの部分は、検索およびソートの対象になりません。

・ 名前空間の値、コメントおよび処理命令は、検索およびソートの対象になりません。

・ CDATAセクションに記述された文字列は、検索およびソートの対象になります。なお、CDATAセクションに記述され

ているタグについても、文字列として扱うため検索およびソートの対象になります。また、CDATAセクションを表す文

字もソート対象となります。

・ Shunsakuでは、アプリケーションによるXML文書の追加・更新時、もしくは管理コンソールおよびコマンドによるXML文書の追加時に妥当なXML文書(Valid XML Document)としてのチェックを行いません。

・ Shunsakuに格納するXML文書は、以下のどちらかで指定した文字コードで記述してください。

- 標準インストールで設定したキャラクタ識別コード

- システム用動作環境ファイルのCharacterCodeパラメタで指定した文字コード

・ DTD宣言で指定した属性のデフォルト値での検索はできません。また、取出しおよびソートについても属性のデフォ

ルト値は有効にはなりません。詳細については、“E.4.1 DTD宣言に属性のデフォルト値を設定した場合”を参照して

ください。

・ 1つの要素内に同じ属性が重複している場合、どちらかの属性値が条件に一致する文字列または数値が含まれれ

ば真となります。また、取出しおよびソートでは先頭の属性を利用します。

・ 属性値の検索を行う場合は、要素名の 初の文字に“@”を使用しないでください。検索が正しくできない場合があ

ります。要素名の 初の文字に“@”を使用している場合は、“@”を取り除いてください。詳細については、“E.4.2 要素名の 初の文字に@を使用している場合”を参照してください。

・ 属性値の正規化(連続する半角空白、復帰文字、改行文字、水平タブを半角空白で置き換えること)は行いません。

属性値はXML文書に記述されたままの状態で扱います。

・ ダイレクトアクセスキー定義ファイルのテキスト式で指定したテキストノードまたは属性式で指定した属性ノードが、同

一文書中に複数存在する場合は、先頭のテキストノードの値または属性ノードの値だけを利用します。

E.4.1 DTD宣言に属性のデフォルト値を設定した場合

DTD宣言に属性のデフォルト値を設定した場合、属性のデフォルト値での検索はできません。

例として以下の文書があるものとします。

文書A

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE doc[

<!ELEMENT doc (employee)>

<!ELEMENT employee (#PCDATA)>

<!ATTLIST employee id CDATA "0000">

]>

<doc>

<employee>tanaka</employee>

</doc>

- 327 -

従業員番号(id)に“0000”というキーワードを含む文書を検索します。

/doc/employee/@id='0000'

結果:文書Aは返却されません。

E.4.2 要素名の 初の文字に@を使用している場合

要素名の 初の文字に@を使用している場合、その要素をパス式に指定しても検索できません。

注意

XML規約では、要素名の開始文字に“@”は使用できません。

例として以下の文書があるものとします。

文書A

<doc>

<employee id="0001">

tanaka

</employee>

</doc>

文書B

<doc>

<employee>

<@id>0001 </@id>

<name>tanaka</name>

</employee>

</doc>

例1

従業員番号(id)に“0001”というキーワードを含む文書を検索します。

/doc/employee/@id='0001'

結果:文書Aのみが返却されます。(文書Bは返却されません)

検索式に属性式を指定した場合、パス要素に指定する要素名が@から始まると、構文エラーになります。

- 328 -

文書A

<doc>

<@employee>

<id>0001 </id>

<name>tanaka</name>

</@employee>

</doc>

例2

従業員番号(id)“0001”というキーワードを含む文書を検索します。

/doc/@employee/id='0001'

結果:構文エラーになります。

- 329 -

付録F Java サンプルプログラム

Java APIを使用したサンプルプログラムを示します。

F.1 データの検索

データの内容に対して条件を指定して結果を得るためには、Shunsakuが提供するAPIを使用します。

Java APIでは、以下に示す操作ができます。

・ 検索条件に一致するXML文書の件数を取得する

・ 検索条件に一致するXML文書を指定した形式で取得する

・ 特定のXML文書をすべて取得する

・ 検索条件に一致するXML文書をソートして取得する

・ 検索条件に一致するXML文書の値を集計して取得する

Java APIの詳細については、“Java APIリファレンス”を参照してください。

ここでは“ホテルの予約状況検索”を例にして、検索操作の説明を行います。

また、検索操作の説明にあたり、以下のXML文書が存在するものとします。

なお、XML文書の詳細については、“付録E XML文書についての留意事項”を参照してください。

ドキュメントサンプル

<document>

<base>

<name>ホテル1</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>9000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル2</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩05分</note>

</document>

<document>

<base>

- 330 -

<name>ホテル3</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>7500</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩10分</note>

</document>

<document>

<base>

<name>ホテル4</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>5000</price>

</base>

<information>

<date>2006年07月10日</date>

</information>

<note>バス付 トイレ付 地下鉄 ××駅徒歩03分</note>

</document>

<document>

<base>

<name>ホテル5</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月10日</date>

</information>

<note>バス付 トイレ付 地下鉄 ××駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル6</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市港北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>8000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル7</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市港北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>7000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩03分</note>

</document>

- 331 -

<document>

<base>

<name>ホテル8</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市神奈川区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩05分</note>

</document>

F.1.1 検索条件に一致するXML文書の件数を求める

検索操作において、対象となるデータが大量に存在する場合、条件式に一致するデータすべてを参照することは非現

実的です。このため、大量のデータが存在する場合は、条件式に一致するデータ件数を取得することが必要です。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数を取得する例を用いて、Java APIの使用例を示し

ます。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルは何件ありますか?」

年月日(2006年7月18日)および場所(大阪)を条件に指定し、検索を実行します。

APIの使用例

以下にJava APIを使用したプログラミング例を示します。

import com.fujitsu.shun.ShunConnection;

import com.fujitsu.shun.ShunPreparedStatement;

import com.fujitsu.shun.ShunResultSet;

import com.fujitsu.shun.common.ShunException;

/*** 指定された検索条件に該当するレコード件数を取得します ***/

public class JavaAPISample1 {

public static void main(String[] args) {

ShunConnection con = null;

ShunPreparedStatement pstmt = null;

ShunResultSet rs = null;

try {

// 検索条件式

String sQuery = "/document/base/prefecture == '大阪' AND /document/information/

date == '2006年07月18日'";

// リターン式

String sReturn = "/";

// ヒット件数

int iHitNum = 0;

// ShunConnectionオブジェクトを作成

- 332 -

con = new ShunConnection("DirSvr1", 23101);

// 検索式を指定し、ShunPreparedStatementオブジェクトを作成

pstmt = con.prepareSearch(sQuery, sReturn);

//返信要求件数を設定

pstmt.setRequest(1, 0);

//検索を実行し、ShunResultSetオブジェクトを作成

rs = pstmt.executeSearch();

// ヒット件数取得

iHitNum = rs.getHitCount();

System.out.println("ヒット件数 = " + iHitNum);

rs.close();

pstmt.close();

con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex) {

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

// エラーが発生した場合の回収処理

finally {

try {

if (rs != null)

rs.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (pstmt != null)

pstmt.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

- 333 -

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (con != null)

con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

}

}

実行結果

ヒット件数 = 3

F.1.2 検索条件に一致するXML文書を指定した形式で取得する

検索操作において、検索結果として得られたデータの一部を追加条件として次の検索を行うことがよくあります。このよう

な場合、検索結果としてはデータのすべてではなく、その一部を取得することが一般的です。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数と部分情報を取得する例を用いて、Java APIの使

用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルのホテル名と宿泊費を 大30件分知りたい。」

年月日(2006年7月18日)および、場所(大阪)を条件に指定します。また、取得する結果はホテル名と宿泊費を指定し、検

索を実行します。

APIの使用例

以下にJava APIを使用したプログラミング例を示します。

- 334 -

import com.fujitsu.shun.ShunConnection;

import com.fujitsu.shun.ShunPreparedStatement;

import com.fujitsu.shun.ShunResultSet;

import com.fujitsu.shun.common.ShunException;

/*** 指定された検索条件に該当するレコード件数と、データを取得します ***/

public class JavaAPISample2 {

public static void main(String[] args) {

ShunConnection con = null;

ShunPreparedStatement pstmt = null;

ShunResultSet rs = null;

try {

// 検索条件式

String sQuery = "/document/base/prefecture == '大阪' AND /document/information/

date == '2006年07月18日'";

// リターン式

String sReturn = "/document/base/name, /document/base/price";

// ヒット件数

int iHitNum = 0;

// データ件数のカウンタ

int iDataCounter = 1;

// ShunConnectionオブジェクトを作成

con = new ShunConnection("DirSvr1", 23101);

// 検索式を指定し、ShunPreparedStatementオブジェクトを作成

pstmt = con.prepareSearch(sQuery, sReturn);

//返信要求件数を設定

pstmt.setRequest(1, 30);

//検索を実行し、ShunResultSetオブジェクトを作成

rs = pstmt.executeSearch();

// ヒット件数取得

iHitNum = rs.getHitCount();

System.out.println("ヒット件数 = " + iHitNum);

// 検索条件に該当するデータを、1件ずつ取得

while (rs.next()) {

System.out.println("[結果]" + iDataCounter + "件目 = " + rs.getString());

iDataCounter++;

}

rs.close();

pstmt.close();

con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex) {

System.out.println("エラーメッセージ:" + ex.getMessage());

- 335 -

ex.printStackTrace();

}

finally {

try {

if (rs != null)

rs.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (pstmt != null)

pstmt.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (con != null)

con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

}

}

- 336 -

実行結果

ヒット件数 = 3

[結果]1件目 = <document><name>ホテル1</name><price>9000</price></document>

[結果]2件目 = <document><name>ホテル2</name><price>6000</price></document>

[結果]3件目 = <document><name>ホテル3</name><price>7500</price></document>

F.1.3 特定のXML文書をすべて取得する

検索操作において、“F.1.1 検索条件に一致するXML文書の件数を求める”および“F.1.2 検索条件に一致するXML文書を指定した形式で取得する”といった操作を経て、絞り込んだ条件を基に、データすべてを取得することになります。

“F.1.2 検索条件に一致するXML文書を指定した形式で取得する”の操作により得られたホテル名を基に、該当するホ

テルのデータをすべて取得する例を用いて、Java APIの使用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルのうち、あるホテルの詳細情報を取得したい。」

年月日(2006年7月18日)および、場所(大阪)を条件に指定し、検索を実行します。また、ホテルに対応するレコードIDを

用いて、詳細情報を取得します。

APIの使用例

以下にJava APIを使用したプログラミング例を示します。

import com.fujitsu.shun.ShunConnection;

import com.fujitsu.shun.ShunPreparedRecordID;

import com.fujitsu.shun.ShunPreparedStatement;

import com.fujitsu.shun.ShunResultSet;

import com.fujitsu.shun.common.ShunException;

/*** 指定されたレコードIDに該当するレコード情報をすべて取得します ***/

public class JavaAPISample3 {

public static void main(String[] args) {

ShunConnection con = null;

ShunPreparedStatement pstmt = null;

ShunPreparedRecordID rid = null;

ShunResultSet rs = null;

try {

// 検索条件式

String sQuery = "/document/base/prefecture == '大阪' AND /document/information/

date == '2006年07月18日'";

// リターン式

String sReturn = "/document/base/name/text()";

// レコード情報

String sRecordID = "";

// ヒット件数

int iHitNum = 0;

// ShunConnectionオブジェクトを作成

con = new ShunConnection("DirSvr1", 23101);

- 337 -

// 検索式を指定し、ShunPreparedStatementオブジェクトを作成

pstmt = con.prepareSearch(sQuery, sReturn);

//返信要求件数を設定

pstmt.setRequest(1, 30);

//検索を実行し、ShunResultSetオブジェクトを作成

rs = pstmt.executeSearch();

// ヒット件数取得

iHitNum = rs.getHitCount();

System.out.println("ヒット件数 = " + iHitNum);

// ShunPreparedRecordIDオブジェクトを作成

rid = con.prepareSearchRecordID();

// 検索条件に該当するデータ1件を取得

while (rs.next()) {

// ホテル1の情報について、レコードIDを設定

if (rs.getString().equals("ホテル1")) {

rid.add(rs.getRecordID());

}

}

rs.close();

pstmt.close();

// 該当レコードのID取得に成功している場合、詳細データを参照

if (0 < rid.getCount()) {

// 指定されたレコードIDでShunResultSetオブジェクトを作成

rs = rid.searchByRecordID();

while (rs.next()) {

// レコードID指定でデータを取得

System.out.println("[詳細] = " + rs.getString());

}

rs.close();

}

rid.close();

con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex) {

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

finally {

try {

if (rs != null)

rs.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

- 338 -

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (pstmt != null)

pstmt.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (rid != null)

rid.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (con != null)

con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

- 339 -

}

}

実行結果

ヒット件数 = 3

[詳細] = <document>

<base>

<name>ホテル1</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>9000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

F.1.4 検索条件に一致するXML文書をソートして取得する

検索操作において、検索した結果をある特定の要素をキーとしてソートして取得したい場合があります。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数と部分情報を取得します。

データを取得する際に、宿泊費の高い順に取り出す例を用いて、Java APIの使用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルを、宿泊費の高い順に並べて取得したい。」

年月日(2006年7月18日)および、場所(大阪)を条件に指定します。また、ソート条件に宿泊費を指定し、検索を実行しま

す。

APIの使用例

以下にJava APIを使用したプログラミング例を示します。

import com.fujitsu.shun.ShunConnection;

import com.fujitsu.shun.ShunPreparedStatement;

import com.fujitsu.shun.ShunResultSet;

import com.fujitsu.shun.common.ShunException;

/*** 指定された検索条件に該当するデータをソートして取得します ***/

public class JavaAPISample4 {

public static void main(String[] args) {

ShunConnection con = null;

ShunPreparedStatement pstmt = null;

ShunResultSet rs = null;

try {

// 検索条件式

- 340 -

String sQuery = "/document/base/prefecture == '大阪' AND /document/information/

date == '2006年07月18日'";

// リターン式

String sReturn = "/document/base/name, /document/base/price";

// ソート式

String sSort = "val(/document/base/price/text()) DESC";

// ヒット件数

int iHitNum = 0;

// データ件数のカウンタ

int iDataCounter = 1;

// ShunConnectionオブジェクトを作成

con = new ShunConnection("DirSvr1", 23101);

// 検索式を指定し、ShunPreparedStatementオブジェクトを作成

pstmt = con.prepareSearch(sQuery, sReturn);

//返信要求件数を設定

pstmt.setRequest(1, 30);

// ソート式を指定

pstmt.setSort(sSort);

//検索を実行し、ShunResultSetオブジェクトを作成

rs = pstmt.executeSearch();

// 検索条件に該当するデータを、1件ずつ取得

while (rs.next()) {

System.out.println("[結果]" + iDataCounter + "件目 = " + rs.getString());

iDataCounter++;

}

rs.close();

pstmt.close();

con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex) {

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

finally {

try {

if (rs != null)

rs.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

- 341 -

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (pstmt != null)

pstmt.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (con != null)

con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

}

}

実行結果

[結果]1件目 = <document><name>ホテル1</name><price>9000</price></document>

[結果]2件目 = <document><name>ホテル3</name><price>7500</price></document>

[結果]3件目 = <document><name>ホテル2</name><price>6000</price></document>

F.1.5 検索条件に一致するXML文書の値を集計して取得する

検索操作において、検索した結果をある特定の要素の値を集計して取得したい場合があります。

場所を検索条件式に指定して、 も安い宿泊費、 も高い宿泊費、宿泊費の平均値を取得する例を用いて、Java APIの使用例を示します。

- 342 -

検索条件

「2006年7月18日に宿泊可能なホテルのうち、 も安い宿泊費、 も高い宿泊費、宿泊費の平均値を地域別に集計して

欲しい。」

年月日(2006年7月18日)を条件に指定します。また、取得する結果に集計式(min, max, avg)を指定し、集計結果を取得

します。

APIの使用例

以下にJava APIを使用したプログラミング例を示します。

import com.fujitsu.shun.ShunConnection;

import com.fujitsu.shun.ShunPreparedStatement;

import com.fujitsu.shun.ShunResultSet;

import com.fujitsu.shun.common.ShunException;

/*** 指定された検索条件に該当するデータを集計して取得します ***/

public class JavaAPISample5 {

public static void main(String[] args) {

ShunConnection con = null;

ShunPreparedStatement pstmt = null;

ShunResultSet rs = null;

try {

// 検索条件式

String sQuery = "/document/information/date == '2006年07月18日'";

// リターン式

String sReturn = "/document/base/prefecture/text(), min(/document/base/price/

text()), max(/document/base/price/text()), avg(/document/base/price/text())";

// ソート式

String sSort = "/document/base/prefecture/text()";

// ShunConnectionオブジェクトを作成

con = new ShunConnection("DirSvr1", 23101);

// 検索式を指定し、ShunPreparedStatementオブジェクトを作成

pstmt = con.prepareSearch(sQuery, sReturn);

// ソート式を指定

pstmt.setSort(sSort);

// 大取得件数を設定

pstmt.setRequest(1, 30);

//検索を実行し、ShunResultSetオブジェクトを作成

rs = pstmt.executeSearch();

// 検索条件に該当するデータを取得

int counter = 0;

String[][] result;

while (rs.next()) {

counter++;

System.out.println("[結果]" + counter + "件目:");

result = rs.getStringArray();

System.out.println(" 地域 :" + result[0][0]);

System.out.println(" も安い宿泊費:" + result[1][0]);

System.out.println(" も高い宿泊費:" + result[2][0]);

- 343 -

System.out.println(" 宿泊費の平均値:" + result[3][0]);

}

rs.close();

pstmt.close();

con.close();

}

// アプリケーション実行時にエラーが発生した場合の処理

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex) {

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

finally {

try {

if (rs != null)

rs.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (pstmt != null)

pstmt.close(); }

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (con != null)

con.close();

}

catch (ShunException ex) {

- 344 -

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

}

}

実行結果

[結果]1件目:

地域 :神奈川

も安い宿泊費:6000

も高い宿泊費:8000

宿泊費の平均値:7000

[結果]2件目:

地域 :大阪

も安い宿泊費:6000

も高い宿泊費:9000

宿泊費の平均値:7500

F.1.6 ヒット件数の上限値を設定する

ヒット件数の上限値を設定する場合のJava APIの使用例を示します。

APIの使用例

以下にJava APIを使用したプログラミング例を示します。

import com.fujitsu.shun.ShunConnection;

import com.fujitsu.shun.ShunPreparedStatement;

import com.fujitsu.shun.ShunResultSet;

import com.fujitsu.shun.common.ShunException;

/*** ヒット件数の上限値を設定します ***/

public class JavaAPISample9 {

public static void main(String[] args) {

ShunConnection con = null;

ShunPreparedStatement pstmt = null;

ShunResultSet rs = null;

try {

// 検索条件式

String sQuery = "/document/base/name = 'ホテル'";

// リターン式

String sReturn = "/document/base/name/text(), /document/base/price/

- 345 -

text()";

// ソート式

String sSort = "/document/base/price/text()";

// ヒット件数

int iHitNum = 0;

// データ件数のカウンタ

int iDataCounter = 1;

// ShunConnectionオブジェクトを作成

con = new ShunConnection("DirSvr1", 23101);

// 検索式を指定し、ShunPreparedStatementオブジェクトを作成

pstmt = con.prepareSearch(sQuery, sReturn);

// ソート式を指定

pstmt.setSort(sSort);

// 大取得件数を設定

pstmt.setRequest(1, 5);

// ヒット件数リミッタを設定

pstmt.setHitCountLimit(5);

// 検索を実行し、ShunResultSetオブジェクトを作成

rs = pstmt.executeSearch();

// 検索条件に該当するデータを取得

// ヒット件数取得

iHitNum = rs.getHitCount();

System.out.println("ヒット件数 = " + iHitNum);

if(rs.isHitCountLimitOver()) {

System.out.print("ヒット件数リミッタをオーバーしました。");

}

// 検索条件に該当するデータを、1件ずつ取得

while (rs.next()) {

System.out.println("[結果]" + iDataCounter + "件目 = "

+ rs.getString());

iDataCounter++;

}

rs.close();

pstmt.close();

con.close();

}

// アプリケーション実行時にエラーが発生した場合の処理

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex) {

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

- 346 -

finally {

try {

if(rs != null) rs.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if(pstmt != null) pstmt.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if(con != null) con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

}

}

- 347 -

実行結果

ヒット件数 = 8

ヒット件数リミッタをオーバーしました。

F.2 データの更新

データを更新するためには、Shunsakuが提供するAPIを使用します。

Java APIを使用することで、以下の操作を行うことができます。

・ データを追加する

・ データを削除する

・ データを更新する

Java APIの詳細については、“Java APIリファレンス”を参照してください。

ここでは“F.1 データの検索”の“ホテルの予約状況検索”のドキュメントサンプルを例にして、更新操作の説明を行いま

す。

なお、XML文書の詳細については、“付録E XML文書についての留意事項”を参照してください。

F.2.1 データを追加する

データを追加する場合のJava APIの使用例を示します。

追加するデータ

「神奈川のホテル情報(ホテル9の情報)を1件追加したい。」

追加したいデータを組み立て、データを追加します。

APIの使用例

以下にJava APIを使用したプログラミング例を示します。

import com.fujitsu.shun.ShunConnection;

import com.fujitsu.shun.ShunPreparedStatement;

import com.fujitsu.shun.common.ShunException;

/*** 指定されたデータを追加します ***/

public class JavaAPISample6 {

public static void main(String[] args) {

ShunConnection con = null;

ShunPreparedStatement pstmt = null;

try {

// ShunConnectionオブジェクトを作成

- 348 -

con = new ShunConnection("DirSvr1", 23101);

// データ追加用にShunPreparedStatementオブジェクトを作成

pstmt = con.prepareInsert();

// 追加するデータを作成

String addData =

"<document>"

+ " <base>"

+ " <name>ホテル9</name>"

+ " <prefecture>新横浜</prefecture>"

+ " <address>神奈川県横浜市神奈川区</address>"

+ " <detail>http://xxxxx.co.jp</detail>"

+ " <price>6000</price>"

+ " </base>"

+ " <information>"

+ " <date>2006年07月18日</date>"

+ " </information>"

+ "<note>バス付 トイレ付 禁煙ルーム選択可 地下鉄 △△駅徒歩05分</note>"

+ "</document>";

// データを追加

pstmt.add(addData);

// データ追加を実行

pstmt.executeInsert();

System.out.println("追加終了");

pstmt.close();

con.close();

}

// アプリケーション実行時にエラーが発生した場合の処理

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex) {

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

finally {

try {

if (pstmt != null)

pstmt.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

- 349 -

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (con != null)

con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

}

}

実行結果

追加終了

F.2.2 データを削除する

データを削除する場合の、Java APIの使用例を示します。

検索条件

「2006年7月18日に神奈川で宿泊可能なホテルのうち、ホテル9のデータを削除したい。」

年月日(2006年7月18日)および、場所(神奈川)を条件に検索を行い、ホテル名『ホテル9』と一致したデータを削除しま

す。

APIの使用例

以下にJava APIを使用したプログラミング例を示します。

import com.fujitsu.shun.ShunConnection;

import com.fujitsu.shun.ShunPreparedRecordID;

import com.fujitsu.shun.ShunPreparedStatement;

import com.fujitsu.shun.ShunResultSet;

import com.fujitsu.shun.common.ShunException;

/*** 指定されたデータを削除します ***/

public class JavaAPISample7 {

public static void main(String[] args) {

ShunConnection con = null;

- 350 -

ShunPreparedStatement pstmt = null;

ShunPreparedRecordID rid = null;

ShunResultSet rs = null;

try {

// 検索式

String sQuery = "/document/base/prefecture == '新横浜' AND /document/information/

date == '2006年07月18日'";

// リターン式

String sReturn = "/document/base/name/text()";

// ShunConnectionオブジェクトを作成

con = new ShunConnection("DirSvr1", 23101);

// 検索式を指定し、ShunPreparedStatementオブジェクトを作成

pstmt = con.prepareSearch(sQuery, sReturn);

// ShunPreparedRecordIDオブジェクトを作成

rid = con.prepareDeleteRecordID();

// 大取得件数を設定

pstmt.setRequest(1, 30);

// 検索を実行し、ShunResultSetオブジェクトを作成

rs = pstmt.executeSearch();

// ホテル9のレコードIDを取得

while (rs.next()) {

if (rs.getString().equals("ホテル9")) {

rid.add(rs.getRecordID());

}

}

rs.close();

pstmt.close();

// レコードID取得に成功している場合、データを削除

if (0 < rid.getCount()) {

rid.deleteByRecordID();

System.out.println("削除終了");

}

rid.close();

con.close();

}

// アプリケーション実行時にエラーが発生した場合の処理

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex) {

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

finally {

try {

- 351 -

if (rs != null)

rs.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (pstmt != null)

pstmt.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (rid != null)

rid.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (con != null)

con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

- 352 -

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

}

}

実行結果

削除終了

F.2.3 データを更新する

データを更新する場合の、Java APIの使用例を示します。

検索条件

「2006年7月18日に神奈川で宿泊可能なホテルのうち、ホテル1の情報を更新したい。」

年月日(2006年7月18日)を条件に検索を行い、ホテル名『ホテル1』と一致したデータを更新します。

APIの使用例

以下にJava APIを使用したプログラミング例を示します。

import com.fujitsu.shun.ShunConnection;

import com.fujitsu.shun.ShunPreparedRecordID;

import com.fujitsu.shun.ShunPreparedStatement;

import com.fujitsu.shun.ShunResultSet;

import com.fujitsu.shun.common.ShunException;

/*** 指定されたデータを更新します ***/

public class JavaAPISample8 {

public static void main(String[] args) {

ShunConnection con = null;

ShunPreparedStatement pstmt = null;

ShunPreparedRecordID rid = null;

ShunResultSet rs = null;

try {

// 更新データのレコードID

String sUpdateRecordID = null;

// 更新するデータ

String sUpdateData =

"<document>"

+ " <base>"

+ " <name>ホテル1</name>"

+ " <prefecture>大阪</prefecture>"

+ " <address>大阪府大阪市中央区</address>"

+ " <detail>http://xxxxx.co.jp</detail>"

+ " <price>8000</price>"

- 353 -

+ " </base>"

+ " <information>"

+ " <date>2006年07月18日</date>"

+ " </information>"

+ " <note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>"

+ "</document>";

// 検索式

String sQuery = "/document/base/name == 'ホテル1'";

// リターン式

String sReturn = "/document/base/name/text()";

// ShunConnectionオブジェクトを作成

con = new ShunConnection("DirSvr1", 23101);

// 検索式を指定し、ShunPreparedStatementオブジェクトを作成

pstmt = con.prepareSearch(sQuery, sReturn);

// 大取得件数を設定

pstmt.setRequest(1, 30);

// 検索を実行し、ShunResultSetオブジェクトを作成

rs = pstmt.executeSearch();

// ShunPreparedRecordIDオブジェクトを作成

rid = con.prepareUpdateRecordID();

// 大取得件数を設定

pstmt.setRequest(1, 30);

// 検索を実行し、ShunResultSetオブジェクトを作成

rs = pstmt.executeSearch();

// 検索条件に該当するデータ1件を取得

while (rs.next()) {

// ホテル1の情報について、レコードID、更新データを設定

if (rs.getString().equals("ホテル1")) {

rid.add(rs.getRecordID(), sUpdateData);

}

}

// データ設定に成功している場合、データを更新

if (0 < rid.getCount()) {

rid.updateByRecordID();

System.out.println("更新終了");

}

}

// アプリケーション実行時にエラーが発生した場合の処理

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex) {

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

- 354 -

finally {

try {

if (rs != null)

rs.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (pstmt != null)

pstmt.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (rid != null)

rid.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if (con != null)

con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

- 355 -

System.out.println("エラーレベル :SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

}

}

実行結果

更新終了

F.3 拡張的なアプリケーション

Shunsakuの機能を駆使したJava APIの使用例について、説明します。

F.3.1 トランザクションとShunsaku Fileを使ったサンプル

トランザクション機能およびShunsaku Fileを使用する場合のJava APIの使用例を示します。

ここでは、“5.1 トランザクションの概要”で説明した大学の講義の履修登録を例に、Java APIの使用例を示します。

APIの使用例

以下にJava APIを使用したプログラミング例を示します。

import com.fujitsu.shun.ShunConnection;

import com.fujitsu.shun.ShunPreparedRecordID;

import com.fujitsu.shun.ShunPreparedStatement;

import com.fujitsu.shun.ShunResultSet;

import com.fujitsu.shun.common.ShunException;

public class TranAppSample

{

public static void main(String[] args)

{

ShunConnection con = null;

ShunPreparedStatement pstmt = null;

ShunPreparedRecordID rid = null;

ShunResultSet rs = null;

try

{

// 受講者数を増やしたいコースを検索するための検索式、リターン式を設定

// 検索式

String sCourseQuery = "/course/name == 'Business negotiation'";

// リターン式

String sCourseReturn = "/";

//更新レコードID取得用

String updateCourseRecordID = null;

//更新データ

String updateCourseData =

- 356 -

"<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>";

//受講中の情報を追加したい生徒を検索するための検索式、リターン式を設定

// 検索式

String sStudentQuery = "/student/e-mail == 'mary\\.tompson@example\

\.com'";

// リターン式

String sStudentReturn = "/";

//更新レコードID取得用

String updateStudentRecordID = null;

//更新データ

String updateStudentData =

"<student>"

+ " <first-name>Mary</first-name>"

+ " <last-name>Tompson</last-name>"

+ " <e-mail>[email protected]</e-mail>"

+ " <course>Chinese language</course>"

+ " <course>Business negotiation</course>"

+ "</student>";

// ShunConnectionオブジェクトを作成

// 接続先のホスト名:DirSvr1、

// ポート番号:23101、

// Shunsaku File名:shunsakuFile1の場合

con = new ShunConnection("DirSvr1", 23101, "shunsakuFile1");

//更新対象のコース情報、生徒情報を検索

// 検索式を指定し、ShunPreparedStatementオブジェクトを作成

pstmt = con.prepareSearch(sCourseQuery, sCourseReturn);

// 検索を実行し、ShunResultSetオブジェクトを作成

rs = pstmt.executeSearch();

// 取得したコース情報のレコードID、およびXML文書を取得

while (rs.next())

{

updateCourseRecordID = rs.getRecordID();

}

rs.close();

pstmt.close();

// 検索式を指定し、ShunPreparedStatementオブジェクトを作成

pstmt = con.prepareSearch(sStudentQuery, sStudentReturn);

// 検索を実行し、ShunResultSetオブジェクトを作成

rs = pstmt.executeSearch();

// 取得した生徒情報のレコードID、およびXML文書を取得

while (rs.next())

{

updateStudentRecordID = rs.getRecordID();

}

rs.close();

pstmt.close();

// 自動コミットを無効に設定

con.setAutoCommit(false);

// コース情報の更新

rid = con.prepareUpdateRecordID();

- 357 -

// 更新データを追加

rid.add(updateCourseRecordID, updateCourseData);

// データ設定に成功している場合、データを更新

if (0 < rid.getCount())

{

rid.updateByRecordID();

System.out.println("コース情報の更新終了");

}

rid.close();

// 生徒情報の更新

rid = con.prepareUpdateRecordID();

// 更新データを追加

rid.add(updateStudentRecordID, updateStudentData);

// データ設定に成功している場合、データを更新

if (0 < rid.getCount())

{

rid.updateByRecordID();

System.out.println("生徒情報の更新終了");

}

rid.close();

// ここまでの更新をコミット

con.commit();

con.close();

}

// アプリケーション実行時にエラーが発生した場合の処理

catch (ShunException ex)

{

//ロールバックを実施

if (con != null)

{

try

{

con.rollback();

}

catch (ShunException e)

{

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル:SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_TRANSACTION_ROLLEDBACK :

System.out.println("エラーレベル:

SHUN_ERROR_TRANSACTION_ROLLEDBACK");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル:

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_TRANSACTION_ROLLEDBACK :

System.out.println("エラーレベル :

- 358 -

SHUN_ERROR_TRANSACTION_ROLLEDBACK");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex)

{

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

finally

{

try

{

if (rs != null)

rs.close();

}

catch (ShunException ex)

{

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_TRANSACTION_ROLLEDBACK :

System.out.println("エラーレベル :

SHUN_ERROR_TRANSACTION_ROLLEDBACK");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try

{

if (pstmt != null)

pstmt.close();

}

catch (ShunException ex)

{

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_TRANSACTION_ROLLEDBACK :

System.out.println("エラーレベル :

SHUN_ERROR_TRANSACTION_ROLLEDBACK");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

- 359 -

ex.printStackTrace();

}

try

{

if (rid != null)

rid.close();

}

catch (ShunException ex)

{

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_TRANSACTION_ROLLEDBACK :

System.out.println("エラーレベル :

SHUN_ERROR_TRANSACTION_ROLLEDBACK");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try

{

if (con != null)

con.close();

}

catch (ShunException ex)

{

int errorLevel = ex.getErrLevel();

switch( errorLevel ) {

case ShunException.SHUN_ERROR :

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_TRANSACTION_ROLLEDBACK :

System.out.println("エラーレベル :

SHUN_ERROR_TRANSACTION_ROLLEDBACK");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED :

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

}

}

実行結果

コース情報の更新終了

生徒情報の更新終了

- 360 -

F.3.2 ダイレクトアクセスキーを使用してデータを検索する

ダイレクトアクセスキーを使用してデータを検索する場合のJava APIの使用例を示します。

検索するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にJava APIを使用したプログラミング例を示します。

import com.fujitsu.shun.ShunConnection;

import com.fujitsu.shun.ShunPreparedKey;

import com.fujitsu.shun.ShunResultSet;

import com.fujitsu.shun.common.ShunException;

/*** ダイレクトアクセスキーを使用してデータを検索します ***/

public class DirectAccessSample {

public static void main(String[] args) {

ShunConnection con = null;

ShunPreparedKey keystmt = null;

ShunResultSet rs = null;

try {

// ダイレクトアクセスキー名

String sCoursKeyName = "key";

// ダイレクトアクセスキー

String key = "0001";

// リターン式

String sCourseReturn = "/";

// ShunConnectionオブジェクトを作成

// 接続先のホスト名:DirSvr1、

// ポート番号:23101、

// Shunsaku File名:shunsakuFile1の場合

con = new ShunConnection("DirSvr1", 23101, "shunsakuFile1");

// 検索用のShunPreparedKeyオブジェクトを作成

keystmt = con.prepareSearchKey(sCoursKeyName, sCourseReturn);

// 検索対象のダイレクトアクセスキーを追加

- 361 -

keystmt.add(key);

// 検索を実行し、ShunResultSetオブジェクトを作成

rs = keystmt.searchByKey();

// ヒット件数取得

int iHitNum = rs.getHitCount();

// データ件数のカウンタ

int iDataCounter = 1;

System.out.println("ヒット件数 = " + iHitNum);

// 検索条件に該当するデータを、1件ずつ取得

while (rs.next()) {

System.out.println("[結果]" + iDataCounter + "件目");

System.out.println("ダイレクトアクセスキー:" + rs.getKey());

System.out.println("データ :");

System.out.println(rs.getString());

iDataCounter++;

}

rs.close();

keystmt.close();

con.close();

}

// アプリケーション実行時にエラーが発生した場合の処理

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex) {

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

// エラーが発生した場合の回収処理

finally {

try {

if(rs != null) rs.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

- 362 -

try {

if(keystmt != null) keystmt.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if(con != null) con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

}

}

実行結果

ヒット件数 = 1

[結果]1件目

ダイレクトアクセスキー:0001

データ :

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

F.3.3 ダイレクトアクセスキーを使用してデータを削除する

ダイレクトアクセスキーを使用してデータを削除する場合のJava APIの使用例を示します。

- 363 -

削除するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にJava APIを使用したプログラミング例を示します。

import com.fujitsu.shun.ShunConnection;

import com.fujitsu.shun.ShunPreparedKey;

import com.fujitsu.shun.common.ShunException;

/*** ダイレクトアクセスキーを使用してデータを削除します ***/

public class DirectAccessSample3 {

public static void main(String[] args) {

ShunConnection con = null;

ShunPreparedKey keystmt = null;

try {

//ダイレクトアクセスキー名

String sCoursKeyName = "key";

//ダイレクトアクセスキー

String key = "0001";

// ShunConnectionオブジェクトを作成

// 接続先のホスト名:DirSvr1、

// ポート番号:23101、

// Shunsaku File名:shunsakuFile1の場合

con = new ShunConnection("DirSvr1", 23101, "shunsakuFile1");

//削除用のShunPreparedKeyオブジェクトを作成

keystmt = con.prepareDeleteKey(sCoursKeyName);

//削除したいデータのダイレクトアクセスキーを追加

keystmt.add(key);

//コース情報の削除

keystmt.deleteByKey();

System.out.println("削除終了");

- 364 -

keystmt.close();

con.close();

}

// アプリケーション実行時にエラーが発生した場合の処理

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex) {

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

// エラーが発生した場合の回収処理

finally {

try {

if(keystmt != null) keystmt.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if(con != null) con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

}

- 365 -

}

実行結果

削除終了

F.3.4 ダイレクトアクセスキーを使用してデータを更新する

ダイレクトアクセスキーを使用してデータを更新する場合のJava APIの使用例を示します。

更新するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にJava APIを使用したプログラミング例を示します。

import com.fujitsu.shun.ShunConnection;

import com.fujitsu.shun.ShunPreparedKey;

import com.fujitsu.shun.common.ShunException;

/*** ダイレクトアクセスキーを使用してデータを更新します ***/

public class DirectAccessSample2 {

public static void main(String[] args) {

ShunConnection con = null;

ShunPreparedKey keystmt = null;

try

{

//ダイレクトアクセスキー名

String sCoursKeyName = "key";

//ダイレクトアクセスキー

String key = "0001";

//更新データ

String updateCourseData =

"<course>"

- 366 -

+ " <id>0001</id>"

+ " <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>";

// ShunConnectionオブジェクトを作成

// 接続先のホスト名:DirSvr1、

// ポート番号:23101、

// Shunsaku File名:shunsakuFile1の場合

con = new ShunConnection("DirSvr1", 23101, "shunsakuFile1");

//更新用のShunPreparedKeyオブジェクトを作成

keystmt = con.prepareUpdateKey(sCoursKeyName);

//更新データを追加

keystmt.add(key, updateCourseData);

//コース情報の更新

keystmt.updateByKey();

System.out.println("更新終了");

keystmt.close();

con.close();

}

// アプリケーション実行時にエラーが発生した場合の処理

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

catch (Exception ex) {

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

// エラーが発生した場合の回収処理

finally {

try {

if(keystmt != null) keystmt.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out

.println("エラーレベル :

- 367 -

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

try {

if(con != null) con.close();

}

catch (ShunException ex) {

int errorLevel = ex.getErrLevel();

switch (errorLevel) {

case ShunException.SHUN_ERROR:

System.out.println("エラーレベル :SHUN_ERROR");

break;

case ShunException.SHUN_ERROR_CONNECTION_TERMINATED:

System.out

.println("エラーレベル :

SHUN_ERROR_CONNECTION_TERMINATED");

break;

}

System.out.println("エラーメッセージ:" + ex.getMessage());

ex.printStackTrace();

}

}

}

}

実行結果

更新終了

- 368 -

付録G C# .NET サンプルプログラム

C# .NETを使用したサンプルプログラムを示します。

G.1 データの検索

データの内容に対して条件を指定して結果を得るためには、Shunsakuが提供するAPIを使用します。

C# .NETでは、以下に示す操作ができます。

・ 検索条件に一致するXML文書の件数を取得する

・ 検索条件に一致するXML文書を指定した形式で取得する

・ 特定のXML文書をすべて取得する

・ 検索条件に一致するXML文書をソートして取得する

・ 検索条件に一致するXML文書の値を集計して取得する

C# .NETの詳細については、“.NET APIリファレンス”を参照してください。

ここでは“ホテルの予約状況検索”を例にして、検索操作の説明を行います。

また、検索操作の説明にあたり、以下のXML文書が存在するものとします。

なお、XML文書の詳細については、“付録E XML文書についての留意事項”を参照してください。

ドキュメントサンプル

<document>

<base>

<name>ホテル1</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>9000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル2</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩05分</note>

</document>

<document>

- 369 -

<base>

<name>ホテル3</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>7500</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩10分</note>

</document>

<document>

<base>

<name>ホテル4</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>5000</price>

</base>

<information>

<date>2006年07月10日</date>

</information>

<note>バス付 トイレ付 地下鉄 ××駅徒歩03分</note>

</document>

<document>

<base>

<name>ホテル5</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月10日</date>

</information>

<note>バス付 トイレ付 地下鉄 ××駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル6</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市港北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>8000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル7</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市港北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>7000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩03分</note>

- 370 -

</document>

<document>

<base>

<name>ホテル8</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市神奈川区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩05分</note>

</document>

G.1.1 検索条件に一致するXML文書の件数を求める

検索操作において、対象となるデータが大量に存在する場合、条件式に一致するデータすべてを参照することは非現

実的です。このため、大量のデータが存在する場合は、条件式に一致するデータ件数を取得することが必要です。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数を取得する例を用いて、C# .NETの使用例を示し

ます。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルは何件ありますか?」

年月日(2006年7月18日)および場所(大阪)を条件に指定し、検索を実行します。

APIの使用例

以下にC# .NETを使用したプログラミング例を示します。

using System;

using Fujitsu.Shunsaku;

class SampleHitCount {

static public void Main( string[] args ) {

ShunService service = null;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSvr1";

service.Port = 23101;

service.Connect();

// 検索式

string query = "/document {/base/prefecture == '大阪' AND /information/date ==

'2006年07月18日'}";

// 検索式でヒット件数の検索

int hitCount = service.GetHitCount( query );

- 371 -

// ヒット件数の表示

Console.WriteLine( "ヒット件数 = {0}", hitCount );

// Shunsaku から切断

service.Disconnect();

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open ) {

service.Disconnect();

}

}

catch ( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

}

}

実行結果

ヒット件数 = 3

G.1.2 検索条件に一致するXML文書を指定した形式で取得する

検索操作において、検索結果として得られたデータの一部を追加条件として次の検索を行うことがよくあります。このよう

な場合、検索結果としてはデータのすべてではなく、その一部を取得することが一般的です。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数と部分情報を取得する例を用いて、C# .NETの使

用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルのホテル名と宿泊費を 大30件分知りたい。」

年月日(2006年7月18日)および、場所(大阪)を条件に指定します。また、取得する結果はホテル名と宿泊費を指定し、検

索を実行します。

APIの使用例

以下にC# .NETを使用したプログラミング例を示します。

using System;

using Fujitsu.Shunsaku;

class SampleSearch {

- 372 -

static public void Main( string[] args ) {

ShunService service = null;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSvr1";

service.Port = 23101;

service.Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement req = new ShunSearchRequirement();

// 各種検索条件の設定

req.QueryExpression = "/document {/base/prefecture == '大阪' AND /information/

date == '2006年07月18日'}";

req.ReturnExpression = "/document/base/name, /document/base/price";

req.ReplyNumber = 1;

req.RequestCount = 30;

// 検索条件を指定して検索を実行

ShunResultSet rs = service.Search( req );

// 検索結果の表示

Console.WriteLine( "ヒット件数 = {0}", rs.HitCount );

int i = 0;

foreach ( ShunRecord record in rs.Records ) {

++i;

Console.WriteLine( "[結果]{0}件目 = {1}", i, record.Data );

}

// Shunsaku から切断

service.Disconnect();

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open ) {

service.Disconnect();

}

}

catch ( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

}

}

実行結果

ヒット件数 = 3

[結果]1件目 = <document><name>ホテル1</name><price>9000</price></document>

- 373 -

[結果]2件目 = <document><name>ホテル2</name><price>6000</price></document>

[結果]3件目 = <document><name>ホテル3</name><price>7500</price></document>

G.1.3 特定のXML文書をすべて取得する

検索操作において、“G.1.1 検索条件に一致するXML文書の件数を求める”および“G.1.2 検索条件に一致するXML文書を指定した形式で取得する”といった操作を経て、絞り込んだ条件を基に、データすべてを取得することになります。

“G.1.2 検索条件に一致するXML文書を指定した形式で取得する”の操作により得られたホテル名を基に、該当するホ

テルのデータをすべて取得する例を用いて、C# .NETの使用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルのうち、あるホテルの詳細情報を取得したい。」

年月日(2006年7月18日)および、場所(大阪)を条件に指定し、検索を実行します。また、ホテルに対応するレコードIDを

用いて、詳細情報を取得します。

APIの使用例

以下にC# .NETを使用したプログラミング例を示します。

using System;

using Fujitsu.Shunsaku;

class SampleSearchByRecordID {

static public void Main( string[] args ) {

ShunService service = null;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSvr1";

service.Port = 23101;

service.Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement req = new ShunSearchRequirement();

// 各種検索条件の設定

req.QueryExpression = "/document {/base/prefecture == '大阪' AND /information/

date == '2006年07月18日'}";

req.ReturnExpression = "/document/base/name/text()";

req.ReplyNumber = 1;

req.RequestCount = 30;

// 検索条件を指定して検索を実行

ShunResultSet rs = service.Search( req );

// 検索結果の表示

Console.WriteLine( "ヒット件数 = {0}", rs.HitCount );

// 検索用 ShunRecordCollection を作成

ShunRecordCollection searchRecords = new ShunRecordCollection();

- 374 -

// 検索条件に該当するレコードを取得

foreach ( ShunRecord record in rs.Records ) {

if ( record.Data == "ホテル1" ) {

searchRecords.Add( record );

}

}

// 該当レコードの取得に成功している場合 詳細データを参照

if ( searchRecords.Count > 0 ) {

rs = service.SearchByRecordID( searchRecords );

foreach ( ShunRecord record in rs.Records ) {

Console.WriteLine( "[詳細] = {0}", record.Data );

}

}

// Shunsaku から切断

service.Disconnect();

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open ) {

service.Disconnect();

}

}

catch ( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

}

}

実行結果

ヒット件数 = 3

[詳細] = <document>

<base>

<name>ホテル1</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>9000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

- 375 -

G.1.4 検索条件に一致するXML文書をソートして取得する

検索操作において、検索した結果をある特定の要素をキーとしてソートして取得したい場合があります。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数と部分情報を取得します。

データを取得する際に、宿泊費の高い順に取り出す例を用いて、C# .NETの使用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルを、宿泊費の高い順に並べて取得したい。」

年月日(2006年7月18日)および、場所(大阪)を条件に指定します。また、ソート条件に宿泊費を指定し、検索を実行しま

す。

APIの使用例

以下にC# .NETを使用したプログラミング例を示します。

using System;

using Fujitsu.Shunsaku;

class SampleSort1 {

static public void Main( string[] args ) {

ShunService service = null;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSrv1";

service.Port = 23101;

service.Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement req = new ShunSearchRequirement();

// 各種検索条件の設定

req.QueryExpression = "/document {/base/prefecture == '大阪' AND /information/

date == '2006年07月18日'}";

req.ReturnExpression = "/document/base/name, /document/base/price";

req.SortExpression = "/document/base/price/text() DESC";

req.ReplyNumber = 1;

req.RequestCount = 30;

// 検索条件を指定して検索を実行

ShunResultSet rs = service.Search( req );

// 検索結果の表示

Console.WriteLine( "ヒット件数 = {0}", rs.HitCount );

int i = 0;

foreach ( ShunRecord record in rs.Records ) {

++i;

Console.WriteLine( "[結果]{0}件目 = {1}", i, record.Data );

}

// Shunsaku から切断

service.Disconnect();

- 376 -

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open ) {

service.Disconnect();

}

}

catch ( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

}

}

実行結果

Number of hits = 3

[結果]1件目 = <document><name>ホテル1</name><price>9000</price></document>

[結果]2件目 = <document><name>ホテル3</name><price>7500</price></document>

[結果]3件目 = <document><name>ホテル2</name><price>6000</price></document>

G.1.5 検索条件に一致するXML文書の値を集計して取得する

検索操作において、検索した結果をある特定の要素の値を集計して取得したい場合があります。

場所を検索条件式に指定して、 も安い宿泊費、 も高い宿泊費、宿泊費の平均値を取得する例を用いて、C# .NETの使用例を示します。

検索条件

「2006年7月18日に宿泊可能なホテルのうち、 も安い宿泊費、 も高い宿泊費、宿泊費の平均値を地域別に集計して

欲しい。」

年月日(2006年7月18日)を条件に指定します。また、取得する結果に集計式(min, max, avg)を指定し、集計結果を取得

します。

APIの使用例

以下にC# .NETを使用したプログラミング例を示します。

using System;

using Fujitsu.Shunsaku;

class SampleSort2 {

static public void Main( string[] args ) {

- 377 -

ShunService service = null;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSrv1";

service.Port = 23101;

service.Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement req = new ShunSearchRequirement();

// 各種検索条件の設定

req.QueryExpression = "/document/information/date == '2006年07月18日'";

req.ReturnExpression = "/document/base/prefecture/text(), min(/document/base/

price/text()), max(/document/base/price/text()), avg(/document/base/price/text())";

req.SortExpression = "/document/base/prefecture/text()";

req.ReplyNumber = 1;

req.RequestCount = 30;

// 検索条件を指定して検索を実行

ShunResultSet rs = service.Search( req );

// 検索結果の表示

// 検索条件に該当するデータを取得

int i = 0;

foreach ( ShunRecord record in rs.Records ) {

++i;

Console.WriteLine( "[結果]{0}件目:", i );

string[][] result = record.GetDividedData();

Console.WriteLine( " 地域 :{0}", result[0][0] );

Console.WriteLine( " も安い宿泊費:{0}", result[1][0] );

Console.WriteLine( " も高い宿泊費:{0}", result[2][0] );

Console.WriteLine( " 宿泊費の平均値:{0}", result[3][0] );

}

// Shunsaku から切断

service.Disconnect();

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open ) {

service.Disconnect();

}

}

catch ( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

}

}

- 378 -

実行結果

[結果]1件目:

地域 :神奈川

も安い宿泊費:6000

も高い宿泊費:8000

宿泊費の平均値:7000

[結果]2件目:

地域 :大阪

も安い宿泊費:6000

も高い宿泊費:9000

宿泊費の平均値:7500

G.1.6 ヒット件数の上限値を設定する

ヒット件数の上限値を設定する場合のC# .NETの使用例を示します。

APIの使用例

以下にC# .NETを使用したプログラミング例を示します。

using System;

using Fujitsu.Shunsaku;

class SampleSearchLimit {

static public void Main( string[] args ) {

ShunService service = null;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSvr1";

service.Port = 23101;

service.Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement req = new ShunSearchRequirement();

// 各種検索条件の設定

req.QueryExpression = "/document/base/name = 'ホテル'";

req.ReturnExpression = "/document/base/name/text(), /document/base/price/

text()";

req.SortExpression = "/document/base/price/text()";

req.ReplyNumber = 1;

req.RequestCount = 5;

// ヒット件数リミッタを設定

req.HitCountLimit = 5;

// 検索条件を指定して検索を実行

ShunResultSet rs = service.Search( req );

// 検索結果の表示

Console.WriteLine( "ヒット件数 = {0}", rs.HitCount );

if ( rs.IsHitCountLimitOver ) {

- 379 -

Console.WriteLine( "ヒット件数リミッタをオーバーしました。" );

}

int i = 0;

foreach ( ShunRecord record in rs.Records ) {

++i;

Console.WriteLine( "[結果]{0}件目 = {1}", i, record.Data );

}

// Shunsaku から切断

service.Disconnect();

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open ) {

service.Disconnect();

}

}

catch ( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

}

}

実行結果

ヒット件数 = 8

ヒット件数リミッタをオーバーしました。

G.2 データの更新

データを更新するためには、Shunsakuが提供するAPIを使用します。

C# .NETを使用することで、以下の操作を行うことができます。

・ データを追加する

・ データを削除する

・ データを更新する

C# .NET の詳細については、“.NET APIリファレンス”を参照してください。

ここでは“G.1 データの検索”の“ホテルの予約状況検索”のドキュメントサンプルを例にして、更新操作の説明を行いま

す。

- 380 -

なお、XML文書の詳細については、“付録E XML文書についての留意事項”を参照してください。

G.2.1 データを追加する

データを追加する場合のC# .NETの使用例を示します。

追加するデータ

「神奈川のホテル情報(ホテル9の情報)を1件追加したい。」

追加したいデータを組み立て、データを追加します。

APIの使用例

以下にC# .NETを使用したプログラミング例を示します。

using System;

using Fujitsu.Shunsaku;

class SampleInsert {

static public void Main( string[] args ) {

ShunService service = null;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSvr1";

service.Port = 23101;

service.Connect();

// 追加用 ShunRecordCollection を作成

ShunRecordCollection insertRecords = new ShunRecordCollection();

// 追加用 ShunRecord を作成

ShunRecord record = new ShunRecord();

// データを指定

record.Data = String.Concat(

"<document>",

" <base>",

" <name>ホテル9</name>",

" <prefecture>新横浜</prefecture>",

" <address>神奈川県横浜市神奈川区</address>",

" <detail>http://xxxxx.co.jp</detail>",

" <price>6000</price>",

" </base>",

" <information>",

" <date>2006年07月18日</date>",

" </information>",

"<note>バス付 トイレ付 禁煙ルーム選択可 地下鉄 △△駅徒歩05分</note>",

"</document>" );

// コレクションに追加

insertRecords.Add( record );

// データを追加

- 381 -

service.Insert( insertRecords );

Console.WriteLine( "追加終了" );

// Shunsaku から切断

service.Disconnect();

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open ) {

service.Disconnect();

}

}

catch ( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

}

}

実行結果

追加終了

G.2.2 データを削除する

データを削除する場合の、C# .NETの使用例を示します。

検索条件

「2006年7月18日に神奈川で宿泊可能なホテルのうち、ホテル9のデータを削除したい。」

年月日(2006年7月18日)および、場所(神奈川)を条件に検索を行い、ホテル名『ホテル9』と一致したデータを削除しま

す。

APIの使用例

以下にC# .NETを使用したプログラミング例を示します。

using System;

using Fujitsu.Shunsaku;

class SampleDelete {

static public void Main( string[] args ) {

ShunService service = null;

try {

// ShunService の作成

- 382 -

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSvr1";

service.Port = 23101;

service.Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement req = new ShunSearchRequirement();

// 各種検索条件の設定

req.QueryExpression = "/document/base/prefecture == '新横浜' AND /document/

information/date == '2006年07月18日'";

req.ReturnExpression = "/document/base/name/text()";

req.ReplyNumber = 1;

req.RequestCount = 30;

// 検索条件を指定して検索を実行

ShunResultSet rs = service.Search( req );

// 削除用 ShunRecordCollection を作成

ShunRecordCollection deleteRecords = new ShunRecordCollection();

// ホテル9のレコードを取得

foreach ( ShunRecord record in rs.Records ) {

if ( record.Data == "ホテル9" ) {

deleteRecords.Add( record );

}

}

// 該当レコードの取得に成功している場合 データを削除

if ( deleteRecords.Count > 0 ) {

service.Delete( deleteRecords );

Console.WriteLine( "削除終了" );

}

// Shunsaku から切断

service.Disconnect();

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open ) {

service.Disconnect();

}

}

catch ( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

}

}

- 383 -

実行結果

削除終了

G.2.3 データを更新する

データを更新する場合の、C# .NETの使用例を示します。

検索条件

「2006年7月18日に神奈川で宿泊可能なホテルのうち、ホテル1の情報を更新したい。」

年月日(2006年7月18日)を条件に検索を行い、ホテル名『ホテル1』と一致したデータを更新します。

APIの使用例

以下にC# .NETを使用したプログラミング例を示します。

using System;

using Fujitsu.Shunsaku;

class SampleUpdate {

static public void Main( string[] args ) {

ShunService service = null;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSrv1";

service.Port = 23101;

service.Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement req = new ShunSearchRequirement();

// 各種検索条件の設定

req.QueryExpression = "/document/base/name == 'ホテル1'";

req.ReturnExpression = "/document/base/name/text()";

req.ReplyNumber = 1;

req.RequestCount = 30;

// 検索条件を指定して検索を実行

ShunResultSet rs = service.Search( req );

// 更新用 ShunRecordCollection を作成

ShunRecordCollection updateRecords = new ShunRecordCollection();

// 検索条件に該当するレコードを取得

foreach ( ShunRecord record in rs.Records ) {

if ( record.Data == "ホテル1" ) {

// ホテル1の情報について、レコードID、更新データを設定

record.Data = String.Concat(

"<document>",

" <base>",

- 384 -

" <name>ホテル1</name>",

" <prefecture>大阪</prefecture>",

" <address>大阪府大阪市中央区</address>",

" <detail>http://xxxxx.co.jp</detail>",

" <price>8000</price>",

" </base>",

" <information>",

" <date>2006年07月18日</date>",

" </information>",

" <note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>",

"</document>" );

updateRecords.Add( record );

}

}

// データ設定に成功している場合、データを更新

if ( updateRecords.Count > 0 ) {

service.Update( updateRecords );

Console.WriteLine( "更新終了" );

}

// Shunsaku から切断

service.Disconnect();

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open ) {

service.Disconnect();

}

}

catch ( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

}

}

実行結果

更新終了

G.3 拡張的なアプリケーション

Shunsakuの機能を駆使したC# .NETの使用例について、説明します。

G.3.1 トランザクションとShunsaku Fileを使ったサンプル

トランザクション機能およびShunsaku Fileを使用する場合のC# .NETの使用例を示します。

- 385 -

ここでは、“5.1 トランザクションの概要”で説明した大学の講義の履修登録を例に、C# .NETの使用例を示します。

APIの使用例

以下にC# .NETを使用したプログラミング例を示します。

using System;

using Fujitsu.Shunsaku;

class SampleTransaction {

static public void Main( string[] args ) {

ShunService service = null;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSrv1";

service.Port = 23101;

service.ShunsakuFile = "shunsakuFile1";

service.Connect();

// 受講者数を増やしたいコースを検索するための検索条件を設定

ShunSearchRequirement courseReq = new ShunSearchRequirement();

courseReq.QueryExpression = "/course/name == 'Business negotiation'";

courseReq.ReturnExpression = "/";

// 更新対象のコース情報を検索

ShunResultSet courseRs = service.Search( courseReq );

// 検索結果からレコード情報を取得

ShunRecord updateCourseRecord = courseRs.Records[0];

// コース情報更新データ

updateCourseRecord.Data = String.Concat(

"<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>" );

// 受講中の情報を追加したい生徒を検索するための検索式、リターン式を設定

ShunSearchRequirement studentReq = new ShunSearchRequirement();

studentReq.QueryExpression = "/student/e-mail == 'mary\\.tompson@example\

\.com'";

studentReq.ReturnExpression = "/";

// 更新対象の生徒情報を検索

ShunResultSet studentRs = service.Search( studentReq );

// 検索結果からレコード情報を取得

ShunRecord updateStudentRecord = studentRs.Records[0];

// 生徒情報更新データ

updateStudentRecord.Data = String.Concat(

- 386 -

"<student>",

" <first-name>Mary</first-name>",

" <last-name>Tompson</last-name>",

" <e-mail>[email protected]</e-mail>",

" <course>Chinese language</course>",

" <course>Business negotiation</course>",

"</student>" );

// 自動コミットを無効に設定

service.AutoCommit = false;

try {

// コース情報の更新

service.Update( updateCourseRecord );

Console.WriteLine( "コース情報の更新終了" );

// 生徒情報の更新

service.Update( updateStudentRecord );

Console.WriteLine( "生徒情報の更新終了" );

// ここまでの更新をコミット

service.Commit();

}

catch {

if ( service.State == ShunConnectionState.Open ) {

service.Rollback();

}

throw;

}

// Shunsaku から切断

service.Disconnect();

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open ) {

service.Disconnect();

}

}

catch ( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

}

}

実行結果

コース情報の更新終了

学生情報の更新終了

- 387 -

G.3.2 ダイレクトアクセスキーを使用してデータを検索する

ダイレクトアクセスキーを使用してデータを検索する場合のC# .NETの使用例を示します。

検索するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にC# .NETを使用したプログラミング例を示します。

using System;

using Fujitsu.Shunsaku;

class SampleDirectAccessSearch {

static public void Main( string[] args ) {

ShunService service = null;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSvr1";

service.Port = 23101;

service.ShunsakuFile = "shunsakuFile1";

service.Connect();

// 検索用の ShunKeyRequirement オブジェクトを作成

ShunKeyRequirement keyReq = new ShunKeyRequirement();

keyReq.KeyName = "key";

// 検索対象のキーを追加

keyReq.Records.Add( new ShunRecord() );

keyReq.Records[0].Key = "0001";

// 検索条件を指定して検索を実行

ShunResultSet rs = service.SearchByKey( keyReq, "/" );

// 取得したソース情報のダイレクトアクセスキーを取得

Console.WriteLine( "ヒット件数 = {0}", rs.HitCount );

- 388 -

int i = 0;

foreach ( ShunRecord record in rs.Records ) {

++i;

Console.WriteLine( "[結果]{0}件目", i );

Console.WriteLine( "ダイレクトアクセスキー: {0}", record.Key );

Console.WriteLine( "データ :" );

Console.WriteLine( record.Data );

}

// Shunsaku から切断

service.Disconnect();

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open )

{

service.Disconnect();

}

}

catch ( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

}

}

実行結果

ヒット件数 = 1

[結果]1件目

ダイレクトアクセスキー:0001

データ :

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

G.3.3 ダイレクトアクセスキーを使用してデータを削除する

ダイレクトアクセスキーを使用してデータを削除する場合のC# .NETの使用例を示します。

削除するデータ

<course>

<id>0001</id>

- 389 -

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にC# .NETを使用したプログラミング例を示します。

using System;

using Fujitsu.Shunsaku;

class SampleDirectAccessDelete {

static public void Main( string[] args ) {

ShunService service = null;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSvr1";

service.Port = 23101;

service.ShunsakuFile = "shunsakuFile1";

service.Connect();

// 削除用の ShunKeyRequirement オブジェクトを作成

ShunKeyRequirement keyReq = new ShunKeyRequirement();

keyReq.KeyName = "key";

// 削除したいデータのダイレクトアクセスキーを追加

keyReq.Records.Add( new ShunRecord() );

keyReq.Records[0].Key = "0001";

//コース情報の更新

service.DeleteByKey( keyReq );

Console.WriteLine( "削除終了" );

// Shunsaku から切断

service.Disconnect();

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open )

{

service.Disconnect();

}

- 390 -

}

catch ( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

}

}

実行結果

削除終了

G.3.4 ダイレクトアクセスキーを使用してデータを更新する

ダイレクトアクセスキーを使用してデータを更新する場合のC# .NETの使用例を示します。

更新するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にC# .NETを使用したプログラミング例を示します。

using System;

using Fujitsu.Shunsaku;

class SampleDirectAccessUpdate {

static public void Main( string[] args ) {

ShunService service = null;

try {

- 391 -

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSvr1";

service.Port = 23101;

service.ShunsakuFile = "shunsakuFile1";

service.Connect();

// 更新用の ShunKeyRequirement オブジェクトを作成

ShunKeyRequirement keyReq = new ShunKeyRequirement();

keyReq.KeyName = "key";

// 更新対象のキーを追加

keyReq.Records.Add( new ShunRecord() );

keyReq.Records[0].Key = "0001";

// 更新データを設定

keyReq.Records[0].Data = String.Concat(

"<course>",

" <id>0001</id>",

" <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>" );

//コース情報の更新

service.UpdateByKey( keyReq );

Console.WriteLine( "更新終了" );

// Shunsaku から切断

service.Disconnect();

}

catch ( ShunContinuousException e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != null && service.State == ShunConnectionState.Open )

{

service.Disconnect();

}

}

catch ( ShunException ex ) {

Console.WriteLine("エラーメッセージ : {0}", ex.Message );

}

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

catch ( ShunConnectionTerminatedException e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine("エラーメッセージ : {0}", e.Message );

}

}

}

実行結果

- 392 -

更新終了

- 393 -

付録H VB .NET サンプルプログラム

VB .NETを使用したサンプルプログラムを示します。

H.1 データの検索

データの内容に対して条件を指定して結果を得るためには、Shunsakuが提供するAPIを使用します。

VB .NETでは、以下に示す操作ができます。

・ 検索条件に一致するXML文書の件数を取得する

・ 検索条件に一致するXML文書を指定した形式で取得する

・ 特定のXML文書をすべて取得する

・ 検索条件に一致するXML文書をソートして取得する

・ 検索条件に一致するXML文書の値を集計して取得する

VB .NETの詳細については、“.NET APIリファレンス”を参照してください。

ここでは“ホテルの予約状況検索”を例にして、検索操作の説明を行います。

また、検索操作の説明にあたり、以下のXML文書が存在するものとします。

なお、XML文書の詳細については、“付録E XML文書についての留意事項”を参照してください。

ドキュメントサンプル

<document>

<base>

<name>ホテル1</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>9000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル2</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩05分</note>

</document>

<document>

- 394 -

<base>

<name>ホテル3</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>7500</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩10分</note>

</document>

<document>

<base>

<name>ホテル4</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>5000</price>

</base>

<information>

<date>2006年07月10日</date>

</information>

<note>バス付 トイレ付 地下鉄 ××駅徒歩03分</note>

</document>

<document>

<base>

<name>ホテル5</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月10日</date>

</information>

<note>バス付 トイレ付 地下鉄 ××駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル6</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市港北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>8000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル7</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市港北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>7000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩03分</note>

- 395 -

</document>

<document>

<base>

<name>ホテル8</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市神奈川区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩05分</note>

</document>

H.1.1 検索条件に一致するXML文書の件数を求める

検索操作において、対象となるデータが大量に存在する場合、条件式に一致するデータすべてを参照することは非現

実的です。このため、大量のデータが存在する場合は、条件式に一致するデータ件数を取得することが必要です。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数を取得する例を用いて、VB .NETの使用例を示し

ます。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルは何件ありますか?」

年月日(2006年7月18日)および場所(大阪)を条件に指定し、検索を実行します。

APIの使用例

以下にVB .NETを使用したプログラミング例を示します。

Imports System

Imports Fujitsu.Shunsaku

Imports System.ComponentModel

Class SampleHitCount

Shared Public Function Main( ByVal args() As String ) As Integer

Dim service As ShunService = Nothing

Try

'' ShunService の作成

service = new ShunService()

'' ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSrv1"

service.Port = 23101

service.Connect()

'' 検索式

Dim query As String = "/document {/base/prefecture == '大阪' AND /information/

date == '2006年07月18日'}"

- 396 -

'' 検索式でヒット件数の検索

Dim hitCount As Integer = service.GetHitCount( query )

'' ヒット件数の表示

Console.WriteLine( "ヒット件数 = {0}", hitCount )

'' Shunsaku から切断

service.Disconnect()

Catch e As ShunContinuousException

'' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State = ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException

'' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

End Try

End Function

End Class

実行結果

ヒット件数 = 3

H.1.2 検索条件に一致するXML文書を指定した形式で取得する

検索操作において、検索結果として得られたデータの一部を追加条件として次の検索を行うことがよくあります。このよう

な場合、検索結果としてはデータのすべてではなく、その一部を取得することが一般的です。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数と部分情報を取得する例を用いて、VB .NETの使

用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルのホテル名と宿泊費を 大30件分知りたい。」

年月日(2006年7月18日)および、場所(大阪)を条件に指定します。また、取得する結果はホテル名と宿泊費を指定し、検

索を実行します。

APIの使用例

以下にVB .NETを使用したプログラミング例を示します。

Imports System

Imports Fujitsu.Shunsaku

- 397 -

Imports System.ComponentModel

Class SampleSearch

Shared Public Function Main( ByVal args() As String ) As Integer

Dim service As ShunService = Nothing

Try

'' ShunService の作成

service = new ShunService()

'' ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSrv1"

service.Port = 23101

service.Connect()

'' ShunSearchRequirement の作成

Dim req As ShunSearchRequirement = new ShunSearchRequirement()

'' 各種検索条件の設定

req.QueryExpression = "/document {/base/prefecture == '大阪' AND /information/

date == '2006年07月18日'}"

req.ReturnExpression = "/document/base/name, /document/base/price"

req.ReplyNumber = 1

req.RequestCount = 30

'' 検索条件を指定して検索を実行

Dim rs As ShunResultSet = service.Search( req )

'' 検索結果の表示

Console.WriteLine( "ヒット件数 = {0}", rs.HitCount )

Dim i As Integer = 0

For Each record As ShunRecord In rs.Records

i += 1

Console.WriteLine( "[結果]{0}件目 = {1}", i, record.Data )

Next

'' Shunsaku から切断

service.Disconnect()

Catch e As ShunContinuousException

'' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State = ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException

'' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

End Try

End Function

End Class

- 398 -

実行結果

ヒット件数 = 3

[結果]1件目 = <document><name>ホテル1</name><price>9000</price></document>

[結果]2件目 = <document><name>ホテル2</name><price>6000</price></document>

[結果]3件目 = <document><name>ホテル3</name><price>7500</price></document>

H.1.3 特定のXML文書をすべて取得する

検索操作において、“H.1.1 検索条件に一致するXML文書の件数を求める”および“H.1.2 検索条件に一致するXML文書を指定した形式で取得する”といった操作を経て、絞り込んだ条件を基に、データすべてを取得することになります。

“H.1.2 検索条件に一致するXML文書を指定した形式で取得する”の操作により得られたホテル名を基に、該当するホ

テルのデータをすべて取得する例を用いて、VB .NETの使用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルのうち、あるホテルの詳細情報を取得したい。」

年月日(2006年7月18日)および、場所(大阪)を条件に指定し、検索を実行します。また、ホテルに対応するレコードIDを

用いて、詳細情報を取得します。

APIの使用例

以下にVB .NETを使用したプログラミング例を示します。

Imports System

Imports Fujitsu.Shunsaku

Imports System.ComponentModel

Class SampleSearchByRecordID

Shared Public Function Main( ByVal args() As String ) As Integer

Dim service As ShunService = Nothing

Try

'' ShunService の作成

service = new ShunService()

'' ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSrv1"

service.Port = 23101

service.Connect()

'' ShunSearchRequirement の作成

Dim req As ShunSearchRequirement = new ShunSearchRequirement()

'' 各種検索条件の設定

req.QueryExpression = "/document {/base/prefecture == '大阪' AND /information/

date == '2006年07月18日'}"

req.ReturnExpression = "/document/base/name/text()"

req.ReplyNumber = 1

req.RequestCount = 30

'' 検索条件を指定して検索を実行

- 399 -

Dim rs As ShunResultSet = service.Search( req )

'' 検索結果の表示

Console.WriteLine( "ヒット件数 = {0}", rs.HitCount )

'' 検索用 ShunRecordCollection を作成

Dim searchRecords As ShunRecordCollection = new ShunRecordCollection()

'' 検索条件に該当するレコードを取得

For Each record As ShunRecord In rs.Records

If record.Data = "ホテル1"

searchRecords.Add( record )

End If

Next

'' 該当レコードの取得に成功している場合 詳細データを参照

If searchRecords.Count > 0

rs = service.SearchByRecordID( searchRecords )

For Each record As ShunRecord In rs.Records

Console.WriteLine( "[詳細] = {0}", record.Data )

Next

End If

'' Shunsaku から切断

service.Disconnect()

Catch e As ShunContinuousException

'' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State = ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException

'' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

End Try

End Function

End Class

実行結果

ヒット件数 = 3

[詳細] = <document>

<base>

<name>ホテル1</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>9000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

- 400 -

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

H.1.4 検索条件に一致するXML文書をソートして取得する

検索操作において、検索した結果をある特定の要素をキーとしてソートして取得したい場合があります。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数と部分情報を取得します。

データを取得する際に、宿泊費の高い順に取り出す例を用いて、VB .NETの使用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルを、宿泊費の高い順に並べて取得したい。」

年月日(2006年7月18日)および、場所(大阪)を条件に指定します。また、ソート条件に宿泊費を指定し、検索を実行しま

す。

APIの使用例

以下にVB .NETを使用したプログラミング例を示します。

Imports System

Imports Fujitsu.Shunsaku

Imports System.ComponentModel

Class SampleSort1

Shared Public Function Main( ByVal args() As String ) As Integer

Dim service As ShunService = Nothing

Try

'' ShunService の作成

service = new ShunService()

'' ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSrv1"

service.Port = 23101

service.Connect()

'' ShunSearchRequirement の作成

Dim req As ShunSearchRequirement = new ShunSearchRequirement()

'' 各種検索条件の設定

req.QueryExpression = "/document {/base/prefecture == '大阪' AND /information/

date == '2006年07月18日'}"

req.ReturnExpression = "/document/base/name, /document/base/price"

req.SortExpression = "/document/base/price/text() DESC"

req.ReplyNumber = 1

req.RequestCount = 30

'' 検索条件を指定して検索を実行

Dim rs As ShunResultSet = service.Search( req )

'' 検索結果の表示

Console.WriteLine( "ヒット件数 = {0}", rs.HitCount )

- 401 -

Dim i As Integer = 0

For Each record As ShunRecord In rs.Records

i += 1

Console.WriteLine( "[結果]{0}件目 = {1}", i, record.Data )

Next

'' Shunsaku から切断

service.Disconnect()

Catch e As ShunContinuousException

'' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State = ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException

'' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

End Try

End Function

End Class

実行結果

Number of hits = 3

[結果]1件目 = <document><name>ホテル1</name><price>9000</price></document>

[結果]2件目 = <document><name>ホテル3</name><price>7500</price></document>

[結果]3件目 = <document><name>ホテル2</name><price>6000</price></document>

H.1.5 検索条件に一致するXML文書の値を集計して取得する

検索操作において、検索した結果をある特定の要素の値を集計して取得したい場合があります。

場所を検索条件式に指定して、 も安い宿泊費、 も高い宿泊費、宿泊費の平均値を取得する例を用いて、VB .NETの使用例を示します。

検索条件

「2006年7月18日に宿泊可能なホテルのうち、 も安い宿泊費、 も高い宿泊費、宿泊費の平均値を地域別に集計して

欲しい。」

年月日(2006年7月18日)を条件に指定します。また、取得する結果に集計式(min, max, avg)を指定し、集計結果を取得

します。

APIの使用例

以下にVB .NETを使用したプログラミング例を示します。

- 402 -

Imports System

Imports Fujitsu.Shunsaku

Imports System.ComponentModel

Class SampleSort2

Shared Public Function Main( ByVal args() As String ) As Integer

Dim service As ShunService = Nothing

Try

'' ShunService の作成

service = new ShunService()

'' ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSrv1"

service.Port = 23101

service.Connect()

'' ShunSearchRequirement の作成

Dim req As ShunSearchRequirement = new ShunSearchRequirement()

'' 各種検索条件の設定

req.QueryExpression = "/document/information/date == '2006年07月18日'"

req.ReturnExpression = "/document/base/prefecture/text(), min(/document/base/

price/text()), max(/document/base/price/text()), avg(/document/base/price/text())"

req.SortExpression = "/document/base/prefecture/text()"

req.ReplyNumber = 1

req.RequestCount = 30

'' 検索条件を指定して検索を実行

Dim rs As ShunResultSet = service.Search( req )

'' 検索結果の表示

'' 検索条件に該当するデータを取得

Dim i As Integer = 0

For Each record As ShunRecord In rs.Records

i += 1

Console.WriteLine( "[結果]{0}件目:", i )

Dim result As String()() = record.GetDividedData()

Console.WriteLine(" 地域 :{0}", result( 0 )( 0 ) )

Console.WriteLine(" も安い宿泊費:{0}", result( 1 )( 0 ) )

Console.WriteLine(" も高い宿泊費:{0}", result( 2 )( 0 ) )

Console.WriteLine(" 宿泊費の平均値:{0}", result( 3 )( 0 ) )

Next

'' Shunsaku から切断

service.Disconnect()

Catch e As ShunContinuousException

'' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State = ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException

'' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

- 403 -

End Try

End Function

End Class

実行結果

[結果]1件目:

地域 :神奈川

も安い宿泊費:6000

も高い宿泊費:8000

宿泊費の平均値:7000

[結果]2件目:

地域 :大阪

も安い宿泊費:6000

も高い宿泊費:9000

宿泊費の平均値:7500

H.1.6 ヒット件数の上限値を設定する

ヒット件数の上限値を設定する場合のVB .NETの使用例を示します。

APIの使用例

以下にVB .NETを使用したプログラミング例を示します。

Imports System

Imports Fujitsu.Shunsaku

Imports System.ComponentModel

Class SampleSearchLimit

Shared Public Function Main( ByVal args() As String ) As Integer

Dim service As ShunService = Nothing

Try

'' ShunService の作成

service = new ShunService()

'' ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSvr1"

service.Port = 23101

service.Connect()

'' ShunSearchRequirement の作成

Dim req As ShunSearchRequirement = new ShunSearchRequirement()

'' 各種検索条件の設定

req.QueryExpression = "/document/base/name = 'ホテル'"

req.ReturnExpression = "/document/base/name/text(), /document/base/

price/text()"

req.SortExpression = "/document/base/price/text()"

req.ReplyNumber = 1

req.RequestCount = 5

'' ヒット件数リミッタを設定

- 404 -

req.HitCountLimit = 5

'' 検索条件を指定して検索を実行

Dim rs As ShunResultSet = service.Search( req )

'' 検索結果の表示

Console.WriteLine( "ヒット件数 = {0}", rs.HitCount )

If rs.IsHitCountLimitOver

Console.WriteLine( "ヒット件数リミッタをオーバーしました。" )

End If

Dim i As Integer = 0

For Each record As ShunRecord In rs.Records

i += 1

Console.WriteLine( "[結果]{0}件目 = {1}", i, record.Data )

Next

'' Shunsaku から切断

service.Disconnect()

Catch e As ShunContinuousException

'' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State =

ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException

'' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

End Try

End Function

End Class

実行結果

ヒット件数 = 8

ヒット件数リミッタをオーバーしました。

H.2 データの更新

データを更新するためには、Shunsakuが提供するAPIを使用します。

VB .NETを使用することで、以下の操作を行うことができます。

・ データを追加する

・ データを削除する

- 405 -

・ データを更新する

VB .NETの詳細については、“.NET APIリファレンス”を参照してください。

ここでは“H.1 データの検索”の“ホテルの予約状況検索”のドキュメントサンプルを例にして、更新操作の説明を行いま

す。

なお、XML文書の詳細については、“付録E XML文書についての留意事項”を参照してください。

H.2.1 データを追加する

データを追加する場合のVB .NETの使用例を示します。

追加するデータ

「神奈川のホテル情報(ホテル9の情報)を1件追加したい。」

追加したいデータを組み立て、データを追加します。

APIの使用例

以下にVB .NETを使用したプログラミング例を示します。

Imports System

Imports Fujitsu.Shunsaku

Imports System.ComponentModel

Class SampleInsert

Shared Public Function Main( ByVal args() As String ) As Integer

Dim service As ShunService = Nothing

Try

'' ShunService の作成

service = new ShunService()

'' ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSrv1"

service.Port = 23101

service.Connect()

'' 追加用 ShunRecordCollection を作成

Dim insertRecords As ShunRecordCollection = new ShunRecordCollection()

'' 追加用 ShunRecord を作成

Dim record As ShunRecord = new ShunRecord()

'' データを指定

record.Data = String.Concat( _

"<document>", _

" <base>", _

" <name>ホテル9</name>", _

" <prefecture>新横浜</prefecture>", _

" <address>神奈川県横浜市神奈川区</address>", _

" <detail>http://xxxxx.co.jp</detail>", _

" <price>6000</price>", _

- 406 -

" </base>", _

" <information>", _

" <date>2006年07月18日</date>", _

" </information>", _

"<note>バス付 トイレ付 禁煙ルーム選択可 地下鉄 △△駅徒歩05分</note>", _

"</document>" )

'' コレクションに追加

insertRecords.Add( record )

'' データを追加

service.Insert( insertRecords )

Console.WriteLine( "追加終了" )

'' Shunsaku から切断

service.Disconnect()

Catch e As ShunContinuousException

'' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State = ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException

'' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

End Try

End Function

End Class

実行結果

追加終了

H.2.2 データを削除する

データを削除する場合の、VB .NETの使用例を示します。

検索条件

「2006年7月18日に神奈川で宿泊可能なホテルのうち、ホテル9のデータを削除したい。」

年月日(2006年7月18日)および、場所(神奈川)を条件に検索を行い、ホテル名『ホテル9』と一致したデータを削除しま

す。

APIの使用例

以下にVB .NETを使用したプログラミング例を示します。

- 407 -

Imports System

Imports Fujitsu.Shunsaku

Imports System.ComponentModel

Class SampleDelete

Shared Public Function Main( ByVal args() As String ) As Integer

Dim service As ShunService = Nothing

Try

'' ShunService の作成

service = new ShunService()

'' ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSrv1"

service.Port = 23101

service.Connect()

'' ShunSearchRequirement の作成

Dim req As ShunSearchRequirement = new ShunSearchRequirement()

'' 各種検索条件の設定

req.QueryExpression = "/document/base/prefecture == '新横浜' AND /document/

information/date == '2006年07月18日'"

req.ReturnExpression = "/document/base/name/text()"

req.ReplyNumber = 1

req.RequestCount = 30

'' 検索条件を指定して検索を実行

Dim rs As ShunResultSet = service.Search( req )

'' 削除用 ShunRecordCollection を作成

Dim deleteRecords As ShunRecordCollection = new ShunRecordCollection()

'' ホテル9のレコードを取得

For Each record As ShunRecord In rs.Records

If record.Data = "ホテル9"

deleteRecords.Add( record )

End If

Next

'' 該当レコードの取得に成功している場合 データを削除

If deleteRecords.Count > 0

service.Delete( deleteRecords )

Console.WriteLine( "削除終了" )

End If

'' Shunsaku から切断

service.Disconnect()

Catch e As ShunContinuousException

'' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State = ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException

'' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

- 408 -

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

End Try

End Function

End Class

実行結果

削除終了

H.2.3 データを更新する

データを更新する場合の、VB .NETの使用例を示します。

検索条件

「2006年7月18日に神奈川で宿泊可能なホテルのうち、ホテル1の情報を更新したい。」

年月日(2006年7月18日)を条件に検索を行い、ホテル名『ホテル1』と一致したデータを更新します。

APIの使用例

以下にVB .NETを使用したプログラミング例を示します。

Imports System

Imports Fujitsu.Shunsaku

Imports System.ComponentModel

Class SampleUpdate

Shared Public Function Main( ByVal args() As String ) As Integer

Dim service As ShunService = Nothing

Try

'' ShunService の作成

service = new ShunService()

'' ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSrv1"

service.Port = 23101

service.Connect()

'' ShunSearchRequirement の作成

Dim req As ShunSearchRequirement = new ShunSearchRequirement()

'' 各種検索条件の設定

req.QueryExpression = "/document/base/name == 'ホテル1'"

req.ReturnExpression = "/document/base/name/text()"

req.ReplyNumber = 1

req.RequestCount = 30

'' 検索条件を指定して検索を実行

Dim rs As ShunResultSet = service.Search( req )

- 409 -

'' 更新用 ShunRecordCollection を作成

Dim updateRecords As ShunRecordCollection = new ShunRecordCollection()

'' 検索条件に該当するレコードを取得

For Each record As ShunRecord In rs.Records

If record.Data = "ホテル1"

'' ホテル1の情報について、レコードID、更新データを設定

record.Data = String.Concat( _

"<document>", _

" <base>", _

" <name>ホテル1</name>", _

" <prefecture>大阪</prefecture>", _

" <address>大阪府大阪市中央区</address>", _

" <detail>http:''xxxxx.co.jp</detail>", _

" <price>8000</price>", _

" </base>", _

" <information>", _

" <date>2006年07月18日</date>", _

" </information>", _

" <note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>", _

"</document>" )

updateRecords.Add( record )

End If

Next

'' データ設定に成功している場合、データを更新

If updateRecords.Count > 0

service.Update( updateRecords )

Console.WriteLine( "更新終了" )

End If

'' Shunsaku から切断

service.Disconnect()

Catch e As ShunContinuousException

'' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State = ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException

'' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

End Try

End Function

End Class

実行結果

更新終了

- 410 -

H.3 拡張的なアプリケーション

Shunsakuの機能を駆使したVB .NETの使用例について、説明します。

H.3.1 トランザクションとShunsaku Fileを使ったサンプル

トランザクション機能およびShunsaku Fileを使用する場合のVB .NETの使用例を示します。

ここでは、“5.1 トランザクションの概要”で説明した大学の講義の履修登録を例に、VB .NETの使用例を示します。

APIの使用例

以下にVB .NETを使用したプログラミング例を示します。

Imports System

Imports Fujitsu.Shunsaku

Imports System.ComponentModel

Class SampleDelete

Shared Public Function Main( ByVal args() As String ) As Integer

Dim service As ShunService = Nothing

Try

'' ShunService の作成

service = new ShunService()

'' ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSrv1"

service.Port = 23101

service.ShunsakuFile = "shunsakuFile1"

service.Connect()

'' 受講者数を増やしたいコースを検索するための検索条件を設定

Dim courseReq As ShunSearchRequirement = new ShunSearchRequirement()

courseReq.QueryExpression = "/course/name == 'Business negotiation'"

courseReq.ReturnExpression = "/"

'' 更新対象のコース情報を検索

Dim courseRs As ShunResultSet = service.Search( courseReq )

'' 検索結果からレコード情報を取得

Dim updateCourseRecord As ShunRecord = courseRs.Records( 0 )

'' コース情報更新データ

updateCourseRecord.Data = String.Concat( _

"<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>" )

'' 受講中の情報を追加したい生徒を検索するための検索式、リターン式を設定

Dim studentReq As ShunSearchRequirement = new ShunSearchRequirement()

- 411 -

studentReq.QueryExpression = "/student/e-mail == 'mary\.tompson@example\.com'"

studentReq.ReturnExpression = "/"

'' 更新対象の生徒情報を検索

Dim studentRs As ShunResultSet = service.Search( studentReq )

'' 検索結果からレコード情報を取得

Dim updateStudentRecord As ShunRecord = studentRs.Records( 0 )

'' 生徒情報更新データ

updateStudentRecord.Data = String.Concat( _

"<student>", _

" <first-name>Mary</first-name>", _

" <last-name>Tompson</last-name>", _

" <e-mail>[email protected]</e-mail>", _

" <course>Chinese language</course>", _

" <course>Business negotiation</course>", _

"</student>" )

'' 自動コミットを無効に設定

service.AutoCommit = False

Try

'' コース情報の更新

service.Update( updateCourseRecord )

Console.WriteLine( "コース情報の更新終了" )

'' 生徒情報の更新

service.Update( updateStudentRecord )

Console.WriteLine( "生徒情報の更新終了" )

'' ここまでの更新をコミット

service.Commit()

Catch

If service.State = ShunConnectionState.Open

service.Rollback()

End If

Throw

End Try

'' Shunsaku から切断

service.Disconnect()

Catch e As ShunContinuousException

'' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State = ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException

'' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

End Try

End Function

End Class

- 412 -

実行結果

コース情報の更新終了

生徒情報の更新終了

H.3.2 ダイレクトアクセスキーを使用してデータを検索する

ダイレクトアクセスキーを使用してデータを検索する場合のVB .NETの使用例を示します。

検索するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にVB .NETを使用したプログラミング例を示します。

Imports System

Imports Fujitsu.Shunsaku

Imports System.ComponentModel

Class SampleDirectAccessSearch

Shared Public Function Main( ByVal args() As String ) As Integer

Dim service As ShunService = Nothing

Try

'' ShunService の作成

service = new ShunService()

'' ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSvr1"

service.Port = 23101

service.ShunsakuFile = "shunsakuFile1"

service.Connect()

'' 検索用の ShunKeyRequirement オブジェクトを作成

- 413 -

Dim keyReq As ShunKeyRequirement = new ShunKeyRequirement()

keyReq.KeyName = "key"

'' 検索対象のキーを追加

keyReq.Records.Add( new ShunRecord() )

keyReq.Records( 0 ).Key = "0001"

'' 検索条件を指定して検索を実行

Dim rs As ShunResultSet = service.SearchByKey( keyReq, "/" )

'' 取得したソース情報のダイレクトアクセスキーを取得

Console.WriteLine( "ヒット件数 = {0}", rs.HitCount )

Dim i As Integer = 0

For Each record As ShunRecord In rs.Records

i += 1

Console.WriteLine( "[結果]{0}件目", i )

Console.WriteLine( "ダイレクトアクセスキー: {0}", record.Key )

Console.WriteLine( "データ :" )

Console.WriteLine( record.Data )

Next

'' Shunsaku から切断

service.Disconnect()

Catch e As ShunContinuousException

'' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State =

ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException

'' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

End Try

End Function

End Class

実行結果

ヒット件数 = 1

[結果]1件目

ダイレクトアクセスキー:0001

データ :

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

- 414 -

H.3.3 ダイレクトアクセスキーを使用してデータを削除する

ダイレクトアクセスキーを使用してデータを削除する場合のVB .NETの使用例を示します。

削除するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にVB .NETを使用したプログラミング例を示します。

Imports System

Imports Fujitsu.Shunsaku

Imports System.ComponentModel

Class SampleDirectAccessDelete

Shared Public Function Main( ByVal args() As String ) As Integer

Dim service As ShunService = Nothing

Try

'' ShunService の作成

service = new ShunService()

'' ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSvr1"

service.Port = 23101

service.ShunsakuFile = "shunsakuFile1"

service.Connect()

'' 削除用の ShunKeyRequirement オブジェクトを作成

Dim keyReq As ShunKeyRequirement = new ShunKeyRequirement()

keyReq.KeyName = "key"

'' 削除したいデータのダイレクトアクセスキーを追加

keyReq.Records.Add( new ShunRecord() )

keyReq.Records( 0 ).Key = "0001"

''コース情報の更新

service.DeleteByKey( keyReq )

- 415 -

Console.WriteLine( "削除終了" )

'' Shunsaku から切断

service.Disconnect()

Catch e As ShunContinuousException

'' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State =

ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

Catch e As ShunConnectionTerminatedException

'' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

End Try

End Function

End Class

実行結果

削除終了

H.3.4 ダイレクトアクセスキーを使用してデータを更新する

ダイレクトアクセスキーを使用してデータを更新する場合のVB .NETの使用例を示します。

更新するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

定義したダイレクトアクセスキー

key /course/id/text()

- 416 -

APIの使用例

以下にVB .NETを使用したプログラミング例を示します。

Imports System

Imports Fujitsu.Shunsaku

Imports System.ComponentModel

Class SampleDirectAccessUpdate

Shared Public Function Main( ByVal args() As String ) As Integer

Dim service As ShunService = Nothing

Try

'' ShunService の作成

service = new ShunService()

'' ホスト名 ポート番号を指定して Shunsaku に接続

service.Host = "DirSvr1"

service.Port = 23101

service.ShunsakuFile = "shunsakuFile1"

service.Connect()

'' 更新用の ShunKeyRequirement オブジェクトを作成

Dim keyReq As ShunKeyRequirement = new ShunKeyRequirement()

keyReq.KeyName = "key"

'' 更新対象のキーを追加

keyReq.Records.Add( new ShunRecord() )

keyReq.Records( 0 ).Key = "0001"

'' 更新データを設定

keyReq.Records( 0 ).Data = String.Concat( _

"<course>", _

" <id>0001</id>", _

" <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>" )

''コース情報の更新

service.UpdateByKey( keyReq )

Console.WriteLine( "更新終了" )

'' Shunsaku から切断

service.Disconnect()

Catch e As ShunContinuousException

'' ShunContinuousExceptionが発生した場合の処理を記述

Try

If Not service Is Nothing And service.State =

ShunConnectionState.Open Then

service.Disconnect()

End If

Catch ex As ShunException

Console.WriteLine( "エラーメッセージ : {0}", ex.Message )

End Try

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

- 417 -

Catch e As ShunConnectionTerminatedException

'' ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console.WriteLine( "エラーメッセージ : {0}", e.Message )

End Try

End Function

End Class

実行結果

更新終了

- 418 -

付録I C++ .NET サンプルプログラム

C++ .NETを使用したサンプルプログラムを示します。

I.1 データの検索

データの内容に対して条件を指定して結果を得るためには、Shunsakuが提供するAPIを使用します。

C++ .NETでは、以下に示す操作ができます。

・ 検索条件に一致するXML文書の件数を取得する

・ 検索条件に一致するXML文書を指定した形式で取得する

・ 特定のXML文書をすべて取得する

・ 検索条件に一致するXML文書をソートして取得する

・ 検索条件に一致するXML文書の値を集計して取得する

C++ .NETの詳細については、“.NET APIリファレンス”を参照してください。

ここでは“ホテルの予約状況検索”を例にして、検索操作の説明を行います。

また、検索操作の説明にあたり、以下のXML文書が存在するものとします。

なお、XML文書の詳細については、“付録E XML文書についての留意事項”を参照してください。

ドキュメントサンプル

<document>

<base>

<name>ホテル1</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>9000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル2</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩05分</note>

</document>

<document>

<base>

<name>ホテル3</name>

<prefecture>大阪</prefecture>

- 419 -

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>7500</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩10分</note>

</document>

<document>

<base>

<name>ホテル4</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>5000</price>

</base>

<information>

<date>2006年07月10日</date>

</information>

<note>バス付 トイレ付 地下鉄 ××駅徒歩03分</note>

</document>

<document>

<base>

<name>ホテル5</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月10日</date>

</information>

<note>バス付 トイレ付 地下鉄 ××駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル6</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市港北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>8000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル7</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市港北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>7000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩03分</note>

</document>

<document>

<base>

- 420 -

<name>ホテル8</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市神奈川区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩05分</note>

</document>

I.1.1 検索条件に一致するXML文書の件数を求める

検索操作において、対象となるデータが大量に存在する場合、条件式に一致するデータすべてを参照することは非現

実的です。このため、大量のデータが存在する場合は、条件式に一致するデータ件数を取得することが必要です。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数を取得する例を用いて、C++ .NETの使用例を示し

ます。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルは何件ありますか?」

年月日(2006年7月18日)および場所(大阪)を条件に指定し、検索を実行します。

APIの使用例

以下にC++ .NETを使用したプログラミング例を示します。

#using <mscorlib.dll>

#using <system.dll>

#using <Fujitsu.Shunsaku.dll>

using namespace System;

using namespace Fujitsu::Shunsaku;

class SampleHitCount {

public:

static void Main( String *args __gc[] ) {

ShunService *service = 0;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service->Host = "DirSvr1";

service->Port = 23101;

service->Connect();

// 検索式

String *query = "/document {/base/prefecture == '大阪' AND /information/date ==

'2006年07月18日'}";

// 検索式でヒット件数の検索

- 421 -

int hitCount = service->GetHitCount( query );

// ヒット件数の表示

Console::WriteLine( "ヒット件数 = {0}", __box( hitCount ) );

// Shunsaku から切断

service->Disconnect();

}

catch ( ShunContinuousException *e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != 0 && service->State == ShunConnectionState::Open ) {

service->Disconnect();

}

}

catch ( ShunException *ex ) {

Console::WriteLine( "エラーメッセージ : {0}", ex->Message );

}

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

catch ( ShunConnectionTerminatedException *e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

}

};

int main() {

return SampleHitCount::Main( Environment::GetCommandLineArgs() );

}

実行結果

ヒット件数 = 3

I.1.2 検索条件に一致するXML文書を指定した形式で取得する

検索操作において、検索結果として得られたデータの一部を追加条件として次の検索を行うことがよくあります。このよう

な場合、検索結果としてはデータのすべてではなく、その一部を取得することが一般的です。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数と部分情報を取得する例を用いて、C++ .NETの使

用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルのホテル名と宿泊費を 大30件分知りたい。」

年月日(2006年7月18日)および、場所(大阪)を条件に指定します。また、取得する結果はホテル名と宿泊費を指定し、検

索を実行します。

APIの使用例

- 422 -

以下にC++ .NETを使用したプログラミング例を示します。

#using <mscorlib.dll>

#using <system.dll>

#using <Fujitsu.Shunsaku.dll>

using namespace System;

using namespace Fujitsu::Shunsaku;

class SampleSearch {

public:

static void Main( String *args __gc[] ) {

ShunService *service = 0;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service->Host = "DirSvr1";

service->Port = 23101;

service->Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement *req = new ShunSearchRequirement();

// 各種検索条件の設定

req->QueryExpression = "/document {/base/prefecture == '大阪' AND /information/

date == '2006年07月18日'}";

req->ReturnExpression = "/document/base/name, /document/base/price";

req->ReplyNumber = 1;

req->RequestCount = 30;

// 検索条件を指定して検索を実行

ShunResultSet *rs = service->Search( req );

// 検索結果の表示

Console::WriteLine( "ヒット件数 = {0}", __box( rs->HitCount ) );

int i = 0;

ShunRecordEnumerator *enumerator = rs->Records->GetEnumerator();

while ( enumerator->MoveNext() ) {

ShunRecord *record = enumerator->Current;

++i;

Console::WriteLine( "[結果]{0}件目 = {1}", __box( i ), record->Data );

}

// Shunsaku から切断

service->Disconnect();

}

catch ( ShunContinuousException *e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != 0 && service->State == ShunConnectionState::Open ) {

service->Disconnect();

}

}

catch ( ShunException *ex ) {

Console::WriteLine( "エラーメッセージ : {0}", ex->Message );

}

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

catch ( ShunConnectionTerminatedException *e ) {

- 423 -

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

}

};

int main() {

return SampleSearch::Main( Environment::GetCommandLineArgs() );

}

実行結果

ヒット件数 = 3

[結果]1件目 = <document><name>ホテル1</name><price>9000</price></document>

[結果]2件目 = <document><name>ホテル2</name><price>6000</price></document>

[結果]3件目 = <document><name>ホテル3</name><price>7500</price></document>

I.1.3 特定のXML文書をすべて取得する

検索操作において、“I.1.1 検索条件に一致するXML文書の件数を求める”および“I.1.2 検索条件に一致するXML文書を指定した形式で取得する”といった操作を経て、絞り込んだ条件を基に、データすべてを取得することになります。

“I.1.2 検索条件に一致するXML文書を指定した形式で取得する”の操作により得られたホテル名を基に、該当するホテ

ルのデータをすべて取得する例を用いて、C++ .NETの使用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルのうち、あるホテルの詳細情報を取得したい。」

年月日(2006年7月18日)および、場所(大阪)を条件に指定し、検索を実行します。また、ホテルに対応するレコードIDを

用いて、詳細情報を取得します。

APIの使用例

以下にC++ .NETを使用したプログラミング例を示します。

#using <mscorlib.dll>

#using <system.dll>

#using <Fujitsu.Shunsaku.dll>

using namespace System;

using namespace Fujitsu::Shunsaku;

class SampleSearchByRecordID {

public:

static void Main( String *args __gc[] ) {

ShunService *service = 0;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

- 424 -

service->Host = "DirSvr1";

service->Port = 23101;

service->Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement *req = new ShunSearchRequirement();

// 各種検索条件の設定

req->QueryExpression = "/document {/base/prefecture == '大阪' AND /information/

date == '2006年07月18日'}";

req->ReturnExpression = "/document/base/name/text()";

req->ReplyNumber = 1;

req->RequestCount = 30;

// 検索条件を指定して検索を実行

ShunResultSet *rs = service->Search( req );

// 検索結果の表示

Console::WriteLine( "ヒット件数 = {0}", __box( rs->HitCount ) );

// 検索用 ShunRecordCollection を作成

ShunRecordCollection *searchRecords = new ShunRecordCollection();

// 検索条件に該当するレコードを取得

ShunRecordEnumerator *enumerator = rs->Records->GetEnumerator();

while ( enumerator->MoveNext() ) {

ShunRecord *record = enumerator->Current;

if ( record->Data->Equals( "ホテル1" ) ) {

searchRecords->Add( record );

}

}

// 該当レコードの取得に成功している場合 詳細データを参照

if ( searchRecords->Count > 0 ) {

rs = service->SearchByRecordID( searchRecords );

enumerator = rs->Records->GetEnumerator();

while ( enumerator->MoveNext() ) {

ShunRecord *record = enumerator->Current;

Console::WriteLine( "[詳細] = {0}", record->Data );

}

}

// Shunsaku から切断

service->Disconnect();

}

catch ( ShunContinuousException *e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != 0 && service->State == ShunConnectionState::Open ) {

service->Disconnect();

}

}

catch ( ShunException *ex ) {

Console::WriteLine( "エラーメッセージ : {0}", ex->Message );

}

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

catch ( ShunConnectionTerminatedException *e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

}

- 425 -

};

int main() {

return SampleSearchByRecordID::Main( Environment::GetCommandLineArgs() );

}

実行結果

ヒット件数 = 3

[詳細] = <document>

<base>

<name>ホテル1</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>9000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

I.1.4 検索条件に一致するXML文書をソートして取得する

検索操作において、検索した結果をある特定の要素をキーとしてソートして取得したい場合があります。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数と部分情報を取得します。

データを取得する際に、宿泊費の高い順に取り出す例を用いて、C++ .NETの使用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルを、宿泊費の高い順に並べて取得したい。」

年月日(2006年7月18日)および、場所(大阪)を条件に指定します。また、ソート条件に宿泊費を指定し、検索を実行しま

す。

APIの使用例

以下にC++ .NETを使用したプログラミング例を示します。

#using <mscorlib.dll>

#using <system.dll>

#using <Fujitsu.Shunsaku.dll>

using namespace System;

using namespace Fujitsu::Shunsaku;

class SampleSort1 {

public:

static void Main( String *args __gc[] ) {

ShunService *service = 0;

- 426 -

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service->Host = "DirSvr1";

service->Port = 23101;

service->Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement *req = new ShunSearchRequirement();

// 各種検索条件の設定

req->QueryExpression = "/document {/base/prefecture == '大阪' AND /information/

date == '2006年07月18日'}";

req->ReturnExpression = "/document/base/name, /document/base/price";

req->SortExpression = "/document/base/price/text() DESC";

req->ReplyNumber = 1;

req->RequestCount = 30;

// 検索条件を指定して検索を実行

ShunResultSet *rs = service->Search( req );

// 検索結果の表示

Console::WriteLine( "ヒット件数 = {0}", __box( rs->HitCount ) );

int i = 0;

ShunRecordEnumerator *enumerator = rs->Records->GetEnumerator();

while ( enumerator->MoveNext() ) {

ShunRecord *record = enumerator->Current;

++i;

Console::WriteLine( "[結果]{0}件目 = {1}", __box( i ), record->Data );

}

// Shunsaku から切断

service->Disconnect();

}

catch ( ShunContinuousException *e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != 0 && service->State == ShunConnectionState::Open ) {

service->Disconnect();

}

}

catch ( ShunException *ex ) {

Console::WriteLine( "エラーメッセージ : {0}", ex->Message );

}

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

catch ( ShunConnectionTerminatedException *e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

}

};

int main() {

return SampleSort1::Main( Environment::GetCommandLineArgs() );

}

- 427 -

実行結果

Number of hits = 3

[結果]1件目 = <document><name>ホテル1</name><price>9000</price></document>

[結果]2件目 = <document><name>ホテル3</name><price>7500</price></document>

[結果]3件目 = <document><name>ホテル2</name><price>6000</price></document>

I.1.5 検索条件に一致するXML文書の値を集計して取得する

検索操作において、検索した結果をある特定の要素の値を集計して取得したい場合があります。

場所を検索条件式に指定して、 も安い宿泊費、 も高い宿泊費、宿泊費の平均値を取得する例を用いて、C++ .NETの使用例を示します。

検索条件

「2006年7月18日に宿泊可能なホテルのうち、 も安い宿泊費、 も高い宿泊費、宿泊費の平均値を地域別に集計して

欲しい。」

年月日(2006年7月18日)を条件に指定します。また、取得する結果に集計式(min, max, avg)を指定し、集計結果を取得

します。

APIの使用例

以下にC++ .NETを使用したプログラミング例を示します。

#using <mscorlib.dll>

#using <system.dll>

#using <Fujitsu.Shunsaku.dll>

using namespace System;

using namespace Fujitsu::Shunsaku;

class SampleSort2 {

public:

static void Main( String *args __gc[] ) {

ShunService *service = 0;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service->Host = "DirSvr1";

service->Port = 23101;

service->Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement *req = new ShunSearchRequirement();

// 各種検索条件の設定

req->QueryExpression = "/document/information/date == '2006年07月18日'";

req->ReturnExpression = "/document/base/prefecture/text(), min(/document/base/

price/text()), max(/document/base/price/text()), avg(/document/base/price/text())";

- 428 -

req->SortExpression = "/document/base/prefecture/text()";

req->ReplyNumber = 1;

req->RequestCount = 30;

// 検索条件を指定して検索を実行

ShunResultSet *rs = service->Search( req );

// 検索結果の表示

// 検索条件に該当するデータを取得

int i = 0;

ShunRecordEnumerator *enumerator = rs->Records->GetEnumerator();

while ( enumerator->MoveNext() ) {

ShunRecord *record = enumerator->Current;

++i;

Console::WriteLine( "[結果]{0}件目:", __box( i ) );

String *result __gc[,] = record->GetDividedDataAsTwoRankArray();

Console::WriteLine(" 地域 :{0}", result[0,0]);

Console::WriteLine(" も安い宿泊費:{0}", result[1,0]);

Console::WriteLine(" も高い宿泊費:{0}", result[2,0]);

Console::WriteLine(" 宿泊費の平均値:{0}", result[3,0]);

}

// Shunsaku から切断

service->Disconnect();

}

catch ( ShunContinuousException *e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != 0 && service->State == ShunConnectionState::Open ) {

service->Disconnect();

}

}

catch ( ShunException *ex ) {

Console::WriteLine( "エラーメッセージ : {0}", ex->Message );

}

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

catch ( ShunConnectionTerminatedException *e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

}

};

int main() {

return SampleSort2::Main( Environment::GetCommandLineArgs() );

}

実行結果

[結果]1件目:

地域 :神奈川

も安い宿泊費:6000

も高い宿泊費:8000

宿泊費の平均値:7000

[結果]2件目:

地域 :大阪

も安い宿泊費:6000

- 429 -

も高い宿泊費:9000

宿泊費の平均値:7500

I.1.6 ヒット件数の上限値を設定する

ヒット件数の上限値を設定する場合のC++ .NETの使用例を示します。

APIの使用例

以下にC++ .NETを使用したプログラミング例を示します。

#using <mscorlib.dll>

#using <system.dll>

#using <Fujitsu.Shunsaku.dll>

using namespace System;

using namespace Fujitsu::Shunsaku;

class SampleSearchLimit {

public:

static void Main( String *args __gc[] ) {

ShunService *service = 0;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service->Host = "DirSvr1";

service->Port = 23101;

service->Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement *req = new ShunSearchRequirement();

// 各種検索条件の設定

req->QueryExpression = "/document/base/name = 'ホテル'";

req->ReturnExpression = "/document/base/name/text(), /document/base/

price/text()";

req->SortExpression = "/document/base/price/text()";

req->ReplyNumber = 1;

req->RequestCount = 5;

// ヒット件数リミッタを設定

req->HitCountLimit = 5;

// 検索条件を指定して検索を実行

ShunResultSet *rs = service->Search( req );

// 検索結果の表示

Console::WriteLine( "ヒット件数 = {0}", __box( rs->HitCount ) );

if ( rs->IsHitCountLimitOver ) {

Console::WriteLine( "ヒット件数リミッタをオーバーしました。" );

}

int i = 0;

ShunRecordEnumerator *enumerator = rs->Records->GetEnumerator();

while ( enumerator->MoveNext() ) {

ShunRecord *record = enumerator->Current;

++i;

Console::WriteLine( "[結果]{0}件目 = {1}", __box( i ), record-

- 430 -

>Data );

}

// Shunsaku から切断

service->Disconnect();

}

catch ( ShunContinuousException *e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != 0 && service->State == ShunConnectionState::Open )

{

service->Disconnect();

}

}

catch ( ShunException *ex ) {

Console::WriteLine( "エラーメッセージ : {0}", ex->Message );

}

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

catch ( ShunConnectionTerminatedException *e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

}

};

int main() {

return SampleSearchLimit::Main( Environment::GetCommandLineArgs() );

}

実行結果

ヒット件数 = 8

ヒット件数リミッタをオーバーしました。

I.2 データの更新

データを更新するためには、Shunsakuが提供するAPIを使用します。

.NET APIを使用することで、以下の操作を行うことができます。

・ データを追加する

・ データを削除する

・ データを更新する

C++ .NETの詳細については、“.NET APIリファレンス”を参照してください。

- 431 -

ここでは“I.1 データの検索”の“ホテルの予約状況検索”のドキュメントサンプルを例にして、更新操作の説明を行いま

す。

なお、XML文書の詳細については、“付録E XML文書についての留意事項”を参照してください。

I.2.1 データを追加する

データを追加する場合のC++ .NETの使用例を示します。

追加するデータ

「神奈川のホテル情報(ホテル9の情報)を1件追加したい。」

追加したいデータを組み立て、データを追加します。

APIの使用例

以下にC++ .NETを使用したプログラミング例を示します。

#using <mscorlib.dll>

#using <system.dll>

#using <Fujitsu.Shunsaku.dll>

using namespace System;

using namespace Fujitsu::Shunsaku;

class SampleInsert {

public:

static void Main( String *args __gc[] ) {

ShunService *service = 0;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service->Host = "DirSvr1";

service->Port = 23101;

service->Connect();

// 追加用 ShunRecordCollection を作成

ShunRecordCollection *insertRecords = new ShunRecordCollection();

// 追加用 ShunRecord を作成

ShunRecord *record = new ShunRecord();

// データを指定

record->Data = String::Concat(

S"<document>",

S" <base>",

S" <name>ホテル9</name>",

S" <prefecture>新横浜</prefecture>",

S" <address>神奈川県横浜市神奈川区</address>",

S" <detail>http://xxxxx.co.jp</detail>",

S" <price>6000</price>",

S" </base>",

S" <information>",

S" <date>2006年07月18日</date>",

- 432 -

S" </information>",

S"<note>バス付 トイレ付 禁煙ルーム選択可 地下鉄 △△駅徒歩05分</note>",

S"</document>" );

// コレクションに追加

insertRecords->Add( record );

// データを追加

service->Insert( insertRecords );

Console::WriteLine( "追加終了" );

// Shunsaku から切断

service->Disconnect();

}

catch ( ShunContinuousException *e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != 0 && service->State == ShunConnectionState::Open ) {

service->Disconnect();

}

}

catch ( ShunException *ex ) {

Console::WriteLine( "エラーメッセージ : {0}", ex->Message );

}

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

catch ( ShunConnectionTerminatedException *e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

}

};

int main() {

return SampleInsert::Main( Environment::GetCommandLineArgs() );

}

実行結果

追加終了

I.2.2 データを削除する

データを削除する場合の、C++ .NETの使用例を示します。

検索条件

「2006年7月18日に神奈川で宿泊可能なホテルのうち、ホテル9のデータを削除したい。」

年月日(2006年7月18日)および、場所(神奈川)を条件に検索を行い、ホテル名『ホテル9』と一致したデータを削除しま

す。

APIの使用例

- 433 -

以下にC++ .NETを使用したプログラミング例を示します。

#using <mscorlib.dll>

#using <system.dll>

#using <Fujitsu.Shunsaku.dll>

using namespace System;

using namespace Fujitsu::Shunsaku;

class SampleDelete {

public:

static void Main( String *args __gc[] ) {

ShunService *service = 0;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service->Host = "DirSvr1";

service->Port = 23101;

service->Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement *req = new ShunSearchRequirement();

// 各種検索条件の設定

req->QueryExpression = "/document/base/prefecture == '新横浜' AND /document/

information/date == '2006年07月18日'";

req->ReturnExpression = "/document/base/name/text()";

req->ReplyNumber = 1;

req->RequestCount = 30;

// 検索条件を指定して検索を実行

ShunResultSet *rs = service->Search( req );

// 削除用 ShunRecordCollection を作成

ShunRecordCollection *deleteRecords = new ShunRecordCollection();

// ホテル9のレコードを取得

ShunRecordEnumerator *enumerator = rs->Records->GetEnumerator();

while ( enumerator->MoveNext() ) {

ShunRecord *record = enumerator->Current;

if ( record->Data->Equals( "ホテル9" ) ) {

deleteRecords->Add( record );

}

}

// 該当レコードの取得に成功している場合 データを削除

if ( deleteRecords->Count > 0 ) {

service->Delete( deleteRecords );

Console::WriteLine( "削除終了" );

}

// Shunsaku から切断

service->Disconnect();

}

catch ( ShunContinuousException *e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != 0 && service->State == ShunConnectionState::Open ) {

service->Disconnect();

- 434 -

}

}

catch ( ShunException *ex ) {

Console::WriteLine( "エラーメッセージ : {0}", ex->Message );

}

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

catch ( ShunConnectionTerminatedException *e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

}

};

int main() {

return SampleDelete::Main( Environment::GetCommandLineArgs() );

}

実行結果

削除終了

I.2.3 データを更新する

データを更新する場合の、C++ .NETの使用例を示します。

検索条件

「2006年7月18日に神奈川で宿泊可能なホテルのうち、ホテル1の情報を更新したい。」

年月日(2006年7月18日)を条件に検索を行い、ホテル名『ホテル1』と一致したデータを更新します。

APIの使用例

以下にC++ .NETを使用したプログラミング例を示します。

#using <mscorlib.dll>

#using <system.dll>

#using <Fujitsu.Shunsaku.dll>

using namespace System;

using namespace Fujitsu::Shunsaku;

class SampleUpdate {

public:

static void Main( String *args __gc[] ) {

ShunService *service = 0;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service->Host = "DirSvr1";

- 435 -

service->Port = 23101;

service->Connect();

// ShunSearchRequirement の作成

ShunSearchRequirement *req = new ShunSearchRequirement();

// 各種検索条件の設定

req->QueryExpression = "/document/base/name == 'ホテル1'";

req->ReturnExpression = "/document/base/name/text()";

req->ReplyNumber = 1;

req->RequestCount = 30;

// 検索条件を指定して検索を実行

ShunResultSet *rs = service->Search( req );

// 更新用 ShunRecordCollection を作成

ShunRecordCollection *updateRecords = new ShunRecordCollection();

// 検索条件に該当するレコードを取得

ShunRecordEnumerator *enumerator = rs->Records->GetEnumerator();

while ( enumerator->MoveNext() ) {

ShunRecord *record = enumerator->Current;

if ( record->Data->Equals( "ホテル1" ) ) {

// ホテル1の情報について、レコードID、更新データを設定

record->Data = String::Concat(

S"<document>",

S" <base>",

S" <name>ホテル1</name>",

S" <prefecture>大阪</prefecture>",

S" <address>大阪府大阪市中央区</address>",

S" <detail>http://xxxxx.co.jp</detail>",

S" <price>8000</price>",

S" </base>",

S" <information>",

S" <date>2006年07月18日</date>",

S" </information>",

S" <note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>",

S"</document>" );

updateRecords->Add( record );

}

}

// データ設定に成功している場合、データを更新

if ( updateRecords->Count > 0 ) {

service->Update( updateRecords );

Console::WriteLine( "更新終了" );

}

// Shunsaku から切断

service->Disconnect();

}

catch ( ShunContinuousException *e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != 0 && service->State == ShunConnectionState::Open ) {

service->Disconnect();

}

}

catch ( ShunException *ex ) {

Console::WriteLine( "エラーメッセージ : {0}", ex->Message );

}

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

- 436 -

}

catch ( ShunConnectionTerminatedException *e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

}

};

int main() {

return SampleUpdate::Main( Environment::GetCommandLineArgs() );

}

実行結果

更新終了

I.3 拡張的なアプリケーション

Shunsakuの機能を駆使したC++ .NETの使用例について、説明します。

I.3.1 トランザクションとShunsaku Fileを使ったサンプル

トランザクション機能およびShunsaku Fileを使用する場合のC++ .NETの使用例を示します。

ここでは、“5.1 トランザクションの概要”で説明した大学の講義の履修登録を例に、C++ .NETの使用例を示します。

APIの使用例

以下にC++ .NETを使用したプログラミング例を示します。

#using <mscorlib.dll>

#using <system.dll>

#using <Fujitsu.Shunsaku.dll>

using namespace System;

using namespace Fujitsu::Shunsaku;

class SampleTransaction {

public:

static void Main( String *args __gc[] ) {

ShunService *service = 0;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service->Host = "DirSvr1";

service->Port = 23101;

service->ShunsakuFile = "shunsakuFile1";

service->Connect();

// 受講者数を増やしたいコースを検索するための検索条件を設定

ShunSearchRequirement *courseReq = new ShunSearchRequirement();

- 437 -

courseReq->QueryExpression = "/course/name == 'Business negotiation'";

courseReq->ReturnExpression = "/";

// 更新対象のコース情報を検索

ShunResultSet *courseRs = service->Search( courseReq );

// 検索結果からレコード情報を取得

ShunRecord *updateCourseRecord = courseRs->Records->Item[0];

// コース情報更新データ

updateCourseRecord->Data = String::Concat(

S"<course>",

S" <name>Business negotiation</name>",

S" <instructor>",

S" <first-name>Max</first-name>",

S" <last-name>cameron</last-name>",

S" </instructor>",

S" <capacity>40</capacity>",

S" <current-auditors>31</current-auditors>",

S"</course>" );

// 受講中の情報を追加したい生徒を検索するための検索式、リターン式を設定

ShunSearchRequirement *studentReq = new ShunSearchRequirement();

studentReq->QueryExpression = "/student/e-mail == 'mary\\.tompson@example\

\.com'";

studentReq->ReturnExpression = "/";

// 更新対象の生徒情報を検索

ShunResultSet *studentRs = service->Search( studentReq );

// 検索結果からレコード情報を取得

ShunRecord *updateStudentRecord = studentRs->Records->Item[0];

// 生徒情報更新データ

updateStudentRecord->Data = String::Concat(

S"<student>",

S" <first-name>Mary</first-name>",

S" <last-name>Tompson</last-name>",

S" <e-mail>[email protected]</e-mail>",

S" <course>Chinese language</course>",

S" <course>Business negotiation</course>",

S"</student>" );

// 自動コミットを無効に設定

service->AutoCommit = false;

try {

// コース情報の更新

service->Update( updateCourseRecord );

Console::WriteLine( "コース情報の更新終了" );

// 生徒情報の更新

service->Update( updateStudentRecord );

Console::WriteLine( "生徒情報の更新終了" );

// ここまでの更新をコミット

service->Commit();

}

catch ( Exception *e ) {

if ( service->State == ShunConnectionState::Open ) {

service->Rollback();

}

throw;

- 438 -

}

// Shunsaku から切断

service->Disconnect();

}

catch ( ShunContinuousException *e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != 0 && service->State == ShunConnectionState::Open ) {

service->Disconnect();

}

}

catch ( ShunException *ex ) {

Console::WriteLine( "エラーメッセージ : {0}", ex->Message );

}

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

catch ( ShunConnectionTerminatedException *e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

}

};

int main() {

return SampleTransaction::Main( Environment::GetCommandLineArgs() );

}

実行結果

コース情報の更新終了

生徒情報の更新終了

I.3.2 ダイレクトアクセスキーを使用してデータを検索する

ダイレクトアクセスキーを使用してデータを検索する場合のC++ .NETの使用例を示します。

検索するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

- 439 -

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にC++ .NETを使用したプログラミング例を示します。

#using <mscorlib.dll>

#using <system.dll>

#using <Fujitsu.Shunsaku.dll>

using namespace System;

using namespace Fujitsu::Shunsaku;

class SampleDirectAccessSearch {

public:

static void Main( String *args __gc[] ) {

ShunService *service = 0;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service->Host = "DirSvr1";

service->Port = 23101;

service->ShunsakuFile = "shunsakuFile1";

service->Connect();

// 検索用の ShunKeyRequirement オブジェクトを作成

ShunKeyRequirement *keyReq = new ShunKeyRequirement();

keyReq->KeyName = "key";

// 検索対象のキーを追加

keyReq->Records->Add( new ShunRecord() );

keyReq->Records->get_Item( 0 )->Key = "0001";

// 検索条件を指定して検索を実行

ShunResultSet *rs = service->SearchByKey( keyReq, "/" );

// 取得したソース情報のダイレクトアクセスキーを取得

Console::WriteLine( "ヒット件数 = {0}", __box( rs->HitCount ) );

int i = 0;

ShunRecordEnumerator *enumerator = rs->Records->GetEnumerator();

while ( enumerator->MoveNext() ) {

ShunRecord *record = enumerator->Current;

++i;

Console::WriteLine( "[結果]{0}件目", __box( i ) );

Console::WriteLine( "ダイレクトアクセスキー: {0}", record-

>Key );

Console::WriteLine( "データ :" );

Console::WriteLine( record->Data );

}

// Shunsaku から切断

service->Disconnect();

}

catch ( ShunContinuousException *e ) {

- 440 -

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != 0 && service->State == ShunConnectionState::Open )

{

service->Disconnect();

}

}

catch ( ShunException *ex ) {

Console::WriteLine( "エラーメッセージ : {0}", ex->Message );

}

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

catch ( ShunConnectionTerminatedException *e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

}

};

int main() {

return

SampleDirectAccessSearch::Main( Environment::GetCommandLineArgs() );

}

実行結果

ヒット件数 = 1

[結果]1件目

ダイレクトアクセスキー:0001

データ :

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

I.3.3 ダイレクトアクセスキーを使用してデータを削除する

ダイレクトアクセスキーを使用してデータを削除する場合のC++ .NETの使用例を示します。

削除するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

- 441 -

<current-auditors>30</current-auditors>

</course>

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にC++ .NETを使用したプログラミング例を示します。

#using <mscorlib.dll>

#using <system.dll>

#using <Fujitsu.Shunsaku.dll>

using namespace System;

using namespace Fujitsu::Shunsaku;

class SampleDirectAccessDelete {

public:

static void Main( String *args __gc[] ) {

ShunService *service = 0;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service->Host = "DirSvr1";

service->Port = 23101;

service->ShunsakuFile = "shunsakuFile1";

service->Connect();

// 削除用の ShunKeyRequirement オブジェクトを作成

ShunKeyRequirement *keyReq = new ShunKeyRequirement();

keyReq->KeyName = "key";

// 削除したいデータのダイレクトアクセスキーを追加

keyReq->Records->Add( new ShunRecord() );

keyReq->Records->get_Item( 0 )->Key = "0001";

//コース情報の更新

service->DeleteByKey( keyReq );

Console::WriteLine( "削除終了" );

// Shunsaku から切断

service->Disconnect();

}

catch ( ShunContinuousException *e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != 0 && service->State == ShunConnectionState::Open )

{

service->Disconnect();

}

- 442 -

}

catch ( ShunException *ex ) {

Console::WriteLine( "エラーメッセージ : {0}", ex->Message );

}

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

catch ( ShunConnectionTerminatedException *e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

}

};

int main() {

return

SampleDirectAccessDelete::Main( Environment::GetCommandLineArgs() );

}

実行結果

削除終了

I.3.4 ダイレクトアクセスキーを使用してデータを更新する

ダイレクトアクセスキーを使用してデータを更新する場合のC++ .NETの使用例を示します。

更新するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にC++ .NETを使用したプログラミング例を示します。

#using <mscorlib.dll>

#using <system.dll>

#using <Fujitsu.Shunsaku.dll>

- 443 -

using namespace System;

using namespace Fujitsu::Shunsaku;

class SampleDirectAccessUpdate {

public:

static void Main( String *args __gc[] ) {

ShunService *service = 0;

try {

// ShunService の作成

service = new ShunService();

// ホスト名 ポート番号を指定して Shunsaku に接続

service->Host = "DirSvr1";

service->Port = 23101;

service->ShunsakuFile = "shunsakuFile1";

service->Connect();

// 更新用の ShunKeyRequirement オブジェクトを作成

ShunKeyRequirement *keyReq = new ShunKeyRequirement();

keyReq->KeyName = "key";

// 更新対象のキーを追加

keyReq->Records->Add( new ShunRecord() );

keyReq->Records->get_Item( 0 )->Key = "0001";

// 更新データを設定

keyReq->Records->get_Item( 0 )->Data = String::Concat(

S"<course>",

S" <id>0001</id>",

S" <name>Business negotiation</name>",

S" <instructor>",

S" <first-name>Max</first-name>",

S" <last-name>cameron</last-name>",

S" </instructor>",

S" <capacity>40</capacity>",

S" <current-auditors>31</current-auditors>",

S"</course>" );

//コース情報の更新

service->UpdateByKey( keyReq );

Console::WriteLine( "更新終了" );

// Shunsaku から切断

service->Disconnect();

}

catch ( ShunContinuousException *e ) {

// ShunContinuousExceptionが発生した場合の処理を記述

try {

if( service != 0 && service->State == ShunConnectionState::Open )

{

service->Disconnect();

}

}

catch ( ShunException *ex ) {

Console::WriteLine( "エラーメッセージ : {0}", ex->Message );

}

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

catch ( ShunConnectionTerminatedException *e ) {

// ShunConnectionTerminatedExceptionが発生した場合の処理を記述

- 444 -

Console::WriteLine( "エラーメッセージ : {0}", e->Message );

}

}

};

int main() {

return

SampleDirectAccessUpdate::Main( Environment::GetCommandLineArgs() );

}

実行結果

更新終了

- 445 -

付録J C サンプルプログラム

C APIを使用したサンプルプログラムを示します。

J.1 データの検索

データの内容に対して条件を指定して結果を得るためには、Shunsakuが提供するAPIを使用します。

C APIでは、以下に示す操作ができます。

・ 検索条件に一致するXML文書の件数を取得する

・ 検索条件に一致するXML文書を指定した形式で取得する

・ 特定のXML文書をすべて取得する

・ 検索条件に一致するXML文書をソートして取得する

・ 検索条件に一致するXML文書の値を集計して取得する

C APIの詳細については、“C APIリファレンス”を参照してください。

ここでは“ホテルの予約状況検索”を例にして、検索操作の説明を行います。

また、検索操作の説明にあたり、以下のXML文書が存在するものとします。

なお、XML文書の詳細については、“付録E XML文書についての留意事項”を参照してください。

ドキュメントサンプル

<document>

<base>

<name>ホテル1</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>9000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル2</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩05分</note>

</document>

<document>

- 446 -

<base>

<name>ホテル3</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>7500</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩10分</note>

</document>

<document>

<base>

<name>ホテル4</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>5000</price>

</base>

<information>

<date>2006年07月10日</date>

</information>

<note>バス付 トイレ付 地下鉄 ××駅徒歩03分</note>

</document>

<document>

<base>

<name>ホテル5</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月10日</date>

</information>

<note>バス付 トイレ付 地下鉄 ××駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル6</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市港北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>8000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

<document>

<base>

<name>ホテル7</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市港北区</address>

<detail>http://xxxxx.co.jp</detail>

<price>7000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩03分</note>

- 447 -

</document>

<document>

<base>

<name>ホテル8</name>

<prefecture>神奈川</prefecture>

<address>神奈川県横浜市神奈川区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩05分</note>

</document>

J.1.1 検索条件に一致するXML文書の件数を求める

検索操作において、対象となるデータが大量に存在する場合、条件式に一致するデータすべてを参照することは非現

実的です。このため、大量のデータが存在する場合は、条件式に一致するデータ件数を取得することが必要です。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数を取得する例を用いて、C APIの使用例を示しま

す。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルは何件ありますか?」

年月日(2006年7月18日)および場所(大阪)を条件に検索を行います。

APIの使用例

以下にC APIを使用したプログラミング例を示します。

#include <stdio.h>

#include "libshun.h"

/* 検索条件に一致するXML文書の件数を求める */

int main()

{

/* ハンドル変数群 */

SHUNHCON connectionHandle;

SHUNHSTMT statementHandle;

/* 作業用変数群 */

int status;

/* 入力パラメタ群 */

char *hostName;

int portNo;

char *ShunFileName;

char *queryForm;

/* 出力パラメタ群*/

int hitCount;

/* エラー用変数群 */

- 448 -

SHUNHANDLE errorHandle;

int errorLevel;

char *errorMessage;

/* 変数の初期化 */

connectionHandle = NULL;

statementHandle = 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 );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* 検索式の指定 */

queryForm = "/document {/base/prefecture == '大阪' "

"AND /information/date == '2006年07月18日'}";

/* API呼出し 検索式を指定してヒット件数を取得 */

status = ShunGetHitCount(

statementHandle,

queryForm,

&hitCount );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

goto ErrorEnd;

}

/* ヒット件数の取出し */

printf( "ヒット件数 = %d\n", hitCount );

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

goto ErrorEnd;

}

/* コネクションの切断 */

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

- 449 -

/* コネクションハンドルの解放 */

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_DATA:

printf("エラーレベル = SHUN_ERROR_DATA\n");

break;

}

printf("エラーメッセージ = %s\n", errorMessage);

}

else {

printf("エラーメッセージ取得エラー : %d\n", status);

}

/* データ操作ハンドルの解放 */

if ( statementHandle != NULL ) {

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

printf("データ操作ハンドル解放エラー : %d\n", status);

}

}

/* コネクションの切断 */

if ( connectionHandle != NULL) {

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクション切断エラー : %d\n", status);

}

}

/* コネクションハンドルの解放 */

if ( connectionHandle != NULL) {

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクションハンドル解放エラー : %d\n", status);

}

}

return 1;

}

- 450 -

実行結果

ヒット件数 = 3

J.1.2 検索条件に一致するXML文書を指定した形式で取得する

検索操作において、検索結果として得られたデータの一部を追加条件として次の検索を行うことがよくあります。このよう

な場合、検索結果としてはデータのすべてではなく、その一部を取得することが一般的です。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数と部分情報を取得する例を用いて、C APIの使用

例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルのうち、該当する30件分のホテル名は?」

年月日(2006年7月18日)および、場所(大阪)を条件に検索を行います。また、結果で得られる件数のうち、30件分のホテ

ル名と宿泊費を取得します。

APIの使用例

以下にC APIを使用したプログラミング例を示します。

#include <stdio.h>

#include "libshun.h"

/* 検索条件に一致するXML文書を指定した形式で取得する */

int main()

{

/* ハンドル変数群 */

SHUNHCON connectionHandle;

SHUNHSTMT statementHandle;

/* 作業用変数群 */

int status;

int i;

/* 入力パラメタ群 */

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;

- 451 -

/* エラー用変数群 */

SHUNHANDLE errorHandle;

int errorLevel;

char *errorMessage;

/* 変数の初期化 */

connectionHandle = NULL;

statementHandle = 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 );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* 検索件数、検索式などの指定*/

startNo = 1;

returnRequestCount = 30;

queryForm = "/document {/base/prefecture == '大阪' "

"AND /information/date == '2006年07月18日'}";

returnForm = "/document/base/name, /document/base/price";

sortForm = NULL;

/* API呼出し データ検索 */

status = ShunSearch(

statementHandle,

startNo,

NULL,

0,

returnRequestCount,

queryForm,

returnForm,

sortForm,

&hitCount,

&returnCount,

&returnableCount,

&recID,

&dataInfo,

&firstPosition,

&lastPosition );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

goto ErrorEnd;

- 452 -

}

/* ヒット件数の取出し */

printf( "ヒット件数 = %d\n", hitCount );

/* 検索したデータの表示 */

if ( hitCount > 0 ) {

for (i = 0; i < returnCount; ++i) {

if ( dataInfo[i].Data_Len > 0 ) {

printf( "[結果]%d件目 =%s\n", startNo + i, dataInfo[i].Data);

}

else {

printf( "[結果]%d件目 = データなし\n", startNo + i );

}

}

}

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

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_DATA:

printf("エラーレベル = SHUN_ERROR_DATA\n");

break;

}

printf("エラーメッセージ = %s\n", errorMessage);

}

else {

printf("エラーメッセージ取得エラー : %d\n", status);

}

- 453 -

/* データ操作ハンドルの解放 */

if ( statementHandle != NULL ) {

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

printf("データ操作ハンドル解放エラー : %d\n", status);

}

}

/* コネクションの切断 */

if ( connectionHandle != NULL) {

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクション切断エラー : %d\n", status);

}

}

/* コネクションハンドルの解放 */

if ( connectionHandle != NULL) {

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクションハンドル解放エラー : %d\n", status);

}

}

return 1;

}

実行結果

ヒット件数 = 3

[結果]1件目 = <document><name>ホテル1</name><price>9000</price></document>

[結果]2件目 = <document><name>ホテル2</name><price>6000</price></document>

[結果]3件目 = <document><name>ホテル3</name><price>7500</price></document>

J.1.3 特定のXML文書をすべて取得する

検索操作において、“J.1.1 検索条件に一致するXML文書の件数を求める”および“J.1.2 検索条件に一致するXML文書を指定した形式で取得する”といった操作を経て、絞り込んだ条件を基に、データすべてを取得することになります。

“J.1.2 検索条件に一致するXML文書を指定した形式で取得する”の操作により得られたホテル名を基に、該当するホテ

ルのデータをすべて取得する例を用いて、C APIの使用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルのうち、該当する30件分のホテル情報は?」

年月日(2006年7月18日)および、場所(大阪)を条件に検索を行います。また、ホテル名に対応するレコード識別子を用

いて、ホテルの詳細情報を取得します。

APIの使用例

以下にC APIを使用したプログラミング例を示します。

- 454 -

#include <stdio.h>

#include "libshun.h"

/* 特定のXML文書をすべて取得する */

int main()

{

/* ハンドル変数群 */

SHUNHCON connectionHandle;

SHUNHSTMT statementHandle_serch;

SHUNHSTMT statementHandle_rec_id;

/* 作業用変数群 */

int status;

int i;

/* 入力パラメタ群 */

char *hostName;

int portNo;

char *ShunFileName;

int startNo;

int returnRequestCount;

char *queryForm;

char *returnForm;

char *sortForm;

/* 出力パラメタ群 */

int hitCount;

int returnCount;

int returnableCount;

SHUNRECID *recID_search;

SHUNRECID *recID_search_rec_id;

SHUNDATA *dataInfo_serch;

SHUNDATA *dataInfo_rec_id;

SHUNPOS *firstPosition, *lastPosition;

/* エラー用変数群 */

SHUNHANDLE errorHandle;

int errorLevel;

char *errorMessage;

/* 変数の初期化 */

connectionHandle = NULL;

statementHandle_serch = NULL;

statementHandle_rec_id = 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;

}

- 455 -

/* データ操作ハンドルの割当て */

status = ShunAllocHandle( connectionHandle, &statementHandle_serch );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* 検索件数、検索式などの指定*/

startNo = 1;

returnRequestCount = 30;

queryForm = "/document {/base/prefecture == '大阪' "

"AND /information/date == '2006年07月18日'}";

returnForm = "/document/base/name, /document/base/price";

sortForm = NULL;

/* API呼出し データ検索 */

status = ShunSearch(

statementHandle_serch,

startNo,

NULL,

0,

returnRequestCount,

queryForm,

returnForm,

sortForm,

&hitCount,

&returnCount,

&returnableCount,

&recID_search,

&dataInfo_serch,

&firstPosition,

&lastPosition );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle_serch;

goto ErrorEnd;

}

/* ヒット件数の取出し */

printf( "ヒット件数 = %d\n", hitCount );

printf( "応答件数 = %d\n", returnCount );

/* データ操作ハンドルの割当て */

status = ShunAllocHandle( connectionHandle, &statementHandle_rec_id );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* IDを基にデータすべてを取得 */

if ( hitCount > 0 ) {

status = ShunSearchRecId(

statementHandle_rec_id,

returnCount,

recID_search,

&recID_search_rec_id,

&dataInfo_rec_id );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle_rec_id;

goto ErrorEnd;

}

if (recID_search_rec_id != NULL) {

- 456 -

for (i = 0; i < returnCount; ++i) {

if ( dataInfo_rec_id[i].Data != NULL ) {

printf( "[詳細]%d件目 =%s\n", startNo + i, dataInfo_rec_id[i].Data);

}

else {

printf( "[詳細]%d件目 =なし\n", startNo + i );

}

}

}

}

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle_rec_id );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle_rec_id;

goto ErrorEnd;

}

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle_serch );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle_serch;

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_DATA:

printf("エラーレベル = SHUN_ERROR_DATA\n");

break;

}

printf("エラーメッセージ = %s\n", errorMessage);

}

else {

printf("エラーメッセージ取得エラー : %d\n", status);

}

- 457 -

/* データ操作ハンドルの解放 */

if ( statementHandle_rec_id != NULL ) {

status = ShunFreeHandle( statementHandle_rec_id );

if ( status != SHUN_SUCCESS ) {

printf("データ操作ハンドル解放エラー : %d\n", status);

}

}

/* データ操作ハンドルの解放 */

if ( statementHandle_serch != NULL ) {

status = ShunFreeHandle( statementHandle_serch );

if ( status != SHUN_SUCCESS ) {

printf("データ操作ハンドル解放エラー : %d\n", status);

}

}

/* コネクションの切断 */

if ( connectionHandle != NULL) {

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクション切断エラー : %d\n", status);

}

}

/* コネクションハンドルの解放 */

if ( connectionHandle != NULL) {

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクションハンドル解放エラー : %d\n", status);

}

}

return 1;

}

実行結果

ヒット件数 = 3

応答件数 = 3

[詳細]1件目 = <document>

<base>

<name>ホテル1</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>9000</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩02分</note>

</document>

[詳細]2件目 = <document>

<base>

<name>ホテル2</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>6000</price>

</base>

- 458 -

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩05分</note>

</document>

[詳細]3件目 = <document>

<base>

<name>ホテル3</name>

<prefecture>大阪</prefecture>

<address>大阪府大阪市中央区</address>

<detail>http://xxxxx.co.jp</detail>

<price>7500</price>

</base>

<information>

<date>2006年07月18日</date>

</information>

<note>バス付 トイレ付 地下鉄 △△駅徒歩10分</note>

</document>

J.1.4 検索条件に一致するXML文書をソートして取得する

検索操作において、検索した結果をある特定の要素をキーとしてソートして取得したい場合があります。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数と部分情報をもとに宿泊費をキーとしてソートした

結果を取得する例を用いて、C APIの使用例を示します。

検索条件

「2006年7月18日に大阪で宿泊可能なホテルのうち、該当する30件分のホテル名を宿泊費の高い順に並べて欲しい。」

年月日(2006年7月18日)および、場所(大阪)を条件に検索を行います。また、結果で得られる件数のうち、宿泊費の高

いものから順に30件分のホテル名を取得します。

APIの使用例

以下にC APIを使用したプログラミング例を示します。

#include <stdio.h>

#include "libshun.h"

/* 検索条件に一致するXML文書をソートして取得する */

int main()

{

/* ハンドル変数群 */

SHUNHCON connectionHandle;

SHUNHSTMT statementHandle;

/* 作業用変数群 */

int status;

int i;

/* 入力パラメタ群 */

char *hostName;

int portNo;

char *ShunFileName;

- 459 -

int startNo;

int returnRequestCount;

char *queryForm;

char *returnForm;

char *sortForm;

/* 出力パラメタ群*/

int hitCount;

int returnCount;

int returnableCount;

SHUNRECID *recID;

SHUNDATA *dataInfo;

SHUNPOS *firstPosition, *lastPosition;

/* エラー用変数群 */

SHUNHANDLE errorHandle;

int errorLevel;

char *errorMessage;

/* 変数の初期化 */

connectionHandle = NULL;

statementHandle = 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 );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* 検索件数、検索式などの指定*/

startNo = 1;

returnRequestCount = 30;

queryForm = "/document {/base/prefecture == '大阪' "

"AND /information/date == '2006年07月18日'}";

returnForm = "/document/base/name, /document/base/price";

sortForm = "/document/base/price/text() DESC";

/* API呼出し データ検索 */

status = ShunSearch(

statementHandle,

startNo,

NULL,

0,

- 460 -

returnRequestCount,

queryForm,

returnForm,

sortForm,

&hitCount,

&returnCount,

&returnableCount,

&recID,

&dataInfo,

&firstPosition,

&lastPosition );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

goto ErrorEnd;

}

/* ヒット件数の取出し */

printf( "ヒット件数 = %d\n", hitCount );

/* 検索したデータの表示 */

if ( hitCount > 0 ) {

for (i = 0; i < returnCount; ++i) {

if ( dataInfo[i].Data_Len > 0 ) {

printf( "[結果]%d件目 =%s\n", startNo + i, dataInfo[i].Data);

}

else {

printf( "[結果]%d件目 = データなし\n", startNo + i );

}

}

}

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

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);

- 461 -

if ( status == SHUN_SUCCESS ) {

switch ( errorLevel ) {

case SHUN_ERROR_CONNECTION:

printf("エラーレベル = SHUN_ERROR_CONNECTION\n");

break;

case SHUN_ERROR_DATA:

printf("エラーレベル = SHUN_ERROR_DATA\n");

break;

}

printf("エラーメッセージ = %s\n", errorMessage);

}

else {

printf("エラーメッセージ取得エラー : %d\n", status);

}

/* データ操作ハンドルの解放 */

if ( statementHandle != NULL ) {

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

printf("データ操作ハンドル解放エラー : %d\n", status);

}

}

/* コネクションの切断 */

if ( connectionHandle != NULL) {

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクション切断エラー : %d\n", status);

}

}

/* コネクションハンドルの解放 */

if ( connectionHandle != NULL) {

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクションハンドル解放エラー : %d\n", status);

}

}

return 1;

}

実行結果

ヒット件数 = 3

[結果]1件目 = <document><name>ホテル1</name><price>9000</price></document>

[結果]2件目 = <document><name>ホテル3</name><price>7500</price></document>

[結果]3件目 = <document><name>ホテル2</name><price>6000</price></document>

J.1.5 検索条件に一致するXML文書の値を集計して取得する

検索操作において、検索した結果をある特定の要素の値を集計して取得したい場合があります。

日付と場所を検索条件式に指定して、条件に一致するホテルの件数と、 も高い宿泊費、 も安い宿泊費、宿泊費の

平均値を取得する例を用いて、C APIの使用例を示します。

- 462 -

検索条件

「2006年7月18日に宿泊可能なホテルのうち、 も高い宿泊費、 も安い宿泊費、宿泊費の平均値を県別に集計して欲

しい。」

年月日(2006年7月18日)を条件に検索を行います。

APIの使用例

以下にC APIを使用したプログラミング例を示します。

#include <stdio.h>

#include "libshun.h"

/* 検索条件に一致するXML文書の値を集計して取得する */

int main()

{

/* ハンドル変数群 */

SHUNHCON connectionHandle;

SHUNHSTMT statementHandle;

/* 作業用変数群 */

int status;

int i, k;

/* 入力パラメタ群 */

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;

/* エラー用変数群 */

SHUNHANDLE errorHandle;

int errorLevel;

char *errorMessage;

/* 変数の初期化 */

connectionHandle = NULL;

statementHandle = NULL;

/* コネクションハンドルの割当て */

status = ShunAllocHandle( NULL, &connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

- 463 -

}

/* ホスト名・ポート番号、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 );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* 検索件数、検索式などの指定*/

startNo = 1;

returnRequestCount = 30;

queryForm = "/document/information/date == '2006年07月18日'";

returnForm = "/document/base/prefecture/text(),"

"count(/document/base/prefecture/text()),"

"max(/document/base/price/text()),"

"min(/document/base/price/text()),"

"avg(/document/base/price/text())";

sortForm = "/document/base/prefecture/text()";

/* API呼出し データ検索 */

status = ShunSearch(

statementHandle,

startNo,

NULL,

0,

returnRequestCount,

queryForm,

returnForm,

sortForm,

&hitCount,

&returnCount,

&returnableCount,

&recID,

&dataInfo,

&firstPosition,

&lastPosition );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

goto ErrorEnd;

}

/* ヒット件数の取出し */

printf( "ヒット件数 = %d\n", hitCount );

/* 検索したデータの表示 */

if ( hitCount > 0 ) {

for (i = 0; i < returnCount; ++i) {

if ( dataInfo[i].Data_Len > 0 ) {

/* 検索したデータの整形 \001or\002を空白に変換 */

for (k = 0; k < dataInfo[i].Data_Len; ++k) {

switch ( dataInfo[i].Data[k] ) {

- 464 -

case '\001': dataInfo[i].Data[k] = ' '; break;

case '\002': dataInfo[i].Data[k] = ' '; break;

default: break;

}

}

printf( "[結果]%d件目 =%s\n", startNo + i, dataInfo[i].Data);

}

else {

printf( "[結果]%d件目 = データなし\n", startNo + i );

}

}

}

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

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_DATA:

printf("エラーレベル = SHUN_ERROR_DATA\n");

break;

}

printf("エラーメッセージ = %s\n", errorMessage);

}

else {

printf("エラーメッセージ取得エラー : %d\n", status);

}

/* データ操作ハンドルの解放 */

if ( statementHandle != NULL ) {

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

- 465 -

printf("データ操作ハンドル解放エラー : %d\n", status);

}

}

/* コネクションの切断 */

if ( connectionHandle != NULL) {

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクション切断エラー : %d\n", status);

}

}

/* コネクションハンドルの解放 */

if ( connectionHandle != NULL) {

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクションハンドル解放エラー : %d\n", status);

}

}

return 1;

}

実行結果

ヒット件数 = 6

[結果]1件目 = 神奈川 3 8000 6000 7000

[結果]2件目 = 大阪 3 9000 6000 7500

J.1.6 ヒット件数の上限値を設定する

ヒット件数の上限値を設定する場合のC APIの使用例を示します。

APIの使用例

以下にC APIを使用したプログラミング例を示します。

#include <stdio.h>

#include "libshun.h"

/* ヒット件数の上限値を設定する */

int main()

{

/* ハンドル変数群 */

SHUNHCON connectionHandle;

SHUNHSTMT statementHandle;

/* 作業用変数群 */

int status;

int i;

/* 入力パラメータ群 */

char *hostName;

- 466 -

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;

int isHitCountLimitOver;

/* エラー用変数群 */

SHUNHANDLE errorHandle;

int errorLevel;

char *errorMessage;

/* 変数の初期化 */

connectionHandle = NULL;

statementHandle = NULL;

/* コネクションハンドルの割当て */

status = ShunAllocHandle( NULL, &connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = 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 );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* 検索件数、検索式などの指定*/

startNo = 1;

returnRequestCount = 5;

queryForm = "/document/base/name = 'ホテル'";

returnForm = "/document/base/name/text(), /document/base/price/

text()";

sortForm = "/document/base/price/text()";

/* ヒット件数リミッタを設定 */

status = ShunSetStatementAttr( statementHandle,

- 467 -

SHUN_ATTR_HIT_COUNT_LIMIT, 5 );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

goto ErrorEnd;

}

/* API呼出し データ検索 */

status = ShunSearch(

statementHandle,

startNo,

NULL,

0,

returnRequestCount,

queryForm,

returnForm,

sortForm,

&hitCount,

&returnCount,

&returnableCount,

&recID,

&dataInfo,

&firstPosition,

&lastPosition );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

goto ErrorEnd;

}

/* ヒット件数がオーバーしたかどうか取得 */

status = ShunGetStatementAttr( statementHandle,

SHUN_ATTR_HIT_COUNT_LIMIT_OVER, &isHitCountLimitOver );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

goto ErrorEnd;

}

if ( isHitCountLimitOver == SHUN_TRUE ) {

printf( "ヒット件数リミッタをオーバーしました。\n" );

}

/* ヒット件数の取出し */

printf( "ヒット件数 = %d\n", hitCount );

/* 検索したデータの表示 */

if ( hitCount > 0 ) {

for (i = 0; i < returnCount; ++i) {

if ( dataInfo[i].Data_Len > 0 ) {

printf( "[結果]%d件目 =%s\n", startNo + i, dataInfo[i].Data);

}

else {

printf( "[結果]%d件目 = データなし\n", startNo + i );

}

}

}

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* コネクションの切断 */

status = ShunDisconnect( connectionHandle );

- 468 -

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* コネクションハンドルの解放 */

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = NULL;

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_DATA:

printf("エラーレベル = SHUN_ERROR_DATA\n");

break;

}

printf("エラーメッセージ = %s\n", errorMessage);

}

else {

printf("エラーメッセージ取得エラー : %d\n", status);

}

/* データ操作ハンドルの解放 */

if ( statementHandle != NULL ) {

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

printf("データ操作ハンドル解放エラー : %d\n", status);

}

}

/* コネクションの切断 */

if ( connectionHandle != NULL) {

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクション切断エラー : %d\n", status);

}

}

/* コネクションハンドルの解放 */

if ( connectionHandle != NULL) {

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクションハンドル解放エラー : %d\n", status);

}

}

return 1;

}

- 469 -

実行結果

ヒット件数 = 8

ヒット件数リミッタをオーバーしました。

J.2 データの更新

データを更新するためには、Shunsakuが提供するAPIを使用します。

C APIを使用することで、以下の操作を行うことができます。

・ データを追加する

・ データを削除する

・ データを更新する

C APIの詳細については、“C APIリファレンス”を参照してください。

ここでは“J.1 データの検索”の“ホテルの予約状況検索”のドキュメントサンプルを例にして、更新操作の説明を行いま

す。

なお、XML文書の詳細については、“付録E XML文書についての留意事項”を参照してください。

J.2.1 データを追加する

データを追加する場合のC APIの使用例を示します。

APIの使用例

以下にC APIを使用したプログラミング例を示します。

#include <stdio.h>

#include <string.h>

#include "libshun.h"

/* データを追加します */

int main()

{

/* ハンドル変数群 */

SHUNHCON connectionHandle;

SHUNHSTMT statementHandle;

/* 作業用変数群 */

int status;

/* 入力パラメタ群 */

char *hostName;

int portNo;

char *ShunFileName;

- 470 -

SHUNDATA inputData[1];

/* エラー用変数群 */

SHUNHANDLE errorHandle;

int errorLevel;

char *errorMessage;

/* 変数の初期化 */

connectionHandle = NULL;

statementHandle = 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 );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* 追加するデータの作成 */

inputData[0].Data =

"<document>"

" <base>"

" <name>ホテル9</name>"

" <prefecture>神奈川</prefecture>"

" <address>神奈川県横浜市神奈川区</address>"

" <detail>http://xxxxx.co.jp</detail>"

" <price>6000</price>"

" </base>"

" <information>"

" <date>2006年07月18日</date>"

" </information>"

" <note>バス付 トイレ付 地下鉄 △△駅徒歩05分</note>"

"</document>";

inputData[0].Data_Len = strlen( inputData[0].Data );

/* API呼出し データ追加 */

status = ShunInsert(

statementHandle,

1,

inputData );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

goto ErrorEnd;

}

- 471 -

printf( "追加成功\n" );

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

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_DATA:

printf("エラーレベル = SHUN_ERROR_DATA\n");

break;

}

printf("エラーメッセージ = %s\n", errorMessage);

}

else {

printf("エラーメッセージ取得エラー : %d\n", status);

}

/* データ操作ハンドルの解放 */

if ( statementHandle != NULL ) {

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

printf("データ操作ハンドル解放エラー : %d\n", status);

}

}

/* コネクションの切断 */

if ( connectionHandle != NULL) {

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクション切断エラー : %d\n", status);

}

- 472 -

}

/* コネクションハンドルの解放 */

if ( connectionHandle != NULL) {

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクションハンドル解放エラー : %d\n", status);

}

}

return 1;

}

実行結果

追加成功

J.2.2 データを削除する

データを削除する場合の、C APIの使用例を示します。

削除するデータの検索条件

「2006年7月18日に神奈川で宿泊可能なホテルのうち、ホテル9のデータを削除したい。」

年月日(2006年7月18日)および、場所(神奈川)を条件に検索を行い、

ホテル名『ホテル9』と一致したデータを削除します。

APIの使用例

以下にC APIを使用したプログラミング例を示します。

#include <stdio.h>

#include "libshun.h"

/* データを削除します */

int main()

{

/* ハンドル変数群 */

SHUNHCON connectionHandle;

SHUNHSTMT statementHandle_search;

SHUNHSTMT statementHandle_del;

/* 作業用変数群 */

int status;

/* 入力パラメタ群 */

char *hostName;

int portNo;

char *ShunFileName;

int startNo;

int returnRequestCount;

char *queryForm;

char *returnForm;

- 473 -

char *sortForm;

/* 出力パラメタ群*/

int hitCount;

int returnCount;

int returnableCount;

SHUNRECID *recID;

SHUNDATA *dataInfo;

SHUNPOS *firstPosition, *lastPosition;

/* エラー用変数群 */

SHUNHANDLE errorHandle;

int errorLevel;

char *errorMessage;

/* 変数の初期化 */

connectionHandle = NULL;

statementHandle_search = NULL;

statementHandle_del = 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 = 30;

queryForm = "/document/base/prefecture == '神奈川' "

"AND /document/information/date == '2006年07月18日' "

"AND /document/base/name == 'ホテル9'";

returnForm = "/document/base/name, /document/base/price";

sortForm = NULL;

/* API呼出し データ検索 */

status = ShunSearch(

statementHandle_search,

startNo,

NULL,

0,

returnRequestCount,

queryForm,

returnForm,

- 474 -

sortForm,

&hitCount,

&returnCount,

&returnableCount,

&recID,

&dataInfo,

&firstPosition,

&lastPosition );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle_search;

goto ErrorEnd;

}

/* ヒット件数の取出し */

printf( "ヒット件数 = %d\n", hitCount );

printf( "応答件数 = %d\n", returnCount );

/* データ操作ハンドルの割当て */

status = ShunAllocHandle( connectionHandle, &statementHandle_del );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* IDを基にデータすべてを削除 */

if ( hitCount > 0 ) {

status = ShunDeleteRecId(

statementHandle_del,

returnCount,

recID);

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle_del;

goto ErrorEnd;

}

}

printf( "削除成功\n" );

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle_del );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle_del; goto ErrorEnd;

}

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle_search );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle_search;

goto ErrorEnd;

}

/* コネクションの切断 */

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* コネクションハンドルの解放 */

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

- 475 -

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_DATA:

printf("エラーレベル = SHUN_ERROR_DATA\n");

break;

}

printf("エラーメッセージ = %s\n", errorMessage);

}

else {

printf("エラーメッセージ取得エラー : %d\n", status);

}

/* データ操作ハンドルの解放 */

if ( statementHandle_del != NULL ) {

status = ShunFreeHandle( statementHandle_del );

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) {

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクション切断エラー : %d\n", status);

}

}

/* コネクションハンドルの解放 */

if ( connectionHandle != NULL) {

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクションハンドル解放エラー : %d\n", status);

}

}

return 1;

}

- 476 -

実行結果

ヒット件数 = 1

応答件数 = 1

削除成功

J.2.3 データを更新する

データを更新する場合のC APIの使用例を示します。

APIの使用例

以下にC APIを使用したプログラミング例を示します。

#include <stdio.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;

/* エラー用変数群 */

SHUNHANDLE errorHandle;

int errorLevel;

char *errorMessage;

- 477 -

/* 変数の初期化 */

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 = 30;

queryForm = "/document {/base/prefecture == '大阪' "

"AND /information/date == '2006年07月18日'}";

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;

}

/* ヒット件数の取出し */

printf( "ヒット件数 = %d\n", hitCount );

printf( "応答件数 = %d\n", returnCount );

- 478 -

/* データ操作ハンドルの割当て */

status = ShunAllocHandle( connectionHandle, &statementHandle_update );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* 検索したデータの表示 */

if ( hitCount > 0 ) {

/* ここでdataInfoに対しデータの処理をします */

status = ShunUpdateRecId(

statementHandle_update,

returnCount,

recID,

dataInfo );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle_update;

goto ErrorEnd;

}

}

printf( "更新成功\n" );

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle_update );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle_update;

goto ErrorEnd;

}

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle_search );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle_search;

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);

- 479 -

if ( status == SHUN_SUCCESS ) {

switch ( errorLevel ) {

case SHUN_ERROR_CONNECTION:

printf("エラーレベル = SHUN_ERROR_CONNECTION\n");

break;

case SHUN_ERROR_DATA:

printf("エラーレベル = SHUN_ERROR_DATA\n");

break;

}

printf("エラーメッセージ = %s\n", errorMessage);

}

else {

printf("エラーメッセージ取得エラー : %d\n", status);

}

/* データ操作ハンドルの解放 */

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) {

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクション切断エラー : %d\n", status);

}

}

/* コネクションハンドルの解放 */

if ( connectionHandle != NULL) {

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクションハンドル解放エラー : %d\n", status);

}

}

return 1;

}

実行結果

ヒット件数 = 3

応答件数 = 3

更新成功

- 480 -

J.3 拡張的なアプリケーション

Shunsakuの機能を駆使したC APIの使用例について、説明します。

J.3.1 トランザクションとShunsaku Fileを使ったサンプル

トランザクション機能およびShunsaku Fileを使用する場合のC APIの使用例を示します。

ここでは、“5.1 トランザクションの概要”で説明した大学の講義の履修登録を例に、C APIの使用例を示します。

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;

- 481 -

/* 変数の初期化 */

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 {

- 482 -

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>"

- 483 -

" </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>[email protected]</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;

}

- 484 -

/* コネクションの切断 */

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);

- 485 -

}

}

/* コネクションハンドルの解放 */

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;

}

実行結果

コース情報の更新終了

学生情報の更新終了

J.3.2 ダイレクトアクセスキーを使用してデータを検索する

ダイレクトアクセスキーを使用してデータを検索する場合のC APIの使用例を示します。

検索するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

- 486 -

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にC APIを使用したプログラミング例を示します。

#include <stdio.h>

#include <string.h>

#include "libshun.h"

/* ダイレクトアクセスを使って検索します */

int main()

{

/* ハンドル変数群 */

SHUNHCON connectionHandle;

SHUNHSTMT statementHandle;

/* 作業用変数群 */

int status;

int i;

/* 入力パラメータ群 */

char *hostName;

int portNo;

char *ShunFileName;

char *returnForm;

char *keyName;

SHUNKEY keyInfo_search[1];

/* 出力パラメータ群*/

int returnCount;

SHUNRECID *recID;

SHUNDATA *dataInfo;

SHUNKEY *keyInfo_out;

/* エラー用変数群 */

SHUNHANDLE errorHandle;

int errorLevel;

char *errorMessage;

/* 変数の初期化 */

connectionHandle = NULL;

statementHandle = NULL;

/* コネクションハンドルの割当て */

status = ShunAllocHandle( NULL, &connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = connectionHandle;

goto ErrorEnd;

}

/* ホスト名・ポート番号、Shunsakuファイル名を指定してコネクションを確

立 */

hostName = "DirSvr1";

portNo = 23101;

- 487 -

ShunFileName = "shunsakuFile1";

status = ShunConnect( connectionHandle, hostName, portNo,

ShunFileName );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* データ操作ハンドルの割当て */

status = ShunAllocHandle( connectionHandle, &statementHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

returnForm = "/";

/* ダイレクトアクセスキーの設定 */

keyName = "key";

keyInfo_search[0].Key = "0001";

keyInfo_search[0].Key_Len = strlen( keyInfo_search[0].Key );

/* API呼出し ダイレクト検索 */

status = ShunSearchKey( statementHandle,

keyName,

SHUN_KEY_COMPLETE_MATCH,

1,

keyInfo_search,

returnForm,

&returnCount,

&recID,

&dataInfo,

&keyInfo_out );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

goto ErrorEnd;

}

/* 検索結果の表示 */

printf( "ヒット件数 = %d\n", returnCount );

for (i = 0; i < returnCount; ++i) {

printf( "[結果]%d件目\n", i + 1 );

printf( "ダイレクトアクセスキー: %s\n", keyInfo_out[i].Key );

printf( "データ :\n" );

printf( "%s\n", dataInfo[i].Data );

}

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* コネクションの切断 */

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* コネクションハンドルの解放 */

status = ShunFreeHandle( connectionHandle );

- 488 -

if ( status != SHUN_SUCCESS ) {

errorHandle = NULL;

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_DATA:

printf("エラーレベル = SHUN_ERROR_DATA\n");

break;

}

printf("エラーメッセージ = %s\n", errorMessage);

}

else {

printf("エラーメッセージ取得エラー : %d\n", status);

}

/* データ操作ハンドルの解放 */

if ( statementHandle != NULL ) {

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

printf("データ操作ハンドル解放エラー : %d\n", status);

}

}

/* コネクションの切断 */

if ( connectionHandle != NULL) {

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクション切断エラー : %d\n", status);

}

}

/* コネクションハンドルの解放 */

if ( connectionHandle != NULL) {

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクションハンドル解放エラー : %d\n", status);

}

}

return 1;

}

実行結果

ヒット件数 = 1

[結果]1件目

- 489 -

ダイレクトアクセスキー:0001

データ :

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

J.3.3 ダイレクトアクセスキーを使用してデータを削除する

ダイレクトアクセスキーを使用してデータを削除する場合のC APIの使用例を示します。

削除するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にC APIを使用したプログラミング例を示します。

#include <stdio.h>

#include <string.h>

#include "libshun.h"

/* ダイレクトアクセスを使って削除します */

int main()

{

/* ハンドル変数群 */

SHUNHCON connectionHandle;

SHUNHSTMT statementHandle;

/* 作業用変数群 */

- 490 -

int status;

int i;

/* 入力パラメータ群 */

char *hostName;

int portNo;

char *ShunFileName;

char *keyName;

SHUNKEY keyInfo[1];

/* エラー用変数群 */

SHUNHANDLE errorHandle;

int errorLevel;

char *errorMessage;

/* 変数の初期化 */

connectionHandle = NULL;

statementHandle = NULL;

/* コネクションハンドルの割当て */

status = ShunAllocHandle( NULL, &connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = 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 );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* ダイレクトアクセスキーの設定 */

keyName = "key";

keyInfo[0].Key = "0001";

keyInfo[0].Key_Len = strlen( keyInfo[0].Key );

/* API呼出し ダイレクト削除 */

status = ShunDeleteKey( statementHandle,

keyName,

SHUN_KEY_COMPLETE_MATCH,

1,

keyInfo );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

goto ErrorEnd;

}

printf( "削除終了\n" );

- 491 -

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* コネクションの切断 */

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* コネクションハンドルの解放 */

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = NULL;

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_DATA:

printf("エラーレベル = SHUN_ERROR_DATA\n");

break;

}

printf("エラーメッセージ = %s\n", errorMessage);

}

else {

printf("エラーメッセージ取得エラー : %d\n", status);

}

/* データ操作ハンドルの解放 */

if ( statementHandle != NULL ) {

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

printf("データ操作ハンドル解放エラー : %d\n", status);

}

}

/* コネクションの切断 */

if ( connectionHandle != NULL) {

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクション切断エラー : %d\n", status);

}

}

/* コネクションハンドルの解放 */

- 492 -

if ( connectionHandle != NULL) {

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクションハンドル解放エラー : %d\n", status);

}

}

return 1;

}

実行結果

削除終了

J.3.4 ダイレクトアクセスキーを使用してデータを更新する

ダイレクトアクセスキーを使用してデータを更新する場合のC APIの使用例を示します。

更新するデータ

<course>

<id>0001</id>

<name>Business negotiation</name>

<instructor>

<first-name>Max</first-name>

<last-name>cameron</last-name>

</instructor>

<capacity>40</capacity>

<current-auditors>30</current-auditors>

</course>

定義したダイレクトアクセスキー

key /course/id/text()

APIの使用例

以下にC APIを使用したプログラミング例を示します。

#include <stdio.h>

#include <string.h>

#include "libshun.h"

/* ダイレクトアクセスを使って更新します */

int main()

{

/* ハンドル変数群 */

SHUNHCON connectionHandle;

SHUNHSTMT statementHandle;

- 493 -

/* 作業用変数群 */

int status;

int i;

/* 入力パラメータ群 */

char *hostName;

int portNo;

char *ShunFileName;

char *returnForm;

char *keyName;

SHUNKEY keyInfo[1];

SHUNDATA dataInfo[1];

/* エラー用変数群 */

SHUNHANDLE errorHandle;

int errorLevel;

char *errorMessage;

/* 変数の初期化 */

connectionHandle = NULL;

statementHandle = NULL;

/* コネクションハンドルの割当て */

status = ShunAllocHandle( NULL, &connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = 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 );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* ダイレクトアクセスキーの設定 */

keyName = "key";

keyInfo[0].Key = "0001";

keyInfo[0].Key_Len = strlen( keyInfo[0].Key );

/* 更新データ */

dataInfo[0].Data =

"<course>"

" <id>0001</id>"

" <name>Business negotiation</name>"

" <instructor>"

" <first-name>Max</first-name>"

" <last-name>cameron</last-name>"

- 494 -

" </instructor>"

" <capacity>40</capacity>"

" <current-auditors>31</current-auditors>"

"</course>";

dataInfo[0].Data_Len = strlen( dataInfo[0].Data );

/* API呼出し ダイレクト更新 */

status = ShunUpdateKey( statementHandle,

keyName,

SHUN_KEY_COMPLETE_MATCH,

1,

keyInfo,

dataInfo );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)statementHandle;

goto ErrorEnd;

}

printf( "更新終了\n" );

/* データ操作ハンドルの解放 */

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* コネクションの切断 */

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = (SHUNHANDLE)connectionHandle;

goto ErrorEnd;

}

/* コネクションハンドルの解放 */

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

errorHandle = NULL;

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_DATA:

printf("エラーレベル = SHUN_ERROR_DATA\n");

break;

}

printf("エラーメッセージ = %s\n", errorMessage);

}

else {

printf("エラーメッセージ取得エラー : %d\n", status);

- 495 -

}

/* データ操作ハンドルの解放 */

if ( statementHandle != NULL ) {

status = ShunFreeHandle( statementHandle );

if ( status != SHUN_SUCCESS ) {

printf("データ操作ハンドル解放エラー : %d\n", status);

}

}

/* コネクションの切断 */

if ( connectionHandle != NULL) {

status = ShunDisconnect( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクション切断エラー : %d\n", status);

}

}

/* コネクションハンドルの解放 */

if ( connectionHandle != NULL) {

status = ShunFreeHandle( connectionHandle );

if ( status != SHUN_SUCCESS ) {

printf("コネクションハンドル解放エラー : %d\n", status);

}

}

return 1;

}

実行結果

更新終了

- 496 -

付録K XML変換機能のAPIXML変換機能は、Java言語で作成されたAPIを提供します。

APIの一覧を以下に示します。

パッケージ

インタフェー

ス継承 メソッド名 機能

com.fujitsu.xmlconverter

DocumentFountain

なし getXMLDocument

生成されるXML文書の

オブジェクトを1つ取得し

ます。

hasXMLDocument

生成されたXML文書が

存在するか否かを判断

します。

setDestination 出力形式がStream、ファ

イルおよびSAXの場合、

生成されるXML文書の

出力先を設定します。

setEncoding 生成されるXML文書の

文字コードを設定しま

す。

パッケージ

名クラス名 継承

コンストラクタま

たはメソッド名機能

com.fujitsu.xmlconverter

CSVSource

java.lang.Object

CSVSource CSVSourceのインスタン

スを生成します。

setEncoding CSVファイルに格納され

ているデータの文字コー

ドを設定します。

setDelimiter CSVファイルに格納され

ているデータの区切り文

字を設定します。

setQuote CSVファイルに格納され

ているデータの引用文

字を設定します。

setNullCharacter

CSVファイルに格納され

ているデータのnull文字

を設定します。

setFirstRecordToColumn

CSVファイルに格納され

ているデータの1行目に

存在するレコードを、列

名と認識するか否かを指

定します。

setRandomMode

CSVのResultSet内での

データ保持方法を、シー

ケンシャルに読み込む

のではなく、メモリ上に展

開して保持する設定に

- 497 -

パッケージ

名クラス名 継承

コンストラクタま

たはメソッド名機能

変更するか否かを指定

します。

getResultSet CSVファイルに格納され

ているデータから

ResultSetを取得します。

setEnableEscapeChar

区切り文字、引用符文

字、「\」をデータとして記

述する方法を指定しま

す。

GeneratorMap

java.lang.Object

GeneratorMap GeneratorMapのインスタ

ンスを生成します。

XMLGenerator

java.lang.Object

XMLGenerator XMLGeneratorのインス

タンスを生成します。

createDocumentFountain

DocumentFountainのイ

ンスタンスを生成します。

XMLConverterException

・ java.lang.Object

・ java.lang.Throwable

・ java.lang.Exception

getCode エラーコードを取得しま

す。

getException 内部的な例外を取得し

ます。

getMessage エラーメッセージを取得

します。

CSVException

・ java.lang.Object

・ java.lang.Throwable

・ java.lang.Exception

・ com.fujitsu.xmlconverter.XMLConverterException

CSVException CSVExceptionのインス

タンスを生成します。

XMLGenException

・ java.lang.Object

・ java.lang.Throwable

・ java.lang.Exception

・ com.fujitsu.xmlconverter.X

XMLGenException

XMLGenExceptionのイ

ンスタンスを生成します

- 498 -

パッケージ

名クラス名 継承

コンストラクタま

たはメソッド名機能

MLConverterException

K.1 DocumentFountainインタフェース

DocumentFountainは、XML文書を取得するためのインタフェースです。

DocumentFountain、XMLGeneratorクラスから生成されます。

DocumentFountainが提供しているフィールドおよびメソッドの一覧を以下に示します。

フィールド

フィールド名 意味

public static final int TYPE_STRING 出力形式がStringであることを示しま

す。

public static final int TYPE_STREAM 出力形式がStreamであることを示しま

す。

public static final int TYPE_FILE 出力形式がファイルであることを示しま

す。

public static final int TYPE_DOM 出力形式がDOMオブジェクトであるこ

とを示します。

public static final int TYPE_SAX 出力形式がSAXイベントであることを示

します。

K.1.1 getXMLDocument

機能

生成されるXML文書のオブジェクトを1つ取得します。

記述形式

public java.lang.Object getXMLDocument() throws XMLGenException;

復帰値

生成されたXML文書のオブジェクトが返されます。

パラメタ

ありません。

- 499 -

例外

XMLGenException

XML文書の生成時にエラーが発生した場合に出力されます。

エラーコードおよびエラーメッセージの詳細については、“K.8 XML変換機能のAPI使用時に出力されるエラーコー

ド”を参照してください。

K.1.2 hasXMLDocument

機能

生成されたXML文書が存在するか否かを判断します。

記述形式

public boolean hasXMLDocument() throws XMLGenException;

復帰値

生成されたXML文書が存在するか否かが返されます。

true : 存在します。

false : 存在しません。

パラメタ

ありません。

例外

XMLGenException

ResultSetが操作された時にエラーが発生した場合に出力されます。

エラーコードおよびエラーメッセージの詳細については、“K.8 XML変換機能のAPI使用時に出力されるエラーコー

ド”を参照してください。

K.1.3 setDestination

機能

出力形式がStream、ファイルおよびSAXの場合、生成されるXML文書の出力先を設定します。

記述形式

public void setDestination(

java.lang.Object aDestination /* (1) 出力先 */

) throws XMLGenException;

- 500 -

復帰値

ありません。

パラメタ

(1) 出力先

XML文書の出力先となるオブジェクトを指定します。

例外

XMLGenException

パラメタにオブジェクト以外が指定された場合に出力されます。

エラーコードおよびエラーメッセージの詳細については、“K.8 XML変換機能のAPI使用時に出力されるエラーコー

ド”を参照してください。

K.1.4 setEncoding

機能

生成されるXML文書の文字コードを設定します。

記述形式

public void setEncoding(

java.lang.String aEncoding /* (1)文字コード */

);

復帰値

ありません。

パラメタ

(1)文字コード

XML文書の文字コードを指定します。

設定 意味

SJIS SHIFT-JISの場合

EUC-JP EUCの場合

UTF-8 UTF-8の場合

例外

ありません。

- 501 -

注意事項

本メソッドを使用しない場合、文字コードは“UTF-8”が指定されたとみなされます。

K.2 CSVSourceクラス

CSVSourceは、CSVファイルに格納されているデータからCSVのResultSetを生成するクラスです。

K.2.1 CSVSource

機能

CSVSourceのインスタンスを生成します。

記述形式

public CSVSource(

java.lang.String aFileName /* (1) CSVファイルのパス名 */

);

復帰値

ありません。

パラメタ

(1) CSVファイルのパス名

CSVファイルへのパスを指定します。

例外

ありません。

K.2.2 setEncoding

機能

CSVファイルに格納されているデータの文字コードを設定します。

記述形式

- 502 -

public void setEncoding(

java.lang.String aEncoding /* (1)文字コード */

);

復帰値

ありません。

パラメタ

(1)文字コード

CSVファイルに格納されているデータの文字コードを指定します。

設定 意味

SJIS SHIFT-JISの場合

EUC-JP EUCの場合

UTF-8 UTF-8の場合

例外

ありません。

注意事項

本メソッドを使用しない場合、文字コードはXML変換機能のAPIを配置するサーバに設定されている文字コードが指定

されたとみなされます。

K.2.3 setDelimiter

機能

CSVファイルに格納されているデータの区切り文字を設定します。

記述形式

public void setDelimiter(

char aDelimiter /* (1) 区切り文字 */

) throws CSVException;

復帰値

ありません。

- 503 -

パラメタ

(1)区切り文字

CSVファイルに格納されているデータに指定されている区切り文字を指定します。

カンマ(,)、タブ(\t)、空白( )が指定可能です。

例外

CSVException

設定する区切り文字が以下の場合に出力されます。

- カンマ(,)、タブ(\t)、空白( )以外の文字

- null文字に含まれる文字

エラーコードおよびエラーメッセージの詳細については、“K.8 XML変換機能のAPI使用時に出力されるエラーコー

ド”を参照してください。

注意事項

本メソッドを使用しない場合、区切り文字はカンマとみなされます。

K.2.4 setQuote

機能

CSVファイルに格納されているデータの引用文字を設定します。

記述形式

public void setQuote(

char aQuote /* (1) 引用文字 */

) throws CSVException;

復帰値

ありません。

パラメタ

(1) 引用文字

CSVファイルに格納されているデータに指定されている引用文字を指定します。

単一引用符(\’)、二重引用符(\”)が指定可能です。

例外

CSVException

設定する引用文字が以下の場合に出力されます。

- 504 -

- 単一引用符(\’)、二重引用符(\”)以外の文字

- null文字に含まれる文字

エラーコードおよびエラーメッセージの詳細については、“K.8 XML変換機能のAPI使用時に出力されるエラーコー

ド”を参照してください。

注意事項

本メソッドを使用しない場合、引用文字は設定されません。

K.2.5 setNullCharacter

機能

CSVファイルに格納されているデータのnull文字を設定します。

記述形式

public void setNullCharacter(

java.lang.String aNullCharacter /* (1)null文字 */

) throws CSVException;

復帰値

ありません。

パラメタ

(1)null文字

CSVファイルに格納されているデータに設定されているnull文字を指定します。

空白文字(表示できない文字)を含まない文字列を指定可能です。

例外

CSVException

設定されたnull文字が以下の場合に出力されます。

- 空白文字(表示できない文字)を含む文字列

- 区切り文字を含む文字列

- 引用文字を含む文字列

エラーコードおよびエラーメッセージの詳細については、“K.8 XML変換機能のAPI使用時に出力されるエラーコー

ド”を参照してください。

注意事項

本メソッドを使用しない場合、null文字は空文字("")とみなされます。

- 505 -

K.2.6 setFirstRecordToColumn

機能

CSVファイルに格納されているデータの1行目に存在するレコードを、列名と認識するか否かを指定します。

記述形式

public void setFirstRecordToColumn(

boolean aFlag /* (1) 列名と認識する */

)

復帰値

ありません。

パラメタ

(1) 列名と認識する

CSVファイルに格納されているデータの1行目に存在するレコードを、列名と認識するか否かを指定します。

true:列名と認識します。

false:列名と認識しません。

例外

ありません。

注意事項

本メソッドを使用しない場合、1行目に存在するレコードは列名と認識されません。

本メソッドを使用しない場合、1行目に存在するレコードは列名と認識されません。また、CSVSourceクラスの

setNullCharacter()で指定した文字列は列名として使用できません。

K.2.7 setRandomMode

機能

CSVのResultSet内でのデータ保持方法を、シーケンシャルに読み込むのではなく、メモリ上に展開して保持する設定に

変更するか否かを指定します。

記述形式

- 506 -

public void setRandomMode(

boolean aFlag /* (1) メモリ上に展開する */

)

復帰値

ありません。

パラメタ

(1) メモリ上に展開する

CSVのResultSet内でのデータ保持方法を、シーケンシャルに読み込む設定から、メモリ上に展開して保持する設定

に変更するか否かを指定します。

true:変更します。

false:変更しません。

例外

ありません。

注意事項

本メソッドを使用しない場合、CSVのResultSet内でのデータ保持方法は、シーケンシャルに読み込まれます。

K.2.8 getResultSet

機能

CSVファイルのデータからResultSetを取得します。

記述形式

public java.sql.ResultSet getResultSet() throws CSVException;

復帰値

生成されたResultSetオブジェクトが返されます。

パラメタ

ありません。

- 507 -

例外

CSVException

ResultSetオブジェクトの生成時にエラーが発生した場合に出力されます。

エラーコードおよびエラーメッセージの詳細については、“K.8 XML変換機能のAPI使用時に出力されるエラーコー

ド”を参照してください。

K.2.9 setEnableEscapeChar

機能

区切り文字、引用符文字、「\」をデータとして記述する方法を指定します。

記述形式

public void setEnableEscapeChar(

boolean aFlag /* (1) 区切り文字、引用符文字、「\」のデータ記述方法指

定 */

)

復帰値

ありません。

パラメタ

(1) 区切り文字、引用符文字、「\」のデータ記述方法指定

区切り文字、引用符文字、「\」をデータとして記述する方法を指定します。

引数の値によって、以下の2つの方法を選択できます。

false:各文字を以下のように記述する方法を使用します。

- 区切り文字 … 区切り文字を引用符文字で囲んで記述します。

- 引用符文字 … 引用符文字を2文字続けて記述します。

- 「\」 … 「\」をそのまま記述します。

true:各文字の前に「\」を付加する方法を使用します。

区切り文字、引用符文字、「\」をデータとして記述する方法の詳細は、“12.8 XML変換機能の対応するCSV形式”を

参照してください。

例外

ありません。

- 508 -

注意事項

本メソッドを使用しない場合、引数にtrueを指定した場合と同じ動作になります。

K.3 GeneratorMapクラス

GeneratorMapは、マッピングルールを表現するクラスです。

K.3.1 GeneratorMap

機能

GeneratorMapのインスタンスを生成します。

記述形式

public GeneratorMap(

java.lang.String aMappingRuleFileName /* (1) マッピングルールファイルのパス

名 */

) throws XMLGenException;

復帰値

ありません。

パラメタ

(1) マッピングルールファイルのパス名

マッピングルールファイルのパスを指定します。

例外

XMLGenException

入出力時にエラーが発生した場合に出力されます。

エラーコードおよびエラーメッセージの詳細については、“K.8 XML変換機能のAPI使用時に出力されるエラーコー

ド”を参照してください。

K.4 XMLGeneratorクラス

XMLGeneratorは、DocumentFountainを生成するクラスです。

K.4.1 XMLGenerator

- 509 -

機能

XMLGeneratorのインスタンスを生成します。

記述形式

public XMLGenerator();

復帰値

ありません。

パラメタ

ありません。

例外

ありません。

K.4.2 createDocumentFountain

機能

DocumentFountainのインスタンスを生成します。

記述形式

public DocumentFountain createDocumentFountain(

int anOutputType, /* (1) 出力形式 */

java.sql.ResultSet aResultSet, /* (2) ResultSetオブジェクト */

GeneratorMap aGeneratorMap /* (3) マッピングルールオブジェクト */

) throws XMLGenException;

復帰値

生成されたDocumentFountainのインスタンスが返されます。

パラメタ

(1) 出力形式

XML文書の出力形式を指定します。

設定 意味

TYPE_STRING

出力形式がStringの場合

- 510 -

設定 意味

TYPE_STREAM

出力形式がStreamの場合

TYPE_FILE 出力形式がファイルの場合

TYPE_DOM 出力形式がDOMの場合

TYPE_SAX 出力形式がSAXの場合

(2) ResultSetオブジェクト

ResultSetオブジェクトを指定します。

(3) マッピングルールオブジェクト

マッピングルールオブジェクトを指定します。

例外

XMLGenException

DocumentFountainのインスタンス生成時にエラーが発生した場合に出力されます。

エラーコードおよびエラーメッセージの詳細については、“K.8 XML変換機能のAPI使用時に出力されるエラーコー

ド”を参照してください。

K.5 XMLConverterExceptionクラス

XMLConverterExceptionは、以下の例外の親クラスです。

・ com.fujitsu.xmlconverter.XMLGenException

・ com.fujitsu.xmlconverter.CSVException

K.5.1 getCode

機能

エラーコードを取得します。

記述形式

public java.lang.String getCode();

復帰値

エラーコードを返します。

エラーコードの詳細については、“K.8 XML変換機能のAPI使用時に出力されるエラーコード”を参照してください。

- 511 -

パラメタ

ありません。

例外

ありません。

K.5.2 getException

機能

内部的な例外を取得します。

記述形式

public java.lang.Throwable getException();

復帰値

例外オブジェクトを返します。例外オブジェクトが存在しない場合は、nullが返されます。

パラメタ

ありません。

例外

ありません。

K.5.3 getMessage

機能

エラーメッセージを取得します。

記述形式

public java.lang.String getMessage();

オーバーライド

java.lang.ThrowableクラスのgetMessageメソッド

- 512 -

復帰値

エラーメッセージの文字列を返します。

エラーメッセージの詳細については、“K.8 XML変換機能のAPI使用時に出力されるエラーコード”を参照してください。

パラメタ

ありません。

例外

ありません。

K.6 CSVExceptionクラス

CSVExceptionは、CSVSourceクラスの操作時およびCSVのResultSet生成時に発生する例外を出力するクラスです。

K.6.1 CSVException

機能

CSVExceptionのインスタンスを生成します。

記述形式

形式1

public CSVException(

java.lang.String code /* (1) エラーコード */

);

形式2

public CSVException(

java.lang.String code, /* (1) エラーコード */

java.lang.String arg /* (2) エラーメッセージのパラメタ */

);

形式3

public CSVException(

java.lang.String code, /* (1) エラーコード */

java.lang.Exception e, /* (2) エラー原因となる例外 */

java.lang.String arg /* (3) エラーメッセージのパラメタ */

);

- 513 -

形式4

public CSVException(

java.lang.String code, /* (1) エラーコード */

java.lang.Exception e /* (2) エラー原因となる例外 */

);

形式5

public CSVException(

java.lang.String code, /* (1) エラーコード */

java.lang.String[] param /* (2) エラーメッセージのパラメタ配

列 */

);

復帰値

ありません。

パラメタ

形式1の場合

(1)エラーコード

エラーコードが出力されます。

形式2の場合

(1)エラーコード

エラーコードが出力されます。

(2) エラーメッセージのパラメタ

エラーメッセージのパラメタが出力されます。

形式3の場合

(1)エラーコード

エラーコードが出力されます。

(2) エラー原因となる例外

エラー原因となる例外が出力されます。

(3) エラーメッセージのパラメタ

エラーメッセージのパラメタが出力されます。

形式4の場合

(1)エラーコード

- 514 -

エラーコードが出力されます。

(2) エラー原因となる例外

エラー原因となる例外が出力されます。

形式5の場合

(1)エラーコード

エラーコードが出力されます。

(2) エラーメッセージのパラメタ配列

エラーメッセージのパラメタの配列が出力されます。

例外

ありません。

K.7 XMLGenExceptionクラス

XMLGenExceptionは、以下のインタフェースおよびクラスの処理時に発生する例外を出力するクラスです。

・ DocumentFountainインタフェース

・ GeneratorMapクラス

・ XMLGeneratorクラス

K.7.1 XMLGenException

機能

XMLGenExceptionのインスタンスを生成します。

記述形式

形式1

public XMLGenException(

java.lang.String code /* (1) エラーコード */

) ;

形式2

public XMLGenException(

java.lang.String code, /* (1) エラーコード */

- 515 -

java.lang.String arg /* (2) エラーメッセージのパラメタ */

) ;

形式3

public XMLGenException(

java.lang.String code, /* (1) エラーコード */

java.lang.Exception e, /* (2) エラー原因となる例外 */

java.lang.String arg /* (3) エラーメッセージのパラメタ */

) ;

形式4

public XMLGenException(

java.lang.String code, /* (1) エラーコード */

java.lang.Exception e /* (2) エラー原因となる例外 */

);

形式5

public XMLGenException(

java.lang.String code, /* (1) エラーコード */

java.lang.Throwable err /* (2) エラー原因となる例外 */

) ;

形式6

public XMLGenException(

java.lang.String code, /* (1) エラーコード */

java.lang.String[] param /* (2) パラメタ配列 */

);

復帰値

ありません。

パラメタ

形式1の場合

(1)エラーコード

エラーコードが出力されます。

形式2の場合

(1)エラーコード

エラーコードが出力されます。

- 516 -

(2) エラーメッセージのパラメタ

エラーメッセージのパラメタが出力されます。

形式3の場合

(1)エラーコード

エラーコードが出力されます。

(2) エラー原因となる例外

エラー原因となる例外が出力されます。

(3) エラーメッセージのパラメタ

エラーメッセージのパラメタが出力されます。

形式4の場合

(1)エラーコード

エラーコードが出力されます。

(2) エラー原因となる例外

エラー原因となる例外が出力されます。

形式5の場合

(1)エラーコード

エラーコードが出力されます。

(2) エラー原因となる例外

エラー原因となる例外が出力されます。

形式6の場合

(1)エラーコード

エラーコードが出力されます。

(2) エラーメッセージのパラメタ配列

エラーメッセージのパラメタの配列が出力されます。

例外

ありません。

K.8 XML変換機能のAPI使用時に出力されるエラーコード

XML変換機能のAPIを使用したときに出力されるエラーコードおよびメッセージについて以下に説明します。

- 517 -

メッセージの“{0}”および“{1}”は可変文字列を示します。

参照

可変文字列には、XMLプロセッサから出力されたメッセージが表示されることがあります。XML変換機能を使用したとき

に出力されるXMLプロセッサのメッセージについては、“XMLプロセッサが出力するエラーメッセージの一覧”を参照し

てください。

エラーコード メッセージ 対処

XCV0003 指定されたデータ型はサポートさ

れていません。

データ型を正しく修正してください。

XCV0006 指定された出力先オブジェクトは

無効です。

指定した出力先を確認してください。

XCV0007 指定されたエンコーディングはサ

ポートされていません。

有効なエンコーディングを指定して

ください。

XCV0008 ResultSetがnullです。 ResultSetが空の場合、本メソッドを

呼び出さないように修正してくださ

い。

XCV0009 指定された出力形式はサポート

されていません。

サポートしている出力形式に修正し

てください。

XCV0010 エラーコードの指定時に、必要な

引数が渡されていません。

XML変換機能のAPIを確認してくだ

さい。

XCV0011 クラス({0})が見つかりません。 Java実行環境を確認してください。

XCV0012 マッピングルールのスキーマが異

常です。詳細:{0}指定したデータベースのurlを確認

してください。

XCV0013 ResultSetにデータがありません。

詳細:{0}マッピングルールまたはデータベー

スのテーブルの内容を確認してくだ

さい。

XCV0014 ResultSetの操作でエラーが発生

しました。詳細:{0}詳細の情報を基に、根本原因を取

り除いてください。

XCV0015 XML文書の生成に失敗しました。

詳細:{0}詳細の情報を基に、根本原因を取

り除いてください。

XCV0016 クラスが見つかりません。詳細:

{0}Javaオプションのclasspathまたは 環境変数のCLASSPATHが正しく設

定されているかを確認してください。

XCV0017 マッピングルールの解析に失敗

しました。詳細:{0}マッピングルールに誤りがあります。

詳細情報を基にマッピングルールを

修正してください。

XCV0018 出力するXML文書はありません。 マッピングルールまたはデータベー

スのテーブルの内容を確認してくだ

さい。

XCV0019 マッピングルールファイルに

documentRule要素が2つ以上定

義されています。

documentRuleタグは、1つにしてくだ

さい。

XCV0020 マッピングルールのid({0})が、重

複しています。

idは一意としてください。

XCV0021 マッピングルールのルート要素(id:{0})が重複しています。

ルート要素は、1つにしてください。

- 518 -

エラーコード メッセージ 対処

XCV0022 マッピングルール({0})のparent属性の値が不当です。

parentタグの指定内容を確認してく

ださい。

XCV0023 マッピングルール({0})に、

controller-arg属性が定義されて

いません。

controller属性がKEYの時、

controller-argを指定してください。

XCV0024 マッピングルール({0})に、

colnameとcolnoの両方が指定さ

れているか、または、どちらも指定

されていません。

colnameまたはcolnoのどちらかを指

定してください。

XCV0025 マッピングルール({0})に、要素が

重複して定義されています。

重複している要素を削除してくださ

い。

XCV0026 マッピングルール({0})のattrof属性の値が不当です。

attrof属性を正しく修正してください。

XCV0027 マッピングルール({0})に、属性が

重複して定義されています。

複数定義された属性を1つにしてく

ださい。

XCV0028 マッピングルール({0})に、attrof属性が指定されていないか、

parent属性が指定されています。

拡張ルール(extensionRule)を正しく

修正してください。

XCV0029 マッピングルール({0})のextender属性の値が不当です。

attrnameを使用する場合、extender属性をSTATIC以外にしてください。

XCV0030 マッピングルール({0})に、

extender-arg属性が定義されてま

せん。

extenderがSTATICの場合、

extender-argを定義してください。

XCV0032 マッピングルール({0})のcontroller-arg属性の値が不当で

す。

controller-argに正しい値を指定して

ください。

XCV0034 マッピングルール({0})のhandler-arg属性の値が不当です。

handler-argに正しい値を指定してく

ださい。

XCV0035 マッピングルール({0})のhandler-arg属性に指定されたエンコー

ディングは、サポートされていませ

ん。

handler-argのエンコーディングを正

しく修正してください。

XCV0041 マッピングルール({0})のhandler属性の値が不当です。

指定された値を指定してください。

XCV0042 マッピングルール({0})のcontroller属性の値が不当です。

指定された値を指定してください。

XCV0043 tagname属性とattrname属性は、

どちらか一方を指定する必要が

あります。

tagname属性またはattrname属性の、

いずれか一方を指定してください。

XCV0044 tagname属性を指定した場合、

parent属性は省略できません。

parent属性を指定してください。

XCV0045 tagname属性を指定した場合、

attrof属性は指定することができ

ません。

attrof属性を削除してください。

XCV0046 attrname属性を指定した場合、

parent属性は指定することができ

ません。

parent属性を削除してください。

- 519 -

エラーコード メッセージ 対処

XCV0047 attrname属性を指定した場合、

attrof属性は省略できません。

attrof属性を指定してください。

XCV0048 CSVファイルの一行目のレコード

でカラム名が定義されていない場

合、マッピングルール({0})のtagname属性を省略することはで

きません。

tagname属性を指定するか、1行目を

カラム名とする設定にしてください。

XCV0049 CSVファイルの一行目のレコード

でカラム名が定義されていない場

合、マッピングルール({0})のattrname属性を省略することはで

きません。

attrname属性を指定するか、1行目

をカラム名とする設定にしてくださ

い。

XCV0050

カラム名に、空文字列やnullは指

定できません。

カラム名に、空文字列は指定でき

ません。

列名に空文字("")やnull以外を指定

してください。

列名に空文字("")、CSVSourceクラスのsetNullCharacter()で指定した文

字列以外を指定してください。

XCV0051 CSVファイルに列名の定義があり

ません。

列名を定義するまたは1行目を列名

としない設定に修正してください。

XCV0053 指定されたカラム番号「{0}」が、

CSVファイルのカラム数の範囲を

超えています。

マッピングルールを正しく修正してく

ださい。

XCV0054 1行目のカラム名に、指定された

カラム名「{0}」がありません。

マッピングルールを正しく修正してく

ださい。

XCV0056 CSVファイルのクローズに失敗し

ました。

異常状態です。アプリケーションを

再起動してください。

XCV0057 CSVファイルからの読み込みに失

敗しました。

CSVファイルのパスやアクセス権を

確認してください。

XCV0058 CSVファイルの一行目のレコード

でカラム名が定義されていない場

合、マッピングルールでcolname属性は使用できません。

colnameの代わりにcolnoを指定して

ください。

XCV0059 1行目がカラム名でない場合は、

デフォルトマッピングルールで使

用できません。

デフォルトマッピングルールを使う場

合は、1行目を列名にする指定にし

てください。

XCV0060 {0}は、区切り文字にできません。 指定した区切り文字を変更してくだ

さい。

XCV0061 {0}は、引用符にできません。 指定した引用符文字を変更してくだ

さい。

XCV0062 {0}は、null文字にできません。 null文字以外を指定してください。

XCV0063 CSVファイルのデータのカラム数

が、{0}ではありません。

列数の指定と合わせてください。

XCV0064 エスケープされたデータ({0})があります。

エスケープされたデータを取り扱うこ

とはできません。変換対象から外し

てください。

- 520 -

エラーコード メッセージ 対処

XCV0065 データが、引用符({0})に囲まれ

ていません。

CSVファイルの各データを引用符で

囲むか、または、引用符の指定を変

更してください。

XCV0066 メソッド({0})は、サポートされてい

ません。

指定したメソッドは、CSVResultSetではサポートされていないため、使用

できません。

XCV0067 データに引用符文字が含まれる

場合、直前に「\\」が必要です。

エスケープ文字“\”で、エスケープ

してください。

XCV0068 区切り文字には、カンマ(,)、空白

(‘ ‘)、タブ(‘\t’)のいずれかを指

定してください。

カンマ(,)、空白(‘ ‘)、タブ(‘\t’)のい

ずれかを指定してください。

XCV0069 引用文字には、単一引用符(‘)、二重引用符(“)のいずれかを指定

してください。

単一引用符(‘)、二重引用符(“)のい

ずれかを指定してください。

XCV0070 空白文字は、null文字に指定で

きません。

空白文字以外を指定してください。

XCV0071 区切り文字と引用符文字には、同

じ文字「{0}」を指定できません。

それぞれ異なる文字を指定してくだ

さい。

XCV0072 区切り文字とnull文字には、同じ

文字「{0}」を指定できません。

それぞれ異なる文字を指定してくだ

さい。

XCV0073 引用符文字とnull文字には、同じ

文字「{0}」を指定できません。

それぞれ異なる文字を指定してくだ

さい。

XCV0074 CSVファイルの解析に失敗しまし

た。{0}行。詳細:{1}詳細メッセージにしたがって、CSVファイルを修正してください。(注)

XCV0075 データに引用符文字が含まれる

場合、直前に引用符文字が必要

です。

データ内に引用符文字を含む場合

は、引用符文字を2つ連続して記述

してください。

XCV0076 カラム番号「{0}」のカラム名「{2}」は、すでにカラム番号「{1}」で定

義されています。

カラム名が重複しないように、CSVデータの1行目を設定してください。

XCV0077 ResultSetMetaDataのメソッド

({0})は、サポートされていませ

ん。

指定したメソッドは、CSVResultSet

MetaDataではサポートされていない

ため、使用できません。

XCV0111 マッピングルール ({0})のattrname属性の値が空文字です。

空文字("")以外を指定してください。

XCV0120 出力先が指定されていません。 出力先のファイル名を指定してくだ

さい。

XCV0121 ファイルへの書き込みに失敗しま

した。詳細:{0}指定したファイルのパスが存在する

か、またはファイルの書き込みが可

能かを確認してください。

XCV0122 ストリームへの書き込みに失敗し

ました。詳細:{0}OS上のディスクまたはメモリ異常の

可能性があります。OSの再起動を試

みてください。

XCV0123 SAXでのXML文書の出力に失

敗しました。詳細:{0}OS上のディスクまたはメモリ異常の

可能性があります。OSの再起動を試

みてください。

- 521 -

エラーコード メッセージ 対処

XCV0124 CSVファイルからの読み込みに失

敗しました。詳細:{0}CSVファイルが存在するか、または

CSVファイルの読み込みが可能か

確認してください。

XCV0125 CSVファイルからデータの読み出

しに失敗しました。{0}行、{1}カラム

詳細情報に表示された、CSVファイ

ルの列データを確認してください。

(注)

XCV0126 CSVファイルの{0}行目が、空白

のみです。

CSVファイルの空白のみの行を削除

してください。

XCV0127 バイナリ型のカラムに格納されて

いるXML形式データの解析に失

敗しました。行{0},列{1}

マッピングルールで指定したバイナ

リ型のカラムデータがXMLの整形式

であるかどうか確認してください

(注)。

注) CSVファイルに格納されているデータの原因により発生する例外は、エラーコードにより通知される行番号の意味

が異なります。

エラーコード“XCV0125”では、1行目をカラム名に使用する場合は、上の図にある「XCV0125の場合」の行番号から1を減算した値が行番号となります。

なお、エラーコード“XCV0127”は、エラーコード“XCV0125”の場合と同じです。

- 522 -

XMLプロセッサが出力するエラーメッセージの一覧

XML変換機能を使用した場合に、XMLプロセッサが出力するエラーメッセージの一覧を以下に示します。

メッセージ 意味

The version is required in the XML declaration. XML宣言にversion属性がありませ

ん。

例)<?xml ?>

a pseudo attribute name is expected. XML宣言が正しくありません。

例)<?xml >

cvc-elt.1: Cannot find the declaration of element'XXXXX'.

ルートタグにMappingRuleタグ以外のタ

グ'XXXXX'が存在します。

XML document structures must start and end withinthe same entity.

MappingRuleタグが閉じられていませ

ん。

cvc-complex-type.2.4.a: Invalid content was foundstarting with element 'XXXXX'. One of'{"":parentRule, "":columnRule, "":attributeRule,"":documentRule, "":extensionRule}' is expected.

MappingRuleタグ要素に、無効なタグ

が定義されています。

cvc-complex-type.3.2.2: Attribute 'YYY' is notallowed to appear in element 'XXX'.

マッピングルール'XXX'のタグ内に無

効な属性'YYY'が定義されている。

cvc-complex-type.4: Attribute 'YYY' must appearon element 'XXX'.

マッピングルール'XXX'に必要な属

性'YYY'がありません。

cvc-datatype-valid.1.2.1: 'XXX' is not a valid valuefor 'YYY'

値'XXX'は型の要求'YYY'と合ってい

ません。

cvc-enumeration-valid: Value 'no' is not facet-validwith respect to enumeration '[yes]'. It must be avalue from the enumeration.

columnRuleタグのhide属性に'yes'以外

の属性値が指定されました。

cvc-enumeration-valid: Value 'nop' is not facet-valid with respect to enumeration '[empty, omit]'. Itmust be a value from the enumeration.

columnRuleタグのnull属性に'empty'または'omit'以外の属性値が指定されま

した。

- 523 -

付録L XML変換機能のマッピングルール

マッピングルールでは、テキストファイルに出力するXML文書の構造を定義します。定義する内容を以下に示します。

・ XML文書の要素

・ XML文書の属性

・ 結果表の列との対応関係

・ 生成するXML文書の階層構造

マッピングルールは、マッピングルールファイルに記述します。

マッピングルールファイルの定義の詳細については、“L.1 マッピングルールファイルの定義書式”を参照してください。

L.1 マッピングルールファイルの定義書式

マッピングルールファイルで使用するタグを、以下に示します。マッピングルールはXMLにより記述します。

表L.1 マッピングルールファイルで使用するタグ

タグ名 説明 複数 省略 備考

MappingRule マッピング

ルールの

上位タグで

す。

不可 不可 -

parentRule 親要素に関

するルール

を指定しま

す。

可 不可 以降、parentRuleタグに

より定義されたルール

を“ペアレントルール”と

呼びます。

columnRule 項目に関す

るルールを

指定します。

可 可 以降、columnRuleタグ

により定義されたルール

を“カラムルール”と呼び

ます。

attributeRule 属性に関す

るルールを

指定します。

可 可 以降、attributeRuleタグ

により定義されたルール

を“属性ルール”と呼び

ます。

documentRule 出力する

XML文書に

XML宣言を

定義しない

場合のルー

ルを指定しま

す。

不可 可 以降、documentRuleタグにより定義されたルー

ルを“ドキュメントルール”

と呼びます。

extensionRule 追加情報に

関するルー

ルを指定しま

す。

可 可 以降、extensionRuleタグにより定義されたルー

ルを“追加ルール”と呼

びます。

- 524 -

ポイント

タグの集約について

XML変換機能では、ResultSetオブジェクト内のレコードからXML文書に変換する際に、複数の同じ階層構造をもつ要

素どうしを、まとめて共通の親の要素として表現することができます。これを“集約”と呼びます。

注意

columnRuleタグやattributeRuleタグで指定するtagname属性およびattrname属性には、XMLのタグ名および属性名で使

用できない文字を設定しないでください。

設定した場合、出力されるXML文書は、整形式のXML文書(well-formed XML document)でないため、Shunsakuの入

力ファイルとして使用することはできません。

列名に XML のタグ名および属性名で使用できない文字が使用されている場合には、列名を XML のタグ名および属

性名として使用することはできません。その場合には、columnRuleタグのtagname属性名、attributeRuleタグのattrname属性名を必ず指定してください。

L.1.1 MappingRule

説明

マッピングルールの 上位タグです。

書式

<MappingRule>

</MappingRule>

属性

ありません。

要素

parentRuleタグ

複数指定することができます。省略できません。

columnRuleタグ

複数指定することができます。省略できます。

- 525 -

attributeRuleタグ

複数指定することができます。省略できます。

documentRuleタグ

複数指定できません。省略できます。

extensionRuleタグ

複数指定することができます。省略できます。

注意事項

MappingRuleタグ内に不要な要素や属性が定義された場合、XML変換機能はXML変換時にエラーとなり例外を通知

します。

L.1.2 parentRule

説明

親要素に関するルールを指定します。

書式

<parentRule id="属性値" tagname="属性値" parent="属性値"

controller="属性値" controller-arg="属性値" />

属性

属性名 説明 省略

id マッピングルール識別子(注)を指定します。

id属性の指定は必須です。

不可

tagname parentRuleタグで変換するXMLのタグ名を指定しま

す。

tagname属性の設定は必須です。

属性値に空文字("")を指定した場合、parentRuleタグの開始タグと終了タグは出力されません。

不可

parent parentRuleタグに親タグを指定する場合、親タグとな

るペアレントルールのマッピングルール識別子を指

定します。

parentRuleタグにより出力されるXML文書がルート

要素となる場合は、parent属性の指定は不要です。

ルート要素以外の場合のみparent属性の設定が必

須です。

なお、parent属性で指定するマッピングルール識別

子を持つparentRuleタグは、指定するparentRuleタグ

より前に設定する必要があります。

条件

により

controller parentRuleタグに対する集約を行う場合に、

controller属性の値を“KEY”に設定します。

- 526 -

属性名 説明 省略

controller-arg属性で指定する要素の列の値が、前

回処理したレコードと同じ要素である場合、1つのペ

アレント要素の中にまとめます。その際、ペアレント

要素配下のカラム要素は1つとなり、兄弟となります。

controller属性を指定しない場合、集約は行われま

せん。

controller-arg 集約のための要素を指定します。集約するカラム要

素または属性に対するマッピングルール識別子を

指定します。

集約時には、指定されたマッピングルール識別子が

示す列名に、前回処理したレコードと同じか否かを

チェックします。同じ場合は集約されます。複数列を

チェックする場合は、マッピングルール識別子をカ

ンマで区切って指定できます。

注) マッピングルール識別子とは、ルールを識別するために使用する識別子です。マッピングルール識別子は、1つのマッピングルールファイル内で一意である必要があります。

要素

ありません。

注意事項

マッピングルールファイル内には、parent属性を指定しない“ルート要素”に対するペアレントルールを、必ず1つ設定す

る必要があります。

参考

controller属性を値“KEY”で指定した場合、指定したcolumnRuleタグの要素値が同じであれば、指定したparentRuleタグ

配下の親(parentRule)を1つにまとめます。KEYを指定する場合は、controller-arg属性にcolumnRuleのマッピングルール

識別子を指定する必要があります。

controller-arg属性に複数のcolumnRuleのマッピングルール識別子を指定した場合、指定したすべての要素値が同じ場

合のみ集約されます。KEY属性を指定したparentRuleタグ配下のcolumnRuleタグの中に、controller-arg属性に指定され

ていない要素値がある場合、controller-arg属性に指定されていない要素値は、集約時の 後の要素値のみが格納され

ます。

結果表の要素値は、集約を行うカラムの値でソートされている必要があります。

L.1.3 columnRule

説明

列要素に関するルールを指定します。

書式

- 527 -

<columnRule id="属性値" { colname="属性値" | colno="属性値" }

tagname="属性値" parent="属性値" hide="属性値" null="属性値"

handler="属性値" handler-arg="属性値" />

注) colname属性またはcolno属性のどちらか一方を指定します。

属性

属性名 説明 省略

id マッピングルール識別子(注1)を指定します。

id属性の指定は必須です。

不可

colname columnRuleタグの要素として取り出したい結果表の列

名を指定します(注2)。colname属性またはcolno属性のどちらか一方を必ず指

定してください。

条件

により

colno columnRuleタグの要素として取り出したい結果表の列

の番号を指定します。colno属性で指定した列から要素

が取り出されます。番号は1から始まる整数です。

colname属性またはcolno属性のどちらか一方を必ず指

定してください。

条件

により

tagname columnRuleタグで変換するXMLのタグ名を指定しま

す。

tagname属性を指定しない場合、結果表の列名がタグ

名として使用されます(注2)。tagname属性値に空文字("")を指定した場合、

columnRuleタグの開始タグと終了タグは出力されませ

ん。

条件

により

parent columnRuleタグの親タグとなるペアレントルールのマッ

ピングルール識別子を指定します。parent属性の設定

は必須です。

なお、parent属性で指定するマッピングルール識別子

を持つparentRuleタグは、指定するcolumnRuleタグより

前に設定する必要があります。

不可

hide columnRuleタグに対応する要素をXML文書に出力し

たくない場合は、hide属性の値を“yes”に指定します。

columnRuleタグに対応する要素をXML文書に出力す

る場合は、hide属性の設定は不要です。

null 結果表の列の値がnullである場合の要素の出力形式を

指定します。

以下のいずれかを指定することができます。

・ empty:カラム要素を空要素として出力します。

・ omit:カラム要素を省略します。

null属性を省略した場合、“empty”が指定されたとみな

します。

handler 結果表の列に格納されているデータがバイナリデータ

の場合、データを文字コード変換して、XML文書に出

力します。

結果表の列のデータがバイナリデータの場合、handler属性に“BINARYDATA”を指定します。handler-arg属

- 528 -

属性名 説明 省略

性には、変換するデータ種別と文字コードを指定しま

す。

結果表の列のデータがバイナリデータでない場合は、

handler属性の設定は不要です。

handler-arg handler属性に“BINARYDATA”を指定している場合に

有効となる属性です。

バイナリデータから文字コード変換するデータ種別と結

果表の列に格納されているデータの文字コードを指定

します。

データ種別と文字コードは、カンマで区切って指定しま

す。

・ データ種別

データ種別は、文字コード変換する形式を指定し

ます。データ種別には、以下のいずれかを指定で

きます。

- TEXT:データをテキストデータとしてXML文書に出力

する場合に指定します。

実体参照(注3)の変換処理を行います。

- XML:データをXMLデータとしてXML文書に出力す

る場合に指定します。

実体参照の変換処理を行いません。

“XML”を指定する場合は、結果表の列に格納

されているデータは、XML文書でなければなり

ません。ただし、XML宣言、DOCTYPE宣言、

DTDの記述を含むことはできません。

・ 文字コード

文字コードにはJavaの文字コード名を指定します。

handler-arg属性で指定した文字コード名は、文字

コード名を必要とするJavaの各種メソッドに引数とし

て渡されます。

handler-arg属性を指定しない場合、データ種別

は“TEXT”、文字コードは“UTF-8”が指定されたとみな

します。

注1) マッピングルール識別子は、ルールを識別するために使用する識別子です。この識別子は、1つのマッピング

ルールファイル内で一意である必要があります。

注2) CSVファイルからの変換の場合、CSVSourceクラスのsetFirstRecordToColumn()メソッドにより、1行目のデータを

列名として扱うことができます。

注3) XML変換機能で使用できる実体参照を以下に示します。

実体参照 表す記号

&lt; <

&gt; >

&amp; &

&apos; '

&quot; "

- 529 -

要素

ありません。

注意事項

・ 指定された列が結果表に存在しない場合、columnRuleタグは無効となります。

・ 1つのマッピングルールファイル内のcolumnRuleタグには、colname属性とcolno属性を同時に指定することはできま

せん。同時に指定した場合、エラーとなります。

以下の場合、1つのマッピングルールファイル内のcolumnRuleタグに、colname属性とcolno属性が同時に設定されてい

るため、エラーとなります。

<columnRule id="c1" colname="A" tagname="NUM" parent="p1" />

<columnRule id="c2" colno="2" tagname="NAME" parent="p1" />

・ 結果表の異なる列に対するcolumnRuleタグの指定には、同じtagname属性を指定することはできます。

以下の場合、結果表の異なる列に対して、同じtagname属性値を指定しているためエラーとなりません。

<columnRule id="c1" colno="1" tagname="foo" parent="p1" />

<columnRule id="c2" colno="2" tagname="foo" parent="p1" />

・ 結果表の同じ列に対するcolumnRuleタグの指定は、同じtagname属性値を指定することはできません。同じtagname属性値を指定した場合、エラーとなります。

例1

以下の場合、結果表の同じ列に対して同じtagname属性値を指定しているためエラーとなります。

<columnRule id="c1" colno="1" tagname="foo" parent="p1" />

<columnRule id="c2" colno="1" tagname="foo" parent="p1" />

例2

以下の場合、結果表の同じ列に対して異なるtagname属性値を指定しているためエラーとなりません。

<columnRule id="c1" colno="1" tagname="foo" parent="p1" />

<columnRule id="c2" colno="1" tagname="var" parent="p1" />

- 530 -

L.1.4 attributeRule

説明

列の値をXML文書の属性として変換する場合のルールを指定します。

書式

<attributeRule id="属性値" { colname="属性値"| colno="属性値" }

attrname="属性値" attrof="属性値" null="属性値" handler="属性値"

handler-arg="属性値" />

注) colname属性とcolno属性は、どちらか一方を指定します。

属性

属性名 説明 省略

id マッピングルール識別子(注1)を指定します。

id属性の指定は必須です。

不可

colname attributeRuleタグの要素として取り出したい結果表の

列名を指定します。

colname属性またはcolno属性のどちらか一方を必ず

指定してください。

条件

により

colno attributeRuleタグの要素として取り出したい結果表の

列の番号を指定します。

番号は1から始まる整数です。

colname属性またはcolno属性のどちらか一方を必ず

指定してください。

条件

により

attrname attributeRuleタグの属性名を指定します。attrname属性値を指定しない場合、属性値には結果表の列名

が設定されます(注2)。属性値には、空文字("")を指定することはできませ

ん。

不可

attrof attributeRuleタグを指定するカラムルールのマッピン

グルール識別子を指定します。

attrof属性の設定は必須です。

不可

null 列の値がnullである場合の属性の出力形式を指定し

ます。

以下のいずれかを指定できます。

・ empty:列の値を空文字("")として出力します。

・ omit:列の値を省略します。

null属性を指定しない場合は、“empty”が指定された

とみなします。

handler 結果表の列に格納されているデータがバイナリデー

タの場合、データを文字コード変換して、XML文書

として出力します。

結果表の列がバイナリデータの場合、handler属性

- 531 -

属性名 説明 省略

に“BINARYDATA”を指定します。handler-arg属性

には、変換するデータ種別と文字コードを指定しま

す。

結果表の列のデータがバイナリデータでない場合

は、handler属性の設定は不要です。

handler-arg handler属性に“BINARYDATA”を指定している場合

に有効となる属性です。

バイナリデータから文字コード変換するデータ種別と

結果表の列に格納されているデータの文字コードを

指定します。

データ種別と文字コードは、カンマで区切って指定

します。

・ データ種別

データ種別は、データをテキストデータとしてXML文書に出力する場合に指定します。データ種別

には、“TEXT”を指定します。

実体参照(注3)の変換処理を行います。

・ 文字コード

文字コードにはJavaの文字コード名を指定しま

す。handler-arg属性で指定した文字コード名は、

文字コード名を必要とするJavaの各種メソッドに

引数として渡されます。

handler-arg属性を指定しない場合、データ種別

は“TEXT”、文字コードは“UTF-8”が指定されたとみ

なします。

注1) マッピングルール識別子は、ルールを識別するために使用する識別子です。この識別子は、1つのマッピング

ルールファイル内で一意である必要があります。

注2) CSVファイルからの変換の場合、CSVSourceクラスのsetFirstRecordToColumn()メソッドにより、1行目のデータを

列名として扱うことができます。

注3) XML変換機能で使用できる実体参照を以下に示します。

実体参照 表す記号

&lt; <

&gt; >

&amp; &

&apos; '

&quot; "

要素

ありません。

注意事項

・ 属性の値は、データの検索対象となりません。

・ attributeRuleタグのcolname属性とcolno属性は、1つのマッピングルールファイル内に同時に指定することはできませ

ん。同時に指定した場合は、エラーとなります。

- 532 -

以下の場合、attributeRuleタグのcolname属性とcolno属性が、1つのマッピングルールファイル内に同時に指定されてい

るため、エラーとなります。

<attributeRule id="a1" colname="B" attrname="NUM" attrof="c1" />

<attributeRule id="a2" colno="3" attrname="NAME" attrof="c1" />

・ 1つのマッピングルールファイル内に、colname属性またはcolno属性を同時に指定することはできません。同時に指

定した場合は、エラーとなります。

以下の場合、1つのマッピングルールファイル内に、colname属性とcolno属性が同時に指定されているため、エラーとな

ります。

<columnRule id="c1" colname="A" tagname="NAME" parent="p1" />

<attributeRule id="a1" colno="2" attrname="NUM" attrof="c1" />

<attributeRule id="a2" colno="3" attrname="NAME" attrof="c1" />

・ attrof属性で指定するカラムルールのマッピング識別子は、同じマッピングルールファイル内で事前に記述する必要

があります。

・ 同一のカラムルールに対する属性ルールの属性名は、同じ属性名を指定することはできません。指定した場合、エ

ラーとなります。

以下の場合、同一のカラムルールに対する属性ルールの属性名に、同じ属性名が指定されているため、エラーとなりま

す。

<columnRule id="c1" colname="B" tagname="NAME" parent="p1" />

<attributeRule id="a1" colname="A" attrname="foo" attrof="c1" />

<attributeRule id="a2" colname="C" attrname="foo" attrof="c1" />

L.1.5 documentRule

説明

出力するXML文書にXML宣言を定義しない場合のルールを指定します。

書式

<documentRule id="属性値" def="no" />

属性

- 533 -

属性名 説明 省略

id マッピングルール識別子(注)を指定します。

id属性の指定は必須です。

不可

注) マッピングルール識別子は、ルールを識別するために使用する識別子です。この識別子は、1つのマッピングルー

ルファイル内で一意である必要があります。

要素

ありません。

注意事項

・ documentRuleタグは、複数指定することはできません。1つのマッピングルールファイル内で1つだけ指定してくださ

い。

・ 出力するXML文書にXML宣言を定義する場合は、documentRuleタグを指定する必要はありません。

L.1.6 extensionRule

説明

追加情報に関するルールを指定します。

書式

<extensionRule id="属性値" { tagname="属性値" | attrname="属性値" }

{ parent="属性値" | attrof="属性値" } extender="属性値"

extender-arg="属性値" />

注) tagname属性とattrnam属性はどちらか一方を指定します。

parent属性とattrof属性はどちらか一方を指定します。

属性

属性名 説明 省略

id マッピングルール識別子(注)を指定します。

id属性の指定は必須です。

不可

tagname 要素を追加する場合、追加する要素のタグ名を指

定します。

属性値に空文字("")を指定した場合、extensionRuleタグの開始タグと終了タグは出力されません。

tagname属性またはattrname属性のどちらか一方を

必ず指定してください。

条件

により

attrname 属性を追加する場合、追加する属性の属性名を指

定します。

属性値に空文字("")を指定することはできません。

tagname属性またはattrname属性のどちらか一方を

必ず指定してください。

条件

により

- 534 -

属性名 説明 省略

parent 要素を追加する場合、追加する要素の親要素に対

応するマッピングルール識別子を指定します。

tagname属性を指定した場合、parent属性の設定は

必須です。

parent属性で指定するマッピングルール識別子を持

つマッピングルールは、追加する要素のマッピング

ルールより前に記述する必要があります。

条件

により

attrof 属性を追加する場合、追加する属性に対応するマッ

ピングルール識別子を指定します。

attrname属性を指定した場合、attrof属性の設定は

必須です。

attrof属性で指定するマッピングルール識別子を持

つマッピングルールは、この追加属性のマッピング

ルールより前に記述する必要があります。

条件

により

extender 追加する属性情報の取得方法を指定します。

extender属性には、以下の値を指定することができ

ます。

・ STATIC:追加する情報を文字列とする場合に指定しま

す。extender-arg属性でその文字列を指定しま

す。

・ EMPTY:追加する情報を空要素とする場合に指定しま

す。attrname属性と共に指定することはできませ

ん。

不可

extender-arg 文字列を指定します。

extender属性の値が“STATIC”の場合、extender-arg属性を指定する必要があります。extender-arg属性

の値が追加する情報の値となります。

条件

により

注) マッピングルール識別子は、ルールを識別するために使用する識別子です。この識別子は、1つのマッピングルー

ルファイル内で一意である必要があります。

要素

ありません。

注意事項

ありません。

L.2 マッピングルールの適用例

結果表の1行を1つのXML文書に変換する場合の適用例を、以下に示します。

- 535 -

図L.1 マッピングルールの適用例

XML変換機能では、結果表を1行ごとに処理するため、結果表の1行目のレコードセットが、マッピングルールの定義に

適用される変換対象になります。

以下に、上記の例でのXML変換の手順を説明します。

1. テキストファイルに出力されるXML文書のルートタグは、図のマッピングルールのルール1より、“PERSON”タグと

なります。

2. 図のマッピングルールのルール2の tagname属性およびparent属性の指定により、PERSONタグの子要素

を“NUM”タグとします。

3. 図のマッピングルールのルール2のcolname属性の指定により、対象のレコードセットからA列の値を取得します。

4. 手順3.で取得したA列の値“001”を、XML文書に“NUM”タグの要素として出力します。

5. 手順2.~手順4.と同様に、ルール3を適用します。

6. 手順2.~手順4.と同様に、ルール4を適用します。

ポイント

・ 各定義タグのid属性について

各定義タグには、マッピングルール内で一意となるidを定義タグごとに指定する必要があります。親子関係の階層構

造を設定する場合、その親要素を特定するために、親タグのidをparentタグ属性にて指定します。

親子関係の構造を表すイメージを下図に示します。

- 536 -

・ 親タグ配下に、別の親タグを配置することで、階層的なXML文書構造を表現することもできます。階層的なXML文書構造とする場合の詳細については、“L.3.2 タグ階層ありの抽出パターン”を参照してください。

L.3 マッピングルールの変換例

マッピングルールを用いて、結果表からXML文書を生成する例を以下に示します。

L.3.1 タグ階層なしの抽出パターン

タグ階層がないXML文書を抽出する場合の例を、以下に示します。

結果表

結果表の1行目のデータから、指定した列のデータを取り出し、ルートタグ“PERSON”の要素となるXML文書を生成する

パターンのマッピングルールを、以下に示します。

- 537 -

マッピングルール

<?xml version="1.0"?>

<MappingRule>

<parentRule id="p1" tagname="PERSON" />

<columnRule id="c1" colname="A" tagname="NUM" parent="p1" />

<columnRule id="c2" colname="B" tagname="NAME" parent="p1" />

<columnRule id="c3" colname="C" tagname="JOB" parent="p1" />

</MappingRule>

上記マッピングルールから出力されるXML文書は、以下のようになります。

L.3.2 タグ階層ありの抽出パターン

タグ階層があるXML文書を抽出する場合の例を、以下に示します。

結果表

結果表の1行目のデータから、指定した列のデータを取り出し、ルートタグ“PERSON”の配下に階層的な構造をもつXML文書を生成するパターンのマッピングルールを、以下に示します。

- 538 -

マッピングルール

<?xml version="1.0"?>

<MappingRule>

<parentRule id="p1" tagname="PERSON" />

<columnRule id="c1" colname="A" tagname="NUM" parent="p1" />

<columnRule id="c2" colname="B" tagname="NAME" parent="p1" />

<columnRule id="c3" colname="C" tagname="JOB" parent="p1" />

<parentRule id="p2" tagname="DETAIL" parent="p1" />

<columnRule id="c4" colname="E" tagname="LOCNUM" parent="p2" />

<columnRule id="c5" colname="F" tagname="LOC" parent="p2" />

</MappingRule>

上記マッピングルールから出力されるXML文書は、以下のようになります。

L.3.3 固定値を抽出するパターン

存在していない固定値としてXML文書を抽出する場合の例を、以下に示します。

結果表

- 539 -

結果表に存在しない固定値を、ルートタグ“PERSON”の属性に指定するXML文書を生成するパターンのマッピングルー

ルを以下に示します。

なお、マッピングルールは、ルートタグにXML名前空間を記載したい場合の例です。

マッピングルール

<?xml version="1.0"?>

<MappingRule>

<parentRule id="p1" tagname="PERSON" />

<extensionRule id="e1" attrname="xmlns:YY" attrof="p1" extender="STATIC"

extender-arg="http://host.sample.co.jp/dtd/YY"/>

<columnRule id="c1" colname="A" tagname="YY:NUM" parent="p1" />

<columnRule id="c2" colname="B" tagname="YY:NAME" parent="p1" />

<columnRule id="c3" colname="C" tagname="YY:JOB" parent="p1" />

</MappingRule>

上記マッピングルールから出力されるXML文書は、以下のようになります。

L.3.4 列のデータを属性として抽出するパターン

列のデータを属性としてXML文書を抽出する場合の例を、以下に示します。

結果表

- 540 -

結果表の指定した列から特定のタグの属性値としてXML文書を生成するパターンのマッピングルールを、以下に示しま

す。

なお、マッピングルールは、列FをJOBタグのLOCという属性名に、列Fの値をLOC属性の属性値とした場合の例です。

マッピングルール

<?xml version="1.0"?>

<MappingRule>

<parentRule id="p1" tagname="PERSON" />

<columnRule id="c1" colname="A" tagname="NUM" parent="p1" />

<columnRule id="c2" colname="B" tagname="NAME" parent="p1" />

<columnRule id="c3" colname="C" tagname="JOB" parent="p1" />

<attributeRule id="a1" colname="F" attrname="LOC" attrof="c3" />

</MappingRule>

上記マッピングルールから出力されるXML文書は、以下のようになります。

L.3.5 列のデータを固定属性として抽出するパターン

列のデータを固定属性としてXML文書を抽出する場合の例を、以下に示します。

結果表

- 541 -

結果表の指定した列から特定のタグの固定属性名としてXML文書を生成するパターンのマッピングルールを、以下に

示します。

なお、マッピングルールは、以下のタグの固定属性名とした場合の例です。

・ 列Aを“NUM”のタグの要素

・ 列Dを“NAME”のタグの要素

・ 列Eを“JOB”タグの要素

・ 列Bを“NUM”のタグのname属性

・ 列Cを“NAME”のタグのname属性

・ 列Fを“JOB”のタグのname属性

マッピングルール

<?xml version="1.0"?>

<MappingRule>

<parentRule id="p1" tagname="PERSON" />

<columnRule id="c1" colname="A" tagname="NUM" parent="p1" />

<attributeRule id="a1" colname="B" attrname="name" attrof="c1" />

<columnRule id="c2" colname="D" tagname="NAME" parent="p1" />

<attributeRule id="a2" colname="C" attrname="name" attrof="c2" />

<columnRule id= "c3" colname="E" tagname="JOB" parent="p1" />

<attributeRule id="a3" colname="F" attrname="name" attrof="c3" />

</MappingRule>

上記マッピングルールから出力されるXML文書は、以下のようになります。

L.3.6 列名を属性として抽出するパターン

列名を属性としてXML文書を抽出する場合の例を、以下に示します。

- 542 -

結果表

結果表の指定した列をそのまま特定のタブの属性値としてXML文書を生成するパターンのマッピングルールを、以下に

示します。

なお、マッピングルールは、以下のタグの固定属性名とした場合の例です。

・ 列Aを“NUM”のタグの要素かつ列名を“NUM”のname属性

・ 列Dを“NAME”のタグの要素かつ列名を“NAME”のname属性

・ 列Eを“JOB”のタグの要素かつ列名を“JOB”のname属性

・ 列Bを“NUM”のタグのvalue属性

・ 列Cを“NAME”のタグのvalue属性

・ 列Fを“JOB”のタグのvalue属性

マッピングルール

<?xml version= "1.0"?>

<MappingRule>

<parentRule id="p1" tagname="PERSON" />

<columnRule id="c1" colname="A" tagname="NUM" parent="p1" />

<extensionRule id="e1" attrname="name" attrof="c1" extender="STATIC"

extender-arg="A" />

<attributeRule id="a1" colname="B" attrname="value" attrof="c1" />

<columnRule id="c2" colname="D" tagname="NAME" parent="p1" />

<extensionRule id="e2" attrname="name" attrof="c2" extender="STATIC"

extender-arg="D" />

<attributeRule id="a2" colname="C" attrname="value" attrof="c2" />

<columnRule id="c3" colname="E" tagname="JOB" parent="p1" />

<extensionRule id="e3" attrname="name" attrof="c3" extender="STATIC"

extender-arg="E" />

<attributeRule id="a3" colname="F" attrname="value" attrof="c3" />

</MappingRule>

上記マッピングルールから出力されるXML文書は、以下のようになります。

- 543 -

L.3.7 集約によるタグ階層ありの抽出パターン

集約によるタグの階層があるXML文書を抽出する場合の例を、以下に示します。

結果表

結果表の1行の中から指定した列のデータを取り出し、“PERSON”タグの要素とし、次の行でも繰り返し同じ変換を行うよ

うにします。また、A,B,C列で共通の値がある場合、集約してXML文書出力するパターンのマッピングルールを、以下に

示します。

マッピングルール

<?xml version= "1.0"?>

<MappingRule>

<parentRule id="p1" tagname="PERSON" controller="KEY" controller-

arg="c1,c2,c3"/>

<columnRule id="c1" colname="A" tagname="NUM" parent="p1"/>

<columnRule id="c2" colname="B" tagname="NAME" parent="p1"/>

<columnRule id="c3" colname="C" tagname="JOB" parent="p1"/>

<parentRule id="p2" tagname="DETAIL" parent="p1"/>

<columnRule id="c4" colname="E" tagname="LOCNUM" parent="p2"/>

<columnRule id="c5" colname="F" tagname="LOC" parent="p2"/>

</MappingRule>

上記マッピングルールから出力されるXML文書は、以下のようになります。

- 544 -

L.3.8 バイナリデータを抽出するパターン

バイナリデータが存在する結果表から、XML文書を抽出する場合の例を、以下に示します。

参照

結果表のバイナリデータとXML変換機能で使用できるデータ型の対応についての詳細は、“12.7 XML変換機能の対応

するデータ型”を参照してください。

結果表

以下の結果表のD列はバイナリデータです。

- 545 -

上記の結果表からバイナリデータが含まれたXML文書を生成するパターンのマッピングルールを、以下に示します。

マッピングルール

<?xml version="1.0"?>

<MappingRule>

<parentRule id="p1" tagname="Rep" />

<columnRule id="c1" colname="A" tagname="NUM" parent="p1" />

<columnRule id="c2" colname="B" tagname="DATE" parent="p1" />

<columnRule id="c3" colname="C" tagname="HOROSCOPE" parent="p1" />

<columnRule id="c4" colname="D" tagname="SCRIPT" parent="p1" handler="BINARYDATA"

handler-arg="XML" />

</MappingRule>

上記マッピングルールから出力されるXML文書は、以下のようになります。

- 546 -

付録M V6.0L20以前のJava APIV6.0L20以前に提供された、Javaのデータ検索および更新用APIの一覧を以下に示します。V6.0L20以前のShunsaku用アプリケーションをそのまま利用するための、互換機能です。

注意

・ API用動作環境ファイルは使用できません。

・ V6.0L30以降に追加された機能は使用できません。

パッケージ

クラス名 継承 コンストラク

タまたはメ

ソッド名

機能

com.fujitsu.shun.api

ShunSearch

なし create 本APIのインスタンスを生成し、検索

サーバの構成情報を設定します。

executeSearch1

検索依頼をShunsakuに送信し、結果

としてヒット件数のみを受信します。

executeSearch2

検索依頼およびリターン式を

Shunsakuに送信し、結果としてヒット

件数、コンダクタ制御情報、レコード

識別子および指定した項目のデータ

を受信します。

executeSearch3

検索対象となるコンダクタ制御情報お

よびレコード識別子をShunsakuに送

信し、結果として該当するレコード情

報をすべて受信します。

getHitCount

検索結果であるヒットレコード数を返

信します。

getRetNum

検索結果である返信レコード数を返

信します。

getRecNo

検索結果であるコンダクタ制御情報

およびレコード識別子を返信します。

getRecData

検索結果である応答データ内容を返

信します。

検索モード(executeSearch2、executeSearch3)およびリターン式に

より、返信結果形式が異なります。

ShunBatch

なし ShunBatch

ShunBatchのインスタンスを生成しま

す。

executeAdd

指定されたテキストファイルに格納さ

れているXML文書を、Shunsakuのレ

コードに追加します。

executeDelete

削除したいレコードを検索するための

検索条件をShunsakuに送信し、条件

に一致したレコードを削除します。

- 547 -

M.1 ShunSearchクラス

ShunSearchは、データを検索する場合に使用するクラスです。

M.1.1 create

機能

本インスタンスを生成し、パラメタをソケット接続のためのインスタンス変数に格納します。

記述形式

ShunSearch create (

String host_Name, /* (1)ホスト名 */

int port_No, /* (2)ポート番号 */

String Reserve2, /* (3)リザーブ(null) */

String strCode, /* (4)データの文字コード */

String getCode /* (5)結果データ返却文字コード */

);

復帰値

正常終了した場合は、本インスタンスが返されます。

パラメタ

(1) ホスト名

conductor(director)が稼働しているサーバのホスト名を指定します。

conductorを使用する場合は、conductorが稼働しているサーバのホスト名を指定します。

conductorを使用しない場合は、directorが稼働しているサーバのホスト名を指定します。

(2) ポート番号

conductor(director)のポート番号を指定します。

conductorを使用する場合は、システム用動作環境ファイルのconductorの要求受付ポート番号を指定します。

conductorを使用しない場合は、システム用動作環境ファイルのdirectorの要求受付ポート番号を指定します。

(3) リザーブ

nullを指定します。

(4) データの文字コード

データファイルの文字コードを指定します。

- 548 -

設定 意味

SJIS SHIFT-JISの場合

EUC_JP

EUCの場合

UTF-8 UTF-8の場合

ShunSearchクラスのメソッドを実行するときに指定されるXML文書を、本パラメタに指定した文字コードに変換して、

Shunsakuに送信します。文字コード変換の詳細については、“M.3 文字コード”を参照してください。

(5) 結果データ返却文字コード

検索結果データの返却文字コードを指定します。

設定 意味

SJIS SHIFT-JISの場合

EUC_JP

EUCの場合

UTF-8 UTF-8の場合

検索結果のデータを本パラメタに指定した文字コードに変換して、アプリケーションに返却します。文字コード変換の

詳細については、“M.3 文字コード”を参照してください。

例外

ShunException

パラメタ値が不正な場合に出力されます。

エラーコードの詳細については、“M.4 出力されるエラーコード”を参照してください。

M.1.2 executeSearch1

機能

パラメタを基に検索を行い、ヒット件数を取得します。

記述形式

void executeSearch1(

String Query /* (1)検索式 */

);

復帰値

ありません。

パラメタ

- 549 -

(1) 検索式

検索式を文字コードUnicodeで指定します。

検索式は1~1048575バイトにしてください。

検索式の詳細については、“B.3 検索式”を参照してください。

例外

ShunException

検索処理にてエラーが発生した場合に出力されます。

エラーコードの詳細については、“M.4 出力されるエラーコード”を参照してください。

M.1.3 executeSearch2

機能

パラメタを基に検索を行い、検索結果を取得します。

記述形式

void executeSearch2(

String Query, /* (1)検索式 */

int Reply_No, /* (2)返信開始番号 */

int Request_Cnt, /* (3)返信要求件数 */

String Return, /* (4)リターン式 */

String Reserve1 /* (5)リザーブ(null) */

);

復帰値

ありません。

パラメタ

(1) 検索式

検索式を文字コードUnicodeで指定します。

検索式は1~1048575バイトにしてください。

検索式の詳細については、“B.3 検索式”を参照してください。

(2) 返信開始番号

返信開始番号を指定します。

ヒットしたデータの何件目から取得するのかを指定します。1以上の値を指定します。

- 550 -

(3) 返信要求件数

返信要求件数を指定します。

検索結果として取得する 大件数(1以上)を指定します。

クライアントの要求への応答 大件数を超えた値を指定した場合、クライアントの要求への応答 大件数までが返信

されます。

クライアントの要求への応答 大件数は、conductorを使用する場合はconductor用動作環境ファイルのAnsMaxを、

conductorを使用しない場合はdirector用動作環境ファイルのAnsMaxを参照します。

(4) リターン式

リターン式を文字コードUnicodeで指定します。

リターン式は0~1048575バイトにしてください。

リターン式の詳細については、“B.4 リターン式”を参照してください。

(5) リザーブ

nullを指定します。

例外

ShunException

検索処理にてエラーが発生した場合に出力されます。

エラーコードの詳細については、“M.4 出力されるエラーコード”を参照してください。

M.1.4 executeSearch3

機能

executeSearch2を実行後、返信レコード数が1以上の場合に、パラメタのコンダクタ制御情報およびレコード識別子に対

するデータを取得します。

記述形式

void executeSearch3(

String cond_CntlInfo[], /* (1)コンダクタ制御情報 */

String rec_ID[] /* (2)レコード識別子 */

);

復帰値

ありません。

パラメタ

- 551 -

(1) コンダクタ制御情報

getRecNoメソッドで取得したコンダクタ制御情報を、取得する順に指定します。

注意

設定する文字はUnicodeにしてください。

(2) レコード識別子

getRecNoメソッドで取得したレコード識別子を、取得する順に指定します。

注意

設定する文字はUnicodeにしてください。

例外

ShunException

検索処理にてエラーが発生した場合に出力されます。

エラーコードの詳細については、“M.4 出力されるエラーコード”を参照してください。

M.1.5 getHitCount

機能

ヒットレコード数を返信します。

記述形式

int getHitCount ();

復帰値

ヒットレコード数が返されます。

パラメタ

ありません。

例外

ShunException

直前の検索メソッドがヒットレコード数を返却しなかった場合に出力されます。

エラーコードの詳細については、“M.4 出力されるエラーコード”を参照してください。

- 552 -

M.1.6 getRetNum

機能

返信レコード数を返信します。

記述形式

int getRetNum ();

復帰値

返信レコード数が返されます。

パラメタ

ありません。

例外

ShunException

直前の検索メソッドが返信レコード数を返却しなかった場合に出力されます。

エラーコードの詳細については、“M.4 出力されるエラーコード”を参照してください。

M.1.7 getRecNo

機能

コンダクタ制御情報およびレコード識別子を返信します。

記述形式

String[] getRecNo (

int getNo /* (1)返信データ順番号 */

);

復帰値

executeSearch2またはexecuteSearch3メソッドを実行した結果、返信レコード数が0以上の場合、conductor(director)から

取得したコンダクタ制御情報およびレコード識別子という2つの要素を持つ配列で返信します。

パラメタ

- 553 -

(1) 返信データ順番号

取得するコンダクタ制御情報およびレコード識別子の返信データ順番号を指定します。

例外

ShunException

以下のエラーが発生した場合に出力されます。

- 直前の検索メソッドがコンダクタ制御情報またはレコード識別子を返却しなかった場合

- 返信データ順番号に返信レコード数よりも大きい数字が指定された場合

- 返信データ順番号に-1以下の値が指定された場合

エラーコードの詳細については、“M.4 出力されるエラーコード”を参照してください。

返信レイアウト

本メソッドは、1回の呼出しごとに2つの要素の配列を作成し、アプリケーションに返却します。

1つ目の要素にコンダクタ制御情報、2つ目の要素にレコード識別子を格納します。

実行 取得配列 配列内容

getRecNo(0) 取得配列[0] 1レコード目のコンダクタ制御情報

取得配列[1] 1レコード目のレコード識別子

getRecNo(1) 取得配列[0] 2レコード目のコンダクタ制御情報

取得配列[1] 2レコード目のレコード識別子

getRecNo(2) 取得配列[0] 3レコード目のコンダクタ制御情報

取得配列[1] 3レコード目のレコード識別子

M.1.8 getRecData

機能

応答データ内容を、create()メソッドの“結果データ返却文字コード”パラメタに指定した文字コードで返信します。

記述形式

String[] getRecData ();

復帰値

ディレクタからの応答データ内容を返信件数分の要素を持つ配列として返します。

パラメタ

ありません。

- 554 -

例外

ShunException

以下のエラーが発生した場合に出力されます。

- 前の検索メソッドが応答データ内容を返却しなかった場合

- 応答データ内容がない場合(レコード返信件数が0件の場合)

エラーコードの詳細については、“M.4 出力されるエラーコード”を参照してください。

返信レイアウト

本メソッドは、返信件数分の要素を持つ配列を作成し、アプリケーションに返却します。

1つ目の要素に応答データの内容を格納します。

実行 取得配列 配列内容

getRecData() 取得配列[0] 1件目の応答データ内容

取得配列[1] 2件目の応答データ内容

取得配列[2] 3件目の応答データ内容

・・・ ・・・ ・・・

M.2 ShunBatchクラス

ShunBatchは、データを更新する場合に使用するクラスです。

M.2.1 ShunBatch

機能

ShunBatchのインスタンスを生成します。

記述形式

public ShunBatch(

String hostName, /* (1)ホスト名 */

int port, /* (2)ポート番号 */

String reserve2, /* (3)リザーブ(null) */

String strCode, /* (4)データの文字コード */

String getCode, /* (5)結果データ返却文字コード */

String directorName /* (6)director識別子 */

) throws ShunException;

- 555 -

パラメタ

(1) ホスト名

データを更新するdirectorが稼働しているサーバのホスト名を指定します。

ホスト名にnullまたは空文字("")を指定した場合、“localhost”が指定されたとみなします。

(2) ポート番号

データを更新するconductorの要求受付ポート番号を指定します。

データを更新するシステム用動作環境ファイルのconductorの要求射受付ポート番号を指定します。

(3) リザーブ

nullを指定します。

(4) データの文字コード

データの文字コードを指定します。

設定 意味

SJIS SHIFT-JISの場合

EUC_JP

EUCの場合

UTF-8 UTF-8の場合

ディレクタサーバで使用している文字コードを指定してください。

(5) 結果データ返却文字コード

検索結果データの返却文字コードを指定します。

設定 意味

SJIS SHIFT-JISの場合

EUC_JP

EUCの場合

UTF-8 UTF-8の場合

ディレクタサーバで使用している文字コードを指定してください。

(6) director識別子

データを更新するdirectorのdirector識別子を指定します。

例外

ShunException

システムプロパティが設定されていない場合や、director識別子にnullまたは空文字("")が指定された場合に出力さ

れます。

エラーコードの詳細については、“M.4 出力されるエラーコード”を参照してください。

- 556 -

M.2.2 executeAdd

機能

指定されたテキストファイルに格納されているXML文書を、Shunsakuのレコードに追加します。

記述形式

public void executeAdd(

String xmlDatafileName /* (1)テキストファイルのパス */

) throws ShunException;

復帰値

ありません。

パラメタ

(1) テキストファイルのパス

追加するXML文書を格納しているテキストファイルの絶対パス名を指定します。

追加するXML文書は、Shunsakuに格納しているデータと同じ文字コードにしてください。ただし、XMLのルートタグ

に記述されている文字エンコーディングは無効になります。

注意

複数のXML文書を追加する場合、これらのデータを結合して、1個のテキストファイルとして引数に設定することを推

奨します。

例外

ShunException

XML文書の追加にてエラーが発生した場合に出力されます。

エラーコードの詳細については、“M.4 出力されるエラーコード”を参照してください。

注意事項

・ 本メソッドは、同期呼出しのため、すべてのデータを追加するまで、呼出し元に制御は戻りません。

・ 本メソッドが完了するまで、今回このメソッドで追加したデータは検索できません。

・ 本メソッドが完了するまで、引数に指定されたテキストファイルは削除しないでください。

M.2.3 executeDelete

- 557 -

機能

削除したいレコードを検索するための検索条件をShunsakuに送信し、条件に一致したレコードを削除します。

記述形式

public void executeDelete(

String query, /* (1)検索式 */

int replyNo, /* (2)削除開始番号 */

int requestCnt, /* (3)削除要求件数 */

String reserve1, /* (4)リザーブ(null) */

String recordIDfileName /* (5)作業用ファイルのパス */

) throws ShunException;

復帰値

ありません。

パラメタ

(1) 検索式

検索式を文字コードUnicodeで指定します。

検索式は1~1048575バイトにしてください。

検索式の詳細については、“B.3 検索式”を参照してください。

(2) 削除開始番号

削除開始番号を指定します。

ヒットしたデータの何件目から削除するのかを指定します。1以上の値を指定します。

(3) 削除要求件数

削除要求件数を指定します。

削除する 大件数または“-1”を指定します。削除する 大件数には1以上の値を指定します。

なお、削除する 大件数にクライアントの要求への応答 大件数(director用動作環境ファイルのAnsMax)を超える

値を指定した場合、または“-1”を指定した場合は、検索条件に一致したレコードはすべて削除されます。

(4) リザーブ

nullを指定します。

(5) 作業用ファイルのパス

データを削除するためのAPIの内部処理で使用する作業用ファイルの絶対パスを指定します。

なお、作業用領域として、1レコードあたり24バイト必要です。

- 558 -

注意

作業用ファイルに指定するディレクトリは、あらかじめ作成しておく必要があります。

例外

ShunException

XML文書の削除にてエラーが発生した場合に出力されます。

エラーコードの詳細については、“M.4 出力されるエラーコード”を参照してください。

注意事項

・ 本メソッドは、同期呼出しのため、設定したすべてのデータを削除するまで、呼出し元に制御は戻りません。

M.3 文字コード

Java APIにパラメタとして渡す文字コードは、Unicodeにしてください。

全体の文字コード変換は、以下のようになります。

図M.1 文字コード変換

M.4 出力されるエラーコード

データ検索および更新用API(Java)の関数を使用したときに出力されるエラーコードについて以下に説明します。

- 559 -

・ ShunExeptionクラスのgetErrCode()メソッドを使用することで、エラーコードを取得することができます。

・ ShunExeptionクラスのgetMessage()メソッドを使用することで、以下の形式のエラーメッセージを取得することができま

す。

Error occurred. (errCode=エラーコード)

エラー

コード

意味 利用者の処置

-1 ホストへの接続エラー

が発生しました。

接続先ディレクタサーバのホスト名、ポート番号を確認

し、再実行してください。

-10 サービスが受付可能

状態でありません。

しばらく待ってから、再実行してください。

-11 検索依頼の同時受付

大件数オーバーが

発生しました。

しばらく待ってから、再実行してください。

-12 directorからの応答待

ちでタイムアウトが発

生しました。

しばらく待ってから、再実行してください。

-20 パラメタエラーが発生

しました。

パラメタを確認し、再実行してください。

-21 検索式構文エラーが

発生しました。

検索式を確認し、再実行してください。

-22 リターン式構文エラー

が発生しました。

リターン式を確認し、再実行してください。

-23 検索式サイズエラー

が発生しました。

入力パラメタの検索式の長さを確認し、再実行してくだ

さい。

-24 リターン式サイズエ

ラーが発生しました。

入力パラメタのリターン式の長さを確認し、再実行して

ください。

-30 応答データ格納領域

不足エラーが発生し

ました。

応答データ格納領域を増やして、再実行してください。

-100 API内部エラーが発

生しました。

返信レコード件数が0件でない検索条件に変更し、デー

タ取得メソッドを呼び出してください。

-101 API内部エラーが発

生しました。

検索メソッドに対応したデータ取得メソッドを呼び出し

てください。

-102 API内部エラーが発

生しました。

返信レコード件数が0件でない検索条件に変更し、レ

コード識別子取得メソッドを呼び出してください。

-103 API内部エラーが発

生しました。

検索メソッドに対応したレコード識別子取得メソッドを呼

び出してください。

-104 API内部エラーが発

生しました。

検索メソッドを呼び出して、ヒット件数取得メソッドを呼

び出してください。

-105 API内部エラーが発

生しました。

正常にインスタンスを生成(createメソッドの実行)後、検

索メソッドを呼び出してください。

-106 API内部エラーが発

生しました。

検索メソッドに対応した返信レコード件数取得メソッドを

呼び出してください。

-107 API内部エラーが発

生しました。

リターン式をNULL以外に変更してデータ取得メソッド

を呼び出してください。

- 560 -

エラー

コード

意味 利用者の処置

-201 Shunsakuのコマンド

ディレクトリのパスが

指定されていません。

Shunsakuのコマンドディレクトリのパスをシステムプロパ

ティに設定し、再実行してください。

-202 director識別子が指

定されていません。

director識別子を設定し、再実行してください。

-203 追加するXML形式

データのパスが指定

されていません。

追加するXML文書のパスを設定し、再実行してくださ

い。

-204 shundimportコマンド

による追加に失敗し

ました。

・ shundimportコマンドに指定したXML文書の内容

を確認し、再実行してください。

・ ディレクタサーバの状態を確認し、再実行してくだ

さい。

-206 作業用ファイルが指

定されていません。

作業用ファイルのパスを設定し、再実行してください。

-207 shundimportコマンド

による削除に失敗し

ました。

・ 引数に指定したrecordIDfileName(作業用のファイ

ルのパス)には、絶対パスを指定してください。

・ ディレクタサーバの状態を確認し、再実行してくだ

さい。

-208 shundimportコマンド

の起動に失敗しまし

た。

・ システムプロパティに設定されているshundimportコマンドのパスを確認し、再実行してください。

・ 特権ユーザで実行してください。

-209 shundimportコマンド

が中断されました。

“トラブルシューティング集”の“コマンド実行中にサー

バがダウンした場合の対応”に従って対処し、再実行

してください。

-210 作業用ファイルの

オープンに失敗しま

した。

作業用ファイルのパスを確認し、再実行してください。

-211 作業用ファイルへの

書込みに失敗しまし

た。

ディスクの状態を確認し、再実行してください。

注意

Javaの例外もアプリケーションでcatchする必要があります。起こりうる例外を以下に示します。

例外 発生メソッド 内容 対処方法

OutOfMemoryError

・ executeSearch2

・ executeSearch3

・ executeDelete

メモリエラー

が発生しま

した。

・ 返信要求

件数を減

らして実行

してくださ

い。

・ リターン項

目数を減

らして実行

- 561 -

例外 発生メソッド 内容 対処方法

してくださ

い。

- 562 -

付録N V6.0L30以前のC APIV6.0L30以前に提供された、C言語のAPI一覧を以下に示します。

V6.0L30以前のShunsaku用アプリケーションをそのまま利用するための、互換機能です。

注意

・ API用動作環境ファイルは使用できません。

・ V7.0L10以降に追加された機能は使用できません。

ShunsakuのAPIの一覧を以下に示します。

関数名称 機能

shunadd 指定されたXML文書をShunsakuに追加します。

shundeletebyrecid 削除対象となるコンダクタ制御情報およびレコード識別子を

Shunsakuに送信し、該当するXML文書を削除します。

shunsearch1 検索依頼をShunsakuに送信し、結果としてヒット件数のみを

受信します。

shunsearch2 検索依頼およびリターン式をShunsakuに送信し、結果とし

てヒット件数、コンダクタ制御情報、レコード識別子および指

定した項目のXML文書を受信します。

shunsearch3 検索対象となるコンダクタ制御情報およびレコード識別子を

Shunsakuに送信し、結果として該当するXML文書を受信し

ます。

shunsort 検索依頼、リターン式およびソート式をShunsakuに送信し、

結果としてヒット件数、コンダクタ制御情報、レコード識別子

および指定した項目をソートしたXML文書を受信します。

また、検索依頼、集合関数を指定したリターン式およびソー

ト式をShunsakuに送信し、結果として集計結果を受信しま

す。

これらの関数は、マルチスレッド環境での動作を保証しています。

N.1 shunadd

機能

入力パラメタに指定したXML文書をShunsakuに追加します。

記述形式

#include “libshun.h”

int shunadd(

char *host_Name, /* in (1)ホスト名 */

int Port_No, /* in (2)ポート番号 */

int DataArray_Cnt, /* in (3)追加データ情報配列数 */

char **DataArray /* in (4)追加データ情報配列域 */

);

- 563 -

復帰値

本関数が通知するエラーコードが返却されます。

正常終了の場合は、“0”です。

復帰値が“0”以外の場合、処理結果は保証されません。

エラーコードの詳細については、“N.7 出力されるエラーコード”を参照してください。

パラメタ

(1)ホスト名

conductorが稼働しているサーバのホスト名またはIPアドレスを指定します。

サイズは24バイト以内です。

(2)ポート番号

conductor用動作環境ファイルのMySearchPortを指定します。

(3)追加データ情報配列数

追加するXML文書を格納しているデータ配列の個数を指定します。

1以上の値を指定します。

(4)追加データ情報配列域

追加するXML文書を格納している領域のポインタを配列に設定します。そのポインタを指定します。

注意

・ 1つの追加データ領域には、1つ以上のXML文書を格納してください。データ領域に格納するXML文書の形式につ

いては、“11.2.3.1 データを追加する”を参照してください。

・ 本関数を使用する場合は、conductorは必須です。

N.2 shundeletebyrecid

機能

入力パラメタのレコード識別子に対応するXML文書を削除します。

- 564 -

記述形式

#include “libshun.h”

int shundeletebyrecid(

char *host_Name, /* in (1)ホスト名 */

int Port_No, /* in (2)ポート番号 */

int Request_Cnt, /* in (3)削除要求件数 */

char **cond_ctl, /* in (4)コンダクタ制御情報域 */

char **rec_ID /* in (5)削除レコード識別子域 */

);

復帰値

本関数が通知するエラーコードが返却されます。

正常終了の場合は、“0”です。

復帰値が“0”以外の場合、処理結果は保証されません。

エラーコードの詳細については、“N.7 出力されるエラーコード”を参照してください。

パラメタ

(1)ホスト名

conductorが稼働しているサーバのホスト名またはIPアドレスを指定します。

サイズは24バイト以内です。

(2)ポート番号

conductor用動作環境ファイルのMySearchPortを指定します。

(3)削除要求件数

削除するデータの件数を指定します。

(4)コンダクタ制御情報域

以下の手順でコンダクタ制御情報域を設定します。

1. コンダクタ制御情報としてlibshun.hのCOND_CTL_LENに定義した値の領域を確保します。shunsearch2で取

得したコンダクタ制御情報を設定します。

2. 削除要求数分のポインタ配列を確保します。

3. 手順1.で確保したコンダクタ制御情報のポインタをポインタ配列の各要素に設定します。

4. 手順2.で確保したポインタ配列のポインタをコンダクタ制御情報域に設定します。

- 565 -

(5)削除レコード識別子域

以下の手順で削除レコード識別子域を設定します。

1. 削除レコード識別子を格納する領域をlibshun.hのROW_ID_LENに定義した値で確保します。shunsearch2で取得した返信レコード識別子を設定します。

2. 削除要求数分のポインタ配列を確保します。

3. 手順1.で確保した削除レコード識別子のポインタをポインタ配列の各要素に設定します。

4. 手順2.で確保したポインタ配列のポインタを削除レコード識別子域に設定します。

注意

本関数を使用する場合は、conductorは必須です。

N.3 shunsearch1

機能

入力パラメタを基に検索を行い、ヒット件数のみを呼出し元に通知します。

記述形式

#include “libshun.h”

int shunsearch1(

char *host_Name, /* in (1)ホスト名 */

int Port_No, /* in (2)ポート番号 */

char *Query, /* in (3)検索式領域 */

char *Reserve, /* in (4)リザーブ(NULL) */

- 566 -

int *Hit_Cnt /* out (5)ヒット件数 */

);

復帰値

本関数が通知するエラーコードが返却されます。

正常終了の場合は、“0”です。

復帰値が“0”以外の場合、返却結果は保証されません。

エラーコードの詳細については、“N.7 出力されるエラーコード”を参照してください。

パラメタ

(1)ホスト名

ディレクタサーバのホスト名またはIPアドレスを指定します。

conductorを使用する場合は、conductorが稼働しているサーバのホスト名またはIPアドレスを指定します。

conductorを使用しない場合は、directorが稼働しているサーバのホスト名またはIPアドレスを指定します。

サイズは24バイト以内です。

(2)ポート番号

ディレクタサーバの要求受付ポート番号または検索受付ポート番号を指定します。

conductorを使用する場合は、conductor用動作環境ファイルのMySearchPortを指定します。

conductorを使用しない場合は、director用動作環境ファイルのMySearchPortを指定します。

(3)検索式領域

検索式の領域へのポインタを設定します。検索式には、director用動作環境ファイルのCharacterCodeに定義した文

字コードの文字列を設定してください。検索式は1~1048575バイトの範囲で指定してください。

検索式の詳細については、“B.3 検索式”を参照してください。

(4)リザーブ

NULLを指定します。

(5)ヒット件数

検索条件に一致した件数が返却されます。

ヒット件数の領域は0クリアして設定してください。

N.4 shunsearch2

機能

入力パラメタを基に検索を行い、検索結果を呼出し元に通知します。

- 567 -

記述形式

#include “libshun.h”

int shunsearch2(

char *host_Name, /* in (1)ホスト名 */

int Port_No, /* in (2)ポート番号 */

int Reply_No, /* in (3)返信開始番号 */

int Request_Cnt, /* in (4)返信要求件数 */

char *Query, /* in (5)検索式領域 */

char *Return, /* in (6)リターン式領域 */

char *Reserve1, /* in (7)リザーブ(NULL) */

char *Reserve2, /* in (8)リザーブ(NULL) */

int Secure_Size, /* in (9)返信データ格納領域サイズ */

int *Hit_Cnt, /* out (10)ヒット件数 */

int *Return_Cnt, /* out (11)応答返信件数 */

int *Stored_Size, /* out (12)返信データ格納済領域サイズ */

Sdsma *Dsma, /* out (13)返信データ格納管理配列 */

char *Data /* out (14)返信データ格納領域 */

/* (Len=Secure_Size) */

);

復帰値

本関数が通知するエラーコードが返却されます。

正常終了の場合は、“0”です。

復帰値が“0”以外の場合、返却結果は保証されません。

エラーコードの詳細については、“N.7 出力されるエラーコード”を参照してください。

パラメタ

(1)ホスト名

ディレクタサーバのホスト名またはIPアドレスを指定します。

conductorを使用する場合は、conductorが稼働しているサーバのホスト名またはIPアドレスを指定します。

conductorを使用しない場合は、directorが稼働しているサーバのホスト名またはIPアドレスを指定します。

サイズは24バイト以内です。

(2)ポート番号

ディレクタサーバの要求受付ポート番号または検索受付ポート番号を指定します。

conductorを使用する場合は、conductor用動作環境ファイルのMySearchPortを指定します。

conductorを使用しない場合は、director用動作環境ファイルのMySearchPortを指定します。

(3)返信開始番号

ヒットしたデータの何件目から返信されるかを指定します。1以上の値を指定します。

(4)返信要求件数

本関数の出力結果として返信されるデータの 大件数を指定します。

1以上の値を指定します。

- 568 -

クライアントの要求への応答 大件数を超えた値を指定した場合、クライアントの要求への応答 大件数までが返信

されます。クライアントの要求への応答 大件数は、conductorを使用する場合はconductor用動作環境ファイルの

AnsMaxを、conductorを使用しない場合はdirector用動作環境ファイルのAnsMaxを参照します。

(5)検索式領域

検索式の領域へのポインタを設定します。検索式には、director用動作環境ファイルのCharacterCodeに定義した文

字コードの文字列を設定してください。検索式は1~1048575バイトの範囲で指定してください。

検索式の詳細については、“B.3 検索式”を参照してください。

(6)リターン式領域

リターン式の領域へのポインタを設定します。リターン式の領域は本関数の呼出し元で用意する必要があります。リ

ターン式は0~1048575バイトの範囲で指定してください。

リターン式の詳細については、“B.4 リターン式”を参照してください。

(7)リザーブ

NULLを指定します。

(8)リザーブ

NULLを指定します。

(9)返信データ格納領域サイズ

返信データを格納する領域のサイズを指定します。

(10)ヒット件数

検索条件に一致した件数が返却されます。

ヒット件数の領域は0クリアして設定してください。

(11)応答返信件数

検索結果に対する応答返信件数が返却されます。応答返信件数分の返信データが返信データ格納領域に返却さ

れます。

応答返信件数の領域は0クリアして設定してください。

(12)返信データ格納済領域サイズ

検索結果に対する返信データを返却するために使用した領域のサイズが返却されます。

返信データ格納済領域サイズの領域は0クリアして設定してください。

返信データ格納領域のサイズが不足していた場合は、返信データを格納するために必要な領域サイズが返却されま

す。

(13)返信データ格納管理配列

検索の結果が返却される、返信データ格納管理配列へのポインタを設定します。返信データ格納管理配列は本関

数の呼出し元で用意する必要があります。

返信データ格納管理配列の詳細については、“【返信データ格納管理構造体】”を参照してください。

- 569 -

(14)返信データ格納領域

本関数を実行した結果が返却される、返信データ格納領域へのポインタを設定します。

返信データ格納領域の領域を0クリアして設定してください。

返信データ格納領域は(9)返信データ格納領域サイズで指定した領域を本関数の呼出し元で用意する必要がありま

す。

返信データ格納領域に格納された各返信データの情報を取得するには、返信データ格納管理配列に通知される各

返信データのポインタとサイズを参照してください。

【返信データ格納管理構造体】

本関数を実行した結果が返却される、返信データ格納管理配列の構造体です。この領域は、本関数の呼出し元が

返信要求件数分の配列の大きさであらかじめ用意する必要があります。

typedef struct /* データ格納管理域 */

{

char *Rec_Ctl; /* (1)コンダクタ制御情報域へのポインタ */

char *Rec_ID; /* (2)返信レコード識別子域へのポインタ */

char *Rec_Ptr; /* (3)返信データへのポインタ */

int Rtn_Len; /* (4)返信データのサイズ */

} Sdsma;

(1)コンダクタ制御情報域へのポインタ

返信データのコンダクタ制御情報域へのポインタを、あらかじめ設定してください。通知領域はあらかじめ確保し、

0クリアして設定してください。

通知領域はlibshun.hのCOND_CTL_LENに定義した長さの領域を確保してください。

注意

コンダクタ制御情報はバイナリデータです。str関数などの文字列関数は使用しないでください。

(2)返信レコード識別子へのポインタ

返信データのレコード識別子域へのポインタを、あらかじめ設定してください。通知領域はあらかじめ確保し、0クリアして設定してください。

通知領域はlibshun.hのROW_ID_LENに定義した長さの領域を確保してください。

注意

返信レコード識別子はバイナリデータです。str関数などの文字列関数は使用しないでください。

(3)返信データへのポインタ

本関数の呼出し後に、返信データ格納領域における返信データへのポインタが返却されます。

返信データへのポインタの領域を0クリアして設定してください。

(4)返信データのサイズ

本関数の呼出し後に、返信データのサイズが返却されます。

- 570 -

返信データのサイズの領域は0クリアして設定してください。

shunsearch2のパラメタの説明図を以下に示します。

図N.1 shunsearch2のパラメタの説明図

注意

・ 返信データ格納済領域のサイズが返信データ格納領域サイズに指定した値を超えた場合、以下の情報が設定され

ます。

- 返信データ格納済領域サイズには、データの格納に必要なサイズが返却されます。

- エラーコードは-30です。

- ヒット件数には、検索に該当したデータ(ヒット件数)が返却されます。

- 返信レコード識別子には、検索に該当したすべてのレコード識別子が返却されます。

・ リターン式にNULLを設定した場合、返信データは不要であると解釈し、レコード識別子のみが返却されます。

- リターン式に、空文字“\0”または“/”を指定した場合、レコードの全体が返却されます。

N.5 shunsearch3

機能

入力パラメタのレコード識別子に対応するデータを呼出し元に通知します。

- 571 -

記述形式

#include “libshun.h”

int shunsearch3(

char *host_Name, /* in (1)ホスト名 */

int Port_No, /* in (2)ポート番号 */

int Request_Cnt, /* in (3)返信要求件数 */

char **cond_ctl, /* in (4)コンダクタ制御情報域 */

char **rec_ID, /* in (5)返信レコード識別子域 */

char *Reserve, /* in (6)リザーブ(NULL) */

int Secure_Size, /* in (7)返信データ格納領域サイズ */

int *Hit_Cnt, /* out (8)ヒット件数 */

int *Return_Cnt, /* out (9)応答返信件数 */

int *Stored_Size, /* out(10)返信データ格納済領域サイズ */

Sdsma *Dsma, /* out(11)返信データ格納管理配列 */

char *Data /* out(12)返信データ格納領域 */

/* (Len=Secure_Size) */

);

復帰値

本関数が通知するエラーコードが返却されます。

正常終了の場合は、“0”です。

復帰値が“0”以外の場合は、返却結果は保証されません。

エラーコードの詳細については、“N.7 出力されるエラーコード”を参照してください。

パラメタ

(1)ホスト名

ディレクタサーバのホスト名またはIPアドレスを指定します。

conductorを使用する場合は、conductorが稼働しているサーバのホスト名またはIPアドレスを指定します。

conductorを使用しない場合は、directorが稼働しているサーバのホスト名またはIPアドレスを指定します。

サイズは24バイト以内です。

(2)ポート番号

ディレクタサーバの要求受付ポート番号または検索受付ポート番号を指定します。

conductorを使用する場合は、conductor用動作環境ファイルのMySearchPortを指定します。

conductorを使用しない場合は、director用動作環境ファイルのMySearchPortを指定します。

(3)返信要求件数

本関数の出力結果として返信されるデータの 大件数を指定します。

1以上の値を指定します。

(4)コンダクタ制御情報域

以下の手順でコンダクタ制御情報域を設定します。

1. コンダクタ制御情報としてlibshun.hのCOND_CTL_LENに定義した値の領域を確保します。shunsearch2で取

得したコンダクタ制御情報を設定します。

- 572 -

2. 検索要求数分のポインタ配列を確保します。

3. 手順1.で確保したコンダクタ制御情報のポインタをポインタ配列の各要素に設定します。

4. 手順2.で確保したポインタ配列のポインタをコンダクタ制御情報域に設定します。

(5)返信レコード識別子域

以下の手順で返信レコード識別子域を設定します。

1. 返信レコード識別子を格納する領域をlibshun.hのROW_ID_LENに定義した値で確保します。shunsearch2で取得した返信レコード識別子を設定します。

2. 検索要求数分のポインタ配列を確保します。

3. 手順1.で確保した返信レコード識別子のポインタをポインタ配列の各要素に設定します。

4. 手順2.で確保したポインタ配列のポインタを返信レコード識別子域に設定します。

(6)リザーブ

NULLを指定します。

(7)返信データ格納領域サイズ

返信データを格納する領域のサイズを指定します。

(8)ヒット件数

検索条件に一致した件数が返却されます。

ヒット件数の領域は0クリアして設定してください。

- 573 -

(9)応答返信件数

検索結果に対する応答返信件数が返却されます。応答返信件数分の返信データが返信データ格納領域に返却さ

れます。

応答返信件数の領域は0クリアして設定してください。

(10)返信データ格納済領域サイズ

検索結果に対する返信データを返却するために使用した領域のサイズが返却されます。

返信データ格納済領域サイズの領域は0クリアして設定してください。

返信データ格納領域のサイズが不足していた場合は、返信データを格納するために必要な領域サイズが返却されま

す。

(11)返信データ格納管理配列

検索の結果が返却される、返信データ格納領域へのポインタを設定します。

返信データ格納管理配列は、本関数の呼出し元で用意する必要があります。

返信データ格納管理配列の詳細については、“【返信データ格納管理構造体】”を参照してください。

(12)返信データ格納領域

本関数を実行した結果が返却される、返信データ格納領域へのポインタを設定します。

返信データ格納領域の領域を0クリアして設定してください。

返信データ管理領域は(7)返信データ格納領域サイズで指定した領域を本関数の呼出し元で用意する必要がありま

す。

返信データ格納領域に格納された各返信データの情報を取得するには、返信データ格納管理配列に通知される各

返信データのポインタとサイズを参照してください。

【返信データ格納管理構造体】

本関数を実行した結果が返却される、返信データ格納管理配列の構造体です。この領域は、本関数の呼出し元が

返信要求件数分の配列の大きさであらかじめ用意する必要があります。

typedef struct /* データ格納管理域 */

{

char *Rec_Ctl; /* (1)コンダクタ制御情報域へのポインタ */

char *Rec_ID; /* (2)返信レコード識別子域へのポインタ */

char *Rec_Ptr; /* (3)返信データへのポインタ */

int Rtn_Len; /* (4)返信データのサイズ */

} Sdsma;

(1)コンダクタ制御情報域へのポインタ

返信データのコンダクタ制御情報域へのポインタを、あらかじめ設定してください。通知領域はあらかじめ確保し、

0クリアして設定してください。

通知領域はlibshun.hのCOND_CTL_LENに定義した長さの領域を確保してください。

- 574 -

注意

コンダクタ制御情報はバイナリデータです。str関数などの文字列関数は使用しないでください。

(2)返信レコード識別子へのポインタ

返信データのレコード識別子域へのポインタを、あらかじめ設定してください。通知領域はあらかじめ確保し、0クリアして設定してください。

通知領域はlibshun.hのROW_ID_LENに定義した長さの領域を確保してください。

注意

返信レコード識別子はバイナリデータです。str関数などの文字列関数は使用しないでください。

(3)返信データへのポインタ

本関数の呼出し後に、返信データ格納領域における返信データへのポインタが返却されます。

返信データへのポインタの領域を0クリアして設定してください。

(4)返信データのサイズ

本関数の呼出し後に、返信データのサイズが返却されます。

返信データのサイズの領域は0クリアして設定してください。

shunsearch3のパラメタの説明図を以下に示します。

- 575 -

図N.2 shunsearch3のパラメタの説明図

注意

・ 返信データ格納済領域のサイズが返信データ格納領域サイズに指定した値を超えた場合、以下の情報が設定され

ます。

- 返信データ格納済領域サイズには、データの格納に必要なサイズが返却されます。

- エラーコードは-30です。

- ヒット件数には、検索に該当したデータ(ヒット件数)が返却されます。

- 返信レコード識別子には、検索に該当したすべてのレコード識別子が返却されます。

・ 応答返信件数には、返信要求件数が返却されます。この応答返信件数よりヒット件数が少ない場合、レコード識別

子に存在していないレコード識別子が指定されています。この場合、存在していないレコード識別子の返信データ

格納管理配列の返信データへのポインタには、NULLが返却されます。また返信データのサイズには0が返却されま

す。

N.6 shunsort

機能

入力パラメタを基に検索を行い、検索結果をソートまたは集計して呼出し元に通知します。

- 576 -

記述形式

#include “libshun.h”

int shunsort(

char *host_Name, /* in (1)ホスト名 */

int Port_No, /* in (2)ポート番号 */

int Reply_No, /* in (3)返信開始番号 */

int Request_Cnt, /* in (4)返信要求件数 */

char *Query, /* in (5)検索式領域 */

char *Return, /* in (6)リターン式領域 */

char *Sort, /* in (7)ソート式領域 */

int Secure_Size, /* in (8)返信データ格納領域サイズ */

int *Hit_Cnt, /* out (9)ヒット件数 */

int *Return_Cnt, /* out (10)応答返信件数 */

int *Available_Cnt, /* out (11)返信可能件数 */

int *Stored_Size, /* out (12)返信データ格納済領域サイズ */

Sdsma *Dsma, /* out (13)返信データ格納管理配列 */

char *Data /* out (14)返信データ格納領域 */

/* (Len=Secure_Size) */

);

復帰値

本関数が通知するエラーコードが返却されます。

正常終了の場合は、“0”です。

復帰値が“0”以外の場合、返却結果は保証されません。

エラーコードの詳細については、“N.7 出力されるエラーコード”を参照してください。

パラメタ

(1)ホスト名

conductorが稼働しているサーバのホスト名またはIPアドレスを指定します。

サイズは24バイト以内です。

(2)ポート番号

conductor用動作環境ファイルのMySearchPortを指定します。

(3)返信開始番号

ヒットしたデータの何件目から返信されるかを指定します。1以上の値を指定します。

(4)返信要求件数

本関数の出力結果として返信されるデータの 大件数を指定します。

クライアントの要求への応答 大件数(conductor用動作環境ファイルのAnsMax)を超えた値を指定した場合、クライ

アントの要求への応答 大件数までが返信されます。

(5)検索式領域

検索式の領域へのポインタを設定します。検索式には、conductor用動作環境ファイルのCharacterCodeに定義した

文字コードの文字列を設定してください。検索式は1~1048575バイトの範囲で指定してください。

検索式の詳細については、“B.3 検索式”を参照してください。

- 577 -

(6)リターン式領域

リターン式の領域へのポインタを設定します。リターン式の領域は本関数の呼出し元で用意する必要があります。リ

ターン式は0~1048575バイトの範囲で指定してください。

リターン式に集合関数指定を含む場合、集計結果を返します。

リターン式の詳細については、“B.4 リターン式”を参照してください。

(7)ソート式領域

ソート式の領域へのポインタを設定します。ソート式の領域は本関数の呼出し元で用意する必要があります。ソート式は

1~65535バイトの範囲で指定してください。

ソート式の詳細については、“B.5 ソート式”を参照してください。

(8)返信データ格納領域サイズ

返信データを格納する領域のサイズを指定します。

(9)ヒット件数

検索条件に一致した件数が返却されます。

ヒット件数の領域は0クリアして設定してください。

(10)応答返信件数

検索結果に対する応答返信件数が返却されます。応答返信件数分の返信データが返信データ格納領域に返却さ

れます。

応答返信件数の領域は0クリアして設定してください。

(11)返信可能件数

ソート依頼した場合は、ソート結果として返信可能な件数が返却されます。 大1000件まで返信することができます。

ソートキーの合計長が大きい場合、返信可能な件数は少なくなります。ソートキーの長さと返信可能件数の目安につ

いては、 “付録C 定量値”を参照してください。

集計依頼した場合は、集計結果として返信可能なグループ数が返却されます。 大1000グループまで返信すること

ができます。グループキーの合計長が大きい場合、返信可能なグループ数は少なくなります。グループキーの長さと

返信可能件数の目安については、“付録C 定量値”を参照してください。

返信可能件数の領域は0クリアして設定してください。

(12)返信データ格納済領域サイズ

検索結果に対する返信データを返却するために使用した領域のサイズが返却されます。

返信データ格納済領域サイズの領域は0クリアして設定してください。

返信データ格納領域のサイズが不足していた場合は、返信データを格納するために必要な領域サイズが返却されま

す。

(13)返信データ格納管理配列

検索の結果が返却される、返信データ格納管理配列へのポインタを設定します。返信データ格納管理配列は本関

数の呼出し元で用意する必要があります。

返信データ格納管理配列の詳細については、“【返信データ格納管理構造体】”を参照してください。

- 578 -

(14)返信データ格納領域

本関数を実行した結果が返却される、返信データ格納領域へのポインタを設定します。

返信データ格納領域の領域を0クリアして設定してください。

返信データ格納領域は(8)返信データ格納領域サイズで指定した領域を本関数の呼出し元で用意する必要がありま

す。

返信データ格納領域に格納された各返信データの情報を取得するには、返信データ格納管理配列に通知される各

返信データのポインタとサイズを参照してください。

【返信データ格納管理構造体】

本関数を実行した結果が返却される、返信データ格納管理配列の構造体です。この領域は、本関数の呼出し元が

返信要求件数分の配列の大きさであらかじめ用意する必要があります。

typedef struct /* データ格納管理域 */

{

char *Rec_Ctl; /* (1)コンダクタ制御情報域へのポインタ */

char *Rec_ID; /* (2)返信レコード識別子域へのポインタ */

char *Rec_Ptr; /* (3)返信データへのポインタ */

int Rtn_Len; /* (4)返信データのサイズ */

} Sdsma;

(1)コンダクタ制御情報域へのポインタ

返信データのコンダクタ制御情報域へのポインタを、あらかじめ設定してください。通知領域はあらかじめ確保し、

0クリアして設定してください。

通知領域はlibshun.hのCOND_CTL_LENに定義した長さの領域を確保してください。

注意

コンダクタ制御情報はバイナリデータです。str関数などの文字列関数は使用しないでください。

集計依頼で返されたコンダクタ制御情報およびレコード識別子を指定して、shunsearch3 を実行できません。実行

すると、該当レコードなしとして処理されます。

(2)返信レコード識別子へのポインタ

返信データのレコード識別子域へのポインタを、あらかじめ設定してください。通知領域はあらかじめ確保し、0クリアして設定してください。

通知領域はlibshun.hのROW_ID_LENに定義した長さの領域を確保してください。

注意

返信レコード識別子はバイナリデータです。str関数などの文字列関数は使用しないでください。

集計依頼で返されたコンダクタ制御情報およびレコード識別子を指定して、shunsearch3 を実行できません。実行

すると、該当レコードなしとして処理されます。

(3)返信データへのポインタ

本関数の呼出し後に、返信データ格納領域における返信データへのポインタが返却されます。

返信データへのポインタの領域を0クリアして設定してください。

- 579 -

(4)返信データのサイズ

本関数の呼出し後に、返信データのサイズが返却されます。

返信データのサイズの領域は0クリアして設定してください。

shunsortのパラメタの説明図を以下に示します。

図N.3 shunsortのパラメタの説明図

注意

・ 返信データ格納済領域のサイズが返信データ格納領域サイズに指定した値を超えた場合、以下の情報が設定され

ます。

- 返信データ格納済領域サイズには、データの格納に必要なサイズが返却されます。

- エラーコードは-30です。

- ヒット件数には、検索に該当したデータ(ヒット件数)が返却されます。

- ソート依頼では、コンダクタ制御情報域および返信レコード識別子には、検索に該当したすべてのレコード識別

子が返却されます。

- 集計依頼では、コンダクタ制御情報域および返信レコード識別子は、呼出し状態のままです。

・ ソート依頼で、リターン式にNULLを設定した場合、返信データは不要であると解釈し、コンダクタ制御情報およびレ

コード識別子のみが返却されます。

・ ソート依頼で、リターン式に空文字“\0”または“/”を指定した場合、レコードの全体が返却されます。

- 580 -

・ 集計依頼では、リターン式領域およびソート式領域は必須です。

・ 本関数を使用する場合は、conductorは必須です。

N.7 出力されるエラーコード

C API使用時に出力されるエラーコードについて以下に説明します。

エラー

コード

意味 利用者の処置

-1 ホストに接続できません。 接続先のホスト名またはIPアドレスと、ポート番

号を確認してください。接続先のホスト名または

IPアドレスと、ポート番号が正しいときには、し

ばらく待ったあとに再実行してください。

-10 サービスが受付可能状態では

ありません。

しばらく待ってから再実行してください。

更新、ソートまたは集計をする場合、接続先が

conductorであることを確認してください。

再実行時にエラーが発生する場合には、イベ

ントログよりエラー原因を確認し、エラーを取り

除いたあとに再実行してください。

再実行時にエラーが発生する場合には、シス

テムログ(syslog)よりエラー原因を確認し、エラー

を取り除いたあとに再実行してください。

-11 同時受付 大件数を超えて

います。

しばらく待ってから再実行してください。

-12 応答待ちでタイムアウトが発生

しました。

しばらく待ってから再実行してください。

-13 更新、ソートまたは集計の同

時実行 大件数を超えていま

す。

しばらく待ってから再実行してください。

-20 引渡しパラメタの指定に誤りが

あります。

正しいパラメタをセットし、再実行してください。

-21 検索式構文エラーが発生しま

した。

入力パラメタの検索式を確認し、再実行してく

ださい。

-22 リターン式構文エラーが発生

しました。

入力パラメタのリターン式を確認し、再実行して

ください。

-23 検索式サイズエラーが発生し

ました。

入力パラメタの検索式の長さを確認し、再実行

してください。(検索式のサイズ : 1~1048575バイト)

-24 リターン式サイズエラーが発生

しました。

入力パラメタのリターン式の長さを確認し、再実

行してください。(リターン式のサイズ : 0~1048575バイト)

-25 ソート式構文エラーが発生し

ました。

入力パラメタのソート式を確認し、再実行してく

ださい。

- 581 -

エラー

コード

意味 利用者の処置

-26 ソート式サイズエラーが発生し

ました。

入力パラメタのソート式の長さを確認し、再実

行してください。(ソート式のサイズ : 1~65535バイト)

-27 ソート式とリターン式で指定し

た内容の整合性がありません。

入力パラメタのソート式とリターン式を確認し、

再実行してください。

-30 返信データ格納領域が足りま

せんでした。(注)返信データ格納領域サイズを増やし、再度検

索を行ってください。

-201 Shunsakuの動作環境が正しく

ありません。

Shunsakuの再インストールを行ってください。

-204 追加処理に失敗しました。 XML文書の内容を確認し、再実行してくださ

い。

ディレクタサーバの状態を確認し、再実行して

ください。

-207 削除処理に失敗しました。 コンダクタ制御情報およびレコード識別子の内

容を確認し、再実行してください。

ディレクタサーバの状態を確認し、再実行して

ください。

-208 追加処理または削除処理を実

行するプロセスの起動に失敗

しました。

ディレクタサーバの状態を確認し、再実行して

ください。

-209 追加処理または削除処理が

中断されました。

ディレクタサーバの状態を確認し、再実行して

ください。

-210 作業用ファイルのオープンに

失敗しました。

director用動作環境ファイルのWorkFolderに指

定した内容を確認し、再実行してください。

-211 作業用ファイルへの書込みに

失敗しました。

director用動作環境ファイルのWorkFolderに指

定したディスクの状態を確認し、再実行してく

ださい。

注)-30のエラーが発生した場合、返信データは格納しません。

- 582 -

付録O V9.0.1以前のC API本章では、V7.0からV9.0.1以前のShunsakuのC APIについて説明します。

V9.0.1以前のShunsaku用アプリケーション(32ビット用)をそのまま利用するための、互換機能です。

O.1 ShunGetConnectAttr関数引数の属性に指定できる値が、V9.0.2で一部変更になりました。

以下に、V9.0.1以前の仕様を示します。

機能

コネクションハンドルの属性を取得します。

本関数によって、コネクションハンドルの状態を知ることができます。

記述形式

#include "libshun.h"

int ShunGetConnectAttr( SHUNHCON ConH,

int Attr,

int *Value );

パラメタの説明

データ型 パラメタ 用途 説明

SHUNHCON

ConH 入力 属性を取り出すコネクションハンドルを

指定します。

int Attr 入力 取得したい属性を指定します。

以下のいずれかの属性を指定します。

・ SHUN_ATTR_CONNECTION_DEAD

・ SHUN_ATTR_AUTOCOMMIT

・ SHUN_ATTR_SHUNSAKU_FILE

int* Value 出力 属性値を格納する領域を指定します。

本関数によって、取得可能な属性の値を以下に示します。

SHUN_ATTR_CONNECTION_DEAD

コネクションの状態が取得できます。

- SHUN_TRUE :未接続状態

- SHUN_FALSE :接続状態

SHUN_ATTR_AUTOCOMMIT

コネクションハンドルに設定されているコミットモードが取得できます。

詳細は“C_APIリファレンス”の“ShunSetConnectAttr”を参照してください。

- 583 -

SHUN_ATTR_SHUNSAKU_FILE

接続先のShunsaku File名が取得できます。

Shunsaku File機能を利用していない場合は、以下の定数を返却します。

- SHUN_NOT_USED_SHUNSAKU_FILE

Shunsaku File名が格納されている、アドレスを返却するための領域を指定します。

この場合、属性値は文字列となります。第3パラメタのデータ型はchar**をint*にキャストして指定してください。

この属性を指定した場合に返却された領域はShunsakuのC APIにより管理されています。利用者は内容を変更しな

いでください。

復帰値

復帰値 説明

SHUN_SUCCESS

関数が正常に終了したことを示します。

SHUN_ERROR

関数の実行時に問題が検出されたことを示します。

注意

ShunsakuのC APIを使用しているアプリケーションが64ビットの場合、“SHUN_ATTR_SHUNSAKU_FILE”は使用できま

せん。

O.2 ShunSetConnectAttr関数引数の属性に指定できる値が、V9.0.2で一部変更になりました。

以下に、V9.0.1以前の仕様を示します。

機能

コネクションハンドルに、属性を設定します。

本関数によって設定された属性は、再度本関数によって設定されるか、ShunFreeHandle関数によって属性を設定したコ

ネクションハンドルが解放されるまで有効です。

記述形式

#include "libshun.h"

int ShunSetConnectAttr( SHUNHCON ConH,

int Attr,

int Value );

- 584 -

パラメタの説明

データ型 パラメタ 用途 説明

SHUNHCON

ConH 入力 属性を設定するコネクションハンドルを

指定します。

int Attr 入力 以下の属性を指定します。

・ SHUN_ATTR_AUTOCOMMIT

・ SHUN_ATTR_SHUNSAKU_FILE

int Value 入力 属性に設定する値を指定します。

属性が

SHUN_ATTR_AUTOCOMMITの場

・ SHUN_TRUE

・ SHUN_FALSE

属性が

SHUN_ATTR_SHUNSAKU_FILEの場合

・ Shunsaku File名

設定可能な属性の詳細を以下に示します。

SHUN_ATTR_AUTOCOMMIT

指定されたコネクションハンドルを用いて実行されるコミットモード属性です。自動コミットの有効、無効を切り替えるこ

とができます。

コネクションの確立直後は、自動コミットが有効に設定されています。

- SHUN_TRUE :自動コミットを有効に設定

- SHUN_FALSE :自動コミットを無効に設定

トランザクション実行中にコミットモード属性が変更されると、トランザクションはその時点でコミットされます。

SHUN_ATTR_SHUNSAKU_FILE

指定されたコネクションハンドルの、接続先のShunsaku Fileを切り替えることができます。

Default Fileに切り替えたい場合は、SHUN_DEFAULT_SHUNSAKU_FILEを指定します。

API用動作環境ファイルに指定したShunsaku Fileに切り替えたい場合は、NULLを指定します。

この場合、属性値は文字列となります。第3パラメタのデータ型はchar*をintにキャストして指定してください。

復帰値

復帰値 説明

SHUN_SUCCESS

関数が正常に終了したことを示します。

SHUN_ERROR

関数の実行時に問題が検出されたことを示します。

- 585 -

関数の利用規則

自動コミットを無効にした状態で、ShunCommitを実行する前に通信エラーなどでアプリケーションが異常終了したり、コ

ネクションが切断されたりした場合、それまでに行った処理は無効になります。

アプリケーションの用途に合わせて、トランザクションのコミットモードを設定してください。

注意

ShunsakuのC APIを使用しているアプリケーションが64ビットの場合、“SHUN_ATTR_SHUNSAKU_FILE”は使用できま

せん。

- 586 -

索 引[数字]

32ビットから64ビットへの移行時の注意................................11164ビット用のアプリケーションの作成.........................................5

[記号]*.........................................................................................16,268.NET API...............................................................................6,10.NET APIで使用する文字コード...........................................208.NET APIでトランザクションを使う...........................................60.NET APIでの指定方法...................................................98,102NET APIのアプリケーション開発..........................................170.NET APIの記述例................................................................106.NET APIのクラスの一覧.......................................................170.NET APIの使用方法............................................................175.NET APIの場合............................................................78,83,88.NET APIのメソッド情報.........................................................118.NET APIを使用した場合のローカルメモリ量の見積り........321.NETの概要............................................................................170/..........................................................................................33,268//.........................................................................................16,268

[A]AND........................................................................................275API一覧..................................................................................246APIがインストールされているマシン単位に指定する...............9APIスナップ............................................................................263APIスナップが出力する情報.................................................114APIスナップ機能........................................................................9APIスナップの環境設定........................................................115APIスナップを利用したデバッグ...........................................113APIでのアプリケーション開発...............................................126APIによるデータ更新における注意......................................110APIの構成...........................................................................6,243APIの使用例.....250,332,334,337,340,343,348,350,353,356,371,372,374,376,377,379,381,382,384,386,396,397,399,401,402,406,407,409,411,421,422,424,426,428,432,433,435,437,448,451,454,459,463,470,473,477,481APIパッケージ(shunapi.jar).......................................................6API用動作環境ファイル.......................................9,131,175,213API用動作環境ファイルに指定する方法...............................99API用動作環境ファイルの実行パラメタ................................262API用動作環境ファイルの実行パラメタの意味....................263API用動作環境ファイルの実行パラメタの記述例................265API用動作環境ファイルの実行パラメタの種類....................262API用動作環境ファイルの設定によりコネクションを確立する方法

..................................................................................131,175,213attributeRule...........................................................................531avg関数..................................................................................303

[C]C# .NET サンプルプログラム.................................................369C++ .NET サンプルプログラム..............................................419C API.....................................................................................6,11C APIで使用する文字コード.................................................236C APIでトランザクションを使う.................................................64

C APIでの指定方法.................................................................99C APIのアプリケーション開発................................................209C APIの概要..........................................................................209C APIの関数情報..................................................................122C APIの記述例......................................................................107C APIでの指定方法...............................................................103C APIの使用方法..................................................................213C APIのディレクトリ構成............................................................7C APIの場合..................................................................79,85,90C APIを使用した場合のローカルメモリ量の見積り..............322CLASSPATH.............................................................................8columnRule.............................................................................527count関数...............................................................................303create.......................................................................................548createDocumentFountain........................................................510CSVException........................................................................513CSVExceptionクラス...............................................................513CSVSource.............................................................................502CSVSourceクラス....................................................................502CSVファイルからXML文書に変換する場合の処理手順.....248CSVファイルからXML文書への変換...................................239C関数ライブラリ..........................................................................7C サンプルプログラム.............................................................446

[D]DESC......................................................................................308DocumentFountainインタフェース..........................................499documentRule.........................................................................533DOMツリーの場合.................................................................255DTD宣言に属性のデフォルト値を設定した場合.................327

[E]executeAdd.............................................................................557executeDelete..........................................................................557executeSearch1.......................................................................549executeSearch2.......................................................................550executeSearch3.......................................................................551extensionRule.........................................................................534

[G]GeneratorMap.........................................................................509GeneratorMapクラス................................................................509getCode...................................................................................511getException...........................................................................512getHitCount............................................................................552getMessage.............................................................................512getRecData..............................................................................554getRecNo................................................................................553getResultSet............................................................................507getRetNum..............................................................................553getXMLDocument..................................................................499

[H]hasXMLDocument.................................................................500Host.........................................................................................263

- 587 -

[I]InsertPoint.................................................................................47IPアドレス................................................................................263

[J]jar形式........................................................................................6Java API.................................................................................6,10Java APIで使用する文字コード.............................................168Java APIでトランザクションを使う.............................................56Java APIでの指定方法.....................................................97,101Java APIのアプリケーション開発...........................................127Java APIの概要......................................................................127Java APIの記述例..................................................................104Java APIのクラスの一覧.........................................................127Java APIの使用方法..............................................................131Java APIの場合..............................................................76,82,87Java APIのファイル構成............................................................6Java APIのメソッド情報..........................................................115Java APIを使用した場合のローカルメモリ量の見積り..........320Javaクラス....................................................................................6Java サンプルプログラム........................................................330JavaのPropertiesの設定によりコネクションを確立する方法.....132

[L]LD_LIBRARY_PATH...............................................................8libshun.h.....................................................................................7LogFile....................................................................................264LogFileBackup.......................................................................265LogFileSize.............................................................................265

[M]MappingRule..........................................................................525max関数.................................................................................303Microsoft(R) Visual Studio(R) .NETで開発するメリット........172Microsoft(R) Visual Studio(R) .NETを利用したアプリケーション

開発方法................................................................................172Microsoft(R) Visual Studio(R) .NETを利用した開発...........173min関数..................................................................................303

[O]OR...........................................................................................275

[P]parentRule...............................................................................526PfmLog...................................................................................265Port..........................................................................................263Properties................................................................................132

[R]rlen関数..................................................................................273

[S]SAXの場合............................................................................256SeparateChar...........................................................................280setDelimiter............................................................................503setDestination.........................................................................500setEnableEscapeChar..............................................................508setEncoding.....................................................................501,502

setFirstRecordToColumn........................................................506setNullCharacter.....................................................................505setQuote..................................................................................504setRandomMode.....................................................................506shunadd...................................................................................563SHUN_ATTR_AUTOCOMMIT....................................583,585SHUN_ATTR_CONNECTION_DEAD................................583SHUN_ATTR_SHUNSAKU_FILE................................584,585ShunBatch...............................................................................555ShunBatchクラス.....................................................................555shundeletebyrecid...................................................................564ShunGetConnectAttr..............................................................583Shunsaku File........................................................................3,97ShunsakuFile..........................................................................263Shunsaku Fileが指定されていないアプリケーションのアクセス範

囲の設定................................................................................100Shunsaku Fileの概要................................................................97Shunsaku Fileの使用上の注意..............................................109Shunsaku Fileへのアクセス方法..............................................97Shunsaku Fileを切り替える方法.............................................101Shunsaku Fileを作成する場合の注意...................................109Shunsakuアクセスクラスの作成..............................................129Shunsakuと連携するWebアプリケーションの開発の流れ.....174Shunsakuと連携するWebアプリケーションの構成.................173Shunsakuのアプリケーション機能..............................................2Shunsakuのアプリケーションでできること..................................4shunsearch1............................................................................566shunsearch2............................................................................567shunsearch3............................................................................571ShunSearchクラス....................................................................548ShunSetConnectAttr...............................................................584shunsort...................................................................................576SHUN_API_CONFIG.........................................................10,11SkipChar.................................................................................280SnapLevel...............................................................................263Streamの場合.........................................................................253Stringの場合...........................................................................253StudioまたはApworksで開発するメリット...............................128StudioまたはApworksを利用したアプリケーション開発方法.....128StudioまたはApworksを利用した開発の流れ......................128sum関数..................................................................................303

[T]text()........................................................................................270

[V]V6.0L20以前のJava API.......................................................547V6.0L30以前のC API............................................................563V9.0.1以前のC API...............................................................583val関数...................................................................................273VB .NET サンプルプログラム................................................394

[W]WaitTimer...............................................................................263

- 588 -

[X]XMLConverterExceptionクラス..............................................511XMLGenerator.......................................................................509XMLGeneratorクラス..............................................................509XMLGeneratorの生成からXML文書の取得........................253XMLGenException................................................................515XMLGenExceptionクラス.......................................................515XML形式で取り出す...............................................................33XML形式に関する留意事項................................................327XML形式の返却指定...........................................................295XMLプロセッサが出力するエラーメッセージの一覧...........523XML文書構造の決定...........................................................240XML文書全体を取り出す.......................................................33XML文書についての留意事項............................................324XML文書の出力形式を決定................................................242XML文書の書式...................................................................324XML変換機能.......................................................................238XML変換機能と結果表のデータ型の対応..........................257XML変換機能のAPI.............................................................497XML変換機能のAPI使用時に出力されるエラーコード......517XML変換機能のAPIのセットアップ......................................242XML変換機能の概要...........................................................238XML変換機能のサンプルプログラム....................................257XML変換機能の設計...........................................................239XML変換機能の対応するCSV形式.....................................259XML変換機能の対応するデータ型.....................................257XML変換機能のマッピングルール.......................................524XML変換機能を用いたアプリケーションの処理手順..........246

[あ]アプリケーション開発の基本......................................................1アプリケーションとコマンドの競合関係......................................5アプリケーションの移行............................................................12アプリケーションの設計.......................................................5,244アプリケーションのデバッグ..............................113,168,207,236アプリケーションのデバッグ情報を利用したデバッグ...........113アプリケーションのデバッグ方法...........................................113一致........................................................................................278インクルードファイル..................................................................7インクルードファイル名..............................................................7エスケープ文字...................................................18,277,278,290エラー発生時の対処.................................60,64,68,166,205,233エラー発生時の対処例...................................................167,234応答........................................................................................263応答返信件数..........................................................569,574,578

[か]概要............................................................................................2各クラスのオブジェクトの作成・解放契機の一覧..................127拡張的なアプリケーション..........................356,385,411,437,481カラム要素..............................................................................241環境設定....................................................................................6環境変数の設定.................................................................8,243環境変数の設定(C API)............................................................8環境変数の設定(Java API).......................................................8完全一致.........................................................................278,286完全一致検索..........................................................................23起動開始からResultSetの取得まで(CSVファイル)...............252

起動開始からResultSetの取得まで(データベースのレコード)....251起動するアプリケーション単位に指定する.............................10共通関数................................................................................213共通の書式............................................................................267キーワード...............................................................................277キーワードと完全に一致する文書を検索する........................23キーワードと大小比較を行う....................................................23キーワードと比較演算子........................................................277キーワードの指定形式と検索方法..........................................17キーワードを含む文書を検索する...........................................15グループ化...............................................................................38グループキー......................................................................13,38グループキーの合計長と返信可能件数の関係...................317グループキーの長さとShunsakuが返信できるグループ数.....318結果表....................................................................................238結果表とデータベースのデータ型の対応............................258検索結果をグループ化する....................................................38検索結果を集計する................................................................42検索結果をソートする..............................................................27検索結果を取り出す................................................................33検索式...............................................................................13,274検索式およびリターン式の定量値........................................315検索式、リターン式およびソート式の書式............................267検索条件.....332,334,337,340,343,350,353,371,372,374,376,377,382,384,396,397,399,401,402,407,409,421,422,424,426,428,433,435,448,451,454,459,463検索条件に一致するXML文書の値を集計して取得する.....342,377,402,428,462検索条件に一致するXML文書の件数を求める.....332,396,421,448検索条件に一致するXML文書を指定した形式で取得する.....334,372,397,422,451検索条件に一致するXML文書をソートして取得する.....340,376,401,426,459検索対象外............................................................................279検索メソッドの作成.................................................................129件数........................................................................................303件数に応じて検索した結果を取得する..................136,178,216合計........................................................................................303降順........................................................................................308更新されたデータの見え方.....................................................55後方一致指定........................................................................282後方一致指定検索..................................................................18互換形式................................................................................290互換形式のクエリを使用する.................................................290固定値を抽出するパターン...................................................539コネクション単位に指定する方法............................................97コネクションの確立...................................................131,175,213コネクションの状態.................................................................583コネクションの切断...................................................165,204,233コネクションハンドル........................................................209,212コミット.......................................................................................53コミットモード....................................................................583,585コンダクタ制御情報................................................................563

- 589 -

コンダクタ制御情報域.....................................................565,572

[さ]小........................................................................................303大........................................................................................303大応答待ち時間..............................................................9,263

削除するデータの検索条件..................................................473削除要求件数........................................................................565削除レコード識別子域...........................................................566資源の見積り..........................................................................320実行........................................................................................131実行結果.....334,337,340,342,345,348,350,353,356,372,373,375,377,379,380,382,384,385,387,397,399,400,402,404,405,407,409,410,422,424,426,428,429,431,433,435,437,451,454,458,462,466,470,473,477,480実行パラメタの記述形式........................................................262実行パラメタの優先度..............................................................11実体参照................................................................................277自動コミットと手動コミット..........................................................54自動コミットを無効..................................................................585自動コミットを有効..................................................................585集計依頼における定量値......................................................317集計した結果を取り出す.........................................................38集計を行う場合......................................................................309集計を行う場合の記述例......................................................313集計を行う場合の書式..........................................................300集計を行う場合のリターン式指定例.....................................303集計を行わない場合の書式..................................................293集計を行わない場合のリターン式指定例.............................295集合関数指定........................................................................302集約によるタグ階層ありの抽出パターン...............................544出力されるエラーコード..................................................559,581条件式....................................................................................275条件に一致するXML文書の件数を取得する........133,177,215条件に一致するXML文書を連続して取得する.....152,190,224条件に一致するデータの内容を集計する..............156,194,227条件を追加しながら検索した結果を取得する........140,181,217昇順........................................................................................308数字........................................................................................288数値.................................................................................278,288数値でグループ化する............................................................40数値で検索する.......................................................................24数値でソートする......................................................................30数値範囲指定........................................................................285数値範囲指定検索..................................................................20数値比較................................................................................288接続先のShunsaku File名..........................................................9接続状態................................................................................583セットアップ.................................................................................8前方一致指定........................................................................282前方一致指定検索..................................................................18属性式........................................................271,276,294,301,308属性名....................................................................................271属性を設定.............................................................................584その他のアプリケーション開発..............................................237ソース生成・編集....................................................................129

ソート依頼における定量値....................................................315ソートキーの合計長とShunsakuが返信できる件数...............316ソートキーの合計長と返信可能件数の関係.........................315ソート式..............................................................................13,306ソート式の作成.......................................................................129ソート式の指定例...................................................................310ソート式の書式.......................................................................306ソートを行う場合.....................................................................308ソートを行う場合の記述例.....................................................311

[た]大小比較.........................................................................278,287大小比較検索..........................................................................23タイムアウト.............................................................................263ダイレクトアクセス.......................................................................3ダイレクトアクセス機能.............................................................69ダイレクトアクセス機能の概要.................................................69ダイレクトアクセス機能を使用したアプリケーション開発........91ダイレクトアクセスキー環境の構築..........................................70ダイレクトアクセスキー定義ファイルの確認............................74ダイレクトアクセスキー定義ファイルの作成............................71ダイレクトアクセスキー定義ファイルの設定............................72ダイレクトアクセスキーでデータを検索する............................75ダイレクトアクセスキーでデータを更新する............................86ダイレクトアクセスキーでデータを削除する............................81ダイレクトアクセスキーの形式..................................................74ダイレクトアクセスキーを使用してデータを検索する.....361,388,413,439,486ダイレクトアクセスキーを使用してデータを更新する.....366,391,416,443,493ダイレクトアクセスキーを使用してデータを削除する.....363,389,415,441,490ダイレクトアクセスにおける注意.............................................110ダイレクトアクセスにおける定量値.........................................318ダイレクト検索を使用したデータ削除/更新の使い方.............91ダイレクト削除またはダイレクト更新の使い方.........................95タグ階層ありの抽出パターン.................................................538タグ階層なしの抽出パターン................................................537単一行関数指定...............................................272,295,302,307単語の区切り文字..................................................................280追加するデータ.................................................348,381,406,432追加データ情報配列域.........................................................564追加データ情報配列数.........................................................564提供するAPI種別.......................................................................4定量値....................................................................................315テキスト形式でデータを取り出す............................................36テキスト形式の返却指定........................................................298テキスト式...................................................269,276,294,301,307テキストファイルのXML文書.................................................325デバッガを利用したデバッグ.................................................113デバッグ..................................................................................131データBeanの作成.................................................................130データクラスの作成................................................................130データ検索の概要...................................................................13データ更新の概要...................................................................46データ操作ハンドル........................................................209,212データのXML変換機能............................................................4

- 590 -

データの検索.....................2,133,177,214,330,369,394,419,446データの更新.....................2,160,196,229,348,380,405,431,470データベースからXML文書に変換する場合の処理手順.....246データベースからXML文書への変換..................................238データベース上のXML文書.................................................324データを検索する方法............................................................13データを更新する.................................49,353,384,409,435,477データを更新する方法............................................................46データを削除する.................................48,350,382,407,433,473データを挿入するdirector........................................................47データをソートして取得する....................................147,182,222データを追加する............47,160,197,229,348,381,406,432,470動作環境ファイルの設定...........................................................9ドキュメントサンプル..............................14,330,369,394,419,446特定のXML文書をすべて取得する.........337,374,399,424,454トランザクション.......................................................................585トランザクション機能.................................................................51トランザクションとShunsaku Fileを使ったサンプル.....411,437,481トランザクションとは..................................................................51トランザクションとリカバリの関係..............................................56トランザクションの開始と終了..................................................53トランザクションの概要.............................................................51トランザクションの同時実行制御.............................................55取出し順序.............................................................................306トリプルドット............................................................................290

[な]入出力ページ(JSP)の作成....................................................130入力データソースの決定.......................................................239任意文字指定........................................................................282任意文字指定検索..................................................................19

[は]バイナリデータを抽出するパターン.......................................545パス演算子.............................................................................268パス式.........................................................268,270,271,276,294パス式、テキスト式または属性式の例.....................................16パス要素.................................................................................268パターン......................................................................16,279,290ハンドルの使用方法..............................................................210比較演算子............................................................................277ビジネスクラスの作成.............................................................130ヒット件数..................................................................569,573,578ヒット件数の上限値を設定する.....141,188,218,345,379,404,430,466否定........................................................................................281否定指定検索..........................................................................22ビルド......................................................................................131ファイルの場合.......................................................................254フィルタ式...............................................................................290複数のShunsaku Fileを1つのトランザクションで扱う方法.....103複数のShunsaku Fileを扱う場合の注意................................110複数のキー指定でグループ化する.........................................41複数のキー指定でソートする...................................................32複数の条件を論理演算子で結合して検索する.....................25部分一致................................................................................277

部分一致検索..........................................................................15部分文字指定........................................................................284部分文字指定検索..................................................................20プロジェクト作成.....................................................................129文法の表記方法....................................................................267ペアレント要素.......................................................................241平均........................................................................................303返信開始番号.................................................................568,577返信可能件数........................................................................578返信データ格納管理構造体...................................570,574,579返信データ格納管理配列.......................................569,574,578返信データ格納済領域サイズ.................................569,574,578返信データ格納領域...............................................570,574,579返信データ格納領域サイズ.....................................569,573,578返信要求件数..........................................................568,572,577返信レコード識別子域...........................................................573ホスト名...........................................................9,131,175,212,263ホスト名とポート番号をコンストラクタで指定する方法..........176ホスト名とポート番号を直接指定する方法.....................132,214ホスト名とポート番号をプロパティで指定する方法...............176ポート番号......................................................9,131,175,212,263

[ま]マッピングルールの変換例....................................................537マッピングルールの適用例....................................................535マッピングルールファイルの作成..........................................244マッピングルールファイルの定義書式..................................524未接続状態............................................................................583文字間隔指定........................................................................284文字間隔指定検索..................................................................19文字コード.........................................................168,208,236,559文字コード系の考慮..................................................................5文字範囲指定........................................................................285文字範囲指定検索..................................................................20文字列....................................................................................286文字列一致指定....................................................................282文字列一致指定検索..............................................................18文字列検索.......................................................................17,279文字列でグループ化する........................................................38文字列で検索する...................................................................14文字列でソートする..................................................................27

[や]要素ノードを指定してXML形式で取り出す...........................34要素名....................................................................................268要素名の 初の文字に@を使用している場合....................328

[ら]ライブラリ.....................................................................................7リターン式..........................................................................13,293レコードIDの取出し................................................................143レコードIDを指定してデータを更新する.................163,201,232レコードIDを指定してデータを削除する.................162,199,230レコードIDを利用してXML文書全体を取得する.....145,185,220レコード識別子.......................................................................563列のデータを固定属性として抽出するパターン...................541列のデータを属性として抽出するパターン...........................540

- 591 -

列名を属性として抽出するパターン......................................542論理演算検索..........................................................................17論理演算子.......................................................................25,274論理積....................................................................................281論理積指定検索......................................................................21論理和....................................................................................281論理和指定検索......................................................................22ロールバック.............................................................................53

[わ]ワード一致指定......................................................................286ワード一致指定検索................................................................21ワード間隔指定......................................................................286ワード間隔指定検索................................................................21ワード検索.........................................................................17,280

- 592 -