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

