Mini SQL
データベースサーバー


Version 1.1



mSQLはMinerva Network Management Environmentにより開発され、1993-1995 David J. Hughesによりコピーライトされています。

マニュアルのHTMLバージョンはThomas R. Kimptonにより作成され、それをラピッドサイト株式会社が翻訳しました。


目次

Mini SQL の紹介と歴史

Mini SQL(mSQL)は、少ないメモリースペースにおいて敏速なデータベースへのアクセスを提供すう軽量データベースエンジンです。 Mini SQLはその名の意味する通り、SQLのクエリーインターフェースの様な一部でしかありません。 しかし、mSQLはSQLの一部しかサポートしないにもかかわらず、ANSI SQL との調和によりすべてのデータベース機能をサポートする事ができます。 mSQLは基本的に“データベースエンジン”、“ターミナルモニタープログラム”、“データベースアドミニストレタープログラム”、 “図表ビューアー”、“C プログラム API”の機能がふくまれており、 “API”と “データベースエンジン”は TCP/IC ネットワークを通してのクライアントサーバー環境で機能するために デザインされたものです。

データベース作成決定において、他のデータベースパッケージはただお客様が得られるフリーのデータベーススペースのためだけに作られており、 それらのほとんどのパッケージはSQLのクエリー言語のような機能をサポートしておしません。 検索機能で最も有名なデータベースパッケージは、カリフォルニアのバークレー大学で開発された“Postgres”で、クエリー言語としての “PostQUEL”で知られる “Original Ingres Oracle" を提供しています。

mSQLは "Minerva環境 Network Manegement Environment" のデータベース バックエンドとして開発されました。 根本的にMinerva環境は“Postgres" をデータベースとして利用し、 ”PostQUELクエリー“をそのデータベースにアクセスするために生み出しました。 初期のMirervaのアルファテストの期間中に、もしMinerva環境がSQLクエリーを生み出したなら、 “Ingres", "Oracle"などの架設データベースを持つサイトは ”Postgres"をサポートをしなくてはいけない代わりに 彼らのコマーシャル データベースを使えたのではないかとゆう意見もあったのですが、 mSQLはそれらの問題を順応するためにSQLから“PostQUEL"への翻訳機能として開発されたのです。 ですから、コマーシャル データベースを持たないサイトも”PostQUEL"を使用できたのです。

時間の経過とMinerva環境の発達に伴い、Minerva環境によって作り出された進化するメカニズムをサポートするために “Postgres”が急激な資源要求の状態である事が明白になってきました。 スピードの問題においても、スピードを得るために、Minerva環境はデータベースにおいて“状態の監視”と “データの取得”の平行機能の拡張を余儀なくされました。 しかし残念な事に、それぞれの機能はデータベースとのコミュニケーションでそれとは別に“Postgres Backend"を生み出す結果となり、 事実それぞれの ”Postgres Backend "がほぼ1.5Mbのメモリーの消費と “Parallel data aquisition operation"のために突然の機能停止を引き起こしたのです。

“Postgres”はとても大きく有能はパッケージであるにもかかわらず、一握りのプラットフォームしかサポートしていません。 それは、何人かのMinerva環境のアルファ実験者がMinerva環境を“Silicon Graphics machine”などで運営してみたいと願っている事が 証明しています。しかし残念な事に、“Postgres”はCGI マシーンをサポートしなかったのです。 だから実験者達は、“Silicon Graphics machine" のテスト参加を断念したのです。 事実として、Minerva環境自身が“Posrgres”機能の断片しか利用しなかった事とMinerva環境と “Postgres”が連結するこが最良のオプションでなかったことが証明するようにMinerva環境がほとんどのプラットフォームにとって 手軽である必要があったのです。

