transactd 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (218) hide show
  1. checksums.yaml +7 -0
  2. data/BUILD_UNIX-JA +174 -0
  3. data/BUILD_WIN-JA +256 -0
  4. data/CMakeLists.txt +96 -0
  5. data/COPYING +339 -0
  6. data/README +406 -0
  7. data/README-JA +424 -0
  8. data/bin/common/tdclc_32_1_0.dll +0 -0
  9. data/bin/common/tdclc_64_1_0.dll +0 -0
  10. data/build/common/check_for_link_iconv.cmake +73 -0
  11. data/build/common/copyifgreater.cmd +30 -0
  12. data/build/common/copyifgreater.js +290 -0
  13. data/build/common/get_boost_libs.cmake +106 -0
  14. data/build/common/get_ruby_path.cmake +115 -0
  15. data/build/common/options.cmake +127 -0
  16. data/build/common/smart_install.cmake +263 -0
  17. data/build/common/system.cmake +122 -0
  18. data/build/common/transactd.rc.in +52 -0
  19. data/build/common/transactd_cl_common.cmake +101 -0
  20. data/build/common/transactd_cl_output.cmake +93 -0
  21. data/build/common/transactd_common.cmake +237 -0
  22. data/build/common/transactd_required.cmake +28 -0
  23. data/build/swig/ruby/generate.cmake.in +35 -0
  24. data/build/swig/ruby/generate.cmd.in +19 -0
  25. data/build/swig/ruby/ruby.swg +101 -0
  26. data/build/swig/tdcl.i +188 -0
  27. data/build/tdclc/BUILDNUMBER.txt +1 -0
  28. data/build/tdclc/CMakeLists.txt +170 -0
  29. data/build/tdclc/tdclc_32.cbproj +181 -0
  30. data/build/tdclc/tdclc_64.cbproj +205 -0
  31. data/build/tdclcpp/BUILDNUMBER.txt +1 -0
  32. data/build/tdclcpp/CMakeLists.txt +142 -0
  33. data/build/tdclcpp/tdclcpp_bcb_32.cbproj +239 -0
  34. data/build/tdclcpp/tdclcpp_bcb_64.cbproj +304 -0
  35. data/build/tdclrb/BUILDNUMBER.txt +1 -0
  36. data/build/tdclrb/CMakeLists.txt +258 -0
  37. data/build/tdclrb/GEM_VERSION +3 -0
  38. data/build/tdclrb/bldgem/extconf.rb +123 -0
  39. data/build/tdclrb/gem/INSTALLLOG.win32 +9 -0
  40. data/build/tdclrb/gem/Makefile.win32-VS +65 -0
  41. data/build/tdclrb/gem/Makefile.win32-prebuilt +48 -0
  42. data/build/tdclrb/gem/detect.rb +31 -0
  43. data/build/tdclrb/gem/helper.rb +113 -0
  44. data/build/tdclrb/gem/transactd.rb +22 -0
  45. data/build/tdclrb/gem_output.cmake +44 -0
  46. data/source/bzs/db/IBlobBuffer.h +51 -0
  47. data/source/bzs/db/blobBuffer.h +177 -0
  48. data/source/bzs/db/blobStructs.h +85 -0
  49. data/source/bzs/db/engine/mysql/IReadRecords.h +52 -0
  50. data/source/bzs/db/engine/mysql/bookmark.h +195 -0
  51. data/source/bzs/db/engine/mysql/database.cpp +1882 -0
  52. data/source/bzs/db/engine/mysql/database.h +465 -0
  53. data/source/bzs/db/engine/mysql/dbManager.cpp +303 -0
  54. data/source/bzs/db/engine/mysql/dbManager.h +143 -0
  55. data/source/bzs/db/engine/mysql/errorMessage.cpp +75 -0
  56. data/source/bzs/db/engine/mysql/errorMessage.h +43 -0
  57. data/source/bzs/db/engine/mysql/fieldAccess.h +158 -0
  58. data/source/bzs/db/engine/mysql/mydebuglog.cpp +349 -0
  59. data/source/bzs/db/engine/mysql/mydebuglog.h +89 -0
  60. data/source/bzs/db/engine/mysql/mysqlInternal.h +171 -0
  61. data/source/bzs/db/engine/mysql/mysqlThd.cpp +169 -0
  62. data/source/bzs/db/engine/mysql/mysqlThd.h +35 -0
  63. data/source/bzs/db/engine/mysql/percentageKey.h +260 -0
  64. data/source/bzs/db/protocol/ICommandExecuter.h +49 -0
  65. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +689 -0
  66. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +228 -0
  67. data/source/bzs/db/protocol/tdap/btrDate.cpp +437 -0
  68. data/source/bzs/db/protocol/tdap/btrDate.h +227 -0
  69. data/source/bzs/db/protocol/tdap/client/bulkInsert.h +127 -0
  70. data/source/bzs/db/protocol/tdap/client/client.cpp +106 -0
  71. data/source/bzs/db/protocol/tdap/client/client.h +292 -0
  72. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +144 -0
  73. data/source/bzs/db/protocol/tdap/client/connMgr.h +82 -0
  74. data/source/bzs/db/protocol/tdap/client/database.cpp +863 -0
  75. data/source/bzs/db/protocol/tdap/client/database.h +118 -0
  76. data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +100 -0
  77. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +1640 -0
  78. data/source/bzs/db/protocol/tdap/client/dbDef.h +135 -0
  79. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +434 -0
  80. data/source/bzs/db/protocol/tdap/client/errorMessage.cpp +92 -0
  81. data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +98 -0
  82. data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +174 -0
  83. data/source/bzs/db/protocol/tdap/client/fieldDDF.h +91 -0
  84. data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +140 -0
  85. data/source/bzs/db/protocol/tdap/client/fileDDF.h +86 -0
  86. data/source/bzs/db/protocol/tdap/client/filter.cpp +527 -0
  87. data/source/bzs/db/protocol/tdap/client/filter.h +154 -0
  88. data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +137 -0
  89. data/source/bzs/db/protocol/tdap/client/indexDDF.h +84 -0
  90. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +724 -0
  91. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +123 -0
  92. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +899 -0
  93. data/source/bzs/db/protocol/tdap/client/nsTable.h +199 -0
  94. data/source/bzs/db/protocol/tdap/client/request.h +198 -0
  95. data/source/bzs/db/protocol/tdap/client/sharedData.cpp +58 -0
  96. data/source/bzs/db/protocol/tdap/client/sharedData.h +56 -0
  97. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +574 -0
  98. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +53 -0
  99. data/source/bzs/db/protocol/tdap/client/stringConverter.h +627 -0
  100. data/source/bzs/db/protocol/tdap/client/table.cpp +2613 -0
  101. data/source/bzs/db/protocol/tdap/client/table.h +221 -0
  102. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +1096 -0
  103. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +179 -0
  104. data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +40 -0
  105. data/source/bzs/db/protocol/tdap/client/trnsctcl.def +11 -0
  106. data/source/bzs/db/protocol/tdap/myDateTime.cpp +500 -0
  107. data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +184 -0
  108. data/source/bzs/db/protocol/tdap/mysql/characterset.h +60 -0
  109. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +284 -0
  110. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +53 -0
  111. data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +383 -0
  112. data/source/bzs/db/protocol/tdap/mysql/debuglog.h +106 -0
  113. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +680 -0
  114. data/source/bzs/db/protocol/tdap/mysql/request.h +202 -0
  115. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +1020 -0
  116. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +141 -0
  117. data/source/bzs/db/protocol/tdap/tdapRequest.h +190 -0
  118. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +295 -0
  119. data/source/bzs/db/protocol/tdap/tdapSchema.h +558 -0
  120. data/source/bzs/db/protocol/tdap/tdapcapi.h +423 -0
  121. data/source/bzs/db/transactd/appBuilderImple.h +55 -0
  122. data/source/bzs/db/transactd/appModule.cpp +183 -0
  123. data/source/bzs/db/transactd/appModule.h +80 -0
  124. data/source/bzs/db/transactd/connManager.cpp +201 -0
  125. data/source/bzs/db/transactd/connManager.h +60 -0
  126. data/source/bzs/db/transactd/connectionRecord.h +69 -0
  127. data/source/bzs/db/transactd/transactd.cpp +325 -0
  128. data/source/bzs/env/compiler.h +135 -0
  129. data/source/bzs/env/crosscompile.cpp +130 -0
  130. data/source/bzs/env/crosscompile.h +150 -0
  131. data/source/bzs/env/fileopen.h +36 -0
  132. data/source/bzs/env/mbcswchrLinux.cpp +40 -0
  133. data/source/bzs/env/mbcswchrLinux.h +88 -0
  134. data/source/bzs/env/tstring.h +183 -0
  135. data/source/bzs/example/changeSchema.cpp +117 -0
  136. data/source/bzs/example/changeSchema_c.cpp +78 -0
  137. data/source/bzs/example/connection_pool_c.cpp +171 -0
  138. data/source/bzs/example/createDatabase.cpp +305 -0
  139. data/source/bzs/example/createDatabase_c.cpp +202 -0
  140. data/source/bzs/example/deleteRecords.cpp +87 -0
  141. data/source/bzs/example/deleteRecords_c.cpp +57 -0
  142. data/source/bzs/example/dropDatabase.cpp +59 -0
  143. data/source/bzs/example/dropDatabase_c.cpp +34 -0
  144. data/source/bzs/example/insertRecords.cpp +212 -0
  145. data/source/bzs/example/insertRecords_c.cpp +153 -0
  146. data/source/bzs/example/readRecords.cpp +141 -0
  147. data/source/bzs/example/readRecords_c.cpp +107 -0
  148. data/source/bzs/example/updateRecords.cpp +99 -0
  149. data/source/bzs/example/updateRecords_c.cpp +71 -0
  150. data/source/bzs/example/update_with_transaction.cpp +104 -0
  151. data/source/bzs/example/update_with_transaction_c.cpp +80 -0
  152. data/source/bzs/netsvc/client/tcpClient.cpp +226 -0
  153. data/source/bzs/netsvc/client/tcpClient.h +489 -0
  154. data/source/bzs/netsvc/server/IAppModule.h +94 -0
  155. data/source/bzs/netsvc/server/iserver.h +65 -0
  156. data/source/bzs/netsvc/server/serverCpt.cpp +522 -0
  157. data/source/bzs/netsvc/server/serverCpt.h +88 -0
  158. data/source/bzs/netsvc/server/serverPipe.cpp +705 -0
  159. data/source/bzs/netsvc/server/serverPipe.h +96 -0
  160. data/source/bzs/netsvc/server/serverTpool.cpp +416 -0
  161. data/source/bzs/netsvc/server/serverTpool.h +84 -0
  162. data/source/bzs/rtl/benchmark.cpp +96 -0
  163. data/source/bzs/rtl/benchmark.h +65 -0
  164. data/source/bzs/rtl/datetime.cpp +375 -0
  165. data/source/bzs/rtl/datetime.h +53 -0
  166. data/source/bzs/rtl/debuglog.cpp +106 -0
  167. data/source/bzs/rtl/debuglog.h +97 -0
  168. data/source/bzs/rtl/exception.h +116 -0
  169. data/source/bzs/rtl/stl_uty.cpp +35 -0
  170. data/source/bzs/rtl/stl_uty.h +29 -0
  171. data/source/bzs/rtl/stringBuffers.cpp +101 -0
  172. data/source/bzs/rtl/stringBuffers.h +58 -0
  173. data/source/bzs/rtl/strtrim.cpp +135 -0
  174. data/source/bzs/rtl/strtrim.h +46 -0
  175. data/source/bzs/test/tdclatl/bench_tdclatl.js +445 -0
  176. data/source/bzs/test/tdclrb/bench_tdclcpp.rb +375 -0
  177. data/source/bzs/test/tdclrb/prepare.rb +226 -0
  178. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +172 -0
  179. data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +208 -0
  180. data/source/bzs/test/tdclrb/transactd_spec.rb +1536 -0
  181. data/source/bzs/test/transactdBench/transactdBench.cpp +430 -0
  182. data/source/bzs/test/transactdBench/transactdBench2.cpp +342 -0
  183. data/source/bzs/test/trdclengn/test_trdclengn.cpp +2030 -0
  184. data/source/global/tdclatl/Database.cpp +503 -0
  185. data/source/global/tdclatl/Database.h +139 -0
  186. data/source/global/tdclatl/DbDef.cpp +242 -0
  187. data/source/global/tdclatl/DbDef.h +79 -0
  188. data/source/global/tdclatl/Field.cpp +92 -0
  189. data/source/global/tdclatl/Field.h +59 -0
  190. data/source/global/tdclatl/FieldDef.cpp +238 -0
  191. data/source/global/tdclatl/FieldDef.h +87 -0
  192. data/source/global/tdclatl/Flags.cpp +111 -0
  193. data/source/global/tdclatl/Flags.h +55 -0
  194. data/source/global/tdclatl/KeyDef.cpp +51 -0
  195. data/source/global/tdclatl/KeyDef.h +55 -0
  196. data/source/global/tdclatl/KeySegment.cpp +55 -0
  197. data/source/global/tdclatl/Table.cpp +600 -0
  198. data/source/global/tdclatl/Table.h +144 -0
  199. data/source/global/tdclatl/TableDef.cpp +291 -0
  200. data/source/global/tdclatl/TableDef.h +86 -0
  201. data/source/global/tdclatl/TdVersion.cpp +74 -0
  202. data/source/global/tdclatl/TdVersion.h +54 -0
  203. data/source/global/tdclatl/_IDatabaseEvents_CP.h +113 -0
  204. data/source/global/tdclatl/dllmain.cpp +30 -0
  205. data/source/global/tdclatl/dllmain.h +27 -0
  206. data/source/global/tdclatl/keySegment.h +57 -0
  207. data/source/global/tdclatl/resource.h +0 -0
  208. data/source/global/tdclatl/stdafx.cpp +2 -0
  209. data/source/global/tdclatl/stdafx.h +25 -0
  210. data/source/global/tdclatl/targetver.h +4 -0
  211. data/source/global/tdclatl/tdclatl.cpp +68 -0
  212. data/source/global/tdclatl/tdclatl.def +10 -0
  213. data/source/global/tdclatl/tdclatl.idl +1035 -0
  214. data/source/linux/charsetConvert.h +112 -0
  215. data/source/linux/linuxTypes.h +33 -0
  216. data/source/linux/tchar.h +428 -0
  217. data/transactd.gemspec +97 -0
  218. metadata +267 -0
