vincentchu-handlersocket 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. data/ext/HandlerSocket-Plugin-for-MySQL/AUTHORS +22 -0
  2. data/ext/HandlerSocket-Plugin-for-MySQL/COPYING +30 -0
  3. data/ext/HandlerSocket-Plugin-for-MySQL/ChangeLog +12 -0
  4. data/ext/HandlerSocket-Plugin-for-MySQL/Makefile.am +87 -0
  5. data/ext/HandlerSocket-Plugin-for-MySQL/README +78 -0
  6. data/ext/HandlerSocket-Plugin-for-MySQL/autogen.sh +117 -0
  7. data/ext/HandlerSocket-Plugin-for-MySQL/client/Makefile.am +24 -0
  8. data/ext/HandlerSocket-Plugin-for-MySQL/client/hsclient.cpp +88 -0
  9. data/ext/HandlerSocket-Plugin-for-MySQL/client/hslongrun.cpp +1041 -0
  10. data/ext/HandlerSocket-Plugin-for-MySQL/client/hspool_test.pl +224 -0
  11. data/ext/HandlerSocket-Plugin-for-MySQL/client/hstest.cpp +1532 -0
  12. data/ext/HandlerSocket-Plugin-for-MySQL/client/hstest.pl +228 -0
  13. data/ext/HandlerSocket-Plugin-for-MySQL/client/hstest_hs.sh +4 -0
  14. data/ext/HandlerSocket-Plugin-for-MySQL/client/hstest_hs_more50.sh +4 -0
  15. data/ext/HandlerSocket-Plugin-for-MySQL/client/hstest_md.sh +7 -0
  16. data/ext/HandlerSocket-Plugin-for-MySQL/client/hstest_my.sh +3 -0
  17. data/ext/HandlerSocket-Plugin-for-MySQL/client/hstest_my_more50.sh +3 -0
  18. data/ext/HandlerSocket-Plugin-for-MySQL/configure.ac +144 -0
  19. data/ext/HandlerSocket-Plugin-for-MySQL/docs-en/about-handlersocket.en.txt +72 -0
  20. data/ext/HandlerSocket-Plugin-for-MySQL/docs-en/configuration-options.en.txt +99 -0
  21. data/ext/HandlerSocket-Plugin-for-MySQL/docs-en/installation.en.txt +92 -0
  22. data/ext/HandlerSocket-Plugin-for-MySQL/docs-en/perl-client.en.txt +135 -0
  23. data/ext/HandlerSocket-Plugin-for-MySQL/docs-en/protocol.en.txt +205 -0
  24. data/ext/HandlerSocket-Plugin-for-MySQL/docs-ja/about-handlersocket.ja.txt +51 -0
  25. data/ext/HandlerSocket-Plugin-for-MySQL/docs-ja/installation.ja.txt +88 -0
  26. data/ext/HandlerSocket-Plugin-for-MySQL/docs-ja/perl-client.ja.txt +127 -0
  27. data/ext/HandlerSocket-Plugin-for-MySQL/docs-ja/protocol.ja.txt +180 -0
  28. data/ext/HandlerSocket-Plugin-for-MySQL/handlersocket/COPYRIGHT.txt +27 -0
  29. data/ext/HandlerSocket-Plugin-for-MySQL/handlersocket/Makefile.am +10 -0
  30. data/ext/HandlerSocket-Plugin-for-MySQL/handlersocket/Makefile.plain.template +31 -0
  31. data/ext/HandlerSocket-Plugin-for-MySQL/handlersocket/database.cpp +1190 -0
  32. data/ext/HandlerSocket-Plugin-for-MySQL/handlersocket/database.hpp +142 -0
  33. data/ext/HandlerSocket-Plugin-for-MySQL/handlersocket/handlersocket.cpp +222 -0
  34. data/ext/HandlerSocket-Plugin-for-MySQL/handlersocket/handlersocket.spec.template +29 -0
  35. data/ext/HandlerSocket-Plugin-for-MySQL/handlersocket/hstcpsvr.cpp +149 -0
  36. data/ext/HandlerSocket-Plugin-for-MySQL/handlersocket/hstcpsvr.hpp +58 -0
  37. data/ext/HandlerSocket-Plugin-for-MySQL/handlersocket/hstcpsvr_worker.cpp +951 -0
  38. data/ext/HandlerSocket-Plugin-for-MySQL/handlersocket/hstcpsvr_worker.hpp +35 -0
  39. data/ext/HandlerSocket-Plugin-for-MySQL/handlersocket/mysql_incl.hpp +50 -0
  40. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/COPYRIGHT.txt +27 -0
  41. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/Makefile.am +12 -0
  42. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/Makefile.plain +27 -0
  43. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/allocator.hpp +64 -0
  44. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/auto_addrinfo.hpp +49 -0
  45. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/auto_file.hpp +64 -0
  46. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/auto_ptrcontainer.hpp +67 -0
  47. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/config.cpp +67 -0
  48. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/config.hpp +32 -0
  49. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/escape.cpp +127 -0
  50. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/escape.hpp +66 -0
  51. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/fatal.cpp +36 -0
  52. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/fatal.hpp +22 -0
  53. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/hstcpcli.cpp +441 -0
  54. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/hstcpcli.hpp +62 -0
  55. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/libhsclient.spec.template +39 -0
  56. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/mutex.hpp +51 -0
  57. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/socket.cpp +186 -0
  58. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/socket.hpp +51 -0
  59. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/string_buffer.hpp +118 -0
  60. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/string_ref.hpp +63 -0
  61. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/string_util.cpp +182 -0
  62. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/string_util.hpp +53 -0
  63. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/thread.hpp +84 -0
  64. data/ext/HandlerSocket-Plugin-for-MySQL/libhsclient/util.hpp +25 -0
  65. data/ext/HandlerSocket-Plugin-for-MySQL/misc/microbench-hs.log +130 -0
  66. data/ext/HandlerSocket-Plugin-for-MySQL/misc/microbench-my.log +125 -0
  67. data/ext/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket/COPYRIGHT.txt +27 -0
  68. data/ext/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket/Changes +6 -0
  69. data/ext/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket/HandlerSocket.xs +632 -0
  70. data/ext/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket/MANIFEST +8 -0
  71. data/ext/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket/Makefile.PL +18 -0
  72. data/ext/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket/Makefile.PL.installed +20 -0
  73. data/ext/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket/README +30 -0
  74. data/ext/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket/lib/Net/HandlerSocket.pm +68 -0
  75. data/ext/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket/lib/Net/HandlerSocket/Pool.pm +362 -0
  76. data/ext/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket/perl-Net-HandlerSocket.spec.template +127 -0
  77. data/ext/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket/ppport.h +6375 -0
  78. data/ext/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket/t/Net-HandlerSocket.t +15 -0
  79. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/Makefile +79 -0
  80. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/common/binary_my.cnf +4 -0
  81. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/common/compat.sh +29 -0
  82. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/common/hstest.pm +66 -0
  83. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/Makefile +4 -0
  84. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/run.sh +27 -0
  85. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test01.expected +100 -0
  86. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test01.pl +38 -0
  87. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test02.expected +100 -0
  88. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test02.pl +49 -0
  89. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test03.expected +771 -0
  90. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test03.pl +61 -0
  91. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test04.expected +0 -0
  92. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test04.pl +63 -0
  93. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test05.expected +771 -0
  94. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test05.pl +59 -0
  95. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test06.expected +644 -0
  96. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test06.pl +90 -0
  97. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test07.expected +304 -0
  98. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test07.pl +98 -0
  99. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test08.expected +2 -0
  100. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test08.pl +48 -0
  101. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test09.expected +12 -0
  102. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test09.pl +67 -0
  103. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test10.expected +771 -0
  104. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test10.pl +93 -0
  105. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test11.expected +37 -0
  106. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test11.pl +112 -0
  107. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test12.expected +273 -0
  108. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test12.pl +134 -0
  109. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test13.expected +92 -0
  110. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test13.pl +92 -0
  111. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test14.expected +144 -0
  112. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test14.pl +80 -0
  113. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test15.expected +764 -0
  114. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test15.pl +114 -0
  115. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test16.expected +66 -0
  116. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test16.pl +88 -0
  117. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test17.expected +0 -0
  118. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test17.pl +125 -0
  119. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test18.expected +22 -0
  120. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test18.pl +63 -0
  121. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test19.expected +14894 -0
  122. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test19.pl +190 -0
  123. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test20.expected +2 -0
  124. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test20.pl +33 -0
  125. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test21.expected +11 -0
  126. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test21.pl +58 -0
  127. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test22.expected +9 -0
  128. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test22.pl +61 -0
  129. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test23.expected +101 -0
  130. data/ext/HandlerSocket-Plugin-for-MySQL/regtest/test_01_lib/test23.pl +53 -0
  131. data/ext/winebarrel-ruby-handlersocket-c19841e47ea2/README +33 -0
  132. data/ext/winebarrel-ruby-handlersocket-c19841e47ea2/extconf.rb +27 -0
  133. data/ext/winebarrel-ruby-handlersocket-c19841e47ea2/handlersocket.cpp +437 -0
  134. data/ext/winebarrel-ruby-handlersocket-c19841e47ea2/handlersocket.h +32 -0
  135. metadata +200 -0