It should be noted that Postgres is an excellent database package offering a vast array of powerful features and that the above comments in no way try to detract from its success. The fact that Minerva utilises very few database features (it doesn't even need a relational join) showed that a database as capable and advanced as Postgres was overkill.

Mini SQL 仕様書

MiniSQL言語は、ANSI SQLより支給された機能を提供しています。 その機能はユーザーとプログラムに対しデータの蓄積、操作、取得を可能にします。 しかし、テーブルの連結、ビュー、ネストクエリーなどと言ったリレーション能力はサポートしておりません。 mSQL言語はANSI仕様書で定義されているリレーショナル機能をサポートしておりませんが、多様テーブルにおける連結機能は提供しています。

下記の定義と例文はmSQLキーワードを大文字で書いていますが、本来のクエリーでそのような規制はございません。

テーブル定義の作成

mSQLの作成(CREATE)構文はテーブル定義を作成することにしか使用されません。 この構文ではviewsなどのような他の定義をユーザーが作ることはできません。ひとつの テーブルにつきひとつのprimary key項目しか設定できませんのでご注意ください。 項目をprimary keyとして定義した場合、その項目はnot null (空データにしてはいけない)という特性が自動的につきます。

     CREATE TABLE テーブルの名称 (
                   項目名  項目のデータタイプ   [ not null | primary key ]
                [, 項目名  項目のデータタイプ   [ not null | primary key ] ]**
例は以下のようになります。

       CREATE TABLE emp_details(
                first_name      char(15) not null,
                last_name       char(15) not null,
                dept            char(20),
                emp_id          int primary key,
                salary          int
       )

使用出来るデータタイプは以下の通りです。
   char:すべてのキャラクター
   int :整数
   real:実数

テーブル定義の削除

DROPはテーブルをデータベースから削除することに使用されます。

     DROP TABLE テーブル名
例は以下のようになります。

     DROP TABLE emp_details

テーブルへのデータの挿入

ANSI SQLと違い、選択構文を挿入構文のなかに置くことはできません。 (選択構文を挿入構文の中にネストさせることはできません。
例えば、selectによって戻されたデータを、直接挿入することはできません。) また、挿入されるデータをどの項目にいれるかを示すために、項目名を特定しなければなりません。 項目名なしでは値を特定することはできません。デフォルト(ユーザーにより特定されない場合、 プログラムにより最終的におこなわれる設定のこと)により、データが適切な項目に挿入されることはありませんのでご注意ください。

     INSERT INTO テーブル名(項目名 [, 項目名]**)
VALUES (値 [, 値]**)

例は以下のようになります。

INSERT INTO emp_details(first_name, last_name, dept, salary)
VALUES ('David', 'Hughes', 'I.T.S.', '12345')

挿入する値の数と項目の数は同じでなければなりません。

テーブルからのデータの削除

削除構文は以下のようになります。

     DELETE FROM テーブル名
     WHERE 項目名 OPERATOR 値
     [AND | OR 項目名 OPERATOR 値 ]**

OPERATORのところには以下のオペレーターを使用することができます。

         <, >,=,<=,>=,<>,like
例は以下のようになります。

     DELETE FORM emp_details WHERE emp_id = 12345

データの検索(選択)

mSQLの選択構文では、ANSI SQLにある以下の機能を利用することができません。

しかしながら、以下の機能はサポートされています。

mSQLの選択構文は以下のようになります。

      SELECT [テーブル名.]項目名 [, [テーブル名.]項目名 ]**
      FROM テーブル名[, テーブル名 ]**
      [ WHERE [テーブル名.]項目名 OPERATOR 値
              [AND | OR [テーブル名.]項目名 OPERATOR 値]**]
      [ ORDER BY [テーブル名.]項目名 [DESC] [, [テーブル名.]項目名 [DESC]]
OPERATORのところには以下のオペレーターを使用することができます。

         <, >,=,<=,>=,<>,like
値(VALUE)のところには文字もしくは項目名を使用することが出来ます。

例1)単純なデータの検出(選択)

     SELECT first_name, last_name FROM emp_details
     WHERE dept = 'finance'

例2)検出(選択)されたデータを整列する

以下の質問文(クエリー)で、戻されたデータはlast_nameによってアルファベット順に first_nameによりアルファベットの逆順に整列されます。

     SELECT first_name, last_name FROM emp_details
     WHERE dept = 'finace'
     ORDER BY last_name, first_name DESC
例3)重複したデータを省いて検出(選択)する

重複したデータを省くために、DISTINCTオペレーターを以下のように使用することができます。

     SELECT DISTINCT first_name, last_name FROM emp_details
     WHERE dept = 'finance'
     ORDER BY last_name, first_name DESC
例4)LIKEオペレターを使用して検索を行なう。

mSQLの一般表現はLIKEオペラターと一緒に使用することができ、ANSI SQLとまったく同じです。

        '_':すべての1個のキャラクターに相当します。

        '%':0個もしくはそれ以上の複数個のキャラクターに相当します・

        '\':スペシャルキャラクターを解除します。
           (例えば、’\%’は % に、’\\’は \ に相当します。)

    その他:他のすべてのキャラクターはそれ自身に相当します。


そこで、finance部署にいて、かつ'Hughes'のように2文字目からの文字列が
'ughes'から成るlast_nameを持つすべての従業員を検索するには、以下のような質問文を使います。

      SELECT first_name,last_name FROM emp_details
      WHERE dept = 'finance' AND last_name LIKE '_ughes'
