Perl からの Empress の利用について(Linux/Unix)

第1版 2004/07

1. はじめに

このドキュメントでは、Perl からEmpress データベースをアクセスするためのセットアップ方法 および簡単なアクセステストについて説明します。

Empress Version 8.62 を Perl から利用するためには、ODBCマネージャ (unixODBC) Perl DBD ODBCインターフェイス、Perl DBI インターフェイスを必要とします。 Empress の固有の定義が含まれているものは Perl DBD インターフェイスで、 インターネット上で公開されている Perl DBD インターフェイスは、Empress をサポートしています。

[ 注意 ]

Empress の以前のversion v8.20 および v6.10 では、Empress の DBD インターフェイスとして、 「入門Perl DBI」(株式会社オライリー・ジャパン2001/08出版)の中で紹介されている Empress 専用のDBD「DBD::Empress と DBD:: EmpressNet」を独自に提供していましたが、 v8.60 以上では専用のDBDインターフェイスを使用せず、一般に公開されている Perl DBD::ODBC を使用します。

専用のDBDを使用しない理由として、以下のことが挙げられます。

  • Empress のバージョンが更新されるごとに 「DBD::Empress DBD:: EmpressNet」を 更新しなくてはならず、バージョンの互換が保てない
  • 標準的なODBCドライバを使うことでアプリケーションの互換性が向上する。
  • v8.60から Empress ODBC Local Access Driver が提供され、専用のドライバと 処理速度および機能が変わらない。
  • インストールおよびセットアップが標準化できる。

これらのことから専用のドライバより、一般的なODBCドライバを利用するほうが、 多くの利点があります。

現在のversion v8.62では、以前の専用 DBD (DBD::Empress と DBD:: EmpressNet)を使用することは できません。また、「入門Perl DBI」の「DBD::Empress と DBD:: EmpressNet」に記述されている内容は 以前のversion に対応する記述ですのでご注意願います。

2. セットアップ方法

2.1 準備

Perl から Empress をアクセスするためには、以下のソフトウェアが必要になります。 適当なダウンロードサイトから取得してください。 (Perl は既にインストールされていることを前提としています。)

2.2 インストール環境の例

以降でそれぞれのモジュールのインストールの説明をしますが、 先にこのドキュメントを記述するためにインストールをおこなったマシン環境を示します。

マシン環境によっては、セットアップ手順どおりではインストールできない可能性も あるとは思いますが、その点は上記の環境下での説明ということでご理解ください。

2.3 unixODBCのインストール

unixODBC をインストールします。後にインストールする Perl DBD-ODBC がunixODBCの 環境を参照するため、最初にインストールしてください。

ソースパッケージを展開し、READMEファイルに書かれている手順に従いインストールします。

        ex. unixOBDC のインストール例 


         % cd /usr/local/src
         % tar xfz /tmp/unixODBC-2.2.9.tar.gz 
         % cd unixODBC-2.2.9
         % ./configure
         % make
         % su 
         # make install         


         デフォルトでは /usr/local 以下にインストールされます。 
         また、./configure でエラーになる場合は、エラー内容にもよりますが、
         以下のオプションを試してみてください。

         % ./configure --enable-gui=no --enable-drivers=no

2.4 Perl DBI のインストール

ソースパッケージを展開し、READMEファイルに書かれている手順に従いインストールします。

        ex.  Perl DBI のインストール例 

         % cd /usr/local/src/perl
         % tar xvfz  /tmp/DBI-1.43.tar.gz 
         % cd DBI-1.43
         % perl Makefile.PL
         % make
         % make test
         # su
         # make install

         

2.5 Perl DBD-ODBC のインストール

Perl DBD-ODBC のインストールは、先に unixODBC をインストールする必要があります。

また、環境変数 ODBCHOME をMakefile.PLでチェックしているため、 インストール前に設定してから作業します。環境変数 ODBCHOME に設定する値は、 unixODBC 環境がインストールされたディレクトリを指定します。 例ではunixODBCをデフォルトでインストールしたので "/usr/local"を設定します。

