transactd 1.2.0 → 2.0.0
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 +4 -4
- data/BUILD_UNIX-JA +46 -67
- data/BUILD_WIN-JA +106 -63
- data/CMakeLists.txt +40 -15
- data/README +219 -75
- data/README-JA +207 -76
- data/README_ORMSRCGEN +118 -0
- data/README_ORMSRCGEN-JA +115 -0
- data/bin/common/tdclc_32_2_0.dll +0 -0
- data/bin/common/tdclc_64_2_0.dll +0 -0
- data/build/common/check_for_link_iconv.cmake +18 -14
- data/build/common/create_symlink.cmake.in +25 -0
- data/build/common/get_boost_libs.cmake +23 -23
- data/build/common/options.cmake +0 -66
- data/build/common/smart_install.cmake +3 -3
- data/build/common/transactd.rc.in +15 -5
- data/build/common/transactd_cl_common.cmake +37 -18
- data/build/common/transactd_cl_output.cmake +55 -13
- data/build/common/transactd_common.cmake +108 -31
- data/build/swig/php/generate.cmake.in +15 -17
- data/build/swig/php/generate.cmd.in +15 -9
- data/build/swig/php/php.swg +124 -82
- data/build/swig/php/transactd.no_yield.php +4494 -0
- data/build/swig/php/transactd.no_yield.php.git.patch +685 -0
- data/build/swig/php/transactd.no_yield.php.patch +685 -0
- data/build/swig/php/transactd.yield.php +4461 -0
- data/build/swig/php/transactd.yield.php.git.patch +652 -0
- data/build/swig/php/transactd.yield.php.patch +652 -0
- data/build/swig/referencecounter.h +79 -0
- data/build/swig/ruby/ruby.swg +226 -76
- data/build/swig/ruby/threadBlockRegionWrapper.h +71 -0
- data/build/swig/ruby/without_gvl.swg +87 -0
- data/build/swig/tdcl.i +659 -170
- data/build/swig/validatablepointer.h +91 -0
- data/build/tdclc/CMakeLists.txt +49 -34
- data/build/tdclc/{tdclc_64.cbproj → tdclc.cbproj} +65 -20
- data/build/tdclc/tdclc.rc +0 -0
- data/build/tdclcpp/CMakeLists.txt +84 -20
- data/build/tdclcpp/tdclcpp.rc +0 -0
- data/build/tdclcpp/{tdclcpp_bcb_64.cbproj → tdclcpp_bc.cbproj} +168 -44
- data/build/tdclrb/CMakeLists.txt +84 -66
- data/build/tdclrb/bldgem/extconf.rb +28 -3
- data/build/tdclrb/gem/helper.rb +11 -1
- data/build/tdclrb/gem_output.cmake +20 -16
- data/index_ja.html +15 -0
- data/source/bzs/db/IBlobBuffer.h +15 -17
- data/source/bzs/db/blobBuffer.h +186 -140
- data/source/bzs/db/blobStructs.h +37 -37
- data/source/bzs/db/engine/mysql/IReadRecords.h +34 -34
- data/source/bzs/db/engine/mysql/bookmark.h +150 -147
- data/source/bzs/db/engine/mysql/database.cpp +1721 -1526
- data/source/bzs/db/engine/mysql/database.h +608 -370
- data/source/bzs/db/engine/mysql/dbManager.cpp +213 -201
- data/source/bzs/db/engine/mysql/dbManager.h +115 -104
- data/source/bzs/db/engine/mysql/errorMessage.cpp +49 -50
- data/source/bzs/db/engine/mysql/errorMessage.h +25 -26
- data/source/bzs/db/engine/mysql/fieldAccess.h +55 -61
- data/source/bzs/db/engine/mysql/mydebuglog.cpp +326 -292
- data/source/bzs/db/engine/mysql/mydebuglog.h +63 -55
- data/source/bzs/db/engine/mysql/mysqlInternal.h +182 -125
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +121 -121
- data/source/bzs/db/engine/mysql/mysqlThd.h +20 -20
- data/source/bzs/db/engine/mysql/percentageKey.h +241 -228
- data/source/bzs/db/protocol/ICommandExecuter.h +18 -17
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +543 -514
- data/source/bzs/db/protocol/hs/hsCommandExecuter.h +155 -158
- data/source/bzs/db/protocol/tdap/btrDate.cpp +213 -180
- data/source/bzs/db/protocol/tdap/btrDate.h +39 -37
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +173 -0
- data/source/bzs/db/protocol/tdap/client/activeTable.h +165 -0
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +370 -0
- data/source/bzs/db/protocol/tdap/client/bulkInsert.h +13 -23
- data/source/bzs/db/protocol/tdap/client/client.cpp +81 -68
- data/source/bzs/db/protocol/tdap/client/client.h +361 -320
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +17 -22
- data/source/bzs/db/protocol/tdap/client/connMgr.h +17 -19
- data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +243 -0
- data/source/bzs/db/protocol/tdap/client/connectionPool.h +109 -0
- data/source/bzs/db/protocol/tdap/client/database.cpp +327 -219
- data/source/bzs/db/protocol/tdap/client/database.h +141 -118
- data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +60 -62
- data/source/bzs/db/protocol/tdap/client/databaseManager.h +255 -0
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +315 -202
- data/source/bzs/db/protocol/tdap/client/dbDef.h +40 -32
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +390 -371
- data/source/bzs/db/protocol/tdap/client/errorMessage.cpp +148 -56
- data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +149 -57
- data/source/bzs/db/protocol/tdap/client/export.h +35 -0
- data/source/bzs/db/protocol/tdap/client/field.cpp +1985 -0
- data/source/bzs/db/protocol/tdap/client/field.h +393 -0
- data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +14 -14
- data/source/bzs/db/protocol/tdap/client/fieldDDF.h +11 -14
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +123 -0
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +58 -0
- data/source/bzs/db/protocol/tdap/client/fields.h +178 -0
- data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +13 -16
- data/source/bzs/db/protocol/tdap/client/fileDDF.h +11 -17
- data/source/bzs/db/protocol/tdap/client/filter.h +423 -259
- data/source/bzs/db/protocol/tdap/client/groupComp.h +117 -0
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +818 -0
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +281 -0
- data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +14 -17
- data/source/bzs/db/protocol/tdap/client/indexDDF.h +11 -14
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +231 -0
- data/source/bzs/db/protocol/tdap/client/memRecord.h +145 -0
- data/source/bzs/db/protocol/tdap/client/memRecordset.cpp +448 -0
- data/source/bzs/db/protocol/tdap/client/memRecordset.h +159 -0
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +300 -173
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +53 -36
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +171 -128
- data/source/bzs/db/protocol/tdap/client/nsTable.h +121 -87
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +173 -0
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +209 -0
- data/source/bzs/db/protocol/tdap/client/recordset.h +86 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +596 -0
- data/source/bzs/db/protocol/tdap/client/request.h +227 -170
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +1288 -0
- data/source/bzs/db/protocol/tdap/client/serializer.h +295 -0
- data/source/bzs/db/protocol/tdap/client/sharedData.cpp +9 -12
- data/source/bzs/db/protocol/tdap/client/sharedData.h +18 -16
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +494 -473
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +51 -53
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +214 -148
- data/source/bzs/db/protocol/tdap/client/table.cpp +929 -1665
- data/source/bzs/db/protocol/tdap/client/table.h +413 -87
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +642 -534
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +25 -40
- data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +11 -15
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +378 -437
- data/source/bzs/db/protocol/tdap/client/trnsctcl.def +1 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +127 -0
- data/source/bzs/db/protocol/tdap/myDateTime.cpp +352 -345
- data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +75 -78
- data/source/bzs/db/protocol/tdap/mysql/characterset.h +18 -19
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +216 -199
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +23 -14
- data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +354 -314
- data/source/bzs/db/protocol/tdap/mysql/debuglog.h +57 -47
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +905 -739
- data/source/bzs/db/protocol/tdap/mysql/request.h +152 -159
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +1044 -879
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +87 -81
- data/source/bzs/db/protocol/tdap/tdapRequest.h +162 -130
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +368 -166
- data/source/bzs/db/protocol/tdap/tdapSchema.h +702 -566
- data/source/bzs/db/protocol/tdap/tdapcapi.h +387 -353
- data/source/bzs/db/transactd/appBuilderImple.h +21 -20
- data/source/bzs/db/transactd/appModule.cpp +350 -98
- data/source/bzs/db/transactd/appModule.h +31 -37
- data/source/bzs/db/transactd/connManager.cpp +138 -135
- data/source/bzs/db/transactd/connManager.h +28 -21
- data/source/bzs/db/transactd/connectionRecord.h +39 -39
- data/source/bzs/db/transactd/transactd.cpp +217 -203
- data/source/bzs/env/boost_bcb_link.h +131 -0
- data/source/bzs/env/compiler.h +136 -79
- data/source/bzs/env/crosscompile.cpp +57 -57
- data/source/bzs/env/crosscompile.h +130 -115
- data/source/bzs/env/fileopen.h +7 -8
- data/source/bzs/env/mbcswchrLinux.cpp +4 -9
- data/source/bzs/env/mbcswchrLinux.h +37 -34
- data/source/bzs/env/tcharMinGW.h +59 -0
- data/source/bzs/env/tstring.h +90 -95
- data/source/bzs/example/changeSchema.cpp +22 -23
- data/source/bzs/example/changeSchema_c.cpp +22 -24
- data/source/bzs/example/connection_pool_c.cpp +49 -104
- data/source/bzs/example/createDatabase.cpp +40 -47
- data/source/bzs/example/createDatabase_c.cpp +38 -43
- data/source/bzs/example/deleteRecords.cpp +10 -15
- data/source/bzs/example/deleteRecords_c.cpp +10 -14
- data/source/bzs/example/dropDatabase.cpp +3 -9
- data/source/bzs/example/dropDatabase_c.cpp +5 -6
- data/source/bzs/example/insertRecords.cpp +37 -29
- data/source/bzs/example/insertRecords_c.cpp +19 -25
- data/source/bzs/example/ormap_c.cpp +621 -0
- data/source/bzs/example/queryData.cpp +371 -0
- data/source/bzs/example/queryData.h +16 -0
- data/source/bzs/example/query_c.cpp +109 -0
- data/source/bzs/example/readRecords.cpp +27 -27
- data/source/bzs/example/readRecords_c.cpp +25 -23
- data/source/bzs/example/updateRecords.cpp +16 -21
- data/source/bzs/example/updateRecords_c.cpp +8 -12
- data/source/bzs/example/update_with_transaction.cpp +21 -24
- data/source/bzs/example/update_with_transaction_c.cpp +12 -15
- data/source/bzs/example/useORMRecord.cpp +177 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +167 -156
- data/source/bzs/netsvc/client/tcpClient.h +541 -489
- data/source/bzs/netsvc/server/IAppModule.h +119 -32
- data/source/bzs/netsvc/server/iserver.h +21 -23
- data/source/bzs/netsvc/server/serverCpt.cpp +421 -391
- data/source/bzs/netsvc/server/serverCpt.h +41 -43
- data/source/bzs/netsvc/server/serverPipe.cpp +580 -565
- data/source/bzs/netsvc/server/serverPipe.h +44 -45
- data/source/bzs/netsvc/server/serverTpool.cpp +333 -303
- data/source/bzs/netsvc/server/serverTpool.h +38 -43
- data/source/bzs/rtl/benchmark.cpp +91 -31
- data/source/bzs/rtl/benchmark.h +76 -22
- data/source/bzs/rtl/datetime.cpp +231 -233
- data/source/bzs/rtl/datetime.h +16 -16
- data/source/bzs/rtl/debuglog.cpp +48 -51
- data/source/bzs/rtl/debuglog.h +55 -44
- data/source/bzs/rtl/exception.h +55 -48
- data/source/bzs/rtl/stl_uty.cpp +27 -28
- data/source/bzs/rtl/stl_uty.h +28 -29
- data/source/bzs/rtl/stringBuffers.cpp +8 -6
- data/source/bzs/rtl/stringBuffers.h +16 -9
- data/source/bzs/rtl/strtrim.cpp +90 -91
- data/source/bzs/rtl/strtrim.h +14 -16
- data/source/bzs/test/tdclatl/bench_query_atl.js +647 -0
- data/source/bzs/test/tdclatl/bench_tdclatl.js +303 -303
- data/source/bzs/test/tdclatl/test_query_atl.js +669 -0
- data/source/bzs/test/tdclphp/bench.php +357 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +907 -303
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +21 -49
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +41 -75
- data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +23 -37
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +120 -0
- data/source/bzs/test/tdclrb/bench_tdclcpp.rb +4 -6
- data/source/bzs/test/tdclrb/prepare.rb +15 -12
- data/source/bzs/test/tdclrb/transactd_blob_spec.rb +29 -32
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -29
- data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +18 -19
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +107 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +734 -142
- data/source/bzs/test/transactdBench/query_bench.cpp +156 -0
- data/source/bzs/test/transactdBench/scaling_bench.cpp +265 -0
- data/source/bzs/test/transactdBench/transactdBench.cpp +107 -83
- data/source/bzs/test/transactdBench/transactdBench2.cpp +122 -83
- data/source/bzs/test/transactdBench/workerBase.cpp +5 -0
- data/source/bzs/test/transactdBench/workerBase.h +88 -0
- data/source/bzs/test/transactdBench/workerMySQLImple.h +333 -0
- data/source/bzs/test/transactdBench/workerTransactdImple.h +201 -0
- data/source/bzs/test/trdclengn/test_blob.cpp +121 -73
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +1244 -426
- data/source/global/ormsrcgen/confParam.h +80 -0
- data/source/global/ormsrcgen/fieldName.cpp +77 -0
- data/source/global/ormsrcgen/fieldName.h +43 -0
- data/source/global/ormsrcgen/main.cpp +196 -0
- data/source/global/ormsrcgen/srcgen.cpp +763 -0
- data/source/global/ormsrcgen/srcgen.h +72 -0
- data/source/global/ormsrcgen/template/fieldNameList_sample.txt +2 -0
- data/source/global/ormsrcgen/template/ormDataClass_template.cpp +48 -0
- data/source/global/ormsrcgen/template/ormDataClass_template.h +34 -0
- data/source/global/ormsrcgen/template/ormMapClass_template.cpp +51 -0
- data/source/global/ormsrcgen/template/ormMapClass_template.h +62 -0
- data/source/global/ormsrcgen/template/template.cnf +38 -0
- data/source/global/querystmts/querystmts.cpp +237 -0
- data/source/global/tdclatl/ConnectParams.cpp +77 -0
- data/source/global/tdclatl/ConnectParams.h +70 -0
- data/source/global/tdclatl/Database.cpp +132 -128
- data/source/global/tdclatl/Database.h +60 -49
- data/source/global/tdclatl/DbDef.cpp +68 -64
- data/source/global/tdclatl/DbDef.h +36 -36
- data/source/global/tdclatl/Field.cpp +12 -17
- data/source/global/tdclatl/Field.h +15 -12
- data/source/global/tdclatl/FieldDef.cpp +75 -36
- data/source/global/tdclatl/FieldDef.h +38 -19
- data/source/global/tdclatl/FieldDefs.cpp +74 -0
- data/source/global/tdclatl/FieldDefs.h +56 -0
- data/source/global/tdclatl/FieldNames.cpp +99 -0
- data/source/global/tdclatl/FieldNames.h +66 -0
- data/source/global/tdclatl/Flags.cpp +75 -37
- data/source/global/tdclatl/Flags.h +13 -12
- data/source/global/tdclatl/GroupQuery.cpp +119 -0
- data/source/global/tdclatl/GroupQuery.h +65 -0
- data/source/global/tdclatl/KeyDef.cpp +15 -14
- data/source/global/tdclatl/KeyDef.h +20 -17
- data/source/global/tdclatl/KeySegment.cpp +13 -12
- data/source/global/tdclatl/PooledDbManager.cpp +223 -0
- data/source/global/tdclatl/PooledDbManager.h +76 -0
- data/source/global/tdclatl/QueryBase.cpp +206 -127
- data/source/global/tdclatl/QueryBase.h +55 -59
- data/source/global/tdclatl/Record.cpp +214 -0
- data/source/global/tdclatl/Record.h +96 -0
- data/source/global/tdclatl/Recordset.cpp +278 -0
- data/source/global/tdclatl/Recordset.h +83 -0
- data/source/global/tdclatl/RecordsetQuery.cpp +118 -0
- data/source/global/tdclatl/RecordsetQuery.h +126 -0
- data/source/global/tdclatl/Table.cpp +57 -60
- data/source/global/tdclatl/Table.h +32 -29
- data/source/global/tdclatl/TableDef.cpp +63 -62
- data/source/global/tdclatl/TableDef.h +20 -22
- data/source/global/tdclatl/TdVersion.cpp +3 -3
- data/source/global/tdclatl/TdVersion.h +15 -11
- data/source/global/tdclatl/_IDatabaseEvents_CP.h +99 -92
- data/source/global/tdclatl/activeTable.cpp +355 -0
- data/source/global/tdclatl/activeTable.h +79 -0
- data/source/global/tdclatl/dllmain.cpp +4 -3
- data/source/global/tdclatl/dllmain.h +7 -6
- data/source/global/tdclatl/keySegment.h +22 -18
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/stdafx.h +6 -4
- data/source/global/tdclatl/targetver.h +0 -1
- data/source/global/tdclatl/tdclatl.cpp +10 -5
- data/source/global/tdclatl/tdclatl.idl +530 -14
- data/source/linux/charsetConvert.h +78 -79
- data/source/linux/linuxTypes.h +9 -12
- data/source/linux/tchar.h +168 -166
- data/transactd.gemspec +24 -16
- metadata +98 -12
- data/bin/common/tdclc_32_1_2.dll +0 -0
- data/bin/common/tdclc_64_1_2.dll +0 -0
- data/build/tdclc/tdclc_32.cbproj +0 -173
- data/build/tdclcpp/tdclcpp_bcb_32.cbproj +0 -232
- data/build/tdclrb/GEM_VERSION +0 -3
- data/source/bzs/db/protocol/tdap/client/filter.cpp +0 -43
- data/source/bzs/example/useORM.cpp +0 -585
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
GNU General Public License for more details.
|
|
13
13
|
|
|
14
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
|
|
15
|
+
along with this program; if not, write to the Free Software
|
|
16
|
+
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
17
17
|
02111-1307, USA.
|
|
18
18
|
=================================================================*/
|
|
19
19
|
|
|
@@ -34,1056 +34,1221 @@
|
|
|
34
34
|
#include <bzs/db/transactd/connManager.h>
|
|
35
35
|
#include <bzs/rtl/exception.h>
|
|
36
36
|
|
|
37
|
-
|
|
38
37
|
namespace bzs
|
|
39
38
|
{
|
|
40
39
|
namespace db
|
|
41
40
|
{
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
|
|
42
|
+
using namespace engine::mysql;
|
|
43
|
+
|
|
45
44
|
namespace protocol
|
|
46
45
|
{
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
using namespace transactd;
|
|
47
|
+
using namespace transactd::connection;
|
|
49
48
|
namespace tdap
|
|
50
49
|
{
|
|
51
50
|
namespace mysql
|
|
52
51
|
{
|
|
53
52
|
|
|
54
|
-
static const char* TableNameTitle =
|
|
55
|
-
static const char* BdfNameTitle =
|
|
53
|
+
static const char* TableNameTitle = "dbfile=";
|
|
54
|
+
static const char* BdfNameTitle = ".bdf";
|
|
56
55
|
|
|
57
|
-
|
|
56
|
+
class smartReadRecordsHandler
|
|
57
|
+
{
|
|
58
|
+
ReadRecordsHandler* m_hdr;
|
|
59
|
+
bool m_ended;
|
|
60
|
+
|
|
61
|
+
public:
|
|
62
|
+
smartReadRecordsHandler(ReadRecordsHandler* hdr)
|
|
63
|
+
: m_hdr(hdr), m_ended(false)
|
|
64
|
+
{
|
|
65
|
+
}
|
|
66
|
+
unsigned int end()
|
|
67
|
+
{
|
|
68
|
+
m_ended = true;
|
|
69
|
+
return m_hdr->end();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
~smartReadRecordsHandler()
|
|
73
|
+
{
|
|
74
|
+
if (!m_ended)
|
|
75
|
+
m_hdr->end();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
std::string& toLowerCaseName(std::string& name, bool forSql)
|
|
58
80
|
{
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
81
|
+
if (forSql)
|
|
82
|
+
{
|
|
83
|
+
char tmp[MAX_PATH];
|
|
84
|
+
strcpy_s(tmp, MAX_PATH, name.c_str());
|
|
85
|
+
my_casedn_str(global_system_variables.collation_server, tmp);
|
|
86
|
+
name = tmp;
|
|
87
|
+
}
|
|
88
|
+
else
|
|
89
|
+
boost::algorithm::to_lower(name);
|
|
90
|
+
return name;
|
|
69
91
|
}
|
|
70
92
|
|
|
71
93
|
std::string getDatabaseName(const request& req, bool forSql)
|
|
72
94
|
{
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
95
|
+
std::vector<std::string> ssc;
|
|
96
|
+
std::vector<std::string> ss;
|
|
97
|
+
if (req.keybuf)
|
|
98
|
+
{
|
|
99
|
+
std::string s((const char*)req.keybuf);
|
|
100
|
+
split(ssc, s, "\t");
|
|
101
|
+
if (ssc.size())
|
|
102
|
+
{
|
|
103
|
+
if (forSql && ssc.size() > 1)
|
|
104
|
+
ssc.erase(ssc.begin(), ssc.begin() + 1);
|
|
105
|
+
std::string path = ssc[0];
|
|
106
|
+
std::string derim = "/";
|
|
107
|
+
split(ss, path, derim); /* tdap://serverName/dbName?dbfile=xxx */
|
|
108
|
+
if (ss.size() > 3)
|
|
109
|
+
{
|
|
110
|
+
std::vector<std::string> db;
|
|
111
|
+
split(db, ss[3], "?");
|
|
112
|
+
if (db.size() > 0)
|
|
113
|
+
{
|
|
114
|
+
if (g_tableNmaeLower)
|
|
115
|
+
toLowerCaseName(db[0], forSql);
|
|
116
|
+
return db[0];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return "";
|
|
100
122
|
}
|
|
101
123
|
|
|
102
124
|
std::string getTableName(const std::string& src, bool forSql)
|
|
103
125
|
{
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
126
|
+
std::vector<std::string> ssc;
|
|
127
|
+
split(ssc, src, "\t");
|
|
128
|
+
if (forSql && ssc.size() > 1)
|
|
129
|
+
ssc.erase(ssc.begin(), ssc.begin() + 1);
|
|
130
|
+
|
|
131
|
+
std::string name = ssc[0];
|
|
132
|
+
size_t pos = name.find(TableNameTitle);
|
|
133
|
+
if (pos != std::string::npos)
|
|
134
|
+
{
|
|
135
|
+
pos += strlen(TableNameTitle);
|
|
136
|
+
while ((name[pos] == '/') || (name[pos] == '\\'))
|
|
137
|
+
{
|
|
138
|
+
if (++pos == name.size())
|
|
139
|
+
return "";
|
|
140
|
+
}
|
|
141
|
+
size_t pos2 = name.find(".", pos);
|
|
142
|
+
if (pos2 == std::string::npos)
|
|
143
|
+
pos2 = name.size();
|
|
144
|
+
size_t pos3 = name.find("&", pos);
|
|
145
|
+
if (pos3 != std::string::npos && (pos3 < pos2))
|
|
146
|
+
pos2 = pos3;
|
|
147
|
+
|
|
148
|
+
name = name.substr(pos, pos2 - pos);
|
|
149
|
+
if (g_tableNmaeLower)
|
|
150
|
+
toLowerCaseName(name, forSql);
|
|
151
|
+
return name;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return "";
|
|
133
155
|
}
|
|
134
156
|
|
|
135
157
|
std::string getTableName(const request& req, bool forSql)
|
|
136
158
|
{
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
159
|
+
|
|
160
|
+
if (req.keybuf)
|
|
161
|
+
{
|
|
162
|
+
std::string s((const char*)req.keybuf, req.keylen);
|
|
163
|
+
return getTableName(s, forSql);
|
|
164
|
+
}
|
|
165
|
+
return "";
|
|
144
166
|
}
|
|
145
167
|
|
|
146
168
|
const char* getOwnerName(const request& req)
|
|
147
169
|
{
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
170
|
+
const char* p = (const char*)req.data;
|
|
171
|
+
if (*req.datalen && (p[*req.datalen - 1] == 0x00))
|
|
172
|
+
return p;
|
|
173
|
+
return "";
|
|
152
174
|
}
|
|
153
175
|
|
|
154
176
|
void dumpStdErr(int op, request& req, table* tb)
|
|
155
177
|
{
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
bzs::rtl::debuglog::dump(stderr, (char*)req.data, (int)*req.datalen, 256);
|
|
180
|
-
}
|
|
178
|
+
boost::scoped_array<char> msg(new char[1024]);
|
|
179
|
+
|
|
180
|
+
sprintf_s(msg.get(), 1024,
|
|
181
|
+
"[Transactd] Exception:op=%d Handle=%d tablename=%s datalen=%d"
|
|
182
|
+
" keynum=%d keylen=%d \n",
|
|
183
|
+
op, req.pbk->handle, tb ? tb->name().c_str() : "", *req.datalen,
|
|
184
|
+
req.keyNum, req.keylen);
|
|
185
|
+
sql_print_error("%s", msg.get());
|
|
186
|
+
// dump Keybuf
|
|
187
|
+
if (req.keylen && req.keybuf)
|
|
188
|
+
{
|
|
189
|
+
sprintf_s(msg.get(), 1024, "[Transactd] Dump key buffer\n");
|
|
190
|
+
sql_print_error("%s", msg.get());
|
|
191
|
+
bzs::rtl::debuglog::dump(stderr, (char*)req.keybuf, req.keylen, 256);
|
|
192
|
+
}
|
|
193
|
+
// dump databuffer
|
|
194
|
+
if (*req.datalen && req.data)
|
|
195
|
+
{
|
|
196
|
+
sprintf_s(msg.get(), 1024, "[Transactd] Dump data buffer\n");
|
|
197
|
+
sql_print_error("%s", msg.get());
|
|
198
|
+
bzs::rtl::debuglog::dump(stderr, (char*)req.data, (int)*req.datalen,
|
|
199
|
+
256);
|
|
200
|
+
}
|
|
181
201
|
}
|
|
182
202
|
|
|
183
203
|
//-------------------------------------------------------------
|
|
184
204
|
// class dbExecuter
|
|
185
205
|
//-------------------------------------------------------------
|
|
186
206
|
|
|
187
|
-
dbExecuter::dbExecuter()
|
|
188
|
-
|
|
207
|
+
dbExecuter::dbExecuter()
|
|
208
|
+
: dbManager(), m_readHandler(new ReadRecordsHandler()),
|
|
209
|
+
m_blobBuffer(new blobBuffer())
|
|
189
210
|
{
|
|
190
|
-
|
|
191
211
|
}
|
|
192
212
|
|
|
193
213
|
dbExecuter::~dbExecuter()
|
|
194
214
|
{
|
|
195
|
-
|
|
196
|
-
|
|
215
|
+
delete m_blobBuffer;
|
|
216
|
+
delete m_readHandler;
|
|
197
217
|
}
|
|
198
218
|
|
|
199
219
|
void dbExecuter::connect(request& req)
|
|
200
220
|
{
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
221
|
+
req.paramMask = 0;
|
|
222
|
+
if (req.keyNum == LG_SUBOP_DISCONNECT)
|
|
223
|
+
dbManager::releaseDatabase(req.cid);
|
|
224
|
+
else
|
|
225
|
+
{
|
|
226
|
+
std::string dbname = getDatabaseName(req);
|
|
227
|
+
std::string dbSqlname = getDatabaseName(req, FOR_SQL);
|
|
228
|
+
// exec SQL use database
|
|
229
|
+
if (dbname != "")
|
|
230
|
+
{
|
|
231
|
+
database* db = getDatabase(dbname.c_str(), req.cid);
|
|
232
|
+
dbSqlname.insert(0, "use ");
|
|
233
|
+
req.result = ddl_execSql(db->thd(), dbSqlname);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
217
236
|
}
|
|
218
237
|
|
|
219
238
|
void dbExecuter::releaseDatabase(request& req, int op)
|
|
220
239
|
{
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
240
|
+
req.paramMask = 0;
|
|
241
|
+
if ((op == TD_RESET_CLIENT) && (req.keyNum != 0))
|
|
242
|
+
req.result = 1;
|
|
243
|
+
else
|
|
244
|
+
dbManager::releaseDatabase(req.cid);
|
|
226
245
|
}
|
|
227
246
|
|
|
228
247
|
std::string dbExecuter::makeSQLcreateTable(const request& req)
|
|
229
248
|
{
|
|
230
|
-
|
|
231
|
-
|
|
249
|
+
return (const char*)req.data;
|
|
250
|
+
// return sql;
|
|
232
251
|
}
|
|
233
252
|
|
|
234
253
|
int dbExecuter::errorCode(int ha_error)
|
|
235
|
-
{//see mysqld_error.h or my_base.h or dbManager.h
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
254
|
+
{ // see mysqld_error.h or my_base.h or dbManager.h
|
|
255
|
+
|
|
256
|
+
if (ha_error < HA_ERR_FIRST)
|
|
257
|
+
return ha_error;
|
|
258
|
+
else if (ha_error == HA_ERR_KEY_NOT_FOUND)
|
|
259
|
+
return STATUS_NOT_FOUND_TI;
|
|
260
|
+
else if (ha_error == HA_ERR_END_OF_FILE)
|
|
261
|
+
return STATUS_EOF;
|
|
262
|
+
else if (ha_error == HA_ERR_FOUND_DUPP_KEY)
|
|
263
|
+
return STATUS_DUPPLICATE_KEYVALUE;
|
|
264
|
+
else if (ha_error == HA_ERR_CRASHED_ON_USAGE)
|
|
265
|
+
return STATUS_IO_ERROR;
|
|
266
|
+
else if (ha_error == HA_ERR_NO_ACTIVE_RECORD)
|
|
267
|
+
return STATUS_NO_CURRENT;
|
|
268
|
+
else if ((ha_error == HA_ERR_LOCK_WAIT_TIMEOUT) ||
|
|
269
|
+
(ha_error == HA_ERR_LOCK_DEADLOCK) ||
|
|
270
|
+
(ha_error == ER_LOCK_WAIT_TIMEOUT))
|
|
271
|
+
return STATUS_LOCK_ERROR;
|
|
272
|
+
else if (ha_error == STATUS_INVALID_LOCKTYPE)
|
|
273
|
+
return STATUS_INVALID_LOCKTYPE;
|
|
274
|
+
else if (ha_error == HA_ERR_AUTOINC_ERANGE)
|
|
275
|
+
return STATUS_DUPPLICATE_KEYVALUE;
|
|
276
|
+
else if (ha_error == ER_PARSE_ERROR)
|
|
277
|
+
return STATUS_CANT_CREATE;
|
|
278
|
+
else if (ha_error == ER_TABLE_EXISTS_ERROR)
|
|
279
|
+
return STATUS_TABLE_EXISTS_ERROR;
|
|
280
|
+
else if (ha_error == DBM_ERROR_TABLE_USED)
|
|
281
|
+
return STATUS_CANNOT_LOCK_TABLE;
|
|
282
|
+
return 25000 + ha_error;
|
|
264
283
|
}
|
|
265
284
|
|
|
266
285
|
bool isMetaDb(const request& req)
|
|
267
286
|
{
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
287
|
+
|
|
288
|
+
char buf[MAX_PATH];
|
|
289
|
+
strncpy(buf, (char*)req.keybuf, MAX_PATH);
|
|
290
|
+
_strlwr(buf);
|
|
291
|
+
char_m* st = _mbsstr((char_m*)buf, (char_m*)BdfNameTitle);
|
|
292
|
+
if (st == NULL)
|
|
293
|
+
st = (char_m*)strstr(buf, TRANSACTD_SCHEMANAME);
|
|
294
|
+
return (st != NULL);
|
|
276
295
|
}
|
|
277
296
|
|
|
278
297
|
inline void dbExecuter::doCreateTable(request& req)
|
|
279
298
|
{
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
299
|
+
// if table name is mata table and database is nothing
|
|
300
|
+
// then cretate database too.
|
|
301
|
+
std::string dbname = getDatabaseName(req);
|
|
302
|
+
std::string dbSqlname = getDatabaseName(req, FOR_SQL);
|
|
303
|
+
if (dbname != "")
|
|
304
|
+
{
|
|
305
|
+
std::string cmd;
|
|
306
|
+
database* db = getDatabase(dbname.c_str(), req.cid);
|
|
307
|
+
|
|
308
|
+
if (isMetaDb(req))
|
|
309
|
+
{ // for database operation
|
|
310
|
+
if ((req.keyNum == 0) && (db->existsDatabase() == false))
|
|
311
|
+
req.result = ddl_createDataBase(db->thd(), dbSqlname);
|
|
312
|
+
else if (req.keyNum == CR_SUBOP_DROP)
|
|
313
|
+
{
|
|
314
|
+
std::string tableName = getTableName(req);
|
|
315
|
+
if (db->existsTable(tableName))
|
|
316
|
+
req.result = ddl_dropTable(db, tableName, dbSqlname,
|
|
317
|
+
getTableName(req, FOR_SQL));
|
|
318
|
+
if (req.result == 0)
|
|
319
|
+
req.result = ddl_dropDataBase(db->thd(), dbname, dbSqlname);
|
|
320
|
+
req.result = errorCodeSht(req.result);
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
if (req.result == 0)
|
|
325
|
+
{ // table operation
|
|
326
|
+
if ((req.result = ddl_useDataBase(db->thd(), dbSqlname)) == 0)
|
|
327
|
+
{
|
|
328
|
+
std::string tableSqlName = getTableName(req, FOR_SQL);
|
|
329
|
+
std::string tableName = getTableName(req);
|
|
330
|
+
if (req.keyNum == CR_SUBOP_DROP) // -128 is delete
|
|
331
|
+
{
|
|
332
|
+
|
|
333
|
+
if (db->existsTable(tableName))
|
|
334
|
+
req.result = ddl_dropTable(db, tableName, dbSqlname,
|
|
335
|
+
tableSqlName);
|
|
336
|
+
}
|
|
337
|
+
else if (req.keyNum == CR_SUBOP_RENAME)
|
|
338
|
+
{ // rename new is keybuf
|
|
339
|
+
request reqold;
|
|
340
|
+
reqold.keybuf = req.data;
|
|
341
|
+
reqold.keylen = *req.datalen;
|
|
342
|
+
req.result = ddl_renameTable(
|
|
343
|
+
db, getTableName(reqold) /*oldname*/
|
|
344
|
+
,
|
|
345
|
+
dbSqlname, getTableName(reqold, FOR_SQL) /*oldname*/
|
|
346
|
+
,
|
|
347
|
+
tableSqlName /*newName*/);
|
|
348
|
+
}
|
|
349
|
+
else if (req.keyNum == CR_SUBOP_SWAPNAME)
|
|
350
|
+
{ // swap name name2 = keybuf
|
|
351
|
+
request reqold;
|
|
352
|
+
reqold.keybuf = req.data;
|
|
353
|
+
reqold.keylen = *req.datalen;
|
|
354
|
+
req.result = ddl_replaceTable(
|
|
355
|
+
db, getTableName(reqold) /*oldname*/
|
|
356
|
+
,
|
|
357
|
+
tableName /*newName*/
|
|
358
|
+
,
|
|
359
|
+
dbSqlname, getTableName(reqold, FOR_SQL) /*oldname*/
|
|
360
|
+
,
|
|
361
|
+
tableSqlName /*newName*/);
|
|
362
|
+
}
|
|
363
|
+
else
|
|
364
|
+
{ // create
|
|
365
|
+
if (req.data == NULL)
|
|
366
|
+
req.result = 1;
|
|
367
|
+
else
|
|
368
|
+
{ //-1 is overwrite
|
|
369
|
+
if ((req.keyNum == CR_SUB_FLAG_EXISTCHECK) &&
|
|
370
|
+
(db->existsTable(tableName)))
|
|
371
|
+
req.result = ddl_dropTable(db, tableName, dbSqlname,
|
|
372
|
+
tableSqlName);
|
|
373
|
+
if (req.result == 0)
|
|
374
|
+
req.result =
|
|
375
|
+
ddl_execSql(db->thd(), makeSQLcreateTable(req));
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
else
|
|
382
|
+
req.result = 1;
|
|
383
|
+
req.result = errorCodeSht(req.result);
|
|
359
384
|
}
|
|
360
385
|
|
|
361
|
-
//open table and assign handle
|
|
386
|
+
// open table and assign handle
|
|
362
387
|
inline void dbExecuter::doOpenTable(request& req)
|
|
363
388
|
{
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
389
|
+
std::string dbname = getDatabaseName(req);
|
|
390
|
+
if (dbname != "")
|
|
391
|
+
{
|
|
392
|
+
database* db = getDatabase(dbname.c_str(), req.cid);
|
|
393
|
+
m_tb = db->openTable(
|
|
394
|
+
getTableName(req), req.keyNum,
|
|
395
|
+
getOwnerName(req)); // if error occured that throw exception
|
|
396
|
+
req.result = db->stat();
|
|
397
|
+
if (m_tb)
|
|
398
|
+
{
|
|
399
|
+
req.pbk->handle = addHandle(getDatabaseID(req.cid), m_tb->id());
|
|
400
|
+
m_tb = getTable(req.pbk->handle);
|
|
401
|
+
m_tb->setBlobBuffer(m_blobBuffer);
|
|
402
|
+
req.paramMask = P_MASK_POSBLK;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
else
|
|
406
|
+
req.result = 1;
|
|
380
407
|
}
|
|
381
408
|
|
|
382
409
|
inline void readAfter(request& req, table* tb, dbExecuter* dbm)
|
|
383
410
|
{
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
411
|
+
if (tb->stat() == 0)
|
|
412
|
+
{
|
|
413
|
+
if ((req.op >= TD_KEY_EQUAL_KO) && (req.op <= TD_KEY_LAST_KO))
|
|
414
|
+
req.paramMask = P_MASK_POSBLK;
|
|
415
|
+
else
|
|
416
|
+
{
|
|
417
|
+
req.paramMask = P_MASK_READRESULT;
|
|
418
|
+
if (tb->blobFields())
|
|
419
|
+
req.paramMask |= P_MASK_BLOBBODY;
|
|
420
|
+
req.data = tb->record();
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
req.result = dbm->errorCodeSht(tb->stat());
|
|
397
424
|
}
|
|
398
425
|
|
|
399
426
|
inline void dbExecuter::doSeekKey(request& req, int op)
|
|
400
427
|
{
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
428
|
+
bool read = true;
|
|
429
|
+
m_tb = getTable(req.pbk->handle);
|
|
430
|
+
if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
|
|
431
|
+
{
|
|
432
|
+
m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
|
|
433
|
+
if (read)
|
|
434
|
+
{
|
|
435
|
+
ha_rkey_function flag = HA_READ_KEY_EXACT;
|
|
436
|
+
if (op == TD_KEY_SEEK)
|
|
437
|
+
flag = HA_READ_KEY_EXACT;
|
|
438
|
+
else if (op == TD_KEY_AFTER)
|
|
439
|
+
flag = HA_READ_AFTER_KEY;
|
|
440
|
+
else if (op == TD_KEY_OR_AFTER)
|
|
441
|
+
flag = HA_READ_KEY_OR_NEXT;
|
|
442
|
+
else if (op == TD_KEY_BEFORE)
|
|
443
|
+
flag = HA_READ_BEFORE_KEY;
|
|
444
|
+
else if (op == TD_KEY_OR_BEFORE)
|
|
445
|
+
flag = HA_READ_KEY_OR_PREV;
|
|
446
|
+
m_tb->seekKey(flag, m_tb->keymap());
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
readAfter(req, m_tb, this);
|
|
423
450
|
}
|
|
424
451
|
|
|
425
452
|
inline void dbExecuter::doMoveFirst(request& req)
|
|
426
453
|
{
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
454
|
+
m_tb = getTable(req.pbk->handle);
|
|
455
|
+
if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
|
|
456
|
+
{
|
|
457
|
+
if (m_tb->isNisKey(m_tb->keyNum()))
|
|
458
|
+
{
|
|
459
|
+
m_tb->clearKeybuf();
|
|
460
|
+
m_tb->seekKey(HA_READ_KEY_OR_NEXT, m_tb->keymap());
|
|
461
|
+
}
|
|
462
|
+
else
|
|
463
|
+
m_tb->getFirst();
|
|
464
|
+
}
|
|
465
|
+
readAfter(req, m_tb, this);
|
|
438
466
|
}
|
|
439
467
|
|
|
440
468
|
inline void dbExecuter::doMoveKey(request& req, int op)
|
|
441
469
|
{
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
470
|
+
m_tb = getTable(req.pbk->handle);
|
|
471
|
+
if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
|
|
472
|
+
{
|
|
473
|
+
if (op == TD_KEY_FIRST)
|
|
474
|
+
m_tb->getFirst();
|
|
475
|
+
else if (op == TD_KEY_LAST)
|
|
476
|
+
m_tb->getLast();
|
|
477
|
+
else if (op == TD_KEY_NEXT)
|
|
478
|
+
m_tb->getNext();
|
|
479
|
+
else if (op == TD_KEY_PREV)
|
|
480
|
+
m_tb->getPrev();
|
|
481
|
+
}
|
|
482
|
+
readAfter(req, m_tb, this);
|
|
455
483
|
}
|
|
456
484
|
|
|
457
|
-
inline int dbExecuter::doReadMultiWithSeek(request& req, int op,
|
|
458
|
-
|
|
485
|
+
inline int dbExecuter::doReadMultiWithSeek(request& req, int op,
|
|
486
|
+
netsvc::server::netWriter* nw)
|
|
459
487
|
{
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
488
|
+
DEBUG_MEMDUMP("doReadMultiWithSeek ", req.data, (*((short*)req.data)))
|
|
489
|
+
int ret = 1;
|
|
490
|
+
m_tb = getTable(req.pbk->handle);
|
|
491
|
+
char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
|
|
492
|
+
if (m_tb->setKeyNum(keynum))
|
|
493
|
+
{
|
|
494
|
+
m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
|
|
495
|
+
m_tb->seekKey((op == TD_KEY_GE_NEXT_MULTI) ? HA_READ_KEY_OR_NEXT
|
|
496
|
+
: HA_READ_KEY_OR_PREV,
|
|
497
|
+
m_tb->keymap());
|
|
498
|
+
|
|
499
|
+
extRequest* ereq = (extRequest*)req.data;
|
|
500
|
+
bool noBookmark = (ereq->itype & FILTER_CURRENT_TYPE_NOBOOKMARK) != 0;
|
|
501
|
+
|
|
502
|
+
// smartReadRecordsHandler scope
|
|
503
|
+
{
|
|
504
|
+
smartReadRecordsHandler srrh(m_readHandler);
|
|
505
|
+
req.result = m_readHandler->begin(m_tb, ereq, true, nw,
|
|
506
|
+
(op == TD_KEY_GE_NEXT_MULTI),
|
|
507
|
+
noBookmark, false);
|
|
508
|
+
if (req.result != 0)
|
|
509
|
+
return ret;
|
|
510
|
+
if (m_tb->stat() == 0)
|
|
511
|
+
{
|
|
512
|
+
if (op == TD_KEY_GE_NEXT_MULTI)
|
|
513
|
+
m_tb->getNextExt(m_readHandler, true, noBookmark);
|
|
514
|
+
else if (op == TD_KEY_LE_PREV_MULTI)
|
|
515
|
+
m_tb->getPrevExt(m_readHandler, true, noBookmark);
|
|
516
|
+
}
|
|
517
|
+
req.result = errorCodeSht(m_tb->stat());
|
|
518
|
+
DEBUG_WRITELOG2(op, req);
|
|
519
|
+
}
|
|
520
|
+
short dummy = 0;
|
|
521
|
+
size_t& size = nw->datalen;
|
|
522
|
+
size = req.serializeForExt(m_tb, nw);
|
|
523
|
+
char* resultBuffer = nw->ptr();
|
|
524
|
+
netsvc::server::buffers* optionalData = nw->optionalData();
|
|
525
|
+
if ((req.paramMask & P_MASK_BLOBBODY) && m_blobBuffer->fieldCount())
|
|
526
|
+
size = req.serializeBlobBody(m_blobBuffer, resultBuffer, size,
|
|
527
|
+
FILE_MAP_SIZE, optionalData, dummy);
|
|
528
|
+
|
|
529
|
+
DEBUG_PROFILE_END_OP(1, op)
|
|
530
|
+
ret = EXECUTE_RESULT_SUCCESS;
|
|
531
|
+
}
|
|
532
|
+
if (m_tb)
|
|
533
|
+
m_tb->unUse();
|
|
534
|
+
return ret;
|
|
492
535
|
}
|
|
493
536
|
|
|
494
|
-
inline int dbExecuter::doReadMulti(request& req, int op,
|
|
495
|
-
|
|
537
|
+
inline int dbExecuter::doReadMulti(request& req, int op,
|
|
538
|
+
netsvc::server::netWriter* nw)
|
|
496
539
|
{
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
+
DEBUG_MEMDUMP("doReadMulti ", req.data, (*((short*)req.data)))
|
|
541
|
+
int ret = 1;
|
|
542
|
+
m_tb = getTable(req.pbk->handle);
|
|
543
|
+
extRequest* ereq = (extRequest*)req.data;
|
|
544
|
+
bool incCurrent = (ereq->itype & FILTER_CURRENT_TYPE_INC) != 0;
|
|
545
|
+
bool noBookmark = (ereq->itype & FILTER_CURRENT_TYPE_NOBOOKMARK) != 0;
|
|
546
|
+
|
|
547
|
+
bool forword = (op == TD_KEY_NEXT_MULTI) || (op == TD_POS_NEXT_MULTI);
|
|
548
|
+
if (op == TD_KEY_SEEK_MULTI)
|
|
549
|
+
{
|
|
550
|
+
char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
|
|
551
|
+
if (!m_tb->setKeyNum(keynum))
|
|
552
|
+
{
|
|
553
|
+
if (m_tb)
|
|
554
|
+
m_tb->unUse();
|
|
555
|
+
return ret;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
// smartReadRecordsHandler scope
|
|
559
|
+
{
|
|
560
|
+
smartReadRecordsHandler srrh(m_readHandler);
|
|
561
|
+
req.result = m_readHandler->begin(m_tb, ereq, (op != TD_KEY_SEEK_MULTI),
|
|
562
|
+
nw, forword, noBookmark,
|
|
563
|
+
(op == TD_KEY_SEEK_MULTI));
|
|
564
|
+
if (req.result != 0)
|
|
565
|
+
{
|
|
566
|
+
if (m_tb)
|
|
567
|
+
m_tb->unUse();
|
|
568
|
+
return ret;
|
|
569
|
+
}
|
|
570
|
+
if (op == TD_KEY_SEEK_MULTI)
|
|
571
|
+
req.result =
|
|
572
|
+
errorCodeSht(seekEach((extRequestSeeks*)req.data, noBookmark));
|
|
573
|
+
else
|
|
574
|
+
{
|
|
575
|
+
if (op == TD_KEY_NEXT_MULTI)
|
|
576
|
+
m_tb->getNextExt(m_readHandler, incCurrent, noBookmark);
|
|
577
|
+
else if (op == TD_KEY_PREV_MULTI)
|
|
578
|
+
m_tb->getPrevExt(m_readHandler, incCurrent, noBookmark);
|
|
579
|
+
else if (op == TD_POS_NEXT_MULTI)
|
|
580
|
+
m_tb->stepNextExt(m_readHandler, incCurrent, noBookmark);
|
|
581
|
+
else if (op == TD_POS_PREV_MULTI)
|
|
582
|
+
m_tb->stepPrevExt(m_readHandler, incCurrent, noBookmark);
|
|
583
|
+
req.result = errorCodeSht(m_tb->stat());
|
|
584
|
+
}
|
|
585
|
+
DEBUG_WRITELOG2(op, req);
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
short dummy = 0;
|
|
589
|
+
size_t& size = nw->datalen;
|
|
590
|
+
size = req.serializeForExt(m_tb, nw);
|
|
591
|
+
|
|
592
|
+
char* resultBuffer = nw->ptr();
|
|
593
|
+
netsvc::server::buffers* optionalData = nw->optionalData();
|
|
594
|
+
if ((req.paramMask & P_MASK_BLOBBODY) && m_blobBuffer->fieldCount())
|
|
595
|
+
size = req.serializeBlobBody(m_blobBuffer, resultBuffer, size,
|
|
596
|
+
FILE_MAP_SIZE, optionalData, dummy);
|
|
597
|
+
|
|
598
|
+
DEBUG_PROFILE_END_OP(1, op)
|
|
599
|
+
|
|
600
|
+
ret = EXECUTE_RESULT_SUCCESS;
|
|
601
|
+
|
|
602
|
+
if (m_tb)
|
|
603
|
+
m_tb->unUse();
|
|
604
|
+
return ret;
|
|
540
605
|
}
|
|
541
606
|
|
|
542
|
-
inline
|
|
607
|
+
inline __int64 intValue(const unsigned char* p, int len)
|
|
543
608
|
{
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
609
|
+
switch (len)
|
|
610
|
+
{
|
|
611
|
+
case 1:
|
|
612
|
+
return *((char*)p);
|
|
613
|
+
case 2:
|
|
614
|
+
return *((short*)p);
|
|
615
|
+
case 3:
|
|
616
|
+
return *((int*)p) & 0xFFFFFF;
|
|
617
|
+
case 4:
|
|
618
|
+
return *((int*)p);
|
|
619
|
+
case 8:
|
|
620
|
+
return *((__int64*)p);
|
|
621
|
+
}
|
|
622
|
+
return 0;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
inline short dbExecuter::seekEach(extRequestSeeks* ereq, bool noBookmark)
|
|
626
|
+
{
|
|
627
|
+
|
|
628
|
+
short stat = 0;
|
|
629
|
+
seek* fd = &ereq->seekData;
|
|
630
|
+
short seg = m_tb->setKeyValuesPacked(fd->ptr, fd->len);
|
|
631
|
+
key_part_map keyMap = m_tb->keymap();
|
|
632
|
+
if (!noBookmark)
|
|
633
|
+
{
|
|
634
|
+
if (seg != -1)
|
|
635
|
+
{
|
|
636
|
+
keyMap = (1U << seg) - 1;
|
|
637
|
+
seg = 1;
|
|
638
|
+
}
|
|
639
|
+
else
|
|
640
|
+
seg = !m_tb->isUniqueKey();
|
|
641
|
+
}
|
|
642
|
+
else
|
|
643
|
+
seg = 0;
|
|
644
|
+
|
|
645
|
+
for (int i = 0; i < ereq->logicalCount; ++i)
|
|
646
|
+
{
|
|
647
|
+
m_tb->setKeyValuesPacked(fd->ptr, fd->len);
|
|
648
|
+
m_tb->seekKey(HA_READ_KEY_EXACT, keyMap);
|
|
649
|
+
if (m_tb->stat() == 0)
|
|
650
|
+
{
|
|
651
|
+
if (seg)
|
|
652
|
+
stat = m_readHandler->write((uchar*)&i, 4);
|
|
653
|
+
else
|
|
654
|
+
stat =
|
|
655
|
+
m_readHandler->write(m_tb->position(), m_tb->posPtrLen());
|
|
656
|
+
}
|
|
657
|
+
else
|
|
658
|
+
stat = m_readHandler->write(NULL, m_tb->posPtrLen());
|
|
659
|
+
if (stat)
|
|
660
|
+
break;
|
|
661
|
+
|
|
662
|
+
// for hasMany join
|
|
663
|
+
if (seg)
|
|
664
|
+
{
|
|
665
|
+
while (m_tb->stat() == 0)
|
|
666
|
+
{
|
|
667
|
+
m_tb->getNextSame(keyMap);
|
|
668
|
+
if (m_tb->stat() == 0)
|
|
669
|
+
stat = m_readHandler->write(
|
|
670
|
+
(uchar*)&i, 4); // write seek sequential number
|
|
671
|
+
if (stat)
|
|
672
|
+
break;
|
|
673
|
+
}
|
|
674
|
+
if (stat)
|
|
675
|
+
break;
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
fd = fd->next();
|
|
679
|
+
}
|
|
680
|
+
if (stat == 0)
|
|
681
|
+
stat = STATUS_REACHED_FILTER_COND;
|
|
682
|
+
return stat;
|
|
560
683
|
}
|
|
561
684
|
|
|
562
685
|
inline void dbExecuter::doStepRead(request& req, int op)
|
|
563
686
|
{
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
687
|
+
m_tb = getTable(req.pbk->handle);
|
|
688
|
+
if (op == TD_POS_FIRST)
|
|
689
|
+
m_tb->stepFirst();
|
|
690
|
+
else if (op == TD_POS_LAST)
|
|
691
|
+
m_tb->stepLast();
|
|
692
|
+
else if (op == TD_POS_NEXT)
|
|
693
|
+
m_tb->stepNext();
|
|
694
|
+
else if (op == TD_POS_PREV)
|
|
695
|
+
m_tb->stepPrev();
|
|
696
|
+
readAfter(req, m_tb, this);
|
|
574
697
|
}
|
|
575
698
|
|
|
576
699
|
inline void dbExecuter::doInsert(request& req)
|
|
577
700
|
{
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
701
|
+
m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
|
|
702
|
+
bool ncc = (req.keyNum == -1);
|
|
703
|
+
if (!ncc)
|
|
704
|
+
{
|
|
705
|
+
if (!m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
|
|
706
|
+
{
|
|
707
|
+
req.result = errorCodeSht(m_tb->stat());
|
|
708
|
+
return;
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
m_tb->clearBuffer();
|
|
712
|
+
m_tb->setRecordFromPacked((const uchar*)req.data, *(req.datalen),
|
|
713
|
+
req.blobHeader);
|
|
714
|
+
smartBulkInsert sbi(m_tb, 1);
|
|
715
|
+
__int64 aincValue = m_tb->insert(ncc);
|
|
716
|
+
req.result = errorCodeSht(m_tb->stat());
|
|
717
|
+
if (aincValue)
|
|
718
|
+
{
|
|
719
|
+
req.paramMask = P_MASK_INS_AUTOINC;
|
|
720
|
+
req.data = m_tb->record();
|
|
721
|
+
}
|
|
722
|
+
else
|
|
723
|
+
req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
|
|
600
724
|
}
|
|
601
725
|
|
|
602
726
|
inline void dbExecuter::doUpdateKey(request& req)
|
|
603
727
|
{
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
728
|
+
m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
|
|
729
|
+
char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
|
|
730
|
+
if (m_tb->setKeyNum(keynum))
|
|
731
|
+
{
|
|
732
|
+
m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
|
|
733
|
+
m_tb->seekKey(HA_READ_KEY_EXACT, m_tb->keymap());
|
|
734
|
+
if (m_tb->stat() == 0)
|
|
735
|
+
{
|
|
736
|
+
m_tb->beginUpdate(keynum);
|
|
737
|
+
if (m_tb->stat() == 0)
|
|
738
|
+
{
|
|
739
|
+
m_tb->setRecordFromPacked((const uchar*)req.data,
|
|
740
|
+
*(req.datalen), req.blobHeader);
|
|
741
|
+
m_tb->update(true);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
req.result = errorCodeSht(m_tb->stat());
|
|
746
|
+
req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
|
|
623
747
|
}
|
|
624
748
|
|
|
625
749
|
inline void dbExecuter::doUpdate(request& req)
|
|
626
750
|
{
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
751
|
+
m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
|
|
752
|
+
bool ncc = (req.keyNum == -1);
|
|
753
|
+
m_tb->beginUpdate(req.keyNum);
|
|
754
|
+
if (m_tb->stat() == 0)
|
|
755
|
+
{
|
|
756
|
+
m_tb->setRecordFromPacked((const uchar*)req.data, *(req.datalen),
|
|
757
|
+
req.blobHeader);
|
|
758
|
+
m_tb->update(ncc);
|
|
759
|
+
}
|
|
760
|
+
req.result = errorCodeSht(m_tb->stat());
|
|
761
|
+
req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
|
|
637
762
|
}
|
|
638
763
|
|
|
639
764
|
inline void dbExecuter::doDeleteKey(request& req)
|
|
640
765
|
{
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
766
|
+
m_tb = getTable(req.pbk->handle, SQLCOM_DELETE);
|
|
767
|
+
char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
|
|
768
|
+
if (m_tb->setKeyNum(keynum))
|
|
769
|
+
{
|
|
770
|
+
m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
|
|
771
|
+
m_tb->seekKey(HA_READ_KEY_EXACT, m_tb->keymap());
|
|
772
|
+
if (m_tb->stat() == 0)
|
|
773
|
+
{
|
|
774
|
+
m_tb->beginDel();
|
|
775
|
+
if (m_tb->stat() == 0)
|
|
776
|
+
m_tb->del();
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
req.result = errorCodeSht(m_tb->stat());
|
|
780
|
+
req.paramMask = P_MASK_POSBLK;
|
|
656
781
|
}
|
|
657
782
|
|
|
658
783
|
inline void dbExecuter::doDelete(request& req)
|
|
659
784
|
{
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
785
|
+
m_tb = getTable(req.pbk->handle, SQLCOM_DELETE);
|
|
786
|
+
m_tb->beginDel();
|
|
787
|
+
if (m_tb->stat() == 0)
|
|
788
|
+
m_tb->del();
|
|
789
|
+
req.result = errorCodeSht(m_tb->stat());
|
|
790
|
+
req.paramMask = P_MASK_POSBLK;
|
|
666
791
|
}
|
|
667
792
|
|
|
668
793
|
inline void dbExecuter::doInsertBulk(request& req)
|
|
669
794
|
{
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
795
|
+
m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
|
|
796
|
+
if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
|
|
797
|
+
{
|
|
798
|
+
ushort_td* n = (ushort_td*)req.data;
|
|
799
|
+
ushort_td ret = 0;
|
|
800
|
+
const uchar* pos = (const uchar*)req.data + sizeof(ushort_td);
|
|
801
|
+
int ins_rows = 0;
|
|
802
|
+
BUILINSERT_SCOPE
|
|
803
|
+
{
|
|
804
|
+
smartBulkInsert sbi(m_tb, *n);
|
|
805
|
+
for (ushort_td i = 0; i < *n; i++)
|
|
806
|
+
{
|
|
807
|
+
ushort_td len = *((ushort_td*)pos);
|
|
808
|
+
if (pos + len > (const uchar*)req.data + *req.datalen)
|
|
809
|
+
{
|
|
810
|
+
ret = STATUS_BUFFERTOOSMALL;
|
|
811
|
+
break;
|
|
812
|
+
}
|
|
813
|
+
else
|
|
814
|
+
{
|
|
815
|
+
m_tb->clearBuffer();
|
|
816
|
+
m_tb->setRecordFromPacked(pos + sizeof(ushort_td), len,
|
|
817
|
+
req.blobHeader);
|
|
818
|
+
|
|
819
|
+
if (i == *n - 1)
|
|
820
|
+
m_tb->insert((req.keyNum != -1));
|
|
821
|
+
else
|
|
822
|
+
m_tb->insert(true);
|
|
823
|
+
ret = m_tb->stat();
|
|
824
|
+
}
|
|
825
|
+
if (ret == 0)
|
|
826
|
+
ins_rows++;
|
|
827
|
+
DEBUG_INSERT(m_tb, pos + sizeof(ushort_td), len, i,
|
|
828
|
+
i + 1 - ins_rows)
|
|
829
|
+
pos += len + sizeof(ushort_td);
|
|
830
|
+
}
|
|
831
|
+
*n = ins_rows;
|
|
832
|
+
}
|
|
833
|
+
req.result = errorCodeSht(ret);
|
|
834
|
+
req.resultLen = 4;
|
|
835
|
+
req.paramMask = P_MASK_READ_EXT;
|
|
836
|
+
}
|
|
837
|
+
else
|
|
838
|
+
req.result = errorCodeSht(m_tb->stat());
|
|
712
839
|
}
|
|
713
840
|
|
|
714
841
|
inline void dbExecuter::doStat(request& req)
|
|
715
842
|
{
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
843
|
+
m_tb = getTable(req.pbk->handle);
|
|
844
|
+
req.paramMask = P_MASK_STAT;
|
|
845
|
+
req.resultLen = *req.datalen;
|
|
846
|
+
if (req.resultLen >= 6 + sizeof(uint))
|
|
847
|
+
{
|
|
848
|
+
ushort_td len = (ushort_td)(m_tb->recordLenCl());
|
|
849
|
+
#ifdef USE_BTRV_VARIABLE_LEN
|
|
850
|
+
if (m_tb->recordFormatType() & RF_FIXED_PLUS_VALIABLE_LEN)
|
|
851
|
+
len -=
|
|
852
|
+
m_tb->lastVarFiled()->pack_length() - m_tb->lastVarLenBytes();
|
|
853
|
+
#endif
|
|
854
|
+
memcpy((char*)req.data, &len, sizeof(ushort_td));
|
|
855
|
+
uint rows = (uint)m_tb->recordCount((req.keyNum != 0));
|
|
856
|
+
memcpy((char*)req.data + 6, &rows, sizeof(uint));
|
|
857
|
+
}
|
|
858
|
+
else
|
|
859
|
+
req.result = STATUS_BUFFERTOOSMALL;
|
|
730
860
|
}
|
|
731
861
|
|
|
732
862
|
inline short getTrnsactionType(int op)
|
|
733
863
|
{
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
864
|
+
if (op > PARALLEL_TRN) // 1000
|
|
865
|
+
op -= PARALLEL_TRN;
|
|
866
|
+
if (op > NOWAIT_WRITE) // 500
|
|
867
|
+
op -= NOWAIT_WRITE;
|
|
868
|
+
if (op >= 300)
|
|
869
|
+
return TRN_RECORD_LOCK_MUILTI;
|
|
870
|
+
return TRN_RECORD_LOCK_SINGLE;
|
|
741
871
|
}
|
|
742
872
|
|
|
743
|
-
int dbExecuter::commandExec(request& req,
|
|
873
|
+
int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
744
874
|
{
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
875
|
+
DEBUG_PROFILE_START(1)
|
|
876
|
+
m_tb = NULL;
|
|
877
|
+
char* resultBuffer = nw->ptr();
|
|
878
|
+
size_t& size = nw->datalen;
|
|
879
|
+
netsvc::server::buffers* optionalData = nw->optionalData();
|
|
880
|
+
|
|
881
|
+
int op = req.op % 100;
|
|
882
|
+
int opTrn = req.op;
|
|
883
|
+
if (op == 99)
|
|
884
|
+
return 0;
|
|
885
|
+
|
|
886
|
+
if ((op >= TD_KEY_EQUAL_KO) && (op <= TD_KEY_LAST_KO))
|
|
887
|
+
op -= 50;
|
|
888
|
+
|
|
889
|
+
try
|
|
890
|
+
{
|
|
891
|
+
posblk* pbk = req.pbk;
|
|
892
|
+
posblk tmp;
|
|
893
|
+
bool transactionResult = false;
|
|
894
|
+
if (pbk == NULL)
|
|
895
|
+
pbk = &tmp;
|
|
896
|
+
req.reset();
|
|
897
|
+
switch (op)
|
|
898
|
+
{
|
|
899
|
+
case TD_GETSERVER_CHARSET:
|
|
900
|
+
{
|
|
901
|
+
if (*req.datalen == sizeof(trdVersiton))
|
|
902
|
+
{
|
|
903
|
+
trdVersiton* ver = (trdVersiton*)req.data;
|
|
904
|
+
strcpy_s(ver->cherserServer, sizeof(ver->cherserServer),
|
|
905
|
+
global_system_variables.collation_server->csname);
|
|
906
|
+
ver->srvMajor = TRANSACTD_VER_MAJOR;
|
|
907
|
+
ver->srvMinor = TRANSACTD_VER_MINOR;
|
|
908
|
+
ver->srvRelease = TRANSACTD_VER_RELEASE;
|
|
909
|
+
req.resultLen = sizeof(trdVersiton);
|
|
910
|
+
// req.data = (void*)
|
|
911
|
+
// global_system_variables.collation_server->csname;
|
|
912
|
+
// req.resultLen = (uint_td)strlen(
|
|
913
|
+
// global_system_variables.collation_server->csname);
|
|
914
|
+
req.paramMask |= P_MASK_DATA | P_MASK_DATALEN;
|
|
915
|
+
}
|
|
916
|
+
else
|
|
917
|
+
req.result = SERVER_CLIENT_NOT_COMPATIBLE;
|
|
918
|
+
break;
|
|
919
|
+
}
|
|
920
|
+
case TD_CONNECT:
|
|
921
|
+
connect(req);
|
|
922
|
+
break;
|
|
923
|
+
case TD_RESET_CLIENT:
|
|
924
|
+
case TD_STOP_ENGINE: // close all table
|
|
925
|
+
releaseDatabase(req, op);
|
|
926
|
+
break;
|
|
927
|
+
case TD_AUTOMEKE_SCHEMA:
|
|
928
|
+
m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
|
|
929
|
+
req.result = schemaBuilder().execute(getDatabaseCid(req.cid), m_tb);
|
|
930
|
+
break;
|
|
931
|
+
case TD_CREATETABLE:
|
|
932
|
+
doCreateTable(req);
|
|
933
|
+
break;
|
|
934
|
+
case TD_OPENTABLE:
|
|
935
|
+
doOpenTable(req);
|
|
936
|
+
break;
|
|
937
|
+
case TD_CLOSETABLE:
|
|
938
|
+
m_tb = getTable(req.pbk->handle);
|
|
939
|
+
if (m_tb)
|
|
940
|
+
{
|
|
941
|
+
m_tb->close();
|
|
942
|
+
m_tb = NULL;
|
|
943
|
+
}
|
|
944
|
+
break;
|
|
945
|
+
case TD_KEY_SEEK:
|
|
946
|
+
case TD_KEY_AFTER:
|
|
947
|
+
case TD_KEY_OR_AFTER:
|
|
948
|
+
case TD_KEY_BEFORE:
|
|
949
|
+
case TD_KEY_OR_BEFORE:
|
|
950
|
+
doSeekKey(req, op);
|
|
951
|
+
break;
|
|
952
|
+
case TD_KEY_FIRST:
|
|
953
|
+
doMoveFirst(req);
|
|
954
|
+
break;
|
|
955
|
+
case TD_KEY_PREV:
|
|
956
|
+
case TD_KEY_LAST:
|
|
957
|
+
case TD_KEY_NEXT:
|
|
958
|
+
doMoveKey(req, op);
|
|
959
|
+
break;
|
|
960
|
+
case TD_REC_INSERT:
|
|
961
|
+
doInsert(req);
|
|
962
|
+
break;
|
|
963
|
+
case TD_REC_UPDATEATKEY:
|
|
964
|
+
doUpdateKey(req);
|
|
965
|
+
break;
|
|
966
|
+
case TD_REC_UPDATE:
|
|
967
|
+
doUpdate(req);
|
|
968
|
+
break;
|
|
969
|
+
case TD_REC_DELLETEATKEY:
|
|
970
|
+
doDeleteKey(req);
|
|
971
|
+
break;
|
|
972
|
+
case TD_REC_DELETE:
|
|
973
|
+
doDelete(req);
|
|
974
|
+
break;
|
|
975
|
+
case TD_BEGIN_TRANSACTION:
|
|
976
|
+
transactionResult =
|
|
977
|
+
getDatabaseCid(req.cid)->beginTrn(getTrnsactionType(opTrn));
|
|
978
|
+
break;
|
|
979
|
+
case TD_END_TRANSACTION:
|
|
980
|
+
transactionResult = getDatabaseCid(req.cid)->commitTrn();
|
|
981
|
+
break;
|
|
982
|
+
case TD_ABORT_TRANSACTION:
|
|
983
|
+
transactionResult = getDatabaseCid(req.cid)->abortTrn();
|
|
984
|
+
break;
|
|
985
|
+
case TD_BEGIN_SHAPSHOT:
|
|
986
|
+
transactionResult = getDatabaseCid(req.cid)->beginSnapshot();
|
|
987
|
+
break;
|
|
988
|
+
case TD_END_SNAPSHOT:
|
|
989
|
+
transactionResult = getDatabaseCid(req.cid)->endSnapshot();
|
|
990
|
+
break;
|
|
991
|
+
case TD_TABLE_INFO: // support recordlen and recordCount only.
|
|
992
|
+
doStat(req);
|
|
993
|
+
break;
|
|
994
|
+
case TD_POS_FIRST:
|
|
995
|
+
case TD_POS_LAST:
|
|
996
|
+
case TD_POS_NEXT:
|
|
997
|
+
case TD_POS_PREV:
|
|
998
|
+
doStepRead(req, op);
|
|
999
|
+
break;
|
|
1000
|
+
case TD_BOOKMARK:
|
|
1001
|
+
m_tb = getTable(req.pbk->handle);
|
|
1002
|
+
req.paramMask = P_MASK_MOVPOS;
|
|
1003
|
+
req.data = (void*)m_tb->position();
|
|
1004
|
+
req.resultLen = m_tb->posPtrLen();
|
|
1005
|
+
break;
|
|
1006
|
+
case TD_MOVE_BOOKMARK:
|
|
1007
|
+
m_tb = getTable(req.pbk->handle);
|
|
1008
|
+
m_tb->movePos((uchar*)req.data,
|
|
1009
|
+
m_tb->keyNumByMakeOrder(req.keyNum));
|
|
1010
|
+
readAfter(req, m_tb, this);
|
|
1011
|
+
break;
|
|
1012
|
+
case TD_GETDIRECTORY:
|
|
1013
|
+
{
|
|
1014
|
+
database* db = getDatabaseCid(req.cid);
|
|
1015
|
+
if (db->name().size() < 64)
|
|
1016
|
+
{
|
|
1017
|
+
req.keylen = (uchar_td)db->name().size() + 1;
|
|
1018
|
+
req.keybuf = (void*)db->name().c_str();
|
|
1019
|
+
req.paramMask = P_MASK_KEYBUF;
|
|
1020
|
+
}
|
|
1021
|
+
else
|
|
1022
|
+
req.result = STATUS_BUFFERTOOSMALL;
|
|
1023
|
+
break;
|
|
1024
|
+
}
|
|
1025
|
+
case TD_VERSION:
|
|
1026
|
+
if (*req.datalen >= sizeof(version) * 3)
|
|
1027
|
+
{
|
|
1028
|
+
version* v = (version*)req.data;
|
|
1029
|
+
++v;
|
|
1030
|
+
v->majorVersion = MYSQL_VERSION_ID / 10000;
|
|
1031
|
+
v->minorVersion = (MYSQL_VERSION_ID / 100) % 100;
|
|
1032
|
+
v->Type = 'M';
|
|
1033
|
+
++v;
|
|
1034
|
+
v->majorVersion = TRANSACTD_VER_MAJOR;
|
|
1035
|
+
v->minorVersion = TRANSACTD_VER_MINOR;
|
|
1036
|
+
v->Type = 'T';
|
|
1037
|
+
req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
|
|
1038
|
+
req.resultLen = sizeof(version) * 3;
|
|
1039
|
+
}
|
|
1040
|
+
else
|
|
1041
|
+
req.result = STATUS_BUFFERTOOSMALL;
|
|
1042
|
+
break;
|
|
1043
|
+
case TD_CLEAR_OWNERNAME:
|
|
1044
|
+
req.keybuf = (void_td*)"";
|
|
1045
|
+
case TD_SET_OWNERNAME:
|
|
1046
|
+
{
|
|
1047
|
+
database* db = getDatabaseCid(req.cid);
|
|
1048
|
+
m_tb = getTable(req.pbk->handle);
|
|
1049
|
+
int num = (req.keyNum > 1) ? req.keyNum - 2 : req.keyNum;
|
|
1050
|
+
num += '0';
|
|
1051
|
+
std::string s("%@%");
|
|
1052
|
+
s += (const char*)#
|
|
1053
|
+
s += (const char*)req.keybuf;
|
|
1054
|
+
req.result = ddl_execSql(
|
|
1055
|
+
db->thd(),
|
|
1056
|
+
makeSQLChangeTableComment(db->name(), m_tb->name(), s.c_str()));
|
|
1057
|
+
break;
|
|
1058
|
+
}
|
|
1059
|
+
case TD_DROP_INDEX:
|
|
1060
|
+
{ // Key name of multi byte charctord is not supported. Use only ascii.
|
|
1061
|
+
database* db = getDatabaseCid(req.cid);
|
|
1062
|
+
m_tb = getTable(req.pbk->handle);
|
|
1063
|
+
req.result = ddl_execSql(
|
|
1064
|
+
db->thd(),
|
|
1065
|
+
makeSQLDropIndex(
|
|
1066
|
+
db->name(), m_tb->name(),
|
|
1067
|
+
m_tb->keyName(m_tb->keyNumByMakeOrder(req.keyNum))));
|
|
1068
|
+
break;
|
|
1069
|
+
}
|
|
1070
|
+
case TD_KEY_GE_NEXT_MULTI:
|
|
1071
|
+
case TD_KEY_LE_PREV_MULTI:
|
|
1072
|
+
nw->setClientBuffferSize(*(req.datalen));
|
|
1073
|
+
if (doReadMultiWithSeek(req, op, nw) == EXECUTE_RESULT_SUCCESS)
|
|
1074
|
+
return EXECUTE_RESULT_SUCCESS;
|
|
1075
|
+
break;
|
|
1076
|
+
case TD_KEY_SEEK_MULTI:
|
|
1077
|
+
case TD_KEY_NEXT_MULTI:
|
|
1078
|
+
case TD_KEY_PREV_MULTI:
|
|
1079
|
+
case TD_POS_NEXT_MULTI:
|
|
1080
|
+
case TD_POS_PREV_MULTI:
|
|
1081
|
+
nw->setClientBuffferSize(*(req.datalen));
|
|
1082
|
+
if (doReadMulti(req, op, nw) == EXECUTE_RESULT_SUCCESS)
|
|
1083
|
+
return EXECUTE_RESULT_SUCCESS;
|
|
1084
|
+
break;
|
|
1085
|
+
case TD_MOVE_PER:
|
|
1086
|
+
m_tb = getTable(req.pbk->handle);
|
|
1087
|
+
if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
|
|
1088
|
+
m_tb->getByPercentage(*((ushort_td*)req.data));
|
|
1089
|
+
readAfter(req, m_tb, this);
|
|
1090
|
+
break;
|
|
1091
|
+
case TD_GET_PER:
|
|
1092
|
+
m_tb = getTable(req.pbk->handle);
|
|
1093
|
+
m_tb->calcPercentage();
|
|
1094
|
+
req.result = errorCodeSht(m_tb->stat());
|
|
1095
|
+
if (m_tb->stat() == 0)
|
|
1096
|
+
{
|
|
1097
|
+
req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
|
|
1098
|
+
req.data = m_tb->percentResult();
|
|
1099
|
+
req.resultLen = sizeof(int);
|
|
1100
|
+
}
|
|
1101
|
+
break;
|
|
1102
|
+
case TD_INSERT_BULK:
|
|
1103
|
+
doInsertBulk(req);
|
|
1104
|
+
break;
|
|
1105
|
+
}
|
|
1106
|
+
if (m_tb)
|
|
1107
|
+
m_tb->unUse();
|
|
1108
|
+
|
|
1109
|
+
DEBUG_WRITELOG2(op, req)
|
|
1110
|
+
size = req.serialize(m_tb, resultBuffer);
|
|
1111
|
+
short dymmy = 0;
|
|
1112
|
+
if ((req.result == 0) && (req.paramMask & P_MASK_BLOBBODY) &&
|
|
1113
|
+
m_blobBuffer->fieldCount())
|
|
1114
|
+
size = req.serializeBlobBody(m_blobBuffer, resultBuffer, size,
|
|
1115
|
+
FILE_MAP_SIZE, optionalData, dymmy);
|
|
1116
|
+
|
|
1117
|
+
if (transactionResult)
|
|
1118
|
+
{
|
|
1119
|
+
if ((op == TD_BEGIN_TRANSACTION) || (op == TD_BEGIN_SHAPSHOT))
|
|
1120
|
+
return EXECUTE_RESULT_FORCSE_SYNC;
|
|
1121
|
+
return EXECUTE_RESULT_FORCSE_ASYNC;
|
|
1122
|
+
}
|
|
1123
|
+
DEBUG_PROFILE_END_OP(1, op)
|
|
1124
|
+
return EXECUTE_RESULT_SUCCESS;
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1127
|
+
catch (bzs::rtl::exception& e)
|
|
1128
|
+
{
|
|
1129
|
+
clenupNoException();
|
|
1130
|
+
req.reset();
|
|
1131
|
+
const int* code = getCode(e);
|
|
1132
|
+
if (code)
|
|
1133
|
+
req.result = *code;
|
|
1134
|
+
else
|
|
1135
|
+
{
|
|
1136
|
+
req.result = 20000;
|
|
1137
|
+
sql_print_error("%s", boost::diagnostic_information(e).c_str());
|
|
1138
|
+
}
|
|
1139
|
+
printErrorMessage(code, getMsg(e));
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
catch (...)
|
|
1143
|
+
{
|
|
1144
|
+
clenupNoException();
|
|
1145
|
+
req.reset();
|
|
1146
|
+
req.result = 20001;
|
|
1147
|
+
dumpStdErr(op, req, m_tb);
|
|
1148
|
+
try
|
|
1149
|
+
{
|
|
1150
|
+
if (m_tb)
|
|
1151
|
+
m_tb->close();
|
|
1152
|
+
}
|
|
1153
|
+
catch (...)
|
|
1154
|
+
{
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
DEBUG_WRITELOG3(op, req, true);
|
|
1159
|
+
req.paramMask = 0;
|
|
1160
|
+
size = req.serialize(NULL, resultBuffer);
|
|
1161
|
+
return EXECUTE_RESULT_SUCCESS;
|
|
993
1162
|
}
|
|
994
1163
|
|
|
995
1164
|
// ---------------------------------------------------------------------------
|
|
996
1165
|
// class connMgrExecuter
|
|
997
1166
|
// ---------------------------------------------------------------------------
|
|
998
1167
|
connMgrExecuter::connMgrExecuter(request& req, unsigned __int64 parent)
|
|
999
|
-
|
|
1168
|
+
: m_req(req), m_modHandle(parent)
|
|
1000
1169
|
{
|
|
1001
|
-
|
|
1002
1170
|
}
|
|
1003
1171
|
|
|
1004
1172
|
int connMgrExecuter::read(char* buf, size_t& size)
|
|
1005
1173
|
{
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1174
|
+
connManager st(m_modHandle);
|
|
1175
|
+
unsigned __int64* mod = (unsigned __int64*)m_req.keybuf;
|
|
1176
|
+
|
|
1177
|
+
const connManager::records& records = st.getRecords(mod[0], (int)mod[1]);
|
|
1178
|
+
m_req.reset();
|
|
1179
|
+
m_req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
|
|
1180
|
+
if (records.size())
|
|
1181
|
+
m_req.data = (void*)&records[0];
|
|
1182
|
+
else
|
|
1183
|
+
m_req.paramMask = P_MASK_DATALEN;
|
|
1184
|
+
m_req.resultLen = (uint_td)(sizeof(record) * records.size());
|
|
1185
|
+
size = m_req.serialize(NULL, buf);
|
|
1186
|
+
return EXECUTE_RESULT_SUCCESS;
|
|
1019
1187
|
}
|
|
1020
1188
|
|
|
1021
1189
|
int connMgrExecuter::disconnectOne(char* buf, size_t& size)
|
|
1022
1190
|
{
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1191
|
+
connManager st(m_modHandle);
|
|
1192
|
+
unsigned __int64* mod = (unsigned __int64*)m_req.keybuf;
|
|
1193
|
+
st.disconnect(*mod);
|
|
1194
|
+
m_req.reset();
|
|
1195
|
+
size = m_req.serialize(NULL, buf);
|
|
1196
|
+
return EXECUTE_RESULT_SUCCESS;
|
|
1029
1197
|
}
|
|
1030
1198
|
|
|
1031
1199
|
int connMgrExecuter::disconnectAll(char* buf, size_t& size)
|
|
1032
1200
|
{
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1201
|
+
connManager st(m_modHandle);
|
|
1202
|
+
|
|
1203
|
+
st.disconnectAll();
|
|
1204
|
+
m_req.reset();
|
|
1205
|
+
size = m_req.serialize(NULL, buf);
|
|
1206
|
+
return EXECUTE_RESULT_SUCCESS;
|
|
1039
1207
|
}
|
|
1040
1208
|
|
|
1041
|
-
int connMgrExecuter::commandExec(
|
|
1209
|
+
int connMgrExecuter::commandExec(netsvc::server::netWriter* nw)
|
|
1042
1210
|
{
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1211
|
+
if (m_req.keyNum == TD_STSTCS_READ)
|
|
1212
|
+
return read(nw->ptr(), nw->datalen);
|
|
1213
|
+
else if (m_req.keyNum == TD_STSTCS_DISCONNECT_ONE)
|
|
1214
|
+
return disconnectOne(nw->ptr(), nw->datalen);
|
|
1215
|
+
else if (m_req.keyNum == TD_STSTCS_DISCONNECT_ALL)
|
|
1216
|
+
return disconnectAll(nw->ptr(), nw->datalen);
|
|
1217
|
+
return 0;
|
|
1050
1218
|
}
|
|
1051
1219
|
|
|
1052
|
-
|
|
1053
1220
|
// ---------------------------------------------------------------------------
|
|
1054
1221
|
// class commandExecuter
|
|
1055
1222
|
// ---------------------------------------------------------------------------
|
|
1056
|
-
commandExecuter::commandExecuter(__int64 parent):m_modHandle(parent)
|
|
1223
|
+
commandExecuter::commandExecuter(__int64 parent) : m_modHandle(parent)
|
|
1057
1224
|
{
|
|
1058
|
-
|
|
1225
|
+
m_dbExec.reset(new dbExecuter());
|
|
1059
1226
|
}
|
|
1060
1227
|
|
|
1061
1228
|
commandExecuter::~commandExecuter()
|
|
1062
1229
|
{
|
|
1063
|
-
|
|
1230
|
+
m_dbExec.reset();
|
|
1064
1231
|
}
|
|
1065
1232
|
|
|
1066
|
-
size_t commandExecuter::perseRequestEnd(const char* p, size_t transfered,
|
|
1233
|
+
size_t commandExecuter::perseRequestEnd(const char* p, size_t transfered,
|
|
1234
|
+
bool& comp) const
|
|
1067
1235
|
{
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1236
|
+
if (transfered < sizeof(unsigned int))
|
|
1237
|
+
return 0;
|
|
1238
|
+
size_t size = *((unsigned int*)p);
|
|
1239
|
+
if (size == transfered)
|
|
1240
|
+
comp = true;
|
|
1241
|
+
return size;
|
|
1074
1242
|
}
|
|
1075
1243
|
|
|
1076
1244
|
bool commandExecuter::parse(const char* p, size_t size)
|
|
1077
1245
|
{
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
m_req.parse(p);
|
|
1081
|
-
|
|
1082
|
-
return 0;
|
|
1246
|
+
m_req.parse(p);
|
|
1247
|
+
return 0;
|
|
1083
1248
|
}
|
|
1084
1249
|
|
|
1085
|
-
}//namespace mysql
|
|
1086
|
-
}//namespace tdap
|
|
1087
|
-
}//namespace protocol
|
|
1088
|
-
}//namespace db
|
|
1089
|
-
}//namespace bzs
|
|
1250
|
+
} // namespace mysql
|
|
1251
|
+
} // namespace tdap
|
|
1252
|
+
} // namespace protocol
|
|
1253
|
+
} // namespace db
|
|
1254
|
+
} // namespace bzs
|