例5)複数のテーブルを合わせて検索を行なう。

関連型質問言語(relational query language)の最大の特徴は、検索時に複数のテーブルをつなげて 使用する時はじめて発揮されます。ここにふたつのテーブル定義があるとします。 ひとつのテーブルには従業員情報の詳細が保存されていて、もうひとつのテーブルには、 それぞれの従業員により構成されているプロジェクトの情報が保存されているとします。 それぞれの従業員一人一人に重複しない固有の番号が付けられているとします。 このような条件で、以下のような質問文により誰がどのプロジェクトで働いているのかを検索することができます。

      SELECT emp_details.first_name, emp_details.last_name, 
                        project_details.project
      FROM emp_details, project_details
      WHERE emp_details.emp_id = project details.emp_id
      ORDER BY emp_details.last_name, emp_details.first_name
mSQLでは、ひとつの質問文中でつなげられるテーブルの数には制限がありません。
もしここに15のテーブルがあり、そのひとつひとつのテーブルが何らかの形 で従業員番号に関連する情報を含んでいれば、少し処理が遅くなりますが、 ひとつの質問文だけでそれぞれのテーブルからデータを検出することができます。 複数のテーブルを使用する時、ひとつ注意すべきことは、項目名をテーブル名と 一緒に指定しなければならないことです。mSQLでは複数テーブルをつなげるための 特別な名前をもった項目を設定することができません。そこでもしひとつの質問文の中で 複数のテーブルを同時に使用するときは、必ず全ての項目がどのテーブルのものなのかを.(ピリオド)で結んで指定しなければなりません。 (つまり、テーブル名.項目名のように。)

データの更新

mSQLの更新構文では項目名を値として使用することができません。(つまり、ある項目の内容を別の項目に直接代入することはできません。) 文字値のみが更新の値として使用することができます。

      UPDATE table_name SET column = value [, column = value ]**
      WHERE column OPERATOR value
                [ AND | OR column OPERATOR value ]**

      UPDATE テーブル名 SET 項目 = 値 [, 項目 = 値 ]**
      WHERE 項目 OPERATOR 値
                [ AND | OR 項目 OPERATOR 値 ]**

OPERATORのところには以下のオペレーターを使用することができます。

         <, >,=,<=,>=,<>,like

例は以下のようになります。

      UPDATE emp_details SET salary = 30000 WHERE emp_id = 1234

データベース エンジン

mSQLデーモン、msgldは良く知られるTCPソケットにおいてコネクションを聞くといった孤立アプリケーションです。 それはクエリーによって得られたれた多様なコネクション、シリアルを受け入れる"シングルプロセスエンジン"で、 データベースにある情報に素早いアクセスを提供するためにI/Cに位置するメモリーとCscheテクニックを利用し、 テーブルの大きさに関係なく同じ速さではたらく挿入機能を保護するための"Stack Based"メカニズムの利用もしています。 一般的なmSQLユーザーにおける予備テストにおいてもその結果は著しくフリーデータベースパッケージよりひいでていました。 実例としてmSQLにおける単純な挿入、 アップデート、セレクトといったようなサンプルクエリーはインテル486の"Linux"システムにおいて"Ingres"より4倍もはやく、 また"Postgres"においても20倍もmSQLの方が早い結果を出しました。

サーバーは良く知られるTCPソケット経由でアクセスされるか、もしくはファイルシステム(/dev/msgld)と共に "UNIX"ドメインソケットでもアクセスされています。 入手可能なTCPソケットはクライアントソフトウェアーにたいしネットワークを通しての蓄積データへのアクセスを可能にしています。 しかし、TCPソケットの使用においてリモートマシン上のクライアントソフトウェアーにおいては、 UNIXソケットがパーフォーマンスにおいて事実上の欠落をするよりむしろ サーバーとのコミュニケーションはTCPソケット経由でおこなわれるべきであると言った制限があります。 詳しくは、APIプログラミングもしくはサーバー選択の詳細でのプロクラム基準に対するコマンドオプションラインをご覧下さい。

データベースエンジンには欠陥修正コード(Debug Code)が含まれており、その進行過程は監視されていることになります。 現在、データベースエンジンでは八つの欠陥修正モジュールがあり、その使用可能なモジュールにおいての欠陥修正は、 ランタイム時に"MINERVA_DEBUG"環境値の内容をコロン(:)で仕切りリストの欠陥修正モジュール名をセットする事で可能です。

使用可能な欠陥修正モジュールリストは下記の通りです。

