A mSQL and perl Web Server Mini HOWTO Oliver Corff, corff@zedat.fu-berlin.de v0.1, 17 September 1997 伊佐冶 哲, isaji@mxu.meshnet.or.jp このmini-HOWTOはユーザーインターフェースとしてWWWとHTMLを使った SQL ク ライアント/サーバー データベースの構築方法について書かれています。ドイ ツコンピュータマガジン(german computer magazine)iX 8/1997 で出版され た"Gebunkert: Datenbankbedienung mit Perl und CGI(PerlとCGI を使ったデ ータバンクサービス)"というMichael Schilli氏の記事に触発されています。 ______________________________________________________________________ 目次 1. このドキュメントについて 1.1 対象読者 1.2 このテキストで使われる表現 2. イントロダクション 3. インストール過程 3.1 必要なハードウェア 3.2 必要なソフトウェア 3.3 OSのインストール 3.4 httpサーバ 3.5 ブラウザ 3.5.1 Lynxの設定 3.5.2 Arenaの設定 3.5.3 Netscapeのインストールと設定 3.6 Apacheとブラウザの協力関係 3.7 データベースエンジンとインストール 3.7.1 msql-1.0.16のインストール 3.7.2 msql-1のテスト 3.7.3 msql-2.0.1のインストール 3.7.4 msql-2のテスト 3.8 インターフェースの選択:DBI/mSQL, MsqlPerl, Lite 3.8.1 DBI と DBD-mSQL 3.8.2 MsqlPerl 3.8.3 msqlのスクリプト言語:Lite 3.9 一般的な方法:DBI と DBD-msql 3.9.1 perlデータベースインターフェース DBI のインストール 3.9.2 perl の msql ドライバ DBD-mSQL 3.10 MsqlPerlインターフェース 3.11 perlのCGIライブラリ 3.12 チェックリストのインストール 4. テストデータベースの実行 4.1 MsqlPerlサンプルスクリプトの追加 4.2 msql-2用サンプルスクリプトの追加 5. まとめと今後の見通し ______________________________________________________________________ 1. このドキュメントについて 1.1. 対象読者 Webサーバデータベースをインストールしたいけれど、必要なソフトウェアは 何か、どのようにインストールすればよいのかわからないといった人向けに書 かれています。またwebサーバを使ったSQLデータベースを入手するために必要 な情報も提供しています。CGIプログラミングやその詳細については詳しく調 べてありませんし、SQL言語についても説明はしていません。これらについて 書かれた良書がたくさんで出回っています。このドキュメントではユーザー がCGIプログラミングとSQLを学ぶことのできる場を提供します。 (悪名高い航空座席予約システムや宇宙飛行マネージメントデータベースでは なく) 小さいスケールのSQLシステムを稼働させることに関してはこのテキス トに書かれたソフトウェアで十分ですし、ドキュメントはそれにそって書いて います。このテキストで紹介するデータベースmsql のユーザーマニュアルは 各自のデータベースの構築法について詳しく情報を提供してくれています。 もしCD-ROMが使えない場合は、ftp経由でファイルを入手するための方法を 知っておきましょう。またソースからバイナリを作るやりかたも理解しておい て下さい。とにかくこのテキストで説明していることは実際稼働しているシス テム上でテストし、読者のシステム上でも動作するものと思います。 1.2. このテキストで使われる表現 ユーザーコマンド: # make install プログラムからの画面出力: Program installed. Read README for details on how to start. ファイルのサンプルコード: ______________________________________________________________________ # My comment char letter; ______________________________________________________________________ 2. イントロダクション 膨大なデータや(辞書データベースといった)複雑なリレーショナル設定のデー タベースは多くのユーザやオペレータが同時に使えるものでなくてはなりませ ん。理想的にはシステム的に接続されたさまざまなハード/ソフトウェアを使 えるものであるべきです。経費を節約するためにひとつのシステム、データベ ースサーバはパワフルなものである必要があります。ユーザーステーションは 一般的にデータの表示とコマンドの実行をします。処理はクライアント-サー バデータベースにする1台のマシン上で行われます。さらにユーザインター フェースの管理が容易でできるだけクライアント側への負担がないものの方が よいでしょう。 以上の基準(criteria)を満たすシステムは以下のプロトコル、概念、ソフト ウェアアイテムを使って構築できます。 Linux オペレーティングシステムです。マルチユーザ、マルチタスクをネット ワーク(TCP/IP)上で提供する安定したUNIXです。実際のメディアと通信 コストを除けば全てがフリーです。基本OSからテキストプロセッサ、ス クリプト、ソフト開発、インターフェースビルダーなど必要なもの全て がそろっています。 HTML HTMLはインターネット、WWW(World Wide Web)といったネットワークシ ステムインターフェースを構築するためのHypertext Markup言語 (Language)です。 HTMLは簡単でASCIIテキストエディタで編集すること ができます。 Browsers ブラウザにはテキストベース(例えばLynx)あるいはグラフィカ ル(Mosaic, Netscape, Arenaなど)アプリケーションが使えま す。HTMLドキュメントの読み込みと表示をします。データベースユーザ によって直接操作される唯一のソフトでもあります。ブラウザを使うこ とでテキスト、イメージといったさまざまなデータを表示できます。ま たブラウザが使えるさまざまなコンピュータに対してhttpサーバで通信 することができます。 http サーバ http サーバはネットワークで一般に使用されるデータがあるホストコ ンピュータへのアクセスを提供します。httpプロトコルを理解し、ユー ザが要求する情報を渡します。 SQL Structured Query Languageの略。関連データベースのデータを操作す る言語です。文法は簡単で広く商業的(wide industry)にもサポートさ れています。SQLを基にしたデータベースは典型的なクライアント/サー バの考えの中心(core)となるものです。多くのSQLシステムがありま す。有名なものではOracle, Informixなどで、低価格のものや学術 的/教育的な使用目的の場合は無料で入手できるようになりました。 (訳注:SQL=データを蓄積(Query)する時の構造とその取り出し方を定め ている言語です。SQL標準化[日本では1987年JIS規格となりました]によ りDB言語の統一、異種DBMSとの互換性などの利点があります) CGI CGI(Common Gateway Interface)はデータを蓄えてあるシステム(今回 はSQL をベースとしたシステムです)とネットワークプロトコ ル(HTML)間のプログラミングインターフェースです。CGIは多くのプロ グラミング言語で構築できますがもっともよく使われているのはperlで す。 perl Perlはきわめてパワフルなスクリプト言語です。C言語、シェル言語、 ストリーム操作言語(sed、awkなど)の長所を持っています。Perlには多 くのモジュラインターフェースがあり、SQLデータベースをコントロー ルすることもできます。 3. インストール過程 3.1. 必要なハードウェア データベースサーバで必要なハードウェアについて一般的なことは言えませ ん。予想されるユーザーの数、アプリケーションの種類、ネットワーク経 路(network load)等に大きく依存しています。 2〜3人のユーザがいるだけで ネットワークトラフィックも少ない最小な環境では RAM 16MB、i486程度のマ シンで十分です。Linuxはリソースに関してはそれで十分で、同時にさまざま なアプリケーションを起動するだけの馬力があります。もちろんもっと速いプ ロセッサやRAMの増設をすればするほど高速化することもできますが、プロ セッサよりもRAMの容量の方が重要です。 RAMを増やせば増やすほど、障害を 生じやすい集中的なメモリープロセスのディスクスワップが小さくなっていく のです。 32 MB RAM と PCIバスがあればスワップファイルなどを使わないで検索とソー トを高速に行うことができます。 この文書で書かれているインストールは32 MB RAM、1.2 GB IDEハードディス クの IBM 686(133Mhz) で行っています。はじめからインストールするものと して以下、必要な手順のリストを書きました。 3.2. 必要なソフトウェア この文書で取り扱うソフトウェアはCD-ROMやインターネットから入手できるも のです。以下のものを使います: o Red Hat Linux PowerTools:Red Hat Linux PowerTools:6 CD's Complete Easy-to-Use Red Hat 4.2, Summer '97;http://www.redhat.com から。 o msql SQLデータベースサーバ:現在2つのバージョンのものが入手できま す。このバージョンの違いは処理できる数、アドミニストレーションイン ターフェースの違いに依っています。古い方のバージョン は1.0.16で、Sunsiteミラーサイトから入手できます。ELFファイルは sunsite:apps/database/sql/msql-1.0.16 やCDROM(disc 4 of InfoMagic Linux Developer's Resource, 6-CD set, December 1996)、 http://www.infomagic.comから入手します。 新しいバージョンは2.0.1です。オーストラリアのHughe氏のホームページ (http://www.hughes.com.au)やその他ミラーサイトから入手できます。 o CPANのperl:The Comprehensive Perl Archive Network. Walnut Creek CDROM, ISBN 1-57176-077-6, May 1997; o computer journal iX 8/1997, pages 150--152のMichael Schilli 氏によ るCGIサンプルプログラム。ftpで入手 ftp.uni-paderborn.de:/doc/magazin/iX。 3.3. OSのインストール 著者はRed Hat Linux Distribution 4.2からLinuxをインストールしていま す。ちゃんとインストールするために、マシンはDOSでアクセスできるCDROMド ライブ/ ブート可能なCDROMドライブか、Linux CDの以下の設定を盛り込んだ ブートディスクのどちらかを持っているとよいでしょう。 インストールの途中でソフトウェアパッケージの選択と設定を行います。以下 のアイテムを選択しておいて下さい。 o TCP/IP ネットワークサポート o http サーバ Apache o スクリプト言語perl o X Window System o Arena (グラフィカル)とLynx (テキストベース)ブラウザ これらのパッケージはLinuxディストリビューションで配布されています。 もしすぐにこれらのパッケージをインストールしないなら、ソフトウェア パッケージにあるグラフィカルで直観的なインストールマネージャを使っ て後からインストールできます(訳注:setupコマンドなどで)。これらの パッケージをインストールする際はrootで作業をして下さい。 この文書ではネットワークインストールや初期設定の仕方は取り扱いません。 オンラインドキュメント(manページ、HTML、texinfo)や出版されているドキュ メント((Linux Bibleなどなど)を参照して下さい。 Red Hatのインストール方法は十分確立されていて、選択(ホスト名の指定な ど)を普通に行うだけです。インストールが成功すれば、システムはすぐに稼 働できます。 X Window Systemのインストールはサーバには必ずしも必要ではありませんが ローカルアクセスやテストが簡単になるので入れておくとよいでしょう。 Xの インストール方法はいくつかプログラムを使うことで行えます(XF86Setup は 自己テストの機能(self-testing facilities)を装備していて、例えばビデオ クロックプログラミングなど難しい操作はほとんどありません)。必要なこと はソフトウェアがビデオアダプタを検出できるかどうかということだけです。 安価なアクセラレータグラフィックアダプタ(S64UV+の前身のTrio S64のよう なアダプタなど)は通常、特に何もしなくても(``out of the box'')動作しま す。 ここでシステムにApache, Perl, X Window Systemがすでにインストールされ ているものとします。今後、ファイル/ディレクトリといった基本的なことは インストール時のままとして話しを進めていきます。またホスト名 はlocalhostとします。このホスト名をインストールのテスト用に使います。 全システムがちゃんと動作したら適当な名前をつけます。/etc/hostsファイル などを編集する必要があることもおぼえておいて下さい。理想的にはこれら はroot用の管理者ツールを使って行うべきです。 3.4. httpサーバ Linuxで使われるhttpサーバはApache(httpd)が有名です。 manページ(man httpd)でhttpデーモン(httpd)のインストールと稼働の仕方について説明して います。しかし問題なくインストールできているならすでにサーバは稼働され ています。ディレクトリを確認します:/home/httpd/以下3つのサブディレク トリ../cgi-bin/、../html/、../icons/ があります(訳注:RedHat以外のディ ストリビューションではディレクトリが若干違うかもしれませ ん)。../html/ディレクトリにはindex.html ファイルがあります。あとでこの ファイルは各自のファイルindex.htmlに置き換えて下さい。設定の情報 は/etc/httpd/conf/に蓄積されています。システムが十分に設定されていて、 特にエラーもなくインストールができたならこれ以上は必要ありません。 3.5. ブラウザ 基本的にLinux用のブラウザには3つのものがあります: o Lynx:テキストベースのシステム。 o Arena(フリー):シンプルなブラウザ。実験的 o Netscape(シェア):Javaをサポートしています。 LynxとArenaLinuxに附属していますが、Netscape はよそから入手しなけれ ばなりませんix86アーキテクチャ上で動作するLinux用のものがバイナリ ファイルで配布されています。アーカイブを展開すればすぐに(``out of the box'')実行できます。 3.5.1. Lynxの設定 Lynxは起動時にデフォルトURLを表示しようとします。これは常にインター ネットに接続していない場合にはちょっと厄介です。このデフォルトURLを変 更する (また他の設定も変更する)ために、システム管理者 は/usr/lib/lynx.cfg (訳注:または/usr/local/lib/lynx.cfgなど)ファイル を編集する必要があります。この設定ファイルは約57,000バイトと大きく不必 要な情報を含んでいるものもあり、/usr/local/lib/ディレクトリをホーム ディレクトリとして記述しています。ファイルのはじめあたりにSTARTFILEで はじまる行があるので、これを以下のように変更します。 ______________________________________________________________________ # STARTFILE:http://www.nyu.edu/pages/wsn/subir/lynx.html # STARTFILE:http://lynx.browser.org/ STARTFILE:http://localhost ______________________________________________________________________ ファイルを保存後、Lynxは引数なしでindex.htmlドキュメントを表示するよう になります。 [訳注:"Lynxについて" LynxはVer2.5あたりから特別なパッチなしで日本語が通るようになりました。 以下のサイトを参照してみて下さい。 o 最新のLynxソースftp://ftp2.cc.ukans.edu/pub/lynx/ o Lynxの日本語化について http://www.three-a.co.jp/~asada/lynx/ o Lynxとkterm。terminfoのバグ修正について http://www- nagao.kuee.kyoto-u.ac.jp/member/shimada/misc/lynx-kterm.html ] 3.5.2. Arenaの設定 Arenaも引数なしで起動するとデフォルトURLを表示します。このデフォル トURLは実行ファイルに組み込まれていますが、環境変数WWW_HOMEによって変 更 (overrun)することもできます。システム管理者は/etc/profileファイルに WWW_HOME="http://localhost"となるように書き込んで下さい(bashなどの場合 はexportするようにします)。例えば、 ______________________________________________________________________ WWW_HOME="http://localhost" export WWW_HOME ______________________________________________________________________ とします。一度ログインし直せば、新しいデフォルトURLがArenaで有効になり ます。 3.5.3. Netscapeのインストールと設定 Netscapeは商用の製品でLinuxディストリビューションでは配布されていませ ん。 (訳注:Caldera Open Linuxなど商用のディストリビューションではライ センスされたNetscapeがついてくるものもあります)。インターネット やCDROMのソフトウェアコレクションから入手できます。Netscape は各プラッ トフォーム用にコンパイルされたバイナリ形式で配布されています。インスト ールするにはアーカイブファイルを展開するディレクトリとして /usr/local/Netscape/を作ります(訳注:アーカイブに附属のインストールプ ログラムを使えば自動的に/usr/local/netscape/ ディレクトリを作ります)。 Javaライブラリを除くファイルは全てこのディレクトリ内にありま す(Netscape ライブラリについてはREADMEファイルを参照して下さい)。以下 のようにしてリンクをはります(/usr/local/bin/ディレクトリで作業をしま す)。 # ln -s /usr/local/Netscape/netscape . Netscapeは「Options」メニューで設定できます。「General Preferences」で は「Appearance」カードがあるので、「Home Page Location」に http://localhostを指定します。Netscapeを終了するまえに、オプションの保 存を忘れないで下さい(「Options」---「Save Options」で)。次回の起動で Apacheのページが開きます(訳注:これはローカルマシンのページで、Apache インストール時に作られます)。 3.6. Apacheとブラウザの協力関係 ブラウザとhttpサーバの最初のテストをします。適当なブラウザを起動すると apache: red hat linux web serverのページが表示されます。このページでは ファイルの場所とhttpサーバのインストールの基本を説明します。もしこのペ ージが表示されない場合はファイルが適当な場所にあるか、ブラウザの設定が 正しいかチェックしてください。ブラウザをもう一度開く前に設定ファイルの 編集を終らせて下さい。以上の設定が正しければ次にマシンのネットワーク設 定をテストします。ホスト名が設定ファイルに書いたものと違ったりネットワ ークセットアップが正しいかどうか。少なくとも/etc/hostsに以下の行がある ことをチェックします。これは重要です。 ______________________________________________________________________ 127.0.0.1 localhost localhost.localdomain ______________________________________________________________________ これはマシンにローカル接続をするとき非常に重要です。引数にホスト名を使 うようなネットワーク用コマンドを使ってテストします。例えば、telnet localhost とします(telnet はすでにマシンにインストールされています)。 もしこれがおかしければ次の作業に移るまえにもう一度ネットワーク設定を チェックしておいて下さい。 3.7. データベースエンジンとインストール データベースをインストールするには、netscapeといった上記のインストール よりも、若干準備しておくことがあります。ランタイムやアドミニストレー ションがそれぞれ違うsqlデータベースエンジンが 2〜3あり、その中で一番わ かりやすいシステムであるmsql(mini-sql)を使います。このシステムはdavid hughes氏によるもので、シェアウェアです。料金は使うバージョンに依りま す。商用的な使用の場合は250.00ドル(us)以上。個人ユーザの場合は65.00ド ル(us)以上。教育、非商用的な機関の場合はフリーで使うことができます。正 確な価格(figures)はデータベースに附属しているドキュメントのライセンス を参照してください。ここに書いた価格はだいたいの目安として下さい。 なぜ著者がmsqlを選択したかその理由を2、3述べます。まず第一にインスト ール/管理が簡単で、sql言語のカバーしている範囲が十分であることが挙げら れます。ここまで書いた時点で alligator descartes' dbi faq (perl database interface faq) に適当な説明が見つかりました。 From the current author's point of view, if the dataset is relatively small, being tables of less than 1 million rows, and less than 1000 tables in a given database, then mSQL is a perfectly acceptable solution to your problem. This database is extremely cheap, is wonderfully robust and has excellent support. [...] [日本語訳:現在の作者の指摘によると、データセットが100,000列 以下の表や1000以下のテーブルといった、比較的小さいものな らmSQLは完全にあなたの問題を解決してくれます。このデータベー スは安くしっかりしたもので優れたサポートがあります。 ] Msqlは2つのバージョン(msql-1.0.16, msql-2.0.1)が入手できます。この違 いはパフォーマンスの違い(小さい仕事では特に差はありません)や添付されて いるソフトウェアの違い(新しいバージョンには多くのツール、スクリプト ファイルがあります)によっています。以下この2つのバージョンでのインス トールについてそれぞれ解説していきます(2〜3違いがあります)。 3.7.1. msql-1.0.16のインストール msqlはソースやELFサポートバイナリとして入手できます。ELFバイナリを使え ばインストールは簡単です。アーカイブファイルmsql-1.0.16.ELF.tgzはその パッケージ中にインストール先のディレクトリを含んだ形でパッケージ化され ています。そのため展開する時にルートディレクトリで展開するだけで適当な ディレクトリにインストールされます。 もしmsql-1.0.16をコンパイルして、DBIインターフェースよりもMsqlPerlパッ ケージ (この両者の違いについては後で述べます)を使う場合に、 MsqlPerlを テスト中「some instruction inside msql failed(msql内で命令が失敗しまし た)」となることがあります。この場合MsqlPerlドキュメント (patch.lost.tables)に書かれているパッチが必要です。特にmsqldb.c の1400行( entry->def = NULL;)からの3行 *(entry->DB) = 0; *(entry->table) = 0; entry->age = 0; が大切です。コードフラグは以下です。 ______________________________________________________________________ freeTableDef(entry->def); safeFree(entry->rowBuf); safeFree(entry->keyBuf); entry->def = NULL; *(entry->DB) = 0; *(entry->table) = 0; entry->age = 0; ______________________________________________________________________ msqlをコンパイルするためにいくつか手順を踏みます。ますソースアーカイブ を展開してターゲットディレクトリを作ります。 # make target これがうまくいったら、システムは Build of target directory for Linux-2.0.30-i486 complete と表示します。この新しいディレクトリに移動して # ./setup と実行します。 ./シーケンスはこのディレクトリのsetupコマンドを実行する ために必要です。これを付けないと別のsetupが実行されてしまいます。ソー スディレクトリやrootインストールが必要かどうか聞かれます。この後システ ムはコンパイラ、ユーティリティなどのソフトが使えるかテストします。 Ready to build mSQL. You may wish to check "common/site.h" although the defaults should be fine. When you're ready, type "make all" to build the software と表示されます。そして # make all と実行して下さい。 make[2]: Leaving directory `/usr/local/Minerva/src/msql' <-- [msql] done Make of mSQL complete. You should now mSQL using make install NOTE : mSQL cannot be used free of charge at commercial sites. Please read the doc/License file to see what you have to do. make[1]: Leaving directory `/usr/local/Minerva/src' バイナリは/usr/local/bin/にソフトリンクを作ることで検索パスに通るよう にします。/usr/local/bin/ディレクトリに移動して # ln -s /usr/local/Minerva/bin/* . と実行して下さい。 3.7.2. msql-1のテスト インストール後、データベースがちゃんと動作するかどうかテストします。サ ーバデーモンをスタートさせるためにシステム管理者(root権限)としてコマン ドを実行します。 # msqld & (バックグランドでmsqlを実行するために、&を付けるのを忘れないようにして 下さい)。以下のメッセージが表示されます。 mSQL Server 1.0.16 starting ... Warning : Couldn't open ACL file: No such file or directory Without an ACL file global access is Read/Write このメッセージは、アクセス制限を設定していないために動作していないとい うことを意味しています。さしあたってシェル内からmsqlデーモンを開始でき ます。そこでコマンドを適当なrc.dスクリプトに書いておきます( 管理者だけ がデータベースコマンドを実行できます)。 # msqladmin create inventur (訳注:このコマンドの実行で空のデータベースinventurが作られます)。 msqlはDatabase "inventur" created.と返答します。 /usr/local/Minerva/msqldb/ディレクトリに空の../inventur/ サブディレク トリができます。この新しいデータベースはアドミニストレーションツー ル(詳細はmsqlドキュメントに書かれています)を使って操作できます。 3.7.3. msql-2.0.1のインストール 新しくパワフルなHugheのmSQLサーバがあり、以前のバージョンと2〜3の点で インストールに違いがあります。msql-2のインストールをはじめから行うには 以下のステップをふみます。適当なディレクトリ(例えば/usr/local/msql-2/) にアーカイブをコピーして展開します。 # tar xfvz msql-2.0.1.tar.gz (訳注:アーカイブは以下のサイトから入手できます。 ) # make target と実行します。 targetsに変更してマシンタイプを選びます。新しいサブディ レクトリ Linux-(バージョン)-(CPU)/ このディレクトリに変更して以下のよ うにセットアップをスタートします。 # ./setup 編集可能なsite.mmファイルがあります。ディレクトリ名 /usr/local/Minerva/を使っていることと思います。保存したいですか?この 場合INST_DIR=...の行に保存したいディレクトリ名を書き込んで下さい。デー タベースを構築します。 # make # make install インストールに成功すると以下のメッセージが表示されます。 [...] Installation of mSQL-2 complete. ********* ** This is the commercial, production release of mSQL-2.0 ** Please see the README file in the top directory of the ** distribution for license information. ********* インストールが適切に行われたら次はデータベース管理の詳細に注意を払わな ければなりません。ここでmsql-1とは違う作業が必要です。データベース管理 を担うユーザmsqlを作ります: # adduser msql mSQLディレクトリのオーナーをmsqlに変更します。 # cd /usr/local/Minerva # chown -R msql:msql * 次に/usr/local/bin/のデータベースバイナリへのソフトリンクを作ります。 # ln -s /usr/local/Minerva/bin/* . 以上です。 3.7.4. msql-2のテスト データベースサーバはmsql2d &コマンドによって開始され、 Mini SQL Version 2.0.1 Copyright (c) 1993-4 David J. Hughes Copyright (c) 1995-7 Hughes Technologies Pty. Ltd. All rights reserved. Loading configuration from '/usr/local/Minerva/msql.conf'. Server process reconfigured to accept 214 connections. Server running as user 'msql'. Server mode is Read/Write. Warning : No ACL file. Using global read/write access. と応答が出ます。これで完璧です。データベースはコンパイルされ適当な場所 にあります。続いてperlモジュールを継続します。perlモジュールはテスト用 に動作しているデータベースサーバの振舞いに部分的に基づいています。 きっかけがあればmsql-2.0.1に附属しているマニュアルの印刷をしておくとよ いでしょう: # gzip -d manual.ps.gz # lpr manual.ps 続いてインターフェースの構築を行いますが、新しく作ったSQLサーバを保存 して実行したほうがよいでしょう。そのほうが安心してインターフェースライ ブラリのテストができます。 3.8. インターフェースの選択:DBI/mSQL, MsqlPerl, Lite perlを使う時に参考になることがらがCamel Book(訳注:「ラクダ本」と呼ば れるものです)に書かれています。これは今回のモデルアプリケーションをも 書かれています。基本的にCGIを経由してmsqlデータベースにアクセスする方 法が以下3つあります。はじめにperlを使うかどうかということに関すること です。 (この文書が対象としている)perlを使うなら二つの異なるインター フェースモデルのどちらかを選べます。perlを使う場合はmsql独自のスクリプ ト言語(Lite)も使うことができます。非常にわかりやすく、C言語に近いクロ ーンです。 3.8.1. DBI と DBD-mSQL この執筆の時点までにDBIと呼ばれるperlのデータベースインターフェースが 。 DBIは2,3の役立つ点があります:コマンド一つで多くの商用データベース を操作できる統一されたアクセスコントロールが提供されています。与えられ たシステムで実際のデータベースはプログラマからデータベースの横取 り(pecularities)を防ぐドライバを使ってアクセスできる。DBIを使うことで マーカーによる異なるデータベース間でスムーズな移行ができる。一つのスク リプトで複数のデータベースにアクセスできる。詳しくはDBI-FAQを参照して 下さい。しかし一つ欠点もあります: DBIインターフェースはまた開発中でバ ージョンがどんどん変わっています(一カ月も経たないうちに新しいものに変 わってしまうこともあります)。同様にそれぞれのデータベースドライバも アップデートされ特定のインターフェースバージョンに依存していることもあ ります。初期にインストールしたユーザーはこの文書で挙げたバージョンをつ 使わないといけないかもしれません。というのも他のバージョンでは複雑に なってしまったり、テストのトラブルシューティングも意味のないものになっ てしまうことがあるからです。 3.8.2. MsqlPerl MsqlPerl はperlスクリプトからmsqlに直接アクセスするためのライブラリで す。 DBIインターフェースを回避してとてもコンパクトです。 msqlの両バー ジョンともよく動作しますが、その使い方は一般化されたDBI インターフェー スを使う(promoted)ことはできません。ですが小さいシステムでインストール が容易なので選択するインターフェースとします。特にDBIや特定のデータベ ースドライバよりもバージョンに依存しません。 3.8.3. msqlのスクリプト言語:Lite msql-2ではスクリプト言語(Lite)を持っています。この言語はシェルライクな 特徴を追加したちょっと変わったものです(特定のPerlバージョンに似ていま す)。 Liteはシンプルな言語でmsql-2マニュアルに詳しく書かれていま す。msql-2 パッケージにはLiteを使った簡単なアプリケーションも附属して います。 Liteについては優れた文書(msql-2に特定した内容)があるのでここではLiteに ついては説明しません。またこの文書を読んでいる読者はperlについて基礎的 な理解があるものと想定しています。ですがLiteをよく調べてみることをお奨 めします。Liteはそのシンプルで直観的な概念に関してmsql-2環境(他のデー タベースで行われているような) での解決を提供している場合があります。 3.9. 一般的な方法:DBI と DBD-msql すでにシステム設定でperlをインストールしてあるか上記したパッケージマネ ージャを使ってperlが入っているものとします。perlについては詳しく述べま せん。 perlのバージョンを見るには、 # perl -v とします。 perlは以下のメッセージを表示します。 This is perl, version 5.003 with EMBED Locally applied patches: SUIDBUF - Buffer overflow fixes for suidperl security built under linux at Apr 22 1997 10:04:46 + two suidperl security patches Copyright 1987-1996, Larry Wall [...] これで問題なければ、次はデータベース用のperlライブラリ(DBI)、msqlドラ イバ (DBD-mSQL)、CGIをインストールします。CGIドライバはいろんな場面で 必要になります。3つのアーカイブが必要です: 1. DBI-0.81.tar.gz 2. DBD-mSQL-0.65.tar.gz 3. CGI.pm-2.31.tar.gz (あるいはこれ以上のもの) 初心者の方に注意があります。ここまでで述べてきたテストインストール は上記したバージョンを使って正確に動いています。他のバージョンでは エラーとなるかもしれません。欠陥のあるバージョンのデバッグは呼び出 しの規則(conventions)やインターフェースについて詳しくない人にはどう しようもありません。 同じ動作をしているものをリネームするのが一つの方法ですが内部構造が著し く変更されていることがあったりします。そこで それまでは新しいバージョ ンに上がっていても、安全に使いたいのであればここで紹介したバージョンに するよう心がけて下さい。 mSQL((DBD-mSQL)用のデータベースドライバはインターフェース(generic interface) DBIの後にインストールするということは重要です。 オリジナルのperlディレクトリを保存するために/usr/local/PerlModules/ ディレクトリを作ることから始めます。ディレクトリ名は特に決っていないの でこれとは違う名前にすることもできます(どのperlモジュールのREADMEファ イルにもディレクトリ名については書かれていません)。上記のアーカイブを /usr/local/PerlModules/にコピーして、 # tar xzvf [archive-file] 3つのアーカイブをそれぞれ展開します([archive-file]はアーカイブ名に置 き換えて下さい)。 3つのモジュールのインストールプロセスは通常通り行います(このドキュメ ントでは各パッケージで重要なものだけを書き出してします)。 3.9.1. perlデータベースインターフェース DBI のインストール データベースインターフェースは特定のデータベースドライバをインストール する前に入れておいて下さい。DBIアーカイブを展開すると /usr/local/PerlModules/DBI-0.81/ディレクトリが作られるのでこのディレク トリに移動します。READMEファイルとperl用makefileがあります。 # perl Makefile.PL と実行して下さい。次々とメッセージが表示されます。そのうち重要な箇所を 引用します。 [...] MakeMaker (v5.34) Checking if your kit is complete... Looks good NAME => q[DBI] PREREQ_PM => { } VERSION_FROM => q[DBI.pm] clean => { FILES=>q[$(DISTVNAME)/] } dist => { DIST_DEFAULT=>q[clean distcheck disttest [...] Using PERL=/usr/bin/perl WARNING! By default new modules are installed into your 'site_lib' directories. Since site_lib directories come after the normal library directories you MUST delete old DBI files and directories from your 'privlib' and 'archlib' directories and their auto subdirectories. Writing Makefile for DBI ちゃんと実行されているようです。次に # make と実行します。もしエラーメッセージが出なければ(画面に表示されるプロト コルはエラーメッセージではありません)、新しくインストールされるライブ ラリをテストします。 # make test 表示される出力は[Shift]-[PgUp]でスクロールできます。 [...] t/basics............ok t/dbidrv............ok t/examp.............ok All tests successful. [...] DBI test application $Revision: 1.2 $ Switch: DBI-0.81 Switch by Tim Bunce, 0.81 Available Drivers: ExampleP, NullP, Sponge ExampleP: testing 2 sets of 5 connections: Connecting... 1 2 3 4 5 Disconnecting... Connecting... 1 2 3 4 5 Disconnecting... Made 10 connections in 0 secs ( 0.00 usr 0.00 sys = 0.00 cpu) test.pl done 最後にインストールするディレクトリにファイルを入れます。 # make install このコマンドは十分に確認してから実行して下さい。これ以上することはあり ません。もしなんらかの理由でインストールに失敗したら忘れないうちに作業 をやり直して下さい。 # make realclean ますはじめに。このコマンドは前のインストールで不用なものを削除します。 また画面の表示(以下省略して挙げました)をコピーしてインストールしたファ イルも削除できます。 Installing /usr/lib/perl5/site_perl/i386-linux/./auto/DBI/DBIXS.h Installing /usr/lib/perl5/site_perl/i386-linux/./auto/DBI/DBI.so Installing /usr/lib/perl5/site_perl/i386-linux/./auto/DBI/DBI.bs [...] Writing /usr/lib/perl5/site_perl/i386-linux/auto/DBI/.packlist Appending installation info to /usr/lib/perl5/i386-linux/5.003/perllocal.pod このInstallingをrmに置き換えます。これをuninstallに保存して # . uninstall と実行すれば、インストールされたファイルが削除されます。 3.9.2. perl の msql ドライバ DBD-mSQL msqlドライバはperlデータベース(generic database)インターフェースのイン ストールがうまくいった後にインストールします。インストール過程は上記し たステップと同じです。 # perl Makefile.PL ここでシステムは添付ドキュメントを読むように警告を表示します。ここで msqlの場所を見つけます。 $MSQL_HOME not defined. Searching for mSQL... Using mSQL in /usr/local/Hughes -> Which version of mSQL are you using [1/2]? 正しいバージョンを入力して下さい。以下2,3行を表示します。 Splendid! Your mSQL daemon is running. We can auto-detect your configuration! I've auto-detected your configuration to be running on port: 1114 以下のようにしてドライバのテストをします。 # make test 再び長い出力があり、 Testing: $cursor->func( '_ListSelectedFields' ). This will fail. ok: not a SELECT in msqlListSelectedFields! Re-testing: $dbh->do( 'DROP TABLE testaa' ) ok *** Testing of DBD::mSQL complete! You appear to be normal! *** で終ります。これで大丈夫です。 # make install としてインストールします。もう準備できたので次の節は飛ばしてください。 3.10. MsqlPerlインターフェース もしMsqlPerlの方を選んだなら、MsqlPerl-1.15.tar.gz以外に特定のデータベ ースドライバ(generic database driver)は必要ありません。始めに書いたよ うに MsqlPerlはperlとデータベースサーバ間でDBIインターフェースを使わず に直接やり取りをするからです。直接インストール、テストします。 perl Makefile.PLと実行するとユーティリティがスタートします。はじめにど こにmSQLがあるか答えます。/usr/local/Minerva/ならデフォルトのままでよ いです。 そしてmake testとします。この前にtestというデータベースがあることを確 認してパーミッションを読み書き可能にして下さい。 # msqladmin create test と実行します。 3.11. perlのCGIライブラリ perlのCGIパートは3つのシンプルな段階にわかれています。以下のコマンド を実行して下さい。 # perl Makefile.PL # make # make install 前のドライバと違い、このインターフェースはテストオプション (# make test)を持っていません。ところが他のモジュールは任意のケースでテストさ れる必要があります。 CGIのサンプルスクリプトがあるサブディレクトリがこれで作られます。この ディレクトリの中身を/home/http/cgi-bin/にコピーしてスクリプトのテスト のためにブラウザを起動してみて下さい。 3.12. チェックリストのインストール 以下の順に作業を進めます。 1. Linuxをネットワークサポートでインストールする 2. httpサーバのインストール(Apacheなど) 3. ブラウザのインストール(Arena, lynx, Netscapeなど) 4. SQLサーバのインストール(msql) 5. 適当なperl SQLインターフェースをインストール 6. CGIファイルのインストール 最後にクリーンアップを行います。バイナリやドキュメントは異なるディ レクトリにあるのでmsqlのソースツリーやperlモジュールは安全のために 削除しておきます (アーカイブファイルは削除しなくてよいです)。 4. テストデータベースの実行 システムインストール終了後、モデルアプリケーションを実行することができ ます。インストールしたmsqlのバージョンやperlデータベースインターフェー スに依存しし、サンプルプログラムを2〜3修正しなければいけません。 まず/home/httpd/html/にあるindex.htmlファイルがサンプルデータベースア プリケーションを呼び出すように修正します。/home/httpd/html/test/のデー タベース(アーカイブ名はperl.lst.ckですが、database.cgi あるい はinventur.cgiと呼びます)に置き換えます。 index.htmlに一行を追加します(もちろん各自のインストールに合わせて下さ い)。 ______________________________________________________________________
  • Test the Database, DBI:DBD-mSQL style!
  • Test the Database, MsqlPerl style! ______________________________________________________________________ 通常はこの2つのうちから一つを選択するのですが、もし両方ともインストー ルしている場合は上のように2行を追加することもできます。2つを使えれば パフォーマンスなどを比較することもできます。 4.1. MsqlPerlサンプルスクリプトの追加 サンプルスクリプトはMsqlPerlインターフェースを使うようにします。そのた めに適当な箇所を書き換えます。はじめにファイルのはじめあたりのuse 指定 を変更します。 ______________________________________________________________________ # # use DBI; # Generisches Datenbank-Interface use Msql; ______________________________________________________________________ そして27行付近でMsqlPerl syntaxが特定のドライバを必要としないようにし ます。 ______________________________________________________________________ # $dbh = DBI->connect($host, $database, '', $driver) || $dbh = Msql->connect($host, $database) || ______________________________________________________________________ また33行から最後までdoをqueryに変更します。 ______________________________________________________________________ # $dbh->do("SELECT * FROM hw") || db_init($dbh); $dbh->query("SELECT * FROM hw") || db_init($dbh); ______________________________________________________________________ 最後に、207行をコメントアウトします。 ______________________________________________________________________ # $sth->execute || msg("SQL Error:", $sth->errstr); ______________________________________________________________________ またerrmsgに対する前のコードフラグメントの一つのように全errstrコールを スワップする必要があります。これはバージョンに依存するものです。以上の 作業が終了したらスクリプトはスムーズに実行されます。 4.2. msql-2用サンプルスクリプトの追加 SQL syntaxはmslq-2の開発中に再定義されました。オリジナルスクリプトは 45〜58行にテーブル初期化ステートメントを実行することはできません。 primary key modifierはmsql-2ではもうサポートされていません。以下をス キップします: ______________________________________________________________________ $dbh->do(<errstr; # Neue Personen-Tabelle 新規個人テーブル create table person ( # We do not need the 'primary key' modifier anymore in msql-2! # pn int primary key, # Personalnummer個人番号 pn int, # Personalnummer name char(80), # Nachname, Vorname 姓、名 raum int # Raumnummer空間番号 ) EOT $dbh->do(<errstr; # Neue Hardware-Tabelle create table hw ( # We do not need the 'primary key' modifier anymore in msql-2! # asset int primary key, # Inventurnummer 管理番号 asset int, # Inventurnummer name char(80), # Bezeichnung 名称 person int # Besitzer 所有者 ) EOT ______________________________________________________________________ このスクリプトは個人番号が同じものも新しくエントリーしてしまいます。 msql-1はprimary keyをこの動作を防ぐのに使います。msql-2ドキュメント はCREATE INDEXが唯一のエントリ発行を閉じる方法について書かれています。 5. まとめと今後の見通し もしmsql-2をシステムにインストールしているなら、Lite, msql-2のスクリプ ト言語で書かれたサンプルプログラム、msql-2独自のスクリプト言語を見つけ られます。 msqlのどちらのバージョンもユーザーを発行しテーブル(msqladmin)に落せる ようにした管理ツールの基本セット、データベース構造のテスト(relshow) が ついています。 2世代目のmsql(msql-2)にはより価値のあるユーティリティ(msqlimport とmsqlexport)がついています。これらはSQLデータベースにフラットラインデ ータファイル(flat line data file)のダンプをするものです。すでにあるデ ータd'un coupをすでにあるテーブルに読み込んだりフラットデータをテーブ ルから展開したりするのに使われます。ユーザーはこの作業をするため のperlやSQLあるいはどのようなコードでも1行で書くことはできません。 もしデータベースを取り扱うperlスクリプトを書きたい場合はサンプルファイ ルや、DBIモジュールに附属している広範囲に渡ったオンラインドキュメント を参照して下さい。 とにかくこれでネットワークユーザー、WWWのユーザーにデータを表示する準 備ができました。 [日本語訳:伊佐冶 哲, isaji@mxu.meshnet.orjp 日本語訳について感想、訂正などありましたらご連絡下さい]