--[[プログラミングガイド]]~
*Perl+DBI/DBDでFirebirdをアクセス [#f6d44328]
 Perl から Firebird にアクセスするための専用モジュールとして IBPerl と
いうものがありますが、IBPerl は何年か前に開発が終了しており、最近では
DBI によるアクセスが推奨されています。~
 ここでは、Windows + ActivePerl での入手・インストール法と簡単な使用例
を書きます。~
 全ての情報は 2004/08/03 現在での最新です。

#contents

**DBI/DBDとは? [#p9c1da51]
 Perlから各種データベースを共通の手段でアクセスするためのモジュールです。
DBDは DBI で使用するドライバで、データベースごとに用意されています。~
 Firebirdには専用の DBD は今のところ用意されていないようなので、InterBase用
の DBD を使用します。Firebird1.5/IB6.01までの動作が確認されているようです。~
 他には ODBC 用の DBD も存在しますので、そちらを使用することも可能です。
その場合は、Firebird 用 ODBCドライバも別途に必要となりますし、使用例も
ODBC用に合わせて修正の必要があります。


**下準備 [#ucce3ed8]
 ActivePerlを普通にインストールすれば、ppmというコマンドにパスが通ります
ので、これを使用してモジュールのインストールを行います。パスが通っていない
場合は、手動で通しておいてください。~
 ''DBDがfbclient.dllを参照しますので、インストールしたFirebirdのbinディレクトリへ実行パスが通っていることを確認してください。''
パスが通っていない場合、スクリプト実行時にデータベース接続の段階で失敗します。

**DBDの入手 [#b9d22fc3]
 IB用DBDを[[SourceForgeの開発プロジェクト:http://sourceforge.net/projects/dbi-interbase/]]
から入手します。ソースとppmの2種類があると思いますが、使用にはppmのみを入手
すればとりあえず問題ありません。2004/08/02現在での最新版はV0.43です。~
 ppm形式をダウンロードする場合は、使用する Perl のバージョンに合っている
ものをダウンロードして下さい。今のところは5.6用と5.8用の2種類があるようです。~
 zip形式で圧縮されていますので、適当なフォルダに展開してください。
(ここでは、Cドライブの\ExDBD_IBに展開したものとして以後の例を示します)

**DBIの入手 [#s5049523]
 ppmコマンドを使用してオンラインで入手します。インストール作業と同時に
行いますので、特にファイルとして入手する必要はありません。~

**インストール [#nac7172a]

***DBIのインストール [#e7c02c4c]
 ppmコマンドを使用して、オンラインでモジュールをダウンロードしインストールを
行います。具体的には、
 ppm install DBI
 とコマンドラインから打ち込みます。ちなみに、インストール済みの場合はその旨
を示すメッセージが出ます。~
 インストールに成功した場合は、最終的に以下のようなコンソール表示になるはず
です。

 C:\>ppm install DBI
 ====================
 Install 'DBI' version 1.43 in ActivePerl 5.8.3.809.
 ====================
 Downloaded 513616 bytes.
 Extracting 69/69: blib/arch/auto/DBI/Driver_xst.h
 Installing C:\Perl\site\lib\auto\DBI\dbd_xsh.h
 Installing C:\Perl\site\lib\auto\DBI\DBI.bs
 Installing C:\Perl\site\lib\auto\DBI\DBI.dll
 Installing C:\Perl\site\lib\auto\DBI\DBI.exp
 Installing C:\Perl\site\lib\auto\DBI\DBI.lib
 Installing C:\Perl\site\lib\auto\DBI\dbipport.h
 Installing C:\Perl\site\lib\auto\DBI\dbivport.h
 Installing C:\Perl\site\lib\auto\DBI\DBIXS.h
 Installing C:\Perl\site\lib\auto\DBI\dbi_sql.h
 Installing C:\Perl\site\lib\auto\DBI\Driver.xst
 Installing C:\Perl\site\lib\auto\DBI\Driver_xst.h
 Installing C:\Perl\html\bin\dbiprof.html
 Installing C:\Perl\html\bin\dbiproxy.html
 Installing C:\Perl\html\site\lib\DBI.html
 Installing C:\Perl\html\site\lib\Bundle\DBI.html
 Installing C:\Perl\html\site\lib\DBD\DBM.html
 Installing C:\Perl\html\site\lib\DBD\File.html
 Installing C:\Perl\html\site\lib\DBD\Proxy.html
 Installing C:\Perl\html\site\lib\DBD\Sponge.html
 Installing C:\Perl\html\site\lib\DBI\Changes.html
 Installing C:\Perl\html\site\lib\DBI\DBD.html
 Installing C:\Perl\html\site\lib\DBI\FAQ.html
 Installing C:\Perl\html\site\lib\DBI\Profile.html
 Installing C:\Perl\html\site\lib\DBI\ProfileData.html
 Installing C:\Perl\html\site\lib\DBI\ProfileDumper.html
 Installing C:\Perl\html\site\lib\DBI\ProxyServer.html
 Installing C:\Perl\html\site\lib\DBI\PurePerl.html
 Installing C:\Perl\html\site\lib\DBI\W32ODBC.html
 Installing C:\Perl\html\site\lib\DBI\Const\GetInfoReturn.html
 Installing C:\Perl\html\site\lib\DBI\Const\GetInfoType.html
 Installing C:\Perl\html\site\lib\DBI\Const\GetInfo\ANSI.html
 Installing C:\Perl\html\site\lib\DBI\Const\GetInfo\ODBC.html
 Installing C:\Perl\html\site\lib\DBI\DBD\Metadata.html
 Installing C:\Perl\html\site\lib\DBI\ProfileDumper\Apache.html
 Installing C:\Perl\html\site\lib\DBI\SQL\Nano.html
 Installing C:\Perl\html\site\lib\Win32\DBIODBC.html
 Files found in blib\arch: installing files in blib\lib into architecture dependent library tree
 Installing C:\Perl\site\lib\DBI.pm
 Installing C:\Perl\site\lib\Bundle\DBI.pm
 Installing C:\Perl\site\lib\DBD\DBM.pm
 Installing C:\Perl\site\lib\DBD\ExampleP.pm
 Installing C:\Perl\site\lib\DBD\File.pm
 Installing C:\Perl\site\lib\DBD\NullP.pm
 Installing C:\Perl\site\lib\DBD\Proxy.pm
 Installing C:\Perl\site\lib\DBD\Sponge.pm
 Installing C:\Perl\site\lib\DBI\Changes.pm
 Installing C:\Perl\site\lib\DBI\DBD.pm
 Installing C:\Perl\site\lib\DBI\FAQ.pm
 Installing C:\Perl\site\lib\DBI\Profile.pm
 Installing C:\Perl\site\lib\DBI\ProfileData.pm
 Installing C:\Perl\site\lib\DBI\ProfileDumper.pm
 Installing C:\Perl\site\lib\DBI\ProxyServer.pm
 Installing C:\Perl\site\lib\DBI\PurePerl.pm
 Installing C:\Perl\site\lib\DBI\W32ODBC.pm
 Installing C:\Perl\site\lib\DBI\Const\GetInfoReturn.pm
 Installing C:\Perl\site\lib\DBI\Const\GetInfoType.pm
 Installing C:\Perl\site\lib\DBI\Const\GetInfo\ANSI.pm
 Installing C:\Perl\site\lib\DBI\Const\GetInfo\ODBC.pm
 Installing C:\Perl\site\lib\DBI\DBD\Metadata.pm
 Installing C:\Perl\site\lib\DBI\ProfileDumper\Apache.pm
 Installing C:\Perl\site\lib\DBI\SQL\Nano.pm
 Installing C:\Perl\site\lib\Win32\DBIODBC.pm
 Installing C:\Perl\bin\dbiprof
 Installing C:\Perl\bin\dbiprof.bat
 Installing C:\Perl\bin\dbiproxy
 Installing C:\Perl\bin\dbiproxy.bat
 Successfully installed DBI version 1.43 in ActivePerl 5.8.3.809.
 
 C:\>


***DBDのインストール [#va42b45d]
 ppmコマンドを使用してインストールを行います。ダウンロードしたファイル
をすべて適当なディレクトリ(今回はC:\ExDBD_IB)に展開しておいてください。
IB用DBDは、現在のところではオンラインインストールは出来ないようです。~
 インストールを行うには、zipを展開したディレクトリに移動した後に、
 ppm install DBD-InterBase.ppd
 とコマンドラインから打ち込みます。ちなみに、インストール済みの場合は
その旨を示すメッセージが出ます。~
 インストールに成功した場合は、最終的に以下のようなコンソール表示に
なるはずです。

 C:\>cd ExDBD_IB
 
 C:\ExDBD_IB>ppm install DBD-InterBase.ppd
 ====================
 Install 'DBD-InterBase' version 0.43 in ActivePerl 5.8.3.809.
 ====================
 Installing C:\Perl\site\lib\auto\DBD\InterBase\InterBase.bs
 Installing C:\Perl\site\lib\auto\DBD\InterBase\InterBase.dll
 Installing C:\Perl\site\lib\auto\DBD\InterBase\InterBase.exp
 Installing C:\Perl\site\lib\auto\DBD\InterBase\InterBase.lib
 Installing C:\Perl\site\lib\auto\DBD\InterBase\InterBase.pdb
 Files found in blib\arch: installing files in blib\lib into architecture dependent library tree
 Installing C:\Perl\site\lib\Bundle\DBD\InterBase.pm
 Installing C:\Perl\site\lib\DBD\InterBase.pm
 Installing C:\Perl\site\lib\DBD\InterBase\FAQ.pm
 Installing C:\Perl\site\lib\DBD\InterBase\GetInfo.pm
 Successfully installed DBD-InterBase version 0.43 in ActivePerl 5.8.3.809.
 
 C:\ExDBD_IB>


**スクリプトを実行させて確認 [#zc8a3705]
 実際に、Perlのスクリプトを走らせて見て動作確認を行います。ActivePerlの
場合、通常は拡張子で関連付けが行われているので、拡張子を".pl"に設定すれば
コマンドプロンプトからそのまま実行できます。

***接続確認 [#v089cb8f]
 単純な接続確認です。以下のスクリプトを"test.pl"のファイル名で保存してください。
ホストやデータベースのパスの設定は、環境に合わせて変更する必要があります。~
&br;
test.plのリスト:

 #!/usr/bin/perl
 # 接続テスト : test.pl
 use DBI;
 
 # パラメータ設定
 $host     = 'localhost';
 $dbpath   = 'e:/firebird/TEST.FDB';
 $user     = 'SYSDBA';
 $password = 'masterkey';
 
 # ※ドライバの指定はコロン(:)で、IB/FB用の接続パラメータは
 #   セミコロン(;)で区切らなければならないので注意。
 $data_source = 'dbi:InterBase:' . "host=$host;dbname=$dbpath";
 
 $dbh = DBI->connect($data_source, $user, $password);
 unless($dbh) {
     print STDERR "Error : connect.\n";
     exit -1;
 }
 
 $dbh->disconnect();
 
 print STDERR "Succses.\n";
 

&br;
 とりあえず、実行してみましょう。
&br;
test.plの実行例(成功時):
 
 C:\>test.pl
 Succses.
 

***単純SELECT実行 [#l171c001]
 単純なSELECT文の実行です。以下のスクリプトを"select.pl"のファイル名で保存してください。
ホストやデータベースのパスの設定は、環境に合わせて変更する必要があります。~
&br;
select.plのリスト:
 #!/usr/bin/perl
 # SELECT テスト : select.pl
 # テーブルの名前は、コマンドライン引数で指定する。
 use DBI;
 
 # パラメータ設定
 $host     = 'localhost';
 $dbpath   = 'e:/firebird/TEST.FDB';
 $user     = 'SYSDBA';
 $password = 'masterkey';
 
 # ※ドライバの指定はコロン(:)で、IB/FB用の接続パラメータは
 #   セミコロン(;)で区切らなければならないので注意。
 $data_source = 'dbi:InterBase:' . "host=$host;dbname=$dbpath";
 
 $dbh = DBI->connect($data_source, $user, $password);
 unless($dbh) {
     print STDERR "Error : connect.\n";
     exit -1;
 }
 
 #クエリの作成
 $sql = "SELECT * FROM $ARGV[0]";
 
 $sth = $dbh->prepare($sql);
 if ($sth) {
     $sth->execute();     #パラメータ指定はなし
     while ($result = $sth->fetchrow()) {
         print "$result\n";
     }
     $sth->finish();
 } else {
     print STDERR "Error : prepare.\n";
 }
 
 $dbh->disconnect();
 

&br;
 コマンドラインでテーブル名を指定して実行します。
&br;
select.plの実行例:
 
 C:\>select.pl TEST
 1
 アイテム�
 

**接続パラメータの説明 [#yb17e531]
 DBI::connectで指定する接続パラメータは次のようになっています。
必須項目はデータベース名のみです。大抵はデータベース名とホスト名の指定
程度での使用が多いでしょう。~

|パラメータ|説明|必須項目|h
|database&br;又はdbname&br;又はdb|データベース名|○|
|host|ホスト名||
|port|ポート番号||
|ib_dialect|Dialect数||
|ib_role|ロール名||
|ib_charset|キャラクタセットの指定||
|ib_cache|キャッシュバッファサイズ||

 実際の指定は、InterBase用DBD使用の指定と、独自の接続パラメータの指定
を同時に行います。同時の接続パラメータが複数ある場合は、パラメータの間を
セミコロンで区切ります。~
 例えば、次のような形になります。

 $dbh = DBI->connect("dbi:InterBase:dbname=$dbname","sysdba","masterkey");

 マルチラインでの指定も可能です。

 $dsn =<< "DSN";
 dbi:InterBase:dbname=$dbname;
 host=$host;
 port=$port;
 ib_dialect=$dialect;
 ib_role=$role;
 ib_charset=$charset;
 ib_cache=$cache
 DSN
 
 $dbh =  DBI->connect($dsn, $username, $password);