例えば、サーバーにプロセス前のクエリーの表示とそのクエリーの実行に取られるメモリー配分の表示を求める場合、 下記のような値がセットされるはずです。
	Setenv MINERVA_DEBUG query:malloc
ディフォルトにおいて、ソフトウェアーは/usr/local/Minervaにインストールされており、サーバーは"連結機能"、 "命令機能"と言ったオペレーションの間にデータベース管理や架設リゾルトテーブルのために そのディレクトリーのスペース使用を行うでしょう。

C プログラミング API

APIは全てのCプログラムにたいしデータベースエンジンとのコミュニケーションを可能にしています。 API機能は、あなたのプログラムへの“msql.h header file”とmSQL library (−lmsqlの使用は、Cコンパイラーへのアギュメントとしての物です。)に対するリンクによってアクセスされています。 そのlibrary とheader fileはディフォルトによってそれぞれのディレクトリー (/usr/local/Minerva/lib と /usr/local/Minerva/include)にインストールされるはずです。

mSQLデータベースエンジンのように、APIも“MINERVA_DEBUG”環境変数経由で欠陥修正機能をサポートしており、 現在“query”、“api”、“malloc”と言った三つの欠陥修正module (debugging module)がAPIによりサポートされています。 “query”moduleによる欠陥修正での特権はAPIに対してクエリーの内容をサーバーに送られながらプリントさせる事です。 また、“api”欠陥修正Moduleにおいてはコネクションの詳細と言ったインターナルインフォメーションをプリントさせます。 API libraryによるメモリー使用の詳細は、“malloc”欠陥修正module経由で取得できます。 malloced blockのサイズ、ロケーションとアドレスと言った情報はfree()にパスすることで成り立っています。 多数のmoduleの使用は“MINERVA__DEBUG”の設定において各moduleをコロン(:)で区切ることで可能になります。 例は以下のようになります。

	setenv MINERVA_DEBUG api:query

mSQLConnect()

int mSQLConnect(char * host)

msqlConnect()は、mSQLエンジンとのインターコネクションを形成しています。 それは、mSQLサーバーで運営されるホストのIPアドレスか名前しかアギュメントで必要としません。 もしNULLがホストアギュメントとして明記されるなら、 UNIX ドメインソケット(/dev/msgld)を使用したローカルホストで運営されるサーバーへのコネクションが作られたことをいみします。 また、エラーが起きた場合、−1とゆう値が戻り、“external variable msqErrMsg”が適切がメッセージを含むでしょう。 この変数は“msql.h"の中で定義されています。サーバーとのコネクションが作られた場合、整数identifierがコ―リング機能に戻されます。 この値はmSQL APIへのほかすべてのコールのハンドルとしても使われます。 値の返還は実際には、コネクションにたいするソケットディスクリプターです。 一回以上の“msqlConnect()の呼び出しと、それぞれの変数にたいする返還値の割り当てによって、 多数のデータベースサーバーのコネクションが同時に維持されています。

初期のmSQLにおいて、もしNULLがホストパラメーターならば、ターゲットマシーン仕分けのための “MSQL_HOST”環境変数が使用可能でしたが、現在、それは使用できません。 例は以下のようになります。

mSQLSelectDB()

int mSQLSelectDB(sock,dbName)
	int	sock;
	char	*dbName;

クエリーが受諾される前に、どのデータベースが使用されるかが決定されなくてはなりません。 この点において、“msqlSelectDB()”はエンジンに対してどのデータベースがアクセスされるべきかを命令します。 “msqlSelectDB()”は“msqlConnect()”と必要なデータベースの名前によって戻されたソケットディスクリプターと共に呼び出されます。 −1と言う返還値は、“msqlErrMsg”(エラーを意味するテキストストリングセット)と共にエラーを指摘するものです。 “msqlSelectDB()”は多分、プログラム実行の間に幾度も呼び出されるはずです。 その呼び出しのたびに、サーバーはそれぞれのクエリーのために仕分けされたデータベースをのアクセスのために使用します。 そしてその“msqlSelectDB()”の呼び出のたびに、プログラムは実行中にそれぞれ違ったデータベースの間でスイッチされるのです。 例は以下のようになります。

mSQLQuery()

int mSQLQuery(sock, query)
	int	sock;
	char	*query;

クエリーはプレインテキストスリングが“msqlQuery()”を呼ぶ時、ソケットと関連ずけられたコネクションを通してエンジンに送られます。 通常、−1と言う値の返還はエラーと“msqlErrMsg”がアップデートされることを意味します。 もしクエリーが“Select"statementのような表示をエンジンから得たなら、 データは待機中API(アプリケーションがデータを取り戻す事)の中でバファーされています。 またアプリケーションが他のクエリーを“msqlStoreResult()”を使ってのデータ取得前に受諾する場合、 バファー(Buffer)は新しいクエリーによて生み出されたデータによって上書きされるでしょう。 例は以下のようになります。

