71
Empress導入ガイド 株式会社 Empress Software Japan Version 1.0 Empress 導入ガイド 1

Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

Empress導入ガイド

株式会社 Empress Software JapanVersion 1.0

Empress 導入ガイド

1

Page 2: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

第1章 はじめに本書は、はじめてEmpressを使用する方のための「Emprss導入ガイド」です。本書はC言語、SQLなど基本的なことはすでに習得されている方を対象とし、Empressデータベースに関連した基本技術資料として記載されています。対象としているOSはLinuxもしくはWindowsで、組込みで使用されるクロス開発環境は別紙となる「クロス開発環境導入ガイド」を参照下さい。

「Emprss導入ガイド」のストーリーラインは以下の通りです。

章 目次 説明

1 はじめに

2 Empressデータベースの特長・機能 Empressの特長・機能についての説明

3 インストール Linux、Windowsでのインストール手順

4 データベースの作成とSQLアクセス データベースの作成方法とデータベースの構成

5 テーブルの作成 テーブルの作成方法について

6 EmpressのSQL EmpressのSQL

7 データタイプ Empressで使用できるデータタイプ

8 Empressの基本コマンド データベース作成、削除、インポート、エクスポートなどの基本コマンド

9 Empress mrインターフェース EmpressのC/C++用mrインターフェース

10 Empressの管理コマンド Empressデータベースのロック解除など管理者用コマンド

11 Empress管理API 管理コマンドを関数としてコールする実装方法

12 データベース設定 Empressデータベースの設定ファイルであるinitfile、tabzeroについて

他社商標について当ドキュメントに記載されている会社名・製品名・システム名などは、 各社の登録商標、もしくは商標です。 なお、本文および図表中では、©、™、®等は明記しておりません。

Empress 導入ガイド

2

Page 3: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

第2章 Empressデータベースの特長・機能Empressは、1979年の発売以来、約30年にわたり日本及び全世界で数多くの導入実績を持つデータベースです。特に北米では、組込みデータベースでNO.1の実績を誇っています。

発売当初からEmpressは北米のFA分野で数多く導入されました。郵便物のソートシステムや原子力発電所の監視システム、計装などミッションクリティカルでリアルタイム性が要求される分野に対応するため、高速エンジン、小フットプリント、マルチタスク、CRUD(create、read、update、delete)の定時制、リソース使用量の可予測性などの機能を実装しました。

また、Empressは発売後の初期段階で店舗POS端末用のデータベースとして導入されました。POS端末は、店員がPOS端末の電源コンセントを不注意で抜くことが多く、予期しない電源断からの回復の機能が必要とされることがわかりました。断電やその他のいろいろな状況に対応するために、断電回復性(電源断が起こったすぐに後にデータベースを自動復旧する機能)、断片化防止処理(メンテナンスフリー)、タイムアウト機能が追加されました。現在、Empress データベースを特長付ける多くの機能は、発売初期段階で生み出され、その後、数多くの改良が加えられ現在に至っています。

製品誕生から30年を経て、現在、Empressは自動車搭載分野、テレコム・ネットワーク機器分野、FA分野、航空分野、防衛産業分野、金融・銀行分野、POS・OA分野、情報家電分野など多くの分野で採用されています。Empressの開発拠点は、カナダ(トロント本社)、日本(株式会社Empress Software Japan)に拡張され、販売代理店は米国、日本、中国、韓国、英国、フランス、ロシア、ポーランド、オーストラリアなどにあり、グローバルなビジネスを展開しております。

高速性Empressデータベースの最大の特長は高速であるということです。Empressデータベースは組込み環境において、高速の検索と共に高速のデータ登録機能も提供しております。30年以上前はハードウェア環境(CPU、メモリ等)が現在とは比較にならないほど貧弱でした。その結果、Empressは最近設計されたベータベースと比較すると少ないメモリリソースで高速です。また、Empressは多くのデータベースチューニングポイントがありますので、ユーザのデータ、SQLの特性に合わせてさらに高速化が可能です。

高速断電回復機能Empressは独自のデータのチェックポイントを設け、データをチェックし、ヘッダ、インデックスに不整合がないかをチェックし、不整合があった場合、それぞれを修正した上でデータベースを高速に回復させます。

Empressはマルチファイル構造で、1つのテーブル、1つのインデックスが別々のファイルに保存されていますので、あるテーブルのデータが一部破損しても、他のテーブルやインデックスには影響がないように設計されています。あるアメリカのボイスレコーダーの会社は10万回の断電・回復の復旧テストを行いましたがEmpressはテストに合格しています。

リアルタイム性リアルタイム性とは定時性のことです。Empressはデータベースの一定の動作が必ず一定の時間で終了することを保証し

Empress 導入ガイド

3

Page 4: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

ています。たとえば、Empressでは1秒ごとに5000 件のデータ更新と削除を繰り返しても、最初の更新と2年後の更新の差はわずか1%です。想定外の時間がかかる検索に備え、実行中にキャンセル機能やタイムアウト機能も提供し、予期せぬ動作にも対応しています。

非断片化構造Empressデータベースは非断片化構造を持っていますのでメンテナンスフリーです 。このため他のデータベースのようにVacuum関数を必要としません。

Empress 導入ガイド

4

Page 5: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

マルチプロセス・タスクEmpressデータベースはマルチプロセス・タスクに対応しています。マルチプロセス、マルチタスク(スレッド)がデータベースの同時更新と検索をサポートしています。通常エンタープライズデータベースでサポートしているテーブル・ページ・レコードレベルのロックを組込みデータベースでも提供しています。そのために複数のプロセス・タスク(スレッド)の同時検索・登録が可能です。これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはできず、シングルユーザになります。

暗号化可能なセキュアデータベースEmpressはアメリカ国立標準技術研究所が推奨するAES256bitの暗号化が可能です。OSネイティブのアルゴリズムも、現在、お客様が使用しているセキュリティチップなどに実装された暗号化アルゴリズムの使用も可能です。組込み業界初となるカーネル(データベースエンジン)暗号化技術をデータベースに実装しています。データベースエンジン部分で、データベース内のデータではなく、構造そのものを暗号化するためインデックスの使用が可能になるため、オーバーヘッドは5%以内です。

小さいフットプリントEmpressは小さいフットプリントサイズで提供されます。ANSIのSQL92に完全準拠し、断電回復、In-memory機能、ODBC・JDBCインターフェース、レプリケーション、暗号化などの機能を実装したデータベースでは非常にフットプリントが小さいと言えます。また、最大メモリ使用サイズをプロファイルで設定することが可能です。

多言語対応Empressは日本以外でも、米国で直販社を2社、韓国、中国、イギリス、フランス、ロシア、ポーランド、オーストラリアに代理店を持つグローバル企業です。このためマルチ言語に対応することを非常に得意としています。以下のように非常に多くの言語に対応しています。

Empress 導入ガイド

5

Page 6: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

長期供給(20年)Empressは米国防衛産業に数多く採用されている結果、製品の長期供給が可能です。

このような特長のため、Empressデータベースは業界のデファクトスタンダートとなっております。

Empress 導入ガイド

6

Page 7: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

第3章 インストールEmpressのインストールは非常に簡単です。LinuxでもWindowsでもほぼ標準の手順でインストールすることが可能です。ただし、Linuxではroot以外のユーザで、WindowsではAdministrator権限を持つユーザでインストールして下さい。

Linux環境でのインストール任意の場所でEmpressインストールファイルを解凍します。 ttaarr xxvvff ccddrr4400991100..ttaarr (数字はバージョンによって異なります。)

1.

解凍したディレクトリに install.shがあるのでホームディレクトリで実行します。2.License agreementを承認します。3.Empressから入手したLicenseキーを入力します。4.インストール場所を指定します。通常はdefaultのまま実行します。5.その他の設定内容を確認しながらインストールを完了します。6.

Empressの環境設定はホームディレクトリの~/.bash_profileに書き込まれますので、ログインし直して下さい。

インストール後の確認には、empversと言うコマンド実行して下さい。実行して次のようにEmpressのバージョンが表示されればインストールは成功しています。

[test-user@ip-192-168-0-4 testdir]$ empvers Empress V10.20 (Evaluation copy: licence will expire on Feb 9, 2015) (c) Copyright Empress Software Inc. 1983, 2014for x86-64 running Linux 2.6 with GLIBC 2.12[linux-x86_64]Port Code DOCS-10.20-F-29-S-UTFPort Code JDBC-10.20-F-27-S-UTFPort Code ODBC-10.20-F-38-S-UTFPort Code RDBM-10.20-F-44-S-UTFInstalled in: /home/ec2-user/Empress/v10.20/installationCodeset: UTF8

Empress 導入ガイド

7

Page 8: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

Windows環境でのインストールインストールファイルはempress-40910.msiです。(数字はバージョンによって異なります。)1.ファイルを実行するとインストールプログラムが起動します。2.途中でLicense agreementの承認画面が表示されますので、承認して下さい。3.Licenseキーを入力して下さい。4.基本的には画面の指示に従ってインストールを進めれば、インストールが完了します。5.

上記インストール完了後、Windowsを再起動して下さい。

インストール後の確認には、empversと言うコマンド実行して下さい。Windows XP系の環境では、コマンドプロンプトを起動してempversと入力して下さい。Windows 7とWindows Server R2 では、スタートメニューに登録されたEmpressのフォルダ以下にEmpressコマンドプロンプトがありますのでここを起動してempversと入力して下さい。

実行して次のようにEmpressのバージョンが表示されればインストールは成功しています。

C:\Empress\v10.20-F.SJIS>empversEmpress V10.20 (評価版:ライセンス有効期間 Feb 9, 2015)(c) Copyright Empress Software Inc. 1983, 2013for x86 running Microsoft Windows 7[win32]Port Code DOCS-10.20-F-22-S-JPNPort Code JDBC-10.20-F-21-S-JPNPort Code ODBC-10.20-F-32-S-JPNPort Code RDBM-10.20-F-37-S-JPNインストール先。: C:\Empress\v10.20-F.SJISコードセット: SJIS

Empress 導入ガイド

8

Page 9: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

第4章 データベースの作成とSQLアクセスEmpressでデータベースを作成する場合、他のデータベースと同様に、Linuxの場合はShell、Windowsの場合はコマンドプロンプトで作成することが可能です。Empressはコマンド以外に、データベース作成用の関数も提供しています。C言語の関数は、第9章 Empress mrインターフェースを参照して下さい。

データベースの作成コマンド例えばカレントディレクトリにtestdbというデータベースを作成する場合は以下のように入力します。

[使い方]eemmppmmkkddbb デデーータタベベーースス名名

[例]eemmppmmkkddbb tteessttddbbtestdbと言う名前のデータベースを作成します。

Empressのデータベースはディレクトリ構造で作成されディレクトリ名はデータベースと同じ名前になります。サンプルで作成されたtestdbディレクトリは以下の様に作成されます。

データベースへのアクセス方法作成したtestdbにShellやコマンドラインからアクセスするには、empsqlと言うコマンドの対話型SQLのインターフェースが用意されています。

[使い方]eemmppssqqll デデーータタベベーースス名名

[例]C:\test>eemmppssqqll tteessttddbb

EMPRESS V10.20

(c) Copyright Empress Software Inc. 1983, 2013

1*empsqlコマンドでtestdbにアクセスすると、プロンプトの形式が行単位に変わります。

empsqlでSQLインターフェースにアクセスすると、様々なSQLコマンドが使用可能になります。

[例] testdb内でjobテーブルを作成します。C:\test\empsql testdb

EMPRESS V10.20

(c) Copyright Empress Software Inc. 1983, 2013

1* CCRREEAATTEE TTAABBLLEE jjoobb ((

jjoobb__iidd iinntteeggeerr,,

jjoobb__ssttaattuuss ttiinnyyiinntt,,

jjoobb__ssttaarrtt__ttiimmee ttiimmee,,

jjoobb__eenndd__ttiimmee ttiimmee,,

jjoobb__pprrooccIIDD cchhaarr((66))

Empress 導入ガイド

9

Page 10: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

));;

※ SQL文は、セミコロン(;)でターミネイトします。※ help;と入力すると使用可能なコマンドが確認できます。※ 頭にエクスクラメーションマーク(!)を付けることで通常のコマンド(Shellコマンド、Windowsのコマンド)も使用可能です。

データベースディレクトリファイル構成Empressのデータベースは、前項で解説したようにディレクトリ名は論理データベースと同じ名前で 、ディレクトリ下の各ディレクトリ、ファイルの役割は以下の通りです。

データ 辞書テーブル

.relファイル メインデータファイル

.dtf ファイル 可変長データオーバーフローファイル

.ixファイル インデックスのメインファイル

.ixlファイル インデックスオーバーフローファイル

その他 データベースの補助情報

システム辞書Empressには、データベース、テーブル、アトリビュート、アクセス権限等に関する情報を保持する以下のようなシステムテーブルがあります。データベースを作成すると4つのシステムテーブルが自動的に作成され各役割は以下の通りです。他のシステムテーブルは必要に応じて自動的に作成されます。

システムテーブル名 説明

sys_dictionaryシステムテーブル(sys_tables、sys_attrs、sys_privs)等のコンパイルした情報を保存します。このコンパイル情報はシステムテーブルの二重化を行い、高可用性を保証します。ハードウェアの故障、断電等によるデータベースの破損時には復元が可能です。

sys_tables 全テーブル、ビューの情報を保存しています。

sys_attrs 全アトリビュート情報を保存しています。

sys_privs データベースのアクセス権限情報を保存しています。

Empress 導入ガイド

10

Page 11: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

第5章 テーブルの作成テーブルの作成は以下の手順で作成します。

テーブルの作成コマンド例えばtestdbというデータベースにjobテーブルを作成する場合は以下のように作成します。

[シンタックス]CCRREEAATTEE [[TTAABBLLEE]] ttaabbllee [[|| ((iitteemm {{,, iitteemm}} [[,,ccoonnssttrr {{,,ccoonnssttrr}}]])) ||]] ||SSEETT iitteemm {{,, iitteemm}} [[,,ccoonnssttrr

{{,,ccoonnssttrr}}]] || [[LLOOCCAATTEE [[IINN]] llooccaattiioonn]];;

item attr [data_type [(param {,param})] [[NOT] NULL] [attr_constr]]

constr プライマリキーと外部キー制約条件です。次のうちの1つです。

PRIMARY KEY [key_name] [ON] (attr {, attr}) [| BTREE |] | TIMESERIES |1.OREIGN KEY [key_name] [ON] (attr {, attr}) [| BTREE |] | TIMESERIES | REFERENCEStable (attr {, attr})

2.

location 既存のディレクトリー名を指定します。ディレクトリ用の任意の有効な システムパス名です。全てのファイルを指定することを推奨します。 位置の指定にキーワード< tt="">あるいは空のストリング("")で指定された場合、テーブルは現在のデータベースディレクトリに作成されます。

data_type データタイプです。パラメータは括弧で囲まれます。 data_typeが指定されない場合はINTEGERになります。

attr_const プライマリキーと外部キー制約条件です。次のうちの1つです。

PRIMARY KEY [key_name] [|BTREE |] |TIMESERIES |1.FOREIGN KEY [key_name] [|BTREE |] REFERENCES table (attr {, attr}) |TIMESERIES |2.

[使い方]CCRREEAATTEE TTAABBLLEE jjoobb ((

    jjoobb__iidd iinntteeggeerr,,

    jjoobb__ssttaattuuss ttiinnyyiinntt,,

    jjoobb__ssttaarrtt__ttiimmee ttiimmee,,

    jjoobb__eenndd__ttiimmee ttiimmee,,

    jjoobb__pprrooccIIDD cchhaarr((66))   

));;

Empress 導入ガイド

11

Page 12: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

第6章 SQLSQLとは構造化問い合わせ言語 (Structured Query Language) の略で、実際には、RDBMSでのデータの操作や定義を行うための問い合わせ言語を意味します。EmpressのSQLはANSI92に完全準拠していますので、詳しいSQLについては専門書を参照して下さい。本章では特に重要な箇所のみ解説しています。

SQLはempsql、empbatch、empcmd、C言語で使用可能です。

SQLの3つの機能SQL言語は下記の3つの機能に分類されます。

