mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
7202c21b34
A bugfix of HandlerSocket is not applied to mariadb yet
126 lines
6 KiB
Text
126 lines
6 KiB
Text
|
|
-----------------------------------------------------------------
|
|
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オブジェクトは破棄するべきです。正の値の場合は
|
|
接続は維持されているため、そのオブジェクトはそれ以後も再利用でき
|
|
ます。
|
|
|