mSQLStoreResult()

m_result *mSQLStoreResult()

SELECTクエリーによって戻されたデータは、他のクエリーが提出せれる前もしくはデータがインターナルAPIバファーより移動される前に保存されなくてはなりません。データはmsqlStoreResult()機能(リゾルトハンドルをコーリングルーチンへ戻します。)の使用によって保存されます。リゾルトハンドルはm-result構造へのポインターでデータへのアクセスが必要とされる時に他のAPIルーチンへ渡されます。一度、リゾルトハンドルが配分されたら、他のクエリーが提出されるでしょう。また、多くのリゾルトハンドルが一つのプログラムにおいて同時に機能します。 例は以下のとおりです。

mSQLFreeResult()

void mSQLFreeResult(result)
	m_result		*result;

プログラムが決まったクエリーリゾルトと関係するデータをこれ以上必要としない場合、データはmsqlFreeResult()の使用によって開放されます。リゾルトハンドルがデータと関連したでしょうが、データセットが開放されたかを確認するためにmsqlStoreResult()によってもどされたデータがmsqlFreeResultに渡されます。 例は以下の通りです。

mSQLFetchRow()

m_row mSQLFetchRow(result)
	m_result		*result;

個々のデータベースのRow(行)は,msqlFetchRow()機能経由でアクセスされたセレクトによって返還されます。データは変数タイプm−rowの中で返還されます。M-row はRowのそれぞれのフィールドへのCharポインターを持っています。例として、セレクトステートメントが返還された行から三つフィールドを選んだ場合、その三つのフィールドの値はmsqlFetchRow()によって戻された[0],[1],[2]と言う値の構成になります。データの終わりに達した場合はNULL値が戻ります。詳しくは、このセクションの終わりに詳細例をご覧下さい。 例は以下の通りです。

mSQLDataSeek()

void mSQLDataSeek(result, pos)
	m_result 		*result;
	in		pos;

m_result構造は、次のRow(行)のデータがコーリングプログラムへ返還される事についての情報を保持するクライアントサイド"cursor"を含んでいます。MsqlDataSeekはデータcorsor位置の移動のために使われます。MsqlDataSeekが0ポジションと共に呼ばれる場合、次のmsqlDataSeekの呼び出しはサーバーによって返還された一番はじめのRow(行)のデータに戻されます。Pos値は0(一番はじめの行)からとテーブルの中にあるRow(行)のナンバー中に存在します。Seekが過去のテーブルの終わりで作られた場合、次のmsqlFetchRowの呼び出しがNULL値を戻します。 例は以下の通りです。

mSQLNumRows()

int mSQLNumRows(result)
	m_result		*result;

クエリーによって戻されたRow(行)ナンバーはmsqlNumRow()の呼び出しとmsqlStoreResult()によって返還されたリゾルトハンドルをそれにパスすることによって見つけ出されます。データのRow(行)ナンバーは整数値としてクエリーの結果が戻される時に送られます。セレクトクエリーがどのデータとも一致しない場合は、msqlNumRowによってリゾルトテーブルが0Row(行)しか持たない事を指摘します。(初期バージョンのmSQLはデータが発見されない場合、NULLリゾルトハンドルを戻します。) 例は以下の通りです。

mSQLFetchField()

m_field *mSQLFetchField(result)
	m_result		*result;

実際のデータRow(行)と共に、サーバーは選ばれたデータフィールドについての情報を戻します。この情報はmsqlFetchField()機能経由でコーリングプログラムへ入手可能にされています。MsqlFetchRowの様に、この機能は一回に一要素の情報しか戻しません。そして、それ以上の情報が入手されない場合はNULL値を戻します。データは以下のような情報を含むm_fild構造で戻されます。

typedef struct {
	char	*name,		/* name of field */
		*table;		/* name of table */
	int	type,		/* data type of field */
		length,		/* length in bytes of field */
		flags;		/* attribute flags */
} m_field;

タイプフィールドへの可能な値は、INT_TYPE,CHAR_TYPE,REAL_TYPEとしてmsql.h内で定義されています。個々の属性flag(フラッグ)は以下のマクロによってアクセスされます。

IS_PRI_KEY(flags)				/* Field is the primary key */
IS_NOT_NULL(flags)				/* Field may not contain a NULL value */

