diff --git a/CHANGES b/CHANGES index 89c587d..0afabe3 100644 --- a/CHANGES +++ b/CHANGES @@ -1 +1,2 @@ 1.0 : 2002.07.01 正式版(1.0)リリース +2.0 : 2003.02.01 マルチサーバ版 diff --git a/README b/README index 375eb08..eb434ec 100644 --- a/README +++ b/README @@ -1,5 +1,5 @@ -tyserv-1.0 -- database server which use typhoon RDBMS as database engine -Copyright (C) 2002 Masahiko Ito +tyserv-2.0 -- database server which use typhoon RDBMS as database engine +Copyright (C) 2003 Masahiko Ito These programs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,173 +21,236 @@ m-ito@mbox.kyoto-inet.or.jp 紹介 ==== - tyserv はUNIX系OSで利用することを念頭に開発しているデータベースマ -ネージャです。tyserv はその基本エンジン部分に Typhoon Relational -Database Management System v1.11.0(*) を使用しています。tyserv の提 -供する主な機能は以下のものです。 +tyserv はUNIX系OSで利用することを念頭に開発しているデータベースマネー +ジャです。tyserv はその基本エンジン部分に Typhoon Relational Database +Management System v1.11.0 を使用しています。tyserv の提供する主な機能 +は以下のものです。 + + 1. ソケットインターフェースを利用したネットワーク越しのアクセス機能 + 2. 障害に備えたジャーナルファイル(ロールバック、リカバリ)取得機能 + 3. 排他制御機能 + 4. トランザクション機能 + □ ロールバック(ロールバックジャーナルによる) + □ コミット + 5. DB復旧機能(リカバリジャーナルによる) + 6. IPアドレスによるアクセス制限機能(/etc/hosts.allow, /etc/ + hosts.denyによる) + 7. ユーザ認証によるアクセス制限機能(/home/tyserv/tyserv/etc/passwdに + よる) + +また、専用掲示板(http://myh.no-ip.org/~tyserv/cgi-bin/bbs.cgi)を用意し +ましたので、こちらのほうもご利用ください。 + +作者の思い(^^; +============== + +現時点で既に「Apache + PHP + PostgreSQL」みたいな、かゆいところに手の +届く気持良く便利な「まごの手」があるのになぜあえてこのような物を作っ +てるのか?...。 + +「まごの手」は確かに便利な物なんですが、たまには「直接手で」掻きむし +るあの感覚も忘れたくない、そんな事ってないですか?、いやあって欲し +い...。 + +という訳で、いまだに「COBOL + VSAM(or VSAS)索引順編成」、「 C + +C-ISAM」等の言葉に反応してしまうそこのあなたにこそ「tyserv」は有るの +です。あっ、でもそれ以外の人もつかってね...。 + +ダウンロード +============ - 1. ソケットインターフェースを利用したネットワーク越しのアクセス機能 - 2. 障害に備えたジャーナルファイル(ロールバック、リカバリ)取得機能 - 3. 排他制御機能 - 4. トランザクション機能 - o ロールバック(ロールバックジャーナルによる) - o コミット - 5. DB復旧機能(リカバリジャーナルによる) - 6. IPアドレスによるアクセス制限機能(/etc/hosts.allow, /etc/hosts.denyによる) - 7. ユーザ認証によるアクセス制限機能(~tyserv/tyserv/etc/passwdによる) +http://myh.no-ip.org/~tyserv/tyserv-2.0.tar.gz - (*) http://users.footprints.net/~kaz/typhoon.html + 1. 排他制御の粒度を細かくするためのマルチサーバ構成に対応 + 2. tysearch(検索コマンド)サポート インストール ============ -1. システムにユーザ tyserv を追加する -2. ユーザ tyserv 用にホームディレクトリ /home/tyserv を作成する -3. tyserv でログインする -4. $ tar xvzf tyserv-1.0.tar.gz - $ ln -s tyserv-1.0/typhoon . - $ ln -s tyserv-1.0/tyserv . -5. PATH に ${HOME}/typhoon/bin, ${HOME}/tyserv/bin を追加する - ex. (~tyserv/.profile etc) - PATH="${PATH}:${HOME}/typhoon/bin" - PATH="${PATH}:${HOME}/tyserv/bin" - export PATH -6. 環境変数 TYPHOON_DIR, TYPHOON_DB, TYSERV_DIR を設定する - ex. (~tyserv/.profile etc) - TYPHOON_DIR=${HOME}/typhoon;export TYPHOON_DIR - TYPHOON_DB=typhoondb;export TYPHOON_DB - TYSERV_DIR=${HOME}/tyserv;export TYSERV_DIR -7. ユーザ tyserv で再度ログインする(上記5. 6. の設定を有効にする) -8. typhoon-1.11.0 をインストールする -8.1. typhoon-1.11.0.tar.gz を取得する - http://users.footprints.net/~kaz/typhoon.html -8.2. $ tar xvzf typhoon-1.11.0.tar.gz -8.3. $ cd typhoon-1.11.0; patch -p1 <../tyserv-1.0/typhoon-1.11.0.patch -8.4. $ ./configure; make -8.5. $ su - # make install; exit -9. データベース定義ファイル(typhoondb.ddl)からデータベース定義 - (typhoondb.dbd)を生成する。この定義にはサンプルのテーブル(smp1) - の定義が含まれる。 - $ dbdgen typhoondb -10. インポートコマンドファイル、エクスポートコマンドファイルを作成する - $ cd ~tyserv/typhoon/dbd - $ tyimport -g typhoondb - $ cp typhoondb.imp typhoondb.smp1.imp - $ tyexport -g typhoondb - $ cp typhoondb.exp typhoondb.smp1.exp -11. データベースサーバ本体の tyserv を生成する(あらかじめ libwrap を + 1. システムにユーザ tyserv を追加する + 2. ユーザ tyserv 用にホームディレクトリ /home/tyserv を作成する + 3. tyserv でログインする + 4. tyserv-2.0 を展開する + □ $ tar xvzf tyserv-2.0.tar.gz + □ $ ln -s tyserv-2.0/typhoon . + □ $ ln -s tyserv-2.0/tyserv . + □ $ ln -s tyserv-2.0/rundir1 . + 5. PATH に ${HOME}/typhoon/bin, ${HOME}/tyserv/bin を追加する + ex. (/home/tyserv/.profile etc) + □ PATH="${PATH}:${HOME}/typhoon/bin" + □ PATH="${PATH}:${HOME}/tyserv/bin" + □ export PATH + 6. ユーザ tyserv で再度ログインする(上記の設定を有効にする) + 7. typhoon-1.11.0 をインストールする + □ typhoon-1.11.0.tar.gz を取得する + http://users.footprints.net/~kaz/typhoon.html + □ $ tar xvzf typhoon-1.11.0.tar.gz + □ $ cd typhoon-1.11.0; patch -p1 <../tyserv-2.0/ + typhoon-1.11.0.patch + □ $ ./configure; make + □ $ su + # make install; exit + 8. データベース定義ファイル(typhoondb.ddl)からデータベース定義 + (typhoondb.dbd)を生成する。この定義にはサンプルのテーブル + (smp1,smp2) の定義が含まれる。 + □ $ dbdgen typhoondb + 9. インポートコマンドファイル、エクスポートコマンドファイルを作成す + る + □ $ cd /home/tyserv/typhoon/dbd + □ $ tyimport -g typhoondb + □ $ cp typhoondb.imp typhoondb.smp1.imp + □ $ vi typhoondb.smp1.imp <-- テーブル smp1 のimport命令部分だ + け残す + □ $ tyexport -g typhoondb + □ $ cp typhoondb.exp typhoondb.smp1.exp + □ $ vi typhoondb.smp1.exp <-- テーブル smp1 のexport命令部分だ + け残す + □ 同様に typhoondb.smp2.imp, typhoondb.smp2.exp も作成して下さ + い +10. データベースサーバ本体の tyserv を生成する(あらかじめ libwrap を インストールしておいて下さい) - $ cd ~tyserv/tyserv/src - $ make src - $ make - $ make install -12. 起動スクリプト rc.tyserv を適切なディレクトリへコピーする - $ su - # cp ~tyserv/tyserv/etc/rc.tyserv /etc/rc.d/ -13. ブート時に起動スクリプトが動くように設定する - ex. (/etc/rc.d/rc.local etc) - if [ -x /etc/rc.d/rc.tyserv ]; then - . /etc/rc.d/rc.tyserv - fi -14. 必要に応じてコンフィグファイル ~tyserv/tyserv/conf/tyserv.conf を編集する -15. システムをリブートする -16. ユーザ tyserv でログインする -17. サンプルスクリプトを動かして動作確認を行う - $ cd ~tyserv/tyserv/sample - $ ./sample1.pl localhost 20000 - $ ./sample2.pl localhost 20000 -18. 本番運用に備えて -18.1. ~tyserv/tyserv/etc/passwd ファイルを編集し、 - - ユーザ:パスワード:アクセス権限(*) - - を設定する。特に、デフォルトのパスワードは必ず変えて下さい。 - chmod 600 ~tyserv/tyserv/etc/passwd を実行する。 - - (*) アクセス権限 - all : データベースの参照、更新、SHUTDOWN ができる。 - full : データベースの参照、更新ができる。 - get : データベースの参照ができる。 - -18.2 /etc/hosts.allow, /etc/hosts.deny を適切に設定する + □ $ cd /home/tyserv/tyserv/src + □ $ make src + □ $ make + □ $ make install +11. 起動スクリプト rc.tyserv を適切なディレクトリへコピーする + □ $ su + □ # cp /home/tyserv/tyserv/etc/rc.tyserv /etc/rc.d/ +12. ブート時に起動スクリプトが動くように設定する + ex. (/etc/rc.d/rc.local etc) + if [ -x /etc/rc.d/rc.tyserv ]; then + . /etc/rc.d/rc.tyserv -d /home/tyserv/rundir1 + fi + +13. 必要に応じてコンフィグファイル /home/tyserv/rundir1/conf/ + tyserv.conf を編集する +14. システムをリブートする +15. ユーザ tyserv でログインする +16. サンプルスクリプトを動かして動作確認を行う + □ $ cd /home/tyserv/tyserv/sample + □ $ ./sample1.pl localhost 20000 + □ $ ./sample2.pl localhost 20000 +17. 本番運用に備えて + □ /home/tyserv/tyserv/etc/passwd ファイルを編集し、 + + ユーザ:パスワード:アクセス権限(*) + + を設定する。特に、デフォルトのパスワードは必ず変えて下さい。 + chmod 600 /home/tyserv/tyserv/etc/passwd を実行する。 + + (*) アクセス権限 + ☆ all : データベースの参照、更新、SHUTDOWN ができる。 + ☆ full : データベースの参照、更新ができる。 + ☆ get : データベースの参照ができる。 + □ /etc/hosts.allow, /etc/hosts.deny を適切に設定する + +コンフィグファイル(/home/tyserv/rundir1/conf/tyserv.conf)のパラメータ +===================================================================== + + ・ HOST_NAME=localhost + tyservの稼働するホスト名の指定 + (適切に設定する) + ・ DAEMON_NAME=tyserv + /etc/hosts.allow,/etc/hosts.deny に記述するデーモン名の指定 + (特に変える必要は無いでしょう) + ・ SOCKET_PORT=20000 + tyservに接続するためのポート番号の指定 + (適切に設定する) + ・ SOCKET_WAIT_QUEUE=128 + SOCKET_PORTに対するバックログの指定 + (特に変える必要は無いでしょう) + ・ TYPHOON_DIR=/home/tyserv/typhoon + typhoon 用ディレクトリの指定 + (事実上固定値です(^^;) + ・ TYSERV_DIR=/home/tyserv/tyserv + tyserv 用ディレクトリの指定 + (事実上固定値です(^^;) + ・ RVJ_SW=1 + リカバリジャーナルの設定(1:取得する 1以外:取得しない) + 通常は「1」が望ましいが、データの復旧はバックアップを戻すだけで十 + 分と割り切れるなら、速度重視で「0」でも良いかなぁ... + ・ SAFER_SW=1 + 安全モードの設定(1:設定する 1以外:設定しない) + □ 安全モード設定時 + ジャーナル出力直後に fsync 実行 + 更新スピードは遅くなるが、ジャーナル記録の確実性が高い + □ 安全モード非設定時 + ジャーナル出力直後に fsync 実行無し + ジャーナル記録の確実性は低いが、更新スピードが速い + UPS等の利用が望ましい + 通常は「1」が望ましいが、UPSが利用できたり、ノートパソコンで稼働 + させたりで、不意の電源断等が回避できている状況なら「0」でいいかも + 。 + ・ DEBUG=0 + デバッグモード(1:設定する 1以外:設定しない) + (特に変える必要は無いでしょう) tyserv へのアクセス方法 ======================= -tyserv の開いているソケットポートにコマンドを書き込んで、同一ポートから -結果を読み取ることでアクセスを行います。よって、ソケット通信をサポート -する全ての言語から tyserv へのアクセスを行うことが出来るはずです。簡単 -な話し telnet でアクセス出来ます(実用的かは別にして(^^;)。 +tyserv の開いているソケットポートにコマンドを書き込んで、同一ポートか +ら結果を読み取ることでアクセスを行います。よって、ソケット通信をサポ +ートする全ての言語から tyserv へのアクセスを行うことが出来るはずです +。簡単な話し telnet でアクセス出来ます(実用的かは別にして(^^;)。 -また、perl用のアクセスライブラリ tyserv/sample/tyserv.pl を用意してます。 -使い方は tyserv/sample 以下のスクリプトを参照して下さい。 +また、perl用のアクセスライブラリ tyserv/sample/tyserv.pl を用意してま +す。使い方は tyserv/sample 以下のスクリプトを参照して下さい。 各コマンドのトークンの区切り文字はタブ(0x09)です。 - o START_TRAN USER PASSWORD - 更新モードでトランザクションを開始します。先行するトランザクションが - 有る場合はそれらが全て終了するまで待ちます。また、本トランザクション - の実行中は後から開始されたトランザクションは全て待たされます。本トラ - ンザクション内で更新系のコマンドが実行された場合はロールバックに備え - てロールバックジャーナルが取得されます。 - - o START_TRAN_NJ USER PASSWORD - 更新モードでトランザクションを開始します。 START_TRAN との違いはロー - ルバックジャーナルを取得しない点です。ロールバック機能が利用できない - 代わりに、更新スピードを速めることが出来ます。この点をよく理解した上 - で利用して下さい。 - - o START_TRANM USER PASSWORD - 参照モードでトランザクションを開始します。更新モードのトランザクショ - ンが先行する場合に限り、それが終了するまで待ちます。また、本トランザ - クションの実行中は後から開始された更新モードのトランザクションは全て - 待たされます。 - - o GET RECNAME KEYNAME CONDITION KEYVALUE1 KEYVALUE2 ... + ・ START_TRAN USER PASSWORD + 更新モードでトランザクションを開始します。先行するトランザクショ + ンが有る場合はそれらが全て終了するまで待ちます。また、本トランザ + クションの実行中は後から開始されたトランザクションは全て待たされ + ます。本トランザクション内で更新系のコマンドが実行された場合はロ + ールバックに備えてロールバックジャーナルが取得されます。 + ・ START_TRAN_NJ USER PASSWORD + 更新モードでトランザクションを開始します。 START_TRAN との違いは + ロールバックジャーナルを取得しない点です。ロールバック機能が利用 + できない代わりに、更新スピードを速めることが出来ます。この点をよ + く理解した上で利用して下さい。 + ・ START_TRANM USER PASSWORD + 参照モードでトランザクションを開始します。更新モードのトランザク + ションが先行する場合に限り、それが終了するまで待ちます。また、本 + トランザクションの実行中は後から開始された更新モードのトランザク + ションは全て待たされます。 + ・ GET RECNAME KEYNAME CONDITION KEYVALUE1 KEYVALUE2 ... キー値で検索条件を指定し、目的のレコードを取得します。レコードは - - ステータス1 ステータス2 項目名1=値1 項目名2=値2 ... 項目名n=値n - - の形式で返ります(perl等のスクリプト言語からの利用を念頭にこのような - 仕様にしました)。区切り文字はタブです。 - + + ステータス1 ステータス2 項目名1=値1 項目名2=値2 ... 項目名n=値n + + の形式で返ります(perl等のスクリプト言語からの利用を念頭にこのよう + な仕様にしました)。区切り文字はタブです。 + CONDITIONには以下の条件が指定できます - EQ, == : キーの値が指定値に等しいレコードを検索します - GE, >=, => : キーの値が指定値以上で直近のレコードを検索します - GT, > : キーの値が指定値より大きく直近のレコードを検索します - - o GETNEXT RECNAME KEYNAME + □ EQ, == : キーの値が指定値に等しいレコードを検索します + □ GE, >=, => : キーの値が指定値以上で直近のレコードを検索します + □ GT, > : キーの値が指定値より大きく直近のレコードを検索します + ・ GETNEXT RECNAME KEYNAME 指定したキー項目の昇順に次のレコードを取得します。 - - o PUT RECNAME MEMBER1=VALUE1 MEMBER2=VALUE2 ... + ・ PUT RECNAME MEMBER1=VALUE1 MEMBER2=VALUE2 ... レコードを挿入します。 - - o UPDATE RECNAME PKEYVALUE1 PKEYVALUE2 ... MEMBER1=VALUE1 MEMBER2=VALUE2 ... + ・ UPDATE RECNAME PKEYVALUE1 PKEYVALUE2 ... MEMBER1=VALUE1 MEMBER2= + VALUE2 ... 主キーで特定したレコードの内容を更新します。 - - o DELETE RECNAME PKEYVALUE1 PKEYVALUE2 ... + ・ DELETE RECNAME PKEYVALUE1 PKEYVALUE2 ... 主キーで特定したレコードを削除します。 - - o ROLLBACK + ・ ROLLBACK トランザクションの開始時点、コミットの実行時点のうち、近いほうの 時点の状態にDBの内容を戻します。一般的にはロールバック実行時に排 他制御を解除する実装が普通ですが、tyserv では排他制御の解除を行い ません。 - - o COMMIT - トランザクションを確定します。一般的にはコミット実行時に排他制御を - 解除する実装が普通ですが、tyserv では排他制御の解除を行いません。 - - o ABORT_TRAN - トランザクションの開始時点、コミットの実行時点のうち、近いほうの時 - 点の状態にDBの内容を戻し、トランザクションを終了します。排他制御は - 解除されます。 - - o END_TRAN + ・ COMMIT + トランザクションを確定します。一般的にはコミット実行時に排他制御 + を解除する実装が普通ですが、tyserv では排他制御の解除を行いません + 。 + ・ ABORT_TRAN + トランザクションの開始時点、コミットの実行時点のうち、近いほうの + 時点の状態にDBの内容を戻し、トランザクションを終了します。排他制 + 御は解除されます。 + ・ END_TRAN トランザクションを確定し、終了します。排他制御の解除を行います。 - - o SHUTDOWN USER PASSWORD + ・ SHUTDOWN USER PASSWORD tyserv を停止します。 さらなる情報は tyserv/doc/*, tyserv/sample/*.pl を参照して下さい。 @@ -199,323 +262,534 @@ $ telnet localhost 20000 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. -start_tran user user <-Input -OK TRANSACTION START <-Response -put smp1 id=1111 name=Taro salary=150000 <-Input -OK INSERTED <-Response -put smp1 id=2222 name=Jiro salary=200000 <-Input -OK INSERTED <-Response -put smp1 id=3333 name=Goro salary=250000 <-Input -OK INSERTED <-Response -get smp1 pkey eq 1111 <-Input -OK FOUND id=1111 name=Taro salary=150000 <-Response -getnext smp1 pkey <-Input -OK FOUND id=2222 name=Jiro salary=200000 <-Response -getnext smp1 pkey <-Input -OK FOUND id=3333 name=Goro salary=250000 <-Response -update smp1 2222 name=Jirorin <-Input -OK UPDATED <-Response -get smp1 pkey eq 2222 <-Input -OK FOUND id=2222 name=Jirorin salary=250000 <-Response -delete smp1 2222 <-Input -OK DELETED <-Response -get smp1 pkey eq 2222 <-Input -NG NOTFOUND <-Response -rollback <-Input -OK ROLLBACKED <-Response -end_tran <-Input -OK TRANSACTION END <-Response +start_tran user user <-Input +OK TRANSACTION START <-Response +put smp1 id=1111 name=Taro salary=150000 <-Input +OK INSERTED <-Response +put smp1 id=2222 name=Jiro salary=200000 <-Input +OK INSERTED <-Response +put smp1 id=3333 name=Goro salary=250000 <-Input +OK INSERTED <-Response +get smp1 pkey eq 1111 <-Input +OK FOUND id=1111 name=Taro salary=150000 <-Response +getnext smp1 pkey <-Input +OK FOUND id=2222 name=Jiro salary=200000 <-Response +getnext smp1 pkey <-Input +OK FOUND id=3333 name=Goro salary=250000 <-Response +update smp1 2222 name=Jirorin <-Input +OK UPDATED <-Response +get smp1 pkey eq 2222 <-Input +OK FOUND id=2222 name=Jirorin salary=250000 <-Response +delete smp1 2222 <-Input +OK DELETED <-Response +get smp1 pkey eq 2222 <-Input +NG NOTFOUND <-Response +rollback <-Input +OK ROLLBACKED <-Response +get smp1 pkey eq 2222 <-Input +OK FOUND id=2222 name=Jirorin salary=250000 <-Response +end_tran <-Input +OK TRANSACTION END <-Response Connection closed by foreign host. -アクセス状態コード -================== - - +----+----------------------------------------------------+ - |STS1| STS2 | - +----+----------------------------------------------------+ - | OK | COMMITED | - | OK | DELETED | - | OK | FOUND | - | OK | INSERTED | - | OK | NORMAL SHUTDOWN | - | OK | ROLLBACKED | - | OK | TRANSACTION ABORT, ROLLBACKED | - | OK | TRANSACTION END | - | OK | TRANSACTION START | - | OK | UPDATED | - +----+----------------------------------------------------+ - | NG | ACCESS DENIED(ip address) | - | NG | CAN NOT OPEN DATABASE db_status=xxxx | - | NG | CAN NOT READ SOCKET | - | NG | DUPLICATE | - | NG | NO ROLLBACK JOURNAL | - | NG | NOT GRANTED | - | NG | NOTFOUND | - | NG | REQUIRE START_TRAN OR START_TRAN_NJ OR START_TRANM | - | NG | SOCKET READ ERROR | - | NG | SOCKET READ ERROR, ROLLBACKED | - | NG | STATUS=xxxx | - | NG | UNKNOWN CONDITION | - | NG | UNKNOWN FUNCTION | - | NG | UNKNOWN ITEM | - | NG | UNKNOWN KEY | - | NG | UNKNOWN RECORD | - +----+----------------------------------------------------+ +perl用アクセスライブラリ(tyserv.pl)利用例 +========================================= + +tyservへのアクセス部分だけに焦点をしぼったコーディング例ですのでエラ +ー対応のコーディングは一切省いています。御了承下さい。 +#! /usr/bin/perl +#--------------------------------------------------------- +# ソケット通信ライブラリ読み込み +use IO::Socket; +# +# tyservアクセスライブラリ読み込み +require 'tyserv.pl'; +#--------------------------------------------------------- +# ユーザ名設定 +$user = "manager"; +# +# パスワード設定 +$passwd = "manager"; +# +# ホスト名設定 +$host = "localhost"; +# +# ポート番号設定 +$port = 20000; +#--------------------------------------------------------- +# ソケットハンドル取得 +$handle = IO::Socket::INET->new(Proto => "tcp", + PeerAddr => $host, + PeerPort => $port); +# +# ソケットハンドルの自動フラッシュ設定 +$handle->autoflush(1); # so output gets there right away +#--------------------------------------------------------- +# 更新トランザクション開始 +($sts1, $sts2) = &ty_start_tran($handle, $user, $passwd); +#--------------------------------------------------------- +# レコード内容初期化 +%rec = (); +# +# レコード内容設定 +$rec{id} = "9999"; +$rec{name} = "Mr. X"; +$rec{salary} = 900000; +# +# レコード書き込み +($sts1, $sts2) = &ty_put($handle, "smp1", \%rec); +#--------------------------------------------------------- +# レコード内容初期化 +%rec = (); +# +# レコード読み込み +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["9999"]); +#--------------------------------------------------------- +# レコード項目更新 +$rec{salary} *= 10; +# +# レコード更新 +($sts1, $sts2) = &ty_update($handle, "smp1", ["9999"], \%rec); +#--------------------------------------------------------- +# レコード削除 +($sts1, $sts2) = &ty_delete($handle, "smp1", ["9999"]); +#--------------------------------------------------------- +# トランザクション終了 +($sts1, $sts2) = &ty_end_tran($handle); +#--------------------------------------------------------- +# プログラム終了 +exit 0; プログラミングの注意点 ====================== -o START_TRAN に始まり END_TRAN で終ること。 - START_TRAN_NJ ABORT_TRAN - START_TRANM - - END_TRAN, ABORT_TRAN を発行せずにクライアントを終了した場合は - ABORT_TRAN 扱いとなります。 - -o 共有参照アクセスを行う場合は START_TRANM で始めること。 + ・ START_TRAN, START_TRAN_NJ, START_TRANM に始まり END_TRAN, + ABORT_TRAN で終ること。 + + END_TRAN, ABORT_TRAN を発行せずにクライアントを終了した場合は + ABORT_TRAN 扱いとなります。 + ・ 共有参照アクセスを行う場合は START_TRANM で始めること。 + ・ START_TRAN* と END_TRAN, ABORT_TRAN の間はできる限り短く設計する + こと。 + ・ 長時間処理は適当な間隔でEND_TRAN(もしくは ABORT_TRAN)を発行し、ト + ランザクションを区切ること。 + ・ テーブルの項目に格納できるのは文字列のみです。また、文字列の中に + タブを含めることは出来ません。 -o START_TRAN* と END_TRAN, ABORT_TRAN の間はできる限り短く設計す - ること。 - -o 長時間処理は適当な間隔でEND_TRAN(もしくは ABORT_TRAN)を発行し、 - トランザクションを区切ること。 +アクセス状態コード +================== -インポートスクリプト(tyimp)の利用例 +┌──┬─────────────────────────┐ +│STS1│ STS2 │ +├──┼─────────────────────────┤ +│OK │COMMITED │ +├──┼─────────────────────────┤ +│OK │DELETED │ +├──┼─────────────────────────┤ +│OK │FOUND │ +├──┼─────────────────────────┤ +│OK │INSERTED │ +├──┼─────────────────────────┤ +│OK │NORMAL SHUTDOWN │ +├──┼─────────────────────────┤ +│OK │ROLLBACKED │ +├──┼─────────────────────────┤ +│OK │TRANSACTION ABORT, ROLLBACKED │ +├──┼─────────────────────────┤ +│OK │TRANSACTION END │ +├──┼─────────────────────────┤ +│OK │TRANSACTION START │ +├──┼─────────────────────────┤ +│OK │UPDATED │ +├──┼─────────────────────────┤ +│NG │ACCESS DENIED(ip address) │ +├──┼─────────────────────────┤ +│NG │CAN NOT OPEN DATABASE db_status=xxxx │ +├──┼─────────────────────────┤ +│NG │CAN NOT READ SOCKET │ +├──┼─────────────────────────┤ +│NG │DUPLICATE │ +├──┼─────────────────────────┤ +│NG │NO ROLLBACK JOURNAL │ +├──┼─────────────────────────┤ +│NG │NOT GRANTED │ +├──┼─────────────────────────┤ +│NG │NOTFOUND │ +├──┼─────────────────────────┤ +│NG │REQUIRE START_TRAN OR START_TRAN_NJ OR START_TRANM│ +├──┼─────────────────────────┤ +│NG │SOCKET READ ERROR │ +├──┼─────────────────────────┤ +│NG │SOCKET READ ERROR, ROLLBACKED │ +├──┼─────────────────────────┤ +│NG │STATUS=xxxx │ +├──┼─────────────────────────┤ +│NG │UNKNOWN CONDITION │ +├──┼─────────────────────────┤ +│NG │UNKNOWN FUNCTION │ +├──┼─────────────────────────┤ +│NG │UNKNOWN ITEM │ +├──┼─────────────────────────┤ +│NG │UNKNOWN KEY │ +├──┼─────────────────────────┤ +│NG │UNKNOWN RECORD │ +└──┴─────────────────────────┘ + +データベース定義(typhoondb.ddl)の掟 =================================== -o tyimp の読み込む定義ファイルを作成する + 1 database typhoondb { + 2 data file "smp1.dat" contains smp1; + 3 key file "smp1.pk" contains smp1.smp1_pkey; + 4 key file "smp1.s1" contains smp1.smp1_skey1; + 5 record smp1 { + 6 char id[4 + 1]; + 7 char name[20 + 1]; + 8 char salary[7 + 1]; + 9 primary key smp1_pkey { id asc }; +10 alternate key smp1_skey1 { name asc, id asc }; +11 } +12 } - $ cd ~tyserv/typhoon/dbd - $ tyimport -g typhoondb +解説 - tyimport(typhoon-1.11.0に付属のコマンド)が作成する - 定義ファイル(typhoondb.imp)にはデータベース(typhoondb)に - 含まれる全てのテーブルのインポート定義が含まれています。 + 1 データベース定義の開始文 + database データベース名 { - $ cp typhoondb.imp typhoondb.smp1.imp - $ vi typhoondb.smp1.imp + o データベース名は「typhoondb」に限る - typhoondb.imp を typhoondb.テーブル名.imp にコピーし、該 - 当テーブルに関する定義のみを残すように編集します。tyimp - は typhoondb.テーブル名.imp を定義ファイルとして読み込み - ます。 + 2 データ格納ファイル指定文 + data file "ファイル名" contains テーブル名; -o 実行する + o ファイル名は「テーブル名.dat」に限る - $ tyimp typhoondb smp1 < foo.txt - - foo.txt(各項目をタブで区切ったCSVファイル)を読み込み、デー - タベース(typhoondb)に含まれるテーブル(smp1)にインポートを - 行う。foo.txtの各行は必ずインポート定義ファイル(typhoondb.smp1.imp) - に定義されている項目と同じ数のフィールドを含んでいなければならない。 - -エクスポートスクリプト(tyexp)の利用例 -===================================== + 3 主キー格納ファイル指定文 + key file "ファイル名" contains テーブル名.テーブル名_pkey; -o tyexp の読み込む定義ファイルを作成する + o 主キーはテーブルに1個のみ存在できる + o ファイル名は「テーブル名.pk」に限る - $ cd ~tyserv/typhoon/dbd - $ tyexport -g typhoondb + 4 副キー格納ファイル指定文 + key file "ファイル名" contains テーブル名.テーブル名_skey連番; - tyexport(typhoon-1.11.0に付属のコマンド)が作成する - 定義ファイル(typhoondb.exp)にはデータベース(typhoondb)に - 含まれる全てのテーブルのエクスポート定義が含まれています。 + o 副キーはテーブルに複数個存在できる + o ファイル名は「テーブル名.s連番」に限る + o 連番は1から順に副キー毎に符番する - $ cp typhoondb.exp typhoondb.smp1.exp - $ vi typhoondb.smp1.exp + 5 テーブル定義開始文 + record テーブル名 { - typhoondb.exp を typhoondb.テーブル名.exp にコピーし、該 - 当テーブルに関する定義のみを残すように編集します。tyexp - は typhoondb.テーブル名.exp を定義ファイルとして読み込み - ます。 + 6 項目定義文 + 7 項目定義文 + 8 項目定義文 + char 項目名[項目長 + 1]; -o 実行する + o 属性は「char」のみ指定できる - $ tyexp typhoondb smp1 > foo.txt + 9 主キー定義文 + primary key テーブル名_pkey { 項目名 並び順[, 項目名 並び順] ... }; - データベース(typhoondb)に含まれるテーブル(smp1)のデータを - foo.txt(各項目をタブで区切ったCSVファイル)に出力します。 + o 主キーはテーブルに1個のみ存在できる + o 主キーはレコードをユニークに特定できる項目で構成しなければならない + o 並び順は昇順の場合は「asc」、降順の場合は「desc」 -tyserv 再生成 -============= +10 副キー定義文 + alternate key テーブル名_skey連番 { 項目名 並び順[, 項目名 並び順] ... }; -データベース定義(typhoondb.ddl)を更新した場合、typhoondb.dbd, -tyserv, tyrecover を再生成する必要が有ります。 + o 副キーはテーブルに複数個存在できる + o 副キーは重複を許す。但し、重複キーを持つレコードの並び順が不定なのは + 不安なので(^^;、主キーの構成項目を末尾に追加することを推奨します + o 連番は1から順に副キー毎に符番する -1. $ dbdgen typhoondb -2. kill -TERM tyservのpid -3. $ cd ~tyserv/tyserv/src -4. $ make backup -5. $ make src -6. $ make -7. $ make install -8. $ /etc/rc.d/rc.tyserv +11 テーブル定義の終了 + } -データベース定義(typhoondb.ddl)を更新した場合(テーブルの追加等)、 -typhoondb.dbd, tyserv, tyrecover を再生成する必要が有ります。 +12 データベース定義の終了 + } -1. $ dbdgen typhoondb -2. kill -TERM tyservのpid -3. $ cd ~tyserv/tyserv/src -4. Makefile を編集し `OBJS' マクロを修正します。 - ex. テーブル `smp1' が有る場合 OBJS は以下のように定義されています。 +インポートスクリプト(tyimp)の利用例 +=================================== - OBJS = tyserv_smp1.o + ・ tyimp の読み込む定義ファイルを作成する + □ $ cd /home/tyserv/typhoon/dbd + □ $ tyimport -g typhoondb + + tyimport(typhoon-1.11.0に付属のコマンド)が作成する定義ファイ + ル(typhoondb.imp)にはデータベース(typhoondb)に含まれる全ての + テーブルのインポート定義が含まれています。 + □ $ cp typhoondb.imp typhoondb.smp1.imp + □ $ vi typhoondb.smp1.imp + + typhoondb.imp を typhoondb.テーブル名.imp にコピーし、該当テ + ーブルに関する定義のみを残すように編集します。tyimp は + typhoondb.テーブル名.imp を定義ファイルとして読み込みます。 + ・ 実行する + □ $ tyimp typhoondb smp1 < foo.txt + + foo.txt(各項目をタブで区切ったCSVファイル)を読み込み、データ + ベース(typhoondb)に含まれるテーブル(smp1)にインポートを行う。 + foo.txtの各行は必ずインポート定義ファイル(typhoondb.smp1.imp) + に定義されている項目と同じ数のフィールドを含んでいなければな + らない。 - そこにテーブル `smp2' を追加する場合 OBJS の定義は以下のように - なります。 +エクスポートスクリプト(tyexp)の利用例 +===================================== - OBJS = tyserv_smp1.o \ - tyserv_smp2.o + ・ tyexp の読み込む定義ファイルを作成する + □ cd /home/tyserv/typhoon/dbd + □ tyexport -g typhoondb + + tyexport(typhoon-1.11.0に付属のコマンド)が作成する定義ファイ + ル(typhoondb.exp)にはデータベース(typhoondb)に含まれる全ての + テーブルのエクスポート定義が含まれています。 + □ $ cp typhoondb.exp typhoondb.smp1.exp + □ $ vi typhoondb.smp1.exp + + typhoondb.exp を typhoondb.テーブル名.exp にコピーし、該当テ + ーブルに関する定義のみを残すように編集します。tyexp は + typhoondb.テーブル名.exp を定義ファイルとして読み込みます。 + ・ 実行する + □ $ tyexp typhoondb smp1 > foo.txt + + データベース(typhoondb)に含まれるテーブル(smp1)のデータを + foo.txt(各項目をタブで区切ったCSVファイル)に出力します。 - オブジェクトの名称は "tyserv_" + table_name + ".o" でないといけ - ません。 +tyserv 再生成 +============= -5. $ make backup -6. $ make src -7. $ make -8. $ make install -9. $ /etc/rc.d/rc.tyserv + ・ データベース定義(typhoondb.ddl)を更新した場合、typhoondb.dbd, + tyserv, tyrecover, tysearch を再生成する必要が有ります。 + 1. $ dbdgen typhoondb + 2. $ kill -TERM tyservのpid + 3. $ cd /home/tyserv/tyserv/src + 5. $ make src + 6. $ make + 7. $ make install + 8. $ /etc/rc.d/rc.tyserv -d /home/tyserv/rundir1 + ・ データベース定義(typhoondb.ddl)を更新した場合(テーブルの追加等)、 + typhoondb.dbd, tyserv, tyrecover, tysearch を再生成する必要が有ります。 + 1. $ dbdgen typhoondb + 2. $ kill -TERM tyservのpid + 3. $ cd /home/tyserv/tyserv/src + 4. Makefile を編集し `OBJS' マクロを修正します。 + + ex. テーブル `smp1' が有る場合 OBJS は以下のように定義されて + います。 + OBJS = tyserv_smp1.o + + そこにテーブル `smp2' を追加する場合 OBJS の定義は以下のよう + になります。 + OBJS = tyserv_smp1.o \ + tyserv_smp2.o + + + オブジェクトの名称は "tyserv_" + table_name + ".o" でないとい + けません。 + 6. $ make src + 7. $ make + 8. $ make install + 9. $ /etc/rc.d/rc.tyserv -d /home/tyserv/rundir1 起動スクリプト(rc.tyserv) ========================= -o usage : rc.tyserv [-w] - - -w : warm起動をします。 - リカバリジャーナル(~tyserv/tyserv/journal/rvj.dat)は - 起動時点の内容に追加出力されます。 - ロールバックジャーナル(~tyserv/tyserv/journal/rbj.dat) - が存在する場合は自動的にロールバック処理が実行されます。 - - オプション無し : cold起動をします。 - 起動時点のリカバリジャーナルの内容は破棄され、先頭から - 書き出されます。 - 起動時点のロールバックジャーナルの内容は破棄され、ロー - ルバックは行われません。 - - サーバは自動的にバックグラウンドで実行されます。 + ・ usage : rc.tyserv [-w] [-d 実行時ディレクトリ] + □ -w : warm起動をします。 + ☆ リカバリジャーナル(実行時ディレクトリ/journal/rvj.dat)は + 起動時点の内容に追加出力されます。 + ☆ ロールバックジャーナル(実行時ディレクトリ/journal/ + rbj.dat) が存在する場合は自動的にロールバック処理が実行さ + れます。 + □ -w 無し : cold起動をします。 + ☆ 起動時点のリカバリジャーナルの内容は破棄され、先頭から書 + き出されます。 + ☆ 起動時点のロールバックジャーナルの内容は破棄され、ロール + バックは行われません。 + □ -d 実行時ディレクトリ : 省略時は /home/tyserv/rundir1 + +サーバは自動的にバックグラウンドで実行されます。 データベース復旧ツール(tyrecover.sh) ==================================== -o usage : tyrecover.sh [ファイル] - - ファイル : 未指定時は ${TYSERV_DIR}/journal/rvj.dat を仮定する - `-' 指定時は標準入力から入力される - -o 皆さんはディスクのバックアップは取っておられますか?。取って - ないという方も大勢おられると思います。また取っているとしても - 毎日取るなんて方は極まれなんではないでしょうか。 - - でもこれが業務システムの利用するデータベースとなると、最低で - も1日1回のバックアップが必要でしょう。 - - しかし1日1回のバックアップではディスククラッシュ等のタイミ - ングによって最悪24時間前の状態戻すのが精いっぱいで、その後 - の入力データに関しては入力伝票をかき集めて、もう一度手作業で - 入力しなおさなければなりません。業務システムに関して言えばこ - れは - - 致 命 的 - - です。そこで tyserv では直近のバックアップ + リカバリジャーナ - ルを利用してクラッシュの直前の状態にデータベースを復元するツー - ル tyrecover.sh を用意しています。 - - tyrecover.sh の利用はバックアップのタイミングと密接に関係して - きます。以下にバックアップ運用例と障害時の復旧例を示します。 - -o 通常の運用タイムスケジュール例(1日に1回バックアップの場合) - - 00:00 23:00 00:00 23:00 00:00 - tyserv +---------------+ +----------------+ +---... - cold起動 停止 cold起動 停止 - - backup +------+ +-----+ - 開始 終了 開始 終了 - - この例では毎日23:00〜00:00の1時間でバックアップを取っています。 - -o 通常の運用タイムスケジュール例(3日に1回バックアップ&システム - の稼働は9-18時に限る場合) - - 09 18 09 18 09 18 09 18 09 18 - tyserv +----+ +----+ +----+ +----+ +----+... - cold 停止 warm 停止 warm 停止 cold 停止 warm 停止 - 起動 起動 起動 起動 起動 - backup +-+ - - この例の場合バックアップを取った直後の起動に限り、cold起動 して - る点に気をつけて下さい。また、毎回の停止時にリカバリジャーナルだ - けでもバックアップしておくようにするとさらに安全です。さらにジャー - ナルだけ別パーティションにするのも安全です。ディスククラッシュと - 同時にリカバリジャーナルまでふっ飛ぶと、どうしようもないですから - (^^;。 - -o 障害発生時の対応 - - 計画停止 起動 ダウン 復旧 計画停止 起動 - tyserv ...---+ +-------* - - - - - +------+ +----... - backup +-----+ | | +-----+ - 障害発生 | - | | - restore +-----+ | - recover +-----+ - - o backup例 : $ cd /home/tyserv/typhoon/data - $ tar cvzf /dev/st0 . - - o restore例 : $ cd /home/tyserv/typhoon/data - $ tar xvzpf /dev/st0 - - o recover例 : $ tyrecover.sh - -o バックアップ運用のまとめ - - o 停止後にバックアップを取った場合は次回の起動はcold起動 - o 停止後にバックアップを取らなかった場合は次回の起動はwarm起動 - o リカバリジャーナルは毎回停止時にバックアップ取るのが安全 - -o リカバリ運用のまとめ - - o バックアップからデータベースを元に戻す - o tyrecover.sh を実行し、クラッシュ直前の状態まで復旧する + ・ usage : tyrecover.sh [-d 実行時ディレクトリ] [-stdin] + + □ -d 実行時ディレクトリ : + 実行時ディレクトリ/journal/rvj.dat からデータベースの復旧を行 + う。実行時ディレクトリ未指定時は ${HOME}/rundir1/journal/ + rvj.datから復旧を行う。 + □ -stdin : リカバリジャーナルを標準入力から読む + ・ 皆さんはディスクのバックアップは取っておられますか?。取ってない + という方も大勢おられると思います。また取っているとしても毎日取る + なんて方は極まれなんではないでしょうか。 + + でもこれが業務システムの利用するデータベースとなると、最低でも1 + 日1回のバックアップが必要でしょう。 + + しかし1日1回のバックアップではディスククラッシュ等のタイミング + によって最悪24時間前の状態戻すのが精いっぱいで、その後の入力デ + ータに関しては入力伝票をかき集めて、もう一度手作業で入力しなおさ + なければなりません。業務システムに関して言えばこれは + + 致命的 + + です。そこで tyserv では直近のバックアップ + リカバリジャーナルを + 利用してクラッシュの直前の状態にデータベースを復元するツール + tyrecover.sh を用意しています。 + + tyrecover.sh の利用はバックアップのタイミングと密接に関係してきま + す。以下にバックアップ運用例と障害時の復旧例を示します。 + ・ 通常の運用タイムスケジュール例(1日に1回バックアップの場合) + 00:00 23:00 00:00 23:00 00:00 + tyserv +---------------+ +----------------+ +---... + cold起動 停止 cold起動 停止 + + backup +------+ +-----+ + 開始 終了 開始 終了 + + + この例では毎日23:00〜00:00の1時間でバックアップを取っています。 + ・ 通常の運用タイムスケジュール例(3日に1回バックアップ&システムの + 稼働は9-18時に限る場合) + 09 18 09 18 09 18 09 18 09 18 + tyserv +----+ +----+ +----+ +----+ +----+... + cold 停止 warm 停止 warm 停止 cold 停止 warm 停止 + 起動 起動 起動 起動 起動 + backup +-+ + + + この例の場合バックアップを取った直後の起動に限り、cold起動してる + 点に気をつけて下さい。また、毎回の停止時にリカバリジャーナルだけ + でもバックアップしておくようにするとさらに安全です。さらにジャー + ナルだけ別パーティションにするのも安全です。ディスククラッシュと + 同時にリカバリジャーナルまでふっ飛ぶと、どうしようもないですから + (^^;。 + ・ 障害発生時の対応 + 計画停止 起動 ダウン 復旧 計画停止 起動 + tyserv ...---+ +-------* - - - - - +------+ +----... + backup +-----+ | | +-----+ + 障害発生 | + | | + restore +-----+ | + recover +-----+ + + □ backup例 : + $ cd /home/tyserv/typhoon/data + $ tar cvzf /dev/st0 . + □ restore例 : + $ cd /home/tyserv/typhoon/data + $ tar xvzpf /dev/st0 + □ recover例 : + $ tyrecover.sh -d /home/tyserv/rundir1 + ・ バックアップ運用のまとめ + □ 停止後にバックアップを取った場合は次回の起動はcold起動 + □ 停止後にバックアップを取らなかった場合は次回の起動はwarm起動 + □ リカバリジャーナルは毎回停止時にバックアップ取るのが安全 + ・ リカバリ運用のまとめ + □ バックアップからデータベースを元に戻す + □ tyrecover.sh を実行し、クラッシュ直前の状態まで復旧する + +マルチサーバ構成 +================ + +tyservは排他の単位がデータベースなので、排他モードのトランザクション +実行時に全てのテーブルに排他がかかります。これは、一つの tyserv プロ +セスが全てのクライアントからの更新トランザクションを受け付け、処理す +ることで共有そのものを避ける方法で排他制御を行っている(というか行わず +にすましてるというか...)為にしかたのないことです(^^;。 + +そこでtyserv-2.0ではデータベースに含まれるテーブルを幾つかのグループ +に分けて、そのグループ毎に別々のサーバを起動することで排他の粒度を細 +かくできるように拡張を行いました。 + + ・ rc.tyserv(サーバ起動スクリプト)の拡張 + サーバ毎に実行環境を指定するために「-d 実行ディレクトリ」オプショ + ンが追加されました。「実行ディレクトリ」はサーバ毎に個別に指定す + る必要があります。「実行ディレクトリ」には「conf」「etc」「 + journal」ディレクトリ、「conf/tyserv.conf」ファイルが必要です。 + ・ tyserv.confの追加パラメータ + マルチサーバ構成で運用する場合は各サーバ毎に「tyserv.conf」を用意 + し、そのサーバでアクセスするテーブルを指定する必要があります。そ + のために「TABLE_LIST=テーブル名」パラメータを指定します。アクセス + するテーブルの数だけこのパラメータを繰り返し指定して下さい。 + + 「TABLE_LIST=テーブル名」が存在しない場合、従来と同様に全てのテー + ブルにアクセスできます。 + + 注意する点として、別の「tyserv.conf」に同じテーブルを指定する事は + 可能ですが、その場合そのテーブルに対する更新トランザクションのア + トミック性が保証されなくなりますので決してそのような指定は行わな + いで下さい。 + + また「SOCKET_PORT=ポート番号」は各「tyserv.conf」でユニークになる + ように設定して下さい。 + ・ プログラミング上の注意点 + マルチサーバ構成で運用することにより、一つのアプリケーションから + 複数のサーバに対して START_TRAN, START_TRAN_NJ, START_TRANM コマ + ンドを発行する可能性が生じますが、その場合、同時に実行されている + 別のアプリケーションとの間でデッドロックが発生する可能性がありま + す。残念な事ですがtyservにはクライアントにデッドロックの検出を伝 + える機能がありません(^^;。そこで、アプリケーションの作成者はあら + かじめデッドロックを起こさないようにアプリケーションを設計する必 + 要があります。その方法とは(同時に動き得る)全てのアプリケーション + から発行する START_TRAN, START_TRAN_NJ, START_TRANM コマンドの順 + 序を統一する事です。たとえば、(IPアドレス,)ポート番号の小さいサー + バから順に発行していく等の方法が考えられます。 + + ...とはいえ、複数の人間で開発してるとこういうプロジェクトルールが + 守られないケースも発生して来ますよね(^^;。そこで、とりあえずです + がサンプルディレクトリの tyserv.pl に複数トランザクションを一括統 + 一した順序で扱うための関数を追加しました。いかにも場当たり的な物 + ですが perl でアプリケーションを開発される場合には御活用下さいま + せ。 + □ @tran_param = (port, handle, user, password, mode, + 以上繰り返し ) + □ ty_start_trans(@tran_param) + □ ty_end_trans(@tran_param) + □ ty_abort_trans(@tran_param) + □ ty_commits(@tran_param) + □ ty_rollbacks(@tran_param) + ・ サンプルスクリプトの動かし方 + □ $ cd /home/tyserv + □ $ ln -s tyserv-2.0/rundir2 . + □ $ /etc/rc.d/rc.tyserv -d /home/tyserv/rundir2 + □ $ cd /home/tyserv/tyserv/sample + □ $ ./sample3.pl localhost 20000 update 20001 update + +tysearch(検索コマンド)実行例 +============================ + +シェルから検索するためのコマンドを提供します。本コマンドは直接データベー +スをアクセスするので、サーバが起動していなくても使用できますが、当然ト +ランザクション管理の範囲外で動作しますので、その点御理解頂いた上で利用 +して下さい。 + +$ tysearch -h <-- ヘルプの表示 +usage : tysearch table start_count rec_count key_name key_value ... +environment value : TYPHOON_DIR + +$ tysearch smp1 1 3 pkey 0003 <-- テーブルsmp1のpkeyが0003以上のレコー + ドに位置付け、1件目から3レコードを + stdoutに出力する + +OK FOUND id=0003 name=Kiyoshi Sakamoto salary=0510000 +OK FOUND id=0004 name=Masaharu Sawada salary=0470000 +OK FOUND id=0005 name=Masahiko Ito salary=0300000 +$ TODO & BUGS =========== -o 現行のtyservは排他の単位がデータベースなので、排他モードの - トランザクション実行時に全てのテーブルに排他がかかります。 - これは、一つの tyserv プロセスが全てのクライアントからの更 - 新トランザクションを受け付け、処理することで共有そのものを - 避ける方法で排他制御を行っている(というか行わずにすましてる - というか...)為にしかたのないことです(^^;。 - - かといって、tyserv自身でリソースの管理を行い、粒度の細かい - 排他制御を実現するのは作者の力不足のため非常に困難です。 - - そこで次善の策としてデータベースを分割し tyserv をその数だ - け立ち上げるという方法で排他の粒度を幾分細かくすることがで - きると考えてます。このあたりの手順、検証等を今後行なってい - きたいと思ってます。 - -o データベース復旧ツール(tyrecover.sh)はコミット情報を参照し - てません。よってデータベースは常にリカバリジャーナルの最後 - まで復旧されてしまいます。将来的には最終のコミット時点まで - 復旧するようにしたいと考えてます。 - -o テーブルの項目に格納できるのは文字列のみです。また、文字列 - の中にタブを含めることは出来ません。 + ・ データベース復旧ツール(tyrecover.sh)はコミット情報を参照してませ + ん。よってデータベースは常にリカバリジャーナルの最後まで復旧され + てしまいます。将来的には最終のコミット時点まで復旧するようにした + いと考えてます。 + ・ /home/tyserv/tyserv/etc/passwd 中のパスワードは暗号化されてません + 。パーミッションに注意してください。 typhoon-1.11.0の情報 ==================== -see typhoon-1.11.0/man/* - typhoon-1.11.0/examples/* - http://users.footprints.net/~kaz/typhoon.html - ---- -Masahiko Ito -m-ito@mbox.kyoto-inet.or.jp -http://web.kyoto-inet.or.jp/people/m-ito/index.html + ・ typhoon-1.11.0/man/* + ・ typhoon-1.11.0/examples/* + ・ http://users.footprints.net/~kaz/typhoon.html diff --git a/README.bak b/README.bak deleted file mode 100644 index 65acc90..0000000 --- a/README.bak +++ /dev/null @@ -1,521 +0,0 @@ -tyserv-1.0 -- database server which use typhoon RDBMS as database engine -Copyright (C) 2002 Masahiko Ito - -These programs is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -These programs is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with these programs; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Mail suggestions and bug reports for these programs to -m-ito@mbox.kyoto-inet.or.jp - -紹介 -==== - - tyserv はUNIX系OSで利用することを念頭に開発されているデータベースマ -ネージャです。tyserv はその基本エンジン部分に Typhoon Relational -Database Management System v1.11.0(*) を使用しています。tyserv の提 -供する主な機能は以下のものです。 - - 1. ソケットインターフェースを利用したネットワーク越しのアクセス機能 - 2. 障害に備えたジャーナルファイル(ロールバック、リカバリ)取得機能 - 3. 排他制御機能 - 4. トランザクション機能 - o ロールバック(ロールバックジャーナルによる) - o コミット - 5. DB復旧機能(リカバリジャーナルによる) - 6. IPアドレスによるアクセス制限機能(/etc/hosts.allow, /etc/hosts.denyによる) - 7. ユーザ認証によるアクセス制限機能(~tyserv/tyserv/etc/passwdによる) - - (*) http://users.footprints.net/~kaz/typhoon.html - -インストール -============ - -1. システムにユーザ tyserv を追加する -2. ユーザ tyserv 用にホームディレクトリ /home/tyserv を作成する -3. tyserv でログインする -4. $ tar xvzf tyserv-1.0.tar.gz - $ ln -s tyserv-1.0/typhoon . - $ ln -s tyserv-1.0/tyserv . -5. PATH に ${HOME}/typhoon/bin, ${HOME}/tyserv/bin を追加する - ex. (~tyserv/.profile etc) - PATH="${PATH}:${HOME}/typhoon/bin" - PATH="${PATH}:${HOME}/tyserv/bin" - export PATH -6. 環境変数 TYPHOON_DIR, TYPHOON_DB, TYSERV_DIR を設定する - ex. (~tyserv/.profile etc) - TYPHOON_DIR=${HOME}/typhoon;export TYPHOON_DIR - TYPHOON_DB=typhoondb;export TYPHOON_DB - TYSERV_DIR=${HOME}/tyserv;export TYSERV_DIR -7. ユーザ tyserv で再度ログインする(上記5. 6. の設定を有効にする) -8. typhoon-1.11.0 をインストールする -8.1. typhoon-1.11.0.tar.gz を取得する - http://users.footprints.net/~kaz/typhoon.html -8.2. $ tar xvzf typhoon-1.11.0.tar.gz -8.3. $ cd typhoon-1.11.0; patch -p1 <../tyserv-1.0/typhoon-1.11.0.patch -8.4. $ ./configure; make -8.5. $ su - # make install; exit -9. データベース定義ファイル(typhoondb.ddl)からデータベース定義 - (typhoondb.dbd)を生成する。この定義にはサンプルのテーブル(smp1) - の定義が含まれる。 - $ dbdgen typhoondb -10. インポートコマンドファイル、エクスポートコマンドファイルを作成する - $ cd ~tyserv/typhoon/dbd - $ tyimport -g typhoondb - $ cp typhoondb.imp typhoondb.smp1.imp - $ tyexport -g typhoondb - $ cp typhoondb.exp typhoondb.smp1.exp -11. データベースサーバ本体の tyserv を生成する(あらかじめ libwrap を - インストールしておいて下さい) - $ cd ~tyserv/tyserv/src - $ make src - $ make - $ make install -12. 起動スクリプト rc.tyserv を適切なディレクトリへコピーする - $ su - # cp ~tyserv/tyserv/etc/rc.tyserv /etc/rc.d/ -13. ブート時に起動スクリプトが動くように設定する - ex. (/etc/rc.d/rc.local etc) - if [ -x /etc/rc.d/rc.tyserv ]; then - . /etc/rc.d/rc.tyserv - fi -14. 必要に応じてコンフィグファイル ~tyserv/tyserv/conf/tyserv.conf を編集する -15. システムをリブートする -16. ユーザ tyserv でログインする -17. サンプルスクリプトを動かして動作確認を行う - $ cd ~tyserv/tyserv/sample - $ ./sample1.pl localhost 20000 - $ ./sample2.pl localhost 20000 -18. 本番運用に備えて -18.1. ~tyserv/tyserv/etc/passwd ファイルを編集し、 - - ユーザ:パスワード:アクセス権限(*) - - を設定する。特に、デフォルトのパスワードは必ず変えて下さい。 - chmod 600 ~tyserv/tyserv/etc/passwd を実行する。 - - (*) アクセス権限 - all : データベースの参照、更新、SHUTDOWN ができる。 - full : データベースの参照、更新ができる。 - get : データベースの参照ができる。 - -18.2 /etc/hosts.allow, /etc/hosts.deny を適切に設定する - -tyserv へのアクセス方法 -======================= - -tyserv の開いているソケットポートにコマンドを書き込んで、同一ポートから -結果を読み取ることでアクセスを行います。よって、ソケット通信をサポート -する全ての言語から tyserv へのアクセスを行うことが出来るはずです。簡単 -な話し telnet でアクセス出来ます(実用的かは別にして(^^;)。 - -また、perl用のアクセスライブラリ tyserv/sample/tyserv.pl を用意してます。 -使い方は tyserv/sample 以下のスクリプトを参照して下さい。 - -各コマンドのトークンの区切り文字はタブ(0x09)です。 - - o START_TRAN USER PASSWORD - 更新モードでトランザクションを開始します。先行するトランザクションが - 有る場合はそれらが全て終了するまで待ちます。また、本トランザクション - の実行中は後から開始されたトランザクションは全て待たされます。本トラ - ンザクション内で更新系のコマンドが実行された場合はロールバックに備え - てロールバックジャーナルが取得されます。 - - o START_TRAN_NJ USER PASSWORD - 更新モードでトランザクションを開始します。 START_TRAN との違いはロー - ルバックジャーナルを取得しない点です。ロールバック機能が利用できない - 代わりに、更新スピードを速めることが出来ます。この点をよく理解した上 - で利用して下さい。 - - o START_TRANM USER PASSWORD - 参照モードでトランザクションを開始します。更新モードのトランザクショ - ンが先行する場合に限り、それが終了するまで待ちます。また、本トランザ - クションの実行中は後から開始された更新モードのトランザクションは全て - 待たされます。 - - o GET RECNAME KEYNAME CONDITION KEYVALUE1 KEYVALUE2 ... - キー値で検索条件を指定し、目的のレコードを取得します。レコードは - - ステータス1 ステータス2 項目名1=値1 項目名2=値2 ... 項目名n=値n - - の形式で返ります(perl等のスクリプト言語からの利用を念頭にこのような - 仕様にしました)。区切り文字はタブです。 - - CONDITIONには以下の条件が指定できます - EQ, == : キーの値が指定値に等しいレコードを検索します - GE, >=, => : キーの値が指定値以上で直近のレコードを検索します - GT, > : キーの値が指定値より大きく直近のレコードを検索します - - o GETNEXT RECNAME KEYNAME - 指定したキー項目の昇順に次のレコードを取得します。 - - o PUT RECNAME MEMBER1=VALUE1 MEMBER2=VALUE2 ... - レコードを挿入します。 - - o UPDATE RECNAME PKEYVALUE1 PKEYVALUE2 ... MEMBER1=VALUE1 MEMBER2=VALUE2 ... - 主キーで特定したレコードの内容を更新します。 - - o DELETE RECNAME PKEYVALUE1 PKEYVALUE2 ... - 主キーで特定したレコードを削除します。 - - o ROLLBACK - トランザクションの開始時点、コミットの実行時点のうち、近いほうの - 時点の状態にDBの内容を戻します。一般的にはロールバック実行時に排 - 他制御を解除する実装が普通ですが、tyserv では排他制御の解除を行い - ません。 - - o COMMIT - トランザクションを確定します。一般的にはコミット実行時に排他制御を - 解除する実装が普通ですが、tyserv では排他制御の解除を行いません。 - - o ABORT_TRAN - トランザクションの開始時点、コミットの実行時点のうち、近いほうの時 - 点の状態にDBの内容を戻し、トランザクションを終了します。排他制御は - 解除されます。 - - o END_TRAN - トランザクションを確定し、終了します。排他制御の解除を行います。 - - o SHUTDOWN USER PASSWORD - tyserv を停止します。 - -さらなる情報は tyserv/doc/*, tyserv/sample/*.pl を参照して下さい。 - -tyserv への telnet でのアクセス例 -================================= - -$ telnet localhost 20000 -Trying 127.0.0.1... -Connected to localhost. -Escape character is '^]'. -start_tran user user <-Input -OK TRANSACTION START <-Response -put smp1 id=1111 name=Taro salary=150000 <-Input -OK INSERTED <-Response -put smp1 id=2222 name=Jiro salary=200000 <-Input -OK INSERTED <-Response -put smp1 id=3333 name=Goro salary=250000 <-Input -OK INSERTED <-Response -get smp1 pkey eq 1111 <-Input -OK FOUND id=1111 name=Taro salary=150000 <-Response -getnext smp1 pkey <-Input -OK FOUND id=2222 name=Jiro salary=200000 <-Response -getnext smp1 pkey <-Input -OK FOUND id=3333 name=Goro salary=250000 <-Response -update smp1 2222 name=Jirorin <-Input -OK UPDATED <-Response -get smp1 pkey eq 2222 <-Input -OK FOUND id=2222 name=Jirorin salary=250000 <-Response -delete smp1 2222 <-Input -OK DELETED <-Response -get smp1 pkey eq 2222 <-Input -NG NOTFOUND <-Response -rollback <-Input -OK ROLLBACKED <-Response -end_tran <-Input -OK TRANSACTION END <-Response -Connection closed by foreign host. - -アクセス状態コード -================== - - +----+----------------------------------------------------+ - |STS1| STS2 | - +----+----------------------------------------------------+ - | OK | COMMITED | - | OK | DELETED | - | OK | FOUND | - | OK | INSERTED | - | OK | NORMAL SHUTDOWN | - | OK | ROLLBACKED | - | OK | TRANSACTION ABORT, ROLLBACKED | - | OK | TRANSACTION END | - | OK | TRANSACTION START | - | OK | UPDATED | - +----+----------------------------------------------------+ - | NG | ACCESS DENIED(ip address) | - | NG | CAN NOT OPEN DATABASE db_status=xxxx | - | NG | CAN NOT READ SOCKET | - | NG | DUPLICATE | - | NG | NO ROLLBACK JOURNAL | - | NG | NOT GRANTED | - | NG | NOTFOUND | - | NG | REQUIRE START_TRAN OR START_TRAN_NJ OR START_TRANM | - | NG | SOCKET READ ERROR | - | NG | SOCKET READ ERROR, ROLLBACKED | - | NG | STATUS=xxxx | - | NG | UNKNOWN CONDITION | - | NG | UNKNOWN FUNCTION | - | NG | UNKNOWN ITEM | - | NG | UNKNOWN KEY | - | NG | UNKNOWN RECORD | - +----+----------------------------------------------------+ - -プログラミングの注意点 -====================== - -o START_TRAN に始まり END_TRAN で終ること。 - START_TRAN_NJ ABORT_TRAN - START_TRANM - - END_TRAN, ABORT_TRAN を発行せずにクライアントを終了した場合は - ABORT_TRAN 扱いとなります。 - -o 共有参照アクセスを行う場合は START_TRANM で始めること。 - -o START_TRAN* と END_TRAN, ABORT_TRAN の間はできる限り短く設計す - ること。 - -o 長時間処理は適当な間隔でEND_TRAN(もしくは ABORT_TRAN)を発行し、 - トランザクションを区切ること。 - -インポートスクリプト(tyimp)の利用例 -=================================== - -o tyimp の読み込む定義ファイルを作成する - - $ cd ~tyserv/typhoon/dbd - $ tyimport -g typhoondb - - tyimport(typhoon-1.11.0に付属のコマンド)が作成する - 定義ファイル(typhoondb.imp)にはデータベース(typhoondb)に - 含まれる全てのテーブルのインポート定義が含まれています。 - - $ cp typhoondb.imp typhoondb.smp1.imp - $ vi typhoondb.smp1.imp - - typhoondb.imp を typhoondb.テーブル名.imp にコピーし、該 - 当テーブルに関する定義のみを残すように編集します。tyimp - は typhoondb.テーブル名.imp を定義ファイルとして読み込み - ます。 - -o 実行する - - $ tyimp typhoondb smp1 < foo.txt - - foo.txt(各項目をタブで区切ったCSVファイル)を読み込み、デー - タベース(typhoondb)に含まれるテーブル(smp1)にインポートを - 行う。foo.txtの各行は必ずインポート定義ファイル(typhoondb.smp1.imp) - に定義されている項目と同じ数のフィールドを含んでいなければならない。 - -エクスポートスクリプト(tyexp)の利用例 -===================================== - -o tyexp の読み込む定義ファイルを作成する - - $ cd ~tyserv/typhoon/dbd - $ tyexport -g typhoondb - - tyexport(typhoon-1.11.0に付属のコマンド)が作成する - 定義ファイル(typhoondb.exp)にはデータベース(typhoondb)に - 含まれる全てのテーブルのエクスポート定義が含まれています。 - - $ cp typhoondb.exp typhoondb.smp1.exp - $ vi typhoondb.smp1.exp - - typhoondb.exp を typhoondb.テーブル名.exp にコピーし、該 - 当テーブルに関する定義のみを残すように編集します。tyexp - は typhoondb.テーブル名.exp を定義ファイルとして読み込み - ます。 - -o 実行する - - $ tyexp typhoondb smp1 > foo.txt - - データベース(typhoondb)に含まれるテーブル(smp1)のデータを - foo.txt(各項目をタブで区切ったCSVファイル)に出力します。 - -tyserv 再生成 -============= - -データベース定義(typhoondb.ddl)を更新した場合、typhoondb.dbd, -tyserv, tyrecover を再生成する必要が有ります。 - -1. $ dbdgen typhoondb -2. kill -TERM tyservのpid -3. $ cd ~tyserv/tyserv/src -4. $ make backup -5. $ make src -6. $ make -7. $ make install -8. $ /etc/rc.d/rc.tyserv - -データベース定義(typhoondb.ddl)を更新した場合(テーブルの追加等)、 -typhoondb.dbd, tyserv, tyrecover を再生成する必要が有ります。 - -1. $ dbdgen typhoondb -2. kill -TERM tyservのpid -3. $ cd ~tyserv/tyserv/src -4. Makefile を編集し `OBJS' マクロを修正します。 - ex. テーブル `smp1' が有る場合 OBJS は以下のように定義されています。 - - OBJS = tyserv_smp1.o - - そこにテーブル `smp2' を追加する場合 OBJS の定義は以下のように - なります。 - - OBJS = tyserv_smp1.o \ - tyserv_smp2.o - - オブジェクトの名称は "tyserv_" + table_name + ".o" でないといけ - ません。 - -5. $ make backup -6. $ make src -7. $ make -8. $ make install -9. $ /etc/rc.d/rc.tyserv - -起動スクリプト(rc.tyserv) -========================= - -o usage : rc.tyserv [-w] - - -w : warm起動をします。 - リカバリジャーナル(~tyserv/tyserv/journal/rvj.dat)は - 起動時点の内容に追加出力されます。 - ロールバックジャーナル(~tyserv/tyserv/journal/rbj.dat) - が存在する場合は自動的にロールバック処理が実行されます。 - - オプション無し : cold起動をします。 - 起動時点のリカバリジャーナルの内容は破棄され、先頭から - 書き出されます。 - 起動時点のロールバックジャーナルの内容は破棄され、ロー - ルバックは行われません。 - - サーバは自動的にバックグラウンドで実行されます。 - -データベース復旧ツール(tyrecover.sh) -==================================== - -o usage : tyrecover.sh [ファイル] - - ファイル : 未指定時は ${TYSERV_DIR}/journal/rvj.dat を仮定する - `-' 指定時は標準入力から入力される - -o 皆さんはディスクのバックアップは取っておられますか?。取って - ないという方も大勢おられると思います。また取っているとしても - 毎日取るなんて方は極まれなんではないでしょうか。 - - でもこれが業務システムの利用するデータベースとなると、最低で - も1日1回のバックアップが必要でしょう。 - - しかし1日1回のバックアップではディスククラッシュ等のタイミ - ングによって最悪24時間前の状態戻すのが精いっぱいで、その後 - の入力データに関しては入力伝票をかき集めて、もう一度手作業で - 入力しなおさなければなりません。業務システムに関して言えばこ - れは - - 致 命 的 - - です。そこで tyserv では直近のバックアップ + リカバリジャーナ - ルを利用してクラッシュの直前の状態にデータベースを復元するツー - ル tyrecover.sh を用意しています。 - - tyrecover.sh の利用はバックアップのタイミングと密接に関係して - きます。以下にバックアップ運用例と障害時の復旧例を示します。 - -o 通常の運用タイムスケジュール例(1日に1回バックアップの場合) - - 00:00 23:00 00:00 23:00 00:00 - tyserv +---------------+ +----------------+ +---... - cold起動 停止 cold起動 停止 - - backup +------+ +-----+ - 開始 終了 開始 終了 - - この例では毎日23:00〜00:00の1時間でバックアップを取っています。 - -o 通常の運用タイムスケジュール例(3日に1回バックアップ&システム - の稼働は9-18時に限る場合) - - 09 18 09 18 09 18 09 18 09 18 - tyserv +----+ +----+ +----+ +----+ +----+... - cold 停止 warm 停止 warm 停止 cold 停止 warm 停止 - 起動 起動 起動 起動 起動 - backup +-+ - - この例の場合バックアップを取った直後の起動に限り、cold起動 して - る点に気をつけて下さい。また、毎回の停止時にリカバリジャーナルだ - けでもバックアップしておくようにするとさらに安全です。さらにジャー - ナルだけ別パーティションにするのも安全です。ディスククラッシュと - 同時にリカバリジャーナルまでふっ飛ぶと、どうしようもないですから - (^^;。 - -o 障害発生時の対応 - - 計画停止 起動 ダウン 復旧 計画停止 起動 - tyserv ...---+ +-------* - - - - - +------+ +----... - backup +-----+ | | +-----+ - 障害発生 | - | | - restore +-----+ | - recover +-----+ - - o backup例 : $ cd /home/tyserv/typhoon/data - $ tar cvzf /dev/st0 . - - o restore例 : $ cd /home/tyserv/typhoon/data - $ tar xvzpf /dev/st0 - - o recover例 : $ tyrecover.sh - -o バックアップ運用のまとめ - - o 停止後にバックアップを取った場合は次回の起動はcold起動 - o 停止後にバックアップを取らなかった場合は次回の起動はwarm起動 - o リカバリジャーナルは毎回停止時にバックアップ取るのが安全 - -o リカバリ運用のまとめ - - o バックアップからデータベースを元に戻す - o tyrecover.sh を実行し、クラッシュ直前の状態まで復旧する - -TODO & BUGS -=========== - -o 現行のtyservは排他の単位がデータベースなので、排他モードの - トランザクション実行時に全てのテーブルに排他がかかります。 - これは、一つの tyserv プロセスが全てのクライアントからの更 - 新トランザクションを受け付け、処理することで共有そのものを - 避ける方法で排他制御を行っている(というか行わずにすましてる - というか...)為にしかたのないことです(^^;。 - - かといって、tyserv自身でリソースの管理を行い、粒度の細かい - 排他制御を実現するのは作者の力不足のため非常に困難です。 - - そこで次善の策としてデータベースを分割し tyserv をその数だ - け立ち上げるという方法で排他の粒度を幾分細かくすることがで - きると考えてます。このあたりの手順、検証等を今後行なってい - きたいと思ってます。 - -o データベース復旧ツール(tyrecover.sh)はコミット情報を参照し - てません。よってデータベースは常にリカバリジャーナルの最後 - まで復旧されてしまいます。将来的には最終のコミット時点まで - 復旧するようにしたいと考えてます。 - -o テーブルの項目に格納できるのは文字列のみです。また、文字列 - の中にタブを含めることは出来ません。 - -typhoon-1.11.0の情報 -==================== - -see typhoon-1.11.0/man/* - typhoon-1.11.0/examples/* - http://users.footprints.net/~kaz/typhoon.html - ---- -Masahiko Ito -m-ito@mbox.kyoto-inet.or.jp -http://web.kyoto-inet.or.jp/people/m-ito/index.html diff --git a/README.FreeBSD b/obsolete/README.FreeBSD similarity index 100% rename from README.FreeBSD rename to obsolete/README.FreeBSD diff --git a/typhoon-1.10.3.patch b/obsolete/typhoon-1.10.3.patch similarity index 100% rename from typhoon-1.10.3.patch rename to obsolete/typhoon-1.10.3.patch diff --git a/typhoon-1.11.0.FreeBSD.patch b/obsolete/typhoon-1.11.0.FreeBSD.patch similarity index 100% rename from typhoon-1.11.0.FreeBSD.patch rename to obsolete/typhoon-1.11.0.FreeBSD.patch diff --git a/tyserv/conf/tyserv.conf b/rundir1/conf/tyserv.conf similarity index 88% rename from tyserv/conf/tyserv.conf rename to rundir1/conf/tyserv.conf index 51d9a35..cadae2e 100644 --- a/tyserv/conf/tyserv.conf +++ b/rundir1/conf/tyserv.conf @@ -39,7 +39,13 @@ RVJ_SW=1 # SAFER_SW=1 # +# アクセス対象テーブルの指定 +# 未指定時は全テーブルが対象となる +# +TABLE_LIST=smp1 +#TABLE_LIST=smp2 +#TABLE_LIST=smp3 +# # デバッグモード(1:設定する 1以外:設定しない) # DEBUG=0 - diff --git a/rundir2/conf/tyserv.conf b/rundir2/conf/tyserv.conf new file mode 100644 index 0000000..884aed0 --- /dev/null +++ b/rundir2/conf/tyserv.conf @@ -0,0 +1,51 @@ +# +# tyservの稼働するホスト名の指定 +# +HOST_NAME=localhost +# +# /etc/hosts.allow,/etc/hosts.deny に記述するデーモン名の指定 +# +DAEMON_NAME=tyserv +# +# tyservに接続するためのポート番号の指定 +# +SOCKET_PORT=20001 +# +# SOCKET_PORTに対するバックログの指定 +# +SOCKET_WAIT_QUEUE=128 +# +# typhoon 用ディレクトリの指定 +# +TYPHOON_DIR=/home/tyserv/typhoon +# +# tyserv 用ディレクトリの指定 +# +TYSERV_DIR=/home/tyserv/tyserv +# +# リカバリジャーナルの設定(1:取得する 1以外:取得しない) +# +RVJ_SW=1 +# +# 安全モードの設定(1:設定する 1以外:設定しない) +# +# 安全モード設定時 :ジャーナル出力直後に fsync 実行 +# 更新スピードは遅くなるが、ジャーナル記録の +# 確実性が高い +# 安全モード非設定時:ジャーナル出力直後に fsync 実行無し +# ジャーナル記録の確実性は低いが、更新スピード +# が速い +# UPS等の利用が望ましい +# +SAFER_SW=1 +# +# アクセス対象テーブルの指定 +# 未指定時は全テーブルが対象となる +# +#TABLE_LIST=smp1 +TABLE_LIST=smp2 +#TABLE_LIST=smp3 +# +# デバッグモード(1:設定する 1以外:設定しない) +# +DEBUG=0 diff --git a/typhoon-1.11.0.patch b/typhoon-1.11.0.patch index 6619bcd..25856cc 100644 --- a/typhoon-1.11.0.patch +++ b/typhoon-1.11.0.patch @@ -1,6 +1,6 @@ -diff -c -r ../typhoon-1.11.0.ORG/Makefile ./Makefile -*** ../typhoon-1.11.0.ORG/Makefile Sat Oct 2 12:37:32 1999 ---- ./Makefile Sun Mar 5 22:49:41 2000 +diff -cr typhoon-1.11.0.ORG/Makefile typhoon-1.11.0/Makefile +*** typhoon-1.11.0.ORG/Makefile Sat Oct 2 03:37:32 1999 +--- typhoon-1.11.0/Makefile Mon Jan 20 01:53:31 2003 *************** *** 5,11 **** DESTMAN = $(PREFIX)/man/man$(MANEXT) @@ -19,9 +19,9 @@ diff -c -r ../typhoon-1.11.0.ORG/Makefile ./Makefile SHELL = /bin/sh MAKE = make -diff -c -r ../typhoon-1.11.0.ORG/configure ./configure -*** ../typhoon-1.11.0.ORG/configure Mon Oct 4 13:44:22 1999 ---- ./configure Sun Mar 5 23:01:27 2000 +diff -cr typhoon-1.11.0.ORG/configure typhoon-1.11.0/configure +*** typhoon-1.11.0.ORG/configure Mon Oct 4 04:44:22 1999 +--- typhoon-1.11.0/configure Mon Jan 20 01:53:31 2003 *************** *** 30,36 **** compile='$CC $CARGS -o conftest conftest.c >/dev/null 2>&1' @@ -39,9 +39,10 @@ diff -c -r ../typhoon-1.11.0.ORG/configure ./configure ENVIRON_H=./include/environ.h ANSI_H=./include/ansi.h -diff -c -r ../typhoon-1.11.0.ORG/examples/Makefile.in ./examples/Makefile.in -*** ../typhoon-1.11.0.ORG/examples/Makefile.in Mon Oct 4 08:28:28 1999 ---- ./examples/Makefile.in Sun Mar 5 22:49:41 2000 +Only in typhoon-1.11.0/examples: Makefile +diff -cr typhoon-1.11.0.ORG/examples/Makefile.in typhoon-1.11.0/examples/Makefile.in +*** typhoon-1.11.0.ORG/examples/Makefile.in Sun Oct 3 23:28:28 1999 +--- typhoon-1.11.0/examples/Makefile.in Mon Jan 20 01:53:31 2003 *************** *** 8,14 **** LDFLAGS = -L../src @@ -60,9 +61,11 @@ diff -c -r ../typhoon-1.11.0.ORG/examples/Makefile.in ./examples/Makefile.in SHELL = /bin/sh PROGRAM = demo SRCS = demo.c -diff -c -r ../typhoon-1.11.0.ORG/man/Makefile ./man/Makefile -*** ../typhoon-1.11.0.ORG/man/Makefile Sat Oct 2 12:38:13 1999 ---- ./man/Makefile Sun Mar 5 22:49:41 2000 +Only in typhoon-1.11.0/include: ansi.h +Only in typhoon-1.11.0/include: environ.h +diff -cr typhoon-1.11.0.ORG/man/Makefile typhoon-1.11.0/man/Makefile +*** typhoon-1.11.0.ORG/man/Makefile Sat Oct 2 03:38:13 1999 +--- typhoon-1.11.0/man/Makefile Mon Jan 20 01:53:31 2003 *************** *** 7,13 **** DESTMAN = $(PREFIX)/man/man$(MANEXT) @@ -122,9 +125,10 @@ diff -c -r ../typhoon-1.11.0.ORG/man/Makefile ./man/Makefile uninstall: -for manpage in $(MANPAGES); do \ -diff -c -r ../typhoon-1.11.0.ORG/src/Makefile.in ./src/Makefile.in -*** ../typhoon-1.11.0.ORG/src/Makefile.in Mon Oct 4 08:28:28 1999 ---- ./src/Makefile.in Sun Mar 5 22:49:41 2000 +Only in typhoon-1.11.0/src: Makefile +diff -cr typhoon-1.11.0.ORG/src/Makefile.in typhoon-1.11.0/src/Makefile.in +*** typhoon-1.11.0.ORG/src/Makefile.in Sun Oct 3 23:28:28 1999 +--- typhoon-1.11.0/src/Makefile.in Mon Jan 20 01:53:31 2003 *************** *** 8,14 **** DESTLIB = $(PREFIX)/lib @@ -143,9 +147,30 @@ diff -c -r ../typhoon-1.11.0.ORG/src/Makefile.in ./src/Makefile.in SHELL = /bin/sh LIBRARY = libtyphoon.a LIBHDRS = ../include/environ.h ../include/typhoon.h -diff -c -r ../typhoon-1.11.0.ORG/util/Makefile.in ./util/Makefile.in -*** ../typhoon-1.11.0.ORG/util/Makefile.in Mon Oct 4 08:28:29 1999 ---- ./util/Makefile.in Sun Mar 5 22:49:41 2000 +diff -cr typhoon-1.11.0.ORG/src/unix.c typhoon-1.11.0/src/unix.c +*** typhoon-1.11.0.ORG/src/unix.c Mon Oct 4 04:39:42 1999 +--- typhoon-1.11.0/src/unix.c Mon Jan 20 01:55:20 2003 +*************** +*** 152,158 **** + + while (fcntl(lock_fh, F_SETLK, &flk) == -1) + { +! if (errno != EINTR) + { + printf("ty_lock failed (errno %d, lock_fh %d)\n", errno, lock_fh); + break; +--- 152,158 ---- + + while (fcntl(lock_fh, F_SETLK, &flk) == -1) + { +! if (errno != EINTR && errno != EAGAIN ) + { + printf("ty_lock failed (errno %d, lock_fh %d)\n", errno, lock_fh); + break; +Only in typhoon-1.11.0/util: Makefile +diff -cr typhoon-1.11.0.ORG/util/Makefile.in typhoon-1.11.0/util/Makefile.in +*** typhoon-1.11.0.ORG/util/Makefile.in Sun Oct 3 23:28:29 1999 +--- typhoon-1.11.0/util/Makefile.in Mon Jan 20 01:53:31 2003 *************** *** 10,16 **** LDFLAGS = -L../src @@ -181,9 +206,9 @@ diff -c -r ../typhoon-1.11.0.ORG/util/Makefile.in ./util/Makefile.in cd $(DESTBIN) && strip $(PROGRAMS) cd $(DESTBIN) && chmod 755 $(PROGRAMS) cd $(DESTBIN) && chown $(DESTOWN) $(PROGRAMS) -diff -c -r ../typhoon-1.11.0.ORG/util/export.c ./util/export.c -*** ../typhoon-1.11.0.ORG/util/export.c Mon Oct 4 13:11:31 1999 ---- ./util/export.c Sun Mar 5 22:57:45 2000 +diff -cr typhoon-1.11.0.ORG/util/export.c typhoon-1.11.0/util/export.c +*** typhoon-1.11.0.ORG/util/export.c Mon Oct 4 04:11:31 1999 +--- typhoon-1.11.0/util/export.c Mon Jan 20 01:53:31 2003 *************** *** 74,85 **** --- 74,99 ---- @@ -251,9 +276,9 @@ diff -c -r ../typhoon-1.11.0.ORG/util/export.c ./util/export.c case 'f': d_dbfpath(argv[i]+2); break; -diff -c -r ../typhoon-1.11.0.ORG/util/import.c ./util/import.c -*** ../typhoon-1.11.0.ORG/util/import.c Mon Oct 4 13:11:32 1999 ---- ./util/import.c Sun Mar 5 23:00:09 2000 +diff -cr typhoon-1.11.0.ORG/util/import.c typhoon-1.11.0/util/import.c +*** typhoon-1.11.0.ORG/util/import.c Mon Oct 4 04:11:32 1999 +--- typhoon-1.11.0/util/import.c Mon Jan 20 01:53:31 2003 *************** *** 79,89 **** --- 79,102 ---- diff --git a/typhoon/README b/typhoon/README index 7a7bd74..48ee61e 100644 --- a/typhoon/README +++ b/typhoon/README @@ -1,13 +1,13 @@ 1. How to generate foodb.dbd - (1) edit ${TYPHOON_DIR}/ddl/foodb.ddl + (1) edit /home/tyserv/typhoon/ddl/foodb.ddl (2) $ dbdgen foodb - (3) then ${TYPHOON_DIR}/dbd/foodb.dbd, ${TYPHOON_DIR}/include/foodb.h + (3) then /home/tyserv/typhoon/dbd/foodb.dbd, /home/tyserv/typhoon/include/foodb.h will be made 2. How to export footbl(table) in foodb(database) to stdout - (1) $ cd ${TYPHOON_DIR}/dbd; please tyexport -g foodb + (1) $ cd /home/tyserv/typhoon/dbd; please tyexport -g foodb (2) then foodb.exp will be made (3) $ cp foodb.exp to foodb.footbl.exp (4) $ editor foodb.footbl.exp @@ -18,7 +18,7 @@ 3. How to import footbl(table) in foodb(database) from stdin - (1) $ cd ${TYPHOON_DIR}/dbd; please tyimport -g foodb + (1) $ cd /home/tyserv/typhoon/dbd; please tyimport -g foodb (2) then foodb.imp will be made (3) $ cp foodb.imp to foodb.footbl.imp (4) $ editor foodb.footbl.imp @@ -27,6 +27,6 @@ (5) $ tyimp foodb footbl ---- +-- Masahiko Ito m-ito@mbox.kyoto-inet.or.jp diff --git a/typhoon/bin/dbdgen b/typhoon/bin/dbdgen index c7593bf..d5702ab 100755 --- a/typhoon/bin/dbdgen +++ b/typhoon/bin/dbdgen @@ -1,8 +1,5 @@ #! /bin/sh -if [ "X${TYPHOON_DIR}" = "X" ] -then - TYPHOON_DIR=/usr/local/typhoon;export TYPHOON_DIR -fi +TYPHOON_DIR=${HOME}/typhoon # if [ "X$1" = "X-h" -o "X$1" = "X--help" ] then diff --git a/typhoon/bin/tyexp b/typhoon/bin/tyexp index bdff15f..42c6150 100755 --- a/typhoon/bin/tyexp +++ b/typhoon/bin/tyexp @@ -1,8 +1,5 @@ #! /bin/sh -if [ "X${TYPHOON_DIR}" = "X" ] -then - TYPHOON_DIR=/usr/local/typhoon;export TYPHOON_DIR -fi +TYPHOON_DIR=${HOME}/typhoon # if [ "X$1" = "X-h" -o "X$1" = "X--help" ] then @@ -44,4 +41,3 @@ sed -e 's/\\\\/\\/g' \ # rm -f ${TYPHOON_DIR}/data/$1.dbd rm -f ${TYPHOON_DIR}/data/$1.exp - diff --git a/typhoon/bin/tyimp b/typhoon/bin/tyimp index 0c5e977..2343805 100755 --- a/typhoon/bin/tyimp +++ b/typhoon/bin/tyimp @@ -1,8 +1,5 @@ #! /bin/sh -if [ "X${TYPHOON_DIR}" = "X" ] -then - TYPHOON_DIR=/usr/local/typhoon;export TYPHOON_DIR -fi +TYPHOON_DIR=${HOME}/typhoon # if [ "X$1" = "X-h" -o "X$1" = "X--help" ] then @@ -31,16 +28,6 @@ else exit 1 fi # -##cat |\ -##sort |\ -##sed -e 's/ $//g' -e 's///g' -e 's/ * */ /g' -e 's/ *$//g' |\ -##perl -e 'while ($rec = ){ -## $rec =~ s/\033(..)(..)/pack("CC",hex($1),hex($2))/eg; -## print $rec; -##}' |\ -##sed -e 's/\\/\\\\/g' | \ -##sed -e 's/^/\"/g' -e 's/ /\", \"/g' -e 's/$/\"/g' | \ -##tyimport -s $1 cat |\ sort |\ sed -e 's/\\/\\\\/g' \ diff --git a/typhoon/ddl/typhoondb.ddl b/typhoon/ddl/typhoondb.ddl index b141712..734ee26 100644 --- a/typhoon/ddl/typhoondb.ddl +++ b/typhoon/ddl/typhoondb.ddl @@ -13,4 +13,17 @@ database typhoondb { alternate key smp1_skey1 { name asc, id asc }; } + data file "smp2.dat" contains smp2; + key file "smp2.pk" contains smp2.smp2_pkey; + key file "smp2.s1" contains smp2.smp2_skey1; + + record smp2 { + char id[4 + 1]; + char name[20 + 1]; + char salary[7 + 1]; + + primary key smp2_pkey { id asc }; + alternate key smp2_skey1 { name asc, id asc }; + } + } diff --git a/typhoon/doc/HOWTO-USE-TYPHOON.txt b/typhoon/doc/HOWTO-USE-TYPHOON.txt index 3fa01a4..4c45ab4 100644 --- a/typhoon/doc/HOWTO-USE-TYPHOON.txt +++ b/typhoon/doc/HOWTO-USE-TYPHOON.txt @@ -2,7 +2,7 @@ Masahiko Ito (m-ito@mbox.kyoto-inet.or.jp) - 2002.7.1 + 2003.2.1 1. database definition ddlp DATABASE -> DATABASE.ddl ---> DATABASE.h @@ -243,16 +243,16 @@ main() 4. Makefile sample -DEFINES = -I/usr/local/include -I/home/masa/typhoon/include +DEFINES = -I/usr/local/include -I$(HOME)/typhoon/include CC = gcc CFLAGS = -O $(DEFINES) # -v LIBS = -ltyphoon LDFLAGS = -L/usr/local/lib SHELL = /bin/sh -all: foo.exe +all: foo -foo.exe: foo.c +foo: foo.c $(CC) $(CFLAGS) $(LDFLAGS) -o $@ foo.c $(LIBS) 5. export tool diff --git a/tyserv/ORGSRC/tyrecover.c b/tyserv/ORGSRC/tyrecover.c index 7f07d4b..5b4511c 100644 --- a/tyserv/ORGSRC/tyrecover.c +++ b/tyserv/ORGSRC/tyrecover.c @@ -17,15 +17,15 @@ #include /* DataBase definition */ -#define DATABASE_NAME "__DB__" -#include "__DB__.h" +#define DATABASE_NAME "typhoondb" +#include "typhoondb.h" #define FD_STDIN (0) #define BUF_LEN (1024 * 16) #define PATH_LEN (256) -#define DEF_TYPHOON_DIR "/usr/local/typhoon" -#define DEF_TYSERV_DIR "/usr/local/tyserv" +#define DEF_TYPHOON_DIR "/home/tyserv/typhoon" +#define DEF_TYSERV_DIR "/home/tyserv/rundir1" #define DEF_RBJ_SW (0) #define DEF_SAFER_SW (1) #define DEF_DEBUG (0) @@ -34,6 +34,8 @@ char Dbd_dir[PATH_LEN]; char Data_dir[PATH_LEN]; char Rvj_name[PATH_LEN]; char Rbj_name[PATH_LEN]; +char Tyserv_rundir[PATH_LEN]; +char Conf_file[PATH_LEN]; int Rvj_sw; int Rbj_sw; int Safer_sw; @@ -97,11 +99,17 @@ int main(argc, argv) int i, ret, fd, status; - if (argc < 2){ - fprintf(stderr, "usage : %-s RVJ_SW\n", argv[0]); + if (argc < 3){ + fprintf(stderr, "usage : %-s RVJ_SW TYSERV_RUNDIR\n", argv[0]); exit(1); } + if (argv[2][0] == '\0'){ + strncpy(Tyserv_rundir, DEF_TYSERV_DIR, (sizeof Tyserv_rundir) - 1); + }else{ + strncpy(Tyserv_rundir, argv[2], (sizeof Tyserv_rundir) - 1); + } + /* * set signal trap */ @@ -414,15 +422,18 @@ int init_file() strncat(Dbd_dir, "/dbd", (sizeof Dbd_dir) - strlen(Dbd_dir) - 1); strncpy(Data_dir, DEF_TYPHOON_DIR, (sizeof Data_dir) - 1); strncat(Data_dir, "/data", (sizeof Data_dir) - strlen(Data_dir) - 1); - strncpy(Rvj_name, DEF_TYSERV_DIR, (sizeof Rvj_name) - 1); + strncpy(Rvj_name, Tyserv_rundir, (sizeof Rvj_name) - 1); strncat(Rvj_name, "/journal/rvj.dat", (sizeof Rvj_name) - strlen(Rvj_name) - 1); - strncpy(Rbj_name, DEF_TYSERV_DIR, (sizeof Rbj_name) - 1); + strncpy(Rbj_name, Tyserv_rundir, (sizeof Rbj_name) - 1); strncat(Rbj_name, "/journal/rbj.dat", (sizeof Rbj_name) - strlen(Rbj_name) - 1); Safer_sw = DEF_SAFER_SW; Debug = DEF_DEBUG; - if ((fp = fopen("__INITFILE__", "r")) == (FILE *)NULL){ - fprintf(stderr, "can not open initfile(%-s)\n", "__INITFILE__"); + strncpy(Conf_file, Tyserv_rundir, (sizeof Conf_file) - 1); + strncat(Conf_file, "/conf/tyserv.conf", (sizeof Conf_file) - strlen(Conf_file) - 1); + + if ((fp = fopen(Conf_file, "r")) == (FILE *)NULL){ + fprintf(stderr, "can not open initfile(%-s)\n", Conf_file); exit(1); } @@ -438,11 +449,6 @@ int init_file() strncat(Dbd_dir, "/dbd", (sizeof Dbd_dir) - strlen(Dbd_dir) - 1); strncpy(Data_dir, buf + strlen("TYPHOON_DIR="), (sizeof Data_dir) - 1); strncat(Data_dir, "/data", (sizeof Data_dir) - strlen(Data_dir) - 1); - }else if(strncmp(buf, "TYSERV_DIR=", strlen("TYSERV_DIR=")) == 0){ - strncpy(Rvj_name, buf + strlen("TYSERV_DIR="), (sizeof Rvj_name) - 1); - strncat(Rvj_name, "/journal/rvj.dat", (sizeof Rvj_name) - strlen(Rvj_name) - 1); - strncpy(Rbj_name, buf + strlen("TYPHOON_DIR="), (sizeof Rbj_name) - 1); - strncat(Rbj_name, "/journal/rbj.dat", (sizeof Rbj_name) - strlen(Rbj_name) - 1); }else if(strncmp(buf, "SAFER_SW=", strlen("SAFER_SW=")) == 0){ Safer_sw = atoi(buf + strlen("SAFER_SW=")); }else if(strncmp(buf, "DEBUG=", strlen("DEBUG=")) == 0){ diff --git a/tyserv/ORGSRC/tysearch.c b/tyserv/ORGSRC/tysearch.c index e3e3b51..5ec29b7 100644 --- a/tyserv/ORGSRC/tysearch.c +++ b/tyserv/ORGSRC/tysearch.c @@ -20,11 +20,11 @@ #include /* DataBase definition */ -#define DATABASE_NAME "__DB__" -#include "__DB__.h" +#define DATABASE_NAME "typhoondb" +#include "typhoondb.h" -#define DEF_DBD_DIR "/usr/local/typhoon/dbd" -#define DEF_DATA_DIR "/usr/local/typhoon/data" +#define DEF_DBD_DIR "/home/tyserv/typhoon/dbd" +#define DEF_DATA_DIR "/home/tyserv/typhoon/data" #define BUF_LEN (1024 * 16) #define DIR_LEN (256) diff --git a/tyserv/ORGSRC/tyserv.c b/tyserv/ORGSRC/tyserv.c index c592a9a..b2f22d2 100644 --- a/tyserv/ORGSRC/tyserv.c +++ b/tyserv/ORGSRC/tyserv.c @@ -28,8 +28,8 @@ int deny_severity = LOG_WARNING; #include /* DataBase definition */ -#define DATABASE_NAME "__DB__" -#include "__DB__.h" +#define DATABASE_NAME "typhoondb" +#include "typhoondb.h" #define BUF_LEN (1024 * 16) #define PATH_LEN (256) @@ -38,10 +38,11 @@ int deny_severity = LOG_WARNING; #define TRUE !FALSE; #define DEF_HOST "localhost" -#define DEF_PORT ((unsigned short)10000) +#define DEF_PORT ((unsigned short)20000) #define DEF_SOCKET_WAIT_QUEUE (32) -#define DEF_TYPHOON_DIR "/usr/local/typhoon" -#define DEF_TYSERV_DIR "/usr/local/tyserv" +#define DEF_TYPHOON_DIR "/home/tyserv/typhoon" +#define DEF_TYSERV_DIR "/home/tyserv/tyserv" +#define DEF_TYSERV_RUNDIR "/home/tyserv/rundir1" #define DEF_RVJ_SW (1) #define DEF_RBJ_SW (1) #define DEF_SAFER_SW (1) @@ -57,6 +58,9 @@ char Rvj_name[PATH_LEN]; char Rbj_name[PATH_LEN]; char Passwd_name[PATH_LEN]; char Daemon_name[PATH_LEN]; +char Tyserv_dir[PATH_LEN]; +char Tyserv_rundir[PATH_LEN]; +char Conf_file[PATH_LEN]; int Rvj_sw; int Rbj_sw; int Safer_sw; @@ -89,6 +93,8 @@ int sock_write(); int get_func_rec(); char *FuncName; char *RecName; +char Table_list[BUF_LEN]; +char Table_name[PATH_LEN]; int get_key_cond(); char *KeyName; @@ -161,6 +167,17 @@ int main(argc, argv) /* * set from initialze file */ + if (argc < 2){ + fprintf(stderr, "usage : %-s TYSERV_RUNDIR\n", argv[0]); + exit(1); + } + + if (argv[1][0] == '\0'){ + strncpy(Tyserv_rundir, DEF_TYSERV_RUNDIR, (sizeof Tyserv_rundir) - 1); + }else{ + strncpy(Tyserv_rundir, argv[1], (sizeof Tyserv_rundir) - 1); + } + init_file(); /* @@ -654,6 +671,16 @@ int get_func_rec(buf) } } *p2 = '\0'; + + if (Table_list[0] != '\0'){ + strncpy(Table_name, "\t", (sizeof Dbd_dir) - 1); + strncat(Table_name, p1, (sizeof Table_name) - strlen(Table_name) - 1); + strncat(Table_name, "\t", (sizeof Table_name) - strlen(Table_name) - 1); + if (strstr(Table_list, Table_name) == (char *)NULL){ + return -1; + } + } + RecName = p1; return 0; @@ -879,21 +906,26 @@ int init_file() strncat(Dbd_dir, "/dbd", (sizeof Dbd_dir) - strlen(Dbd_dir) - 1); strncpy(Data_dir, DEF_TYPHOON_DIR, (sizeof Data_dir) - 1); strncat(Data_dir, "/data", (sizeof Data_dir) - strlen(Data_dir) - 1); - strncpy(Rvj_name, DEF_TYSERV_DIR, (sizeof Rvj_name) - 1); + strncpy(Rvj_name, Tyserv_rundir, (sizeof Rvj_name) - 1); strncat(Rvj_name, "/journal/rvj.dat", (sizeof Rvj_name) - strlen(Rvj_name) - 1); - strncpy(Rbj_name, DEF_TYSERV_DIR, (sizeof Rbj_name) - 1); + strncpy(Rbj_name, Tyserv_rundir, (sizeof Rbj_name) - 1); strncat(Rbj_name, "/journal/rbj.dat", (sizeof Rbj_name) - strlen(Rbj_name) - 1); + strncpy(Tyserv_dir, DEF_TYSERV_DIR, (sizeof Tyserv_dir) - 1); strncpy(Rollback_script, DEF_TYSERV_DIR, (sizeof Rollback_script) - 1); strncat(Rollback_script, "/bin/tyrollback.sh", (sizeof Rollback_script) - strlen(Rollback_script) - 1); strncpy(Passwd_name, DEF_TYSERV_DIR, (sizeof Passwd_name) - 1); strncat(Passwd_name, "/etc/passwd", (sizeof Passwd_name) - strlen(Passwd_name) - 1); strncpy(Daemon_name, DEF_DAEMON_NAME, (sizeof Daemon_name) - 1); + Table_list[0] = '\0'; Rvj_sw = DEF_RVJ_SW; Safer_sw = DEF_SAFER_SW; Debug = DEF_DEBUG; - if ((fp = fopen("__INITFILE__", "r")) == (FILE *)NULL){ - fprintf(stderr, "can not open initfile(%-s), crashed\n", "__INITFILE__"); + strncpy(Conf_file, Tyserv_rundir, (sizeof Conf_file) - 1); + strncat(Conf_file, "/conf/tyserv.conf", (sizeof Conf_file) - strlen(Conf_file) - 1); + + if ((fp = fopen(Conf_file, "r")) == (FILE *)NULL){ + fprintf(stderr, "can not open initfile(%-s), crashed\n", Conf_file); exit(1); } @@ -916,16 +948,16 @@ int init_file() strncpy(Data_dir, buf + strlen("TYPHOON_DIR="), (sizeof Data_dir) - 1); strncat(Data_dir, "/data", (sizeof Data_dir) - strlen(Data_dir) - 1); }else if(strncmp(buf, "TYSERV_DIR=", strlen("TYSERV_DIR=")) == 0){ - strncpy(Rvj_name, buf + strlen("TYSERV_DIR="), (sizeof Rvj_name) - 1); - strncat(Rvj_name, "/journal/rvj.dat", (sizeof Rvj_name) - strlen(Rvj_name) - 1); - strncpy(Rbj_name, buf + strlen("TYSERV_DIR="), (sizeof Rbj_name) - 1); - strncat(Rbj_name, "/journal/rbj.dat", (sizeof Rbj_name) - strlen(Rbj_name) - 1); - strncpy(Rollback_script, buf + strlen("TYSERV_DIR="), (sizeof Rollback_script) - 1); + strncpy(Tyserv_dir, buf + strlen("TYSERV_DIR="), (sizeof Tyserv_dir) - 1); + strncpy(Rollback_script, Tyserv_dir, (sizeof Rollback_script) - 1); strncat(Rollback_script, "/bin/tyrollback.sh", (sizeof Rollback_script) - strlen(Rollback_script) - 1); - strncpy(Passwd_name, buf + strlen("TYSERV_DIR="), (sizeof Passwd_name) - 1); + strncpy(Passwd_name, Tyserv_dir, (sizeof Passwd_name) - 1); strncat(Passwd_name, "/etc/passwd", (sizeof Passwd_name) - strlen(Passwd_name) - 1); }else if(strncmp(buf, "DAEMON_NAME=", strlen("DAEMON_NAME=")) == 0){ strncpy(Daemon_name, buf + strlen("DAEMON_NAME="), (sizeof Daemon_name) - 1); + }else if(strncmp(buf, "TABLE_LIST=", strlen("TABLE_LIST=")) == 0){ + strncat(Table_list, "\t", (sizeof Table_list) - 1); + strncat(Table_list, buf + strlen("TABLE_LIST="), (sizeof Table_list) - strlen(Table_list) - 1); }else if(strncmp(buf, "RVJ_SW=", strlen("RVJ_SW=")) == 0){ Rvj_sw = atoi(buf + strlen("RVJ_SW=")); }else if(strncmp(buf, "SAFER_SW=", strlen("SAFER_SW=")) == 0){ @@ -935,6 +967,10 @@ int init_file() } } + if (Table_list[0] != '\0'){ + strncat(Table_list, "\t", (sizeof Table_list) - strlen(Table_list) - 1); + } + fclose(fp); if (Debug > 0){ @@ -948,6 +984,7 @@ int init_file() printf("Rollback_script=(%-s)\n", Rollback_script); printf("Passwd_name=(%-s)\n", Passwd_name); printf("Daemon_name=(%-s)\n", Daemon_name); + printf("Table_list=(%-s)\n", Table_list); printf("Rvj_sw=(%d)\n", Rvj_sw); printf("Safer_sw=(%d)\n", Safer_sw); printf("Debug=(%d)\n", Debug); @@ -965,7 +1002,7 @@ int rollback() #endif if ((pid = fork()) == 0){ - execl(Rollback_script, "tyrollback", (char *)NULL); + execl(Rollback_script, "tyrollback", "-d", Tyserv_rundir, (char *)NULL); fprintf(stderr, "can't exec %-s\n", Rollback_script); exit(1); }else{ diff --git a/tyserv/bin/mksrc2.pl b/tyserv/bin/mksrc2.pl index 6add841..4b04d36 100755 --- a/tyserv/bin/mksrc2.pl +++ b/tyserv/bin/mksrc2.pl @@ -26,7 +26,7 @@ #include /* DataBase definition */ -#include "__DB__.h" +#include "typhoondb.h" extern FILE *Fp_rvj; extern FILE *Fp_rbj; diff --git a/tyserv/bin/mktyserv b/tyserv/bin/mktyserv index a1b4be7..1e5209c 100755 --- a/tyserv/bin/mktyserv +++ b/tyserv/bin/mktyserv @@ -1,20 +1,9 @@ #! /bin/sh -if [ "X${TYPHOON_DIR}" = "X" ] -then - TYPHOON_DIR=/usr/local/typhoon;export TYPHOON_DIR -fi +TYPHOON_DIR=${HOME}/typhoon # -if [ "X${TYPHOON_DB}" = "X" ] -then - TYPHOON_DB=typhoondb;export TYPHOON_DB -fi +TYPHOON_DB=typhoondb # -if [ "X${TYSERV_DIR}" = "X" ] -then - TYSERV_DIR=/usr/local/tyserv;export TYSERV_DIR -fi -# -INITFILE=${TYSERV_DIR}/conf/tyserv.conf +TYSERV_DIR=${HOME}/tyserv # if [ X"$1" = X ] then @@ -32,15 +21,13 @@ then ${TYSERV_DIR}/bin/mksrc1.pl <${TYPHOON_DIR}/include/${TYPHOON_DB}.h |\ grep "^$i " |\ # ^ = TAB - ${TYSERV_DIR}/bin/mksrc2.pl |\ - sed -e "s/__DB__/${TYPHOON_DB}/g" >tyserv_$i.c + ${TYSERV_DIR}/bin/mksrc2.pl >tyserv_$i.c done else ${TYSERV_DIR}/bin/mksrc1.pl <${TYPHOON_DIR}/include/${TYPHOON_DB}.h |\ grep "^$1 " |\ # ^ = TAB - ${TYSERV_DIR}/bin/mksrc2.pl |\ - sed -e "s/__DB__/${TYPHOON_DB}/g" >tyserv_$1.c + ${TYSERV_DIR}/bin/mksrc2.pl >tyserv_$1.c fi # ${TYSERV_DIR}/bin/mksrc1.pl <${TYPHOON_DIR}/include/${TYPHOON_DB}.h |\ @@ -51,16 +38,10 @@ uniq |\ ${TYSERV_DIR}/bin/mksrc3.pl >tyserv.h # sed -e 's/__MESSAGE__/!! DO NOT EDIT THIS SOURCE. THIS IS GENERATED AUTOMATICALY !!/g' \ - -e "s/__DB__/${TYPHOON_DB}/g" \ - -e "s^__INITFILE__^${INITFILE}^g" \ ${TYSERV_DIR}/ORGSRC/tyserv.c >tyserv.c # sed -e 's/__MESSAGE__/!! DO NOT EDIT THIS SOURCE. THIS IS GENERATED AUTOMATICALY !!/g' \ - -e "s/__DB__/${TYPHOON_DB}/g" \ - -e "s^__INITFILE__^${INITFILE}^g" \ - ${TYSERV_DIR}/ORGSRC/tysearch.c >tysearch.c + ${TYSERV_DIR}/ORGSRC/tyrecover.c >tyrecover.c # sed -e 's/__MESSAGE__/!! DO NOT EDIT THIS SOURCE. THIS IS GENERATED AUTOMATICALY !!/g' \ - -e "s/__DB__/${TYPHOON_DB}/g" \ - -e "s^__INITFILE__^${INITFILE}^g" \ - ${TYSERV_DIR}/ORGSRC/tyrecover.c >tyrecover.c + ${TYSERV_DIR}/ORGSRC/tysearch.c >tysearch.c diff --git a/tyserv/bin/tyrecover.sh b/tyserv/bin/tyrecover.sh index a90984c..36c5682 100755 --- a/tyserv/bin/tyrecover.sh +++ b/tyserv/bin/tyrecover.sh @@ -1,41 +1,41 @@ #! /bin/sh -if [ "X${TYPHOON_DIR}" = "X" ] -then - TYPHOON_DIR=/usr/local/typhoon;export TYPHOON_DIR -fi # -if [ "X${TYPHOON_DB}" = "X" ] +if [ X"$1" = "X-h" -o X"$1" = "X--help" ] then - TYPHOON_DB=typhoondb;export TYPHOON_DB + echo "usage : `basename $0` [-d tyserv_rundir] [-stdin]" + echo " recover database from recovery journal" + exit 1 fi # -if [ "X${TYSERV_DIR}" = "X" ] -then - TYSERV_DIR=/usr/local/tyserv;export TYSERV_DIR -fi +DEF_TYSERV_DIR=${HOME}/tyserv +DEF_TYSERV_RUNDIR=${HOME}/rundir1 +TYSERV_RUNDIR=${DEF_TYSERV_RUNDIR} # -INITFILE=${TYSERV_DIR}/conf/tyserv.conf +STDIN_SW="" # -if [ X"$1" = "X-h" -o X"$1" = "X--help" ] +while [ "$#" != "0" ] +do + case $1 in + -d ) + shift + TYSERV_RUNDIR=$1 + ;; + -stdin ) + STDIN_SW=$1 + ;; + esac + shift +done +# +if [ "X${STDIN_SW}" = "X-stdin" ] then - echo "usage : `basename $0` [-]" - echo " recover database from stdin or recovery journal" - exit 1 + RVJ="" +else + RVJ=${TYSERV_RUNDIR}/journal/rvj.dat fi # -case X"$1" in -X-) - rvj="" - ;; -X) - rvj=${TYSERV_DIR}/journal/rvj.dat - ;; -*) - rvj="$1" - ;; -esac -# -/bin/cat ${rvj} |\ -/bin/egrep -v -i '^commit|^end_tran' |\ -${TYSERV_DIR}/bin/tyrecover 0 -# ^when 0, don't output recovery journal +cat ${RVJ} |\ +egrep -v -i '^commit|^end_tran' |\ +${DEF_TYSERV_DIR}/bin/tyrecover 0 ${TYSERV_RUNDIR} +# ^ ^tyserv directory +# ^when 0, don't output recovery journal diff --git a/tyserv/bin/tyrollback.sh b/tyserv/bin/tyrollback.sh index 0e0c9fa..fdbbdea 100755 --- a/tyserv/bin/tyrollback.sh +++ b/tyserv/bin/tyrollback.sh @@ -1,46 +1,60 @@ #! /bin/sh -if [ "X${TYPHOON_DIR}" = "X" ] -then - TYPHOON_DIR=/usr/local/typhoon;export TYPHOON_DIR -fi # -if [ "X${TYPHOON_DB}" = "X" ] +if [ X"$1" = "X-h" -o X"$1" = "X--help" ] then - TYPHOON_DB=typhoondb;export TYPHOON_DB + echo "usage : `basename $0` [-d tyserv_rundir] [-stdin]" + echo " rollback database from rollback journal" + exit 1 fi # -if [ "X${TYSERV_DIR}" = "X" ] -then - TYSERV_DIR=/usr/local/tyserv;export TYSERV_DIR -fi +DEF_TYSERV_DIR=/home/tyserv/tyserv +DEF_TYSERV_RUNDIR=/home/tyserv/rundir1 +TYSERV_RUNDIR=${DEF_TYSERV_RUNDIR} # -INITFILE=${TYSERV_DIR}/conf/tyserv.conf +STDIN_SW="" # -if [ X"$1" = "X-h" -o X"$1" = "X--help" ] -then - echo "usage : `basename $0`" - echo " rollback database from stdin(rollback journal)" - exit 1 -fi +while [ "$#" != "0" ] +do + case $1 in + -d ) + shift + TYSERV_RUNDIR=$1 + ;; + -stdin ) + STDIN_SW=$1 + ;; + esac + shift +done # -if [ -r ${TYSERV_DIR}/journal/rbj.dat ] +TAC=/usr/bin/tac +# +if [ "X${STDIN_SW}" = "X-stdin" ] then -## /bin/cat -n ${TYSERV_DIR}/journal/rbj.dat |\ -## /usr/bin/sort -n -r |\ -## /usr/bin/sed -e 's/^ *[0-9]* *//g' |\ -### ^TAB -## ${TYSERV_DIR}/bin/tyrecover 1 -### ^when 1, output recovery journal - if [ -x /usr/bin/tac ] + if [ -x ${TAC} ] then - /usr/bin/tac ${TYSERV_DIR}/journal/rbj.dat |\ - ${TYSERV_DIR}/bin/tyrecover 1 -# ^when 1, output recovery journal + ${TAC} |\ + ${DEF_TYSERV_DIR}/bin/tyrecover 1 ${TYSERV_RUNDIR} +# ^ ^tyserv directory +# ^when 1, output recovery journal exit 0 else exit 1 fi else - exit 1 + if [ -r ${TYSERV_RUNDIR}/journal/rbj.dat ] + then + if [ -x ${TAC} ] + then + ${TAC} ${TYSERV_RUNDIR}/journal/rbj.dat |\ + ${DEF_TYSERV_DIR}/bin/tyrecover 1 ${TYSERV_RUNDIR} +# ^ ^tyserv directory +# ^when 1, output recovery journal + exit 0 + else + exit 1 + fi + else + exit 1 + fi fi - diff --git a/tyserv/doc/HOWTO-USE-TYSERV.txt b/tyserv/doc/HOWTO-USE-TYSERV.txt index 5c58e3d..707d3e0 100644 --- a/tyserv/doc/HOWTO-USE-TYSERV.txt +++ b/tyserv/doc/HOWTO-USE-TYSERV.txt @@ -2,7 +2,7 @@ Masahiko Ito (m-ito@mbox.kyoto-inet.or.jp) - 2002.7.1 + 2003.2.1 1. データベース定義サンプル @@ -70,7 +70,7 @@ database typhoondb { 3. 標準出力へのエキスポート(csv形式への出力) 3.1. 準備 - $ cd ${TYPHOON_DIR}/dbd; tyexport -g typhoondb + $ cd /home/tyserv/typhoon/dbd; tyexport -g typhoondb $ cp typhoondb.exp to typhoondb.RECORDNAME.exp $ typhoondb.RECORDNAME.exp を編集 @@ -82,7 +82,7 @@ database typhoondb { 4. 標準入力からのインポート(csv形式からの入力) 4.1. 準備 - $ cd ${TYPHOON_DIR}/dbd; tyimport -g typhoondb + $ cd /home/tyserv/typhoon/dbd; tyimport -g typhoondb $ cp typhoondb.imp to typhoondb.RECORDNAME.imp $ typhoondb.RECORDNAME.imp を編集 @@ -97,13 +97,13 @@ database typhoondb { 再生成しなければなりません。 $ kill -TERM tyservのpid - $ cd ${TYSERV_DIR}/src + $ cd /home/tyserv/tyserv/src 必要に応じて Makefile の OBJS マクロを修正 $ make backup $ make src $ make $ make install - $ tyserv & + $ /etc/rc.d/rc.tyserv -d /home/tyserv/rundir1 6. tyserv へのアクセスコマンド diff --git a/tyserv/etc/rc.tyserv b/tyserv/etc/rc.tyserv index b10b5b2..bb1368f 100755 --- a/tyserv/etc/rc.tyserv +++ b/tyserv/etc/rc.tyserv @@ -7,31 +7,53 @@ # description: tyserv is database management system, which use typhoon # processname: tyserv -ROLLBACKER=/home/tyserv/tyserv/bin/tyrollback.sh -SERVER=/home/tyserv/tyserv/bin/tyserv +if [ X"$1" = "X-h" -o X"$1" = "X--help" ] +then + echo "usage : `basename $0` [-d tyserv_rundir] [-w]" + echo " -d tyserv run diriectory" + echo " -w warm start" + exit 1 +fi + +DEF_TYSERV_DIR=/home/tyserv/tyserv +DEF_TYSERV_RUNDIR=/home/tyserv/tyserv +ROLLBACKER=${DEF_TYSERV_DIR}/bin/tyrollback.sh +SERVER=${DEF_TYSERV_DIR}/bin/tyserv + +TYSERV_RUNDIR=${DEF_TYSERV_RUNDIR} +WARM_OPT="" -HOSTNAME=localhost;export HOSTNAME -TYPHOON_DIR=/home/tyserv/typhoon;export TYPHOON_DIR -TYPHOON_DB=typhoondb;export TYPHOON_DB -TYSERV_DIR=/home/tyserv/tyserv;export TYSERV_DIR +while [ "$#" != "0" ] +do + case $1 in + -w ) + WARM_OPT=$1 + ;; + -d ) + shift + TYSERV_RUNDIR=$1 + ;; + esac + shift +done [ -f $ROLLBACKER ] || exit 0 [ -f $SERVER ] || exit 0 -if [ "X$1" = "X-w" ] +if [ "X${WARM_OPT}" = "X-w" ] then echo -n "Starting tyserv server(warm): " - if [ -s ${TYSERV_DIR}/journal/rbj.dat ] + if [ -s ${TYSERV_RUNDIR}/journal/rbj.dat ] then echo -n "Starting tyserv rollback: " - $ROLLBACKER + $ROLLBACKER -d ${TYSERV_RUNDIR} fi else echo -n "Starting tyserv server(cold): " - /bin/rm -f ${TYSERV_DIR}/journal/rbj.dat - /bin/rm -f ${TYSERV_DIR}/journal/rvj.dat + /bin/rm -f ${TYSERV_RUNDIR}/journal/rbj.dat + /bin/rm -f ${TYSERV_RUNDIR}/journal/rvj.dat fi -$SERVER & -echo $! >${TYSERV_DIR}/etc/tyserv.pid +$SERVER ${TYSERV_RUNDIR} & +echo $! >${TYSERV_RUNDIR}/etc/tyserv.pid echo diff --git a/tyserv/sample/sample1.pl b/tyserv/sample/sample1.pl index bfee499..8431b9c 100755 --- a/tyserv/sample/sample1.pl +++ b/tyserv/sample/sample1.pl @@ -9,7 +9,7 @@ $passwd = "manager"; # if (@ARGV != 2){ - printf("usage: $0 host port"); + printf("usage: $0 host port\n"); exit 1; } ($host, $port) = @ARGV; diff --git a/tyserv/sample/sample2.pl b/tyserv/sample/sample2.pl index d65e67f..eec0a7c 100755 --- a/tyserv/sample/sample2.pl +++ b/tyserv/sample/sample2.pl @@ -9,7 +9,7 @@ $passwd = "manager"; # if (@ARGV != 2){ - printf("usage: $0 host port"); + printf("usage: $0 host port\n"); exit 1; } ($host, $port) = @ARGV; diff --git a/tyserv/sample/sample3.pl b/tyserv/sample/sample3.pl new file mode 100755 index 0000000..53051ed --- /dev/null +++ b/tyserv/sample/sample3.pl @@ -0,0 +1,541 @@ +#! /usr/bin/perl +use strict; +use IO::Socket; +require 'tyserv.pl'; +my ($host, $port, $port2, $handle, $handle2, $mode, $mode2, $sts1, $sts2, @key, %rec); +my ($user, $user2, $passwd, $passwd2, @tran_parm); +# +$user = "manager"; +$passwd = "manager"; +$user2 = "manager"; +$passwd2 = "manager"; +# +if (@ARGV != 5){ + printf("usage: $0 host port mode port2 mode2\n"); + exit 1; +} +($host, $port, $mode, $port2, $mode2) = @ARGV; +# +# create a tcp connection to the specified host and port +# +$handle = IO::Socket::INET->new(Proto => "tcp", + PeerAddr => $host, + PeerPort => $port); +if ($handle == 0){ + printf("can't connect to port $port on $host: $! \n"); + exit 1; +} +$handle->autoflush(1); # so output gets there right away +print "\n[Connected to $host:$port]\n"; +# +# create a tcp connection to the specified host and port +# +$handle2 = IO::Socket::INET->new(Proto => "tcp", + PeerAddr => $host, + PeerPort => $port2); +if ($handle2 == 0){ + printf("can't connect to port $port2 on $host: $! \n"); + exit 1; +} +$handle2->autoflush(1); # so output gets there right away +print "\n[Connected to $host:$port2]\n"; +# +# start transaction +# +print "\n[START TRANSACTION port=($port, $port2)]\n"; +# +@tran_parm = ($port, $handle, $user, $passwd, $mode, + $port2, $handle2, $user2, $passwd2, $mode2); +# +($sts1, $sts2) = &ty_start_trans(@tran_parm); +printf("start_tran %-2.2s, %-s\n", $sts1, $sts2); +# +# delete all record +# +($sts1, $sts2) = &ty_delete($handle, "smp1", ["0001"]); +($sts1, $sts2) = &ty_delete($handle, "smp1", ["0002"]); +($sts1, $sts2) = &ty_delete($handle, "smp1", ["0003"]); +($sts1, $sts2) = &ty_delete($handle, "smp1", ["0004"]); +($sts1, $sts2) = &ty_delete($handle, "smp1", ["0005"]); +# +($sts1, $sts2) = &ty_delete($handle2, "smp2", ["0001"]); +($sts1, $sts2) = &ty_delete($handle2, "smp2", ["0002"]); +($sts1, $sts2) = &ty_delete($handle2, "smp2", ["0003"]); +($sts1, $sts2) = &ty_delete($handle2, "smp2", ["0004"]); +($sts1, $sts2) = &ty_delete($handle2, "smp2", ["0005"]); +# +# insert record +# +print "\n[START INSERT port=$port]\n"; + +%rec = (); +$rec{id} = "0001"; +$rec{name} = "Masao Sato"; +$rec{salary} = "0500000"; +($sts1, $sts2) = &ty_put($handle, "smp1", \%rec); +printf("insert %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0002"; +$rec{name} = "Katsumi Kinoshita"; +$rec{salary} = "0490000"; +($sts1, $sts2) = &ty_put($handle, "smp1", \%rec); +printf("insert %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0003"; +$rec{name} = "Kiyoshi Sakamoto"; +$rec{salary} = "0510000"; +($sts1, $sts2) = &ty_put($handle, "smp1", \%rec); +printf("insert %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0004"; +$rec{name} = "Masaharu Sawada"; +$rec{salary} = "0470000"; +($sts1, $sts2) = &ty_put($handle, "smp1", \%rec); +printf("insert %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0005"; +$rec{name} = "Masahiko Ito"; +$rec{salary} = "0300000"; +($sts1, $sts2) = &ty_put($handle, "smp1", \%rec); +printf("insert %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +# +# +print "\n[START INSERT port=$port2]\n"; + +%rec = (); +$rec{id} = "0001"; +$rec{name} = "Masao Sato"; +$rec{salary} = "0500000"; +($sts1, $sts2) = &ty_put($handle2, "smp2", \%rec); +printf("insert %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0002"; +$rec{name} = "Katsumi Kinoshita"; +$rec{salary} = "0490000"; +($sts1, $sts2) = &ty_put($handle2, "smp2", \%rec); +printf("insert %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0003"; +$rec{name} = "Kiyoshi Sakamoto"; +$rec{salary} = "0510000"; +($sts1, $sts2) = &ty_put($handle2, "smp2", \%rec); +printf("insert %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0004"; +$rec{name} = "Masaharu Sawada"; +$rec{salary} = "0470000"; +($sts1, $sts2) = &ty_put($handle2, "smp2", \%rec); +printf("insert %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0005"; +$rec{name} = "Masahiko Ito"; +$rec{salary} = "0300000"; +($sts1, $sts2) = &ty_put($handle2, "smp2", \%rec); +printf("insert %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +# get record (check inserted) +# +print "\n[CHECK INSERTED RECORD port=$port]\n"; + +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["0001"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle, "smp1", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle, "smp1", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle, "smp1", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle, "smp1", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +# +# +print "\n[CHECK INSERTED RECORD port=$port2]\n"; + +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", ["0001"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle2, "smp2", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle2, "smp2", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle2, "smp2", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle2, "smp2", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +# commit transaction +# +print "\n[START COMMIT port=($port, $port2)]\n"; + +($sts1, $sts2) = &ty_commits(@tran_parm); +printf("commit %-2.2s, %-s\n", $sts1, $sts2); +# +# update record +# +print "\n[START UPDATE port=$port]\n"; + +%rec = (); +$rec{id} = "0001"; +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", [$rec{id}]); +$rec{salary} *= 10; +($sts1, $sts2) = &ty_update($handle, "smp1", [$rec{id}], \%rec); +printf("update %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0002"; +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", [$rec{id}]); +$rec{salary} *= 10; +($sts1, $sts2) = &ty_update($handle, "smp1", [$rec{id}], \%rec); +printf("update %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0003"; +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", [$rec{id}]); +$rec{salary} *= 10; +($sts1, $sts2) = &ty_update($handle, "smp1", [$rec{id}], \%rec); +printf("update %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0004"; +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", [$rec{id}]); +$rec{salary} *= 10; +($sts1, $sts2) = &ty_update($handle, "smp1", [$rec{id}], \%rec); +printf("update %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0005"; +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", [$rec{id}]); +$rec{salary} *= 10; +($sts1, $sts2) = &ty_update($handle, "smp1", [$rec{id}], \%rec); +printf("update %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +# +# +print "\n[START UPDATE port=$port2]\n"; + +%rec = (); +$rec{id} = "0001"; +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", [$rec{id}]); +$rec{salary} *= 10; +($sts1, $sts2) = &ty_update($handle2, "smp2", [$rec{id}], \%rec); +printf("update %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0002"; +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", [$rec{id}]); +$rec{salary} *= 10; +($sts1, $sts2) = &ty_update($handle2, "smp2", [$rec{id}], \%rec); +printf("update %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0003"; +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", [$rec{id}]); +$rec{salary} *= 10; +($sts1, $sts2) = &ty_update($handle2, "smp2", [$rec{id}], \%rec); +printf("update %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0004"; +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", [$rec{id}]); +$rec{salary} *= 10; +($sts1, $sts2) = &ty_update($handle2, "smp2", [$rec{id}], \%rec); +printf("update %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +%rec = (); +$rec{id} = "0005"; +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", [$rec{id}]); +$rec{salary} *= 10; +($sts1, $sts2) = &ty_update($handle2, "smp2", [$rec{id}], \%rec); +printf("update %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, $rec{id}); +# +# get record (check updated) +# +print "\n[CHECK UPDATED RECORD port=$port]\n"; + +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["0001"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle, "smp1", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle, "smp1", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle, "smp1", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle, "smp1", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +# +# +print "\n[CHECK UPDATED RECORD port=$port2]\n"; + +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", ["0001"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle2, "smp2", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle2, "smp2", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle2, "smp2", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle2, "smp2", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +# rollback transaction +# +print "\n[START ROLLBACK port=($port, $port2)]\n"; + +($sts1, $sts2) = &ty_rollbacks(@tran_parm); +printf("rollback %-2.2s, %-s\n", $sts1, $sts2); +# +# get record (check rollback) +# +print "\n[CHECK ROLLBACKED TO COMMITED POINT port=$port]\n"; + +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["0001"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle, "smp1", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle, "smp1", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle, "smp1", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle, "smp1", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +# +# +print "\n[CHECK ROLLBACKED TO COMMITED POINT port=$port2]\n"; + +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", ["0001"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle2, "smp2", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle2, "smp2", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle2, "smp2", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_getnext($handle2, "smp2", "pkey"); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +# delete record +# +print "\n[START DELETE port=$port]\n"; + +($sts1, $sts2) = &ty_delete($handle, "smp1", ["0002"]); +printf("delete %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, "0002"); +# +($sts1, $sts2) = &ty_delete($handle, "smp1", ["0004"]); +printf("delete %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, "0004"); +# +# +# +print "\n[START DELETE port=$port2]\n"; + +($sts1, $sts2) = &ty_delete($handle2, "smp2", ["0002"]); +printf("delete %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, "0002"); +# +($sts1, $sts2) = &ty_delete($handle2, "smp2", ["0004"]); +printf("delete %-2.2s, %-s, id=%-4.4s\n", $sts1, $sts2, "0004"); +# +# get record (check deleted) +# +print "\n[CHECK DELETED RECORD port=$port]\n"; + +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["0001"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["0002"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["0003"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["0004"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["0005"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +# +# +print "\n[CHECK DELETED RECORD port=$port2]\n"; + +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", ["0001"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", ["0002"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", ["0003"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", ["0004"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", ["0005"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +# +# abort transaction +# +print "\n[ABORT TRANSACTION port=($port, $port2)]\n"; + +($sts1, $sts2) = &ty_abort_trans(@tran_parm); +printf("abort_tran %-2.2s, %-s\n", $sts1, $sts2); +# +# create a tcp connection to the specified host and port +# +print "\n[RE CONNECT SERVER port=$port]\n"; + +$handle = IO::Socket::INET->new(Proto => "tcp", + PeerAddr => $host, + PeerPort => $port); +if ($handle == 0){ + printf("can't connect to port $port on $host: $! \n"); + exit 1; +} +$handle->autoflush(1); # so output gets there right away +print "\n[Connected to $host:$port]\n"; +# +# +# +print "\n[RE CONNECT SERVER port=$port2]\n"; + +$handle2 = IO::Socket::INET->new(Proto => "tcp", + PeerAddr => $host, + PeerPort => $port2); +if ($handle2 == 0){ + printf("can't connect to port $port2 on $host: $! \n"); + exit 1; +} +$handle2->autoflush(1); # so output gets there right away +print "\n[Connected to $host:$port2]\n"; +# +# start transaction +# +print "\n[START TRANSACTION port=($port, $port2)]\n"; +# +@tran_parm = ($port, $handle, $user, $passwd, $mode, + $port2, $handle2, $user2, $passwd2, $mode2); +# +($sts1, $sts2) = &ty_start_trans(@tran_parm); +printf("start_tran %-2.2s, %-s\n", $sts1, $sts2); +# +# get record (check aborted) +# +print "\n[CHECK ABORTED(ROLLBACKED TO COMMITED POINT) TRANSACTION port=$port]\n"; + +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["0001"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["0002"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["0003"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["0004"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle, "smp1", "pkey", "eq", ["0005"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +# +# +print "\n[CHECK ABORTED(ROLLBACKED TO COMMITED POINT) TRANSACTION port=$port2]\n"; + +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", ["0001"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", ["0002"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", ["0003"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", ["0004"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +%rec = (); +($sts1, $sts2, %rec) = &ty_get($handle2, "smp2", "pkey", "eq", ["0005"]); +printf("|%-2.2s|%-4.4s|%-20.20s|%7d|\n", $sts1, $rec{id}, $rec{name}, $rec{salary}); +# +# end transaction +# +print "\n[END TRANSACTION port=($port, $port2)]\n"; + +($sts1, $sts2) = &ty_end_trans(@tran_parm); +printf("end_tran %-2.2s, %-s\n", $sts1, $sts2); + diff --git a/tyserv/sample/tyserv.pl b/tyserv/sample/tyserv.pl index 12b53e3..ae35853 100644 --- a/tyserv/sample/tyserv.pl +++ b/tyserv/sample/tyserv.pl @@ -270,5 +270,204 @@ () return ($sts1, $sts2); } +#---------------------------------------------------------------------- +# +# 機能:複数トランザクションの一括開始 +# 引数:port, socket_handle, user_name, password, mode, ... +# 戻値:status1, status2 +# 例 :($status1, $status2) = ty_start_trans($port1, $handle1, "user1", "hogehoge1", "" +# $port2, $handle2, "user2", "hogehoge2", ""); +# mode : start_tran に対応 : "", "update", "io", "w", "a", "read_write" +# start_tran_njに対応 : "nj", "updatenj", "ionj", "wnj", "anj", "read_writenj" +# start_tranm に対応 : "m", "read", "input", "r", "r", "read_only" +# +sub ty_start_trans(){ + my (@parm) = @_; + my ($port, %handle, %user, %passwd, %mode); + my ($response, $sts1, $sts2, $i, $handle_tmp); + + $i = 0; + while ($parm[$i] ne ""){ + $handle{$parm[$i]} = $parm[$i + 1]; + $user{$parm[$i]} = $parm[$i + 2]; + $passwd{$parm[$i]} = $parm[$i + 3]; + $mode{$parm[$i]} = $parm[$i + 4]; + $i += 5; + } + + foreach $port (sort keys %handle){ + $handle_tmp = $handle{$port}; + if ($mode{$port} eq "" || + $mode{$port} eq "update" || $mode{$port} eq "UPDATE" || + $mode{$port} eq "io" || $mode{$port} eq "IO" || + $mode{$port} eq "w" || $mode{$port} eq "W" || + $mode{$port} eq "a" || $mode{$port} eq "A" || + $mode{$port} eq "read_write" || $mode{$port} eq "READ_WRITE"){ + printf($handle_tmp "start_tran\t$user{$port}\t$passwd{$port}\n"); + }elsif ($mode{$port} eq "nj" || $mode{$port} eq "NJ" || + $mode{$port} eq "updatenj" || $mode{$port} eq "UPDATENJ" || + $mode{$port} eq "ionj" || $mode{$port} eq "IONJ" || + $mode{$port} eq "wnj" || $mode{$port} eq "WNJ" || + $mode{$port} eq "anj" || $mode{$port} eq "ANJ" || + $mode{$port} eq "read_writenj" || $mode{$port} eq "READ_WRITENJ"){ + printf($handle_tmp "start_tran_nj\t$user{$port}\t$passwd{$port}\n"); + }elsif ($mode{$port} eq "m" || $mode{$port} eq "M" || + $mode{$port} eq "read" || $mode{$port} eq "READ" || + $mode{$port} eq "input" || $mode{$port} eq "INPUT" || + $mode{$port} eq "r" || $mode{$port} eq "R" || + $mode{$port} eq "r" || $mode{$port} eq "R" || + $mode{$port} eq "read_only" || $mode{$port} eq "READ_ONLY"){ + printf($handle_tmp "start_tranm\t$user{$port}\t$passwd{$port}\n"); + }else{ + ($sts1, $sts2) = ("NG", "UNKNOWN TRANSACTION MODE($mode{$port})"); + return ($sts1, $sts2); + } + $response = <$handle_tmp>; + chop $response; + ($sts1, $sts2) = split(/\t/, $response, 2); + if ($sts1 eq "NG"){ + return ($sts1, $sts2); + } + } + + return ($sts1, $sts2); +} +# +# 機能:複数トランザクション一括終了(トランザクションの確定) +# 引数:port, socket_handle, user_name, password, mode, ... +# 戻値:status1, status2 +# 例 :($status1, $status2) = ty_end_trans($port1, $handle1, "user1", "hogehoge1", "" +# $port2, $handle2, "user2", "hogehoge2", ""); +# +sub ty_end_trans(){ + my (@parm) = @_; + my ($port, %handle, %user, %passwd, %mode); + my ($response, $sts1, $sts2, $i, $handle_tmp); + + $i = 0; + while ($parm[$i] ne ""){ + $handle{$parm[$i]} = $parm[$i + 1]; + $user{$parm[$i]} = $parm[$i + 2]; + $passwd{$parm[$i]} = $parm[$i + 3]; + $mode{$parm[$i]} = $parm[$i + 4]; + $i += 5; + } + + foreach $port (sort keys %handle){ + $handle_tmp = $handle{$port}; + printf($handle_tmp "end_tran\n"); + $response = <$handle_tmp>; + chop $response; + ($sts1, $sts2) = split(/\t/, $response, 2); + if ($sts1 eq "NG"){ + return ($sts1, $sts2); + } + } + + return ($sts1, $sts2); +} +# +# 機能:複数トランザクション一括終了(ロールバック実行) +# 引数:port, socket_handle, user_name, password, mode, ... +# 戻値:status1, status2 +# 例 :($status1, $status2) = ty_abort_trans($port1, $handle1, "user1", "hogehoge1", "" +# $port2, $handle2, "user2", "hogehoge2", ""); +# +sub ty_abort_trans(){ + my (@parm) = @_; + my ($port, %handle, %user, %passwd, %mode); + my ($response, $sts1, $sts2, $i, $handle_tmp); + + $i = 0; + while ($parm[$i] ne ""){ + $handle{$parm[$i]} = $parm[$i + 1]; + $user{$parm[$i]} = $parm[$i + 2]; + $passwd{$parm[$i]} = $parm[$i + 3]; + $mode{$parm[$i]} = $parm[$i + 4]; + $i += 5; + } + + foreach $port (sort keys %handle){ + $handle_tmp = $handle{$port}; + printf($handle_tmp "abort_tran\n"); + $response = <$handle_tmp>; + chop $response; + ($sts1, $sts2) = split(/\t/, $response, 2); + if ($sts1 eq "NG"){ + return ($sts1, $sts2); + } + } + + return ($sts1, $sts2); +} +# +# 機能:複数コミット一括実行 +# 引数:port, socket_handle, user_name, password, mode, ... +# 戻値:status1, status2 +# 例 :($status1, $status2) = ty_commits($port1, $handle1, "user1", "hogehoge1", "" +# $port2, $handle2, "user2", "hogehoge2", ""); +# +sub ty_commits(){ + my (@parm) = @_; + my ($port, %handle, %user, %passwd, %mode); + my ($response, $sts1, $sts2, $i, $handle_tmp); + + $i = 0; + while ($parm[$i] ne ""){ + $handle{$parm[$i]} = $parm[$i + 1]; + $user{$parm[$i]} = $parm[$i + 2]; + $passwd{$parm[$i]} = $parm[$i + 3]; + $mode{$parm[$i]} = $parm[$i + 4]; + $i += 5; + } + + foreach $port (sort keys %handle){ + $handle_tmp = $handle{$port}; + printf($handle_tmp "commit\n"); + $response = <$handle_tmp>; + chop $response; + ($sts1, $sts2) = split(/\t/, $response, 2); + if ($sts1 eq "NG"){ + return ($sts1, $sts2); + } + } + + return ($sts1, $sts2); +} +# +# 機能:複数ロールバック一括実行 +# 引数:port, socket_handle, user_name, password, mode, ... +# 戻値:status1, status2 +# 例 :($status1, $status2) = ty_rollbacks($port1, $handle1, "user1", "hogehoge1", "" +# $port2, $handle2, "user2", "hogehoge2", ""); +# +sub ty_rollbacks(){ + my (@parm) = @_; + my ($port, %handle, %user, %passwd, %mode); + my ($response, $sts1, $sts2, $i, $handle_tmp); + + $i = 0; + while ($parm[$i] ne ""){ + $handle{$parm[$i]} = $parm[$i + 1]; + $user{$parm[$i]} = $parm[$i + 2]; + $passwd{$parm[$i]} = $parm[$i + 3]; + $mode{$parm[$i]} = $parm[$i + 4]; + $i += 5; + } + + foreach $port (sort keys %handle){ + $handle_tmp = $handle{$port}; + printf($handle_tmp "rollback\n"); + $response = <$handle_tmp>; + chop $response; + ($sts1, $sts2) = split(/\t/, $response, 2); + if ($sts1 eq "NG"){ + return ($sts1, $sts2); + } + } + + return ($sts1, $sts2); +} +#---------------------------------------------------------------------- 1; diff --git a/tyserv/src/Makefile b/tyserv/src/Makefile index 2955afb..d075305 100644 --- a/tyserv/src/Makefile +++ b/tyserv/src/Makefile @@ -1,10 +1,13 @@ +TYPHOON_DIR = /home/tyserv/typhoon +TYSERV_DIR = /home/tyserv/tyserv + DEFINES = -I/usr/local/include -I$(TYPHOON_DIR)/include CFLAGS = -O $(DEFINES) # -v SRV_OBJ = tyserv.o RCV_OBJ = tyrecover.o -#COM_OBJ = tysearch.o -OBJS = tyserv_smp1.o -# tyserv_smp2.o +COM_OBJ = tysearch.o +OBJS = tyserv_smp1.o \ + tyserv_smp2.o # tyserv_smp3.o CC = gcc SHELL = /bin/sh @@ -15,9 +18,8 @@ LDFLAGS = -L/usr/local/lib # for Linux LIBS = -ltyphoon -lwrap INSTALL_DIR = $(TYSERV_DIR)/bin -BACKUP_DIR = ./SRC_BACKUP -all: tyserv tyrecover # tysearch +all: tyserv tyrecover tysearch tyserv: $(SRV_OBJ) $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(SRV_OBJ) $(OBJS) $(LIBS) @@ -25,21 +27,16 @@ tyserv: $(SRV_OBJ) $(OBJS) tyrecover: $(RCV_OBJ) $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(RCV_OBJ) $(OBJS) $(LIBS) -#tysearch: $(COM_OBJ) $(OBJS) -# $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(COM_OBJ) $(OBJS) $(LIBS) +tysearch: $(COM_OBJ) $(OBJS) + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(COM_OBJ) $(OBJS) $(LIBS) install: cp tyserv $(INSTALL_DIR)/tyserv chmod 4700 $(INSTALL_DIR)/tyserv cp tyrecover $(INSTALL_DIR)/tyrecover chmod 4700 $(INSTALL_DIR)/tyrecover -# cp tysearch $(INSTALL_DIR)/tysearch -# chmod 4700 $(INSTALL_DIR)/tysearch + cp tysearch $(INSTALL_DIR)/tysearch + chmod 4700 $(INSTALL_DIR)/tysearch src: $(INSTALL_DIR)/mktyserv all - -backup: - -mkdir $(BACKUP_DIR) - cp *.c *.h $(BACKUP_DIR) -