機能 解説

DDL (Data Definition Language) 1.データ定義言語およびデータベース2. テーブルの構造に関連

DML (Data Manipulation Language)1.データ操作言語2.メンテナンスおよびデータの検索3.データベーステーブルへの格納に関連

DCL (Data Control Language) 1.データ制御言語2.整合性の保証およびデータ保護機能

DDL (データ定義言語)

主要なDDLコマンドをアルファベット順で表示しています。

ALTER TABLE 既存のテーブルの構造を変更します。対象となるテーブルにレコードが存在する場合、そのレコードに対し、手動でダンプおよびリロードすることなしに変更ができます。

CREATE COMMENT テーブルおよびアトリビュートに対してのコメントを作成します。

CREATE INDEX データベースのインデックスを作成します。

CREATE MODULE データベースのPSMの定義を作成します。

CREATE RANGE CHECK アトリビュートのデータ有効性チェックをセットアップします。

CREATE REFERENTIAL アトリビュートのデータ参照制約をセットアップします。

CREATE TABLE テーブル名を作成します。

CREATE TRIGGER データベースのトリガーを定義します。

CREATE VIEW ビューを作成します。

DISPLAY DATABASE データベース内のテーブルを表示します。

DISPLAY MODULE データベースのPSM定義を表示します。

DISPLAY PRIVILEGE テーブルに対してのアクセス特権を表示します

DISPLAY TABLE テーブル構造を表示します

DROP COMMENT テーブルまたはアトリビュートのコメントを削除します。

DROP INDEX インデックスを削除します。

DROP MODULE PSM定義を削除します。

DROP RANGE CHECK アトリビュートのデータ有効性チェックを削除します。

DROP REFERENTIAL アトリビュートのデータ参照制約を削除します。

DROP TABLE テーブルを削除します。

DROP TRIGGER トリガーを削除します。

Empress 導入ガイド

12

Page 13: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

DROP VIEW 論理テーブルを削除します。

RENAME テーブルまたはアトリビュートの名前を変更します。

DDLの使用方法とサンプルは以下の通りです。

[使用方法]CCRREEAATTEE [[TTAABBLLEE]] ttaabbllee__nnaammee ((aattttrr__ddeeff {{,, aattttrr__ddeeff}}))

[サンプル]CCRREEAATTEE TTAABBLLEE jjoobb ((

  jjoobb__iidd iinntteeggeerr,,

  jjoobb__ssttaattuuss?? ttiinnyyiinntt,,

  jjoobb__ssttaarrtt__ttiimmee?? ttiimmee,,

  jjoobb__eenndd__ttiimmee?? ttiimmee,,

  jjoobb__pprrooccIIDD?? cchhaarr((66))

));;

DML (データ操作言語)

主要なDDLコマンドをアルファベット順で表示しています。

CALL PSMまたは式の呼び出し

DELETE テーブルの不要なレコードの削除

EMPTY テーブルの全レコードの削除

INSERT テーブルへ新しいレコードを追加

LOCK TABLE トランザクションの間、テーブルのロック

SELECT テーブルからのデータ検索

SORT 1つ以上のアトリビュートのテーブルソート

UPDATE テーブルの存在するレコードの更新

代表的なDMLの構文例の一覧SELECT文:データの検索 SELECT * FROM PERSON WHERE person_id = 1;

UPDATE文:データの更新 UPDATE CONTACT SET contact=“[email protected]" WHERE person_id=2;

INSERT文:データの登録 INSERT INTO CONTACT (person_id, contact_type) VALUES (2, 1);

DELETE文:データの削除 DELETE * FROM CONTACT WHERE person_id=2 AND contact_type=1;

テーブルの結合 SELECT name, contact FROM PERSON, CONTACT WHERE PERSON.person_id =CONTACT.person_id;

WHERE文の演算子 =、!= 、<> 、!、~ 、> 、>= 、< 、<= 、IN 、RANGE 、BETWEEN 、LIKE 、MATCH 、SMATCH

サブクエリ SELECT name FROM PERSON WHERE person_id in (SELECT person_id FROMCONTACT);

集計関数の使用 COUNT, AVG, MAX, MIN, AVGSELECT name, count(*) FROM PERSON, CONTACTWHERE PERSON.person_id = CONTACT.person_id GROUP BY name HAVING nameMATCH “山本%”

DMLの使用方法とサンプルは以下の通りです。

[使用方法]

Empress 導入ガイド

13

Page 14: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

IINNSSEERRTT [[IINNTTOO]] ttaabbllee ((aattttrr {{,, aattttrr}}))

              VVAALLUUEESS ((aattttrr__vvaalluuee {{,, aattttrr__vvaalluuee}}));;

[サンプル]IINNSSEERRTT IINNTTOO jjoobb ((jjoobb__iidd,, jjoobb__ssttaattuuss,, jjoobb__ssttaarrtt__ttiimmee,, jjoobb__eenndd__ttiimmee))

         VVAALLUUEESS  ((7733,, 22,, 0099::0000::0000,, 1177::0000::0000,,

                  7744,, 33,, 0099::0000::0000,, 1177::0000::0000));;

DCL (データ制御言語)

COMMIT WORK 現在のトランザクション中のデータベースに対する すべての変更を永続的に保存し、トランザクションを終了します。

DISPLAY WORK 現在のトランザクションのステータスを表示。また、 データベースに影響しているトランザクションのプロセスのステータスの表示します。

ROLLBACK ロールバックします。

SAVEPOINT ネストしたトランザクションを起動し、トランザクションのセーブポイントを設定。ROLLBACKコマンドによってセーブポイントにトランザクションを戻すことが可能します。

Empress 導入ガイド

14

Page 15: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

第7章 データタイプEmpress データタイプは3つの種別があります。

NO 名称 解説

1 ANSI ANSI準拠のデータベースタイプ

2 ODBC XOPEN準拠のデータタイプ

3 extension Empress独自のデータタイプ

データタイプ一覧表データタイプ名は同じデータタイプでもいくつかの別名がある場合があります。 1つのセルに表示されているデータタイプは同じものを表します。

種類 データタイプ 種別 シンタックスと範囲

文字列

CHARACTERCHARSQL_CHAR

ANSIANSIODBC

CHARACTER [(length)]

1からC言語のintの限界まで、通常231-1 bytes

NATIONAL CHARACTERNATIONAL CHARNCHAR

ANSIANSIANSI

NATIONAL CHARACTER [(length)]

1文字から最大のバイトで割られたC intの極大値、(231-1)/2バイト

ECHARACTERECHAR

ExtensionExtension

ECHARACTER [(length [, type])]1からC言語のintの限界まで、通常231-1 bytes

NLSCHARACTERNLSCHAR

ExtensionExtension

NLSCHARACTER [(length [, type])]1からC言語のintの限界まで、通常231-1bytes

CHARACTER VARYINGCHAR VARYINGVARCHARSQL_VARCHAR

ANSIANSIANSIODBC

VARCHAR [(length)]

1からC言語のintの限界まで、通常231-1bytes

NATIONAL CHARACTERVARYINGNATIONAL CHAR VARYINGNCHAR VARYINGVARNCHAR

ANSIANSIANSIANSI

VARNCHAR [(length)]

1文字から最大のバイトで割られたC intの極大値、(231-1)/2バイト

TEXT Extension

TEXT [ (display [, primary [, overflow [, extents ]]])]

1バイトから最大のバイトで割られたC intの極大値、(231-1)/2バイト

NLSTEXT Extension

NLSTEXT [ (display [, primary [, overflow [, extents ]]])]

1バイトから最大のバイトで割られたC intの極大値、(231-1)/2バイト

CHARACTER LARGEOBJECTCHAR LARGE OBJECTCLOB

ANSIANSIANSI

CLOB [(length)]

1バイトから最大のバイトで割られたC intの極大値、(231-1)/2バイト

NATIONAL CHARACTERLARGE OBJECTNATIONAL CHAR LARGE 

ANSIANSIANSI

NCLOB [(length)]

1バイトから最大のバイトで割られたC intの極大値、

Empress 導入ガイド

15

Page 16: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

OBJECTNCHAR LARGE OBJECTNCLOB

ANSI (231-1)/2バイト

整数

TINYINTSQL_TINYINTINTEGER8

ANSIODBCExtension

TINYINT

-127 から127 (27-1)

SMALLINTSQL_SMALLINTINTEGER16

ANSIODBCExtension

SMALLINT

-32767 から 32767 (215-1)

INTEGERINTSQL_INTEGERINTEGER32

ANSIANSIODBCExtension

INTEGER

-2147483647 から 2147483647 (231-1)

BIGINTSQL_BIGINTINTEGER64

ANSIODBCExtension

BIGINT

-(263-1) から 263-1

シーケンス SEQUENCE Extension

SEQUENCE seqFor 32: 0 tから2147483647 (231-1)For 64: 0 から 263-1

Boolean BOOLEAN ANSIBOOLEAN有効な値は 'true' と'false'; '0' and '1'; 't' と'f'; 'yes' と 'no'; 'y'と 'n'

Float

REALSQL_REALFLOAT32

ANSIODBCExtension

REAL

システム依存- 4-バイトのシングルフロート

DOUBLE PRECISIONSQL_DOUBLEFLOAT64

ANSIODBCExtension

DOUBLE PRECISION

システム依存- 8-バイトのダブルフロート

EFLOAT Extension

EFLOAT [decimal places]システム依存-小数位の数が1と6の間にある場合、4バイトのシングルフロート7と12の間にある場合、それは8バイトのダブルフロート

FLOATSQL_FLOAT

ANSIODBC

FLOAT [binary precision]システム依存- 2進法の数が1と24の間にある場合は4バイトのシングルフロートです。25と53の間にある場合は8バイトのダブルフロート

Decimal

DECIMALDECNUMERICSQL_DECIMALSQL_NUMERIC

ANSIANSIANSIODBCODBC

DECIMAL [(total_digits [, decimal_places])]1から38桁

DOLLAR Extension DOLLAR [(max_digits [ , type])]1から13桁

Date

EDATE ExtensionEDATE [(type)]yyyymmddのフォーマットで00000101 から 99991231(January 1, 0000 to  December 31, 9999)

EPOCH_TIME ExtensionEPOCH_TIME [(type)]January 1, 1970 00:00:00から December 31, 203523:59:59

Empress 導入ガイド

16

Page 17: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

ETIME ExtensionETIME [(type)]January 1, 0000 00:00:00から December 31, 999923:59:59

MICROTIMESTAMP ExtensionMICROTIMESTAMP [(type)]January 1, 0000 00:00:00.000000から December 31,9999 23:59:59.999999

DATESQL_TYPE_DATE

ANSIODBC

DATEyyyy-mm-ddのフォーマット,i0000-01-01 から 9999-12-31(January 1, 0000 to December 31, 9999)

TIMETIME WITHOUT TIME ZONESQL_TYPE_TIME

ANSIANSIODBC

TIME [(prec)]00:00:00.000000000 から 23:59:59.99999999

TIMESTAMPTIMESTAMP WITHOUT TIMEZONESQL_TYPE_TIMESTAMP

ANSIANSIODBC

TIMESTAMP [(prec)]January 1, 0000 00:00:00.000000000から December31, 9999 23:59:59.999999999

バイナリ

BULK ExtensionBULK [(display [, primary [, overflow [, extents]]])]1バイトから最大のバイトで割られたC intの極大値、(231-1)/2バイト

BINARY LARGE OBJECTBLOB

ANSIANSI

BLOB [(n)]1バイトから最大のバイトで割られたC intの極大値、(231-1)/2バイト

Empress 導入ガイド

17

Page 18: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

第8章 Empressの基本コマンドEmpressでデータベースデータベースを作成したり、対話型SQLなどのEmpressの基本コマンドについて解説しています。

Windows環境でEmpressでコマンドを実行するにはOSのバージョンによっての2種類の方法があります。Windows XP系の環境では、コマンドプロンプトを起動してempversと入力して下さい。Windows 7とWindows Server R2 では、スタートメニューに登録されたEmpressのフォルダ以下にEmpressコマンドプロンプトがありますのでここを起動してempversと入力して下さい。

データベースの作成: empmkdb

役割 新しいデータベースを作成します。

使い方empmkdb database_name

database_name: データベース名

該当するC言語の関数 mrexecdirect関数内でcreate databaceを実行して下さい。

※ 詳しい使用方法は empmkdb -helpで参照下さい。

データベースの削除: emprmdb

役割 データベースを削除します。

使い方emprmdb database_name

database_name: データベース名

該当するC言語の関数 mrexecdirect関数内でdrop databaceを実行して下さい。

データベースへアクセスする: empsql

役割 対話型SQLを実行します。

使い方empsql database_name

database_name: データベース名

該当するC言語の関数 SELECT文の実行にはmrexecquery、それ以外にはmrexecdirectを使用して下さい。

Empress 導入ガイド

18

Page 19: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

単一のSQL文の実行: empcmd

役割 Shell・コマンドライン上でSQL文を実行します。

使い方

empcmd database_name "SQL_command"

database_name: データベース名SQL_command: SQL文

例 empcmd db "insert into t1 values('test01','test02');"

該当するC言語の関数 SELECT文の実行にはmrexecquery、それ以外にはmrexecdirectを使用して下さい。

複数のSQL文の実行: empbatch

役割 バッチモードで複数のSQL文を実行します。

Linuxでの使い方

SQL文を1つのテキストファイルに保存します。1.empbatchコマンドか、シェルコマンドで実行します。2.

シナリオ1 empbatchコマンドでsample.sqlをmaster_dbで実行します。

sample.sqlの内容create table t1 (number integer not null);insert into t1 values (1,2,3,4,4);select * from t1;

実行例

[test-user@ip-192-168-0-4 testdir]$ empbatch master_db < sample.sql number

1 2 3 4 4

シナリオ2 シェルコマンドでsample.shをmaster_dbで実行します。

sample.shの内容

empbatch testdb << EOFcreate table t1 (number integer not null);insert into t1 values (1,2,3,4,4);select * from t1;EOF

実行例

[test-user@ip-192-168-0-4 testdir]$ sh sample.sh number

1 2 3 4 4

Empress 導入ガイド

19

Page 20: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

Windowsでの使い方

SQL文を1つのテキストファイルに保存します。1.empbatch [データベース名] > [テキストファイル名] で実行します。2.

シナリオ sample.sqlをmaster_dbで実行します。

sample.sqlcreate table t1 (number integer not null);insert into t1 values (1,2,3,4,4);select * from t1;

実行例

C:\Empress>empbatch master_db < sample.sql number

1 2 3 4 4

データベースのエクスポート: empexpt

役割 データベースのエクスポートファイルを作成します。

使い方empexpt testdb.ept testdb

データベース(testdb)の情報をtestdb.eptファイルにエクスポートします。

シンタックス

empexpt [options] outfile database_name [table_list] [module_list]

outfile:出力ファイル名 (または、"-"を指定して標準出力に出力)database_name:データベース名

※ empexptの詳しい使い方はempexpt -helpを参照して下さい。

注意 テーブル定義をエクスポートするには display特権が、データをエクスポートするにはdisplay特権とselect特権の両方が必要です。

該当する C言語の関数 msdbexport

データベースのインポート: empimpt

役割 empexptコマンドでエクスポートしたファイルを、Empressデータベースにインポートします。

使い方empimpt testdb.ept newtestdb

testdb.eptファイル内のデータをデータベースnewtestdbにインポートしています。

シンタックス

empimpt [options] infile database_name [table_list] [module_list]

infile:インポート元ファイル名 (または、"-"を指定して標準入力から入力)database_name:データベース名

※ empimptの詳しい使い方はempimpt -helpを参照して下さい。

注意テーブルをインポートするにはsys_tables テーブルに対してinsert特権を持っている必要があります。もしインポートするテーブルが既に存在する場合にはそれらに対してinsert特権がなければなりません。

該当するC言語の関数 msdbimport

Empress 導入ガイド

20

Page 21: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

データベースのメンテナンス: empclean

役割

データベースのチェックと修復を行います。cronジョブ等も利用されます。

断電されたトランザクションを検知し解決します。1.断電されたロックを検知し取り除きます。2.断電されたデータベースの整合性を確認し、修復します。3.

使い方