mSQLFieldSeek()

void mSQLFieldSeek(result, pos)
	m_result		*result;
	int		pos;

リゾルト構造はフィールドデータに対して"cursor"を含んでいます。MsqlFieldSeek()機能の使用によって、その位置の移動が可能です。詳しくは、msqlDataSeek()機能をご覧下さい。 例は以下の通りです。

mSQLNumFields()

int mSQLNumFields(result)
	m_result		*result;

フィールドナンバーはmsqlNumField()の呼び出しによって確認されたクエリーとそれにリゾルトハンドルをパスする事で戻されます。MsqlNumField()によって返還された値はmsqlFetchRow()によって返還されたデータベクター内で要素ナンバーを定義しています。以前に返還されたフィールドナンバーの確認は賢明な事ですが、要素にアクセスする全てのアリーはデータベクターを越え分離欠如の結果を引き起こすでしょう。

mSQLListDBs()

m_result *mSQLListDBs(sock)
	int		sock;;

mSQLエンジンへ知られるデータベースのリストは、msqlListDBs()経由で得られます。コーリングプログラムへ戻されるリゾルトハンドルは、実際のデータベース名にアクセスするために使用されます。個々のデータベース名は、それをリゾルトハンドルにパスするmsqlFetchRow()の呼び出しによってアクセスされています。それぞれの呼び出しによって戻されたm_rowデータ構造は、入手出来る1データベース名を含む1フィールドを含んでいます。リゾルトハンドルを返還するすべての機能のように、リゾルトと関係するデータはmsqlFreeResult()の使用において必要とされない場合、開放されなくてはなりません。 例は上の様になります。

mSQLListTables()

m_result *mSQLListTables(sock)
	int	sock;;

一度msqlInitDB()の使用によってデータベースが選ばれた場合、そのデータベースで定義されるテーブルのリストはmsqlListTables()の使用によって回収されます。msqlListDBs()のように、リゾルトハンドルはコーリングプログラムへ戻され、テーブル名はデータrow(行)の中に含まれています。(row(行)[0]がカレントデータベース内においてテーブル名が位置する場所です。)リゾルトハンドルはmsqlFreeResult()の呼び出しにおいて必要とされない場合、開放されなくてはなりません。

mSQLListFields()

m_result *mSQLListFields(sock,tableName);
	int	sock;
	char	*tableName

特定のテーブル内のフィールドに関する情報は、msqlListField()の使用によって得ることが可能です。この機能はデータベースがmsqlSelectDB()の使用によって選ばれた時と、リゾルトハンドルがカラーに戻された時にデータベース内のテーブル名と共に呼ばれます。msqlListDB()やmsqlListTables()とは違い、フィールド情報はデータrow(行)の代わりにフィールド構造の中に含まれており、msqlFetchField()の使用によってアクセスされます。リゾルトハンドルはmsqlFreeResult()の呼び出しで必要とされない場合、開放されなくてはなりません。

mSQLClose()

int mSQLClose(sock)
	int	sock;

mSQLエンジンへのコネクションはmsqlClose()の使用によって閉じられます。この機能はイニシャルコネクションが作られた時点でmsqlConnect()によって戻されたコネクションソケットと共に呼ばれるはずです。

The mSQL Terminal Monitor

mSQLプロンプトを使って、mSQL質問文をmSQLデーモン(サーバー上のmSQL常駐プログラム)に送ります。

Telnetでログインしてください。
そのドメインのルートディレクトリのプロンプトが表示されている状態で、

      mSQL [-h ホスト名 ] データベース名

とタイプして、リターンキーを押してください。
アクセスが成立すると、以下のようなメッセージが表示され、mSQL>とプロントがでます。

      Welcome to the miniSQL monitor.
      Type \h for help
     
      mSQL>
ここでは、以下の3つのコマンドが使用出来ます。

   \q:mSQLプロンプトを終了します。
   \g:mSQL質問文をmSQLデーモンに送ります。
          mSQLの質問文の一番後ろに¥gと書き足しリターンキーを押して下さい。
   \h:簡単な使用方法が表示されます。

全てのデータベースアプリケーションの様に、mSQLはユーザーがデータベースエンジンへのクエリーの提出を可能にする プログラムを提供しています。 それは単純に'msql'と呼ばれるもので、アクセスのためのデータベース名のある一つのコマンドラインアギュメントを必要とします。 一度プログラムが実行された場合、プログラムの再スタートをしない限りデータベースの交換は不可能です。

下記のコマンドラインフラッグが使用可能です。

