vincentchu-handlersocket 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,99 @@
1
+
2
+ -----------------------------------------------------------------
3
+ handlersocket_verbose (default = 10, min = 0, max = 10000)
4
+
5
+ Specify the logging verboseness.
6
+
7
+ -----------------------------------------------------------------
8
+ handlersocket_address (default = '')
9
+
10
+ Specify the address to bind. If empty, it binds to 0.0.0.0.
11
+
12
+ -----------------------------------------------------------------
13
+ handlersocket_port (default = '9998')
14
+
15
+ Specify the port to bind. This option is for the listener for
16
+ read requests. If empty, the listener is disabled.
17
+
18
+ -----------------------------------------------------------------
19
+ handlersocket_port_wr (default = '9999')
20
+
21
+ Specify the port to bind. This option is for the listener for
22
+ write requests. If empty, the listener is disabled.
23
+
24
+ -----------------------------------------------------------------
25
+ handlersocket_epoll (default = 1, min = 0, max = 1)
26
+
27
+ Specify whether handlersocket uses epoll for I/O multiplexing.
28
+
29
+ -----------------------------------------------------------------
30
+ handlersocket_threads (default = 16, min = 1, max = 3000)
31
+
32
+ Specify the number of handlersocket worker threads. This option
33
+ is for the listener for read requests. Recommended value is
34
+ (the number of CPU cores * 2).
35
+
36
+ -----------------------------------------------------------------
37
+ handlersocket_threads_wr (default = 1, min = 1, max = 3000)
38
+
39
+ Specify the number of handlersocket worker threads. This option
40
+ is for the listener for write requests. Recommended value is 1.
41
+
42
+ -----------------------------------------------------------------
43
+ handlersocket_timeout (default = 300, min = 30, max = 3600)
44
+
45
+ Specify the socket timeout in seconds.
46
+
47
+ -----------------------------------------------------------------
48
+ handlersocket_backlog (default = 32768, min = 5, max = 1000000)
49
+
50
+ Specify the length of the listen backlog.
51
+
52
+ -----------------------------------------------------------------
53
+ handlersocket_sndbuf (default = 0, min = 0, max = 1677216)
54
+
55
+ Specify the maximum socket send buffer in bytes. If 0, the
56
+ system-wide default value is set.
57
+
58
+ -----------------------------------------------------------------
59
+ handlersocket_rcvbuf (default = 0, min = 0, max = 1677216)
60
+
61
+ Specify the maximum socket receive buffer in bytes. If 0, the
62
+ system-wide default value is set.
63
+
64
+ -----------------------------------------------------------------
65
+ handlersocket_readsize (default = 0, min = 0, max = 1677216)
66
+
67
+ Specify the minimum length of the handlersocket request buffer.
68
+ Larger value can make handlersocket faster for large requests,
69
+ but can consume memory. The default value is possibly 4096.
70
+
71
+ -----------------------------------------------------------------
72
+ handlersocket_accept_balance (default = 0, min = 0, max = 10000)
73
+
74
+ When this option is set to non-zero, handlersocket tries to
75
+ balance accepted connections among threads. Non-zero is
76
+ recommended if you use persistent connections (i.e., connection
77
+ pooling on the client side).
78
+
79
+ -----------------------------------------------------------------
80
+ handlersocket_wrlock_timeout (default = 12, min = 0, max = 3600)
81
+
82
+ Specify the lock timeout in seconds. When a write request is
83
+ performed, handlersocket acquires an advisory lock named
84
+ 'handlersocket_wr'. This option sets the timeout for the
85
+ locking.
86
+
87
+ -----------------------------------------------------------------
88
+ handlersocket_plain_secret (default = '')
89
+
90
+ When this option is specified, a plain-text authentication is
91
+ enabled for the listener for read requests. This option
92
+ specifies the secret key for the authentication.
93
+
94
+ -----------------------------------------------------------------
95
+ handlersocket_plain_secret_wr (default = '')
96
+
97
+ This option specifies the secret key for the listener for write
98
+ requests.
99
+
@@ -0,0 +1,92 @@
1
+ 1. Building Handlersocket
2
+
3
+ Handlersocket mainly consists of libhsclient, handlersocket, and C++/Perl clients. libhsclient is a common library shared from both client and server(plugin). handlersocket is a MySQL daemon plugin.
4
+ To build Handlersocket, you need both MySQL source code and MySQL binary. It is not required to pre-build MySQL source code, but source itself is needed because Handlersocket depends on MySQL header files that only MySQL source distribution contains. MySQL binary is just a normal MySQL binary distribution. You can use official MySQL binaries provided by Oracle.
5
+ Since Handlersocket uses daemon plugin interface supported from MySQL 5.1,
6
+ MySQL 5.1 or higher version is required.
7
+ Please make sure that you use identical MySQL version between MySQL source
8
+ and MySQL binary. Otherwise you might encounter serious problems (i.e. server
9
+ crash, etc).
10
+ Here are steps to build Handlersocket.
11
+
12
+ * Get MySQL source code
13
+
14
+ * Get MySQL binary
15
+
16
+ * Build Handlersocket
17
+ $ ./autogen.sh
18
+ $ ./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
19
+
20
+ --with-mysql-source refers to the top of MySQL source directory (which
21
+ contains the VERSION file or the configure.in file), --with-mysql-bindir
22
+ refers to where MySQL binary executables (i.e. mysql_config) are located,
23
+ and --with-mysql-plugindir refers to a plugin directory where plugin
24
+ libraries (*.so) are installed.
25
+
26
+ $ make
27
+ $ sudo make install
28
+
29
+ Both libhsclient and the handlersocket plugin will be installed.
30
+
31
+
32
+ 2. Using Handlersocket
33
+
34
+ Append configuration options for handlersocket to my.cnf.
35
+
36
+ [mysqld]
37
+ loose_handlersocket_port = 9998
38
+ # the port number to bind to (for read requests)
39
+ loose_handlersocket_port_wr = 9999
40
+ # the port number to bind to (for write requests)
41
+ loose_handlersocket_threads = 16
42
+ # the number of worker threads (for read requests)
43
+ loose_handlersocket_threads_wr = 1
44
+ # the number of worker threads (for write requests)
45
+ open_files_limit = 65535
46
+ # to allow handlersocket accept many concurrent
47
+ # connections, make open_files_limit as large as
48
+ # possible.
49
+
50
+ Log in to mysql as root, and execute the following query.
51
+
52
+ mysql> install plugin handlersocket soname 'handlersocket.so';
53
+
54
+ If handlersocket.so is successfully installed, it starts
55
+ accepting connections on port 9998 and 9999. Running
56
+ 'show processlist' should show handlersocket worker threads.
57
+
58
+ -----------------------------------------------------------------
59
+ On the client side, you need to install libhsclient for c++ apps
60
+ and perl-Net-HandlerSocket for perl apps. They do not require
61
+ MySQL to compile.
62
+
63
+ $ ./autogen.sh
64
+ $ ./configure --disable-handlersocket-server
65
+ $ make
66
+ $ sudo make install
67
+ $ cd perl-Net-HandlerSocket
68
+ $ perl Makefile.PL
69
+ $ make
70
+ $ sudo make install
71
+
72
+ -----------------------------------------------------------------
73
+ Alternatively, you can use the rpm installation. If your OS
74
+ supports rpms, you can use the following commands to build and
75
+ install handlersocket rpm packages.
76
+
77
+ (Server side, installs HandlerSocket plugin)
78
+ $ ./autogen.sh
79
+ $ ./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
80
+ $ make rpm_cli
81
+ $ sudo rpm -U dist/RPMS/*/libhsclient*.rpm
82
+ $ make rpm_c
83
+ $ sudo rpm -U dist/RPMS/*/handlersocket*.rpm
84
+
85
+ (Client side, installs client libraries)
86
+ $ ./autogen.sh
87
+ $ ./configure --disable-handlersocket-server
88
+ $ make rpm_cli
89
+ $ sudo rpm -U dist/RPMS/*/libhsclient*.rpm
90
+ $ make rpm_perl
91
+ $ sudo rpm -U dist/RPMS/*/perl-Net-HandlerSocket*.rpm
92
+
@@ -0,0 +1,135 @@
1
+
2
+ -----------------------------------------------------------------
3
+ To open a connection to the handlersocket plugin, you need to
4
+ create a Net::HandlerSocket object.
5
+
6
+ use Net::HandlerSocket;
7
+ my $args = { host => 'localhost', port => 9998 };
8
+ my $hs = new Net::HandlerSocket($args);
9
+
10
+ -----------------------------------------------------------------
11
+ Before executing table operations, you need to open an index to
12
+ work with.
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
+ The first argument for open_index is an integer value which is
19
+ used to identify an open table, which is only valid within the
20
+ same Net::HandlerSocket object. The 4th argument is the name of
21
+ index to open. If 'PRIMARY' is specified, the primary index is
22
+ open. The 5th argument is a comma-separated list of column names.
23
+
24
+ -----------------------------------------------------------------
25
+ To read a record from a table using an index, call the
26
+ execute_single method.
27
+
28
+ my $res = $hs->execute_single(3, '=', [ 'foo' ], 1, 0);
29
+ die $hs->get_error() if $res->[0] != 0;
30
+ shift(@$res);
31
+
32
+ The first argument must be an integer which has specified as the
33
+ first argument for open_index on the same Net::HandlerSocket
34
+ object. The second argument specifies the search operation. The
35
+ current version of handlersocket supports '=', '>=', '<=', '>',
36
+ and '<'. The 3rd argument specifies the key to find, which must
37
+ an arrayref whose length is equal to or smaller than the number
38
+ of key columns of the index. The 4th and the 5th arguments
39
+ specify the maximum number of records to be retrieved, and the
40
+ number of records skipped before retrieving records. The columns
41
+ to be retrieved are specified by the 5th argument for the
42
+ corresponding open_index call.
43
+
44
+ The execute_single method always returns an arrayref. The first
45
+ element is the error code, which is 0 when no error is occured.
46
+ The remaining are the field values. If more than one record is
47
+ returned, it is flatten to an 1-dimensional array. For example,
48
+ when 5 records that have 3 columns are returned, you can retrieve
49
+ values using the following code.
50
+
51
+ die $hs->get_error() if $res->[0] != 0;
52
+ shift(@$res);
53
+ for (my $row = 0; $row < 5; ++$row) {
54
+ for (my $col = 0; $col < 3; ++$col) {
55
+ my $value = $res->[$row * 5 + $col];
56
+ # ...
57
+ }
58
+ }
59
+
60
+ -----------------------------------------------------------------
61
+ To update or delete records, you need to specify more arguments
62
+ for the execute_single method. Note that the Net::HandlerSocket
63
+ object must be connected to a handlersocket worker for write
64
+ operations, which is port 9999 by default.
65
+ (For safety, the port 9998 only allows read operations, and the
66
+ port 9999 allows write operations also. The port 9999 allows
67
+ read operations too, but slower than 9998 because of record
68
+ locking etc.. Port numbers can be changed using the
69
+ 'handlersocket_port' and the 'handlersocket_port_wr'
70
+ configuration options of mysqld.)
71
+
72
+ my $args = { host => 'localhost', port => 9999 };
73
+ my $hs = new Net::HandlerSocket($args);
74
+
75
+ my $res = $hs->execute_single(3, '=', [ 'bar' ], 1, 0, 'U',
76
+ [ 'fubar', 'hoge' ]);
77
+ die $hs->get_error() if $res->[0] != 0;
78
+ my $num_updated_rows = $res->[1];
79
+
80
+ my $res = $hs->execute_single(3, '=', [ 'baz' ], 1, 0, 'D');
81
+ die $hs->get_error() if $res->[0] != 0;
82
+ my $num_deleted_rows = $res->[1];
83
+
84
+ The 6th argument for execute_single specifies the modification
85
+ operation. The current version supports 'U' and 'D'. For the 'U'
86
+ operation, the 7th argument specifies the new value for the row.
87
+ The columns to be modified are specified by the 5th argument for
88
+ the corresponding open_index call. For the 'D' operation, the
89
+ 7th argument can be omitted.
90
+
91
+ -----------------------------------------------------------------
92
+ The execute_single method can be used for inserting records also.
93
+
94
+ my $res = $hs->execute_single(3, '+', [ 'foo', 'bar', 'baz' ]);
95
+ die $hs->get_error() if $res->[0] != 0;
96
+ my $num_inserted_rows = $res->[1];
97
+
98
+ The 3rd argument must be an arrayref whose elements correspond to
99
+ the 5th argument for the corresponding open_index call. If there
100
+ is a column which is not appeared in the 5th argument for the
101
+ open_index, the default value for the column is set.
102
+
103
+ -----------------------------------------------------------------
104
+ Multiple operations can be executed in a single call. Executing
105
+ multiple operations in a single call is much faster than
106
+ executing them separatedly.
107
+
108
+ my $rarr = $hs->execute_multi([
109
+ [ 0, '>=', [ 'foo' ], 5, 0 ],
110
+ [ 2, '=', [ 'bar' ], 1, 0 ],
111
+ [ 4, '<', [ 'baz' ], 10, 5 ],
112
+ ]);
113
+ for my $res (@$rarr) {
114
+ die $hs->get_error() if $res->[0] != 0;
115
+ shift(@$res);
116
+ # ...
117
+ }
118
+
119
+ -----------------------------------------------------------------
120
+ If handlersocket is configured to authenticate client connections
121
+ (ie., handlersocket_plain_secret or handlersocket_plain_secret_wr
122
+ is set), a client must call 'auth' method before any other
123
+ methods.
124
+
125
+ my $res = $hs->auth('password');
126
+ die $hs->get_error() if $res->[0] != 0;
127
+
128
+ -----------------------------------------------------------------
129
+ When an error is occured, the first element of the returned
130
+ arrayref becomes a non-zero value. A negative value indicates
131
+ that an I/O error is occured and the Net::HandlerSocket object
132
+ should be disposed. A positive value means that the connection is
133
+ still active and the Net::HandlerSocket object can be reused
134
+ later.
135
+
@@ -0,0 +1,205 @@
1
+
2
+ ----------------------------------------------------------------------------
3
+ The HandlerSocket protocol
4
+
5
+ ----------------------------------------------------------------------------
6
+ Basic syntax
7
+
8
+ - The HandlerSocket protocol is line-based. Each line ends with LF(0x0a).
9
+ - Each line consists a concatenation of tokens separated by HT(0x09).
10
+ - A token is either NULL or an encoded string. Note that you need to
11
+ distinguish NULL from an empty string, as most DBMs does so.
12
+ - NULL is expressed as a single NUL(0x00).
13
+ - An encoded string is a string with the following encoding rules.
14
+ - Characters in the range [0x10 - 0xff] are encoded as itselves.
15
+ - A character in the range [0x00 - 0x0f] is prefixed by 0x01 and
16
+ shifted by 0x40. For example, 0x03 is encoded as 0x01 0x43.
17
+ - Note that a string can be empty. A continuation of 0x09 0x09 means that
18
+ there is an empty string between them. A continuation of 0x09 0x0a means
19
+ that there is an empty string at the end of the line.
20
+
21
+ ----------------------------------------------------------------------------
22
+ Request and Response
23
+
24
+ - The HandlerSocket protocol is a simple request/response protocol. After a
25
+ connection is established, the client side sends a request, and then the
26
+ server side sends a response.
27
+ - A request/response consists of a single line.
28
+ - Requests can be pipelined; That is, you can send multiple requests (ie.
29
+ lines) at one time, and receive responses for them at one time.
30
+
31
+ ----------------------------------------------------------------------------
32
+ Opening index
33
+
34
+ The 'open_index' request has the following syntax.
35
+
36
+ P <indexid> <dbname> <tablename> <indexname> <columns> [<fcolumns>]
37
+
38
+ - <indexid> is a number in decimal.
39
+ - <dbname>, <tablename>, and <indexname> are strings. To open the primary
40
+ key, use PRIMARY as <indexname>.
41
+ - <columns> is a comma-separated list of column names.
42
+ - <fcolumns> is a comma-separated list of column names. This parameter is
43
+ optional.
44
+
45
+ Once an 'open_index' request is issued, the HandlerSocket plugin opens the
46
+ specified index and keep it open until the client connection is closed. Each
47
+ open index is identified by <indexid>. If <indexid> is already open, the old
48
+ open index is closed. You can open the same combination of <dbname>
49
+ <tablename> <indexname> multple times, possibly with different <columns>.
50
+ For efficiency, keep <indexid> small as far as possible.
51
+
52
+ ----------------------------------------------------------------------------
53
+ Getting data
54
+
55
+ The 'find' request has the following syntax.
56
+
57
+ <indexid> <op> <vlen> <v1> ... <vn> [LIM] [IN] [FILTER ...]
58
+
59
+ LIM is a sequence of the following parameters.
60
+
61
+ <limit> <offset>
62
+
63
+ IN is a sequence of the following parameters.
64
+
65
+ @ <icol> <ivlen> <iv1> ... <ivn>
66
+
67
+ FILETER is a sequence of the following parameters.
68
+
69
+ <ftyp> <fop> <fcol> <fval>
70
+
71
+ - <indexid> is a number. This number must be an <indexid> specified by a
72
+ 'open_index' request executed previously on the same connection.
73
+ - <op> specifies the comparison operation to use. The current version of
74
+ HandlerSocket supports '=', '>', '>=', '<', and '<='.
75
+ - <vlen> indicates the length of the trailing parameters <v1> ... <vn>. This
76
+ must be smaller than or equal to the number of index columns specified by
77
+ the <indexname> parameter of the corresponding 'open_index' request.
78
+ - <v1> ... <vn> specify the index column values to fetch.
79
+ - LIM is optional. <limit> and <offset> are numbers. When omitted, it works
80
+ as if 1 and 0 are specified. These parameter works like LIMIT of SQL.
81
+ These values don't include the number of records skipped by a filter.
82
+ - IN is optional. It works like WHERE ... IN syntax of SQL. <icol> must be
83
+ smaller than the number of index columns specified by the <indexname>
84
+ parameter of the corresponding 'open_index' request. If IN is specified in
85
+ a find request, the <icol>-th parameter value of <v1> ... <vn> is ignored.
86
+ - FILTERs are optional. A FILTER specifies a filter. <ftyp> is either 'F'
87
+ (filter) or 'W' (while). <fop> specifies the comparison operation to use.
88
+ <fcol> must be smaller than the number of columns specified by the
89
+ <fcolumns> parameter of the corresponding 'open_index' request. Multiple
90
+ filters can be specified, and work as the logical AND of them. The
91
+ difference of 'F' and 'W' is that, when a record does not meet the
92
+ specified condition, 'F' simply skips the record, and 'W' stops the loop.
93
+
94
+ ----------------------------------------------------------------------------
95
+ Updating/Deleting data
96
+
97
+ The 'find_modify' request has the following syntax.
98
+
99
+ <indexid> <op> <vlen> <v1> ... <vn> [LIM] [IN] [FILTER ...] MOD
100
+
101
+ MOD is a sequence of the following parameters.
102
+
103
+ <mop> <m1> ... <mk>
104
+
105
+ - <mop> is 'U' (update), '+' (increment), '-' (decrement), 'D' (delete),
106
+ 'U?', '+?', '-?', or 'D?'. If the '?' suffix is specified, it returns
107
+ the contents of the records before modification (as if it's a 'find'
108
+ request), instead of the number of modified records.
109
+ - <m1> ... <mk> specifies the column values to set. The length of <m1> ...
110
+ <mk> must be smaller than or equal to the length of <columns> specified by
111
+ the corresponding 'open_index' request. If <mop> is 'D', these parameters
112
+ are ignored. If <mop> is '+' or '-', values must be numeric. If <mop> is
113
+ '-' and it attempts to change a column value from negative to positive or
114
+ positive to negative, the column value is not modified.
115
+
116
+ ----------------------------------------------------------------------------
117
+ Inserting data
118
+
119
+ The 'insert' request has the following syntax.
120
+
121
+ <indexid> + <vlen> <v1> ... <vn>
122
+
123
+ - <vlen> indicates the length of the trailing parameters <v1> ... <vn>. This
124
+ must be smaller than or equal to the length of <columns> specified by the
125
+ corresponding 'open_index' request.
126
+ - <v1> ... <vn> specify the column values to set. For columns not in
127
+ <columns>, the default values for each column are set.
128
+
129
+ ----------------------------------------------------------------------------
130
+ Authentication
131
+
132
+ The 'auth' request has the following syntax.
133
+
134
+ A <atyp> <akey>
135
+
136
+ - <atyp> must be '1'
137
+ - An 'auth' request succeeds iff <akey> is the correct secret specified by
138
+ the 'handlersocket_plain_secret' or 'handlersocket_plain_secret_rw'.
139
+ - If an authentication is enabled for a listener, any other requests on a
140
+ connection fail before an 'auth' request succeeded on the connection.
141
+
142
+ ----------------------------------------------------------------------------
143
+ Response syntax
144
+
145
+ HandlerSocket returns a response of the following syntax for each request.
146
+
147
+ <errorcode> <numcolumns> <r1> ... <rn>
148
+
149
+ - <errorcode> indicates whether the request has successfully executed or not.
150
+ '0' means success. Non-zero means an error.
151
+ - <numcolumns> indicates the number of columns of the result set.
152
+ - <r1> ... <rn> is the result set. The length of <r1> ... <rn> is always a
153
+ multiple of <numcolumns>. It is possible that <r1> ... <rn> is empty.
154
+
155
+ If <errorcode> is non-zero, <numcolumns> is always 1 and <r1> indicates a
156
+ human-readable error message, though sometimes <r1> is not provided.
157
+
158
+ ----------------------------------------------------------------------------
159
+ Response for 'open_index'
160
+
161
+ If 'open_index' is succeeded, HandlerSocket returns a line of the following
162
+ syntax.
163
+
164
+ 0 1
165
+
166
+ ----------------------------------------------------------------------------
167
+ Response for 'find'
168
+
169
+ If 'find' is succeeded, HandlerSocket returns a line of the following
170
+ syntax.
171
+
172
+ 0 <numcolumns> <r1> ... <rn>
173
+
174
+ - <numcolumns> always equals to the length of <columns> of the corresponding
175
+ 'open_index' request.
176
+ - <r1> ... <rn> is the result set. If N rows are found, the length of <r1>
177
+ ... <rn> becomes ( <numcolumns> * N ).
178
+
179
+ ----------------------------------------------------------------------------
180
+ Response for 'find_modify'
181
+
182
+ If 'find_modify' is succeeded, HandlerSocket returns a line of the following
183
+ syntax.
184
+
185
+ 0 1 <nummod>
186
+
187
+ - <nummod> is the number of modified rows.
188
+ - As an exception, if the '?' suffix is specified in <mop>, a response has
189
+ the syntax of a response for 'find' instead.
190
+
191
+ ----------------------------------------------------------------------------
192
+ Response for 'insert'
193
+
194
+ If 'insert' is succeeded, HanderSocket returns a line of the following
195
+ syntax.
196
+
197
+ 0 1
198
+
199
+ ----------------------------------------------------------------------------
200
+ Response for 'auth'
201
+
202
+ If 'auth' is succeeded, HanderSocket returns a line of the following syntax.
203
+
204
+ 0 1
205
+