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.
- checksums.yaml +7 -0
- data/BUILD_UNIX-JA +174 -0
- data/BUILD_WIN-JA +256 -0
- data/CMakeLists.txt +96 -0
- data/COPYING +339 -0
- data/README +406 -0
- data/README-JA +424 -0
- data/bin/common/tdclc_32_1_0.dll +0 -0
- data/bin/common/tdclc_64_1_0.dll +0 -0
- data/build/common/check_for_link_iconv.cmake +73 -0
- data/build/common/copyifgreater.cmd +30 -0
- data/build/common/copyifgreater.js +290 -0
- data/build/common/get_boost_libs.cmake +106 -0
- data/build/common/get_ruby_path.cmake +115 -0
- data/build/common/options.cmake +127 -0
- data/build/common/smart_install.cmake +263 -0
- data/build/common/system.cmake +122 -0
- data/build/common/transactd.rc.in +52 -0
- data/build/common/transactd_cl_common.cmake +101 -0
- data/build/common/transactd_cl_output.cmake +93 -0
- data/build/common/transactd_common.cmake +237 -0
- data/build/common/transactd_required.cmake +28 -0
- data/build/swig/ruby/generate.cmake.in +35 -0
- data/build/swig/ruby/generate.cmd.in +19 -0
- data/build/swig/ruby/ruby.swg +101 -0
- data/build/swig/tdcl.i +188 -0
- data/build/tdclc/BUILDNUMBER.txt +1 -0
- data/build/tdclc/CMakeLists.txt +170 -0
- data/build/tdclc/tdclc_32.cbproj +181 -0
- data/build/tdclc/tdclc_64.cbproj +205 -0
- data/build/tdclcpp/BUILDNUMBER.txt +1 -0
- data/build/tdclcpp/CMakeLists.txt +142 -0
- data/build/tdclcpp/tdclcpp_bcb_32.cbproj +239 -0
- data/build/tdclcpp/tdclcpp_bcb_64.cbproj +304 -0
- data/build/tdclrb/BUILDNUMBER.txt +1 -0
- data/build/tdclrb/CMakeLists.txt +258 -0
- data/build/tdclrb/GEM_VERSION +3 -0
- data/build/tdclrb/bldgem/extconf.rb +123 -0
- data/build/tdclrb/gem/INSTALLLOG.win32 +9 -0
- data/build/tdclrb/gem/Makefile.win32-VS +65 -0
- data/build/tdclrb/gem/Makefile.win32-prebuilt +48 -0
- data/build/tdclrb/gem/detect.rb +31 -0
- data/build/tdclrb/gem/helper.rb +113 -0
- data/build/tdclrb/gem/transactd.rb +22 -0
- data/build/tdclrb/gem_output.cmake +44 -0
- data/source/bzs/db/IBlobBuffer.h +51 -0
- data/source/bzs/db/blobBuffer.h +177 -0
- data/source/bzs/db/blobStructs.h +85 -0
- data/source/bzs/db/engine/mysql/IReadRecords.h +52 -0
- data/source/bzs/db/engine/mysql/bookmark.h +195 -0
- data/source/bzs/db/engine/mysql/database.cpp +1882 -0
- data/source/bzs/db/engine/mysql/database.h +465 -0
- data/source/bzs/db/engine/mysql/dbManager.cpp +303 -0
- data/source/bzs/db/engine/mysql/dbManager.h +143 -0
- data/source/bzs/db/engine/mysql/errorMessage.cpp +75 -0
- data/source/bzs/db/engine/mysql/errorMessage.h +43 -0
- data/source/bzs/db/engine/mysql/fieldAccess.h +158 -0
- data/source/bzs/db/engine/mysql/mydebuglog.cpp +349 -0
- data/source/bzs/db/engine/mysql/mydebuglog.h +89 -0
- data/source/bzs/db/engine/mysql/mysqlInternal.h +171 -0
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +169 -0
- data/source/bzs/db/engine/mysql/mysqlThd.h +35 -0
- data/source/bzs/db/engine/mysql/percentageKey.h +260 -0
- data/source/bzs/db/protocol/ICommandExecuter.h +49 -0
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +689 -0
- data/source/bzs/db/protocol/hs/hsCommandExecuter.h +228 -0
- data/source/bzs/db/protocol/tdap/btrDate.cpp +437 -0
- data/source/bzs/db/protocol/tdap/btrDate.h +227 -0
- data/source/bzs/db/protocol/tdap/client/bulkInsert.h +127 -0
- data/source/bzs/db/protocol/tdap/client/client.cpp +106 -0
- data/source/bzs/db/protocol/tdap/client/client.h +292 -0
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +144 -0
- data/source/bzs/db/protocol/tdap/client/connMgr.h +82 -0
- data/source/bzs/db/protocol/tdap/client/database.cpp +863 -0
- data/source/bzs/db/protocol/tdap/client/database.h +118 -0
- data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +100 -0
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +1640 -0
- data/source/bzs/db/protocol/tdap/client/dbDef.h +135 -0
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +434 -0
- data/source/bzs/db/protocol/tdap/client/errorMessage.cpp +92 -0
- data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +98 -0
- data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +174 -0
- data/source/bzs/db/protocol/tdap/client/fieldDDF.h +91 -0
- data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +140 -0
- data/source/bzs/db/protocol/tdap/client/fileDDF.h +86 -0
- data/source/bzs/db/protocol/tdap/client/filter.cpp +527 -0
- data/source/bzs/db/protocol/tdap/client/filter.h +154 -0
- data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +137 -0
- data/source/bzs/db/protocol/tdap/client/indexDDF.h +84 -0
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +724 -0
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +123 -0
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +899 -0
- data/source/bzs/db/protocol/tdap/client/nsTable.h +199 -0
- data/source/bzs/db/protocol/tdap/client/request.h +198 -0
- data/source/bzs/db/protocol/tdap/client/sharedData.cpp +58 -0
- data/source/bzs/db/protocol/tdap/client/sharedData.h +56 -0
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +574 -0
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +53 -0
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +627 -0
- data/source/bzs/db/protocol/tdap/client/table.cpp +2613 -0
- data/source/bzs/db/protocol/tdap/client/table.h +221 -0
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +1096 -0
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +179 -0
- data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +40 -0
- data/source/bzs/db/protocol/tdap/client/trnsctcl.def +11 -0
- data/source/bzs/db/protocol/tdap/myDateTime.cpp +500 -0
- data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +184 -0
- data/source/bzs/db/protocol/tdap/mysql/characterset.h +60 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +284 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +53 -0
- data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +383 -0
- data/source/bzs/db/protocol/tdap/mysql/debuglog.h +106 -0
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +680 -0
- data/source/bzs/db/protocol/tdap/mysql/request.h +202 -0
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +1020 -0
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +141 -0
- data/source/bzs/db/protocol/tdap/tdapRequest.h +190 -0
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +295 -0
- data/source/bzs/db/protocol/tdap/tdapSchema.h +558 -0
- data/source/bzs/db/protocol/tdap/tdapcapi.h +423 -0
- data/source/bzs/db/transactd/appBuilderImple.h +55 -0
- data/source/bzs/db/transactd/appModule.cpp +183 -0
- data/source/bzs/db/transactd/appModule.h +80 -0
- data/source/bzs/db/transactd/connManager.cpp +201 -0
- data/source/bzs/db/transactd/connManager.h +60 -0
- data/source/bzs/db/transactd/connectionRecord.h +69 -0
- data/source/bzs/db/transactd/transactd.cpp +325 -0
- data/source/bzs/env/compiler.h +135 -0
- data/source/bzs/env/crosscompile.cpp +130 -0
- data/source/bzs/env/crosscompile.h +150 -0
- data/source/bzs/env/fileopen.h +36 -0
- data/source/bzs/env/mbcswchrLinux.cpp +40 -0
- data/source/bzs/env/mbcswchrLinux.h +88 -0
- data/source/bzs/env/tstring.h +183 -0
- data/source/bzs/example/changeSchema.cpp +117 -0
- data/source/bzs/example/changeSchema_c.cpp +78 -0
- data/source/bzs/example/connection_pool_c.cpp +171 -0
- data/source/bzs/example/createDatabase.cpp +305 -0
- data/source/bzs/example/createDatabase_c.cpp +202 -0
- data/source/bzs/example/deleteRecords.cpp +87 -0
- data/source/bzs/example/deleteRecords_c.cpp +57 -0
- data/source/bzs/example/dropDatabase.cpp +59 -0
- data/source/bzs/example/dropDatabase_c.cpp +34 -0
- data/source/bzs/example/insertRecords.cpp +212 -0
- data/source/bzs/example/insertRecords_c.cpp +153 -0
- data/source/bzs/example/readRecords.cpp +141 -0
- data/source/bzs/example/readRecords_c.cpp +107 -0
- data/source/bzs/example/updateRecords.cpp +99 -0
- data/source/bzs/example/updateRecords_c.cpp +71 -0
- data/source/bzs/example/update_with_transaction.cpp +104 -0
- data/source/bzs/example/update_with_transaction_c.cpp +80 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +226 -0
- data/source/bzs/netsvc/client/tcpClient.h +489 -0
- data/source/bzs/netsvc/server/IAppModule.h +94 -0
- data/source/bzs/netsvc/server/iserver.h +65 -0
- data/source/bzs/netsvc/server/serverCpt.cpp +522 -0
- data/source/bzs/netsvc/server/serverCpt.h +88 -0
- data/source/bzs/netsvc/server/serverPipe.cpp +705 -0
- data/source/bzs/netsvc/server/serverPipe.h +96 -0
- data/source/bzs/netsvc/server/serverTpool.cpp +416 -0
- data/source/bzs/netsvc/server/serverTpool.h +84 -0
- data/source/bzs/rtl/benchmark.cpp +96 -0
- data/source/bzs/rtl/benchmark.h +65 -0
- data/source/bzs/rtl/datetime.cpp +375 -0
- data/source/bzs/rtl/datetime.h +53 -0
- data/source/bzs/rtl/debuglog.cpp +106 -0
- data/source/bzs/rtl/debuglog.h +97 -0
- data/source/bzs/rtl/exception.h +116 -0
- data/source/bzs/rtl/stl_uty.cpp +35 -0
- data/source/bzs/rtl/stl_uty.h +29 -0
- data/source/bzs/rtl/stringBuffers.cpp +101 -0
- data/source/bzs/rtl/stringBuffers.h +58 -0
- data/source/bzs/rtl/strtrim.cpp +135 -0
- data/source/bzs/rtl/strtrim.h +46 -0
- data/source/bzs/test/tdclatl/bench_tdclatl.js +445 -0
- data/source/bzs/test/tdclrb/bench_tdclcpp.rb +375 -0
- data/source/bzs/test/tdclrb/prepare.rb +226 -0
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +172 -0
- data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +208 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +1536 -0
- data/source/bzs/test/transactdBench/transactdBench.cpp +430 -0
- data/source/bzs/test/transactdBench/transactdBench2.cpp +342 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +2030 -0
- data/source/global/tdclatl/Database.cpp +503 -0
- data/source/global/tdclatl/Database.h +139 -0
- data/source/global/tdclatl/DbDef.cpp +242 -0
- data/source/global/tdclatl/DbDef.h +79 -0
- data/source/global/tdclatl/Field.cpp +92 -0
- data/source/global/tdclatl/Field.h +59 -0
- data/source/global/tdclatl/FieldDef.cpp +238 -0
- data/source/global/tdclatl/FieldDef.h +87 -0
- data/source/global/tdclatl/Flags.cpp +111 -0
- data/source/global/tdclatl/Flags.h +55 -0
- data/source/global/tdclatl/KeyDef.cpp +51 -0
- data/source/global/tdclatl/KeyDef.h +55 -0
- data/source/global/tdclatl/KeySegment.cpp +55 -0
- data/source/global/tdclatl/Table.cpp +600 -0
- data/source/global/tdclatl/Table.h +144 -0
- data/source/global/tdclatl/TableDef.cpp +291 -0
- data/source/global/tdclatl/TableDef.h +86 -0
- data/source/global/tdclatl/TdVersion.cpp +74 -0
- data/source/global/tdclatl/TdVersion.h +54 -0
- data/source/global/tdclatl/_IDatabaseEvents_CP.h +113 -0
- data/source/global/tdclatl/dllmain.cpp +30 -0
- data/source/global/tdclatl/dllmain.h +27 -0
- data/source/global/tdclatl/keySegment.h +57 -0
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/stdafx.cpp +2 -0
- data/source/global/tdclatl/stdafx.h +25 -0
- data/source/global/tdclatl/targetver.h +4 -0
- data/source/global/tdclatl/tdclatl.cpp +68 -0
- data/source/global/tdclatl/tdclatl.def +10 -0
- data/source/global/tdclatl/tdclatl.idl +1035 -0
- data/source/linux/charsetConvert.h +112 -0
- data/source/linux/linuxTypes.h +33 -0
- data/source/linux/tchar.h +428 -0
- data/transactd.gemspec +97 -0
- 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
|