empclean database_name

database_name:データベース名

※ empcleanの詳しい使い方はempclean -helpを参照して下さい。

実行例 1

C:\Empress>empclean testdb

EMPCLEAN バージョン 10.20 sample_user により開始 : 13 2014 16:49:01 データベースをチェック中です。: testdb 次段階 : 必要なシェアードメモリを検索中です。 次段階 : 不適切に終了したすべてのクライアントを発見しました。 次段階 : セマフォをチェックします。 次段階 : トランザクションを解決します。 次段階 : ロックを解除します。 次段階 : コーディネータをチェックします。EMPCLEAN 終了 : 13 Feb 2014 16:49:01

実行例 2

C:\Empress>empclean testdb recompile_all data_check index_check

EMPCLEAN バージョン 10.20 sample_user により開始 : 13 2014 16:52:43 データベースをチェック中です。: testdb 次段階 : 必要なシェアードメモリを検索中です。 : : 次段階 : コーディネータをチェックします。 NEXT PHASE:インデックスをチェックしています。EMPCLEAN 終了 : 13 Feb 2014 16:52:43

該当するC言語の関数 msdbmaintain

empclean(msdbmaintain)のお勧めのオプション

recompile_all sys_tableの情報の整合性を確認して必要があれば作り直します。

data_check 断電により壊れた.relファイル、.dtfファイルを探し、修復します。

index_check 断電により壊れたインデックスをチェックして、壊れていたら修復します。

temp 断電により不明な一時ファイルを消去します。

Empress 導入ガイド

21

Page 22: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

第9章 Empress mrインターフェースEmpressは、C/C++プログラミング言語を用いたmrインターフェースを提供します。mrは、組込みSQLをmr内に組込む手法と純粋にmrのみでプログラムを作成する2つのプログラミング開発手法を提供します。Empressは、通常の処理ではSQLをmrに組込む手法を、処理時間や最重要視するプログラムを作成したい場合、mrでプログラムを作成するようにお薦めします。

開発環境

mrを使用する場合、以下のCコンパイラが必要です。

Linuxの場合 gcc、ccコンパイラ等

Windowsの場合 Visual Studio

※ Visual Studioのバージョンに付いてはEmpressのWindowsの各バージョンに記載されております。

ヘッダーファイルmscc.h

mrを使用する場合、ヘッダーファイルmscc.hはプログラムの先頭でインクルードが必要です。 mscc.hはすべてのmr関数の定義と、多数のデータタイプ(addr、booleanなど)と定数の定義が含まれています。 mscc.hファイルは、バージョンによって内容が異なります。正確なファイルの内容は、$EMPRESSPATH/includeディレクトリにあるファイルを参照してください。

初期化とクリーンアップ

mr インターフェースは、msinit関数を呼び出して初期化し、msexit関数を呼び出してクリーンアップします。非プロセスベースのO/Sまたはスレッド・タスクベースアプリケーションのケースについては、Empress マニュアルのB2の『C/C++カーネルレベルインターフェースーmrルーチン』の3.24 Empress タスクモデルのmr ルーチンを参照して下さい。

コンパイル

mrを使用したプログラムは、cc等ではなくempccまたはempc++で、コンパイルしてください。

【例】eemmppcccc tteesstt..cc --oo tteesstt..ddllll

Makefileへの取り込みも可能です。内容については、empcc -listlines aaa.c (aaa.cは架空のファイル名で可)コマンドで確認可能です。表示された内容をMakefileに追加して下さい。Windowsの場合は、Visual Studioの中のプロジェクト設定に追加して下さい。

今回のサンプルの実行方法

次の項以降に、mrインターフェースのサンプルがあります。このサンプルの前にはサンプルで使用しているデータベース、テーブル構成、サンプル実行に必要なデータがSQL文の形式で表示されています。それらを準備した上サンプルをcファイルとして保存し、コンパイルの上実行して下さい。

Empress 導入ガイド

22

Page 23: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

Empressの提供するディスクリプタタイプ

Empressは以下に示す、7つのディスクリプタを提供しています。EmpressのデータベースにMRインターフェースを用いてアクセスする場合、下記のディスクリプタを使用することで、使用するポインタを混同することなくコードを記述することができます。

ディスクリプタタイプと C/C++ での定義との関連表

ディスクリプタタイプ

C/C++ 上での定義 説明

table mrdes* テーブルディスクリプタ

attribute mrades* アトリビュートディスクリプタ

record mrrdes* レコードディスクリプタ

qualification mrqdes* クオリフィケーションディスクリプタ(アトリビュートまたはレコードとの条件関連付け)

retrieval mrretrdes* リトライバルディスクリプタ(テーブルと条件を関連付け)

expression mrxdes* 数学的な表現式ディスクリプタ

strings char* アトリビュート値の外部フォーマットに一致する文字列ポインタ

エラーの取得方法

mr関数では、falseが返されたとき、または失敗時には変数mroperrにエラーコードがセットされます。この変数でエラー原因を調べることができます。またエラー直後にmrerrmsg関数を使用するとエラーメッセージを取得できます。

関数 解説

mrerrmsg

直前のエラー状態を示す文字列を取得します。

[mrerrmsgの使用方法]ssttrriinngg == mmrreerrrrmmssgg (());;

外部フォーマット、内部フォーマット、ファイルフォーマット

アトリビュート値の内部、外部、ファイルフォーマットについて解説します。これらについては、下記に記載されているサンプルコードを見てからの方がわかりやすいので、読み飛ばしていただいて構いません。

外部フォーマット外部フォーマットは、Empressが最終的にデータを出力するときに表示されるフォーマットです。外部フォーマットの値は文字列です。

内部フォーマット内部フォーマットは、Empressで処理されるフォーマットです。これは外部フォーマットと必ずしも一致しません。例えば edate (1)タイプの値は、"1 May 1998"という形で出力されますが、Empressの内部処理では"1 May 1998"のまま処理されているわけではありません。

ファイルフォーマットファイルフォーマットは、Empressがディスクに値を保存する場合に使用されているフォーマットです。 アプリケーションプログラムでファイルフォーマットを直接操作することはありません。

各フォーマット同士の関連性についてアトリビュート値は通常外部フォーマットで検索されますが、integer値または内部フォーマット値で直接検索することも可能です。

Empress 導入ガイド

23

Page 24: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

アトリビュート値の割り当ては、通常は外部フォーマットまたはinteger値で行いますが、内部フォーマットで直接割り当てることも可能です。

外部フォーマットで検索された値の計算を行なう場合は、sscanfやatofを使用して、文字列から数値に変換する必要があります。

フォーマット変換関数

関数 解説

mrcvt

外部フォーマットから、ファイルフォーマットへ値を変換します。

[mrcvtの使用方法]vvaalluuee == mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg));;

value ファイルフォーマットのアトリビュート値へのポインタ(void*)です。

attr_desc mrigeta または mrngetaによって返されるアトリビュートディスクリプタ(mrades*)です。

string 外部フォーマットのアトリビュート値へのポインタ(const char*)です。

mrcvtv

外部フォーマットから、ファイルフォーマットへ値を変換します。

[mrcvtvの使用方法]vvaalluuee == mmrrccvvttvv ((aattttrr__ddeesscc,, ssttrriinngg));;

value ファイルフォーマットのアトリビュート値へのポインタ(void*)です。

attr_desc mrigeta または mrngetaによって返されるポインタ(mrades*)です。

string 外部フォーマットのアトリビュート値へのポインタ(const char*)です。

mrcvti

内部フォーマットから、ファイルフォーマットへ値を変換します。

[mrcvtiの使用方法]vvaalluuee == mmrrccvvttii ((aattttrr__ddeesscc,, vvaarr__ppttrr));;

value ファイルフォーマットのアトリビュート値へのポインタ(void*)

attr_desc mrigeta または mrngetaから返るアトリビュートディスクリプタ(mrades*)です。

var_ptr 外部フォーマットのアトリビュート値へのポインタ(void*)です。

Empress 導入ガイド

24

Page 25: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

組込みSQLを用いた開発EmpressはmrにSQL組込むために、2つのmr関数を提供します。mrexecdirectはDDL系(Create table, alter, createindex, empty, drop tableなど)とSelect文以外のDML系(Insert、Update、Delete文等)で使用されます。mrexecqueryはSelect文でのみ使用されます。

1.mrexecdirect関数を使用した組込みSQL開発

mrexecdirectで組込みSQLを使用した例です。ステップ、サンプルコードは下記の様に非常にシンプルになっています。

関数 解説

mrexecdirect

DDL系(Create table, alter, create index, empty, drop tableなど)とSelect文以外のDML系(Insert、Update、Delete文等)で使用されます。

[mrexecdirectの使用方法]mmrreexxeeccddiirreecctt ((ddaattaabbaassee__nnaammee,,SSQQLL__ccoommmmaanndd));;

mrexecdirectにはSelect文以外の全てのSQLコマンド、例えば管理者用コマンド、レプリケーション用SQLコマンドを実行することが可能です。

組込みSQLを用いたデータベース作成のサンプルこのサンプルでは、testdbというデータベースを作るためにcreate database testdbというSQL文を実行しています。mrexecdirectの第一引数に指定するデータベース名はハイフン(-)になります。

##iinncclluuddee <<mmsscccc..hh>>

##ddeeffiinnee DDAATTAABBAASSEE ""tteessttddbb""

int main (int argc, char** argv)

{

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt(()))

{

printf("Unable to initialize Empress\n");

mmsseenndd(());

return 1;

}

/* データベースtestdbを作成します */

if (! mmrreexxeeccddiirreecctt ((""--"",,""ccrreeaattee ddaattaabbaassee tteessttddbb"")))

{

fprintf (stderr, "mrexecdirect failed\n");

fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

mmsseenndd(());

return 1;

}

printf("success.\n");

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

25

Page 26: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

組込みSQLを用いたデータ登録のサンプルこのサンプルでは、t1テーブルに対してinsert into t1 values ('Dan','Smith')というSQL文を実行しています。

今回使用するデータベース

データベース testdb

テーブル作成用SQL create table t1(s1 nlschar, s2 nlschar);

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt(()))

{

printf("Unable to initialize Empress\n");

mmsseenndd(());

return 1;

}

/* t1テーブルにレコードを追加します */

if (! mmrreexxeeccddiirreecctt ((DDAATTAABBAASSEE,,""iinnsseerrtt iinnttoo tt11 vvaalluueess ((''DDaann'',,''SSmmiitthh''))"")))

{

fprintf (stderr, "mrexecdirect failed\n");

fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg(()), mmrrooppeerrrr);

mmsseenndd(());

return 1;

}

printf("success.\n");

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

26

Page 27: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

組込みSQLを用いたデータ更新のサンプルこのサンプルでは、t1テーブルに対してupdate t1 set s1 = 'Roy' where s1 = 'Dan'というSQL文を実行しています。データベースの更新を行う場合、WHERE節による条件を付ける必要がありますので開発が容易な組込みSQLの使用をお勧めします。

今回使用するデータベース

データベース testdb

テーブル作成用SQL create table t1(s1 nlschar, s2 nlschar);

登録済みデータ用SQL insert into t1 values ('Dan','Smith');

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt(()))

{

printf("Unable to initialize Empress\n");

mmsseenndd(());

return 1;

}

/* t1テーブルのレコードを変更します */

if (! mmrreexxeeccddiirreecctt ((DDAATTAABBAASSEE,,""uuppddaattee tt11 sseett ss11 == ''RRooyy'' wwhheerree ss11 == ''DDaann''"")))

{

fprintf (stderr, "mrexecdirect failed\n");

fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg(()), mmrrooppeerrrr);

mmsseenndd(());

return 1;

}

printf("success.\n");

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

27

Page 28: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

組込みSQLを用いたデータ削除のサンプルこのサンプルでは、t1テーブルに対してdelete from t1 where s1 = 'Roy'というSQL文を実行しています。

今回使用するデータベース

データベース testdb

テーブル作成用SQL create table t1(s1 nlschar, s2 nlschar);

登録済みデータ用SQL insert into t1 values ('Roy','Smith');

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt(()))

{

printf("Unable to initialize Empress\n");

mmsseenndd(());

return 1;

}

/* t1テーブルから該当するレコードを削除します */

if (! mmrreexxeeccddiirreecctt ((DDAATTAABBAASSEE,,""ddeelleettee ffrroomm tt11 wwhheerree ss11 == ''RRooyy''"")))

{

fprintf (stderr, "mrexecdirect failed\n");

fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg(()), mmrrooppeerrrr);

mmsseenndd(());

return 1;

}

printf("success.\n");

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

28

Page 29: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

組込みSQLを用いたcsvデータ登録のサンプルEmpressでは、insertコマンドの拡張で、csvファイルをデータベースに一括登録することが可能です。読込みに使用するファイルは、MSVALSEPで指定してあるセパレータ文字で区切ったテキストデータになります。Empressのデフォルト設定では、Ctrl-Vがセパレータになります。

セパレータを変更したいときには、initfile.txt(データベースエンジンに関連する設定ファイルです。ファイルはEmpressのインストールディレクトリ内の/config/initfile.txtに存在します。)内のMSVALSEPの値を変更して下さい。

例えば次のようになります。

MMSSVVAALLSSEEPP=="",,""

テキストファイルの文字コードは、インストールされたEmpressの文字コードと同一にして下さい。

このサンプルでは、t1テーブルに対してinsert into t1 from 'data.csv'というSQL文でcsvファイルを登録しています。

今回使用するデータベース

データベース testdb

テーブル作成用SQL create table t1(s1 nlschar, s2 nlschar);

登録するCSVファイル(ファイル名: data.csv)

Suzuki,IchiroSaito,TaroOkada,Takashi

MSVALSEPの値 MSVALSEP=","

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt(()))

{

printf("Unable to initialize Empress\n");

mmsseenndd(());

return 1;

}

/* t1テーブルへdata.csvファイルからデータを登録します */

if (! mmrreexxeeccddiirreecctt ((DDAATTAABBAASSEE,,""iinnsseerrtt iinnttoo tt11 ffrroomm ''ddaattaa..ccssvv''"")))

{

fprintf (stderr, "mrexecdirect failed\n");

fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

mmsseenndd(());

return 2;

}

printf("success.\n");

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

29

Page 30: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

組込みSQLを用いたcsvデータ出力のサンプルファイルからの一括登録と同様に、Empressではselectコマンドの拡張でファイルにデータを一括出力することが可能です。

SQL文の例は次のようになります。

sseelleecctt ~~ ffrroomm テテーーブブルル名名 wwhheerree ~~ oorrddeerr bbyy ~~ dduummpp iinnttoo フファァイイルル名名

このサンプルでは、t1テーブルに対してselect * from t1 dump into 'data.csv'というSQL文でcsvファイルを登録しています。

今回使用するデータベース

データベース testdb

テーブル作成用SQL create table t1(s1 nlschar, s2 nlschar);

登録済みデータ用SQLinsert into t1('Dan','Smith');insert into t1('Anna','White');insert into t1('Ben','Lee');

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt(()))

{

printf("Unable to initialize Empress\n");

mmsseenndd(());

return 1;

}

/* t1テーブルからdata.csvファイルへデータを出力します */

if (! mmrreexxeeccddiirreecctt ((DDAATTAABBAASSEE,,""sseelleecctt ** ffrroomm tt11 dduummpp iinnttoo ''ddaattaa..ccssvv''"")))

{

fprintf (stderr, "mrexecdirect failed\n");

fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

mmsseenndd(());

return 2;

}

printf("success.\n");

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

30

Page 31: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

2.mrexecqueryを用いた組込みSQL開発

mrexecquery関数で組込みSQLを使用したデータ検索の例です。下記の様にシンプルなコードになっています。

関数 解説

mrexecquery

Select文を実行します。

[mrexecqueryの使用方法]rreettrriieevvaall__ddeesscc == mmrreexxeeccqquueerryy ((ddaattaabbaassee__nnaammee,,SSQQLL__ccoommmmaanndd,,NNUULLLL));;

mrget

while文でmrget関数をコールすることにより、Resultsetからレコードを取得することが可能となります。

[mrgetの使用方法]mmrrggeett ((rreettrriieevvaall__ddeesscc)) ==== MMSSMMRR__GGEETT__OOKK

