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例外を投げます。
$eval = SQL::Eval->new(\%attr);
ハッシュ・リファレンス ref \%attr を SQL::Evalクラス(もしくはサブクラス)にblessします。
INSERT INTO foo VALUES (?, ?);
例:
$eval->param(0, $val); # パラメータ0の設定
$eval->param(0); # パラメータ0の取得
$eval->params($params); # 配列の設定
$eval->params(); # 配列の取得
$eval->table('foo', $fooTable); # 'foo' テーブル・オブジェクトの設定
$eval->table('foo'); # 'foo'テーブル・オブジェクトを返す
$col = $eval->column('foo', 'id'); # 'foo'テーブルの現在の
# 行での'id'カラムを
# 返します
これは以下のものと同じで単なる省略形です
$col = $eval->table('foo')->column('id');
$eval = SQL::Eval::Table->new(\%attr);
ハッシュ・リファレンス \%attr をSQL::Eval::Table クラス(またはサブクラス)にblessします。
$table->fetchrow()が成功した後でのみ適切です。例:$row = $table->row();
$table->fetchrow()が成功した後でのみ適切です。例:$col = $table->column($colName);
$colNum = $table->column_num($colNum);
上記のメソッドはSQL::Eval::Tableで実装されています。以下のメソッドはそうではありません。そこで具象サブクラスで*実装しなければなりません*。例はtest.plをご覧ください。
$row = $table->fetch_row($data);
次にfetch_rowを呼び出すまでは同じ行をもう一度取り出すために、以下のようにすることができることに注意してください。
$row = $table->row();
$table->push_row($data, $row);
$table->push_names($data, $names);
$table->seek($data, $whence, $rowNum);
実際には現在の実装は($data, 0,0)
(先頭行) そして seek($data, 2,0) (最終行、ファイルの終わり).
だけを使っています。
$table->truncate($data);
現在の実装はとてもシンプルです。SQL::Evalオブジェクトは2つの属性を持つハッシュ・リファレンスです。params属性はパラメータのハッシュ・リファレンスです。tables属性はテーブル名(キー)とtableオブジェクト(値)のハッシュ・リファレンスです。
SQL::Eval::Table はハッシュ・リファレンスとして実装されています。使われる属性はrow(現在行の配列リファレンス)、col_nums(カラム名をキーとしてカラム番号を値とするハッシュ・リファレンス)そしてcol_names(カラム番号をインデックスであるカラム名の配列リファレンス)です。
すべてのメソッドはインスタンス・ローカルなデータでのみ機能します、このため、スレッド間でハンドルを共有したり、シリアライズされた使用を許可しなくても、このモジュールはリエントラントでスレッド・セーフです。
(原文のまま)
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.
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。