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
|
#include "hsCommandExecuter.h"
|
|
@@ -31,11 +31,11 @@ namespace bzs
|
|
|
31
31
|
{
|
|
32
32
|
namespace db
|
|
33
33
|
{
|
|
34
|
-
|
|
34
|
+
using namespace engine::mysql;
|
|
35
35
|
namespace protocol
|
|
36
36
|
{
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
using namespace transactd;
|
|
38
|
+
using namespace transactd::connection;
|
|
39
39
|
namespace hs
|
|
40
40
|
{
|
|
41
41
|
|
|
@@ -44,646 +44,675 @@ namespace hs
|
|
|
44
44
|
//-----------------------------------------------------------------------
|
|
45
45
|
ha_rkey_function request::seekFlag()
|
|
46
46
|
{
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
47
|
+
switch (table.key.logical)
|
|
48
|
+
{
|
|
49
|
+
case HS_LG_EQUAL:
|
|
50
|
+
return HA_READ_KEY_EXACT;
|
|
51
|
+
case HS_LG_GREATER:
|
|
52
|
+
return HA_READ_AFTER_KEY;
|
|
53
|
+
case HS_LG_GREATEROREQUAL:
|
|
54
|
+
return HA_READ_KEY_OR_NEXT;
|
|
55
|
+
case HS_LG_LESS:
|
|
56
|
+
return HA_READ_BEFORE_KEY;
|
|
57
|
+
case HS_LG_LESSOREQUAL:
|
|
58
|
+
return HA_READ_KEY_OR_PREV;
|
|
59
|
+
}
|
|
60
|
+
return HA_READ_KEY_EXACT;
|
|
56
61
|
}
|
|
57
62
|
|
|
58
63
|
bool request::naviSame()
|
|
59
64
|
{
|
|
60
|
-
|
|
65
|
+
return (table.key.logical == HS_LG_EQUAL);
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
bool request::naviForward()
|
|
64
69
|
{
|
|
65
|
-
|
|
70
|
+
return (table.key.logical == HS_LG_GREATER) ||
|
|
71
|
+
(table.key.logical == HS_LG_GREATEROREQUAL);
|
|
66
72
|
}
|
|
67
73
|
|
|
68
|
-
void seriarizeRecordsetBegin(engine::mysql::table* tb, resultBuffer& buf
|
|
69
|
-
|
|
74
|
+
void seriarizeRecordsetBegin(engine::mysql::table* tb, resultBuffer& buf,
|
|
75
|
+
bool sendBforeValue)
|
|
70
76
|
{
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
77
|
+
if (sendBforeValue)
|
|
78
|
+
{
|
|
79
|
+
buf.append("0\t");
|
|
80
|
+
buf.append((int)tb->useFields().size());
|
|
81
|
+
}
|
|
76
82
|
}
|
|
77
83
|
|
|
78
|
-
void seriarizeRecord(engine::mysql::table* tb, resultBuffer& buf,
|
|
84
|
+
void seriarizeRecord(engine::mysql::table* tb, resultBuffer& buf,
|
|
85
|
+
bool sendBforeValue)
|
|
79
86
|
{
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
87
|
+
if (sendBforeValue)
|
|
88
|
+
{
|
|
89
|
+
for (int i = 0; i < (int)tb->useFields().size(); i++)
|
|
90
|
+
{
|
|
91
|
+
buf.append("\t");
|
|
92
|
+
int size;
|
|
93
|
+
const char* p = tb->valStr(tb->useFields()[i], size);
|
|
94
|
+
if (size == -1)
|
|
95
|
+
buf.append("\0");
|
|
96
|
+
else
|
|
97
|
+
buf.append(p, size);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
93
100
|
}
|
|
94
101
|
|
|
95
|
-
void seriarizeRecordsetEnd(engine::mysql::table* tb, resultBuffer& buf
|
|
96
|
-
|
|
102
|
+
void seriarizeRecordsetEnd(engine::mysql::table* tb, resultBuffer& buf,
|
|
103
|
+
int count, bool sendBforeValue)
|
|
97
104
|
{
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
+
if (!sendBforeValue)
|
|
106
|
+
{
|
|
107
|
+
buf.append("0\t1\t");
|
|
108
|
+
buf.append(count);
|
|
109
|
+
buf.append("\n");
|
|
110
|
+
}
|
|
111
|
+
else
|
|
112
|
+
buf.append("\n");
|
|
105
113
|
}
|
|
106
114
|
|
|
107
115
|
void writeError(int error, resultBuffer& buf, const char* msg)
|
|
108
116
|
{
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
117
|
+
buf.append(error);
|
|
118
|
+
buf.append("\t");
|
|
119
|
+
buf.append(msg);
|
|
120
|
+
buf.append("\n");
|
|
113
121
|
}
|
|
114
122
|
|
|
115
123
|
void writeStatus(int stat, resultBuffer& buf, int option)
|
|
116
124
|
{
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
125
|
+
int v = 0;
|
|
126
|
+
v = std::min(stat, 1);
|
|
127
|
+
buf.append(v);
|
|
128
|
+
buf.append("\t");
|
|
129
|
+
buf.append(option);
|
|
130
|
+
buf.append("\n\0");
|
|
123
131
|
}
|
|
124
132
|
|
|
125
133
|
//-----------------------------------------------------------------------
|
|
126
134
|
// clas dbExecuter
|
|
127
135
|
//-----------------------------------------------------------------------
|
|
128
|
-
#define READ_SUCCESS
|
|
129
|
-
#define FILTER_MATCH
|
|
130
|
-
#define FILTER_SKIP
|
|
131
|
-
#define FILTER_BREAK
|
|
136
|
+
#define READ_SUCCESS 0
|
|
137
|
+
#define FILTER_MATCH READ_SUCCESS
|
|
138
|
+
#define FILTER_SKIP 1
|
|
139
|
+
#define FILTER_BREAK 2
|
|
132
140
|
|
|
133
141
|
int update(request& req, engine::mysql::table* tb, int type)
|
|
134
142
|
{
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
143
|
+
tb->beginUpdate(tb->keyNum());
|
|
144
|
+
tb->setUseValues(req.table.values, type);
|
|
145
|
+
tb->update(true);
|
|
146
|
+
return tb->stat();
|
|
139
147
|
}
|
|
140
148
|
|
|
141
149
|
int del(request& req, engine::mysql::table* tb, int type)
|
|
142
150
|
{
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
151
|
+
tb->beginDel();
|
|
152
|
+
tb->del();
|
|
153
|
+
return tb->stat();
|
|
146
154
|
}
|
|
147
155
|
|
|
148
156
|
inline bool match(short logical, int v)
|
|
149
157
|
{
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
158
|
+
switch (logical)
|
|
159
|
+
{
|
|
160
|
+
case HS_LG_EQUAL:
|
|
161
|
+
return (v == 0); //==
|
|
162
|
+
case HS_LG_GREATER:
|
|
163
|
+
return (v > 0); //>
|
|
164
|
+
case HS_LG_LESS:
|
|
165
|
+
return (v < 0); //<
|
|
166
|
+
case HS_LG_NOTEQUAL:
|
|
167
|
+
return (v != 0); //!=
|
|
168
|
+
case HS_LG_GREATEROREQUAL:
|
|
169
|
+
return (v >= 0); //>=
|
|
170
|
+
case HS_LG_LESSOREQUAL:
|
|
171
|
+
return (v <= 0); //<=
|
|
172
|
+
}
|
|
173
|
+
return false;
|
|
160
174
|
}
|
|
161
175
|
|
|
162
176
|
int filter(engine::mysql::table* tb, request::table::filters_type& filters)
|
|
163
177
|
{
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
return FILTER_MATCH;
|
|
178
|
+
for (size_t i = 0; i < filters.size(); ++i)
|
|
179
|
+
{
|
|
180
|
+
request::table::filter& f = filters[i];
|
|
181
|
+
if (f.col >= (int)tb->useFields().size())
|
|
182
|
+
THROW_BZS_ERROR_WITH_MSG("fcol");
|
|
183
|
+
Field* fd = tb->field(tb->useFields()[f.col]);
|
|
184
|
+
uchar tmp[1024] = { 0 };
|
|
185
|
+
if (fd->pack_length() > 1024)
|
|
186
|
+
THROW_BZS_ERROR_WITH_MSG("field_length > 1024");
|
|
187
|
+
memcpy(tmp, fd->ptr, fd->pack_length());
|
|
188
|
+
tb->setValue(fd->field_index, f.value, 0);
|
|
189
|
+
int v = fd->cmp(tmp, fd->ptr);
|
|
190
|
+
memcpy(fd->ptr, tmp, fd->pack_length());
|
|
191
|
+
if (!match(f.logical, v))
|
|
192
|
+
return (f.type == 'F') ? FILTER_SKIP : FILTER_BREAK;
|
|
193
|
+
}
|
|
194
|
+
return FILTER_MATCH;
|
|
182
195
|
}
|
|
183
196
|
|
|
184
197
|
inline int type(request& req)
|
|
185
198
|
{
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
199
|
+
if (req.op == HS_OP_UPDATE_INC)
|
|
200
|
+
return UPDATE_INC;
|
|
201
|
+
if (req.op == HS_OP_UPDATE_DEC)
|
|
202
|
+
return UPDATE_DEC;
|
|
203
|
+
return UPDATE_REPLACE;
|
|
189
204
|
}
|
|
190
205
|
|
|
191
|
-
inline int dbExecuter::readAfter(request& req, engine::mysql::table* tb,
|
|
206
|
+
inline int dbExecuter::readAfter(request& req, engine::mysql::table* tb,
|
|
207
|
+
resultBuffer& buf, changeFunc func)
|
|
192
208
|
{
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
209
|
+
int ret = filter(tb, req.table.filters);
|
|
210
|
+
if (ret == FILTER_MATCH)
|
|
211
|
+
{
|
|
212
|
+
if (req.result.offset == 0)
|
|
213
|
+
{
|
|
214
|
+
seriarizeRecord(tb, buf, req.result.returnBeforeValue);
|
|
215
|
+
if (func)
|
|
216
|
+
func(req, tb, type(req));
|
|
217
|
+
return READ_SUCCESS;
|
|
218
|
+
}
|
|
219
|
+
--req.result.offset;
|
|
220
|
+
return FILTER_SKIP;
|
|
221
|
+
}
|
|
222
|
+
return ret;
|
|
207
223
|
}
|
|
208
224
|
|
|
209
225
|
inline void setKeyValues(request& req, engine::mysql::table* tb, int index)
|
|
210
226
|
{
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
void dbExecuter::doRecordOperation(request& req, engine::mysql::table* tb,
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
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
|
-
|
|
227
|
+
if (req.table.in.keypart >= tb->keyDef(tb->keyNum()).user_defined_key_parts)
|
|
228
|
+
THROW_BZS_ERROR_WITH_MSG("icol");
|
|
229
|
+
tb->clearBuffer();
|
|
230
|
+
if (index != -1)
|
|
231
|
+
tb->setKeyValues(req.table.key.values, req.table.in.keypart,
|
|
232
|
+
&(req.table.in.values[index]));
|
|
233
|
+
else
|
|
234
|
+
tb->setKeyValues(req.table.key.values, -1);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
void dbExecuter::doRecordOperation(request& req, engine::mysql::table* tb,
|
|
238
|
+
resultBuffer& buf, changeFunc func)
|
|
239
|
+
{
|
|
240
|
+
int count = 0;
|
|
241
|
+
int curInValueIndex = req.table.in.values.size() ? 0 : -1;
|
|
242
|
+
int offset = req.result.offset;
|
|
243
|
+
int filterResult = 0;
|
|
244
|
+
seriarizeRecordsetBegin(tb, buf, req.result.returnBeforeValue);
|
|
245
|
+
|
|
246
|
+
setKeyValues(req, tb, curInValueIndex);
|
|
247
|
+
if (curInValueIndex >= 0)
|
|
248
|
+
++curInValueIndex;
|
|
249
|
+
tb->seekKey(req.seekFlag(), tb->keymap());
|
|
250
|
+
if (tb->stat() == 0)
|
|
251
|
+
{
|
|
252
|
+
filterResult = readAfter(req, tb, buf, func);
|
|
253
|
+
if (filterResult == READ_SUCCESS)
|
|
254
|
+
++count;
|
|
255
|
+
}
|
|
256
|
+
if (((tb->stat() == 0) && (filterResult != FILTER_BREAK)) ||
|
|
257
|
+
(curInValueIndex > -1))
|
|
258
|
+
{
|
|
259
|
+
for (int i = 1; i < req.result.limit + offset; i++)
|
|
260
|
+
{
|
|
261
|
+
if (curInValueIndex > -1)
|
|
262
|
+
{
|
|
263
|
+
if (curInValueIndex >= (int)req.table.in.values.size())
|
|
264
|
+
break;
|
|
265
|
+
setKeyValues(req, tb, curInValueIndex++);
|
|
266
|
+
tb->seekKey(req.seekFlag(), tb->keymap());
|
|
267
|
+
}
|
|
268
|
+
else
|
|
269
|
+
{
|
|
270
|
+
if (req.naviSame())
|
|
271
|
+
tb->getNextSame(tb->keymap());
|
|
272
|
+
else if (req.naviForward())
|
|
273
|
+
tb->getNext();
|
|
274
|
+
else
|
|
275
|
+
tb->getPrev();
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (tb->stat())
|
|
279
|
+
break;
|
|
280
|
+
filterResult = readAfter(req, tb, buf, func);
|
|
281
|
+
if (filterResult == READ_SUCCESS)
|
|
282
|
+
++count;
|
|
283
|
+
if (tb->stat() || (filterResult == FILTER_BREAK))
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
seriarizeRecordsetEnd(m_tb, buf, count, req.result.returnBeforeValue);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
int dbExecuter::commandExec(std::vector<request>& requests,
|
|
291
|
+
netsvc::server::netWriter* nw)
|
|
292
|
+
{
|
|
293
|
+
request& req = requests[0];
|
|
294
|
+
resultBuffer buf(nw->ptr());
|
|
295
|
+
size_t& size = nw->datalen;
|
|
296
|
+
try
|
|
297
|
+
{
|
|
298
|
+
switch (req.op)
|
|
299
|
+
{
|
|
300
|
+
case HS_OP_QUIT:
|
|
301
|
+
return EXECUTE_RESULT_QUIT;
|
|
302
|
+
case HS_OP_AUTH:
|
|
303
|
+
writeStatus(0, buf, 1); // allways success.
|
|
304
|
+
break;
|
|
305
|
+
case HS_OP_OPEN:
|
|
306
|
+
{
|
|
307
|
+
checkNewHandle(req.handle);
|
|
308
|
+
database* db = getDatabase(req.db.name, 0 /*cid*/);
|
|
309
|
+
m_tb = db->openTable(req.table.name, req.table.openMode, NULL);
|
|
310
|
+
addHandle(getDatabaseID(0 /*cid*/), m_tb->id(), req.handle);
|
|
311
|
+
m_tb = getTable(req.handle);
|
|
312
|
+
m_tb->setUseFieldList(req.table.fields);
|
|
313
|
+
m_tb->setKeyNum(req.table.key.name);
|
|
314
|
+
writeStatus(m_tb->stat(), buf, 1);
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
case HS_OP_INSERT:
|
|
318
|
+
{
|
|
319
|
+
m_tb = getTable(req.handle, SQLCOM_INSERT);
|
|
320
|
+
m_tb->clearBuffer();
|
|
321
|
+
m_tb->setUseValues(req.table.values, 0);
|
|
322
|
+
m_tb->insert(true);
|
|
323
|
+
writeStatus(m_tb->stat(), buf, 1);
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
case HS_OP_UPDATE_INC:
|
|
327
|
+
case HS_OP_UPDATE_DEC:
|
|
328
|
+
case HS_OP_UPDATE:
|
|
329
|
+
{
|
|
330
|
+
m_tb = getTable(req.handle, SQLCOM_UPDATE);
|
|
331
|
+
doRecordOperation(req, m_tb, buf, update);
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
case HS_OP_DELETE:
|
|
335
|
+
{
|
|
336
|
+
m_tb = getTable(req.handle, SQLCOM_UPDATE);
|
|
337
|
+
doRecordOperation(req, m_tb, buf, del);
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
case HS_OP_READ:
|
|
341
|
+
{
|
|
342
|
+
m_tb = getTable(req.handle);
|
|
343
|
+
doRecordOperation(req, m_tb, buf, NULL);
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
if (m_tb)
|
|
348
|
+
m_tb->unUse();
|
|
349
|
+
size = buf.size();
|
|
350
|
+
return EXECUTE_RESULT_SUCCESS;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
catch (bzs::rtl::exception& e)
|
|
354
|
+
{
|
|
355
|
+
clenupNoException();
|
|
356
|
+
const std::string* msg = getMsg(e);
|
|
357
|
+
const int* code = getCode(e);
|
|
358
|
+
if (code && msg)
|
|
359
|
+
writeError(*code, buf, msg->c_str());
|
|
360
|
+
else
|
|
361
|
+
{
|
|
362
|
+
if (msg)
|
|
363
|
+
writeError(1, buf, msg->c_str());
|
|
364
|
+
else
|
|
365
|
+
writeError(1, buf, "");
|
|
366
|
+
sql_print_error("%s", boost::diagnostic_information(e).c_str());
|
|
367
|
+
}
|
|
368
|
+
printErrorMessage(code, msg);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
catch (...)
|
|
372
|
+
{
|
|
373
|
+
clenupNoException();
|
|
374
|
+
writeError(1, buf, "Unknown error.");
|
|
375
|
+
}
|
|
376
|
+
size = buf.size();
|
|
377
|
+
return EXECUTE_RESULT_SUCCESS;
|
|
353
378
|
}
|
|
354
379
|
|
|
355
380
|
// ---------------------------------------------------------------------------
|
|
356
|
-
//
|
|
381
|
+
// class commandExecuter
|
|
357
382
|
// ---------------------------------------------------------------------------
|
|
358
|
-
#define PARSEREAD_START
|
|
359
|
-
#define PARSEREAD_COMMAND
|
|
360
|
-
#define PARSEREAD_HANDLEID
|
|
361
|
-
#define PARSEREAD_SEEKCMD
|
|
362
|
-
#define PARSEREAD_DBNAME
|
|
363
|
-
#define PARSEREAD_TABLENAME
|
|
364
|
-
#define PARSEREAD_INDEXNAME
|
|
365
|
-
#define PARSEREAD_FIELDS
|
|
366
|
-
#define PARSEREAD_KEYVAL_COUNT
|
|
367
|
-
#define PARSEREAD_KEYVAL
|
|
368
|
-
#define PARSEREAD_LIMIT
|
|
369
|
-
#define PARSEREAD_OFFSET
|
|
370
|
-
#define PARSEREAD_DATA_COUNT
|
|
371
|
-
#define PARSEREAD_DATA_VAL
|
|
372
|
-
#define PARSEREAD_IN_MODE
|
|
373
|
-
#define PARSEREAD_IN_KEYPART
|
|
374
|
-
#define PARSEREAD_IN_COUNT
|
|
375
|
-
#define PARSEREAD_IN_VAL
|
|
376
|
-
#define PARSEREAD_FL_TYPE
|
|
377
|
-
#define PARSEREAD_FL_LOG
|
|
378
|
-
#define PARSEREAD_FL_COL
|
|
379
|
-
#define PARSEREAD_FL_VAL
|
|
383
|
+
#define PARSEREAD_START 0
|
|
384
|
+
#define PARSEREAD_COMMAND 1
|
|
385
|
+
#define PARSEREAD_HANDLEID 2
|
|
386
|
+
#define PARSEREAD_SEEKCMD 3
|
|
387
|
+
#define PARSEREAD_DBNAME 4
|
|
388
|
+
#define PARSEREAD_TABLENAME 5
|
|
389
|
+
#define PARSEREAD_INDEXNAME 6
|
|
390
|
+
#define PARSEREAD_FIELDS 7
|
|
391
|
+
#define PARSEREAD_KEYVAL_COUNT 8
|
|
392
|
+
#define PARSEREAD_KEYVAL 9
|
|
393
|
+
#define PARSEREAD_LIMIT 10
|
|
394
|
+
#define PARSEREAD_OFFSET 11
|
|
395
|
+
#define PARSEREAD_DATA_COUNT 12
|
|
396
|
+
#define PARSEREAD_DATA_VAL 13
|
|
397
|
+
#define PARSEREAD_IN_MODE 15
|
|
398
|
+
#define PARSEREAD_IN_KEYPART 16
|
|
399
|
+
#define PARSEREAD_IN_COUNT 17
|
|
400
|
+
#define PARSEREAD_IN_VAL 18
|
|
401
|
+
#define PARSEREAD_FL_TYPE 19
|
|
402
|
+
#define PARSEREAD_FL_LOG 20
|
|
403
|
+
#define PARSEREAD_FL_COL 21
|
|
404
|
+
#define PARSEREAD_FL_VAL 22
|
|
405
|
+
|
|
406
|
+
inline void setHandleID(const std::string& src, int& parseMode, request* req)
|
|
380
407
|
|
|
381
|
-
inline void setHandleID(const std::string& src, int &parseMode, request* req)
|
|
382
408
|
{
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
409
|
+
req->handle = (short)atol(src.c_str());
|
|
410
|
+
if (req->op == HS_OP_OPEN)
|
|
411
|
+
parseMode = PARSEREAD_DBNAME;
|
|
412
|
+
else
|
|
413
|
+
parseMode = PARSEREAD_SEEKCMD;
|
|
388
414
|
}
|
|
389
415
|
|
|
390
|
-
inline void setCmd(const std::string& src, int
|
|
416
|
+
inline void setCmd(const std::string& src, int& parseMode, request* req)
|
|
391
417
|
{
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
418
|
+
if (src[0] >= '0' && src[0] <= '9')
|
|
419
|
+
return setHandleID(src, parseMode, req);
|
|
420
|
+
else
|
|
421
|
+
req->op = src[0];
|
|
422
|
+
parseMode = PARSEREAD_HANDLEID;
|
|
397
423
|
}
|
|
398
424
|
|
|
399
|
-
inline void setChangeCmd(const std::string& src, int
|
|
425
|
+
inline void setChangeCmd(const std::string& src, int& parseMode, request* req)
|
|
400
426
|
{
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
427
|
+
req->op = src[0];
|
|
428
|
+
if (req->table.key.logical && (req->op == HS_OP_INSERT))
|
|
429
|
+
req->op = HS_OP_UPDATE_INC;
|
|
430
|
+
req->result.returnBeforeValue = (src[1] == '?');
|
|
431
|
+
if (req->op == HS_OP_INSERT)
|
|
432
|
+
parseMode = PARSEREAD_DATA_COUNT;
|
|
433
|
+
else
|
|
434
|
+
parseMode = PARSEREAD_DATA_VAL;
|
|
409
435
|
}
|
|
410
436
|
|
|
411
|
-
inline void setSeekCmd(const std::string& src, int
|
|
437
|
+
inline void setSeekCmd(const std::string& src, int& parseMode, request* req)
|
|
412
438
|
{
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
439
|
+
if ((src[0] == HS_OP_INSERT) || (src[0] == HS_OP_UPDATE) ||
|
|
440
|
+
(src[0] == HS_OP_DELETE))
|
|
441
|
+
return setChangeCmd(src, parseMode, req);
|
|
442
|
+
req->table.key.logical = src[0];
|
|
443
|
+
if ((src.size() > 1) && (src[1] == '='))
|
|
444
|
+
req->table.key.logical += 0xff;
|
|
445
|
+
req->result.returnBeforeValue = true;
|
|
446
|
+
parseMode = PARSEREAD_KEYVAL_COUNT;
|
|
420
447
|
}
|
|
421
448
|
|
|
422
|
-
inline void setDbname(const std::string& src, int
|
|
449
|
+
inline void setDbname(const std::string& src, int& parseMode, request* req)
|
|
423
450
|
{
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
451
|
+
strncpy(req->db.name, src.c_str(), DEBNAME_SIZE);
|
|
452
|
+
|
|
453
|
+
parseMode = PARSEREAD_TABLENAME;
|
|
427
454
|
}
|
|
428
455
|
|
|
429
|
-
inline void setTablename(const std::string& src, int
|
|
456
|
+
inline void setTablename(const std::string& src, int& parseMode, request* req)
|
|
430
457
|
{
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
458
|
+
strncpy(req->table.name, src.c_str(), TABELNAME_SIZE);
|
|
459
|
+
req->table.openMode = TD_OPEN_NORMAL;
|
|
460
|
+
parseMode = PARSEREAD_INDEXNAME;
|
|
434
461
|
}
|
|
435
462
|
|
|
436
|
-
inline void setIndexname(const std::string& src, int
|
|
463
|
+
inline void setIndexname(const std::string& src, int& parseMode, request* req)
|
|
437
464
|
{
|
|
438
|
-
|
|
439
|
-
|
|
465
|
+
strncpy(req->table.key.name, src.c_str(), INDEXNAME_SIZE);
|
|
466
|
+
parseMode = PARSEREAD_FIELDS;
|
|
440
467
|
}
|
|
441
468
|
|
|
442
|
-
inline void setValueCount(const std::string& src, int
|
|
469
|
+
inline void setValueCount(const std::string& src, int& parseMode, int& count)
|
|
443
470
|
{
|
|
444
|
-
|
|
471
|
+
count = atol(src.c_str());
|
|
445
472
|
}
|
|
446
473
|
|
|
447
|
-
inline void setValue(const std::string& src, int
|
|
474
|
+
inline void setValue(const std::string& src, int& parseMode,
|
|
475
|
+
std::vector<std::string>& values, int& count)
|
|
448
476
|
{
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
477
|
+
if (count)
|
|
478
|
+
{
|
|
479
|
+
values.push_back(src);
|
|
480
|
+
--count;
|
|
481
|
+
}
|
|
454
482
|
}
|
|
455
483
|
|
|
456
|
-
inline bool setLimit(const std::string& src, int
|
|
484
|
+
inline bool setLimit(const std::string& src, int& parseMode, request* req)
|
|
457
485
|
{
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
486
|
+
if ((src[0] >= '0') && (src[0] <= '9'))
|
|
487
|
+
{
|
|
488
|
+
req->result.limit = atol(src.c_str());
|
|
489
|
+
parseMode = PARSEREAD_OFFSET;
|
|
490
|
+
return false;
|
|
491
|
+
}
|
|
492
|
+
parseMode = PARSEREAD_IN_MODE;
|
|
493
|
+
return true;
|
|
466
494
|
}
|
|
467
495
|
|
|
468
|
-
inline void setOffset(const std::string& src, int
|
|
496
|
+
inline void setOffset(const std::string& src, int& parseMode, request* req)
|
|
469
497
|
{
|
|
470
|
-
|
|
471
|
-
|
|
498
|
+
req->result.offset = atol(src.c_str());
|
|
499
|
+
parseMode = PARSEREAD_IN_MODE;
|
|
472
500
|
}
|
|
473
501
|
|
|
474
|
-
inline void setFields(const std::string& src, int
|
|
502
|
+
inline void setFields(const std::string& src, int& parseMode, request* req)
|
|
475
503
|
{
|
|
476
|
-
|
|
477
|
-
|
|
504
|
+
req->table.fields = src;
|
|
505
|
+
parseMode = PARSEREAD_START;
|
|
478
506
|
}
|
|
479
507
|
|
|
480
|
-
inline bool setInMode(const std::string& src, int
|
|
508
|
+
inline bool setInMode(const std::string& src, int& parseMode, request* req)
|
|
481
509
|
{
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
510
|
+
if (src[0] == '@')
|
|
511
|
+
{
|
|
512
|
+
parseMode = PARSEREAD_IN_KEYPART;
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
515
|
+
parseMode = PARSEREAD_FL_TYPE;
|
|
516
|
+
return true;
|
|
489
517
|
}
|
|
490
518
|
|
|
491
|
-
inline void setInKeyPart(const std::string& src, int
|
|
519
|
+
inline void setInKeyPart(const std::string& src, int& parseMode, request* req)
|
|
492
520
|
{
|
|
493
|
-
|
|
494
|
-
|
|
521
|
+
req->table.in.keypart = (short)atol(src.c_str());
|
|
522
|
+
parseMode = PARSEREAD_IN_COUNT;
|
|
495
523
|
}
|
|
496
524
|
|
|
497
|
-
inline bool setFilterType(const std::string& src, int
|
|
525
|
+
inline bool setFilterType(const std::string& src, int& parseMode, request* req)
|
|
498
526
|
{
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
527
|
+
if ((src[0] == 'F') || (src[0] == 'W'))
|
|
528
|
+
{
|
|
529
|
+
request::table::filter f;
|
|
530
|
+
f.type = src[0];
|
|
531
|
+
req->table.filters.push_back(f);
|
|
532
|
+
|
|
533
|
+
parseMode = PARSEREAD_FL_LOG;
|
|
534
|
+
return false;
|
|
535
|
+
}
|
|
536
|
+
parseMode = PARSEREAD_SEEKCMD;
|
|
537
|
+
return true;
|
|
510
538
|
}
|
|
511
539
|
|
|
512
|
-
inline void setFilterLog(const std::string& src, int
|
|
540
|
+
inline void setFilterLog(const std::string& src, int& parseMode, request* req)
|
|
513
541
|
{
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
542
|
+
request::table::filter& f =
|
|
543
|
+
req->table.filters[req->table.filters.size() - 1];
|
|
544
|
+
f.logical = src[0];
|
|
545
|
+
if ((src.size() > 1) && (src[1] == '='))
|
|
546
|
+
f.logical += 0xff;
|
|
547
|
+
else if ((src.size() > 1) && (src[1] == '>'))
|
|
548
|
+
f.logical += 0xfe;
|
|
549
|
+
parseMode = PARSEREAD_FL_COL;
|
|
521
550
|
}
|
|
522
551
|
|
|
523
|
-
inline void setFilterCol(const std::string& src, int
|
|
552
|
+
inline void setFilterCol(const std::string& src, int& parseMode, request* req)
|
|
524
553
|
{
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
554
|
+
request::table::filter& f =
|
|
555
|
+
req->table.filters[req->table.filters.size() - 1];
|
|
556
|
+
f.col = (short)atol(src.c_str());
|
|
557
|
+
parseMode = PARSEREAD_FL_VAL;
|
|
528
558
|
}
|
|
529
559
|
|
|
530
|
-
inline void setFilterVal(const std::string& src, int
|
|
560
|
+
inline void setFilterVal(const std::string& src, int& parseMode, request* req)
|
|
531
561
|
{
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
562
|
+
request::table::filter& f =
|
|
563
|
+
req->table.filters[req->table.filters.size() - 1];
|
|
564
|
+
f.value = src;
|
|
565
|
+
parseMode = PARSEREAD_FL_TYPE;
|
|
535
566
|
}
|
|
536
567
|
|
|
537
568
|
commandExecuter::commandExecuter(__int64 /*parent*/)
|
|
538
|
-
|
|
569
|
+
: m_dbExec(new dbExecuter())
|
|
539
570
|
{
|
|
540
|
-
|
|
541
571
|
}
|
|
542
572
|
|
|
543
573
|
commandExecuter::~commandExecuter()
|
|
544
574
|
{
|
|
545
|
-
|
|
575
|
+
m_dbExec.reset();
|
|
546
576
|
}
|
|
547
577
|
|
|
548
|
-
size_t commandExecuter::perseRequestEnd(const char* p, size_t transfered,
|
|
578
|
+
size_t commandExecuter::perseRequestEnd(const char* p, size_t transfered,
|
|
579
|
+
bool& comp) const
|
|
549
580
|
{
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
581
|
+
if (transfered)
|
|
582
|
+
{
|
|
583
|
+
const char* tmp = p + transfered - 1;
|
|
584
|
+
comp = (*tmp == '\n');
|
|
585
|
+
}
|
|
586
|
+
if (!comp && transfered < strlen(p) + 10)
|
|
587
|
+
return transfered + 64000;
|
|
588
|
+
return 0;
|
|
558
589
|
}
|
|
559
590
|
|
|
560
591
|
char* readTorkn(std::string& buf, char* src, const char* end)
|
|
561
592
|
{
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
593
|
+
buf.erase();
|
|
594
|
+
while (!((*src == '\t') || (*src == '\n') || (*src == '\r')))
|
|
595
|
+
{
|
|
596
|
+
if (src == end)
|
|
597
|
+
break;
|
|
598
|
+
if (*src == 0x01)
|
|
599
|
+
*(++src) -= 0x040;
|
|
600
|
+
buf.append(1, *src);
|
|
601
|
+
++src;
|
|
602
|
+
}
|
|
603
|
+
return ++src;
|
|
573
604
|
}
|
|
574
605
|
|
|
575
606
|
bool commandExecuter::parse(const char* ptr, size_t size)
|
|
576
607
|
{
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
}//namespace
|
|
685
|
-
}//namespace
|
|
686
|
-
}//namespace db
|
|
687
|
-
}//namespace bzs
|
|
608
|
+
m_requests.clear();
|
|
609
|
+
char* p = (char*)ptr;
|
|
610
|
+
const char* end = p + size;
|
|
611
|
+
int parseMode = PARSEREAD_START;
|
|
612
|
+
int keyval_count = 0;
|
|
613
|
+
int data_count = INT_MAX;
|
|
614
|
+
int in_count = 0;
|
|
615
|
+
bool skip = false;
|
|
616
|
+
std::string buf;
|
|
617
|
+
buf.reserve(1024);
|
|
618
|
+
request* req = NULL;
|
|
619
|
+
while (p != end)
|
|
620
|
+
{
|
|
621
|
+
if (skip == false)
|
|
622
|
+
p = readTorkn(buf, p, end);
|
|
623
|
+
else
|
|
624
|
+
skip = false;
|
|
625
|
+
if (buf.size() == 0)
|
|
626
|
+
break;
|
|
627
|
+
switch (parseMode)
|
|
628
|
+
{
|
|
629
|
+
case PARSEREAD_START:
|
|
630
|
+
m_requests.push_back(request());
|
|
631
|
+
req = &m_requests[m_requests.size() - 1];
|
|
632
|
+
parseMode = PARSEREAD_COMMAND;
|
|
633
|
+
skip = true;
|
|
634
|
+
break;
|
|
635
|
+
case PARSEREAD_COMMAND:
|
|
636
|
+
setCmd(buf, parseMode, req);
|
|
637
|
+
break;
|
|
638
|
+
case PARSEREAD_HANDLEID:
|
|
639
|
+
setHandleID(buf, parseMode, req);
|
|
640
|
+
break;
|
|
641
|
+
case PARSEREAD_SEEKCMD:
|
|
642
|
+
setSeekCmd(buf, parseMode, req);
|
|
643
|
+
break;
|
|
644
|
+
case PARSEREAD_DATA_COUNT:
|
|
645
|
+
setValueCount(buf, parseMode, data_count);
|
|
646
|
+
parseMode = PARSEREAD_DATA_VAL;
|
|
647
|
+
break;
|
|
648
|
+
case PARSEREAD_DATA_VAL:
|
|
649
|
+
setValue(buf, parseMode, req->table.values, data_count);
|
|
650
|
+
if (data_count == 0)
|
|
651
|
+
parseMode = PARSEREAD_START;
|
|
652
|
+
break;
|
|
653
|
+
case PARSEREAD_KEYVAL_COUNT:
|
|
654
|
+
setValueCount(buf, parseMode, keyval_count);
|
|
655
|
+
parseMode = PARSEREAD_KEYVAL;
|
|
656
|
+
break;
|
|
657
|
+
case PARSEREAD_KEYVAL:
|
|
658
|
+
setValue(buf, parseMode, req->table.key.values, keyval_count);
|
|
659
|
+
if (keyval_count == 0)
|
|
660
|
+
parseMode = PARSEREAD_LIMIT;
|
|
661
|
+
break;
|
|
662
|
+
case PARSEREAD_DBNAME:
|
|
663
|
+
setDbname(buf, parseMode, req);
|
|
664
|
+
break;
|
|
665
|
+
case PARSEREAD_TABLENAME:
|
|
666
|
+
setTablename(buf, parseMode, req);
|
|
667
|
+
break;
|
|
668
|
+
case PARSEREAD_INDEXNAME:
|
|
669
|
+
setIndexname(buf, parseMode, req);
|
|
670
|
+
break;
|
|
671
|
+
case PARSEREAD_FIELDS:
|
|
672
|
+
setFields(buf, parseMode, req);
|
|
673
|
+
break;
|
|
674
|
+
case PARSEREAD_LIMIT:
|
|
675
|
+
skip = setLimit(buf, parseMode, req);
|
|
676
|
+
break;
|
|
677
|
+
case PARSEREAD_OFFSET:
|
|
678
|
+
setOffset(buf, parseMode, req);
|
|
679
|
+
break;
|
|
680
|
+
case PARSEREAD_IN_MODE:
|
|
681
|
+
skip = setInMode(buf, parseMode, req);
|
|
682
|
+
break;
|
|
683
|
+
case PARSEREAD_IN_KEYPART:
|
|
684
|
+
setInKeyPart(buf, parseMode, req);
|
|
685
|
+
break;
|
|
686
|
+
case PARSEREAD_IN_COUNT:
|
|
687
|
+
setValueCount(buf, parseMode, in_count);
|
|
688
|
+
parseMode = PARSEREAD_IN_VAL;
|
|
689
|
+
break;
|
|
690
|
+
case PARSEREAD_IN_VAL:
|
|
691
|
+
setValue(buf, parseMode, req->table.in.values, in_count);
|
|
692
|
+
if (in_count == 0)
|
|
693
|
+
parseMode = PARSEREAD_FL_TYPE;
|
|
694
|
+
break;
|
|
695
|
+
case PARSEREAD_FL_TYPE:
|
|
696
|
+
skip = setFilterType(buf, parseMode, req);
|
|
697
|
+
break;
|
|
698
|
+
case PARSEREAD_FL_LOG:
|
|
699
|
+
setFilterLog(buf, parseMode, req);
|
|
700
|
+
break;
|
|
701
|
+
case PARSEREAD_FL_COL:
|
|
702
|
+
setFilterCol(buf, parseMode, req);
|
|
703
|
+
parseMode = PARSEREAD_FL_VAL;
|
|
704
|
+
break;
|
|
705
|
+
case PARSEREAD_FL_VAL:
|
|
706
|
+
setFilterVal(buf, parseMode, req);
|
|
707
|
+
break;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
return !(m_requests.size() == 0);
|
|
711
|
+
}
|
|
712
|
+
|
|
713
|
+
} // namespace hs
|
|
714
|
+
} // namespace protocol
|
|
715
|
+
} // namespace db
|
|
716
|
+
} // namespace bzs
|
|
688
717
|
|
|
689
718
|
#endif // USE_HANDLERSOCKET
|