transactd 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -19,12 +19,12 @@
|
|
19
19
|
02111-1307, USA.
|
20
20
|
================================================================= */
|
21
21
|
#include "table.h"
|
22
|
+
#include "fields.h"
|
22
23
|
#include <assert.h>
|
23
24
|
#include <vector>
|
24
25
|
#include <boost/algorithm/string.hpp>
|
25
26
|
#include <boost/tokenizer.hpp>
|
26
27
|
|
27
|
-
|
28
28
|
namespace bzs
|
29
29
|
{
|
30
30
|
namespace db
|
@@ -40,12 +40,13 @@ namespace client
|
|
40
40
|
#define BOOKMARK_SIZE 4
|
41
41
|
#define DATASIZE_BYTE 2
|
42
42
|
|
43
|
-
#define
|
44
|
-
|
43
|
+
#define BTRV_MAX_DATA_SIZE 57000
|
44
|
+
#define TDAP_MAX_DATA_SIZE 6291456 // 3Mbyte
|
45
45
|
|
46
46
|
inline ushort_td varlenForFilter(const fielddef& fd)
|
47
47
|
{
|
48
|
-
if (((fd.type >= ft_myvarchar) && (fd.type <= ft_mywvarbinary)) ||
|
48
|
+
if (((fd.type >= ft_myvarchar) && (fd.type <= ft_mywvarbinary)) ||
|
49
|
+
fd.type == ft_lstring)
|
49
50
|
return fd.len < 256 ? 1 : 2;
|
50
51
|
else if ((fd.type == ft_myblob) || (fd.type == ft_mytext))
|
51
52
|
return fd.len - 8;
|
@@ -60,7 +61,8 @@ inline uint_td compDataLen(const fielddef& fd, const uchar_td* ptr, bool part)
|
|
60
61
|
uint_td length = fd.keyDataLen(ptr);
|
61
62
|
if (part)
|
62
63
|
{
|
63
|
-
if ((fd.type == ft_string) || (fd.type == ft_zstring) ||
|
64
|
+
if ((fd.type == ft_string) || (fd.type == ft_zstring) ||
|
65
|
+
(fd.type == ft_note))
|
64
66
|
length = (uint_td)strlen((const char*)ptr);
|
65
67
|
else if ((fd.type == ft_wstring) || (fd.type == ft_wzstring))
|
66
68
|
length = (uint_td)wcslen((const wchar_t*)ptr);
|
@@ -70,21 +72,21 @@ inline uint_td compDataLen(const fielddef& fd, const uchar_td* ptr, bool part)
|
|
70
72
|
|
71
73
|
bool verType(uchar_td type)
|
72
74
|
{
|
73
|
-
if (((type >= ft_myvarchar) && (type <= ft_mywvarbinary)) ||
|
75
|
+
if (((type >= ft_myvarchar) && (type <= ft_mywvarbinary)) ||
|
76
|
+
type == ft_lstring)
|
74
77
|
return true;
|
75
78
|
return false;
|
76
79
|
}
|
77
80
|
|
78
|
-
|
79
|
-
|
80
|
-
pragma_pack1
|
81
|
+
#pragma pack(push, 1)
|
82
|
+
pragma_pack1;
|
81
83
|
|
82
84
|
struct resultField
|
83
85
|
{
|
84
|
-
|
86
|
+
unsigned short len;
|
85
87
|
unsigned short pos;
|
86
88
|
|
87
|
-
|
89
|
+
int setParam(table* tb, const _TCHAR* name)
|
88
90
|
{
|
89
91
|
short fieldNum = tb->fieldNumByName(name);
|
90
92
|
if (fieldNum != -1)
|
@@ -92,63 +94,94 @@ struct resultField
|
|
92
94
|
fielddef* fd = &tb->tableDef()->fieldDefs[fieldNum];
|
93
95
|
len = fd->len;
|
94
96
|
pos = fd->pos;
|
95
|
-
return
|
97
|
+
return fieldNum;
|
96
98
|
}
|
97
|
-
return
|
99
|
+
return -1;
|
98
100
|
}
|
99
101
|
unsigned char* writeBuffer(unsigned char* p, bool estimate)
|
100
102
|
{
|
101
103
|
int n = sizeof(resultField);
|
102
|
-
if (!estimate)
|
103
|
-
|
104
|
+
if (!estimate)
|
105
|
+
memcpy(p, this, n);
|
106
|
+
return p + n;
|
104
107
|
}
|
105
108
|
};
|
106
109
|
|
107
110
|
struct resultDef
|
108
111
|
{
|
109
|
-
resultDef()
|
110
|
-
{
|
111
|
-
reset();
|
112
|
-
}
|
112
|
+
resultDef() { reset(); }
|
113
113
|
void reset()
|
114
114
|
{
|
115
115
|
maxRows = 0;
|
116
116
|
fieldCount = 0;
|
117
117
|
}
|
118
|
-
|
119
|
-
|
118
|
+
unsigned short maxRows;
|
119
|
+
unsigned short fieldCount;
|
120
120
|
unsigned char* writeBuffer(unsigned char* p, bool estimate)
|
121
121
|
{
|
122
122
|
int n = sizeof(resultDef);
|
123
|
-
if (!estimate)
|
123
|
+
if (!estimate)
|
124
|
+
memcpy(p, this, n);
|
124
125
|
return p + n;
|
125
126
|
}
|
126
127
|
friend class filter;
|
127
128
|
};
|
128
129
|
|
129
|
-
struct
|
130
|
+
struct seek
|
130
131
|
{
|
131
|
-
|
132
|
-
|
133
|
-
unsigned short pos;
|
134
|
-
unsigned char logType;
|
135
|
-
char opr;
|
136
|
-
unsigned char* data;
|
132
|
+
unsigned char* data;
|
133
|
+
unsigned short len;
|
137
134
|
|
138
135
|
public:
|
139
|
-
|
136
|
+
size_t getLength() { return sizeof(len) + len; }
|
140
137
|
|
141
|
-
|
138
|
+
// setParam from keyValue
|
139
|
+
bool setParam(uchar_td* buf, ushort_td keylen)
|
142
140
|
{
|
143
|
-
|
141
|
+
len = keylen;
|
142
|
+
data = buf;
|
143
|
+
return true;
|
144
144
|
}
|
145
145
|
|
146
|
+
unsigned char* writeBuffer(unsigned char* p, bool estimate, bool end,
|
147
|
+
bool isTransactd) const
|
148
|
+
{
|
149
|
+
int n = sizeof(len);
|
150
|
+
if (!estimate)
|
151
|
+
{
|
152
|
+
if (isTransactd)
|
153
|
+
memcpy(p, &len, n);
|
154
|
+
else
|
155
|
+
n = 0;
|
156
|
+
memcpy(p + n, data, len);
|
157
|
+
}
|
158
|
+
else if (!isTransactd)
|
159
|
+
n = 0;
|
160
|
+
|
161
|
+
return p + n + len;
|
162
|
+
}
|
163
|
+
};
|
164
|
+
|
165
|
+
struct logic
|
166
|
+
{
|
167
|
+
unsigned char type;
|
168
|
+
unsigned short len;
|
169
|
+
unsigned short pos;
|
170
|
+
unsigned char logType;
|
171
|
+
char opr;
|
172
|
+
unsigned char* data;
|
173
|
+
|
174
|
+
public:
|
175
|
+
logic() : data(NULL) {}
|
176
|
+
|
177
|
+
~logic() { delete[] data; }
|
178
|
+
|
146
179
|
size_t getLength()
|
147
180
|
{
|
148
181
|
return sizeof(logic) - sizeof(unsigned char*) + getDatalen();
|
149
182
|
}
|
150
183
|
|
151
|
-
void setFieldParam(fielddef* fd
|
184
|
+
void setFieldParam(fielddef* fd)
|
152
185
|
{
|
153
186
|
type = fd->type;
|
154
187
|
len = fd->len;
|
@@ -157,50 +190,31 @@ public:
|
|
157
190
|
|
158
191
|
int getDatalen() const
|
159
192
|
{
|
160
|
-
if (logType &
|
193
|
+
if (logType & CMPLOGICAL_FIELD)
|
161
194
|
return 2;
|
162
195
|
return len;
|
163
196
|
}
|
164
197
|
|
165
198
|
bool setCompFiled(table* tb, short index, const _TCHAR* name)
|
166
199
|
{
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
200
|
+
short tmp = tb->fieldNumByName(name);
|
201
|
+
if (tmp != -1)
|
202
|
+
{
|
203
|
+
allocBuffer(2);
|
204
|
+
fielddef& fd = tb->tableDef()->fieldDefs[tmp];
|
205
|
+
memcpy(data, &(fd.pos), 2);
|
171
206
|
logType |= CMPLOGICAL_FIELD;
|
172
207
|
return true;
|
173
|
-
}
|
174
|
-
return false;
|
175
|
-
}
|
176
|
-
|
177
|
-
bool isPart(table* tb, short index)
|
178
|
-
{
|
179
|
-
fielddef* fd = &tb->tableDef()->fieldDefs[index];
|
180
|
-
bool ret = false;
|
181
|
-
if (fd->isStringType())
|
182
|
-
{
|
183
|
-
_TCHAR* p = (_TCHAR*)tb->getFVstr(index);
|
184
|
-
if (p)
|
185
|
-
{
|
186
|
-
size_t n = _tcslen(p);
|
187
|
-
if ((ret = (p[n-1] == _T('*')))!=0)
|
188
|
-
{
|
189
|
-
p[n-1] = 0x00;
|
190
|
-
tb->setFV(index, p);
|
191
|
-
}
|
192
|
-
}else
|
193
|
-
tb->setFV(index, _T(""));
|
194
208
|
}
|
195
|
-
return
|
209
|
+
return false;
|
196
210
|
}
|
197
211
|
|
198
212
|
void allocBuffer(int size)
|
199
213
|
{
|
200
|
-
|
201
|
-
delete
|
202
|
-
|
203
|
-
|
214
|
+
if (data)
|
215
|
+
delete[] data;
|
216
|
+
data = new unsigned char[size + 2];
|
217
|
+
memset(data, 0, size + 2);
|
204
218
|
}
|
205
219
|
|
206
220
|
void copyToBuffer(table* tb, short index, bool part)
|
@@ -217,67 +231,50 @@ public:
|
|
217
231
|
memcpy(to + varlen, fd->keyData(ptr), copylen);
|
218
232
|
|
219
233
|
if (!part && (fd->varLenBytes() || fd->blobLenBytes()))
|
220
|
-
logType |= CMPLOGICAL_VAR_COMP_ALL; //match complate
|
234
|
+
logType |= CMPLOGICAL_VAR_COMP_ALL; // match complate
|
221
235
|
}
|
222
236
|
|
223
|
-
bool setParam(table* tb, const _TCHAR* name
|
224
|
-
|
237
|
+
bool setParam(table* tb, const _TCHAR* name, const _TCHAR* type,
|
238
|
+
const _TCHAR* value, char combine, bool compField = false)
|
225
239
|
{
|
226
240
|
logType = getFilterLogicTypeCode(type);
|
227
241
|
opr = combine;
|
228
242
|
short fieldNum = tb->fieldNumByName(name);
|
229
|
-
if ((logType!=255) && (fieldNum != -1))
|
243
|
+
if ((logType != 255) && (fieldNum != -1))
|
230
244
|
{
|
231
245
|
bool ret = true;
|
232
246
|
fielddef* fd = &tb->tableDef()->fieldDefs[fieldNum];
|
233
247
|
setFieldParam(fd);
|
234
|
-
unsigned char* tmp = new unsigned char[len];
|
235
|
-
|
236
|
-
//backup
|
237
|
-
memcpy(tmp, tb->fieldPtr(fieldNum), len);
|
238
248
|
|
239
249
|
if (compField)
|
240
|
-
ret = setCompFiled(tb, fieldNum, value)
|
250
|
+
ret = setCompFiled(tb, fieldNum, value); // value is field name
|
241
251
|
else
|
242
252
|
{
|
243
|
-
tb
|
244
|
-
|
253
|
+
fields fds(*tb);
|
254
|
+
field fd = fds[fieldNum];
|
255
|
+
fd = value;
|
256
|
+
bool part = fd.isCompPartAndMakeValue();
|
245
257
|
copyToBuffer(tb, fieldNum, part);
|
246
258
|
}
|
247
|
-
//restore
|
248
|
-
memcpy(tb->fieldPtr(fieldNum),tmp, len);
|
249
|
-
delete [] tmp;
|
250
259
|
return ret;
|
251
260
|
}
|
252
261
|
return false;
|
253
262
|
}
|
254
263
|
|
255
|
-
|
256
|
-
bool setParam(void* keyValue, ushort_td keylen)
|
257
|
-
{
|
258
|
-
logType = 1;// '=' type
|
259
|
-
opr = eCor;
|
260
|
-
len = keylen;
|
261
|
-
type = ft_string;// this value is ignored.
|
262
|
-
pos = 0;
|
263
|
-
allocBuffer(len);
|
264
|
-
memcpy(data, keyValue, len);
|
265
|
-
return true;
|
266
|
-
}
|
267
|
-
|
268
|
-
unsigned char* writeBuffer(unsigned char* p, bool estimate, bool end)
|
264
|
+
unsigned char* writeBuffer(unsigned char* p, bool estimate, bool end) const
|
269
265
|
{
|
270
266
|
int n = sizeof(logic) - sizeof(unsigned char*);
|
271
267
|
if (!estimate)
|
272
268
|
{
|
273
269
|
memcpy(p, this, n);
|
274
270
|
if (end)
|
275
|
-
*(p+n-1) = eCend;
|
271
|
+
*(p + n - 1) = eCend;
|
276
272
|
}
|
277
273
|
p += n;
|
278
274
|
|
279
275
|
n = getDatalen();
|
280
|
-
if (!estimate)
|
276
|
+
if (!estimate)
|
277
|
+
memcpy(p, data, n);
|
281
278
|
return p + n;
|
282
279
|
}
|
283
280
|
|
@@ -286,16 +283,11 @@ public:
|
|
286
283
|
bool flag = true;
|
287
284
|
if (after)
|
288
285
|
flag = (opr == 1);
|
289
|
-
return (flag
|
290
|
-
|
291
|
-
&& (type != ft_zstring)
|
292
|
-
&& !verType(type));
|
286
|
+
return (flag && (logType == 1) && (type != ft_zstring) &&
|
287
|
+
!verType(type));
|
293
288
|
}
|
294
289
|
|
295
|
-
bool isNextFiled(logic* src)
|
296
|
-
{
|
297
|
-
return ((pos + len) == src->pos);
|
298
|
-
}
|
290
|
+
bool isNextFiled(logic* src) { return ((pos + len) == src->pos); }
|
299
291
|
|
300
292
|
void joinAfter(logic* src)
|
301
293
|
{
|
@@ -306,92 +298,155 @@ public:
|
|
306
298
|
memcpy(data, tmp, len);
|
307
299
|
memcpy(data + len, src->data, src->len);
|
308
300
|
len += src->len;
|
309
|
-
type = ft_string; //compare by memcmp
|
301
|
+
type = ft_string; // compare by memcmp
|
310
302
|
opr = src->opr;
|
311
|
-
delete
|
303
|
+
delete[] tmp;
|
312
304
|
}
|
313
305
|
};
|
314
306
|
|
315
307
|
struct header
|
316
308
|
{
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
309
|
+
private:
|
310
|
+
union
|
311
|
+
{
|
312
|
+
struct
|
313
|
+
{
|
314
|
+
unsigned short len;
|
315
|
+
char type[2];
|
316
|
+
};
|
317
|
+
struct
|
318
|
+
{
|
319
|
+
int ilen : 28;
|
320
|
+
int itype : 4;
|
321
|
+
};
|
322
|
+
};
|
323
|
+
|
324
|
+
public:
|
325
|
+
unsigned short rejectCount;
|
326
|
+
unsigned short logicalCount;
|
327
|
+
header() : len(0), rejectCount(1), logicalCount(0)
|
328
|
+
{
|
329
|
+
type[0] = 0x00;
|
330
|
+
type[1] = 0x00;
|
331
|
+
}
|
332
|
+
|
322
333
|
void reset()
|
323
334
|
{
|
324
335
|
rejectCount = 1;
|
325
336
|
logicalCount = 0;
|
326
337
|
len = 0;
|
327
|
-
|
338
|
+
type[0] = 0x00;
|
339
|
+
type[1] = 0x00;
|
328
340
|
}
|
329
341
|
|
330
|
-
void setPositionType(bool incCurrent)
|
342
|
+
void setPositionType(bool incCurrent, bool withBookmark, bool isTransactd)
|
331
343
|
{
|
332
|
-
if (
|
344
|
+
if (isTransactd)
|
333
345
|
{
|
334
|
-
|
335
|
-
|
346
|
+
itype = incCurrent ? FILTER_CURRENT_TYPE_INC
|
347
|
+
: FILTER_CURRENT_TYPE_NOTINC;
|
348
|
+
if (!withBookmark)
|
349
|
+
itype |= FILTER_CURRENT_TYPE_NOBOOKMARK;
|
336
350
|
}
|
337
351
|
else
|
338
352
|
{
|
339
|
-
|
340
|
-
|
353
|
+
if (incCurrent)
|
354
|
+
{
|
355
|
+
type[0] = 'U';
|
356
|
+
type[1] = 'C';
|
357
|
+
}
|
358
|
+
else
|
359
|
+
{
|
360
|
+
type[0] = 'E';
|
361
|
+
type[1] = 'G';
|
362
|
+
}
|
341
363
|
}
|
342
364
|
}
|
343
365
|
|
344
|
-
bool
|
366
|
+
int bookmarkSize(bool isTransactd) const
|
367
|
+
{
|
368
|
+
if (isTransactd)
|
369
|
+
return (itype & FILTER_CURRENT_TYPE_NOBOOKMARK) ? 0 : BOOKMARK_SIZE;
|
370
|
+
assert(type[0]);
|
371
|
+
// if (type[1] == 'N') return 0;
|
372
|
+
return BOOKMARK_SIZE;
|
373
|
+
}
|
374
|
+
|
375
|
+
bool positionTypeNext(bool isTransactd) const
|
345
376
|
{
|
377
|
+
if (isTransactd)
|
378
|
+
return !(itype & FILTER_CURRENT_TYPE_INC);
|
346
379
|
return (type[0] == 'E');
|
347
380
|
}
|
348
381
|
|
349
|
-
|
382
|
+
void setLen(int size, bool isTransactd)
|
383
|
+
{
|
384
|
+
if (isTransactd)
|
385
|
+
ilen = size;
|
386
|
+
else
|
387
|
+
len = size;
|
388
|
+
}
|
389
|
+
|
390
|
+
unsigned char* writeBuffer(unsigned char* p, bool estimate) const
|
350
391
|
{
|
351
392
|
int n = sizeof(header);
|
352
|
-
if (!estimate)
|
393
|
+
if (!estimate)
|
394
|
+
memcpy(p, this, n);
|
353
395
|
return p + n;
|
354
396
|
}
|
355
397
|
};
|
356
|
-
#pragma
|
357
|
-
pragma_pop
|
398
|
+
#pragma pack(pop)
|
399
|
+
pragma_pop;
|
400
|
+
|
401
|
+
class recordBackup
|
402
|
+
{
|
403
|
+
char* m_buf;
|
404
|
+
table* m_tb;
|
358
405
|
|
406
|
+
public:
|
407
|
+
recordBackup(table* tb) : m_tb(tb)
|
408
|
+
{
|
409
|
+
m_buf = new char[m_tb->buflen()];
|
410
|
+
memcpy(m_buf, m_tb->fieldPtr(0), m_tb->buflen());
|
411
|
+
}
|
359
412
|
|
413
|
+
~recordBackup()
|
414
|
+
{
|
415
|
+
memcpy(m_tb->fieldPtr(0), m_buf, m_tb->buflen());
|
416
|
+
delete[] m_buf;
|
417
|
+
}
|
418
|
+
};
|
360
419
|
|
361
420
|
class filter
|
362
421
|
{
|
363
|
-
|
364
422
|
table* m_tb;
|
365
423
|
header m_hd;
|
366
424
|
resultDef m_ret;
|
367
425
|
std::vector<resultField*> m_fields;
|
368
|
-
std::vector<
|
426
|
+
std::vector<short> m_selectFieldIndexes;
|
427
|
+
std::vector<logic> m_logics;
|
428
|
+
std::vector<seek> m_seeks;
|
429
|
+
uchar_td* m_seeksDataBuffer;
|
430
|
+
|
369
431
|
int m_extendBuflen;
|
370
|
-
std::_tstring m_str;
|
371
432
|
bool m_ignoreFields;
|
372
433
|
bool m_seeksMode;
|
373
434
|
bool m_useOptimize;
|
435
|
+
bool m_withBookmark;
|
374
436
|
size_t m_seeksWritedCount;
|
375
437
|
size_t m_logicalLimitCount;
|
376
438
|
table::eFindType m_direction;
|
377
|
-
|
378
|
-
|
379
|
-
|
439
|
+
bool m_isTransactd;
|
440
|
+
bool m_hasManyJoin;
|
441
|
+
inline int maxDataBuffer()
|
380
442
|
{
|
381
|
-
|
382
|
-
if (l->setParam(m_tb, name, type, value, combine, compField))
|
383
|
-
{
|
384
|
-
m_logics.push_back(l);
|
385
|
-
return true;
|
386
|
-
}
|
387
|
-
delete l;
|
388
|
-
return false;
|
443
|
+
return m_isTransactd ? TDAP_MAX_DATA_SIZE : BTRV_MAX_DATA_SIZE;
|
389
444
|
}
|
390
445
|
|
391
446
|
void addAllFields()
|
392
447
|
{
|
393
448
|
resultField* r = new resultField();
|
394
|
-
r->len = (ushort_td)
|
449
|
+
r->len = (ushort_td)m_tb->tableDef()->maxRecordLen;
|
395
450
|
r->pos = 0;
|
396
451
|
m_fields.push_back(r);
|
397
452
|
}
|
@@ -399,9 +454,11 @@ class filter
|
|
399
454
|
bool addSelect(const _TCHAR* name)
|
400
455
|
{
|
401
456
|
resultField* r = new resultField();
|
402
|
-
|
457
|
+
int fieldNum = r->setParam(m_tb, name);
|
458
|
+
if (fieldNum != -1)
|
403
459
|
{
|
404
460
|
m_fields.push_back(r);
|
461
|
+
m_selectFieldIndexes.push_back(fieldNum);
|
405
462
|
return true;
|
406
463
|
}
|
407
464
|
delete r;
|
@@ -410,7 +467,7 @@ class filter
|
|
410
467
|
|
411
468
|
bool setSelect(const std::vector<std::_tstring>& selects)
|
412
469
|
{
|
413
|
-
for (size_t i=0;i < selects.size()
|
470
|
+
for (size_t i = 0; i < selects.size(); ++i)
|
414
471
|
{
|
415
472
|
if (!addSelect(selects[i].c_str()))
|
416
473
|
return false;
|
@@ -420,66 +477,117 @@ class filter
|
|
420
477
|
|
421
478
|
bool setWhere(const std::vector<std::_tstring>& where)
|
422
479
|
{
|
423
|
-
if (where.size() == 0)
|
424
|
-
|
480
|
+
if (where.size() == 0)
|
481
|
+
return true;
|
482
|
+
if (where.size() < 3)
|
483
|
+
return false;
|
484
|
+
m_logics.resize(m_logics.size() + (where.size() + 1) / 4);
|
425
485
|
|
426
|
-
|
486
|
+
int index = 0;
|
487
|
+
for (size_t i = 0; i < where.size(); i += 4)
|
427
488
|
{
|
489
|
+
if (i + 2 >= where.size())
|
490
|
+
return false;
|
428
491
|
char combine = eCend;
|
429
|
-
std::_tstring value = where[i+2];
|
430
|
-
bool compField = (value[0] == _T('['));
|
492
|
+
std::_tstring value = where[i + 2];
|
493
|
+
bool compField = (value.size() && (value[0] == _T('[')));
|
431
494
|
if (compField)
|
432
495
|
{
|
433
496
|
value.erase(value.begin());
|
434
497
|
value.erase(value.end() - 1);
|
435
498
|
}
|
436
|
-
if (i+3 < where.size())
|
499
|
+
if (i + 3 < where.size())
|
437
500
|
{
|
438
|
-
std::_tstring s = where[i+3];
|
501
|
+
std::_tstring s = where[i + 3];
|
439
502
|
boost::algorithm::to_lower(s);
|
440
|
-
if (s == _T("or"))
|
503
|
+
if (s == _T("or"))
|
504
|
+
combine = eCor;
|
441
505
|
else if (s == _T("and"))
|
442
506
|
combine = eCand;
|
443
507
|
else
|
444
508
|
return false;
|
445
509
|
}
|
446
|
-
if (!
|
447
|
-
|
510
|
+
if (!m_logics[index++].setParam(m_tb, where[i].c_str(),
|
511
|
+
where[i + 1].c_str(), value.c_str(),
|
512
|
+
combine, compField))
|
448
513
|
return false;
|
449
514
|
}
|
450
515
|
return true;
|
516
|
+
}
|
451
517
|
|
518
|
+
inline void setSeekValue(short fieldNum, const std::_tstring& s)
|
519
|
+
{
|
520
|
+
m_tb->setFV(fieldNum, s.c_str());
|
452
521
|
}
|
453
522
|
|
523
|
+
inline void setSeekValue(short fieldNum, const keyValuePtr& v)
|
524
|
+
{
|
525
|
+
if (v.type & KEYVALUE_STR)
|
526
|
+
m_tb->setFV(fieldNum, (_TCHAR*)v.ptr);
|
527
|
+
else
|
528
|
+
{
|
529
|
+
fielddef& fd = m_tb->tableDef()->fieldDefs[fieldNum];
|
530
|
+
void* p = m_tb->fieldPtr(fieldNum);
|
531
|
+
|
532
|
+
ushort_td len = std::min<ushort_td>(v.len, fd.len);
|
533
|
+
memset(p, 0, fd.len);
|
534
|
+
memcpy(p, v.ptr, len);
|
535
|
+
}
|
536
|
+
}
|
454
537
|
|
455
|
-
|
538
|
+
template <class vector_type>
|
539
|
+
bool setSeeks(const vector_type& keyValues, const queryBase* q)
|
456
540
|
{
|
457
|
-
|
541
|
+
int keySize = q->getJoinKeySize();
|
542
|
+
// Check key values
|
458
543
|
keydef* kd = &m_tb->tableDef()->keyDefs[m_tb->keyNum()];
|
459
|
-
|
544
|
+
int joinKeySize = kd->segmentCount;
|
545
|
+
if (keySize != 0)
|
546
|
+
{
|
547
|
+
// Check specify key size is smoller than kd->segmentCount or equal
|
548
|
+
if (kd->segmentCount < keySize)
|
549
|
+
return false;
|
550
|
+
joinKeySize = keySize;
|
551
|
+
m_withBookmark = m_hasManyJoin =
|
552
|
+
(kd->segmentCount != joinKeySize) || kd->segments[0].flags.bit0;
|
553
|
+
|
554
|
+
// Check when m_hasManyJoin need set joinHasOneOrHasMany
|
555
|
+
if (m_hasManyJoin &&
|
556
|
+
!(q->getOptimize() & queryBase::joinHasOneOrHasMany))
|
557
|
+
return false;
|
558
|
+
}
|
559
|
+
|
560
|
+
if (keyValues.size() % joinKeySize)
|
460
561
|
return false;
|
461
|
-
//Check uniqe key
|
462
|
-
if (kd->segments[0].flags.bit0)
|
562
|
+
// Check uniqe key
|
563
|
+
if (kd->segments[0].flags.bit0 && !queryBase::joinHasOneOrHasMany)
|
463
564
|
return false;
|
464
|
-
|
465
|
-
|
466
|
-
for (
|
565
|
+
m_seeks.resize(keyValues.size() / joinKeySize);
|
566
|
+
int maxKeylen = 0;
|
567
|
+
for (int j = 0; j < joinKeySize; ++j)
|
568
|
+
maxKeylen +=
|
569
|
+
m_tb->tableDef()->fieldDefs[kd->segments[j].fieldNum].len + 2;
|
570
|
+
|
571
|
+
// alloc databuffer
|
572
|
+
if (m_seeksDataBuffer)
|
573
|
+
delete[] m_seeksDataBuffer;
|
574
|
+
|
575
|
+
m_seeksDataBuffer = new uchar_td[maxKeylen * m_seeks.size()];
|
576
|
+
memset(m_seeksDataBuffer, 0, maxKeylen * m_seeks.size());
|
577
|
+
uchar_td* dataBuf = m_seeksDataBuffer;
|
578
|
+
|
579
|
+
int index = 0;
|
580
|
+
for (size_t i = 0; i < keyValues.size(); i += joinKeySize)
|
467
581
|
{
|
468
|
-
for (int j=0;j<
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
if (l->setParam(m_tb->m_keybuf, len))
|
474
|
-
m_logics.push_back(l);
|
475
|
-
else
|
476
|
-
{
|
477
|
-
delete l;
|
582
|
+
for (int j = 0; j < joinKeySize; ++j)
|
583
|
+
setSeekValue(kd->segments[j].fieldNum, keyValues[i + j]);
|
584
|
+
seek* l = &m_seeks[index];
|
585
|
+
ushort_td len = m_tb->writeKeyDataTo(dataBuf, joinKeySize);
|
586
|
+
if (!l->setParam(dataBuf, len))
|
478
587
|
return false;
|
479
|
-
|
588
|
+
dataBuf += len;
|
589
|
+
++index;
|
480
590
|
}
|
481
|
-
if (m_logics.size())
|
482
|
-
m_logics[m_logics.size() -1]->opr = eCend;
|
483
591
|
m_seeksMode = true;
|
484
592
|
m_seeksWritedCount = 0;
|
485
593
|
return true;
|
@@ -491,7 +599,10 @@ class filter
|
|
491
599
|
setRejectCount(q->getReject());
|
492
600
|
setMaxRows(q->getLimit());
|
493
601
|
m_direction = q->getDirection();
|
494
|
-
m_useOptimize = q->
|
602
|
+
m_useOptimize = ((q->getOptimize() & queryBase::combineCondition) ==
|
603
|
+
queryBase::combineCondition);
|
604
|
+
m_withBookmark = q->isBookmarkAlso();
|
605
|
+
recordBackup recb(m_tb);
|
495
606
|
|
496
607
|
if (q->isAll())
|
497
608
|
addAllFields();
|
@@ -502,53 +613,57 @@ class filter
|
|
502
613
|
else if (!setSelect(q->getSelects()))
|
503
614
|
return false;
|
504
615
|
|
505
|
-
//seeks or where
|
616
|
+
// seeks or where
|
506
617
|
if (q->getSeekKeyValues().size() && q->getWheres().size())
|
507
618
|
return false;
|
508
619
|
|
509
620
|
if (q->getSeekKeyValues().size())
|
510
|
-
return setSeeks(q->getSeekKeyValues());
|
621
|
+
return setSeeks(q->getSeekKeyValues(), q);
|
622
|
+
else if (q->getSeekValuesPtr().size())
|
623
|
+
return setSeeks(q->getSeekValuesPtr(), q);
|
511
624
|
else if (q->getWheres().size())
|
512
625
|
return setWhere(q->getWheres());
|
513
626
|
}
|
514
627
|
return true;
|
515
628
|
}
|
516
629
|
|
517
|
-
|
630
|
+
int resultRowSize(bool ignoreFields) const
|
518
631
|
{
|
519
632
|
|
520
|
-
|
633
|
+
int recordLen = m_hd.bookmarkSize(m_isTransactd) + DATASIZE_BYTE;
|
521
634
|
if (!ignoreFields)
|
522
635
|
{
|
523
|
-
for (size_t i=0;i< m_fields.size()
|
636
|
+
for (size_t i = 0; i < m_fields.size(); ++i)
|
524
637
|
recordLen += m_fields[i]->len;
|
525
638
|
}
|
526
639
|
return recordLen;
|
527
640
|
}
|
528
641
|
|
529
|
-
|
642
|
+
int calcMaxRows()
|
530
643
|
{
|
531
|
-
return (
|
644
|
+
return maxDataBuffer() / resultRowSize(m_ignoreFields);
|
532
645
|
}
|
533
646
|
|
534
|
-
|
647
|
+
int resultBufferNeedSize()
|
535
648
|
{
|
536
649
|
return (m_ret.maxRows * resultRowSize(m_ignoreFields)) + DATASIZE_BYTE;
|
537
650
|
}
|
538
651
|
|
539
652
|
void joinLogic()
|
540
653
|
{
|
541
|
-
if (m_seeksMode || !m_useOptimize)
|
654
|
+
if (m_seeksMode || !m_useOptimize)
|
655
|
+
return;
|
542
656
|
|
543
|
-
for (int i= (int)m_logics.size()-2;i>=0
|
657
|
+
for (int i = (int)m_logics.size() - 2; i >= 0; --i)
|
544
658
|
{
|
545
|
-
|
546
|
-
logic
|
547
|
-
|
659
|
+
|
660
|
+
logic& la = m_logics[i + 1];
|
661
|
+
logic& lb = m_logics[i];
|
662
|
+
if (la.canJoin(false) && lb.canJoin(true) && lb.isNextFiled(&la))
|
548
663
|
{
|
549
|
-
lb
|
550
|
-
delete la;
|
551
|
-
m_logics.erase(m_logics.begin()+i+1);
|
664
|
+
lb.joinAfter(&la);
|
665
|
+
// delete la;
|
666
|
+
m_logics.erase(m_logics.begin() + i + 1);
|
552
667
|
}
|
553
668
|
}
|
554
669
|
}
|
@@ -558,7 +673,7 @@ class filter
|
|
558
673
|
unsigned char* p = (unsigned char*)m_tb->dataBak();
|
559
674
|
unsigned char* start = p;
|
560
675
|
|
561
|
-
|
676
|
+
m_hd.logicalCount = (ushort_td)m_logicalLimitCount;
|
562
677
|
if (m_ignoreFields)
|
563
678
|
m_ret.fieldCount = 0;
|
564
679
|
else
|
@@ -568,45 +683,62 @@ class filter
|
|
568
683
|
if (m_seeksMode)
|
569
684
|
{
|
570
685
|
first = m_seeksWritedCount;
|
571
|
-
last = std::min<size_t>(calcMaxRows() + m_seeksWritedCount,
|
686
|
+
last = std::min<size_t>(calcMaxRows() + m_seeksWritedCount,
|
687
|
+
m_logicalLimitCount);
|
572
688
|
m_hd.rejectCount = 0;
|
573
|
-
|
689
|
+
if (m_hasManyJoin)
|
690
|
+
m_ret.maxRows = 0;
|
691
|
+
else
|
692
|
+
m_ret.maxRows = m_hd.logicalCount = (ushort_td)(last - first);
|
574
693
|
}
|
575
694
|
if (m_ret.maxRows == 0)
|
576
|
-
m_ret.maxRows =
|
695
|
+
m_ret.maxRows =
|
696
|
+
(unsigned short)std::min<int>(calcMaxRows(), USHRT_MAX);
|
577
697
|
|
578
|
-
p =
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
698
|
+
p = m_hd.writeBuffer(p, estimate);
|
699
|
+
if (m_seeksMode)
|
700
|
+
{
|
701
|
+
for (size_t i = first; i < last; ++i)
|
702
|
+
p = m_seeks[i].writeBuffer(p, estimate, (i == (last - 1)),
|
703
|
+
true);
|
704
|
+
if (!estimate)
|
705
|
+
m_seeksWritedCount += m_hd.logicalCount;
|
706
|
+
}
|
707
|
+
else
|
708
|
+
{
|
709
|
+
for (size_t i = first; i < last; ++i)
|
710
|
+
p = m_logics[i].writeBuffer(p, estimate, (i == (last - 1)));
|
711
|
+
}
|
583
712
|
|
584
|
-
p =
|
713
|
+
p = m_ret.writeBuffer(p, estimate);
|
585
714
|
|
586
715
|
if (!m_ignoreFields)
|
587
716
|
{
|
588
|
-
for (size_t i=0;i< m_fields.size()
|
717
|
+
for (size_t i = 0; i < m_fields.size(); ++i)
|
589
718
|
p = m_fields[i]->writeBuffer(p, estimate);
|
590
719
|
}
|
591
720
|
|
592
|
-
//write total length
|
721
|
+
// write total length
|
593
722
|
int len = (int)(p - start);
|
594
|
-
unsigned short* s = (unsigned short*)start;
|
595
723
|
if (!estimate)
|
596
|
-
|
724
|
+
{
|
725
|
+
m_hd.setLen(len, m_isTransactd);
|
726
|
+
m_hd.writeBuffer(start, false);
|
727
|
+
}
|
597
728
|
return len;
|
598
729
|
}
|
599
730
|
|
731
|
+
// use seeksMode only
|
600
732
|
int calcLogicalCutsize(int oversize)
|
601
733
|
{
|
602
734
|
int cutsize = 0;
|
603
|
-
for (size_t i=m_hd.logicalCount-1;i!=0
|
735
|
+
for (size_t i = m_hd.logicalCount - 1; i != 0; --i)
|
604
736
|
{
|
605
|
-
cutsize += (int)
|
737
|
+
cutsize += (int)m_seeks[i + m_seeksWritedCount].getLength();
|
606
738
|
if (oversize - cutsize < 0)
|
607
739
|
{
|
608
740
|
m_logicalLimitCount = i;
|
609
|
-
return
|
741
|
+
return cutsize;
|
610
742
|
}
|
611
743
|
}
|
612
744
|
return 0;
|
@@ -615,62 +747,70 @@ class filter
|
|
615
747
|
bool allocDataBuffer()
|
616
748
|
{
|
617
749
|
joinLogic();
|
618
|
-
m_logicalLimitCount = m_logics.size();
|
750
|
+
m_logicalLimitCount = m_seeksMode ? m_seeks.size() : m_logics.size();
|
619
751
|
int len = doWriteBuffer(true);
|
620
|
-
if (len > (
|
752
|
+
if (len > maxDataBuffer())
|
621
753
|
{
|
622
754
|
if (m_seeksMode)
|
623
|
-
len -= calcLogicalCutsize(len -
|
755
|
+
len -= calcLogicalCutsize(len - maxDataBuffer() + 1);
|
624
756
|
else
|
625
757
|
return false;
|
626
758
|
}
|
627
|
-
m_hd.len = len
|
628
|
-
int resultLen = resultBufferNeedSize();
|
629
|
-
if (resultLen >
|
759
|
+
// m_hd.len = len;//lost 2byte data at transactd
|
760
|
+
int resultLen = (int)resultBufferNeedSize();
|
761
|
+
if (resultLen > maxDataBuffer())
|
630
762
|
{
|
763
|
+
/* change the max rows fit to a max buffer size */
|
631
764
|
m_ret.maxRows = calcMaxRows();
|
632
765
|
resultLen = resultBufferNeedSize();
|
633
766
|
}
|
634
|
-
|
635
|
-
m_extendBuflen = std::max<int>(
|
636
|
-
|
767
|
+
|
768
|
+
m_extendBuflen = std::max<int>((int)len, resultLen);
|
769
|
+
m_extendBuflen =
|
770
|
+
std::max<int>(m_extendBuflen, m_tb->tableDef()->maxRecordLen);
|
771
|
+
if (fieldSelected() || m_tb->valiableFormatType())
|
637
772
|
m_extendBuflen += m_tb->buflen();
|
638
773
|
|
639
774
|
if ((int)m_tb->buflen() < m_extendBuflen)
|
640
775
|
{
|
641
|
-
m_tb->setDataBak((void*)
|
776
|
+
m_tb->setDataBak((void*)realloc(m_tb->dataBak(), m_extendBuflen));
|
642
777
|
m_tb->setData(m_tb->dataBak());
|
643
778
|
}
|
644
779
|
return true;
|
645
780
|
}
|
646
781
|
|
647
782
|
public:
|
648
|
-
filter(table* tb)
|
649
|
-
|
650
|
-
|
783
|
+
filter(table* tb)
|
784
|
+
: m_tb(tb), m_seeksDataBuffer(NULL), m_ignoreFields(false),
|
785
|
+
m_seeksMode(false), m_useOptimize(true), m_withBookmark(true),
|
786
|
+
m_seeksWritedCount(0), m_hasManyJoin(false)
|
651
787
|
{
|
652
|
-
|
788
|
+
m_isTransactd = m_tb->isUseTransactd();
|
653
789
|
}
|
654
790
|
|
791
|
+
~filter() { cleanup(); }
|
792
|
+
|
655
793
|
void cleanup()
|
656
794
|
{
|
657
|
-
for (size_t i=0;i <
|
658
|
-
delete m_logics[i];
|
659
|
-
for (size_t i=0;i < m_fields.size();++i)
|
795
|
+
for (size_t i = 0; i < m_fields.size(); ++i)
|
660
796
|
delete m_fields[i];
|
661
|
-
|
662
|
-
m_fields.
|
797
|
+
m_selectFieldIndexes.clear();
|
798
|
+
m_fields.clear();
|
799
|
+
m_logics.clear();
|
800
|
+
m_seeks.clear();
|
663
801
|
m_hd.reset();
|
664
802
|
m_ret.reset();
|
665
803
|
m_ignoreFields = false;
|
666
804
|
m_seeksMode = false;
|
667
805
|
m_seeksWritedCount = 0;
|
668
806
|
m_useOptimize = true;
|
807
|
+
delete[] m_seeksDataBuffer;
|
808
|
+
m_seeksDataBuffer = NULL;
|
809
|
+
m_hasManyJoin = false;
|
669
810
|
}
|
670
811
|
|
671
812
|
bool setQuery(const queryBase* q)
|
672
813
|
{
|
673
|
-
m_str = q->toString();
|
674
814
|
bool ret = doSetFilter(q);
|
675
815
|
if (!ret)
|
676
816
|
cleanup();
|
@@ -679,39 +819,47 @@ public:
|
|
679
819
|
|
680
820
|
bool isWriteComleted() const
|
681
821
|
{
|
682
|
-
if (!m_seeksMode)
|
683
|
-
|
822
|
+
if (!m_seeksMode)
|
823
|
+
return true;
|
824
|
+
return (m_seeksWritedCount == m_seeks.size());
|
684
825
|
}
|
685
|
-
void resetSeeksWrited(){m_seeksWritedCount = 0;}
|
686
826
|
|
687
|
-
|
827
|
+
inline bool hasManyJoin() const { return m_hasManyJoin; }
|
688
828
|
|
689
|
-
|
829
|
+
inline void resetSeeksWrited() { m_seeksWritedCount = 0; }
|
830
|
+
|
831
|
+
void setPositionType(bool incCurrent)
|
832
|
+
{
|
833
|
+
m_hd.setPositionType(incCurrent, m_withBookmark, m_isTransactd);
|
834
|
+
}
|
835
|
+
|
836
|
+
bool positionTypeNext() const
|
837
|
+
{
|
838
|
+
return m_hd.positionTypeNext(m_isTransactd);
|
839
|
+
}
|
690
840
|
|
691
|
-
void setRejectCount(ushort_td v){m_hd.rejectCount = v;}
|
692
|
-
ushort_td rejectCount()const {return m_hd.rejectCount;}
|
841
|
+
void setRejectCount(ushort_td v) { m_hd.rejectCount = v; }
|
842
|
+
ushort_td rejectCount() const { return m_hd.rejectCount; }
|
693
843
|
|
694
|
-
void setMaxRows(ushort_td v){m_ret.maxRows = v;}
|
695
|
-
ushort_td maxRows()const {return m_ret.maxRows;}
|
844
|
+
void setMaxRows(ushort_td v) { m_ret.maxRows = v; }
|
845
|
+
ushort_td maxRows() const { return m_ret.maxRows; }
|
696
846
|
|
697
|
-
ushort_td recordCount()const {return maxRows();}
|
847
|
+
ushort_td recordCount() const { return maxRows(); }
|
698
848
|
|
699
|
-
void setPosTypeNext(bool v){setPositionType(!v);}
|
849
|
+
void setPosTypeNext(bool v) { setPositionType(!v); }
|
700
850
|
|
701
851
|
uint_td exDataBufLen() const
|
702
852
|
{
|
703
|
-
if ((
|
853
|
+
if (fieldSelected() || m_tb->valiableFormatType())
|
704
854
|
return m_extendBuflen - m_tb->buflen();
|
705
855
|
return m_extendBuflen;
|
706
856
|
}
|
707
857
|
|
708
858
|
void init(table* pBao){};
|
709
859
|
|
710
|
-
|
711
|
-
|
712
|
-
ushort_td fieldCount() const {return m_ret.fieldCount;}
|
860
|
+
ushort_td fieldCount() const { return m_ret.fieldCount; }
|
713
861
|
|
714
|
-
void setFieldCount(ushort_td v){m_ret.fieldCount = v;}
|
862
|
+
void setFieldCount(ushort_td v) { m_ret.fieldCount = v; }
|
715
863
|
|
716
864
|
ushort_td fieldLen(int index) const
|
717
865
|
{
|
@@ -719,6 +867,20 @@ public:
|
|
719
867
|
return m_fields[index]->len;
|
720
868
|
}
|
721
869
|
|
870
|
+
ushort_td totalFieldLen() const
|
871
|
+
{
|
872
|
+
return resultRowSize(false) - m_hd.bookmarkSize(m_isTransactd) -
|
873
|
+
DATASIZE_BYTE;
|
874
|
+
}
|
875
|
+
|
876
|
+
ushort_td totalSelectFieldLen() const
|
877
|
+
{
|
878
|
+
ushort_td recordLen = 0;
|
879
|
+
for (size_t i = 0; i < m_fields.size(); ++i)
|
880
|
+
recordLen += m_fields[i]->len;
|
881
|
+
return recordLen;
|
882
|
+
}
|
883
|
+
|
722
884
|
ushort_td fieldOffset(int index) const
|
723
885
|
{
|
724
886
|
assert(index < (int)m_fields.size());
|
@@ -732,35 +894,37 @@ public:
|
|
732
894
|
return false;
|
733
895
|
}
|
734
896
|
|
735
|
-
ushort_td extendBuflen() const{return m_extendBuflen;}
|
897
|
+
ushort_td extendBuflen() const { return m_extendBuflen; }
|
736
898
|
|
737
899
|
bool fieldSelected() const
|
738
900
|
{
|
739
|
-
return !((m_fields.size() == 1) && (m_fields[0]->pos == 0)
|
901
|
+
return !((m_fields.size() == 1) && (m_fields[0]->pos == 0) &&
|
902
|
+
(m_fields[0]->len ==
|
903
|
+
(ushort_td)m_tb->tableDef()->maxRecordLen));
|
740
904
|
}
|
741
905
|
|
742
|
-
bool ignoreFields() const {return m_ignoreFields;}
|
906
|
+
bool ignoreFields() const { return m_ignoreFields; }
|
907
|
+
|
908
|
+
int bookmarkSize() const { return m_hd.bookmarkSize(m_isTransactd); }
|
743
909
|
|
744
910
|
/* The Ignore fields option don't use with multi seek operation.
|
745
911
|
because if a server are not found a record then a server return
|
746
912
|
error code in a bookmark field.
|
747
913
|
*/
|
748
|
-
void setIgnoreFields(bool v){m_ignoreFields = v;}
|
749
|
-
bool isSeeksMode()const {return m_seeksMode;}
|
750
|
-
table::eFindType direction() const{return m_direction;}
|
751
|
-
void setDirection(table::eFindType v) {m_direction = v;}
|
752
|
-
const std::vector<
|
753
|
-
|
754
|
-
|
914
|
+
void setIgnoreFields(bool v) { m_ignoreFields = v; }
|
915
|
+
bool isSeeksMode() const { return m_seeksMode; }
|
916
|
+
table::eFindType direction() const { return m_direction; }
|
917
|
+
void setDirection(table::eFindType v) { m_direction = v; }
|
918
|
+
const std::vector<short>& selectFieldIndexes()
|
919
|
+
{
|
920
|
+
return m_selectFieldIndexes;
|
921
|
+
}
|
922
|
+
const std::vector<seek>& seeks() const { return m_seeks; }
|
755
923
|
};
|
756
924
|
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
}// namespace
|
762
|
-
|
763
|
-
}// namespace protocol
|
764
|
-
}// namespace db
|
765
|
-
}// namespace bzs
|
766
|
-
#endif//BZS_DB_PROTOCOL_TDAP_CLIENT_FILTER_H
|
925
|
+
} // namespace client
|
926
|
+
} // namespace tdap
|
927
|
+
} // namespace protocol
|
928
|
+
} // namespace db
|
929
|
+
} // namespace bzs
|
930
|
+
#endif // BZS_DB_PROTOCOL_TDAP_CLIENT_FILTER_H
|