モニターは、オリジナル"Ingres"モニタープログラムに従って作られました。 コマンドは、バックラッシュを前に付けたことによりクエリーと区別されています。 モニタープロンプトからのヘルプの取得は、¥hコマンドを使用してください。 またプログラムの中止は、¥qコマンドもしくはEOF(^D)を記入してください。

クエリーをエンジンの送る場合は、クエリーネームが¥gコマンドの後につづきます。 この場合、¥gコマンドはモニターにクエリーをエンジンに送る事を教える事にになります。 最後に使われたクエリーを編集される場合は、¥eコマンドをお使いください。VI(編集モード)においてクエリーの編集が可能になります。 VIではなくエディターをクエリーの編集に使用される場合は、VISUAL環境変数が代わりのエディターとして使われます。 編集終了時、通常の編集終了は編集終了済クエリーをバファーに置くとともに、お客さまをmsqlへ戻します。 そして、¥g"GO"コマンドによりそれらのクエリーはサーバーへ提出されます。

クエリーバファーはクエリーの間で維持されており、クエリーの編集だけでなく多回数のクエリー提出をも可能にしています。 新しいクエリーの記入なしで¥gがエンターされる場合、最後に使用されたクエリーが再提出されます。 そして、クエリーバファーの内容は¥pコマンドの使用により表示されます。

リモートホスト上のデータベースサーバーへの便利なアクセスを可能のする事において、 mSQLターミナルモニターはサーバー運営するマシーンを表示するために、環境変数をサポートしています。 (mSQL実行時に、"−h some.host.name"を明記するかわりに)

注意:
この機能はmSQLターミナルモニターより提供されているもので他のプログラムで使われるmSQL APIライブラリーからのものではありません。 この機能の使用は、環境変数 MSQL_HOSTを希望マシーンの名前もしくはアドレスにセットしてください。

mSQL Database Administration

mSQL データベースは、msqladmin コマンドの使用により管理されています。 新しいデータベースの作成、データベースのシャットダウンなどの管理タスクがmsqladmin によって行われることになります。 全てのmSQLプログラムの様に、msqladminも希望するマシーンを明記するために'−h HOST'コマンドラインフラッグを受け取ります。
Msqladmin で使用可能なコマンドは以下のようになります。

上記のコマンドは、ルート(Root)もしくはサーバーを運営するマシーンから送られる以外、サーバーが受け取らない事を注意してください。 それ以外からのコマンドの使用は"Permission Denied"と言うエラーの結果となります。

mSQL Schema Viewer

reshowコマンドを使用して、mSQLのデータベースの構造が確認できます。テーブルの全ての項目名、データタイプ、サイズが表示されます。 アギュメントなしでコマンドが実行される場合、サーバーに存在するデータベースのリストのみが表示される事になります。 また、データベース名を指定してコマンドを実行する場合、指定したデータベースに存在するテーブルのリストが表示されます。 データベース名、テーブル名の両方を指定してコマンドを実行する場合は、フィールド名、データ型、 サイズといったテーブルの構造が表示されます。 Reshowコマンドも他のmSQLプログラム同様にデータベースサーバーとしてリモートマシーンを明記するために '−h HOST'コマンドフラッグラインを受け取ります。

mSQL Database Dumper

このプログラムはテーブルの内容、構造もしくはデータベース全体をASCIIフォームにするために提供されています。 Msqldumpはスクリプトファイルとして、mSQLターミナルモニターによるファイル解読に適したアウトプットを作成します。 このツール使用において、データベースの内容はバックアップされるか、もしくは新しいデータベースへ移動されます。 '−h HOST'オプションによって、リモートベータベースの内容はネットへと吸い込まれるかもしれませんが、 これはmSQLデータベースの内容を複数マシーンへ写し出しのためのメカニズムとして使われています。

mSQLdump started life as a user contributed program called mSQLsave written by Igor Romanenko (igor@frog.kiev.ua). Thanks Igor.

スクリプト言語からのmSQLアクセス

ESL

その他の発達として伸張性スクリプト言語のESL言語がありMinerva環境の発達がら生 じたものです。基本的にESL言語はC言語スタイルのスクリプト言語で、自動メモリー 配分、ストリクトタイプ、連帯アリー(In-core、bound the ndbm file)、フル SNMPサポート、その他多数の機能を提供しています。ESL言語はとてもC言語と類似し ているので、C言語経験者はマニュアルを見ていただくだけですぐにESL言語でのプロ ラムが可能のはずです。ESL言語とmSQLはMinerva プロジェクトの一部として同時に 開発されました、ですからESL言語はmSQL APIを完全にサポートしています。この事 実はクライアントサーバーモードのオペレーションがそうであるように、全てのC APIの見地も含まれています。