mrrsget_string

while文内で該当するカーソルのアトリビュートの値を取得します。 ここで取得したデータはEmpressの内部バッファに保存されています。次のmrrsget_stringをコールされるまで有効です。このデータは必要であれば、ユーザバッファにコピーして下さい。

[mrrsget_stringの使用方法]ddaattaa__vvaalluuee == mmrrrrssggeett__ssttrriinngg ((rreettrriieevvaall__ddeesscc)),, aattttrr__nnuummbbeerr));;

mrgetend

mrget関数で呼びだしたクオリフィケーションディスクリプタのクリーンアップを行います。忘れるとメモリリークの原因となりますのでご注意ください。

[mrgetendの使用方法]mmrrggeetteenndd ((rreettrriieevvaall__ddeesscc));;

Empress 導入ガイド

31

Page 32: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

組込みSQLを用いたデータ検索のサンプルこのサンプルでは、t1テーブルに対してselect * from t1 where s2 = "Miller"というSQL文を実行しています。

今回使用するデータベース

データベース testdb

テーブル作成用SQL create table t1(s1 nlschar, s2 nlschar);

登録済みデータ用SQL insert into t1 values ('Roy','Smith');insert into t1 values ('Bob','Miller');

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

mmrrrreettrrddeess** retrieve_desc; /* クオリフィケーションディスクリプタ */

char* data_value;

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt(()))

{

fprintf (stderr, "Unable to initialize Empress\n");

mmsseenndd (());

return 1;

}

/* SELECT SQLコマンドの実行を行います */

retrieve_desc = mmrreexxeeccqquueerryy ((DDAATTAABBAASSEE,,

""sseelleecctt ** ffrroomm tt11 wwhheerree ss22 == ''MMiilllleerr''"",, NNUULLLL));

/* クオリフィケーションディスクリプタがNULLの場合はエラーメッセージを取得します */

if (retrieve_desc == NULL)

{

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg(()));

return 1;

}

/* 検索したresultsetからレコードを取得します */

while (mmrrggeett ((rreettrriieevvee__ddeesscc)) == MMSSMMRR__GGEETT__OOKK)

{

/* 検索したカーソルから最初のアトリビュート値を取得します */

data_value = mmrrrrssggeett__ssttrriinngg ((rreettrriieevvee__ddeesscc,, 11));

printf ("%-22s", data_value);

/* 検索したカーソルから2番目のアトリビュート値を取得します */

data_value = mmrrrrssggeett__ssttrriinngg ((rreettrriieevvee__ddeesscc,, 22));

printf ("%-12s\n", data_value);

}

/* mrget関数で呼びだしたクオリフィケーションディスクリプタのクリーンアップを行います */

mmrrggeetteenndd ((rreettrriieevvee__ddeesscc));

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

32

Page 33: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

mrのみを用いた開発mrのみでプログラムを作成する方法を解説します。処理時間の高速化と小フットプリントを重視するプログラムを作成したい場合お薦めしています。

1.テーブルのオープンとクローズ

テーブルへのアクセスの第一ステップは、テーブルをオープンし、テーブルディスクリプタを取得することです。 mropen関数が、テーブルをオープンしテーブルディスクリプタを返します。 mropen関数では、データディクショナリで設定されているロックレベルをテーブルに設定します。mropen関数でオープンしたテーブルは、最後にmrclose関数でクローズする必要があります。

関数 解説

mropen

テーブルをオープンします。

[mropenの使用方法]ttaabbllee__ddeesscc == mmrrooppeenn ((ddaattaabbaassee__nnaammee,, ttaabbllee__nnaammee,, mmooddee));;

モードは以下の通りです。r: 読取りモード u: 更新モード n: ダーティリードモード

mrclose

テーブルをクローズし、テーブルがロックされているときにはロックを解放します。

[mrcloseの使用方法]ffllaagg == mmrrcclloossee ((ttaabbllee__ddeesscc));;

以下の例では、loansテーブルを更新モードでオープンしています。

今回使用するデータベース

データベース testdb

テーブル作成用SQL create loans (name ECHAR (25, 1), date EDATE (1), amount DOLLAR (6, 1));

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

mmrrddeess** loans_tabdesc; /* テーブルディスクリプタ */

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt (()))

{

fprintf (stderr, "Unable to initialize Empress\n");

msend();

return 1;

}

/* テーブルを更新モードで開きます */

if ((loans_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""llooaannss"",, ''uu''))) == NULL)

{

fprintf (stderr, "Unable to open the table\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* テーブルをクローズします */

else if (!mmrrcclloossee ((llooaannss__ttaabbddeesscc)))

Empress 導入ガイド

33

Page 34: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

{

fprintf (stderr, "Unable to close the table\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

34

Page 35: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

2. アトリビュートディスクリプタ取得

アトリビュートのデータを扱う場合はアトリビュートディスクリプタを取得する必要があります。これにはmrngeta関数を使用します。※ アトリビュート番号によってディスクリプタを取得するmrngeti関数もあります。

関数 解説

mrngeta

アトリビュートディスクリプタを取得します。

[mrngetaの使用方法]aattttrr__ddeesscc == mmrrnnggeettaa ((ttaabbllee__ddeesscc,, aattttrr__nnaammee));;

以下のサンプルでは、mrngeta関数を使用して、personnelテーブル内のアトリビュートに対して、アトリビュートディスクリプタを取得します。

今回使用するデータベース

データベース testdb

テーブル作成用SQL

CREATEcreate personnel (number INTEGER, name ECHAR (25, 1), phone ECHAR (15,1));

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

mmrrddeess** pers_tabdesc; /* テーブルディスクリプタ */

mmrraaddeess** number_attrdesc; /* numberのアトリビュートディスクリプタ */

mmrraaddeess** name_attrdesc; /* nameのアトリビュートディスクリプタ */

mmrraaddeess** phone_attrdesc; /* phoneのアトリビュートディスクリプタ */

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt (()))

{

fprintf (stderr, "Unable to initialize Empress\n");

mmsseenndd(());

return 1;

}

/* テーブルを読取モードで開きます */

if ((pers_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""ppeerrssoonnnneell"",, ''rr''))) == NULL)

{

fprintf (stderr, "Unable to open the table\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

mmsseenndd(());

return 1;

}

/* mrngeta関数でアトリビュートディスクリプタを取得します */

if ((number_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""nnuummbbeerr""))) == NULL)

{

fprintf (stderr, "Unable to locate attribute 'number' in the table\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

if ((name_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""nnaammee""))) == NULL)

{

fprintf (stderr, "Unable to locate attribute 'name' in the table\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

Empress 導入ガイド

35

Page 36: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

}

if ((phone_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""pphhoonnee""))) == NULL)