@@ -0,0 +1,689 @@
1
+ /*=================================================================
2
+ Copyright (C) 2013 BizStation Corp All rights reserved.
3
+
4
+ This program is free software; you can redistribute it and/or
5
+ modify it under the terms of the GNU General Public License
6
+ as published by the Free Software Foundation; either version 2
7
+ of the License, or (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program; if not, write to the Free Software
16
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17
+ 02111-1307, USA.
18
+ =================================================================*/
19
+ #include "hsCommandExecuter.h"
20
+ #include <bzs/db/engine/mysql/database.h>
21
+ #include <bzs/db/engine/mysql/errorMessage.h>
22
+ #include <bzs/db/engine/mysql/mydebuglog.h>
23
+ #include <bzs/netsvc/server/IAppModule.h> //lookup for result value
24
+ #include <bzs/rtl/stl_uty.h>
25
+ #include <limits.h>
26
+ #include <bzs/db/transactd/connManager.h>
27
+ #include <bzs/rtl/exception.h>
28
+
29
+ #ifdef USE_HANDLERSOCKET
30
+ namespace bzs
31
+ {
32
+ namespace db
33
+ {
34
+ using namespace engine::mysql;
35
+ namespace protocol
36
+ {
37
+ using namespace transactd;
38
+ using namespace transactd::connection;
39
+ namespace hs
40
+ {
41
+
42
+ //-----------------------------------------------------------------------
43
+ // request
44
+ //-----------------------------------------------------------------------
45
+ ha_rkey_function request::seekFlag()
46
+ {
47
+ switch(table.key.logical)
48
+ {
49
+ case HS_LG_EQUAL:return HA_READ_KEY_EXACT;
50
+ case HS_LG_GREATER:return HA_READ_AFTER_KEY;
51
+ case HS_LG_GREATEROREQUAL:return HA_READ_KEY_OR_NEXT;
52
+ case HS_LG_LESS:return HA_READ_BEFORE_KEY;
53
+ case HS_LG_LESSOREQUAL:return HA_READ_KEY_OR_PREV;
54
+ }
55
+ return HA_READ_KEY_EXACT;
56
+ }
57
+
58
+ bool request::naviSame()
59
+ {
60
+ return (table.key.logical == HS_LG_EQUAL);
61
+ }
62
+
63
+ bool request::naviForward()
64
+ {
65
+ return (table.key.logical == HS_LG_GREATER)||(table.key.logical == HS_LG_GREATEROREQUAL);
66
+ }
67
+
68
+ void seriarizeRecordsetBegin(engine::mysql::table* tb, resultBuffer& buf
69
+ , bool sendBforeValue)
70
+ {
71
+ if (sendBforeValue)
72
+ {
73
+ buf.append("0\t");
74
+ buf.append((int)tb->useFields().size());
75
+ }
76
+ }
77
+
78
+ void seriarizeRecord(engine::mysql::table* tb, resultBuffer& buf, bool sendBforeValue)
79
+ {
80
+ if (sendBforeValue)
81
+ {
82
+ for (int i=0;i<tb->useFields().size();i++)
83
+ {
84
+ buf.append("\t");
85
+ int size;
86
+ const char* p = tb->valStr(tb->useFields()[i], size);
87
+ if (size == -1)
88
+ buf.append("\0");
89
+ else
90
+ buf.append(p, size);
91
+ }
92
+ }
93
+ }
94
+
95
+ void seriarizeRecordsetEnd(engine::mysql::table* tb, resultBuffer& buf
96
+ , int count, bool sendBforeValue)
97
+ {
98
+ if (!sendBforeValue)
99
+ {
100
+ buf.append("0\t1\t");
101
+ buf.append(count);
102
+ buf.append("\n");
103
+ }else
104
+ buf.append("\n");
105
+ }
106
+
107
+ void writeError(int error, resultBuffer& buf, const char* msg)
108
+ {
109
+ buf.append(error);
110
+ buf.append("\t");
111
+ buf.append(msg);
112
+ buf.append("\n");
113
+ }
114
+
115
+ void writeStatus(int stat, resultBuffer& buf, int option)
116
+ {
117
+ int v = 0;
118
+ v = std::min(stat, 1);
119
+ buf.append(v);
120
+ buf.append("\t");
121
+ buf.append(option);
122
+ buf.append("\n\0");
123
+ }
124
+
125
+ //-----------------------------------------------------------------------
126
+ // clas dbExecuter
127
+ //-----------------------------------------------------------------------
128
+ #define READ_SUCCESS 0
129
+ #define FILTER_MATCH READ_SUCCESS
130
+ #define FILTER_SKIP 1
131
+ #define FILTER_BREAK 2
132
+
133
+ int update(request& req, engine::mysql::table* tb, int type)
134
+ {
135
+ tb->beginUpdate(tb->keyNum());
136
+ tb->setUseValues(req.table.values, type);
137
+ tb->update(true);
138
+ return tb->stat();
139
+ }
140
+
141
+ int del(request& req, engine::mysql::table* tb, int type)
142
+ {
143
+ tb->beginDel();
144
+ tb->del();
145
+ return tb->stat();
146
+ }
147
+
148
+ inline bool match(short logical, int v)
149
+ {
150
+ switch(logical)
151
+ {
152
+ case HS_LG_EQUAL:return (v==0); //==
153
+ case HS_LG_GREATER:return (v>0); //>
154
+ case HS_LG_LESS:return (v<0); //<
155
+ case HS_LG_NOTEQUAL:return (v!=0); //!=
156
+ case HS_LG_GREATEROREQUAL:return (v>=0); //>=
157
+ case HS_LG_LESSOREQUAL:return (v<=0); //<=
158
+ }
159
+ return false;
160
+ }
161
+
162
+ int filter(engine::mysql::table* tb, request::table::filters_type& filters)
163
+ {
164
+ for(size_t i=0;i<filters.size();++i)
165
+ {
166
+ request::table::filter& f = filters[i];
167
+ if (f.col >= tb->useFields().size())
168
+ THROW_BZS_ERROR_WITH_MSG("fcol");
169
+ Field* fd = tb->field(tb->useFields()[f.col]);
170
+ uchar tmp[1024]={NULL};
171
+ if (fd->pack_length() > 1024)
172
+ THROW_BZS_ERROR_WITH_MSG("field_length > 1024");
173
+ memcpy(tmp, fd->ptr, fd->pack_length());
174
+ tb->setValue(fd->field_index, f.value, 0);
175
+ int v = fd->cmp(tmp, fd->ptr);
176
+ memcpy(fd->ptr, tmp, fd->pack_length());
177
+ if (!match(f.logical, v))
178
+ return (f.type=='F') ? FILTER_SKIP : FILTER_BREAK;
179
+
180
+ }
181
+ return FILTER_MATCH;
182
+ }
183
+
184
+ inline int type(request& req)
185
+ {
186
+ if (req.op == HS_OP_UPDATE_INC) return UPDATE_INC;
187
+ if (req.op == HS_OP_UPDATE_DEC) return UPDATE_DEC;
188
+ return UPDATE_REPLACE;
189
+ }
190
+
191
+ inline int dbExecuter::readAfter(request& req, engine::mysql::table* tb, resultBuffer& buf,changeFunc func)
192
+ {
193
+ int ret = filter(tb, req.table.filters);
194
+ if (ret == FILTER_MATCH)
195
+ {
196
+ if (req.result.offset==0)
197
+ {
198
+ seriarizeRecord(tb, buf, req.result.returnBeforeValue);
199
+ if (func)
200
+ func(req, tb, type(req));
201
+ return READ_SUCCESS;
202
+ }
203
+ --req.result.offset;
204
+ return FILTER_SKIP;
205
+ }
206
+ return ret;
207
+ }
208
+
209
+ inline void setKeyValues(request& req, engine::mysql::table* tb, int index)
210
+ {
211
+ if (req.table.in.keypart >= tb->keyDef(tb->keyNum()).user_defined_key_parts)
212
+ THROW_BZS_ERROR_WITH_MSG("icol");
213
+ tb->clearBuffer();
214
+ if (index != -1)
215
+ tb->setKeyValues(req.table.key.values, req.table.in.keypart, &(req.table.in.values[index]));
216
+ else
217
+ tb->setKeyValues(req.table.key.values, -1);
218
+
219
+ }
220
+
221
+ void dbExecuter::doRecordOperation(request& req, engine::mysql::table* tb, resultBuffer& buf, changeFunc func)
222
+ {
223
+ int count = 0;
224
+ int curInValueIndex = req.table.in.values.size() ? 0: -1;
225
+ int offset = req.result.offset;
226
+ int filterResult = 0;
227
+ seriarizeRecordsetBegin(tb, buf, req.result.returnBeforeValue);
228
+
229
+ setKeyValues(req, tb, curInValueIndex);
230
+ if (curInValueIndex >= 0) ++curInValueIndex;
231
+ tb->seekKey(req.seekFlag());
232
+ if (tb->stat()==0)
233
+ {
234
+ filterResult = readAfter(req, tb, buf, func);
235
+ if (filterResult == READ_SUCCESS) ++count;
236
+ }
237
+ if (((tb->stat()==0) && (filterResult != FILTER_BREAK))
238
+ || (curInValueIndex > -1))
239
+ {
240
+ for (size_t i=1;i<req.result.limit + offset;i++)
241
+ {
242
+ if (curInValueIndex > -1)
243
+ {
244
+ if (curInValueIndex >= req.table.in.values.size())
245
+ break;
246
+ setKeyValues(req, tb, curInValueIndex++);
247
+ tb->seekKey(req.seekFlag());
248
+ }else
249
+ {
250
+ if (req.naviSame())
251
+ tb->getNextSame();
252
+ else if (req.naviForward())
253
+ tb->getNext();
254
+ else
255
+ tb->getPrev();
256
+ }
257
+
258
+ if (tb->stat()) break;
259
+ filterResult = readAfter(req, tb, buf, func);
260
+ if (filterResult == READ_SUCCESS) ++count;
261
+ if (tb->stat() || (filterResult == FILTER_BREAK)) break;
262
+ }
263
+ }
264
+ seriarizeRecordsetEnd(m_tb, buf, count, req.result.returnBeforeValue);
265
+
266
+ }
267
+
268
+ int dbExecuter::commandExec(std::vector<request>& requests, char* result, size_t& size, netsvc::server::buffers* optionalData)
269
+ {
270
+ request& req = requests[0];
271
+ resultBuffer buf(result);
272
+ try
273
+ {
274
+ switch(req.op)
275
+ {
276
+ case HS_OP_QUIT:
277
+ return EXECUTE_RESULT_QUIT;
278
+ case HS_OP_AUTH:
279
+ writeStatus(0, buf, 1);//allways success.
280
+ break;
281
+ case HS_OP_OPEN:
282
+ {
283
+ checkNewHandle(req.handle);
284
+ database* db = getDatabase(req.db.name, 0/*cid*/);
285
+ m_tb = db->openTable(req.table.name, req.table.openMode);
286
+ addHandle(getDatabaseID(0/*cid*/), m_tb->id(), req.handle);
287
+ m_tb = getTable(req.handle);
288
+ m_tb->setUseFieldList(req.table.fields);
289
+ m_tb->setKeyNum(req.table.key.name);
290
+ writeStatus(m_tb->stat(), buf, 1);
291
+ break;
292
+ }
293
+ case HS_OP_INSERT:
294
+ {
295
+ m_tb = getTable(req.handle, SQLCOM_INSERT);
296
+ m_tb->clearBuffer();
297
+ m_tb->setUseValues(req.table.values, 0);
298
+ m_tb->insert(true);
299
+ writeStatus(m_tb->stat(), buf, 1);
300
+ break;
301
+ }
302
+ case HS_OP_UPDATE_INC:
303
+ case HS_OP_UPDATE_DEC:
304
+ case HS_OP_UPDATE:
305
+ {
306
+ m_tb = getTable(req.handle, SQLCOM_UPDATE);
307
+ doRecordOperation(req, m_tb, buf, update);
308
+ break;
309
+ }
310
+ case HS_OP_DELETE:
311
+ {
312
+ m_tb = getTable(req.handle, SQLCOM_UPDATE);
313
+ doRecordOperation(req, m_tb, buf, del);
314
+ break;
315
+ }
316
+ case HS_OP_READ:
317
+ {
318
+ m_tb = getTable(req.handle);
319
+ doRecordOperation(req, m_tb, buf, NULL);
320
+ break;
321
+ }
322
+ }
323
+ if (m_tb)m_tb->unUse();
324
+ size = buf.size();
325
+ return EXECUTE_RESULT_SUCCESS;
326
+ }
327
+
328
+ catch(bzs::rtl::exception &e)
329
+ {
330
+ clenupNoException();
331
+ const std::string* msg = getMsg(e);
332
+ const int* code = getCode(e);
333
+ if(code && msg)
334
+ writeError(*code, buf, msg->c_str());
335
+ else
336
+ {
337
+ if(msg)
338
+ writeError(1, buf, msg->c_str());
339
+ else
340
+ writeError(1, buf, "");
341
+ sql_print_error("%s", boost::diagnostic_information(e).c_str());
342
+ }
343
+ printErrorMessage(code, msg);
344
+ }
345
+
346
+ catch(...)
347
+ {
348
+ clenupNoException();
349
+ writeError(1, buf, "Unknown error.");
350
+ }
351
+ size = buf.size();
352
+ return EXECUTE_RESULT_SUCCESS;
353
+ }
354
+
355
+ // ---------------------------------------------------------------------------
356
+ // class commandExecuter
357
+ // ---------------------------------------------------------------------------
358
+ #define PARSEREAD_START 0
359
+ #define PARSEREAD_COMMAND 1
360
+ #define PARSEREAD_HANDLEID 2
361
+ #define PARSEREAD_SEEKCMD 3
362
+ #define PARSEREAD_DBNAME 4
363
+ #define PARSEREAD_TABLENAME 5
364
+ #define PARSEREAD_INDEXNAME 6
365
+ #define PARSEREAD_FIELDS 7
366
+ #define PARSEREAD_KEYVAL_COUNT 8
367
+ #define PARSEREAD_KEYVAL 9
368
+ #define PARSEREAD_LIMIT 10
369
+ #define PARSEREAD_OFFSET 11
370
+ #define PARSEREAD_DATA_COUNT 12
371
+ #define PARSEREAD_DATA_VAL 13
372
+ #define PARSEREAD_IN_MODE 15
373
+ #define PARSEREAD_IN_KEYPART 16
374
+ #define PARSEREAD_IN_COUNT 17
375
+ #define PARSEREAD_IN_VAL 18
376
+ #define PARSEREAD_FL_TYPE 19
377
+ #define PARSEREAD_FL_LOG 20
378
+ #define PARSEREAD_FL_COL 21
379
+ #define PARSEREAD_FL_VAL 22
380
+
381
+ inline void setHandleID(const std::string& src, int &parseMode, request* req)
382
+ {
383
+ req->handle = (short)atol(src.c_str());
384
+ if (req->op == HS_OP_OPEN)
385
+ parseMode = PARSEREAD_DBNAME;
386
+ else
387
+ parseMode = PARSEREAD_SEEKCMD;
388
+ }
389
+
390
+ inline void setCmd(const std::string& src, int &parseMode, request* req)
391
+ {
392
+ if (src[0] >= '0' && src[0] <= '9')
393
+ return setHandleID(src, parseMode, req);
394
+ else
395
+ req->op = src[0];
396
+ parseMode = PARSEREAD_HANDLEID;
397
+ }
398
+
399
+ inline void setChangeCmd(const std::string& src, int &parseMode, request* req)
400
+ {
401
+ req->op = src[0];
402
+ if (req->table.key.logical && (req->op == HS_OP_INSERT))
403
+ req->op = HS_OP_UPDATE_INC;
404
+ req->result.returnBeforeValue = (src[1] == '?');
405
+ if (req->op == HS_OP_INSERT)
406
+ parseMode = PARSEREAD_DATA_COUNT;
407
+ else
408
+ parseMode = PARSEREAD_DATA_VAL;
409
+ }
410
+
411
+ inline void setSeekCmd(const std::string& src, int &parseMode, request* req)
412
+ {
413
+ if ((src[0] == HS_OP_INSERT)|| (src[0] == HS_OP_UPDATE)|| (src[0] == HS_OP_DELETE))
414
+ return setChangeCmd(src, parseMode, req);
415
+ req->table.key.logical = src[0];
416
+ if ((src.size()>1) && (src[1] == '='))
417
+ req->table.key.logical += 0xff;
418
+ req->result.returnBeforeValue = true;
419
+ parseMode = PARSEREAD_KEYVAL_COUNT;
420
+ }
421
+
422
+ inline void setDbname(const std::string& src, int &parseMode, request* req)
423
+ {
424
+ strncpy(req->db.name, src.c_str(), DEBNAME_SIZE);
425
+
426
+ parseMode = PARSEREAD_TABLENAME;
427
+ }
428
+
429
+ inline void setTablename(const std::string& src, int &parseMode, request* req)
430
+ {
431
+ strncpy(req->table.name, src.c_str(), TABELNAME_SIZE);
432
+ req->table.openMode = TD_OPEN_NORMAL;
433
+ parseMode = PARSEREAD_INDEXNAME;
434
+ }
435
+
436
+ inline void setIndexname(const std::string& src, int &parseMode, request* req)
437
+ {
438
+ strncpy(req->table.key.name, src.c_str(), INDEXNAME_SIZE);
439
+ parseMode = PARSEREAD_FIELDS;
440
+ }
441
+
442
+ inline void setValueCount(const std::string& src, int &parseMode,int &count)
443
+ {
444
+ count = atol(src.c_str());
445
+ }
446
+
447
+ inline void setValue(const std::string& src, int &parseMode, std::vector<std::string>& values,int &count)
448
+ {
449
+ if (count)
450
+ {
451
+ values.push_back(src);
452
+ --count;
453
+ }
454
+ }
455
+
456
+ inline bool setLimit(const std::string& src, int &parseMode, request* req)
457
+ {
458
+ if ((src[0]>='0') && (src[0]<='9'))
459
+ {
460
+ req->result.limit = atol(src.c_str());
461
+ parseMode = PARSEREAD_OFFSET;
462
+ return false;
463
+ }
464
+ parseMode = PARSEREAD_IN_MODE;
465
+ return true;
466
+ }
467
+
468
+ inline void setOffset(const std::string& src, int &parseMode, request* req)
469
+ {
470
+ req->result.offset = atol(src.c_str());
471
+ parseMode = PARSEREAD_IN_MODE;
472
+ }
473
+
474
+ inline void setFields(const std::string& src, int &parseMode, request* req)
475
+ {
476
+ req->table.fields = src;
477
+ parseMode = PARSEREAD_START;
478
+ }
479
+
480
+ inline bool setInMode(const std::string& src, int &parseMode, request* req)
481
+ {
482
+ if (src[0] == '@')
483
+ {
484
+ parseMode = PARSEREAD_IN_KEYPART;
485
+ return false;
486
+ }
487
+ parseMode = PARSEREAD_FL_TYPE;
488
+ return true;
489
+ }
490
+
491
+ inline void setInKeyPart(const std::string& src, int &parseMode, request* req)
492
+ {
493
+ req->table.in.keypart = (short)atol(src.c_str());
494
+ parseMode = PARSEREAD_IN_COUNT;
495
+ }
496
+
497
+ inline bool setFilterType(const std::string& src, int &parseMode, request* req)
498
+ {
499
+ if ((src[0] == 'F') || (src[0] == 'W'))
500
+ {
501
+ request::table::filter f;
502
+ f.type = src[0];
503
+ req->table.filters.push_back(f);
504
+
505
+ parseMode = PARSEREAD_FL_LOG;
506
+ return false;
507
+ }
508
+ parseMode = PARSEREAD_SEEKCMD;
509
+ return true;
510
+ }
511
+
512
+ inline void setFilterLog(const std::string& src, int &parseMode, request* req)
513
+ {
514
+ request::table::filter& f = req->table.filters[req->table.filters.size()-1];
515
+ f.logical = src[0];
516
+ if ((src.size()>1) && (src[1] == '='))
517
+ f.logical += 0xff;
518
+ else if ((src.size()>1) && (src[1] == '>'))
519
+ f.logical += 0xfe;
520
+ parseMode = PARSEREAD_FL_COL;
521
+ }
522
+
523
+ inline void setFilterCol(const std::string& src, int &parseMode, request* req)
524
+ {
525
+ request::table::filter& f = req->table.filters[req->table.filters.size()-1];
526
+ f.col = (short)atol(src.c_str());
527
+ parseMode = PARSEREAD_FL_VAL;
528
+ }
529
+
530
+ inline void setFilterVal(const std::string& src, int &parseMode, request* req)
531
+ {
532
+ request::table::filter& f = req->table.filters[req->table.filters.size()-1];
533
+ f.value = src;
534
+ parseMode = PARSEREAD_FL_TYPE;
535
+ }
536
+
537
+ commandExecuter::commandExecuter(__int64 /*parent*/)
538
+ :m_dbExec(new dbExecuter())
539
+ {
540
+
541
+ }
542
+
543
+ commandExecuter::~commandExecuter()
544
+ {
545
+ m_dbExec.reset();
546
+ }
547
+
548
+ size_t commandExecuter::perseRequestEnd(const char* p, size_t transfered, bool& comp)const
549
+ {
550
+ if (transfered)
551
+ {
552
+ const char* tmp = p + transfered - 1;
553
+ comp = (*tmp=='\n');
554
+ }
555
+ if (!comp && transfered < strlen(p)+10)
556
+ return transfered + 64000;
557
+ return 0;
558
+ }
559
+
560
+ char* readTorkn(std::string& buf, char* src, const char* end)
561
+ {
562
+ buf.erase();
563
+ while(!((*src=='\t') || (*src=='\n')|| (*src=='\r')))
564
+ {
565
+ if (src == end)
566
+ break;
567
+ if (*src == 0x01)
568
+ *(++src) -= 0x040;
569
+ buf.append(1, *src);
570
+ ++src;
571
+ }
572
+ return ++src;
573
+ }
574
+
575
+ bool commandExecuter::parse(const char* ptr, size_t size)
576
+ {
577
+ m_requests.clear();
578
+ char* p = (char*)ptr;
579
+ const char* end = p + size;
580
+ int parseMode = PARSEREAD_START;
581
+ request* req ;
582
+ int keyval_count = 0;
583
+ int data_count = INT_MAX;
584
+ int in_count = 0;
585
+ bool skip = false;
586
+ std::string buf;
587
+ buf.reserve(1024);
588
+ while (p != end)
589
+ {
590
+ if (skip == false)
591
+ p = readTorkn(buf, p, end);
592
+ else
593
+ skip = false;
594
+ if (buf.size() == 0)
595
+ break;
596
+ switch(parseMode)
597
+ {
598
+ case PARSEREAD_START:
599
+ m_requests.push_back(request());
600
+ req = &m_requests[m_requests.size()-1];
601
+ parseMode = PARSEREAD_COMMAND;
602
+ skip = true;
603
+ break;
604
+ case PARSEREAD_COMMAND:
605
+ setCmd(buf, parseMode, req);
606
+ break;
607
+ case PARSEREAD_HANDLEID:
608
+ setHandleID(buf, parseMode, req);
609
+ break;
610
+ case PARSEREAD_SEEKCMD:
611
+ setSeekCmd(buf, parseMode, req);
612
+ break;
613
+ case PARSEREAD_DATA_COUNT:
614
+ setValueCount(buf, parseMode, data_count);
615
+ parseMode = PARSEREAD_DATA_VAL;
616
+ break;
617
+ case PARSEREAD_DATA_VAL:
618
+ setValue(buf, parseMode, req->table.values, data_count);
619
+ if (data_count==0)
620
+ parseMode = PARSEREAD_START;
621
+ break;
622
+ case PARSEREAD_KEYVAL_COUNT:
623
+ setValueCount(buf, parseMode, keyval_count);
624
+ parseMode = PARSEREAD_KEYVAL;
625
+ break;
626
+ case PARSEREAD_KEYVAL:
627
+ setValue(buf, parseMode, req->table.key.values, keyval_count);
628
+ if (keyval_count==0)
629
+ parseMode = PARSEREAD_LIMIT;
630
+ break;
631
+ case PARSEREAD_DBNAME:
632
+ setDbname(buf, parseMode, req);
633
+ break;
634
+ case PARSEREAD_TABLENAME:
635
+ setTablename(buf, parseMode, req);
636
+ break;
637
+ case PARSEREAD_INDEXNAME:
638
+ setIndexname(buf, parseMode, req);
639
+ break;
640
+ case PARSEREAD_FIELDS:
641
+ setFields(buf, parseMode, req);
642
+ break;
643
+ case PARSEREAD_LIMIT:
644
+ skip = setLimit(buf, parseMode, req);
645
+ break;
646
+ case PARSEREAD_OFFSET:
647
+ setOffset(buf, parseMode, req);
648
+ break;
649
+ case PARSEREAD_IN_MODE:
650
+ skip = setInMode(buf, parseMode, req);
651
+ break;
652
+ case PARSEREAD_IN_KEYPART:
653
+ setInKeyPart(buf, parseMode, req);
654
+ break;
655
+ case PARSEREAD_IN_COUNT:
656
+ setValueCount(buf, parseMode, in_count);
657
+ parseMode = PARSEREAD_IN_VAL;
658
+ break;
659
+ case PARSEREAD_IN_VAL:
660
+ setValue(buf, parseMode, req->table.in.values, in_count);
661
+ if (in_count==0)
662
+ parseMode = PARSEREAD_FL_TYPE;
663
+ break;
664
+ case PARSEREAD_FL_TYPE:
665
+ skip = setFilterType(buf, parseMode, req);
666
+ break;
667
+ case PARSEREAD_FL_LOG:
668
+ setFilterLog(buf, parseMode, req);
669
+ break;
670
+ case PARSEREAD_FL_COL:
671
+ setFilterCol(buf, parseMode, req);
672
+ parseMode = PARSEREAD_FL_VAL;
673
+ break;
674
+ case PARSEREAD_FL_VAL:
675
+ setFilterVal(buf, parseMode, req);
676
+ break;
677
+ }
678
+
679
+ }
680
+ return !(m_requests.size()==0);
681
+ }
682
+
683
+
684
+ }//namespace hs
685
+ }//namespace protocol
686
+ }//namespace db
687
+ }//namespace bzs
688
+
689
+ #endif // USE_HANDLERSOCKET