その他のスクリプト言語によるmSQLへのアクセスは、各言語にあてられた "user-contributed extension"の使用により可能です。 下記の言語が現在サポートされています。

Perl5

Andreas Koenig k@franz.ww.TU-Berlin.DEがMsqlPerlというmSQLへのPerl5アダプタ ーを開発しました。これはmSQL 0.2 Patch1APIに対して書かれたものでAPIが変 えなかった1.0にも対応しているはずです。MsqlPerlはwww.Bond.edu.auにある /pub/Minerva/msql/contrib/MsqlPerl-a1.tgzよりftp経由で入手できます。

Python

Anthony Baxter anthony.baxter@cuug.ab.ca がPymSQLというmSQLへのPython モジ ュールを開発しました。これはmsql 0.2 Patch 1 APIの使用にかかれたものです。 Pythonはwww.Bond.edu.auにある/pub/Minerva/msql/contrib/Pymsql.tar.gzにて見つ ける事が出来ます。

Tcl

BradPeperPeper@cuug.ab.ca がtcl_msqlというmSQLへのTcl インターフェースを開 発しました。これはリリース1.0に対してつくられたものです。

アクセスコントロール

アクセスコントロールはインストレーションディレクトリーにあるmsqlフェイル によって管理されています。このファイルは各データベースがコントロールされるた めにエントリーへ分けられています。ファイルが存在しない場合もしくは決まったデ ータベースへの詳細が設定されていない場合は、アクセスがGlobal read/writeへ復 帰します。 アクセスコントロールエントリーに例は以下のようになります。

	# Sample access control for mSQL
	database=test
	read=bambi,paulp
	write=root
	host=*.Bond.edu.au,-student.it.Bond.edu.au
	access=local,remote

上記の定義において、データベース"test"は"Bond.edu.au"ドメインにある全てのホ スト(マシーン"student.it.Bond.edu.au"のために受け入れる)からLocal(ローカル )とremote connection (リモートコネクション)によってアクセスされています。 Read access (リードアクセス)は"bambi"と"paulp"のみに許可されています。それ以 外の者は、選ばれたデータベースにおいてのパフォーマンスを許可されたいません。 Write access はRoot(ルート)のみが許可されています。

コントロールは基本的に与えられたアイテムに対し初めに一致するものを見つけるこ とです。ですから"read=-*,banbi"のような設定は好ましくありません。(アクセス 拒否が"banbi"以外のすべてに出されます)なぜなら"-*"も"banbi"に当てはまってし まうからです。この場合、"-*"はディフォルトとして不必要なものですが、設定は "read=banbi,-*"でなくてはなりません。

Read のような特定の設定にエントリーがなされない場合、ディフォルト設定が全体 の拒否設定になることを注意して下さい。例として、"read"の設定がなされなかった 場合(データがロードされた後READ TAKENが存在しない事を意味します。)、だれも read accessの許可を与えられないことになります。

その他の注意として、データベースの設定において空欄のラインがエントリーの終わ りを意味します。また設定において多数の項目が一つのエントリーに記入される場合 (例、"read=banbi,paulp" と"read=root")それらは同じ"read"のライン上に鎖状に つなぐように記入してください。(例、"read=banbi,paulp,root")

ワイルドカード(*)は全ての設定記入に使用可能です。ワイルドカードはそれ自身 、テキストのどの位置に記入される場合もマッチします。(例、*.Band.edu.auの場 合、*はワイルドカードにあたり最後の部分にBand.edu.auが当てはまる全てのテキ ストとマッチします。)またワイルドカードはデータベース名にも設定する事が可能 です。良い練習としてファイル内の最後の記入として"database=*と共にエントリー をインストールします。そしてアクセスされているデータベースが他のどのルールに カバーされない場合、ディフォルトサイトポリシーが強制施行されるでしょう。

アクセスコントロール情報は"msqladmin reload"の使用によりランタイム時にリロー ドされます。これは、それがリロードコマンドをエンジンに送る前にファイルを解剖 します。そしてファイルがクリアーに解剖された場合のみ、リロードされます。ほと んどの"msqladmin"コマンドのように、ローカルホスト上でルートユーザーがコマン ドを生み出した場合のみ実行されます。

Author's Details

Mini SQL 作成者:-

	David J. Hughes
	Senior Network Programmer (and Ph.D. lunatic)
	Bond University
	Australia

E-Mail: bambi@Bond.edu.au
HTTP://Bond.edu.au/People/bambi
Fax: +61 75 951456