{

fprintf (stderr, "Unable to locate attribute 'phone' in the table\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* テーブルをクローズします */

if (!mmrrcclloossee ((ppeerrss__ttaabbddeesscc)))

{

fprintf (stderr, "Unable to close the table\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

36

Page 37: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

3.レコードディスクリプタ取得

レコードを扱うために、レコードを保存するスペースを割当てる必要があります。mrmkrec関数を使用します。使用後は、mrfrrec関数を使用して解放する必要があります。

関数 解説

mrmkrec

mrmkrec関数でレコードディスクリプタを取得します。

[mrmkrecの使用方法]rreeccoorrdd__ddeesscc == mmrrmmkkrreecc ((ttaabbllee__ddeesscc));;

以下のサンプルでは、mrmkrec関数を使用して、loansテーブルレコードディスクリプタを作成し、その後に割当てられたスペースを解放します。

今回使用するデータベース

データベース testdb

テーブル作成用SQL cleate loans (name ECHAR (25, 1), date EDATE (1), amount DOLLAR (6, 1));

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

mmrrddeess** loans_tabdesc; /* テーブルディスクリプタ */

mmrrrrddeess** loans_recdesc; /* レコードディスクリプタ */

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt (()))

{

fprintf (stderr, "Unable to initialize Empress\n");

mmsseenndd(());

return 1;

}

/* テーブルを読取モードで開きます */

if ((loans_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""llooaannss"",, ''rr''))) == NULL)

{

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

mmsseenndd(());

return 1;

}

/* レコードディスクリプタを取得します */

if ((loans_recdesc = mmrrmmkkrreecc ((llooaannss__ttaabbddeesscc))) == NULL)

{

fprintf (stderr, "ERROR in getting record descriptor\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* レコードディスクリプタを解放します */

else if (!mmrrffrrrreecc ((llooaannss__rreeccddeesscc)))

{

fprintf (stderr, "ERROR in freeing record descriptor\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* テーブルをクローズします */

if (!mmrrcclloossee ((llooaannss__ttaabbddeesscc)))

{

Empress 導入ガイド

37

Page 38: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

fprintf (stderr, "Unable to close the table\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

38

Page 39: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

4.テーブルへのデータ登録

テーブルへのレコードを追加するためには、以下の作業が必要になります。

アトリビュートディスクリプタに値を割り当てます。mrputvs関数を使用します。1.テーブル(レコードディスクリプタ)にレコードを挿入します。mradd関数を使用します。2.データ登録操作を完了し、テーブルの内部整理を行います。mraddend関数を使用します。3.レコードディスクリプタを開放します。mrfrrec関数を使用します。4.

関数 解説

mrputvs

レコード内のアトリビュートに、外部フォーマット値を割当てます。

[mrputvsの使用方法]ffllaagg == mmrrppuuttvvss ((rreeccoorrdd__ddeesscc,, aattttrr__ddeesscc,, vvaalluuee));;

mraddテーブルにレコードを挿入します。

[mraddの使用方法]ffllaagg == mmrraadddd ((rreeccoorrdd__ddeesscc));;

mraddend

データ登録操作を完了し、テーブルの内部整理を行います。

[mraddendの使用方法]ffllaagg == mmrraaddddeenndd ((rreeccoorrdd__ddeesscc));;

値をレコードディスクリプタに割当てるには、以下の3つの関数が使用されます。

mrputvs アトリビュートに割当てられる値が、外部フォーマットである場合

mrputvi アトリビュートに割当てられる値が、Cのinteger値である場合

mrputi アトリビュートに割当てられる値が内部フォーマットアトリビュート値のポインタである場合通常mrputiが一番早い方法です。

レコードにアトリビュート値が割当てられている場合、そのレコードはテーブルに追加することができます。 これはmradd関数によって実行されます。テーブルへの挿入が終了した場合、mraddend関数を呼び出してください。テーブルのヘッダの整理を行います。

※ 複数レコードを追加するときmraddendは最後に一回だけ呼び出して下さい。更に高速化が要求されるときにはEmpressサポートに問い合わせてください。

以下のサンプルでは、loansテーブル内にレコードを1つ挿入します。

今回使用するデータベース

データベース testdb

テーブル作成用SQL create loans (name ECHAR (25, 1), date EDATE (1), amount DOLLAR (6, 1));

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

mmrrddeess** loans_tabdesc; /* テーブルディスクリプタ */

mmrrrrddeess** loans_recdesc; /* レコードディスクリプタ */

mmrraaddeess** name_attrdesc; /* nameのアトリビュートディスクリプタ */

mmrraaddeess** date_attrdesc; /* dateのアトリビュートディスクリプタ */

mmrraaddeess** amount_attrdesc; /* amountのアトリビュートディスクリプタ */

/* mrインターフェースの初期化を行います */

Empress 導入ガイド

39

Page 40: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

if (!mmssiinniitt (()))

{

fprintf (stderr, "Unable to initialize Empress\n");

mmsseenndd (());

return 1;

}

/* テーブルを更新モードで開きます */

loans_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""llooaannss"",, ''uu''));

/* mrngeta関数でアトリビュートディスクリプタを取得します */

name_attrdesc = mmrrnnggeettaa ((llooaannss__ttaabbddeesscc,, ""nnaammee""));

date_attrdesc = mmrrnnggeettaa ((llooaannss__ttaabbddeesscc,, ""ddaattee""));

amount_attrdesc = mmrrnnggeettaa ((llooaannss__ttaabbddeesscc,, ""aammoouunntt""));

/* レコードディスクリプタを取得します */

loans_recdesc = mmrrmmkkrreecc ((llooaannss__ttaabbddeesscc));

/* アトリビュートnameに、外部フォーマット(Jones)を割当てます */

if (! mmrrppuuttvvss ((llooaannss__rreeccddeesscc,, nnaammee__aattttrrddeesscc,, ""JJoonneess"")))

{

fprintf (stderr, "Name conversion unsuccessful\n");

mmrrffrrrreecc ((llooaannss__rreeccddeesscc));

mmrrcclloossee ((llooaannss__ttaabbddeesscc));

mmsseenndd(());

return 1;

}

/* アトリビュートdateに、外部フォーマット(2 July 2010)を割当てます */

else if (! mmrrppuuttvvss ((llooaannss__rreeccddeesscc,, ddaattee__aattttrrddeesscc,, ""22 JJuullyy 22001100"")))

{

fprintf (stderr, "Date conversion unsuccessful\n");

mmrrffrrrreecc ((llooaannss__rreeccddeesscc));

mmrrcclloossee ((llooaannss__ttaabbddeesscc));

mmsseenndd(());

return 1;

}

/* アトリビュートamountに、外部フォーマット($75.00)を割当てます */

else if (! mmrrppuuttvvss ((llooaannss__rreeccddeesscc,, aammoouunntt__aattttrrddeesscc,, ""$$7755..0000"")))

{

fprintf (stderr, "Amount conversion unsuccessful\n");

mmrrffrrrreecc ((llooaannss__rreeccddeesscc));

mmrrcclloossee ((llooaannss__ttaabbddeesscc));

mmsseenndd(());

return 1;

}

/* mradd関数でテーブルにレコードを挿入します */

if (!mmrraadddd ((llooaannss__rreeccddeesscc)))

{

fprintf (stderr, "ERROR in adding record\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* データ登録操作を完了し、テーブルの内部整理を行います */

if (!mmrraaddddeenndd ((llooaannss__rreeccddeesscc)))

{

fprintf (stderr, "ERROR in flushing cache\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

Empress 導入ガイド

40

Page 41: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

}

/* レコードディスクリプタを解放します */

if (!mmrrffrrrreecc ((llooaannss__rreeccddeesscc)))

{

fprintf (stderr, "ERROR in freeing record buffers\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* テーブルをクローズします */

if (!mmrrcclloossee ((llooaannss__ttaabbddeesscc)))

{

fprintf (stderr, "Unable to close the table\n");

fprintf (stderr, "mroperr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

41

Page 42: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

5. データの検索

データを検索するには、以下の6グループの関数が使用されます。検索条件がある場合、テーブルと条件を関連付けるクオリフィケーションディスクリプタmrretrdes*を使用します。

No. 役割 関数名 その他

1 データベース検索の初期化 mrgetbeginmrsrbegin

検索条件、ソート条件(order by)を設定します。mrgetbegin関数はソート無しの場合、mrsrbegin関数はソート有の場合使用します。

2 resultsetの取得 mrget他にも以下のような関数があります。mrprev関数、 mrreget関数、 mrreprev関数mrxget関数、mrgetrec関数

3 アトリビュート値の保存用のスペース割当て mrspv

4 アトリビュート値の取得

mrgetvsmrgetvimrgetimrgfunc

mrgetvs、mrgetvi、mrgetiはresutsetからアトリビュートの値を取得します。mrgfunc関数は集計関数を実行します。

5 後に使用するレコードへのポインタを取得 mrgetptr 詳しい使い方はEmpressのサポートにお問い合わせ下さい。

6 検索後のクリーンアップ mrgetendmrfree

関数 解説

mrspv

外部フォーマットのアトリビュート値を保存するためにアトリビュート値の保存用のスペース割当てます。

[mrspvの使用方法]ssppaaccee == mmrrssppvv ((aattttrr__ddeesscc));;mrfreeで解放しない限り、スペースは割付けられたままです。 TEXTまたはBULKデータタイプのアトリビュートには使用できません。

mrgetbegin

検索の初期化を行います。

[mrgetbeginの使用方法]rreettrriieevvaall__ddeesscc == mmrrggeettbbeeggiinn ((qquuaall__ddeesscc,, rreeccoorrdd__ddeesscc__11,, rreeccoorrdd__ddeesscc__22,, ........ ,,

NNUULLLL));;

retrieval_desc mrgetに渡されるクオリフィケーションディスクリプタへのポインタ(mrretrdes*)です。

qual_descmrq関数から返されるクオリフィケーションディスクリプタへのポインタ(mrqdes*)です。 検索条件が与えられなかった場合、0に置き換えられます。ここがwhere節に該当します。

record_desc_1~n mrmkrecによって返されるポインタ(mrrdes*)です。SQL文のfrom節 table_1, table_2 ~,table_nに該当します。

NULL NULLターミネートが必要です。

mrget

resultsetからデータを取得します。

[mrgetの使用方法]ffllaagg == mmrrggeett ((rreettrriieevvaall__ddeesscc));;成功した場合MSMR_GET_OKを返します。 レコードがすべて検索された場合はMSMR_GET_EORを、 レコードがロックされている場合、失敗した場合はMSMR_GET_ERRを返します。

Empress 導入ガイド

42

Page 43: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

mrcopyvレコードとアトリビュートを指定して、値を外部フォーマットの形で取得します。

[mrcopyvの使用方法]ffllaagg == mmrrccooppyyvv ((rreeccoorrdd__ddeesscc,, aattttrr__ddeesscc,, ssppaaccee));;

mrgetend

データ取得後のクリーンアップを行ないます。

[mrgetendの使用方法]mmrrggeetteenndd ((rreettrriieevvaall__ddeesscc));;

mrfree

mrspv関数に割当てられたアトリビュート値の保存用のスペースを解放します。

[mrfreeの使用方法]mmrrffrreeee ((ssppaaccee));;spaceはmrspv関数の戻り値です。

サンプル1 where節がない検索このサンプルでは、personnelテーブルに対して全てのレコードの検索をして、名前と電話番号を表示します。

今回使用するデータベース

データベース testdb

テーブル作成用SQL create personnel (number INTEGER, name ECHAR (25, 1), phone ECHAR (15, 1),date EDATE (1));

登録済みデータ用SQL

insert into personnel values(10,'Kilroy','03-9999-9991','12 January 2014');insert into personnel values(3,'Jones','03-9999-9992','13 January 2014');insert into personnel values(5,'Mosca','04-9999-9993','12 February 2014');insert into personnel values(17,'Wladislaw','04-9999-9994','13 February 2014');insert into personnel values(8,'Peterson','03-9999-9995','12 March 2014');insert into personnel values(4,'Scarlatti','03-9999-9996','12 April 2014');

実行する操作に相当するSQL select name, phone from personnel

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

mmrrddeess** pers_tabdesc; /* テーブルディスクリプタ */

mmrraaddeess** name_attrdesc; /* アトリビュートディスクリプタ */

mmrraaddeess** phone_attrdesc; /* アトリビュートディスクリプタ */

mmrrrrddeess** pers_recdesc; /* レコードディスクリプタ */

mmrrrreettrrddeess** retrieve_desc; /* テーブルと条件を関連付けるリトライバルディスクリプタ */

int employees;

char* name_value;

char* phone_value;

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt(()))

{

fprintf(stderr, "Unable to initialize Empress\n");

mmsseenndd (());

return 1;

}

/* テーブルを読取モードで開きます */

pers_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""ppeerrssoonnnneell"",, ''rr''));

Empress 導入ガイド

43

Page 44: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

/* レコードディスクリプタを取得します */

pers_recdesc = mmrrmmkkrreecc ((ppeerrss__ttaabbddeesscc));

/* アトリビュートディスクリプタを取得します */

name_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""nnaammee""));

phone_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""pphhoonnee""));

/* 外部フォーマットのアトリビュート値を保存するために

    アトリビュート値の保存用のスペース割当てます。 */

name_value = mmrrssppvv ((nnaammee__aattttrrddeesscc));

phone_value = mmrrssppvv ((pphhoonnee__aattttrrddeesscc));

printf ("名前 電話番号\n");

employees = 0;

/* 検索の初期化を行います。where節がないために、第一パラメータにNULLをセットします。 */

retrieve_desc = mmrrggeettbbeeggiinn ((NNUULLLL,, ppeerrss__rreeccddeesscc,, NNUULLLL));

/* 各レコードを取得するループを実行します */

while (mmrrggeett ((rreettrriieevvee__ddeesscc)) ==== MMSSMMRR__GGEETT__OOKK)

{

/* レコードとアトリビュートを指定して、値を外部フォーマットの形で取得します */

mmrrccooppyyvv ((ppeerrss__rreeccddeesscc,, nnaammee__aattttrrddeesscc,, nnaammee__vvaalluuee)); /* 名前 */

mmrrccooppyyvv ((ppeerrss__rreeccddeesscc,, pphhoonnee__aattttrrddeesscc,, pphhoonnee__vvaalluuee)); /* 電話番号 */

printf ("%-12s%-12s\n", name_value, phone_value);

employees++;

}

/* レコード検索を終了します */

mmrrggeetteenndd ((rreettrriieevvee__ddeesscc));

printf ("\nTotal Number of Employees = %d\n", employees);

/* mrspv関数に割当てられたスペースを解放します */

mmrrffrreeee ((nnaammee__vvaalluuee));

mmrrffrreeee ((pphhoonnee__vvaalluuee));

/* レコードディスクリプタスペース割当を解放します */

if (!mmrrffrrrreecc ((ppeerrss__rreeccddeesscc)))

{

fprintf (stderr, "ERROR in freeing record buffers\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* テーブルをクローズします */

if (!mrclose (pers_tabdesc))

{

fprintf (stderr, "Unable to close the table\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* mrインターフェースのクリーンアップを行います */

mmsseenndd (());

return 0;

}

Empress 導入ガイド

44

Page 45: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

サンプル2 ソートを伴う検索関数 解説

mrsrtbegin

ソートのある検索の初期化を行います。

[mrsrtbeginの使用方法]rreettrriieevvaall__ddeesscc == mmrrssrrttbbeeggiinn ((qquuaall__ddeesscc,, rreeccoorrdd__ddeesscc__11,, rreeccoorrdd__ddeesscc__22,, ........ ,,

NNUULLLL,, aattttrr__ddeesscc__11,, ttyyppee,, aattttrr__ddeesscc__22,, ttyyppee,, ........ ,, NNUULLLL));;

retrieval_desc mrgetから返されるクオリフィケーションディスクリプタのポインタ (mrretrdes*)です。

qual_descmrq~関数群によって返される、 SQLのwhere節に該当するクオリフィケーションディスクリプタのポインタ(mrqdes*)です。 検索条件がない場合、NULLに置き換えられます。

indicator'u'または's'はユニークなソート(u)か、標準的なソート(s)かを意味しています。これはシングルクォートで囲む必要があります。

record_desc_1~nmrmkrecから返されるポインタ(mrrdes*)です。必要な数だけ指定できます。SQL文のfrom節 table_1, table_2 ~ ,table_nに該当します。

NULL レコードディスクリプタのNULLターミネートが必要です。

attr_desc_1~nmrngeta または mrigetaによって返されるポインタ(mrades*)です。必要な数だけ指定できます。SQL文のorder by節に該当します。

type 'a'または 'd'は、ソート順を昇順(ascending)にするか降順(descending)にするかを指定します。

NULL order byで使用しているアトリビュートディスクリプタのNULLターミネートが必要です。

このサンプルでは、personnelテーブルに対して全てのレコードの検索をして、名前の降順でソートを行います。

今回使用するデータベース

データベース testdb

テーブル作成用SQL

create personnel (number INTEGER, name ECHAR (25, 1), phone ECHAR (15, 1), dateEDATE (1));

登録済みデータ用SQL

insert into personnel values(10,'Kilroy','03-9999-9991','12 January 2014');insert into personnel values(3,'Jones','03-9999-9992','13 January 2014');insert into personnel values(5,'Mosca','04-9999-9993','12 February 2014');insert into personnel values(17,'Wladislaw','04-9999-9994','13 February 2014');insert into personnel values(8,'Peterson','03-9999-9995','12 March 2014');insert into personnel values(4,'Scarlatti','03-9999-9996','12 April 2014');

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

mmrrddeess** pers_tabdesc; /* テーブルディスクリプタ */

mmrraaddeess** name_attrdesc; /* アトリビュートディスクリプタ */

mmrraaddeess** phone_attrdesc; /* アトリビュートディスクリプタ */

mmrrrrddeess** pers_recdesc; /* レコードディスクリプタ */

mmrrrreettrrddeess** retrieve_desc; /* テーブルと条件を関連付ける

クオリフィケーションディスクリプタ */

int employees;

Empress 導入ガイド

45

Page 46: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

char* name_value;

char* phone_value;

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt(()))

{

fprintf(stderr, "Unable to initialize Empress\n");

mmsseenndd (());

return 1;

}

/* テーブルを読取モードで開きます */

pers_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""ppeerrssoonnnneell"",, ''rr''));

/* レコードディスクリプタを取得します */

pers_recdesc = mmrrmmkkrreecc ((ppeerrss__ttaabbddeesscc));

/* アトリビュートディスクリプタを取得します */

name_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""nnaammee""));

phone_attrdesc = mmrrnnggeettaa ((ppeerrss__ttaabbddeesscc,, ""pphhoonnee""));

/* 外部フォーマットのアトリビュート値を保存するために

    アトリビュート値の保存用のスペース割当てます。 */

name_value = mmrrssppvv ((nnaammee__aattttrrddeesscc));

phone_value = mmrrssppvv ((pphhoonnee__aattttrrddeesscc));

printf ("名前 電話番号\n");

employees = 0;

/* クオリフィケーションディスクリプタにカーソルをセットします

第1パラメータのNULLは検索条件、

第2パラメータのsはソートを表します */

retrieve_desc = mmrrssrrttbbeeggiinn ((NNUULLLL,, ''ss'',, ppeerrss__rreeccddeesscc,, NNUULLLL,,

nnaammee__aattttrrddeesscc,, ''dd'',, NNUULLLL));

/* 各レコードを取得するループを実行します */

while (mmrrggeett ((rreettrriieevvee__ddeesscc)) ==== MMSSMMRR__GGEETT__OOKK)

{

/* レコードとアトリビュートを指定して値を外部フォーマットの形で取得します */

mmrrccooppyyvv ((ppeerrss__rreeccddeesscc,, nnaammee__aattttrrddeesscc,, nnaammee__vvaalluuee)); /* 名前 */

mmrrccooppyyvv ((ppeerrss__rreeccddeesscc,, pphhoonnee__aattttrrddeesscc,, pphhoonnee__vvaalluuee)); /* 電話番号 */

printf ("%-12s%-12s\n", name_value, phone_value);

employees++; /* レコード数をインクリメントしています */

}

/* レコード検索終了 */

mmrrggeetteenndd ((rreettrriieevvee__ddeesscc));

/* レコード数を入れていたemployeesをつかってレコード数を表示します */

printf ("\nTotal Number of Employees = %d\n", employees);

/* mrspv関数に割当てられたスペースを解放します */

mmrrffrreeee ((nnaammee__vvaalluuee));

mmrrffrreeee ((pphhoonnee__vvaalluuee));

/* レコードディスクリプタスペース割当を解放します */

Empress 導入ガイド

46

Page 47: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

if (!mmrrffrrrreecc ((ppeerrss__rreeccddeesscc)))

{

fprintf (stderr, "ERROR in freeing record buffers\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* テーブルをクローズします */

if (!mrclose (pers_tabdesc))

{

fprintf (stderr, "Unable to close the table\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* mrインターフェースのクリーンアップを行います */

mmsseenndd (());

return 0;

}

Empress 導入ガイド

47

Page 48: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

検索条件の作成

SQL文のWHERE句に似た条件を作成するためには、mrq~ 関数を使用します。これらの関数は mrgetbegin関数グループの1つに受け渡される、クオリフィケーションディスクリプタを返します。

関数 解説

mrqcon

アトリビュート値をファイルフォーマットの定数と比較します。 例えば、アトリビュート = 検索値、アトリビュート >= 検索値、アトリビュート != 検索値というような場合です。検索値には、mrcvt関数群の1つによって返されるファイルフォーマットへのポインタを使用します。例)qual_desc = mrqcon (">", price_attrdesc, mrcvt (amount_attrdesc, amount));

[mrqconの使用方法]qquuaall__ddeesscc == mmrrqqccoonn ((ooppeerraattoorr,, aattttrr__ddeesscc,, &&vvaarr));;

qquuaall__ddeesscc == mmrrqqccoonn ((ooppeerraattoorr,, aattttrr__ddeesscc,, mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg))));;

qual_desc mrgetbeginで使用されるクオリフィケーションディスクリプタのポインタ(void*)です。

operator 次に示すいずれかの文字列(const char*)。">", "<", ">=", "<=", "=", "!=" ("~="は"!="と同義です。)

attr_desc mrigetaまたは mrngetaから返るアトリビュートディスクリプタです。

var ファイルフォーマットの定数を含む値です。

string 外部アトリビュートフォーマット値のポインタ(const char*)です。

[mrcvtの使用方法]vvaalluuee == mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg));;

value ファイルフォーマットのアトリビュート値へのポインタ(void*)です。

attr_desc mrigeta または mrngetaによって返されるアトリビュートディスクリプタ(mrades*)です。

string 外部フォーマットのアトリビュート値へのポインタ(const char*)です。

mrqrng

アトリビュート値を指定範囲と比較します。

[mrqrngの使用方法]qquuaall__ddeesscc == mmrrqqrrnngg ((aattttrr__ddeesscc,, lloowweerr__lliimmiitt,, lliimmiitt__ttyyppee__11,, uuppppeerr__lliimmiitt,,

lliimmiitt__ttyyppee__22));;

qquuaall__ddeesscc == mmrrqqrrnngg ((aattttrr__ddeesscc,, mmrrccvvttvv ((aattttrr__ddeesscc,, ssttrriinngg__11)),,

lliimmiitt__ttyyppee__11,, mmrrccvvttvv22 ((aattttrr__ddeesscc,, ssttrriinngg__22)),, lliimmiitt__ttyyppee__22));;

qual_desc mrgetbeginで使用されるクオリフィケーションディスクリプタのポインタ(mrqdes*)です。

attr_desc mrigetaまたはmrngetaから返るアトリビュートディスクリプタ(mrades*)です。

string_1 外部フォーマットのアトリビュート値へのポインタ(const char*)です。

string_2 外部フォーマットのアトリビュート値へのポインタ(const char*)です。

limit_type_1 'i' または 'e'です。下限に指定した値を限界値に含むか (inclusive)、含まないか(exclusive)の指定です。

limit_type_2 'i' または 'e'です。上限に指定した値を限界値に含むか (inclusive)、含まないか(exclusive)の指定です。

lower_limit 範囲の下限値を表すファイルフォーマット値へのポインタ (void*)です。

upper_limit 範囲の上限値を表すファイルフォーマット値へのポインタ(void*)です。

Empress 導入ガイド

48

Page 49: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

mrqatr

2つのアトリビュート値を比較します。

[mrqatrの使用方法]qquuaall__ddeesscc == mmrrqqaattrr ((ooppeerraattoorr,, aattttrr__ddeesscc__11,, aattttrr__ddeesscc__22));;

qual_desc mrgetbeginまたはmrsrtbeginで使用されるクオリフィケーションディスクリプタ(mrqdes*)です。

operator 次のいずれかの一つの文字列(const char*)です。"=", ">=", ">", "<=", "<", "!=" ("~="と"!="は同義です。)

attr_desc_1 mrigeta または mrngetaから返るアトリビュートディスクリプタ(mrades*)です。

attr_desc_2 mrigeta または mrngetaから返るアトリビュートディスクリプタ(mrades*)です。

mrqmch

アトリビュート値を定数とマッチングします。

[mrqmchの使用方法]qquuaall__ddeesscc == mmrrqqmmcchh ((ooppeerraattoorr,, aattttrr__ddeesscc,, ppaatttteerrnn));;

qual_desc mrgetbeginで使用される クオリフィケーションディスクリプタ(mrqdes*)です。

operator 次の文字列(const char*)のうちの1つです。MATCH、SMATCH、 !MATCH、!SMATCH ("~"は"!"と同義語です。)

attr_desc mrigetaまたはmrngetaから返るアトリビュートディスクリプタ(mrades*)です。

pattern パターンのポインタ(const char*)です。

mrqnul

アトリビュート値をNULLと比較します。

[mrqnulの使用方法]qquuaall__ddeesscc == mmrrqqnnuull ((ooppeerraattoorr,, aattttrr__ddeesscc));;

qual_desc mrgetbeginで使用されるクオリフィケーションディスクリプタ(mrqdes*)です。

operator 次に示す文字列(const char*)です。=、!=、(~= は != と同義語です。)

attr_desc mrigeta または mrngetaから返るアトリビュートディスクリプタ(mrades*)です。

mrqseq

アトリビュート値が文字列と等しいか調べます。

[mrqseqの使用方法]qquuaall__ddeesscc == mmrrqqsseeqq ((aattttrr__ddeesscc,, ssttrriinngg));;

qual_desc mrgetbegin または mrsrtbeginで使用されるクオリフィケーションディスクリプタ(mrqdes*)です。

attr_desc mrigetaまたはmrngetaから返るアトリビュートディスクリプタ(mrades*)です。

string 外部フォーマットのアトリビュート値へのポインタ(const char*)です。

mrqieq

アトリビュート値が整数(C integer)と等しいか調べます。

[mrqieqの使用方法]qquuaall__ddeesscc == mmrrqqiieeqq ((aattttrr__ddeesscc,, iinntteeggeerr));;

Empress 導入ガイド

49

Page 50: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

qual_desc mrgetbegin または mrsrtbeginを使用したクオリフィケーションディスクリプタ(void*) です。

attr_desc mrigetaまたはmrngetaから返るアトリビュートディスクリプタ(void*) です。

integer Integer値またはInteger変数です。

mrqand

2つの条件をAND結合します。

[mrqandの使用方法]qquuaall__ddeesscc == mmrrqqaanndd ((qquuaall__ddeesscc__11,, qquuaall__ddeesscc__22));;

qual_desc mrgetbeginまたは mrsrtbeginによって返されるクオリフィケーションディスクリプタ(mrqdes*)です。

qual_desc_1 mrq~関数によって返されるクオリフィケーションディスクリプタ(mrqdes*) です。

qual_desc_2 mrq~関数によって返されるクオリフィケーションディスクリプタ(mrqdes*)です。

mrqor

2つの条件をOR結合します。

[mrqorの使用方法]qquuaall__ddeesscc == mmrrqqoorr ((qquuaall__ddeesscc__11,, qquuaall__ddeesscc__22));;

qual_desc クオリフィケーションディスクリプタ(mrqdes*)です。

qual_desc_1 mrq~関数によって返されるクオリフィケーションディスクリプタ(mrqdes*)です。

qual_desc_2 mrq~関数によって返されるクオリフィケーションディスクリプタ(mrqdes*)です。

mrqnot

比較条件を否定します。

[mrqnotの使用方法]qquuaall__ddeesscc == mmrrqqnnoott ((qquuaall__ddeesscc));;

qual_desc mrq~関数で使用されるクオリフィケーションディスクリプタ(mrqdes*)です。

mrqlst

以前に取得した、レコードへのポインタのリストで、レコードを制限します。

[mrqlstの使用方法]qquuaall__ddeesscc == mmrrqqllsstt ((ttaabbllee__ddeesscc,, aarrrraayy));;

qual_desc mrgetbegin または mrsrtbeginで使用される、クオリフィケーションディスクリプタ(void*)です。

table_desc mropenから返される、オープンされたテーブルディスクリプタ (mrdes*)です。

array mrgetptr関数によって取得した、レコードへのポインタ(long)配列です。

検索条件を伴う検索関数 解説

mrqrng

検索条件を作成します。SQLでは price > 3000 and price <=8000 の部分です。

mrqrng関数でアトリビュート値を与えられた範囲と比較します。 範囲の限界は、ファイルフォーマット値へのポインタとして指定されます。 比較する値には、mrcvt関数群(今回はmrcvtv関数とmrcvtv2関数)によって返されるポインタが使用されます。

Empress 導入ガイド

50

Page 51: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

[mrqrngの使用方法]qquuaall__ddeesscc == mmrrqqrrnngg ((aattttrr__ddeesscc,, lloowweerr__lliimmiitt,,

lliimmiitt__ttyyppee__11,, uuppppeerr__lliimmiitt,,

lliimmiitt__ttyyppee__22));;

qquuaall__ddeesscc == mmrrqqrrnngg ((aattttrr__ddeesscc,,

mmrrccvvttvv ((aattttrr__ddeesscc,, ssttrriinngg__11)),,

lliimmiitt__ttyyppee__11,,

mmrrccvvttvv22 ((aattttrr__ddeesscc,, ssttrriinngg__22)),,

lliimmiitt__ttyyppee__22));;

qual_desc mrgetbeginで使用されるクオリフィケーションディスクリプタ (mrqdes*)です。

attr_desc mrigetaまたはmrngetaから返るアトリビュートディスクリプタ(mrades*)です。

string_1 外部フォーマットのアトリビュート値へのポインタ(const char*)です。

string_2 外部フォーマットのアトリビュート値へのポインタ(const char*)です。

limit_type_1 'i' または 'e'です。下限に指定した値を限界値に含むか (inclusive)、含まないか(exclusive)の指定です。

limit_type_2 'i' または 'e'です。上限に指定した値を限界値に含むか (inclusive)、含まないか(exclusive)の指定です。

lower_limit 範囲の下限値を表すファイルフォーマット値へのポインタ (void*)です。

upper_limit 範囲の上限値を表すファイルフォーマット値へのポインタ(void*)です。

以下のサンプルは、mrqrng関数を使用して、金額が3001円以上8千円以下のレコードを検索します。

今回使用するデータベース

データベース testdb

テーブル作成用SQL create table products(pid smallint, name nlschar(40, 1, 0), price integer);

登録済みデータ用SQL

insert into products values(1, 'CD-R 700MB 50枚', 2000);insert into products values(2, 'CD-R 700MB 100枚', 4000);insert into products values(3, 'ワイヤレスマウス', 2800);insert into products values(4, '外付けHDD 500GB', 8000);insert into products values(5, '外付けHDD 1TB', 9000);

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

int ret;

mmrrddeess** prod_tabdesc; /* テーブルディスクリプタ */

mmrrrrddeess** prod_recdesc; /* レコードディスクリプタ */

mmrraaddeess** pid_attrdesc; /* pid用アトリビュートディスクリプタ */

mmrraaddeess** name_attrdesc; /* name用アトリビュートディスクリプタ */

mmrraaddeess** price_attrdesc; /* price用アトリビュートディスクリプタ */

mmrrqqddeess** qual; /* 条件関連付けディスクリプタ */

mmrrrreettrrddeess** retrieve_desc; /* テーブルと条件を関連付けるディスクリプタ */

Empress 導入ガイド

51

Page 52: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

char* pid_value;

char* name_value;

char* price_value;

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt(()))

