SQL::Evalモジュール(日本語チョー訳)

by Hippo2000(2001/5/15)

SQL::Evalモジュールなのです。SQL::Statementから利用されます。

原本の著作権はJochen Wiedmannさんがお持ちです。Jochen Wiedmann さんにはメールで了解をいただきました。

なお内容等が間違っていたら修正します。ご連絡ください。


目次


名前

SQL::Eval - SQL::Statementのための派生評価の基本オブジェクト


概要

    require SQL::Statement;
    require SQL::Eval;
    # SQL statementの作成; SQL::Statementの
    # 具象サブクラスを使う
    my $stmt = MyStatement->new("SELECT * FROM foo, bar",
                    SQL::Parser->new('Ansi'));
    # open_tablesを呼び出すことによりevalオブジェクトを取得する; これは
    # MyStatement::open_tableを呼び出します。
    my $eval = $stmt->open_tables($data);
    # パラメータ0を'Van Gogh'に設定
    $eval->param(0, 'Van Gogh');
    # パラメータ 2の取得
    my $param = $eval->param(2);
    # 'foo'テーブルを参照するSQL::Eval::Tableオブジェクトを取得
    my $fooTable = $eval->table('foo');

説明

このモジュールはSQL::Statementオブジェクトを評価する具象サブクラス を派生させるために使われる2つのクラスを実装しています。 SQL::EvalオブジェクトはSQL問い合わせ実行のための抽象状態エンジン として考えることができます。SQL::Eval::Tableオブジェクトは テーブルを*非常に*抽象化したものと考えることができます。 これは行の取り出しや格納、カラム名や番号の取り出しなどのための メソッドを実装しています。具象サブクラスの実装の例としてtest.pl スクリプトをご覧ください。

読んでいる間、これらが抽象クラスであることを忘れないでください、 以下で説明しているメソッドの少なくともいくつかは実装しなければいけません。 さらにはSQL::EvalやSQL::Eval::Tableから派生させる必要もありません、 メソッド・インターフェースを実装することだけが必要なのです。

エラーの場合には、すべてのメソッドはPerl例外を投げます。

SQL::Evalのメソッド・インターフェース

new
コンストラクタ;このようにお使いください:
    $eval = SQL::Eval->new(\%attr);

ハッシュ・リファレンス ref \%attr を SQL::Evalクラス(もしくはサブクラス)にblessします。

param
以下のようなSQL問い合わせでの、パラメータの取得または設定のために使われます。
    INSERT INTO foo VALUES (?, ?);

例:

    $eval->param(0, $val);        # パラメータ0の設定
    $eval->param(0);              # パラメータ0の取得

params
同様に入力パラメータの完全な配列の取得または設定に使われます。 例:
    $eval->params($params);       # 配列の設定
    $eval->params();              # 配列の取得

table
tableオブエジェクトを返すあるいは設定します。例えば:
    $eval->table('foo', $fooTable);  # 'foo' テーブル・オブジェクトの設定
    $eval->table('foo');             # 'foo'テーブル・オブジェクトを返す

column
与えられた名前でカラムの値を返します; 例えば:
    $col = $eval->column('foo', 'id');  # 'foo'テーブルの現在の
                                        # 行での'id'カラムを
                                        # 返します

これは以下のものと同じで単なる省略形です

    $col = $eval->table('foo')->column('id');



SQL::Eval::Tableのメソッド・インターフェース

new
コンストラクタ;以下のように使います:
    $eval = SQL::Eval::Table->new(\%attr);

ハッシュ・リファレンス \%attr をSQL::Eval::Table クラス(またはサブクラス)にblessします。

row
配列リファレンスとして現在の行を取得するために使われます。fetch_rowメソッドで現在の行を取得するのとあわせてください!事実、このメソッドは$table->fetchrow()が成功した後でのみ適切です。例:
    $row = $table->row();

column
与えられた名前で現在行でのカラムを取得します。このメソッドは$table->fetchrow()が成功した後でのみ適切です。例:
    $col = $table->column($colName);

column_num
与えられたカラム名の番号を返します。カラム番号は0から始まります。カラム名が定義されていなければundefを返します。そのため正しいカラム名かどうかを確かめれるためにも使うことができます。例:
    $colNum = $table->column_num($colNum);

column_names
カラム名の配列リファレンスを返します。

上記のメソッドはSQL::Eval::Tableで実装されています。以下のメソッドはそうではありません。そこで具象サブクラスで*実装しなければなりません*。例はtest.plをご覧ください。

fetch_row
テーブルから次の行を取り出します。最後の行が既に取り出されていればundefを返します。引数$dataは具象サブクラスをプライベートに使用するためのものです。例:
    $row = $table->fetch_row($data);

次にfetch_rowを呼び出すまでは同じ行をもう一度取り出すために、以下のようにすることができることに注意してください。

    $row = $table->row();
push_row
同様に行を格納します。例:
    $table->push_row($data, $row);
push_names
CREATE TABLE ステートメントにより、新しいテーブルのカラム名を設定するために使われます。名前の配列リファレンスを受け取ります。例:
    $table->push_names($data, $names);
seek
ファイルハンドルのseekメソッドと同様; 出力される次の行の番号を設定するために使われます。例:
    $table->seek($data, $whence, $rowNum);

実際には現在の実装は($data, 0,0) (先頭行) そして seek($data, 2,0) (最終行、ファイルの終わり). だけを使っています。

 
truncate
テーブルの現在行の後ろを切り捨てます。例:
    $table->truncate($data);

内部実装

現在の実装はとてもシンプルです。SQL::Evalオブジェクトは2つの属性を持つハッシュ・リファレンスです。params属性はパラメータのハッシュ・リファレンスです。tables属性はテーブル名(キー)とtableオブジェクト(値)のハッシュ・リファレンスです。

SQL::Eval::Table はハッシュ・リファレンスとして実装されています。使われる属性はrow(現在行の配列リファレンス)、col_nums(カラム名をキーとしてカラム番号を値とするハッシュ・リファレンス)そしてcol_names(カラム番号をインデックスであるカラム名の配列リファレンス)です。


マルチスレッド化

すべてのメソッドはインスタンス・ローカルなデータでのみ機能します、このため、スレッド間でハンドルを共有したり、シリアライズされた使用を許可しなくても、このモジュールはリエントラントでスレッド・セーフです。

 


作者と著作権(AUTHOR AND COPYRIGHT)

(原文のまま)

This module is Copyright (C) 1998 by

    Jochen Wiedmann
    Am Eisteich 9
    72555 Metzingen
    Germany

    Email: joe@ispsoft.de
    Phone: +49 7123 14887

All rights reserved.

You may distribute this module under the terms of either the GNU General Public License or the Artistic License, as specified in the Perl README file.




参考資料

SQL::Statement(3)


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。