transactd 1.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 (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