{

fprintf (stderr, "Unable to initialize Empress\n");

mmsseenndd (());

return 1;

}

/* productsテーブルを読取モードで開きます */

prod_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""pprroodduuccttss"",, ''rr''));

/* レコードディスクリプタを作成します */

prod_recdesc = mmrrmmkkrreecc ((pprroodd__ttaabbddeesscc));

/* アトリビュートディスクリプタを作成します */

pid_attrdesc = mmrrnnggeettaa ((pprroodd__ttaabbddeesscc,, ""ppiidd""));

name_attrdesc = mmrrnnggeettaa ((pprroodd__ttaabbddeesscc,, ""nnaammee""));

price_attrdesc = mmrrnnggeettaa ((pprroodd__ttaabbddeesscc,, ""pprriiccee""));

/* mrspv関数で外部フォーマットアトリビュート値を保存するためのスペースを割当てます。*/

pid_value = mmrrssppvv ((ppiidd__aattttrrddeesscc));

name_value = mmrrssppvv ((nnaammee__aattttrrddeesscc));

price_value = mmrrssppvv ((pprriiccee__aattttrrddeesscc));

printf ("価格が3001円以上8000円以下の商品一覧\n\n");

printf ("%-8s%-22s%-12s\n", "PID", "Name", "Price");

/* mrqrng関数でアトリビュートの値をファイルフォーマットの定数と比較を設定します。

    範囲は 3001円〜~8000円です */

qual = mmrrqqrrnngg ((pprriiccee__aattttrrddeesscc,,

mmrrccvvttvv((pprriiccee__aattttrrddeesscc,, ""33000000"")),, ''ee'',,

mmrrccvvttvv22((pprriiccee__aattttrrddeesscc,, ""88000000"")),, ''ii''));

/* mrgetbegin関数で検索条件をレコードと関連付けます。 */

retrieve_desc = mmrrggeettbbeeggiinn ((qquuaall,, pprroodd__rreeccddeesscc,, NNUULLLL));

/* レコード検索開始 */

while (mmrrggeett ((rreettrriieevvee__ddeesscc)) ==== MMSSMMRR__GGEETT__OOKK)

{

/* アトリビュートの値を外部フォーマットの形で取得します (pid) */

ret = mmrrccooppyyvv ((pprroodd__rreeccddeesscc,, ppiidd__aattttrrddeesscc,, ppiidd__vvaalluuee));

if (ret == MMSSMMRR__OOKK)

printf ("%-4s", pid_value); /* pidのNULL以外の値 */

else if (ret == MMSSMMRR__NNUULLLL)

printf ("%-4s", "NULL"); /* pidの値がNULLのとき */

else

{

printf ("%s\n", "ERROR in getting 'pid'");

printf ("mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

break;

}

/* アトリビュートの値を外部フォーマットの形で取得します (name) */

Empress 導入ガイド

52

Page 53: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

ret = mmrrccooppyyvv ((pprroodd__rreeccddeesscc,, nnaammee__aattttrrddeesscc,, nnaammee__vvaalluuee));

if (ret == MMSSMMRR__OOKK)

printf ("%-22s\t", name_value); /* nameのNULL以外の値 */

else if (ret == MMSSMMRR__NNUULLLL)

printf ("%-22s\t", "NULL"); /* nameの値がNULLのとき */

else

{

printf ("%s\n", "ERROR in getting 'name'");

printf ("mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

break;

}

/* アトリビュートの値を外部フォーマットの形で取得します (price) */

ret = mmrrccooppyyvv ((pprroodd__rreeccddeesscc,, pprriiccee__aattttrrddeesscc,, pprriiccee__vvaalluuee));

if (ret == MMSSMMRR__OOKK)

printf ("%-12s\n", price_value); /* priceのNULL以外の値 */

else if (ret == MMSSMMRR__NNUULLLL)

printf ("%-12s\n", "NULL"); /* priceの値がNULLのとき */

else

{

printf ("%s\n", "ERROR in getting 'price'");

printf ("mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

break;

}

}

/* テーブルからのレコード検索後のクリーンアップを行います */

mmrrggeetteenndd ((rreettrriieevvee__ddeesscc));

/* mrspv関数でによって割り当てられたスペースを解放します */

mmrrffrreeee ((ppiidd__vvaalluuee));

mmrrffrreeee ((nnaammee__vvaalluuee));

mmrrffrreeee ((pprriiccee__vvaalluuee));

/* レコードディスクリプタスペース割当を解放します */

if (!mmrrffrrrreecc ((pprroodd__rreeccddeesscc)))

{

fprintf (stderr, "ERROR in freeing record buffers\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* テーブルをクローズします */

if (!mmrrcclloossee ((pprroodd__ttaabbddeesscc)))

{

fprintf (stderr, "Unable to close the table\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

53

Page 54: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

6. レコードの削除

レコードを削除するためには、以下の作業が必要になります。

検索条件を設定し、検索を行います。対象レコードは、mrgetbegin関数と検索条件関数により初期化され、mrget関数で特定されます。

1.

該当レコードを1レコードずつ削除します。mrdel関数を使用します。2.すべての削除が完了したら、mrdelend関数を使用します。3.

関数 解説

mrqcon

delete文のwhere節に該当するクオリフィケーションディスクリプタを作成します。mrqcon関数でアトリビュート値をファイルフォーマットの定数と比較します。

[mrqconの使用方法]qquuaall__ddeesscc == mmrrqqccoonn ((ooppeerraattoorr,, aattttrr__ddeesscc,, &&vvaarr));;

qquuaall__ddeesscc == mmrrqqccoonn ((ooppeerraattoorr,, aattttrr__ddeesscc,, mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg))));;

qual_desc mrgetbeginで使用されるクオリフィケーションディスクリプタ (void*)です。

operator 次に示すいずれかの文字列(const char*)。">", "<", ">=", "<=", "=", "!=" ("~="は"!="と同義です。)

attr_desc mrigeta または mrngeta から返るアトリビュートディスクリプタ(void*)です。

var ファイルフォーマットの定数を含む値です。

string 外部アトリビュートフォーマット値のポインタ(const char*)です。

mrcvt

外部フォーマットのアトリビュート値を、ファイルフォーマット(パブリックバッファ)に変換します。

[mrcvtの使用方法]vvaalluuee == mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg));;

value ファイルフォーマットのアトリビュート値へのポインタ(void*)です。

attr_desc mrigeta または mrngetaによって返されるアトリビュートディスクリプタ(mrades*)です。

string 外部フォーマットのアトリビュート値へのポインタ(const char*)です。

mrdel

テーブルから1レコードを削除します。

[mrdelの使用方法]ffllaagg == mmrrddeell ((rreeccoorrdd__ddeesscc));;

mrdelend

テーブルからのレコード削除後にクリーンアップ処理を実行します。

[mrdelendの使用方法]ffllaagg == mmrrddeelleenndd ((rreeccoorrdd__ddeesscc));;

以下のサンプルでは、2010年5月以前に作成されたレコードを削除しています。

今回使用するデータベース

データベース testdb

テーブル作成用SQL create loans (name ECHAR (25, 1), date EDATE (1), amount DOLLAR (6, 1));

登録済みデータ用SQLinsert into loans values('Mosca', '2 February 2010', '150.00');insert into loans values('Jones', '7 February 2010', '33.95');

Empress 導入ガイド

54

Page 55: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

insert into loans values('Kilroy', '16 February 2010 ', '250.00');insert into loans values('Wladislaw', '27 February 2010 ', '55.00');insert into loans values('Jones', '3 April 2010 ', '25.00');insert into loans values('Mosca', '4 May 2010 ', '200.00');insert into loans values('Wladislaw', '12 May 2010 ', '25.00');insert into loans values('Peterson', '6 June 2010 ', '50.00');insert into loans values('Wladislaw', '25 June 2010 ', '75.00');insert into loans values('Jones', '12 August 2010 ', '300.00');insert into loans values('Jones', '25 December 2010 ', '100.00');

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

mmrrddeess** loans_tabdesc; /* テーブルディスクリプタ */

mmrraaddeess** date_attrdesc; /* アトリビュートディスクリプタ */

mmrrrrddeess** loans_recdesc; /* レコードディスクリプタ */

mmrrqqddeess** qual; /* クオリフィケーションディスクリプタ */

mmrrrreettrrddeess** retrieve_desc; /* テーブルと条件を関連付けるディスクリプタ */

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt (()))

{

fprintf (stderr, "Unable to initialize Empress\n");

mmsseenndd (());

return 1;

}

/* テーブルを更新モードで開きます */

loans_tabdesc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""llooaannss"",, ''uu''));;

/* レコードディスクリプタを取得します */

loans_recdesc = mmrrmmkkrreecc ((llooaannss__ttaabbddeesscc));

/* mrngeta関数でアトリビュートディスクリプタを取得します */

date_attrdesc = mmrrnnggeettaa ((llooaannss__ttaabbddeesscc,, ""ddaattee""));

/* mrqcon関数でクオリフィケーションディスクリプタを設定します

検索条件として使用する値「1 May 2010」は外部フォーマット値なので

mrcvt関数で変換します。 */

qual = mmrrqqccoonn ((""<<"",, ddaattee__aattttrrddeesscc,, mmrrccvvtt ((ddaattee__aattttrrddeesscc,, ""11 MMaayy 22001100""))));

/* mrgetbegin関数で検索条件をレコードと関連付けます。 */