ソースパッケージを展開し、READMEファイルに書かれている手順に従いインストールしますが、 1点、make 後のテストにおいて、unixODBC マネージャに対し、実際のEmpress ODBCドライバを 呼び出すテストをおこなうため、EmpressのODBCサーバーの設定、テスト環境変数、 ODBC環境変数、およびODBC環境ファイルの設定が必要になります。 そのため、ここでのインストール例ではテストを省略します。 (テストを行う場合は、次の章を参考にODBCの設定おこない DBD::ODBC のテスト環境変数 DBI_DSN, DBI_USER, DBI_PASSを設定します。)

        ex.   Perl DBD-ODBCのインストール例 

         % export ODBCHOME=/usr/local
         % cd /usr/local/src/perl
         % tar xvfz  DBD-ODBC-1.09.tar.gz 
         % cd DBD-ODBC-1.09
         % perl Makefile.PL
         % make
         # su
         # make install

      ※ perl Makefile.PL を実行したときに以下のメッセージが出力されますが、
            Makefile が作成されれば問題ありませんので無視します。

     ----
      Useless use of private variable in void context at Makefile.PL line 430.

      Configuring DBD::ODBC ...

      >>>     Remember to actually *READ* the README file!
              And re-read it if you have any problems.

      Multiple copies of Driver.xst found in: /usr/lib/perl5/site_perl/5.8.0/i386-linu
      x-thread-multi/auto/DBI /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi
      /auto/DBI at Makefile.PL line 60
      Using DBI 1.43 (for perl 5.008 on i386-linux-thread-multi) installed in /usr/lib
      /perl5/site_perl/5.8.0/i386-linux-thread-multi/auto/DBI
      Using ODBC in /usr/local
      Use of uninitialized value in substitution (s///) at Makefile.PL line 154.

      Umm, this looks like a unixodbc type of driver manager.
      We expect to find the sql.h, sqlext.h and (which were
      supplied with unixODBC) in $ODBCHOME/include directory alongside
      the /usr/local/lib/libodbc.so library. in $ODBCHOME/lib

      Warning: LD_LIBRARY_PATH doesn't include /usr/local

      Injecting selected odbc driver into cc command
      Injecting selected odbc driver into cc command
      Multiple copies of Driver.xst found in: /usr/lib/perl5/site_perl/5.8.0/i386-linu
      x-thread-multi/auto/DBI /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi
      /auto/DBI at Makefile.PL line 461
      Using DBI 1.43 (for perl 5.008 on i386-linux-thread-multi) installed in /usr/lib
      /perl5/site_perl/5.8.0/i386-linux-thread-multi/auto/DBI
      Writing Makefile for DBD::ODBC

      The DBD::ODBC tests will use these values for the database connection:
      DBI_DSN=            e.g. dbi:ODBC:demo
      DBI_USER=
      DBI_PASS=
      Warning: not all required environment variables are set.

以上でインストールは完了です。

3. ODBC の設定

ODBC を利用するためには、ODBCの環境設定ファイル(odbcinst.ini と odbc.ini) および環境変数 (ODBCHOMEMSODBCINIFILEの設定が必要です。

3.1 odbcinst.ini ファイルの設定

unixODBC マネージャからEmpress ODBC ドライバを呼び出すために、 Empress ODBCドライバの情報を odbcinst.ini ファイルに登録します。 odbcinst.iniファイルは、デフォルトでは$ODBCHOME/etc/odbcinst.ini  (例の環境では/usr/local/etc/odbcinst.ini)にあります。 以下に設定例を示します。


   ex.  odbcinst.ini のEmpress ODBC ドライバの設定例

    #---------
    [Empress]
    Description     = Empress ODBC Driver
    Driver          = /home/empress/Empress/v8.62/installation/shlib/libempodbccl.so
    Setup           = /home/empress/Empress/v8.62/installation/shlib/libempodbccl.so
    FileUsage       = 1
    #---------

'[ ]' で囲まれた中にドライバ名として "Empress"を指定します。 それ以降にEmpressドライバの情報を記述します。 Description は説明(コメント)、 DriverにはEmpress ODBC ドライバのシェアードライブラリのパスを指定します。 ($EMPRESSPATH/shlib/libempodbccl.so) SetupもDriverと同じシェアードライブラリファイルのパスを指定します。 FileUsageには "1" を設定します。

[ 参考 ]

"odbcinst.ini"のパラメータについてのunixODBCのマニュアルの記述を要約すると "setup" は、新たにDSNを追加するためのODBCConfig(GUIツール)の「追加」ボタンを 押したときに使用されるライブラリでODBCConfig(GUIツール)を使用していない環境 では重要ではありません。最も重要なパラメータは "driver"で、 SQLConnectまたは SQLDriverConnectがコールされた時にドライバマネージャは動的に 指定されたライブラリをロードします。その指定が間違っている場合は動作しません。 "fileusage"は、odbcinst プログラムによって追加されます。テキストエディタを使って 編集した場合は、自分自身で追加する必要があります。

3.2 odbc.ini ファイルの設定

odbc.iniファイルは、ODBCデータソース(DNS)を定義します。 このファイルは、デフォルトでは$ODBCHOME/etc/odbc.ini  (例の環境では/usr/local/etc/odbc.ini)にあり、 unixODBC および Empress ODBCドライバの両方が参照します。 以下に設定例を示します。


   ex. odbc.ini のODBC データソースの設定例

    #---------
    [testdb]
    Description = Test to Empress
    Driver = Empress
    Database = /home/empress/testdb
    Server = 192.168.3.183
    Port = 6322
    #---------

'[ ]' で囲まれた中にデータソース名を記述し、それ以降にデータソースの定義を記述します。 これらのパラメータは、Description, Driver を除いて Empress ODBC ドライバが参照する パラメータになります。 Description は、説明(コメント)です。Database はアクセスするデータベースのパス、 Server は、ODBC サーバーのアドレスまたはホスト名、Port はODBCサーバーのポート番号を 指定します。 Driver は unixODBC が使用し、値はodbcinst.ini で設定したEmpressドライバの名前と 関連付けられます。

3.3 環境変数の設定

unixODBC が必要な環境変数として、ODBCHOME があります。 設定する値はunixODBC がインストールされた ディレクトリを設定します。

   ex. 環境変数 ODBCHOMEの設定例

     例では unixODBC は /usr/local 以下にインストールされています。

    % export ODBCHOME=/usr/local

Empress ODBC ドライバが必要な環境変数としてMSODBCINIFILE があります。 設定する値は、odbc.iniファイルへのパスを指定します。

   ex. 環境変数 MSODBCINIFILE の設定例

     例では odbc.iniファイルは /usr/local/etc/odbc.ini にあります。

    % export MSODBCINIFILE=/usr/local/etc/odbc.ini

[ 参考 ]

(1) 例では、Empress が使用可能なユーザーでの設定例になります。 そのため、既にEmpressを使用するために必要な環境変数 EMPRESSPATHLD_LIBRRY_PATH (Empressシェアードライブラリへのパス) が設定済みということが前提となっています。 Empressを使用する環境を設定していないユーザーでのODBCの設定の場合は、 EMPRESSPATH と LD_LIBRRY_PATHを設定してください。

   ex. 環境変数 EMPRESSPATH と LD_LIBRRY_PATH の設定例

     例では Empress は /home/empress/Empress/v8.62/installation 
     以下にインストールされているとします。

    % export EMPRESSPATH=/home/empress/Empress/v8.62/installation
    % export LD_LIBRRY_PATH=$EMPRESSPATH/shlib

(2) unixODBC のインストール時にprefixを指定した場合、シェアードライブラリの 環境変数 LD_LIBRARY_PATHの指定が必要になります。

4. サンプルプログラムでのODBCアクセステスト

テストとしてサンプルプログラムを実行して、Empressのデータベースにアクセスしてみます。

4.1 Empress ODBC サーバーの確認

サンプルプログラムを実行する前にEmpress ODBC サーバーが動作しているかを確認します。 Empress サーバー管理者でログインし、以下のコマンドで確認します。 (Empress サーバーの詳細は「コネクティビティ(ODBC)サーバーの利用について」を参照してください。) また、サンプルプログラムからODBCサーバーにアクセスするためのユーザーと パスワードをEmpressサーバーのパスワードファイルに設定されていない場合は、 こちらも合わせて設定してください。

     ex. Empress サーバーの確認

        # empsvadm empodbcsv info
          ログイン:empress
          パスワード:XXXXXXX

          サーバ名:      empodbcsv

          サーバタイプ:  odbc

          スプール PID : 359
          管理ポート:    6321
          サービスポート:6322

          #サービスサーバ最少/最大/起動中:  3/257/3

          サーバ ID         PID   #クライアント
           ---------   ----------  -------------
            4                363        0
            3                362        0
            2                361        0
            1                360        1
                                    -------------
          総クライアント:              1

          クライアント ID        PID     開始          名前
          ---------------   ----------  --------  --------------------
                  1000001*         358  18:14:12  empress(empress@localhost)
         #

        ex. ユーザーの登録

        # emppassword empodbcsv add empress

       新 Empress パスワード:XXXXXXX
       新 Empress パスワード再入力:XXXXXXX
       Done.
        #

※ アクセスするEmpress ODBC サーバーは、Perl ODBC環境をインストールしたマシン以外でも構いません。

4.2 サンプルデータベースの作成

Empress ODBC サーバーが起動されているマシン上にサンプルで使用するデータベースを作成します。 単純なテーブルを作成し、データを挿入します。

   ex. サンプルデータベースの作成

   % empmkdb testdb
   % empsql testdb
      EMPRESS V8.62 
     (c) Copyright Empress Software Inc. 1983, 2003
  1* create t1 (no, name nlschar);
  2* display t1 all;
  ***  Table: t1  ***

    Attributes:
      no                                integer
      name                              nlscharacter(25,1,0)

    Creator:     empress
    Lock Level:  RECORD

    Table #:     15
    Records:     0
    Record size: 28
  3* insert into t1 values (1, 'あああ');
  4* insert into t1 values (2, 'いいい');
  5* select * from t1;
      no  name

       1  あああ
       2  いいい
  6* exit
  %

4.3 サンプルプログラム

以下は、Perl DBI のサンプルプログラムです。

   ex. サンプルプログラム -- odbc.pl 

       #!/usr/bin/perl -w
       # odbc.pl

       use strict;
       use DBI;

       my ($dbh, $sth, @row);

      $dbh = DBI->connect( 'dbi:ODBC:testdb',
                        'empress',
                        'emp123', {
                PrintError => 0,
                RaiseError => 1 } );

       $sth = $dbh->prepare( "select * from t1");

       $sth->execute();

       while ( @row = $sth->fetchrow_array()) {
              print "Row: @row\n";
       }

       $sth->finish();

       $dbh->disconnect();

       exit;

このサンプルで確認が必要な箇所は、DBI->connect のパラメータ(DNS、ユーザー、パスワード) になります。 DNS の'dbi:ODBC:'までは DBD ODBC インターフェイスを使用することを意味しますので固定です。 最後の"testdb"は odbc.ini ファイルに設定したデータソース名になります。 ユーザーとパスワードは、Empress ODBC サーバーのパスワードファイルに登録した ユーザー・パスワードを指定します。

4.4 サンプルプログラムの実行

サンプルプログラム(odbc.pl) を実行します。

   ex. サンプルプログラムの実行
 
     ファイルに実行権がない場合、付加してください。
     %chmod 755 ./odbc.pl
     % ./odbc.pl
     Row: 1 ああああ
     Row: 2 いいいい
     %

上記のように表示されれば、Empress ODBC サーバーに接続され、 サンプルデータベースからのデータ取得ができています。

以下に無理にエラーにさせた例を示しますので、エラーが表示した場合の参考にしてください。

  環境変数 MSODBCINIFILE が設定されていない場合

    DBI connect('testdb','empress',...) failed: [unixODBC][Empress Software][ODBC LI
    B/DLL] データソース名が見つからず、デフォルトのドライバーが指定されていない (SQL
    -IM002)(DBD: db_login/SQLConnect err=-1) at ./odbc.pl line 9

  また、MSODBCINIFILEが設定されていてパスが間違っている場合は
  「ODBC.INI ファイルがみつかりません。」というエラーになります。


  ODBCサーバーが立ち上がっていないか、あるいはodbc.ini の Server の値が間違っている場合

    DBI connect('testdb','empress',...) failed: [unixODBC][Empress Software][ODBC LI
    B/DLL] サーバ 'empodbcsv' の接続がオープンされません。;オープン反応タイムアウト
    (SQL-08001)(DBD: db_login/SQLConnect err=-1) at ./odbc.pl line 9


  odbc.ini の Database の値で指定されているデータベースが存在しない場合、あるいは間違っている場合

    DBI connect('testdb','empress',...) failed: [unixODBC][Empress Software][ODBC LI
    B/DLL] 無効なデータベースです。 (SQL-3D000)(DBD: dbd_db_login/SQLSetConnectOptio
    n err=-1) at ./odbc.pl line 9

  プログラム内で指定されたデータソース名がodbc.ini に存在しない場合
 
    DBI connect('testdb','empress',...) failed: [unixODBC][Driver Manager]Data sourc
    e name not found, and no default driver specified (SQL-IM002)(DBD: db_login/SQLC
    onnect err=-1) at ./odbc.pl line 9


Copyright Empress Japan. 2004