X68000 Ko-Window データベースサーバー dbserv v1.20 1993 2/10 小笠原博之 Ko-Window にはもともと WSRV.RC と WSRV.RS によるリソースを持っています。こ のプログラムもそれと同様に、ウィンドウ上のデータを共通で管理するのが目的です。 リソースと異なるのは以下の3点です。 アプリケーションレベルでの実現 バイナリデータの共有化が目的である 動的に読み込むデータの管理レベルを持っている 例えば hide さんのトランプのカードデータを共有化することができれば、非常に 効率が良くなるでしょう。 ●ファイル構成 dbserv.doc このファイル dbserv.win データベースサーバー dbstat.win サーバーの状態を表示するユーティリティ dbslib.a ライブラリ dbslib.h ライブラリのヘッダファイル db_smpl.c dbslib を使ったサンプルプログラムです smpl.kdb db_smpl.c によるサンプル共有データ dbsrc.lzh ソース一式 ●サーバーの起動 dbserv [-m] 通常はそのまま実行してかまいません。設定に従い、static であれば即データを 読み込みます。サーバーのエラーは Console に出力します。 サーバーはメモリに常駐するので、解除するには Command.win の kill コマンド 等を使って下さい。 起動時に、-m オプションでデータ管理テーブルの個数を指定することができます。 デフォルトは 32 です。 注意: static データの読み込みエラーは dbserv が出力しますが、dynamic データの エラー出力は、アプリケーションに依存することになります。 ● WSRV.RC の設定 WSRV.RC の !DBserv に、予めサーバーがロードするデータファイルを記述してお くことができます。データを dynamic でのみ使用する場合には、特にこの設定は必 要ありません。サーバーを常駐させるだけで OK です。 ---- <例> ------------------------------------------------------------------ !DBserv CardColor 0 static cards.kdb CardMono 0 dynamic cardsmono.kdb ---------------------------------------------------------------------------- 記述は1データあたり1行、それぞれ4項目で、以下のようになっています。 [データ名] [オプション番号] [管理レベル] [データファイル名] ======== ============== ========== ================ データ名 :アプリケーション側からのデータアクセスは、全部このデータ名 ======== によって行なわれます。(最大15byte) 大文字小文字を区別します。 オプション番号 :必ず 0 を指定しておいて下さい。ユーザー側から参照できますが ============== 現在未使用です。 管理レベル : 以下の2種類があります。 ========== static : サーバー起動時にデータを読み込み、データは常 にメモリ上に保持されます。 dynamic: アプリケーションからのアクセス要求があって初 めてメモリ上に読み込みます。アクセスするアプ リケーションがなくなると、勝手にメモリを開放 します。 この管理レベルとはサーバー内部の扱い方の違いだけなので、アプ リケーションから見た場合、どちらでも全く同じようにアクセスし て用いることができます。 データファイル名:そのデータのファイル名そのものを書いて下さい。パス名は必要あ ================ りません。データファイルの検索は、以下の順番で行なわれます。 ・環境変数 DBSERV が設定されている時 1. 環境変数 DBSERV に設定してあるパス名 (パス名の最後には必ず"/"が必要) 2. dbserv.win と同じディレクトリ ・環境変数 DBSERV が設定されていない時 1. カレントディレクトリ 2. dbserv.win と同じディレクトリ 注意!! 環境変数 DBSERV が定義されている場合はカレントディレクトリを検索し ないことに注意して下さい。(不要なディスクアクセスを行なわないためです) 注意!! データファイル名は必ずファイル名だけ書いて下さい。(パスは書かない) ●データベースへのアクセス ユーザーアプリケーションから、データベースへアクセスする方法を説明します。 付属のライブラリ dbslib.a とヘッダファイル dbslib.h を使います。 void *DBOpen( name ) char *name; データベースへのアクセスを宣言します。name は、アクセスを希望するデー タベース名へのポインタです。見つからない場合は NULL を返します。 戻り値はそのデータ領域へのポインタで、データファイルを読み込んだその 先頭に相当します。データ構造へは一切関与しませんので、利用者側で対処 して下さい。 void DBClose( name ) char *name; データベースへのアクセスを終了します。アクセスをやめる時は、必ずこれ を呼び出して下さい。 int DBOption( name ) char *name; WSRV.RC の !DBserv でのオプション番号を返します。現在特に意味を持ち ません。DBOpen() しなくてもこの関数を使用することができます。 int DBAddTable( name, option, level, file ) char *name; int option; WSRV.RC の !DBserv のオプション番号に相当する int level; 管理レベル、現在は DBDynamic のみ使用可能 char *file; 登録するデータのファイル名 サーバーの管理テーブルに、アプリケーション側からデータの追加を行ない ます。もし同じ名前のデータがすでに登録されている時は何もしません。各 アプリケーションが、DBOpen() する前にこのファンクションを呼び出すこ とで、WSRV.RC への設定追加の手間を軽減させることができます。ただし、 現在アプリ側で追加できるデータは dynamic に限ります。 すでに定義されていたなど、登録に失敗すると FALSE を返します。ただし、 ここでのエラーチェックは省いて、その後の DBOpen() 時のみ確認するよう にしても構いません。 DBAddTable( "Cards", 0, DBDynamic, "Cards.kdb" ) int DBUserCheck( info ) EventInfo *info; EventUser で使用するライブラリです。データベースサーバーの DBkill コ マンドの判定を行ないます。もし DBkill なら TRUE、それ以外の EventUser なら FALSE を返します。これはサーバー呼び出しはしません。 通常は、EventUser の最初でこの関数を呼び出し、もし TRUE が返ってきた らアプリケーションを即座に終了させることになるでしょう。この終了時は DBClose() 等のサーバーコールを行なってはいけません。 ●データの使用方法 一度 DBOpen() でデータのポインタを獲得しておき、後はそのポインタに従って自 由にアクセスを行なって下さい。1つのアプリケーションで、多数のデータへアクセ スを行なってもかまいません。ただし、データをアプリケーション側で書き換えては いけません。DBOpen() したデータは、必ず DBClose() する必要があります。 DBOpen() に失敗した時はデータアクセスができませんから、必ず戻り値をチェッ クし、必要ならエラー終了させるようにして下さい。(この場合もすでに DBOpen() しているものは DBClose() させることを忘れないように) アプリケーション終了時には必ずすべてのデータを DBClose() するようにして下 さい。 ポインタアクセスが前提なので、頻繁にアクセスされるデータを毎回 DBOpen() す るのは好ましくありません。(例えば EventRedraw のたびに DBOpen() & DBClose() を行なうなど)EventOpen 等でデータを開いて先にポインタを獲得しておいて下さい。 ですが、さほど重要でないデータを一時的にアクセスする場合においては、DBOpen() と DBClose() をペアにしたアクセスが可能です。イベント開放をはさまなければ、 この場合 EventUser によるデータ破棄のチェックを行なう必要がありません。 ●データ破棄のチェック データはポインタアクセスですから、イベントの切れ目では先にサーバーが終了し てしまう可能性があります。その場合はもちろん、アクセス先のデータがなくなり、 不都合が起こることになります。 Console では、これを避けるためにイベント毎に ConsoleOpen() を走らせてチェッ クしています。データベースアクセスの場合は、いちいちチェックを行うのはたいへ んですから、EventUser を使用することにしました。 サーバーは、kill による終了時など、アクセスされているデータがあるにもかかわ らずデータを開放しなければならない場合に、以下のイベントをすべてのプロセスに 発生させます。 info->optiono = EventUser; info->ComData = 'DBsv'; info->ComBuffer= コマンド info->ComBuffer には UserStrings と同様 char ** が入り、サーバーからのコマ ンドが入ります。現在以下のコマンドが定義されています。 info->ComBuffer = {"DBkill"} アクセスされているデータがあるにもかかわらず、全部のデータを強制破棄 することを意味します。dbserver が killされた場合など。アクセスされて いるデータがない場合にはこのイベントは発生しません。 info->ComBuffer = {"DBdel", データ名 .. , NULL } アクセスされている特定のデータを強制破棄することを意味します。ただし、 管理レベルが static のデータは、DBkill 以外で破棄されることはありませ ん。アクセスされていないデータが破棄される場合には、このイベントは発 生しません。(注: 現在のサーバーは、このコマンドを発生させることはあ りません) そのデータの破棄が送られてきた場合は、もしアクセス中であってもそのデータを DBClose() する必要はありません。 カードゲーム等、DBkill によってパターンデータがアクセス不可能になった場合 は、アプリケーションとしての実行が不可能になります。よって実質上この DBkill コマンドは、アプリケーションに対する強制終了命令といえるでしょう。 ●データの作成 サーバーが扱うデータは、特に圧縮等は行なわずそのままメモリ上に読み込みます。 データサイズは今のところアプリケーション側から知る手段はありませんので、デー タやアプリケーション側で対処して下さい。 作成したデータを公開する場合は、それをアクセスするための構造を記述した、C 言語ヘッダファイル等を用意するのが好ましいでしょう。アクセス用のライブラリを 作る等はすべてサーバー利用者にお任せします。 ●サーバーの状態表示ユーティリティ 付属の dbstat.win は、サーバーの管理テーブルの状態を Console に出力します。 起動オプションはありません。デバッグに役立てて下さい。 ●注意 まだ実験段階で、仕様は今後も修正されていく可能性があります。特に構造体内容 が修正される可能性があるため、必ずライブラリを通し、直接管理テーブルをたどる ようなアクセスは控えて下さい。 ●配布 プログラム部の著作権は作者が保持します。gcc コンパイルされ、XC v1、gnulib.a wlib.a のライブラリを含んでいます。このプログラムの配布、利用は自由です。 ●連絡先 oga@dgw.yz.yamagata-u.ac.jp DenDen-NET: DEN0006 COR. SPS-NET: SPS0783 COR.