retrieve_desc = mmrrggeettbbeeggiinn ((qquuaall,, llooaannss__rreeccddeesscc,, NNUULLLL));

/* mrget関数で各レコードを取得するループを実行します

ここではmrdel関数による削除のみです。 */

while (mmrrggeett ((rreettrriieevvee__ddeesscc)) ==== MMSSMMRR__GGEETT__OOKK)

mmrrddeell ((llooaannss__rreeccddeesscc));

/* mrgetend関数でレコード検索終了します */

mmrrggeetteenndd ((rreettrriieevvee__ddeesscc));

/* mrdelend関数でテーブルからのレコード削除後にクリーンアップ処理を実行します。 */

if (!mmrrddeelleenndd ((llooaannss__rreeccddeesscc)))

{

Empress 導入ガイド

55

Page 56: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

fprintf (stderr, "ERROR in writing internal buffers\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* レコードディスクリプタを解放します */

if (!mmrrffrrrreecc ((llooaannss__rreeccddeesscc)))

{

fprintf (stderr, "ERROR in freeing record buffers\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* テーブルをクローズします */

if (!mmrrcclloossee ((llooaannss__ttaabbddeesscc)))

{

fprintf (stderr, "Unable to close the table\n");

fprintf (stderr, "mmrrooppeerrrr='%d' : %s\n", mmrrooppeerrrr, mmrreerrrrmmssgg (()));

}

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

56

Page 57: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

7. レコードの更新

テーブルへのレコードを更新するためには、2つのレコードディスクリプタを取得する必要があります。更新前用と更新後用です。

以下の順番で行います。

新旧データ用レコードディスクリプタを取得します。mrmkrec関数を使用します。1.検索条件を設定し、クオリフィケーションディスクリプタを作成します。mrqcon関数を使用します。2.クオリフィケーションディスクリプタを旧データ用レコードディスクリプタと関連付け、検索ディスクリプタを取得します。mrgetbegin関数を使用します。

3.

検索でヒットしたレコードを取得します。mrget関数を使用します。4.1レコード毎に旧データのレコードを新データのレコードにコピーします。mrcopyr関数を使用します。5.1レコード毎に新データのレコードに更新するアトリビュートの値を割り当てます。mrputvs関数、mrputi関数、mrputvi関数を使用します。

6.

1レコード毎にレコードを更新します。mrput関数を使用します。7.全てのヒットしたレコードの更新が完了したら、新旧データ用レコードディスクリプタを開放します。mrgetend関数とmrfreerec関数を使用します。

8.

関数 解説

mrqcon

update文のwhere節に該当するクオリフィケーションディスクリプタを作成します。mrqcon関数を使用して、アトリビュート値をファイルフォーマットの定数と比較します。 比較する値は、mrcvt関数で外部フォーマットからファイルフォーマットへ値を変換して使用します。

[mrqconの使用方法]qquuaall__ddeesscc == mmrrqqccoonn ((ooppeerraattoorr,, aattttrr__ddeesscc,, &&vvaarr));;

qquuaall__ddeesscc == mmrrqqccoonn ((ooppeerraattoorr,, aattttrr__ddeesscc,, mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg))));;

qual_desc mrgetbeginで使用されるクオリフィケーションディスクリプタのポインタ(void*)です。

operator 次に示すいずれかの文字列(const char*)。">", "<", ">=", "<=", "=", "!=" ("~="は"!="と同義です。)

attr_desc mrigetaまたはmrngetaから返るポインタ(void*)です。

var ファイルフォーマットの定数を含む値です。

string 外部アトリビュートフォーマット値のポインタ(const char*)です。

mrcvt

外部フォーマットのアトリビュート値を、ファイルフォーマット(パブリックバッファ)に変換します。

[mrcvtの使用方法]vvaalluuee == mmrrccvvtt ((aattttrr__ddeesscc,, ssttrriinngg));;

value ファイルフォーマットのアトリビュート値へのポインタ(void*)です。

attr_desc mrigetaまたはmrngetaによって返されるポインタ(mrades*)です。

string 外部フォーマットのアトリビュート値へのポインタ(const char*)です。

mrcopyr

レコードのアトリビュート値を、旧データ用レコードディスクリプタから新データのレコードディスクリプタにコピーします。

[mrcopyrの使用方法]ffllaagg == mmrrccooppyyrr ((nneeww__rreecc__ddeesscc,, oolldd__rreecc__ddeesscc));;

flag 関数が成功したかを表示する為の識別子(msbool)です。

new_rec_desc 新たに更新される新データ用として使用するポインタ (mrrdes*) です。mrmkrecによって返されているものです。これは old_rec_descとは異なるレコードディスクリプタでなくてはなりません。 しかし、同一テーブルから作成されたものであれば、他のどのレコードディスクリプタでも構いません。

Empress 導入ガイド

57

Page 58: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

old_rec_desc 更新前の旧データ用として使用するポインタ (mrrdes*) です。mrmkrecによって返されているものです。

以下のサンプルでは、テーブルt1のレコードのうち、s1の値がpeterのものをjulieに更新しています。mrmkrec関数でレコードディスクリプタを取得しますが、更新前の値と更新後の値を別のレコードディスクリプタに設定する必要があるため、新旧2つのレコードディスクリプタを取得することです。

今回使用するデータベース

データベース testdb

テーブル作成用SQL create table t1(s1 nlschar, s2 nlschar);

登録済みデータ用SQL insert into t1 values('peter', 'tim');

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

int main (int argc, char** argv)

{

mmrrddeess** tab_desc; /* テーブルディスクリプタ */

mmrrrreettrrddeess** ret_desc; /* テーブルと条件を関連付けるディスクリプタ */

mmrrqqddeess** qual_desc; /* クオリフィケーションディスクリプタ */

mmrrrrddeess** old_rec_desc; /* 旧(更新前)データ用レコードディスクリプタ */

mmrrrrddeess** new_rec_desc; /* 新データ用レコードディスクリプタ */

mmrraaddeess** s1_attr_desc; /* アトリビュートディスクリプタ */

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt (()))

{

fprintf(stderr, "Unable to initialize Empress\n");

mmsseenndd (());

return 1;

}

/* テーブルを更新モードで開きます */

if (ptrnil (tab_desc = mmrrooppeenn ((DDAATTAABBAASSEE,, ""tt11"",, ''uu''))))

{

fprintf (stderr, "Error:%s (%d)\n", mrerrmsg (), mmrrooppeerrrr);

mmsseenndd (());

return 2;

}

/* mrngeta関数でアトリビュートディスクリプタ(s1用)を取得します */

if (ptrnil (s1_attr_desc = mmrrnnggeettaa ((ttaabb__ddeesscc,, ""ss11""))))

{

fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

mmrrcclloossee ((ttaabb__ddeesscc));

mmsseenndd (());

return 3;

}

/* mrmkrec関数で旧データ用のレコードディスクリプタを取得します */

if (ptrnil (old_rec_desc = mmrrmmkkrreecc ((ttaabb__ddeesscc))))

{

fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

mmrrcclloossee ((ttaabb__ddeesscc));

mmsseenndd (());

Empress 導入ガイド

58

Page 59: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

return 4;

}

/* mrmkrec関数で新データ用のレコードディスクリプタを取得します */

if (ptrnil (new_rec_desc = mmrrmmkkrreecc ((ttaabb__ddeesscc))))

{

fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

mmrrcclloossee ((ttaabb__ddeesscc));

mmsseenndd (());

return 5;

}

/* mrqcon関数でクオリフィケーションディスクリプタを設定します(s1 = 'peter') */

if (ptrnil (qual_desc = mmrrqqccoonn ((""=="",,

ss11__aattttrr__ddeesscc,, mmrrccvvtt((ss11__aattttrr__ddeesscc,, ""ppeetteerr""))))))

{

fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

mmrrffrrrreecc ((oolldd__rreecc__ddeesscc));

mmrrffrrrreecc ((nneeww__rreecc__ddeesscc));

mmrrcclloossee ((ttaabb__ddeesscc));

mmsseenndd (());

return 6;

}

/* mrgetbegin関数で検索条件と旧データ用レコードディスクリプタを関連付けます */

if (ptrnil (ret_desc = mmrrggeettbbeeggiinn ((qquuaall__ddeesscc,, oolldd__rreecc__ddeesscc,, NNUULLLL))))

{

fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

mmrrffrrrreecc ((oolldd__rreecc__ddeesscc));

mmrrffrrrreecc ((nneeww__rreecc__ddeesscc));

mmrrcclloossee ((ttaabb__ddeesscc));

mmsseenndd (());;

return 7;

}

/* mrget関数で各レコードを取得するループを実行します */

if (mmrrggeett((rreett__ddeesscc)) ==== 11)

{

/* mrcopyr関数で各レコードの値新データ用のレコードディスクリプタにコピーします */

if (!mmrrccooppyyrr ((nneeww__rreecc__ddeesscc,, oolldd__rreecc__ddeesscc)))

{

fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

}

/* mrputvs関数で新データ用のレコードのアトリビュート(s1) に、

外部フォーマットの値「julie」を割当てます。 */

else if (!mmrrppuuttvvss ((nneeww__rreecc__ddeesscc,, ss11__aattttrr__ddeesscc,, ""jjuulliiee"")))

{

fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

}

/* mrput関数で、レコードを更新します。 */

else if (!mmrrppuutt((nneeww__rreecc__ddeesscc,, oolldd__rreecc__ddeesscc)))

{

fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

}

else

printf ("Record changed\n");

}

Empress 導入ガイド

59

Page 60: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

/* mrgetend関数でレコード検索終了します */

if (!mmrrggeetteenndd ((rreett__ddeesscc)))

fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

/* mraddend関数でEmpressの内部バッファから、ファイルに書き込みを行います。 */

if (!mmrraaddddeenndd ((nneeww__rreecc__ddeesscc)))

fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

/* mrfrrec関数で新旧のレコードディスクリプタを解放します */

if (!mmrrffrrrreecc ((oolldd__rreecc__ddeesscc)))

fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

if (!mmrrffrrrreecc ((nneeww__rreecc__ddeesscc)))

fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

/* テーブルをクローズします */

if (!mmrrcclloossee ((ttaabb__ddeesscc)))

fprintf (stderr, "Error:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

Empress 導入ガイド

60

Page 61: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

トランザクショントランザクションとは、関連する複数の処理を一つの分割できない処理単位としてまとめたものです。

mrインターフェースでのトランザクションコマンド

mrインターフェースのトランザクションコマンドは、mrtr~から始まる関数です。

関数 解説

mrtrstart

トランザクションを開始します。

[mrtrstartの使用方法]ffllaagg == mmrrttrrssttaarrtt (());;

mrtrcommit

トランザクションをコミットし、データベースへの変更を確定します。

[mrtrcommitの使用方法]ffllaagg == mmrrttrrccoommmmiitt (());;

mrtrcancel

トランザクションをキャンセルし、データベースをトランザクションを開始する前の状態に戻します。

[mrtrcancelの使用方法]ffllaagg == mmrrttrrccaanncceell (());;

mrtrsave

トランザクション内にセーブポイントを設定します。

[mrtrsaveの使用方法]ffllaagg == mmrrttrrssaavvee ((ssaavveeppooiinntt));;savepointはセーブポイント名へのポインタ(char*)です。savepoint名は英字で始まる文字列になります。

mrtrrollback

セーブポイントまでトランザクションをロールバックします。

[mrtrrollbackの使用方法]ffllaagg == mmrrttrrrroollllbbaacckk ((ssaavveeppooiinntt));;セーブポイント名が(char*)(" ")の場合、mrtrcancelと同一となります。

サンプル

このサンプルは、transaction_logテーブルを使用して、2013/11/1にJoeが 自分の口座からPennyに40ドル振り込んだ、というものです。Joeの口座からお金を引き出しPennyに入金するまでの2つのtransaction_logテーブルへの2件の新規レコード登録を1つのトランザクションとして行います。

今回使用するデータベース

データベース testdb

テーブル作成用SQL

create sequence seq2 startvalue 1;create table transaction_log(id sequence(seq2), name nlschar, date edate, credit dollar,debit dollar );

備考

サンプル中で以下のSQLを実行します。

1. insert into transaction_log (name, date, credit, debit) values ('Joe', '20131101', 0, 40);2. insert into transaction_log (name, date, credit, debit) values ('Penny', '20131101', 40, 0);

##iinncclluuddee <<mmsscccc..hh>>

#define DATABASE "testdb"

Empress 導入ガイド

61

Page 62: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

int main (int argc, char** argv)

{

int i;

/* 実行SQL文: この2つをトランザクションで同時処理とします */

char sql[2][200]= {"insert into transaction_log "

"(name, date, credit,debit) "

"values ('Penny', '20131101', 40, 0)",

"insert into transaction_log "

"(name, date, credit,debit) "

"values ('Joe', '20131101', 0, 40)"};

/* mrインターフェースの初期化を行います */

if (!mmssiinniitt(()))

{

printf("Unable to initialize Empress\n");

mmsseenndd(());

return 1;

}

/* トランザクション開始 */

if (! mmrrttrrssttaarrtt(()))

{

fprintf (stderr, "mrtrstart failed\n");

fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

mmsseenndd(());

return 2;

}

/* SQL実行 */

for (i = 0 ; i < 2 ; i = i + 1)

{

if (! mmrreexxeeccddiirreecctt ((DDAATTAABBAASSEE,, &&ssqqll[[ii]][[00]])))

{

fprintf (stderr, "mrexecdirect failed\n");

fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

/* トランザクションキャンセル */

if (mmrrttrrccaanncceell(()))

{

fprintf (stderr, "mrtrcancel failed\n");

fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()), mmrrooppeerrrr);

mmsseenndd(());

return -1;

}

mmsseenndd(());

return 3;

}

}

/* トランザクションコミット */

if (! mmrrttrrccoommmmiitt(()))

{

fprintf (stderr, "mrtrcommit failed\n");

fprintf (stderr, "Error msg:%s (%d)\n", mmrreerrrrmmssgg (()) mmrrooppeerrrr);

mmsseenndd(());

return 4;

}

Empress 導入ガイド

62

Page 63: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

printf("success.\n");

/* mrインターフェースのクリーンアップを行います */

mmsseenndd(());

return 0;

}

まとめmrインターフェースの詳しい資料は、Empress マニュアルセットの「C/C++API カーネルレベルインターフェース - mrルーチン」を参照してください。

性能をアップするためには、適切なデータタイプをご使用ください。高速化するオプションは多数用意していますのでサポートにお問い合わせください。サポート先は次の通りです。[email protected]

Empress 導入ガイド

63

Page 64: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

第10章 Empressの管理コマンドEmpressでデータベースの管理機能を実行するコマンドです。

empvers

役割EMPRESS のバージョンを表示するEMPRESSのインストールキーを更新する (-updatekeyオプション)EMPRESSのライセンス情報を表示する (-licinfoオプション)

使い方

empvers path [option]

path: Empressのインストールパスoption: -updatekey / -licinfo

例 empversempvers -licinfo

empupgrd

役割 旧バージョンで作成されたデータベースをバージョン 10.20用に変換

使い方empupgrd [-f] database

database:データベース名

例 empupgrd db

注意

バックアップを取ってから行ってください。データベースに他にアクセスが無いときに実行してください。データベース上の全てのトランザクションが無効となります。tabzeroファイルが編集されます。

Empress 導入ガイド

64

Page 65: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

第11章 Empress管理APIEmpress管理API(Empress Callable Administration API Routine)は管理コマンドをサポートするために実装されます。管理コマンドと管理者用APIの関係は以下の表になります。

管理コマンド 管理API

empclean msdbmaintain

empexpt msdbexport

empimpt msdbimport

[シンタックス]iinntt mmssddbbmmaaiinnttaaiinn ((ccoonnsstt cchhaarr** ddaattaabbaassee,,

cchhaarr**** ttaabblleelliisstt,,

iinntt ooppttiioonn,,

mmssbbooooll vveerriiffyy,,

iinntt** ppssssttaattuuss,,

mmssbbooooll**    ffoouunndd__eerrrroorr__aanndd__ffiixx))

[サンプル]ffllaagg ==mmssddbbmmaaiinnttaaiinn ((ddaattaabbaassee,,ttaabblleelliisstt,,

ooppttiioonn,,

vveerriiffyy,,

ppssssttaattuuss,,

ffoouunndd__eerrrroorr__aanndd__ffiixx));;

msdbmaintain

概略:Empressデータベース保全保証ユーティリティ(断電回復)

msdbmaintainはデータベースの矛盾をレポート、修理します。 不完全なロック、トランザクション、一時ファイル、コーディネータ情報、および他のデータベースに関する問題を検出解決します。msdbmaintain以下のPHASEで個々の操作を実行します。

タスク

PHASE オプション 機能

1 MSCLEAN_PHASE_SHM 必要に応じて共有メモリを再生

2 MSCLEAN_PHASE_SCAN_COORD すべてのクライアントで不適切に終わったものを発見

3 MSCLEAN_PHASE_SEM セマフォーをチェック

4 MSCLEAN_PHASE_TRANS トランザクションを解決

5 MSCLEAN_PHASE_LOCKS ロックを解決

6 MSCLEAN_PHASE_CHECK_COMPILE_ENTRIES コンパイルされたデータ辞書RELファイルをチェック

7 MSCLEAN_PHASE_GEN_COMPILE_ENTRIES データ辞書のためのエントリーをコンパイル

8 MSCLEAN_PHASE_DICT_FILES データ辞書REL/DTFファイルのチェック

9 MSCLEAN_PHASE_REBUILD_SYS_INDICES システム・テーブルにインデックスリストを再生成

10 MSCLEAN_PHASE_RECOMPILE_MISSING_ENTRIES データ辞書のヌルエントリーを再コンパイル

11 MSCLEAN_PHASE_RECOMPILE_ALL_ENTRIES データ辞書におけるすべてのエントリーを再コンパイル

Empress 導入ガイド

65

Page 66: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

12 MSCLEAN_PHASE_DICT_TABLES データ辞書テーブルの一貫性をチェック

13 MSCLEAN_PHASE_DB_CONSISTENCY データベース・ファイルの一貫性をチェック

14 MSCLEAN_PHASE_TEMP_TABLES TMP_*_TAB_*テーブルのチェック

15 MSCLEAN_PHASE_REL_DTF_FILES REL/DTFファイルのチェック

16 MSCLEAN_PHASE_COORD コーディネータのチェック

17 MSCLEAN_PHASE_CHECK_USER_INDICES ユーザテーブルにインデックスリストを再生

18 MSCLEAN_PHASE_REBUILD_USER_INDICES ユーザテーブルインデックスのリビルド

19 MSCLEAN_PHASE_REPLICATION レプリケーションテーブルのレコードのパージ

20 MSCLEAN_PHASE_TEMP_FILES テンポラリファイルディレクトリのチェック

21 MSCLEAN_PHASE_IGNORE_COORD コーディネータとトランザクションロールバックの無視

msdbmaintainはfull check とquick check の2つのオペレーションモードをサポートします。quick checkはPhases1、2、3、4、5and16を実行します。

オプションとグループタスク

msdbmaintainのオプションとタスクの一覧表は以下の通りです。

オプション グループタスク

MSCLEAN_IGNORE_COORDINATOR

MSCLEAN_PHASE_IGNORE_COORD MSCLEAN_PHASE_SHMMSCLEAN_PHASE_SCAN_COORD MSCLEAN_PHASE_SEM MSCLEAN_PHASE_TRANS MSCLEAN_PHASE_LOCKSMSCLEAN_PHASE_COORD

MSCLEAN_LIGHT

MSCLEAN_PHASE_IGNORE_COORD     MSCLEAN_PHASE_SHMMSCLEAN_PHASE_SCAN_COORD     MSCLEAN_PHASE_SEMMSCLEAN_PHASE_TRANS     MSCLEAN_PHASE_LOCKSMSCLEAN_PHASE_COORD

MSCLEAN_RECOMPILE

MSCLEAN_PHASE_SHM     MSCLEAN_PHASE_SCAN_COORDMSCLEAN_PHASE_SEM     MSCLEAN_PHASE_TRANSMSCLEAN_PHASE_LOCKSMSCLEAN_PHASE_COORDMSCLEAN_PHASE_CHECK_COMPILE_ENTRIESMSCLEAN_PHASE_GEN_COMPILE_ENTRIES     MSCLEAN_PHASE_DICT_FILESMSCLEAN_PHASE_RECOMPILE_MISSING_ENTRIES

MSCLEAN_TABLE_CHECK

MSCLEAN_PHASE_SHM     MSCLEAN_PHASE_SCAN_COORDMSCLEAN_PHASE_SEM     MSCLEAN_PHASE_TRANSMSCLEAN_PHASE_LOCKSMSCLEAN_PHASE_COORDMSCLEAN_PHASE_CHECK_COMPILE_ENTRIESMSCLEAN_PHASE_GEN_COMPILE_ENTRIES

Empress 導入ガイド

66

Page 67: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

MSCLEAN_PHASE_DICT_FILESMSCLEAN_PHASE_REBUILD_SYS_INDICESMSCLEAN_PHASE_RECOMPILE_MISSING_ENTRIESMSCLEAN_PHASE_DICT_TABLESMSCLEAN_PHASE_DB_CONSISTENCYMSCLEAN_PHASE_TEMP_TABLES

MSCLEAN_DATA_CHECK

MSCLEAN_PHASE_SHMMSCLEAN_PHASE_SCAN_COORDMSCLEAN_PHASE_SEMMSCLEAN_PHASE_TRANSMSCLEAN_PHASE_LOCKSMSCLEAN_PHASE_COORDMSCLEAN_PHASE_CHECK_COMPILE_ENTRIESMSCLEAN_PHASE_GEN_COMPILE_ENTRIESMSCLEAN_PHASE_DICT_FILESMSCLEAN_PHASE_REL_DTF_FILES

MSCLEAN_INDEX_CHECK

MSCLEAN_PHASE_SHMMSCLEAN_PHASE_SCAN_COORDMSCLEAN_PHASE_SEMMSCLEAN_PHASE_TRANSMSCLEAN_PHASE_LOCKSMSCLEAN_PHASE_CHECK_COMPILE_ENTRIESMSCLEAN_PHASE_CHECK_USER_INDICES

MSCLEAN_REBUILD_USER_INDICES

MSCLEAN_PHASE_SHMMSCLEAN_PHASE_SCAN_COORDMSCLEAN_PHASE_SEMMSCLEAN_PHASE_TRANSMSCLEAN_PHASE_LOCKSMSCLEAN_PHASE_CHECK_COMPILE_ENTRIESMSCLEAN_PHASE_GEN_COMPILE_ENTRIESMSCLEAN_PHASE_DICT_FILESMSCLEAN_PHASE_RECOMPILE_ALL_ENTRIESMSCLEAN_PHASE_DB_CONSISTENCYMSCLEAN_PHASE_COORDMSCLEAN_PHASE_REBUILD_USER_INDICES

MSCLEAN_REPLICATION_CHECKMSCLEAN_PHASE_SHMMSCLEAN_PHASE_SCAN_COORDMSCLEAN_PHASE_REPLICATION

MSCLEAN_TEMP

MSCLEAN_PHASE_SHM     MSCLEAN_PHASE_SCAN_COORDMSCLEAN_PHASE_SEM     MSCLEAN_PHASE_TRANSMSCLEAN_PHASE_LOCKS     MSCLEAN_PHASE_COORDMSCLEAN_PHASE_TEMP_FILES

MSCLEAN_FULL

MSCLEAN_PHASE_SHM     MSCLEAN_PHASE_SCAN_COORDMSCLEAN_PHASE_SEM     MSCLEAN_PHASE_TRANSMSCLEAN_PHASE_LOCKS     MSCLEAN_PHASE_CHECK_COMPILE_ENTRIESMSCLEAN_PHASE_GEN_COMPILE_ENTRIES     MSCLEAN_PHASE_DICT_FILESMSCLEAN_PHASE_REBUILD_SYS_INDICES     MSCLEAN_PHASE_RECOMPILE_ALL_ENTRIES     

Empress 導入ガイド

67

Page 68: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

MSCLEAN_PHASE_DICT_TABLESMSCLEAN_PHASE_DB_CONSISTENCY     MSCLEAN_PHASE_TEMP_TABLESMSCLEAN_PHASE_REL_DTF_FILES     MSCLEAN_PHASE_COORDMSCLEAN_PHASE_CHECK_USER_INDICESMSCLEAN_PHASE_REPLICATION     MSCLEAN_PHASE_TEMP_FILES

オプションの解説

各オプションの解説は以下の一覧表の通りです。

オプション 説明

MSCLEAN_IGNORE_COORDINATOR

このオプションを選択した場合、MSCLEAN_LIGHTオプションを実行します。死んでいるクライアントが検知された場合、それに関連したロック、クライアントをロールバックします。注意:このオプションはリブートの後、もしくはすべてのEmpressコマンドが実行される前に実行して下さい。そうでなければ、データベースにダメージを与えるかもしれません。

MSCLEAN_LIGHT死んでいるクライアントが検知された場合、それに関連したロック、クライアントをロールバックします。これはLiveデータベースに対しても実行できます。

MSCLEAN_RECOMPILE

このオプションはMSCLEAN_LIGHTのオプションを実行します。 システム辞書ファイルが構造上、正常か、再構築するか確認します。正常でないと分かった場合システム辞書エントリーをコンパイルします。注意:このオプションは静止したデータベースに実行します。警告:verifyパラメーターがTrueならば、検証だけが実行されます。

MSCLEAN_RECOMPILE_ALL

MSCLEAN_RECOMPLIEに関連した過程をすべて実行します。同時にデータ辞書中の無効のエントリーを再コンパイルします。もしくはデータ・ディクショナリー中のエントリーをすべて再コンパイルします。システム辞書ファイルのコンパイルファイルの状態に関わらずシステム辞書ファイルを再コンパイルします。注意:このオプションは静止したデータベースに実行します。警告:確認パラメーターがTrueならば確認過程だけが実行されます。

MSCLEAN_TABLE_CHECK

システムテーブルの構造および内容の確認。もしデータベースでDDLオペレーションを行なっており、そのデータベースが、このオペレーションに中に電断が発生した場合はこのオプションを使用します。注意:このオプションは静止したデータベースに実行します。警告:verifyパラメーターがTrueならば、システムテーブルの構造確認のみしますが、修正はしません。

MSCLEAN_DATA_CHECK

物理的データベースファイルの構造が正確かどうか確認します。警告:verifyパラメーターがTrueならば、データ構造の確認はしますが、修正は実行されません。tablelistパラメーターがセットされた場合テーブルに関連したデータ構造だけがチェックされます。

Empress 導入ガイド

68

Page 69: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

verifyパラメーターがTrueで、tablelistがNULLでない場合、tablelistパラメーターで見つかったテーブルに関連したデータ構造だけがチェックされ修正はされません。

MSCLEAN_INDEX_CHECK

このオプションがチェックされた場合、すべてのインデックスが必要に応じ再作成します。インデックスは確認しますが、データの各キーの確認は実行しません。警告:verifyパラメーターがTrueならば、インデックスを単にチェックします。.tablelistパラメーターがセットさると、リストで見つかったテーブルに関連したインデックスだけをチェック、リビルドします。verifyオプションがTrueならば、インデックスはチェックしますがリビルドしません。

MSCLEAN_REBUILD_USER_INDICES

このオプションを選択した場合、ユーザインデックスはすべてリビルドされます。警告:verifyパラメーターがTrueならばインデックスはリビルドしません。tablelistパラメーターがセットするとリストされたテーブルに関連したインデックスだけをリビルドします。

MSCLEAN_REPLICATION_CHECK レプリケーションでロジカル的に削除がマークされたレコードは削除されます。

MSCLEAN_TEMP MSCLEAN_LIGHT過程をすべて実行し、Empressのテンポラリディレクトリあるファイルも削除されます。

MSCLEAN_FULL

フェーズ18を除いてすべての過程を実行します。このオプションは、データベースのチェック、確認および修正フェーズを実行します。注意:このオプションは静止しているデータベースに実行します。tablelistパラメーターはセットされた場合、リストされたテーブルに対して実行されます。verifyパラメーターがTrueならば、各過程の確認部分だけを実行します。

msdbexport

概略:Empressデータベースのエクスポート

msdbexportはEmpressデータベースからテーブルをエクスポートします。「テーブル」入力のパラメータは、エクスポートするテーブルを指定します。テーブルを指定しない場合は、データベースのすべてのテーブルをエクスポートします。各テーブルでインデックスリスト、ロックレベル、コメント、レンジチェック、および特権情報をエクスポートします。

アウトプットは指定された“outfile” に記述されます。EMPRESSがテーブル定義をエクスポートするためには"display"特権を持たなければなりません。"display" "select"特権でデータをエクスポート可能です。

msdbpimpt

概略:Empressデータベースのインポート

msdbimportはEmpressデータベースにテーブルをインポートします(データベースは既に存在しなければなりません。データベースは、empmkdbを使用するか、またはCREATEDATABASE SQLコマンドで作成可能です。

msdbexportかempexpt(データベースエクスポートファイル)の形式でインポートされるデータフォーマットが存在します。“infile”という入力ファイルにすべてのテーブルがインポートされます。

データ辞書テーブルに関するデータをインポートすべきではありません。 インポートするコメントとロックレベルは、既存のコメントとレベルをロックを変更し、システム・テーブルに既に存在しているインデックスをインポートすると誤り

Empress 導入ガイド

69

Page 70: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

を引き起こします。

インポートされたテーブルは、データベースディレクトリで作成されプログラムを実行するユーザによって所有されています。

テーブルをインポートするためには、“sys_tables”に“insert” 特権を持たなければなりません。インポートされるべきテーブルがすでに存在しているならそれらのテーブルに対しても"insert" 特権を持たなければなりません。

Empress 導入ガイド

70

Page 71: Empress導入ガイド...これに対してSQLiteのようなデータベースではデータベースのマルチアクセスはでき ず、シングルユーザになります。暗号化可能なセキュアデータベース

第12章 データベース設定Empressはデータベースの動作を次の設定ファイルで制御します。設定を変更するには、設定ファイルに設定項目を追加します。変更するときには、データベースにアクセスの無い状態で行ってください。

通常、Empressの設定ファイルは変更の必要はありません。基本的には初期状態のままご使用いただくことをお勧めしています。リソースが制限された環境の場合は設定変更が必要な場合があります。詳しくはサポートにお問い合わせください。

initfile.txtデータベースエンジンに関連する設定ファイルです。ファイルはEmpressのインストールディレクトリ内の/config/initfile.txtです。ユーザにEmpressデータベースエンジンの動作に対するコントロール権を与えます。

※ オペレーティングシステム、Shellのリセットされた値は、initfileの中のセッティングを無視します。※ そのオペレーティング・システム、Shellの範囲においてのみ有効です。

tabzero.txtデータベース毎の設定を行うファイルです。データベースのディレクトリ内に存在します。

[tabzeroファイル内のパラメータの変更方法例]eemmppaaddmm tteessttddbb ttaabbzzeerroocchhaannggee MMSSDDBBIIDD ''mmaasstteerr__ddbb''ここではデータベース「testdb」の MSDBID(データベースID名)を'master_db'に変更しています。

良く使う設定次の表は、良く使用される設定項目です。

設定項目 内容 設定ファイル

MSVALSEP データをファイルにダンプするとき、データを一括登録するときにアトリビュートの区切り文字を設定するのに使用します。 initfile

MSDBID データベースIDが定義されています。レプリケーション設定で使用されることが多い項目です。 tabzero

一時的な設定方法開発時などに一時的に設定を変更するにはSETコマンドを使用します。SETコマンドは現在の設定を確認する場合にも使えます。

C:\Empress>empsql sample01 EMPRESS V10.20 (c) Copyright Empress Software Inc. 1983, 20131* set;         ← 現在SETコマンドで指定した設定の一覧を確認しています。2* set MSVALSEP ',';   ← MSVALSEPの値をカンマに設定しています。3* set;         ← 現在SETコマンドで指定した設定の一覧を確認しています。MSVALSEP=,         次の行に設定内容が表示されています。

Empress 導入ガイド

71