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,1020 @@
1
+ /*=================================================================
2
+ Copyright (C) 2012 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
+
20
+ #include "tdapCommandExecuter.h"
21
+ #include "recordsetReader.h"
22
+ #include <bzs/db/blobBuffer.h>
23
+ #include <bzs/db/engine/mysql/database.h>
24
+ #include <bzs/db/engine/mysql/errorMessage.h>
25
+ #include <bzs/db/engine/mysql/mydebuglog.h>
26
+ #include <bzs/netsvc/server/IAppModule.h> //lookup for result value
27
+ #include <bzs/rtl/stl_uty.h>
28
+ #include <limits.h>
29
+ #include <boost/algorithm/string.hpp>
30
+ #ifdef WIN32
31
+ #include <mbstring.h>
32
+ #endif
33
+ #include "databaseSchema.h"
34
+ #include <bzs/db/transactd/connManager.h>
35
+ #include <bzs/rtl/exception.h>
36
+
37
+
38
+ namespace bzs
39
+ {
40
+ namespace db
41
+ {
42
+
43
+ using namespace engine::mysql;
44
+
45
+ namespace protocol
46
+ {
47
+ using namespace transactd;
48
+ using namespace transactd::connection;
49
+ namespace tdap
50
+ {
51
+ namespace mysql
52
+ {
53
+
54
+ static const char* TableNameTitle = "dbfile=";
55
+ static const char* BdfNameTitle = ".bdf";
56
+
57
+ std::string getDatabaseName(const request& req, bool forSql)
58
+ {
59
+ std::vector<std::string> ssc ;
60
+ std::vector<std::string> ss ;
61
+ if (req.keybuf)
62
+ {
63
+ std::string s((const char*)req.keybuf);
64
+ split(ssc, s, "\t");
65
+ if (ssc.size())
66
+ {
67
+ if (forSql && ssc.size()>1)
68
+ ssc.erase(ssc.begin(), ssc.begin()+1);
69
+ std::string path = ssc[0];
70
+ std::string derim = "/";
71
+ split(ss, path, derim); /* tdap://serverName/dbName?dbfile=xxx */
72
+ if (ss.size()>3)
73
+ {
74
+ std::vector<std::string> db;
75
+ split(db, ss[3], "?");
76
+ if (db.size()>0)
77
+ return db[0];
78
+ }
79
+ }
80
+ }
81
+ return "";
82
+ }
83
+
84
+ std::string getTableName(const std::string& src, bool forSql)
85
+ {
86
+ std::vector<std::string> ssc ;
87
+ split(ssc, src, "\t");
88
+ if (forSql && ssc.size()>1)
89
+ ssc.erase(ssc.begin(), ssc.begin()+1);
90
+
91
+ std::string name = ssc[0];
92
+ size_t pos = name.find(TableNameTitle);
93
+ if (pos != std::string::npos)
94
+ {
95
+ pos += strlen(TableNameTitle);
96
+ while ((name[pos] == '/')||(name[pos] == '\\'))
97
+ {
98
+ if (++pos == name.size())
99
+ return "";
100
+ }
101
+ size_t pos2 = name.find("." , pos);
102
+ if (pos2 == std::string::npos)
103
+ pos2 = name.size();
104
+ size_t pos3 = name.find("&" , pos);
105
+ if (pos3 != std::string::npos && (pos3 < pos2))
106
+ pos2 = pos3;
107
+
108
+ name = name.substr(pos, pos2 - pos);
109
+ if (g_tableNmaeLower)
110
+ boost::algorithm::to_lower(name);
111
+ return name;
112
+ }
113
+
114
+ return "";
115
+ }
116
+
117
+ std::string getTableName(const request& req, bool forSql)
118
+ {
119
+
120
+ if (req.keybuf)
121
+ {
122
+ std::string s((const char*)req.keybuf, req.keylen);
123
+ return getTableName(s, forSql);
124
+ }
125
+ return "";
126
+ }
127
+
128
+ void dumpStdErr(int op, request& req, table* tb)
129
+ {
130
+ boost::scoped_array<char> msg(new char[1024]);
131
+
132
+
133
+ sprintf_s(msg.get(),1024, "[Transactd] Exception:op=%d Handle=%d tablename=%s datalen=%d"
134
+ " keynum=%d keylen=%d \n"
135
+ , op, req.pbk->handle
136
+ , tb ? tb->name().c_str() : ""
137
+ , *req.datalen
138
+ , req.keyNum, req.keylen);
139
+ sql_print_error("%s", msg.get());
140
+ //dump Keybuf
141
+ if (req.keylen && req.keybuf)
142
+ {
143
+ sprintf_s(msg.get(),1024,"[Transactd] Dump key buffer\n");
144
+ sql_print_error("%s",msg.get());
145
+ char* p = (char*)req.keybuf;
146
+ bzs::rtl::debuglog::dump(stderr, (char*)req.keybuf, req.keylen, 256);
147
+ }
148
+ //dump databuffer
149
+ if (*req.datalen && req.data)
150
+ {
151
+ sprintf_s(msg.get(),1024, "[Transactd] Dump data buffer\n");
152
+ sql_print_error("%s",msg.get());
153
+ bzs::rtl::debuglog::dump(stderr, (char*)req.data, (int)*req.datalen, 256);
154
+ }
155
+ }
156
+
157
+ //-------------------------------------------------------------
158
+ // class dbExecuter
159
+ //-------------------------------------------------------------
160
+
161
+ dbExecuter::dbExecuter():dbManager(),m_readHandler(new ReadRecordsHandler())
162
+ ,m_blobBuffer(new blobBuffer())
163
+ {
164
+
165
+ }
166
+
167
+ dbExecuter::~dbExecuter()
168
+ {
169
+ delete m_blobBuffer;
170
+ delete m_readHandler;
171
+ }
172
+
173
+ void dbExecuter::connect(request& req)
174
+ {
175
+ req.paramMask = 0;
176
+ if (req.keyNum == LG_SUBOP_DISCONNECT)
177
+ releaseDatabse(req.cid);
178
+ else
179
+ {
180
+ std::string dbname = getDatabaseName(req);
181
+ std::string dbSqlname = getDatabaseName(req, FOR_SQL);
182
+ //exec SQL use database
183
+ if (dbname != "")
184
+ {
185
+ database* db = getDatabase(dbname.c_str(), req.cid);
186
+ dbSqlname.insert(0, "use ");
187
+ req.result = ddl_execSql(db->thd(), dbSqlname);
188
+ }
189
+ }
190
+
191
+ }
192
+
193
+ void dbExecuter::releaseDatabase(request& req, int op)
194
+ {
195
+ req.paramMask = 0;
196
+ if ((op == TD_RESET_CLIENT)&&(req.keyNum !=0))
197
+ req.result = 1;
198
+ else
199
+ releaseDatabse(req.cid);
200
+ }
201
+
202
+ std::string dbExecuter::makeSQLcreateTable(const request& req)
203
+ {
204
+ return (const char*)req.data;
205
+ //return sql;
206
+ }
207
+
208
+ int dbExecuter::errorCode(int ha_error)
209
+ {//see mysqld_error.h or my_base.h or dbManager.h
210
+
211
+ if (ha_error < HA_ERR_FIRST)
212
+ return ha_error;
213
+ else if (ha_error==HA_ERR_KEY_NOT_FOUND)
214
+ return STATUS_NOT_FOUND_TI;
215
+ else if (ha_error == HA_ERR_END_OF_FILE)
216
+ return STATUS_EOF;
217
+ else if (ha_error == HA_ERR_FOUND_DUPP_KEY)
218
+ return STATUS_DUPPLICATE_KEYVALUE;
219
+ else if(ha_error == HA_ERR_CRASHED_ON_USAGE)
220
+ return STATUS_IO_ERROR;
221
+ else if (ha_error ==HA_ERR_NO_ACTIVE_RECORD)
222
+ return STATUS_NO_CURRENT;
223
+ else if ((ha_error == HA_ERR_LOCK_WAIT_TIMEOUT)
224
+ ||(ha_error==HA_ERR_LOCK_DEADLOCK)||(ha_error == ER_LOCK_WAIT_TIMEOUT))
225
+ return STATUS_LOCK_ERROR;
226
+ else if (ha_error == STATUS_INVALID_LOCKTYPE)
227
+ return STATUS_INVALID_LOCKTYPE;
228
+ else if(ha_error==HA_ERR_AUTOINC_ERANGE)
229
+ return STATUS_DUPPLICATE_KEYVALUE;
230
+ else if (ha_error==ER_PARSE_ERROR)
231
+ return STATUS_CANT_CREATE;
232
+ else if(ha_error == ER_TABLE_EXISTS_ERROR)
233
+ return STATUS_TABLE_EXISTS_ERROR;
234
+ else if (ha_error == DBM_ERROR_TABLE_USED)
235
+ return STATUS_CANNOT_LOCK_TABLE;
236
+ return 25000 + ha_error;
237
+
238
+ }
239
+
240
+ bool isMetaDb(const request& req)
241
+ {
242
+
243
+ char buf[MAX_PATH];
244
+ strncpy(buf, (char*)req.keybuf, MAX_PATH);
245
+ _strlwr(buf);
246
+ char_m* st = _mbsstr((char_m*)buf, (char_m*)BdfNameTitle);
247
+ if (st==NULL)
248
+ st = (char_m*)strstr(buf, TRANSACTD_SCHEMANAME);
249
+ return (st != NULL);
250
+ }
251
+
252
+ inline void dbExecuter::doCreateTable(request& req)
253
+ {
254
+ // if table name is mata table and database is nothing
255
+ // then cretate database too.
256
+ std::string dbname = getDatabaseName(req);
257
+ std::string dbSqlname = getDatabaseName(req, FOR_SQL);
258
+ if (dbname != "")
259
+ {
260
+ std::string cmd;
261
+ database* db = getDatabase(dbname.c_str(), req.cid);
262
+
263
+ if (isMetaDb(req))
264
+ {//for database operation
265
+ if ((req.keyNum == 0) && (db->existsDatabase()==false))
266
+ req.result = ddl_createDataBase(db->thd(), dbSqlname);
267
+ else if (req.keyNum == CR_SUBOP_DROP)
268
+ {
269
+ std::string tableName = getTableName(req);
270
+ if (db->existsTable(tableName))
271
+ req.result = ddl_dropTable(db, tableName, dbSqlname, getTableName(req, FOR_SQL));
272
+ if (req.result == 0)
273
+ req.result = ddl_dropDataBase(db->thd(), dbname, dbSqlname);
274
+ req.result = errorCodeSht(req.result);
275
+ return;
276
+ }
277
+ }
278
+ if (req.result==0)
279
+ {//table operation
280
+ if ((req.result = ddl_useDataBase(db->thd(), dbSqlname))==0)
281
+ {
282
+ std::string tableSqlName = getTableName(req, FOR_SQL);
283
+ std::string tableName = getTableName(req);
284
+ if (req.keyNum == CR_SUBOP_DROP)// -128 is delete
285
+ {
286
+
287
+ if (db->existsTable(tableName))
288
+ req.result = ddl_dropTable(db, tableName, dbSqlname, tableSqlName);
289
+ }
290
+ else if (req.keyNum == CR_SUBOP_RENAME)
291
+ {//rename new is keybuf
292
+ request reqold;
293
+ reqold.keybuf = req.data;
294
+ reqold.keylen = *req.datalen;
295
+ req.result = ddl_renameTable(db
296
+ , getTableName(reqold)/*oldname*/
297
+ , dbSqlname
298
+ , getTableName(reqold, FOR_SQL)/*oldname*/
299
+ , tableSqlName/*newName*/);
300
+
301
+ }
302
+ else if (req.keyNum == CR_SUBOP_SWAPNAME)
303
+ {//swap name name2 = keybuf
304
+ request reqold;
305
+ reqold.keybuf = req.data;
306
+ reqold.keylen = *req.datalen;
307
+ req.result = ddl_replaceTable(db
308
+ , getTableName(reqold)/*oldname*/
309
+ , tableName /*newName*/
310
+ , dbSqlname
311
+ , getTableName(reqold, FOR_SQL)/*oldname*/
312
+ , tableSqlName /*newName*/);
313
+
314
+ }
315
+ else
316
+ {//create
317
+ if (req.data==NULL)
318
+ req.result = 1;
319
+ else
320
+ { //-1 is overwrite
321
+ if ((req.keyNum == CR_SUB_FLAG_EXISTCHECK) && (db->existsTable(tableName)))
322
+ req.result = ddl_dropTable(db, tableName, dbSqlname, tableSqlName);
323
+ if (req.result == 0)
324
+ req.result = ddl_execSql(db->thd(), makeSQLcreateTable(req));
325
+ }
326
+ }
327
+ }
328
+ }
329
+ }
330
+ else
331
+ req.result = 1;
332
+ req.result = errorCodeSht(req.result);
333
+ }
334
+
335
+ //open table and assign handle
336
+ inline void dbExecuter::doOpenTable(request& req)
337
+ {
338
+ std::string dbname = getDatabaseName(req);
339
+ if (dbname != "")
340
+ {
341
+ database* db = getDatabase(dbname.c_str(), req.cid);
342
+ m_tb = db->openTable(getTableName(req), req.keyNum);// if error occured that throw exception
343
+ req.result = db->stat();
344
+ if (m_tb)
345
+ {
346
+ req.pbk->handle = addHandle(getDatabaseID(req.cid), m_tb->id());
347
+ m_tb = getTable(req.pbk->handle);
348
+ m_tb->setBlobBuffer(m_blobBuffer);
349
+ req.paramMask = P_MASK_POSBLK;
350
+ }
351
+ }
352
+ else
353
+ req.result = 1;
354
+ }
355
+
356
+ inline void readAfter(request& req, table* tb, dbExecuter* dbm)
357
+ {
358
+ if (tb->stat()==0)
359
+ {
360
+ if ((req.op>=TD_KEY_EQUAL_KO)&& (req.op <= TD_KEY_LAST_KO))
361
+ req.paramMask = P_MASK_POSBLK;
362
+ else
363
+ {
364
+ req.paramMask = P_MASK_READRESULT;
365
+ if (tb->blobFields())
366
+ req.paramMask |=P_MASK_BLOBBODY;
367
+ req.data = tb->record();
368
+ }
369
+ }
370
+ req.result = dbm->errorCodeSht(tb->stat());
371
+ }
372
+
373
+ inline void dbExecuter::doSeekKey(request& req, int op)
374
+ {
375
+ bool read = true;
376
+ m_tb = getTable(req.pbk->handle);
377
+ if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
378
+ {
379
+ m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
380
+ if (read)
381
+ {
382
+ ha_rkey_function flag;
383
+ if (op == TD_KEY_SEEK)
384
+ flag = HA_READ_KEY_EXACT;
385
+ else if (op == TD_KEY_AFTER)
386
+ flag = HA_READ_AFTER_KEY;
387
+ else if (op == TD_KEY_OR_AFTER)
388
+ flag = HA_READ_KEY_OR_NEXT;
389
+ else if (op == TD_KEY_BEFORE)
390
+ flag = HA_READ_BEFORE_KEY;
391
+ else if (op == TD_KEY_OR_BEFORE)
392
+ flag = HA_READ_KEY_OR_PREV;
393
+ m_tb->seekKey(flag);
394
+ }
395
+ }
396
+ readAfter(req, m_tb, this);
397
+ }
398
+
399
+ inline void dbExecuter::doMoveFirst(request& req)
400
+ {
401
+ m_tb = getTable(req.pbk->handle);
402
+ if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
403
+ {
404
+ if (m_tb->isNisKey(m_tb->keyNum()))
405
+ {
406
+ m_tb->clearKeybuf();
407
+ m_tb->seekKey(HA_READ_KEY_OR_NEXT);
408
+ }else
409
+ m_tb->getFirst();
410
+ }
411
+ readAfter(req, m_tb, this);
412
+ }
413
+
414
+ inline void dbExecuter::doMoveKey(request& req, int op)
415
+ {
416
+ m_tb = getTable(req.pbk->handle);
417
+ if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
418
+ {
419
+ if (op== TD_KEY_FIRST)
420
+ m_tb->getFirst();
421
+ else if (op== TD_KEY_LAST)
422
+ m_tb->getLast();
423
+ else if (op== TD_KEY_NEXT)
424
+ m_tb->getNext();
425
+ else if (op== TD_KEY_PREV)
426
+ m_tb->getPrev();
427
+ }
428
+ readAfter(req, m_tb, this);
429
+ }
430
+
431
+ inline int dbExecuter::doReadMultiWithSeek(request& req, int op, char* resultBuffer
432
+ , size_t& size, netsvc::server::buffers* optionalData)
433
+ {
434
+ int ret = 1;
435
+ m_tb = getTable(req.pbk->handle);
436
+ char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
437
+ if (m_tb->setKeyNum(keynum))
438
+ {
439
+ m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
440
+ m_tb->seekKey((op == TD_KEY_GE_NEXT_MULTI) ? HA_READ_KEY_OR_NEXT : HA_READ_KEY_OR_PREV);
441
+
442
+ extRequest* ereq = (extRequest*)req.data;
443
+ req.result = m_readHandler->begin(m_tb, ereq, resultBuffer, RETBUF_EXT_RESERVE_SIZE, *req.datalen);
444
+ if (req.result != 0)
445
+ return 1;
446
+ if (m_tb->stat() == 0)
447
+ {
448
+ if (op == TD_KEY_GE_NEXT_MULTI)
449
+ m_tb->getNextExt(m_readHandler, true);
450
+ else if (op == TD_KEY_LE_PREV_MULTI)
451
+ m_tb->getPrevExt(m_readHandler, true);
452
+ }
453
+ req.result = errorCodeSht(m_tb->stat());
454
+ DEBUG_WRITELOG2(op, req);
455
+ size = req.serializeForExt(m_tb, resultBuffer, m_readHandler->end());
456
+ if ((req.paramMask & P_MASK_BLOBBODY) && m_blobBuffer->fieldCount())
457
+ size = req.serializeBlobBody(m_blobBuffer, resultBuffer, FILE_MAP_SIZE, optionalData);
458
+
459
+ DEBUG_PROFILE_END_OP(1, op)
460
+ ret = EXECUTE_RESULT_SUCCESS;
461
+
462
+ }
463
+ if (m_tb)m_tb->unUse();
464
+ return ret;
465
+ }
466
+
467
+ inline int dbExecuter::doReadMulti(request& req, int op, char* resultBuffer
468
+ , size_t& size, netsvc::server::buffers* optionalData)
469
+ {
470
+ int ret = 1;
471
+ m_tb = getTable(req.pbk->handle);
472
+ extRequest* ereq = (extRequest*)req.data;
473
+ bool incCurrent = !((ereq->type[0]=='E') && (ereq->type[1]=='G'));
474
+ req.result = m_readHandler->begin(m_tb, ereq, resultBuffer, RETBUF_EXT_RESERVE_SIZE, *req.datalen);
475
+ if (req.result == 0)
476
+ {
477
+ if (op == TD_KEY_NEXT_MULTI)
478
+ m_tb->getNextExt(m_readHandler, incCurrent);
479
+ else if (op == TD_KEY_PREV_MULTI)
480
+ m_tb->getPrevExt(m_readHandler, incCurrent);
481
+ else if (op == TD_POS_NEXT_MULTI)
482
+ m_tb->stepNextExt(m_readHandler, incCurrent);
483
+ else if (op == TD_POS_PREV_MULTI)
484
+ m_tb->stepPrevExt(m_readHandler, incCurrent);
485
+ req.result = errorCodeSht(m_tb->stat());
486
+ DEBUG_WRITELOG2(op, req);
487
+ size = req.serializeForExt(m_tb, resultBuffer, m_readHandler->end());
488
+ if ((req.paramMask & P_MASK_BLOBBODY) && m_blobBuffer->fieldCount())
489
+ size = req.serializeBlobBody(m_blobBuffer, resultBuffer, FILE_MAP_SIZE, optionalData);
490
+
491
+ DEBUG_PROFILE_END_OP(1, op)
492
+
493
+ ret = EXECUTE_RESULT_SUCCESS;
494
+ }
495
+ if (m_tb)m_tb->unUse();
496
+ return ret;
497
+ }
498
+
499
+ inline void dbExecuter::doStepRead(request& req, int op)
500
+ {
501
+ m_tb = getTable(req.pbk->handle);
502
+ if (op == TD_POS_FIRST)
503
+ m_tb->stepFirst();
504
+ else if (op == TD_POS_LAST)
505
+ m_tb->stepLast();
506
+ else if (op == TD_POS_NEXT)
507
+ m_tb->stepNext();
508
+ else if (op == TD_POS_PREV)
509
+ m_tb->stepPrev();
510
+ readAfter(req, m_tb, this);
511
+ }
512
+
513
+ inline void dbExecuter::doInsert(request& req)
514
+ {
515
+ m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
516
+ bool ncc = (req.keyNum==-1);
517
+ if (!ncc)
518
+ {
519
+ if (!m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
520
+ {
521
+ req.result = errorCodeSht(m_tb->stat());
522
+ return;
523
+ }
524
+ }
525
+ m_tb->clearBuffer();
526
+ m_tb->setRecordFromPacked((const uchar*)req.data, *(req.datalen), req.blobHeader);
527
+ smartBulkInsert sbi(m_tb, 1);
528
+ __int64 aincValue = m_tb->insert(ncc);
529
+ req.result = errorCodeSht(m_tb->stat());
530
+ if (aincValue)
531
+ {
532
+ req.paramMask = P_MASK_INS_AUTOINC;
533
+ req.data = m_tb->record();
534
+ }
535
+ else
536
+ req.paramMask = P_MASK_POSBLK|P_MASK_KEYBUF;
537
+ }
538
+
539
+ inline void dbExecuter::doUpdateKey(request& req)
540
+ {
541
+ m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
542
+ char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
543
+ if (m_tb->setKeyNum(keynum))
544
+ {
545
+ m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
546
+ m_tb->seekKey(HA_READ_KEY_EXACT);
547
+ if (m_tb->stat() == 0)
548
+ {
549
+ m_tb->beginUpdate(keynum);
550
+ if (m_tb->stat()==0)
551
+ {
552
+ m_tb->setRecordFromPacked((const uchar*)req.data, *(req.datalen), req.blobHeader);
553
+ m_tb->update(true);
554
+ }
555
+ }
556
+ }
557
+ req.result = errorCodeSht(m_tb->stat());
558
+ req.paramMask = P_MASK_POSBLK|P_MASK_KEYBUF;
559
+
560
+ }
561
+
562
+ inline void dbExecuter::doUpdate(request& req)
563
+ {
564
+ m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
565
+ bool ncc = (req.keyNum==-1);
566
+ m_tb->beginUpdate(req.keyNum);
567
+ if (m_tb->stat()==0)
568
+ {
569
+ m_tb->setRecordFromPacked((const uchar*)req.data, *(req.datalen), req.blobHeader);
570
+ m_tb->update(ncc);
571
+ }
572
+ req.result = errorCodeSht(m_tb->stat());
573
+ req.paramMask = P_MASK_POSBLK|P_MASK_KEYBUF;
574
+ }
575
+
576
+ inline void dbExecuter::doDeleteKey(request& req)
577
+ {
578
+ m_tb = getTable(req.pbk->handle, SQLCOM_DELETE);
579
+ char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
580
+ if (m_tb->setKeyNum(keynum))
581
+ {
582
+ m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
583
+ m_tb->seekKey(HA_READ_KEY_EXACT);
584
+ if (m_tb->stat() == 0)
585
+ {
586
+ m_tb->beginDel();
587
+ if (m_tb->stat()==0)
588
+ m_tb->del();
589
+ }
590
+ }
591
+ req.result = errorCodeSht(m_tb->stat());
592
+ req.paramMask = P_MASK_POSBLK;
593
+ }
594
+
595
+ inline void dbExecuter::doDelete(request& req)
596
+ {
597
+ m_tb = getTable(req.pbk->handle, SQLCOM_DELETE);
598
+ m_tb->beginDel();
599
+ if (m_tb->stat()==0)
600
+ m_tb->del();
601
+ req.result = errorCodeSht(m_tb->stat());
602
+ req.paramMask = P_MASK_POSBLK;
603
+ }
604
+
605
+ inline void dbExecuter::doInsertBulk(request& req)
606
+ {
607
+ m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
608
+ if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
609
+ {
610
+ ushort_td* n = (ushort_td*)req.data;
611
+ ushort_td ret = 0;
612
+ const uchar* pos = (const uchar*)req.data + sizeof(ushort_td);
613
+ int ins_rows = 0;
614
+ BUILINSERT_SCOPE
615
+ {
616
+ smartBulkInsert sbi(m_tb, *n);
617
+ for (ushort_td i=0;i<*n;i++)
618
+ {
619
+ ushort_td len = *((ushort_td*)pos);
620
+ if (pos + len > (const uchar*)req.data + *req.datalen)
621
+ {
622
+ ret = STATUS_BUFFERTOOSMALL;
623
+ break;
624
+ }
625
+ else
626
+ {
627
+ m_tb->clearBuffer();
628
+ m_tb->setRecordFromPacked(pos + sizeof(ushort_td), len, req.blobHeader);
629
+
630
+ if (i==*n-1)
631
+ m_tb->insert((req.keyNum != -1));
632
+ else
633
+ m_tb->insert(true);
634
+ ret = m_tb->stat();
635
+
636
+ }
637
+ if (ret==0)
638
+ ins_rows++;
639
+ DEBUG_INSERT(m_tb, pos + sizeof(ushort_td), len, i, i+1-ins_rows)
640
+ pos += len + sizeof(ushort_td);
641
+ }
642
+ *n = ins_rows;
643
+ }
644
+ req.result = errorCodeSht(ret);
645
+ req.resultLen = 4;
646
+ req.paramMask = P_MASK_READ_EXT;
647
+ }else
648
+ req.result = errorCodeSht(m_tb->stat());
649
+ }
650
+
651
+ inline void dbExecuter::doStat(request& req)
652
+ {
653
+ m_tb = getTable(req.pbk->handle);
654
+ req.paramMask = P_MASK_STAT;
655
+ req.resultLen = *req.datalen;
656
+ if (req.resultLen >= 6 + sizeof(uint))
657
+ {
658
+ ushort_td len = (ushort_td)(m_tb->recordLenCl());
659
+ if (m_tb->recordFormatType() == RF_FIXED_PLUS_VALIABLE_LEN)
660
+ len -= m_tb->lastVarFiled()->pack_length() - m_tb->lastVarLenBytes();
661
+
662
+ memcpy((char*)req.data, &len, sizeof(ushort_td));
663
+ uint rows = (uint)m_tb->recordCount((req.keyNum!=0));
664
+ memcpy((char*)req.data+6, &rows, sizeof(uint));
665
+ }else
666
+ req.result = STATUS_BUFFERTOOSMALL;
667
+ }
668
+
669
+ inline short getTrnsactionType(int op)
670
+ {
671
+ if (op > PARALLEL_TRN) //1000
672
+ op -= PARALLEL_TRN;
673
+ if (op > NOWAIT_WRITE) //500
674
+ op -= NOWAIT_WRITE;
675
+ if (op >= 300)
676
+ return TRN_RECORD_LOCK_MUILTI;
677
+ return TRN_RECORD_LOCK_SINGLE;
678
+ }
679
+
680
+ int dbExecuter::commandExec(request& req, char* resultBuffer, size_t& size, netsvc::server::buffers* optionalData)
681
+ {
682
+ DEBUG_PROFILE_START(1)
683
+ m_tb = NULL;
684
+ int op = req.op % 100;
685
+ int opTrn = req.op;
686
+ if (op==99) return 0;
687
+
688
+ if ((op>=TD_KEY_EQUAL_KO)&& (op <= TD_KEY_LAST_KO))
689
+ op -= 50;
690
+
691
+ try
692
+ {
693
+ posblk* pbk = req.pbk;
694
+ posblk tmp;
695
+ bool transactionResult = false;
696
+ if (pbk==NULL) pbk = &tmp;
697
+ req.reset();
698
+ switch(op)
699
+ {
700
+ case TD_GETSERVER_CHARSET:
701
+ req.data = (void*) global_system_variables.collation_server->csname;
702
+ req.resultLen = (uint_td)strlen( global_system_variables.collation_server->csname);
703
+ req.paramMask |= P_MASK_DATA|P_MASK_DATALEN;
704
+ break;
705
+ case TD_CONNECT:
706
+ connect(req);
707
+ break;
708
+ case TD_RESET_CLIENT:
709
+ case TD_STOP_ENGINE: //close all table
710
+ releaseDatabase(req, op);
711
+ break;
712
+ case TD_AUTOMEKE_SCHEMA:
713
+ m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
714
+ req.result = schemaBuilder().execute(getDatabaseCid(req.cid), m_tb);
715
+ break;
716
+ case TD_CREATETABLE:
717
+ doCreateTable(req);
718
+ break;
719
+ case TD_OPENTABLE:
720
+ doOpenTable(req);
721
+ break;
722
+ case TD_CLOSETABLE:
723
+ m_tb = getTable(req.pbk->handle);
724
+ if (m_tb)
725
+ {
726
+ m_tb->close();
727
+ m_tb=NULL;
728
+ }
729
+ break;
730
+ case TD_KEY_SEEK:
731
+ case TD_KEY_AFTER:
732
+ case TD_KEY_OR_AFTER:
733
+ case TD_KEY_BEFORE:
734
+ case TD_KEY_OR_BEFORE:
735
+ doSeekKey(req, op);
736
+ break;
737
+ case TD_KEY_FIRST:
738
+ doMoveFirst(req);
739
+ break;
740
+ case TD_KEY_PREV:
741
+ case TD_KEY_LAST:
742
+ case TD_KEY_NEXT:
743
+ doMoveKey(req, op);
744
+ break;
745
+ case TD_REC_INSERT:
746
+ doInsert(req);
747
+ break;
748
+ case TD_REC_UPDATEATKEY:
749
+ doUpdateKey(req);
750
+ break;
751
+ case TD_REC_UPDATE:
752
+ doUpdate(req);
753
+ break;
754
+ case TD_REC_DELLETEATKEY:
755
+ doDeleteKey(req);
756
+ break;
757
+ case TD_REC_DELETE:
758
+ doDelete(req);
759
+ break;
760
+ case TD_BEGIN_TRANSACTION:
761
+ transactionResult = getDatabaseCid(req.cid)->beginTrn(getTrnsactionType(opTrn));
762
+ break;
763
+ case TD_END_TRANSACTION:
764
+ transactionResult = getDatabaseCid(req.cid)->commitTrn();
765
+ break;
766
+ case TD_ABORT_TRANSACTION:
767
+ transactionResult = getDatabaseCid(req.cid)->abortTrn();
768
+ break;
769
+ case TD_BEGIN_SHAPSHOT:
770
+ transactionResult = getDatabaseCid(req.cid)->beginSnapshot();
771
+ break;
772
+ case TD_END_SNAPSHOT:
773
+ transactionResult = getDatabaseCid(req.cid)->endSnapshot();
774
+ break;
775
+ case TD_TABLE_INFO: //support recordlen and recordCount only.
776
+ doStat(req);
777
+ break;
778
+ case TD_POS_FIRST:
779
+ case TD_POS_LAST:
780
+ case TD_POS_NEXT:
781
+ case TD_POS_PREV:
782
+ doStepRead(req, op);
783
+ break;
784
+ case TD_BOOKMARK:
785
+ m_tb = getTable(req.pbk->handle);
786
+ req.paramMask = P_MASK_MOVPOS;
787
+ req.data = (void*)m_tb->position();
788
+ req.resultLen = m_tb->posPtrLen();
789
+ break;
790
+ case TD_MOVE_BOOKMARK:
791
+ m_tb = getTable(req.pbk->handle);
792
+ m_tb->movePos((uchar*)req.data, m_tb->keyNumByMakeOrder(req.keyNum));
793
+ readAfter(req, m_tb, this);
794
+ break;
795
+ case TD_GETDIRECTORY:
796
+ {
797
+ database* db = getDatabaseCid(req.cid);
798
+ if (db->name().size() < 64)
799
+ {
800
+ req.keylen = (uchar_td)db->name().size()+1;
801
+ req.keybuf = (void*)db->name().c_str();
802
+ req.paramMask = P_MASK_KEYBUF;
803
+
804
+ }else
805
+ req.result = STATUS_BUFFERTOOSMALL;
806
+ break;
807
+ }
808
+ case TD_VERSION:
809
+ if (*req.datalen >= sizeof(version)*3)
810
+ {
811
+ version* v = (version*)req.data;
812
+ ++v;
813
+ v->majorVersion = MYSQL_VERSION_ID/10000;
814
+ v->minorVersion = (MYSQL_VERSION_ID/100) % 100;
815
+ v->Type = 'M';
816
+ ++v;
817
+ v->majorVersion = TRANSACTD_VER_MAJOR;
818
+ v->minorVersion = TRANSACTD_VER_MINOR;
819
+ v->Type = 'T';
820
+ req.paramMask = P_MASK_DATA|P_MASK_DATALEN;
821
+ req.resultLen = sizeof(version)*3;
822
+ }else
823
+ req.result = STATUS_BUFFERTOOSMALL;
824
+ break;
825
+ case TD_CLEAR_OWNERNAME:
826
+ req.keybuf = (void_td*)"";
827
+ case TD_SET_OWNERNAME:
828
+ {
829
+ database* db = getDatabaseCid(req.cid);
830
+ m_tb = getTable(req.pbk->handle);
831
+ req.result = ddl_execSql(db->thd(), makeSQLChangeTableComment(db->name(), m_tb->name(), (const char*)req.keybuf));
832
+ break;
833
+ }
834
+ case TD_DROP_INDEX:
835
+ { //Key name of multi byte charctord is not supported. Use only ascii.
836
+ database* db = getDatabaseCid(req.cid);
837
+ m_tb = getTable(req.pbk->handle);
838
+ req.result = ddl_execSql(db->thd(), makeSQLDropIndex(db->name(), m_tb->name(), m_tb->keyName(m_tb->keyNumByMakeOrder(req.keyNum))));
839
+ break;
840
+ }
841
+ case TD_KEY_GE_NEXT_MULTI:
842
+ case TD_KEY_LE_PREV_MULTI:
843
+ if (doReadMultiWithSeek(req, op, resultBuffer, size, optionalData) == EXECUTE_RESULT_SUCCESS)
844
+ return EXECUTE_RESULT_SUCCESS; // Caution Call unUse()
845
+ break;
846
+ case TD_KEY_NEXT_MULTI:
847
+ case TD_KEY_PREV_MULTI:
848
+ case TD_POS_NEXT_MULTI:
849
+ case TD_POS_PREV_MULTI:
850
+ if (doReadMulti(req, op, resultBuffer, size, optionalData) == EXECUTE_RESULT_SUCCESS)
851
+ return EXECUTE_RESULT_SUCCESS; // Caution Call unUse()
852
+ break;
853
+ case TD_MOVE_PER:
854
+ m_tb = getTable(req.pbk->handle);
855
+ if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
856
+ m_tb->getByPercentage(*((ushort_td*)req.data));
857
+ readAfter(req, m_tb, this);
858
+ break;
859
+ case TD_GET_PER:
860
+ m_tb = getTable(req.pbk->handle);
861
+ m_tb->calcPercentage();
862
+ req.result = errorCodeSht(m_tb->stat());
863
+ if (m_tb->stat()==0)
864
+ {
865
+ req.paramMask = P_MASK_DATA|P_MASK_DATALEN;
866
+ req.data = m_tb->percentResult();
867
+ req.resultLen = sizeof(int);
868
+ }
869
+ break;
870
+ case TD_INSERT_BULK:
871
+ doInsertBulk(req);
872
+ break;
873
+ }
874
+ if (m_tb)m_tb->unUse();
875
+
876
+ DEBUG_WRITELOG2(op, req)
877
+ size = req.serialize(m_tb, resultBuffer);
878
+ if ((req.result==0) && (req.paramMask & P_MASK_BLOBBODY) && m_blobBuffer->fieldCount())
879
+ size = req.serializeBlobBody(m_blobBuffer, resultBuffer, FILE_MAP_SIZE, optionalData);
880
+
881
+ if (transactionResult)
882
+ {
883
+ if ((op == TD_BEGIN_TRANSACTION)||(op ==TD_BEGIN_SHAPSHOT))
884
+ return EXECUTE_RESULT_FORCSE_SYNC;
885
+ return EXECUTE_RESULT_FORCSE_ASYNC;
886
+ }
887
+ DEBUG_PROFILE_END_OP(1, op)
888
+ return EXECUTE_RESULT_SUCCESS;
889
+ }
890
+
891
+ catch(bzs::rtl::exception &e)
892
+ {
893
+ clenupNoException();
894
+ req.reset();
895
+ const int* code = getCode(e);
896
+ if(code)
897
+ req.result = *code;
898
+ else
899
+ {
900
+ req.result = 20000;
901
+ sql_print_error("%s", boost::diagnostic_information(e).c_str());
902
+ }
903
+ printErrorMessage(code, getMsg(e));
904
+ }
905
+
906
+ catch(...)
907
+ {
908
+ clenupNoException();
909
+ req.reset();
910
+ req.result = 20001;
911
+ dumpStdErr(op, req, m_tb);
912
+ try
913
+ {
914
+ if (m_tb)
915
+ m_tb->close();
916
+ }
917
+ catch(...){}
918
+ }
919
+
920
+ DEBUG_WRITELOG3(op, req, true);
921
+ req.paramMask = 0;
922
+ size = req.serialize(NULL, resultBuffer);
923
+ return EXECUTE_RESULT_SUCCESS;
924
+ }
925
+
926
+ // ---------------------------------------------------------------------------
927
+ // class connMgrExecuter
928
+ // ---------------------------------------------------------------------------
929
+ connMgrExecuter::connMgrExecuter(request& req, unsigned __int64 parent)
930
+ :m_req(req),m_modHandle(parent)
931
+ {
932
+
933
+ }
934
+
935
+ int connMgrExecuter::read(char* buf, size_t& size)
936
+ {
937
+ connManager st(m_modHandle);
938
+ unsigned __int64* mod = (unsigned __int64*)m_req.keybuf;
939
+
940
+ const connManager::records& records = st.getRecords(mod[0], (int)mod[1]);
941
+ m_req.reset();
942
+ m_req.paramMask = P_MASK_DATA|P_MASK_DATALEN;
943
+ if (records.size())
944
+ m_req.data = (void*)&records[0];
945
+ else
946
+ m_req.paramMask = P_MASK_DATALEN;
947
+ m_req.resultLen = (uint_td)(sizeof(record) * records.size());
948
+ size = m_req.serialize(NULL, buf);
949
+ return EXECUTE_RESULT_SUCCESS;
950
+ }
951
+
952
+ int connMgrExecuter::disconnectOne(char* buf, size_t& size)
953
+ {
954
+ connManager st(m_modHandle);
955
+ unsigned __int64* mod = (unsigned __int64*)m_req.keybuf;
956
+ st.disconnect(*mod);
957
+ m_req.reset();
958
+ size = m_req.serialize(NULL, buf);
959
+ return EXECUTE_RESULT_SUCCESS;
960
+ }
961
+
962
+ int connMgrExecuter::disconnectAll(char* buf, size_t& size)
963
+ {
964
+ connManager st(m_modHandle);
965
+
966
+ st.disconnectAll();
967
+ m_req.reset();
968
+ size = m_req.serialize(NULL, buf);
969
+ return EXECUTE_RESULT_SUCCESS;
970
+ }
971
+
972
+ int connMgrExecuter::commandExec(char* buf, size_t& size)
973
+ {
974
+ if (m_req.keyNum == TD_STSTCS_READ)
975
+ return read(buf, size);
976
+ else if (m_req.keyNum == TD_STSTCS_DISCONNECT_ONE)
977
+ return disconnectOne( buf, size);
978
+ else if (m_req.keyNum == TD_STSTCS_DISCONNECT_ALL)
979
+ return disconnectAll(buf, size);
980
+ return 0;
981
+ }
982
+
983
+
984
+ // ---------------------------------------------------------------------------
985
+ // class commandExecuter
986
+ // ---------------------------------------------------------------------------
987
+ commandExecuter::commandExecuter(__int64 parent):m_modHandle(parent)
988
+ {
989
+ m_dbExec.reset(new dbExecuter());
990
+ }
991
+
992
+ commandExecuter::~commandExecuter()
993
+ {
994
+ m_dbExec.reset();
995
+ }
996
+
997
+ size_t commandExecuter::perseRequestEnd(const char* p, size_t transfered, bool& comp)const
998
+ {
999
+ if (transfered < sizeof(unsigned int))
1000
+ return 0;
1001
+ size_t size = *((unsigned int*)p);
1002
+ if (size == transfered)
1003
+ comp = true;
1004
+ return size;
1005
+ }
1006
+
1007
+ bool commandExecuter::parse(const char* p, size_t size)
1008
+ {
1009
+ const char* end = p + size;
1010
+ memset(&m_req, 0, sizeof(request));
1011
+ m_req.parse(p);
1012
+
1013
+ return 0;
1014
+ }
1015
+
1016
+ }//namespace mysql
1017
+ }//namespace tdap
1018
+ }//namespace protocol
1019
+ }//namespace db
1020
+ }//namespace bzs