dbsインタフェース
[(1) 概要] [(2) 説明] [(3) 注意点] [(4) 定義体について] [(5) 送受信する内容について] [備考]
(2) 説明
MONTSUQIは、MONTSUQI配下のデータベースを一括して管理することを前提として作られています。もし、MONTSUQI配下のデータベースを、外部アプリケーションから正当性を保って直接更新するためには、トランザクション管理・主従のミラーリング(同期取り)を外部アプリケーション自身が行う必要が出てきます。
MONTSUQI配下のデータベースは、「HAKAMA」と呼ばれるデータベースレイヤを経由してアクセスします。
HAKAMAを経由してデータベースにアクセスすることで、データベースアクセスの手順(API)を一本化・(PostgreSQLなどの)データベースアプリケーションの隠蔽・外部からのデータベースアクセスの抽象化を可能にします。
dbsインタフェースは、MONTSUQIのHAKAMA層を経由することで、外部アプリケーションがトランザクション管理・主従のミラーリングをMONTSUQIにまかせた上で、各テーブルを操作することが可能になります。
なお、dbsインタフェース(HAKAMA)経由でMONTSUQI配下のデータベースをアクセスするためには、後述する定義体を記述する必要があります。これにより、MONTSUQI配下にあるデータベースの全てのテーブル操作が可能になります。
ただし、dbsインタフェースは、単にDBアクセスを提供するための実装であり、テーブル間の整合正等のチェックはおこないません。
(3) 注意点
- dbsインタフェースは、インタフェースのみの提供であり、MONTSUQI配下のデータベースに対し、何のチェックなしにアクセスすることが可能です。そのため、テーブルの内容をすべて削除するなど、どのような操作も行うことができますので、dbsインタフェースを使う際には注意してください。
- データベースにアクセスするためには、MONTSUQI配下のアプリケーション(日医標準レセプトソフト)のチェック等が行われないため、MONTSUQI配下のアプリケーション(日医標準レセプトソフト)と同様に、データベースの仕様を理解し、更新の際に各外部アプリケーションによってチェックを行う必要があります。
- MONTSUQI配下のアプリケーション(日医標準レセプトソフト)のデータベースの構造が変更された場合、テーブル変更によって外部アプリケーション側に影響がないか、その都度調査する必要があります。
(4) 定義体について
dbsインタフェース経由で、MONTSUQI配下のデータベースにアクセスするためには、MONTSUQI・HAKAMA側に定義体を記述する必要があります。ここでは、テーブルにアクセスするために必要な定義体の記述方法を記載します。
- /etc/jma-receipt/orcadbs.incの編集
- db定義体の作成
- dbd定義体の作成
- 定義体の反映
- dbsデーモンの起動
※なお、db定義体・dbd定義体の設定に関する詳細な説明については、ORCAサイトにある開発者情報のMONTSUQIについてのページに置いてある「MONTSUQI資料」を参照してください。
- /etc/jma-receipt/orcadbs.incの編集
このファイルにdbd名を定義します。
後述する「3.dbd定義体の作成」で記載してある「dbs.dbd」の場合は、下記のように記述します。
dbs;
- db定義体の作成 /usr/local/site-jma-receipt/record/以下にdbs経由でアクセスするdb定義体を作成します。ここでは例としてpatient.dbというファイルを記載します。(注意:patient.dbは例として記載しています。データベースのテーブルの作成等は、事前に行う必要があります。)
patient { ptno char(10); name varchar(40); sex char(1); }; primary { ptno; }; path ptno { DBSELECT { DECLARE patient_ptno_csr CURSOR FOR SELECT * WHERE ptno = :ptno ; }; };
- dbd定義体の作成 /usr/local/site-jma-receipt/lddef/の以下にdbs.dbdというファイルを作成します。dbd定義体の中に先ほどのdb定義体をエントリします。以下にdbs.dbdのサンプルです。
name dbs; arraysize 20; textsize 200; db { patient; ←----「2.db定義体の作成」の定義体 tbl_wksryact; ←--- 日医標準レセプトソフトのdb定義体(例はワーク診療行為) : (その他のdb定義など) : doctor; }; db "shell" { shell; };
- 定義体の反映 上記の定義体を、MONTSUQIが認識できるようにするため、下記のコマンドを実行してください。
$ sudo /usr/lib/jma-receipt/scripts/allways/site-upgrade.sh
- dbsデーモンの起動 外部アプリケーションが、dbsインタフェース経由でデータベースにアクセスできるようにするため、dbsデーモンを起動します。 下記のコマンドを実行してください。
$ sudo -u orca /usr/lib/panda/sbin/dbs -dir /usr/lib/jma-receipt/lddef/directory dbs
(5) 送受信する内容について
接続するポートは、デフォルトで「8013」です。このポートは、dbsインタフェースの実行プログラム「dbs」のコマンド引数「-port」で変更することが可能です。 TCPソケット通信でのやりとりは、次の順番で行われます。
- 認証確認
- DBOPEN
- トランザクションスタート
- DB検索・更新・追加・削除
- トランザクションエンド
- DBCLOSE
- 認証確認 外部アプリケーションがdbs経由でデータベースにアクセスするためには、まずソケット通信のための接続を行います(ポートは、デフォルトで「8013」です。
dbsのコマンド引数で「-port」の指定がある場合は、そちらのポートに接続します。プロトコルはTCP接続です)。
接続しましたら、認証確認のメッセージをdbsに送信します。
下記の内容をdbsに向けて送信してください。(改行は「¥n」と記述しています)
<バージョン番号> <ユーザID> <パスワード> <type>¥n※各項目の間は半角空白で区切っています。 <バージョン番号>には、MONTSUQIのバージョン番号をセットします。 例えば、MONTSUQIのバージョンが1.2.1の場合は 1.2.1 とセットします。
<ユーザID>には、MONTSUQI側で gluseradd コマンドでセットしたユーザIDを指定します。(glclientの引数 -user で指定するユーザIDです)
<パスワード>は、上記<ユーザID>のパスワードを指定します。
<type>には、string stringe のいずれかを指定します。通常は stringe を指定します。
<type>の後には、改行をセットしてください。
・認証確認の送信例
1.2.1 ormaster jmarcpt stringe¥n
※Ver.4.8.0以降の注意点
$ sudo touch /etc/jma-receipt/passwd $ sudo chmod 600 /etc/jma-receipt/passwd $ sudo chown orca:orca /etc/jma-receipt/passwd $ sudo -u orca gluseradd -file /etc/jma-receipt/passwd -p パスワード ユーザー名
先頭に「Error:」とあった場合、認証に失敗しています。その後にエラーメッセージがセットされています。
成功しますと、「Connect: OK」といったメッセージがセットされます。(MONTSUQIのバージョンが1.2.1の場合)
server = DB_Server.new("192.168.1.51",0,"ormaster","jmarcpt");※DB_Serverクラスのオブジェクトをserverという名前で生成します。
以降、serverオブジェクトのメソッドを使って、dbsとのやりとりを行います。
dbsに向けて、下記の2行を送信してください。(改行は「¥n」と記述しています)
Exec: DBOPEN¥n ¥nすると、dbsからメッセージが「Exec: *****」と戻ってきます。(「*****」にdbsからのコードが入ります)
※もしも、先頭に「Exec:」が付かない場合は、接続が失われているので、接続を終了する必要があります。これは、後述のトランザクションのスタート等でも同様です。
dbsから「Exec: *****」のメッセージを受け取りましたら、dbsに向けて「¥n」を送信してください。
・記述例[ruby]
rc = server.dbops("DBOPEN");
dbsに向けて、下記の2行を送信してください。
Exec: DBSTART¥n ¥nすると、dbsからメッセージが「Exec: *****」と戻ってきます。
その後「¥n」をdbsに向けて送信してください。
これで、DBの検索・更新・追加・削除のトランザクションを指定を行うことができます。
・記述例[ruby]
rc = server.dbops("DBSTART");
・記述例[ruby])
rec = {} rec["tbl_wksryact.HOSPID"] = 'JPN0000000000001'; rec["tbl_wksryact.PTID"] = '0000000170'; rc = server.recordops("DBSELECT","tbl_wksryact","dbs",rec); server.recordops("DBFETCH","tbl_wksryact","dbs",rec); rec["tbl_wksryact.SRYKA"] = '10'; server.recordops("DBUPDATE","tbl_wksryact","dbs",rec);※recordopsメソッドの引数は、下記のように指定します。
recordops(func, rname, pname, rec) func - db定義体に記述してあるファンクション名 (A { 〜SQL文〜 } のAの部分を記述します) rname - db定義体に記述してあるテーブル定義名 (tbl_*** { char(99) ...}のtbl_***の部分を記述します) pname - db定義体に記述してあるパス名 (path pname {〜}のpnameの部分を記述します) rec - SQLにセットする内容のハッシュ形式配列 例えば、db定義体名が「tbl_wksryact」で、db定義体に「HOSPID = :HOSPID」とあったとします。 右辺の「:HOSPID」に「JPN000000000001」をセットして SQLを実行したい場合は、rubyスクリプトの中で、 「rec["tbl_wksryact.HOSPID"] = 'JPN000000000001';」と記述します。 そして、recordopsの4番目の引数に「rec」を指定すれば、 :HOSPIDの部分が展開され、「HOSPID = JPN000000000001」という 検索条件を含んだSQLが実行されます。
dbsに向けて、下記の2行を送信してください。
Exec: DBCOMMIT¥n ¥nすると、dbsからメッセージが「Exec: *****」と戻ってきます。
その後「¥n」をdbsに向けて送信してください。
これで、実際のDBに対して更新処理が行われます。
・記述例[ruby])
rc = server.dbops("DBCOMMIT");
dbsに向けて、下記の2行を送信してください。
Exec: DBDISCONECT¥n ¥nすると、dbsからメッセージが「Exec: *****」と戻ってきます。
その後「¥n」をdbsに向けて送信してください。
次に、dbsとの接続を終了します。
dbsに向けて、下記の1行を送信してください。
End¥n送信しましたら、接続を終了して(ソケットを閉じて)ください。
・記述例[ruby]
rc = server.dbops("DBDISCONNECT"); server.close;
備考
A-1. dbsへアクセスするためのインタフェースについて
MONTSUQIのバージョンが1.2.1以前の場合、これらのdbsへアクセスするためのインタフェースは、apt-getコマンドで取得する必要があります。
まず、下記のコマンドを実行してください。(apt-lineにorcaサイトの記述が必要です)
$ apt-get source panda-server
この中に、インタフェースプログラムがあります。
rubyのインタフェース
panda-*/dbstuff/dbslib.rb
panda-*/java/*
B-1. rubyの記述例で記述した「rc」の値について
エラーコードの意味は、下記のとおりです。
0 = MCP_OK 1 = MCP_EOF 2 = MCP_NONFATAL -1 = MCP_BAD_ARG -2 = MCP_BAD_FUNC -3 = MCP_BAD_SQL -4 = MCP_BAD_OTHER
グループ診療対応
グループ診療対応により全てのテーブルのkeyがhospidからhospnumに変更となっています。
グループ診療対応(dbsインタフェースによるアクセス) [PDF]