----------------------------------------------------------------- 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オブジェクトは破棄するべきです。正の値の場合は 接続は維持されているため、そのオブジェクトはそれ以後も再利用でき ます。