-----------------------------------------------------------------
handlersocketプラグインへの接続を開くには、Net::HandlerSocketオブ
ジェクトを作成します。
use Net::HandlerSocket;
my $args = { host => 'localhost', port => 9998 };
my $hs = new Net::HandlerSocket($args);
-----------------------------------------------------------------
検索などの命令を実行する前に、処理対象となる索引を開く必要があり
ます。
my $err = $hs->open_index(3 , 'database1', 'table1', 'PRIMARY',
'f1,f2');
die $hs->get_error() if $res->[0 ] != 0 ;
最初の引数は開く索引に付ける番号です。付けた番号は同一の
Net::HandlerSocketオブジェクトについてのみ有効です。第4 引数は開く
索引の名前で、「PRIMARY」が指定され場合はプライマリキーが開かれま
す。第5 引数は「,」で区切られた列名のリストです。
-----------------------------------------------------------------
テーブルから索引を使って行を取得するには、execute_singleメソッド
を呼びます。
my $res = $hs->execute_single(3 , '=', [ 'foo' ], 1 , 0 );
die $hs->get_error() if $res->[0 ] != 0 ;
shift(@$res);
最初の引数は索引の番号で、同じNet::HandlerSocketオブジェクトへ
open_indexで付けたものでなければなりません。第2 引数には操作を指定
します。現在のバージョンでは、「=」、「>=」、「<=」、「>」、「<」
の操作が利用可能です。第3 引数は配列への参照で、これは探すべき行の
キー値を指定します。配列の長さは索引のキーの個数と同じか少ない数
でなければなりません。第4 引数と第5 引数はそれぞれ、取得する最大行
数、取得前に読み飛ばす行数を指定します。取得される列は対応する
open_index呼び出しの第5 引数で指定されたものになります。
execute_singleメソッドは常に配列への参照を返します。最初の要素は
エラーコードで、これが0 ならば成功を表します。残りの要素は列の値で
す。もし取得されたデータが複数行の場合は、それが一つの配列へ連結
された形で格納されています。例えば、5 行3 列のデータの場合、次のよ
うなコードによってその内容を取得できます。
die $hs->get_error() if $res->[0 ] != 0 ;
shift(@$res);
for (my $row = 0 ; $row < 5 ; ++$row) {
for (my $col = 0 ; $col < 3 ; ++$col) {
my $value = $res->[$row * 5 + $col];
# ...
}
}
-----------------------------------------------------------------
行を更新または削除するには、更に多くの引数を指定して
execute_singleメソッドを呼び出します。書き込み処理をするには、
対象のNet::HandlerSocketオブジェクトは更新用handlersocketワーカ(既
定ではポート9999 )へ接続されたものでなくてはなりません。
(安全のため、ポート9998 は参照処理だけを受け付け、ポート9999 は更新
処理も受け付けるようになっています。ポート9999 は参照処理も受け付
けますが、レコードロック等の影響で遅くなります。ポート番号は
mysqldの「handlersocket_port」と「handlersocket_port_wr」の設定項
目で変更できます。)
my $args = { host => 'localhost', port => 9999 };
my $hs = new Net::HandlerSocket($args);
my $res = $hs->execute_single(3 , '=', [ 'bar' ], 1 , 0 , 'U',
[ 'fubar', 'hoge' ]);
die $hs->get_error() if $res->[0 ] != 0 ;
my $num_updated_rows = $res->[1 ];
my $res = $hs->execute_single(3 , '=', [ 'baz' ], 1 , 0 , 'D');
die $hs->get_error() if $res->[0 ] != 0 ;
my $num_deleted_rows = $res->[1 ];
execute_singleの第6 引数は変更処理の種類を指定します。現在のバー
ジョンでは「U」と「D」が利用可能です。「U」については、第7 引数で
新しい値を指定します。更新される列は、対応するopen_index呼び出し
の第5 引数で指定されたものになります。「D」については第7 引数は省
略できます。
-----------------------------------------------------------------
execute_singleメソッドは列の挿入にも使用できます。
my $res = $hs->execute_single(3 , '+', [ 'foo', 'bar', 'baz' ]);
die $hs->get_error() if $res->[0 ] != 0 ;
第3 引数は、対応するopen_index呼び出しの第5 引数の列リストと同じだ
けの長さの配列への参照でなければなりません。open_index呼び出しの
第5 引数に指定されていない列については、その列の既定値がセットされ
ます。
-----------------------------------------------------------------
execute_multiメソッドを使えば、複数のリクエストを一つの呼び出しで
実行することができます。これはリクエストを個別に実行するより高速
です。
my $rarr = $hs->execute_multi([
[ 0 , '>=', [ 'foo' ], 5 , 0 ],
[ 2 , '=', [ 'bar' ], 1 , 0 ],
[ 4 , '<', [ 'baz' ], 10 , 5 ],
]);
for my $res (@$rarr) {
die $hs->get_error() if $res->[0 ] != 0 ;
shift(@$res);
# ...
}
-----------------------------------------------------------------
もしhandlersocketが接続を認証するように設定されている
(handlersocket_plain_secret又はhandlersocket_plain_secret_wrがセッ
トされている)ならば、クライアントは他のメソッド呼び出しの前にauth
メソッドを呼び出す必要があります。
my $res = $hs->auth('password');
die $hs->get_error() if $res->[0 ] != 0 ;
-----------------------------------------------------------------
エラーが起こると返値の配列参照の最初の要素が0 以外になります。負の
数の場合はI/Oエラーが起こったことを示し、その場合はその
Net::HandlerSocketオブジェクトは破棄するべきです。正の値の場合は
接続は維持されているため、そのオブジェクトはそれ以後も再利用でき
ます。
Messung V0.5 in Prozent C=88 H=95 G=91
¤ Dauer der Verarbeitung: 0.3 Sekunden
¤
*© Formatika GbR, Deutschland