@@ -0,0 +1,51 @@
1
+
2
+
3
+ -----------------------------------------------------------------
4
+ ソースコードの利用にあたっての免責事項
5
+
6
+ 本ソフトウェアの開発者および株式会社ディー・エヌ・エーは、本フト
7
+ ウェアの不稼動、稼動不良を含む法律上の瑕疵担保責任、その他保証責
8
+ 任を負わないものとします。また、本ソフトウエアの開発者および株式
9
+ 会社ディー・エヌ・エーは、本ソフトウェアの商品性、またはお客様の
10
+ 特定の目的に対する適合性について、いかなる保証も負わないものとし
11
+ ます。
12
+
13
+ -----------------------------------------------------------------
14
+ handlersocket pluginについて
15
+
16
+ mysqlサーバに常駐し、innodb等のストレージエンジンへの直接のアクセ
17
+ スを提供するプラグインです。handlersocketプラグインは自前のリス
18
+ ナーを持ち、専用のクライアントライブラリ(libhsclient)を使ってそれ
19
+ にアクセスします。
20
+
21
+ mysqlの標準クライアントライブラリ(libmysql)を使ったアクセスと比べ
22
+ て、以下のような利点があります。
23
+ ・接続あたりに消費するリソースが少ないため、同時接続数が事実上無
24
+ 制限。したがって接続数を気にせず持続接続を使えます。
25
+ ・高速(単純な参照クエリで3倍〜10倍程度)。
26
+ ・通信プロトコルがコンパクト。libmysqlを使うとデータ転送時にレ
27
+ コード名などが付随するために通信内容が冗長ですが、libhsclientで
28
+ はデータのみが転送されるため、帯域消費が少なくなります。場合に
29
+ よっては10倍以上libmysqlのほうが冗長になります。
30
+
31
+ 現在のバージョンでは以下のような処理をサポートしています。
32
+ ・指定された索引について、指定された値と完全一致するようなレコー
33
+ ドを取得。(SELECT ??? FROM tbl WHERE k1 = v1 AND k2 = v2...)。
34
+ 索引を使わない検索はサポートしていません。
35
+ ・指定された索引について、指定された値の位置の前後のレコードを取
36
+ 得。(SELECT ??? FROM tbl WHERE k1 >= v1 LIMIT 100)
37
+ ・前述のような手段で取得したレコードに対するUPDATEとDELETE
38
+ ・レコードのINSERT
39
+
40
+ 以下のような言語をサポートします。
41
+ ・C++。libhsclientをリンクします。
42
+ ・Perl。Net::HandlerSocketをuseします。
43
+
44
+ 現在のバージョンではGNU/Linuxでのみ動作します。
45
+
46
+ -----------------------------------------------------------------
47
+ 既知の問題
48
+
49
+ ・killでhandlersocketスレッドを殺すと、スレッド数が減ったまま回復
50
+ しません。
51
+
@@ -0,0 +1,88 @@
1
+
2
+ -----------------------------------------------------------------
3
+ HandlerSocketプラグインのビルド方法(RPMを使わない方法)
4
+
5
+ 以下のようにしてconfigureを実行します。
6
+
7
+ $ ./autogen.sh
8
+ $ ./configure --with-mysql-source=/work/mysql-5.1.50 --with-mysql-bindir=/work/mysql-5.1.50-linux-x86_64-glibc23/bin --with-mysql-plugindir=/work/mysql-5.1.50-linux-x86_64-glibc23/lib/plugin
9
+
10
+ ここで--with-mysql-sourceにはMySQLのソースコードのトップディレク
11
+ トリを指定します(そこにVERSIONファイルかconfigure.inファイルがなく
12
+ てはなりません)。--with-mysql-bindirにはインストール済みのMySQL
13
+ のmysql_configコマンドが有るディレクトリを指定します。
14
+ その後以下のようにビルド・インストールします。
15
+
16
+ $ make
17
+ $ sudo make install
18
+
19
+ -----------------------------------------------------------------
20
+ クライアントライブラリのビルド方法(RPMを使わない方法)
21
+
22
+ クライアントライブラリをビルドする際には、MySQLのソースコードは
23
+ 必要ありません。またMySQLがインストールされている必要もありません。
24
+
25
+ $ ./autogen.sh
26
+ $ ./configure --disable-handlersocket-server
27
+ $ make
28
+ $ sudo make install
29
+ $ cd perl-Net-HandlerSocket
30
+ $ perl Makefile.PL
31
+ $ make
32
+ $ sudo make install
33
+
34
+ -----------------------------------------------------------------
35
+ ビルド方法(RPM)
36
+
37
+ 以下のように実行すれば、rpmパッケージがビルド&インストールされま
38
+ す。
39
+
40
+ (MySQLサーバ側、HandlerSocketプラグインをインストールする)
41
+ $ ./autogen.sh
42
+ $ ./configure --with-mysql-source=/work/mysql-5.1.50 --with-mysql-bindir=/work/mysql-5.1.50-linux-x86_64-glibc23/bin --with-mysql-plugindir=/work/mysql-5.1.50-linux-x86_64-glibc23/lib/plugin
43
+ $ make rpm_cli
44
+ $ sudo rpm -U dist/RPMS/*/libhsclient*.rpm
45
+ $ make rpm_c
46
+ $ sudo rpm -U dist/RPMS/*/handlersocket*.rpm
47
+
48
+ (クライアント側、クライアントライブラリをインストールする)
49
+ $ ./autogen.sh
50
+ $ ./configure --disable-handlersocket-server
51
+ $ make rpm_cli
52
+ $ sudo rpm -U dist/RPMS/*/libhsclient*.rpm
53
+ $ make rpm_perl
54
+ $ sudo rpm -U dist/RPMS/*/perl-Net-HandlerSocket*.rpm
55
+
56
+ -----------------------------------------------------------------
57
+ 起動
58
+
59
+ mysqlを起動した状態で、mysqlの設定ファイル(my.cnf等)に以下の内容を
60
+ 追加します。
61
+
62
+ [mysqld]
63
+ handlersocket_port = 9998
64
+ # handlersocketが接続を受け付けるポート(参照系リクエスト用)
65
+ handlersocket_port_wr = 9999
66
+ # handlersocketが接続を受け付けるポート(更新系リクエスト用)
67
+ handlersocket_address =
68
+ # handlersocketがバインドするアドレス(空のままでOK)
69
+ handlersocket_verbose = 0
70
+ # デバッグ用
71
+ handlersocket_timeout = 300
72
+ # 通信タイムアウト(秒)
73
+ handlersocket_threads = 16
74
+ # handlersocketのワーカースレッド数
75
+ thread_concurrency = 128
76
+ # handlersocketが幾つかのスレッドを占有するため、大きめの
77
+ # 値を指定してください
78
+ open_files_limit = 65535
79
+ # ソケットを大量に開けるようにするため、大きめの値を指定し
80
+ # てください
81
+
82
+ 以下のクエリを実行します。
83
+
84
+ mysql> install plugin handlersocket soname 'handlersocket.so';
85
+ Query OK, 0 rows affected (0.06 sec)
86
+
87
+ 以上でhandlersocketへクライアントからアクセスできるようになります。
88
+
@@ -0,0 +1,127 @@
1
+
2
+ -----------------------------------------------------------------
3
+ handlersocketプラグインへの接続を開くには、Net::HandlerSocketオブ
4
+ ジェクトを作成します。
5
+
6
+ use Net::HandlerSocket;
7
+ my $args = { host => 'localhost', port => 9998 };
8
+ my $hs = new Net::HandlerSocket($args);
9
+
10
+ -----------------------------------------------------------------
11
+ 検索などの命令を実行する前に、処理対象となる索引を開く必要があり
12
+ ます。
13
+
14
+ my $err = $hs->open_index(3, 'database1', 'table1', 'PRIMARY',
15
+ 'f1,f2');
16
+ die $hs->get_error() if $res->[0] != 0;
17
+
18
+ 最初の引数は開く索引に付ける番号です。付けた番号は同一の
19
+ Net::HandlerSocketオブジェクトについてのみ有効です。第4引数は開く
20
+ 索引の名前で、「PRIMARY」が指定され場合はプライマリキーが開かれま
21
+ す。第5引数は「,」で区切られた列名のリストです。
22
+
23
+ -----------------------------------------------------------------
24
+ テーブルから索引を使って行を取得するには、execute_singleメソッド
25
+ を呼びます。
26
+
27
+ my $res = $hs->execute_single(3, '=', [ 'foo' ], 1, 0);
28
+ die $hs->get_error() if $res->[0] != 0;
29
+ shift(@$res);
30
+
31
+ 最初の引数は索引の番号で、同じNet::HandlerSocketオブジェクトへ
32
+ open_indexで付けたものでなければなりません。第2引数には操作を指定
33
+ します。現在のバージョンでは、「=」、「>=」、「<=」、「>」、「<」
34
+ の操作が利用可能です。第3引数は配列への参照で、これは探すべき行の
35
+ キー値を指定します。配列の長さは索引のキーの個数と同じか少ない数
36
+ でなければなりません。第4引数と第5引数はそれぞれ、取得する最大行
37
+ 数、取得前に読み飛ばす行数を指定します。取得される列は対応する
38
+ open_index呼び出しの第5引数で指定されたものになります。
39
+
40
+ execute_singleメソッドは常に配列への参照を返します。最初の要素は
41
+ エラーコードで、これが0ならば成功を表します。残りの要素は列の値で
42
+ す。もし取得されたデータが複数行の場合は、それが一つの配列へ連結
43
+ された形で格納されています。例えば、5行3列のデータの場合、次のよ
44
+ うなコードによってその内容を取得できます。
45
+
46
+ die $hs->get_error() if $res->[0] != 0;
47
+ shift(@$res);
48
+ for (my $row = 0; $row < 5; ++$row) {
49
+ for (my $col = 0; $col < 3; ++$col) {
50
+ my $value = $res->[$row * 5 + $col];
51
+ # ...
52
+ }
53
+ }
54
+
55
+ -----------------------------------------------------------------
56
+ 行を更新または削除するには、更に多くの引数を指定して
57
+ execute_singleメソッドを呼び出します。書き込み処理をするには、
58
+ 対象のNet::HandlerSocketオブジェクトは更新用handlersocketワーカ(既
59
+ 定ではポート9999)へ接続されたものでなくてはなりません。
60
+ (安全のため、ポート9998は参照処理だけを受け付け、ポート9999は更新
61
+ 処理も受け付けるようになっています。ポート9999は参照処理も受け付
62
+ けますが、レコードロック等の影響で遅くなります。ポート番号は
63
+ mysqldの「handlersocket_port」と「handlersocket_port_wr」の設定項
64
+ 目で変更できます。)
65
+
66
+ my $args = { host => 'localhost', port => 9999 };
67
+ my $hs = new Net::HandlerSocket($args);
68
+
69
+ my $res = $hs->execute_single(3, '=', [ 'bar' ], 1, 0, 'U',
70
+ [ 'fubar', 'hoge' ]);
71
+ die $hs->get_error() if $res->[0] != 0;
72
+ my $num_updated_rows = $res->[1];
73
+
74
+ my $res = $hs->execute_single(3, '=', [ 'baz' ], 1, 0, 'D');
75
+ die $hs->get_error() if $res->[0] != 0;
76
+ my $num_deleted_rows = $res->[1];
77
+
78
+ execute_singleの第6引数は変更処理の種類を指定します。現在のバー
79
+ ジョンでは「U」と「D」が利用可能です。「U」については、第7引数で
80
+ 新しい値を指定します。更新される列は、対応するopen_index呼び出し
81
+ の第5引数で指定されたものになります。「D」については第7引数は省
82
+ 略できます。
83
+
84
+ -----------------------------------------------------------------
85
+ execute_singleメソッドは列の挿入にも使用できます。
86
+
87
+ my $res = $hs->execute_single(3, '+', [ 'foo', 'bar', 'baz' ]);
88
+ die $hs->get_error() if $res->[0] != 0;
89
+ my $num_inserted_rows = $res->[1];
90
+
91
+ 第3引数は、対応するopen_index呼び出しの第5引数の列リストと同じだ
92
+ けの長さの配列への参照でなければなりません。open_index呼び出しの
93
+ 第5引数に指定されていない列については、その列の既定値がセットされ
94
+ ます。
95
+
96
+ -----------------------------------------------------------------
97
+ execute_multiメソッドを使えば、複数のリクエストを一つの呼び出しで
98
+ 実行することができます。これはリクエストを個別に実行するより高速
99
+ です。
100
+
101
+ my $rarr = $hs->execute_multi([
102
+ [ 0, '>=', [ 'foo' ], 5, 0 ],
103
+ [ 2, '=', [ 'bar' ], 1, 0 ],
104
+ [ 4, '<', [ 'baz' ], 10, 5 ],
105
+ ]);
106
+ for my $res (@$rarr) {
107
+ die $hs->get_error() if $res->[0] != 0;
108
+ shift(@$res);
109
+ # ...
110
+ }
111
+
112
+ -----------------------------------------------------------------
113
+ もしhandlersocketが接続を認証するように設定されている
114
+ (handlersocket_plain_secret又はhandlersocket_plain_secret_wrがセッ
115
+ トされている)ならば、クライアントは他のメソッド呼び出しの前にauth
116
+ メソッドを呼び出す必要があります。
117
+
118
+ my $res = $hs->auth('password');
119
+ die $hs->get_error() if $res->[0] != 0;
120
+
121
+ -----------------------------------------------------------------
122
+ エラーが起こると返値の配列参照の最初の要素が0以外になります。負の
123
+ 数の場合はI/Oエラーが起こったことを示し、その場合はその
124
+ Net::HandlerSocketオブジェクトは破棄するべきです。正の値の場合は
125
+ 接続は維持されているため、そのオブジェクトはそれ以後も再利用でき
126
+ ます。
127
+
@@ -0,0 +1,180 @@
1
+
2
+ ----------------------------------------------------------------------------
3
+ handlersocketの通信プロトコル
4
+
5
+ ----------------------------------------------------------------------------
6
+ 基本的な構文
7
+
8
+ ・HandlerSocketのプロトコルは行ベース。各行は改行文字(0x0a)で終わる。
9
+ ・各行は複数のトークンからなり、トークン間はTAB文字(0x09)で区切られる。
10
+ ・トークンはNULLトークンか、文字列トークンのいずれか。
11
+ ・NULLトークンは単一のNUL文字(0x00)であらわされる。
12
+ ・文字列トークンは、0バイト以上の文字列であらわされる。ただし0x10未満の文字
13
+ については0x01を前置し、0x40を加えたコードであらわされる。それ以外の文字は
14
+ その文字自身のコードであらわされる。
15
+
16
+ ----------------------------------------------------------------------------
17
+ リクエストとレスポンス
18
+
19
+ ・HandlerSocketのプロトコルは単純なリクエスト・レスポンスプロトコルになって
20
+ いる。接続が確立した後は、まずクライアントがリクエストを送る。
21
+ ・サーバは、クライアントが送ったリクエストと丁度同じ数の行(レスポンス)を返
22
+ す。
23
+ ・リクエストはパイプライン化してよい。つまりクライアントは前に送ったリクエス
24
+ トに対する返事(レスポンス)を待たずに次のリクエストを送ってもよい。
25
+
26
+ ----------------------------------------------------------------------------
27
+ インデックスを開く
28
+
29
+ open_index命令は次のような構文を持つ。
30
+
31
+ P <indexid> <dbname> <tablename> <indexname> <columns> [<fcolumns>]
32
+
33
+ - <indexid>は数字で、同一接続上で後に実行する命令の、対象索引を指定するため
34
+ に使われる。
35
+ - <dbname>, <tablename>, <indexname>は文字列で、それぞれDB名、テーブル名、
36
+ 索引の名前を指定する。<indexname>として「PRIMARY」を指定するとプライマリ
37
+ キーが開かれる。
38
+ - <columns>はカンマ区切りの列名のリスト。
39
+ - <fcolumns>はカンマ区切りの列名のリスト。これは省略することができる。
40
+
41
+ このopen_index命令が実行されると、HandlerSocketプラグインは指定されたDB、
42
+ テーブル、索引を開く。開かれた索引は接続が閉じられるまで開かれたままになる。
43
+ 開かれた索引は<indexid>の数字で識別される。もし既に<indexid>に指定された番号
44
+ の索引が既に開かれている場合は古いほうが閉じられる。この<indexid>はなるべく
45
+ 小さな数字を使ったほうが効率が良い。
46
+
47
+ ----------------------------------------------------------------------------
48
+ データ取得
49
+
50
+ find命令は次のような構文を持つ。
51
+
52
+ <indexid> <op> <vlen> <v1> ... <vn> [LIM] [IN] [FILTER ...]
53
+
54
+ LIMは次のようなパラメータの並び
55
+
56
+ <limit> <offset>
57
+
58
+ INは次のようなパラメータの並び
59
+
60
+ @ <icol> <ivlen> <iv1> ... <ivn>
61
+
62
+ FILTERは次のようなパラメータの並び
63
+
64
+ <ftyp> <fop> <fcol> <fval>
65
+
66
+ - <indexid>は数字で、これは同じ接続上で過去に実行したopen_index命令に指定さ
67
+ れた数字でなければならない。
68
+ - <op>は比較演算子で、現在のバージョンでは '=', '>', '>=', '<', '<=' をサ
69
+ ポートしている。
70
+ - <vlen>は後に続くパラメータ<v1> ... <vn>の長さ。この値は対応するopen_index
71
+ 命令の<indexname>パラメータで指定された索引のキー列の数と同じか小さいもの
72
+ でなければならない。
73
+ - <v1> ... <vn>は取得するべきキーの値を指定するパラメータ。
74
+ - LIMは省略できる。<limit>と<offset>は数字で、これはSQLのLIMITと同じように
75
+ はたらく。省略した場合は1と0を指定した場合と同じ動作をする。FILTERによっ
76
+ て読み飛ばされたレコードは<limit>と<offset>にカウントされない。
77
+ - INは省略できる。指定されると、これはSQLの WHERE ... IN のように動作する。
78
+ <icol>は対応するopen_index命令の<indexname>パラメータで指定された索引の
79
+ キー列の数より小さいものでなければならない。INが指定されたときは、find命
80
+ 令の<v1> ... <vn>のうち<icol>番目の値は無視される。
81
+ - FILTERは省略できる。これは行取得の際のフィルタを指定する。<ftyp>は
82
+ 'F'(filter)か'W'(while)のいずれかでなければならない。<fop>は比較演算子。
83
+ <fcol>は数字で、これは対応するopen_index命令の<fcolumns>で指定された列の
84
+ 数より小さいものでなければならない。複数のフィルタを指定することもでき、
85
+ その場合は各フィルタのANDと解釈される。'F'と'W'の違いは、条件にあてはま
86
+ らない行があったときに'F'は単にそれをスキップするが、'W'はその時点でルー
87
+ プを抜けるという点。
88
+
89
+ ----------------------------------------------------------------------------
90
+ 更新と削除
91
+
92
+ find_modify命令は次のような構文を持つ。
93
+
94
+ <indexid> <op> <vlen> <v1> ... <vn> [LIM] [IN] [FILTER ...] MOD
95
+
96
+ MODは次のようなパラメータの並び
97
+
98
+ <mop> <m1> ... <mk>
99
+
100
+ - <mop>は'U', '+', '-', 'D', 'U?', '+?', '-?', 'D?'のいずれか。'?'が付いた
101
+ ものは付いていないものとほぼ同じ動作をするが、付いていないものがレスポン
102
+ スとして更新された行の数を返すのに対し、付いているものは更新される前の行
103
+ の内容を返す点のみが異なる。'U'は更新、'D'は削除、'+'はインクリメント、
104
+ '-'はデクリメントを実行する。
105
+ - <m1> ... <mk>はセットされる各列の値。<m1> ... <mk>の長さは対応する
106
+ open_index命令の<columns>の長さと等しいか小さくなければならない。<mop>が
107
+ 'D'のときはこれらのパラメータは無視される。<mop>が'+'か'-'のときは、これら
108
+ の値は数値でなければならない。<mop>が'-'で、それが負数から正数、または正数
109
+ から負数へ列の値を変更するようなものであった場合は、値は変更されない。
110
+
111
+ ----------------------------------------------------------------------------
112
+ 行の挿入
113
+
114
+ insert命令は次のような構文を持つ。
115
+
116
+ <indexid> + <vlen> <v1> ... <vn>
117
+
118
+ - <vlen>は後に続くパラメータ<v1> ... <vn>の長さ。これは対応するopen_indexの
119
+ <columns>の長さに等しいか小さくなければならない。
120
+ - <v1> ... <vn>はセットされる各列の値。指定されないかった列についてはその列
121
+ のデフォルト値がセットされる。
122
+
123
+ ----------------------------------------------------------------------------
124
+ 認証
125
+
126
+ auth命令は次のような構文を持つ。
127
+
128
+ A <atyp> <akey>
129
+
130
+ - <atyp>は現在のバージョンでは'1'のみが有効。
131
+ - 指定された<akey>が、サーバの設定の'handlersocket_plain_secret'や
132
+ 'handlersocket_plain_secret_wr'に指定された文字列と一致した場合にのみ認証
133
+ は成功する。
134
+ - HandlerSocketの認証が有効になっているときは、この'auth'が成功しない限りそ
135
+ れ以外の命令は全て失敗する。
136
+
137
+ ----------------------------------------------------------------------------
138
+ open_indexに対するレスポンス
139
+
140
+ open_index命令が成功したとき、レスポンスは次の構文を持つ。
141
+
142
+ 0 1
143
+
144
+ ----------------------------------------------------------------------------
145
+ findに対するレスポンス
146
+
147
+ find命令が成功したとき、レスポンスは次の構文を持つ。
148
+
149
+ 0 <numcolumns> <r1> ... <rn>
150
+
151
+ - <numcolumns>はfind命令の対応するopen_index命令に指定した<columns>の長さに
152
+ 一致する。
153
+ - <r1> ... <rn>は結果セット。もしN行がfind命令で見つかったなら、<r1> ...
154
+ <rn>の長さは ( <numcolumns> * N )になる。
155
+
156
+ ----------------------------------------------------------------------------
157
+ find_modifyに対するレスポンス
158
+
159
+ find_modify命令が成功したとき、レスポンスは次の構文を持つ。
160
+
161
+ 0 1 <nummod>
162
+
163
+ - <nummod>は変更された行の数。
164
+ - 例外として、<mop>が'?'の付いたものであった場合には、find命令に対するレスポ
165
+ ンスと同じ構文のレスポンスを返す。
166
+
167
+ ----------------------------------------------------------------------------
168
+ insertに対するレスポンス
169
+
170
+ insert命令が成功したとき、レスポンスは次の構文を持つ。
171
+
172
+ 0 1
173
+
174
+ ----------------------------------------------------------------------------
175
+ authに対するレスポンス
176
+
177
+ auth命令が成功したとき、レスポンスは次の構文を持つ。
178
+
179
+ 0 1
180
+
@@ -0,0 +1,27 @@
1
+
2
+ Copyright (c) 2010 DeNA Co.,Ltd.
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ * Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+ * Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+ * Neither the name of DeNA Co.,Ltd. nor the names of its contributors
14
+ may be used to endorse or promote products derived from this software
15
+ without specific prior written permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY DeNA Co.,Ltd. "AS IS" AND ANY EXPRESS OR
18
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
20
+ EVENT SHALL DeNA Co.,Ltd. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+