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
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#ifndef BZS_DB_PROTOCOL_TDAP_CLIENT_RECORDSET_H
|
|
2
|
+
#define BZS_DB_PROTOCOL_TDAP_CLIENT_RECORDSET_H
|
|
3
|
+
/*=================================================================
|
|
4
|
+
Copyright (C) 2014 BizStation Corp All rights reserved.
|
|
5
|
+
|
|
6
|
+
This program is free software; you can redistribute it and/or
|
|
7
|
+
modify it under the terms of the GNU General Public License
|
|
8
|
+
as published by the Free Software Foundation; either version 2
|
|
9
|
+
of the License, or (at your option) any later version.
|
|
10
|
+
|
|
11
|
+
This program is distributed in the hope that it will be useful,
|
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
GNU General Public License for more details.
|
|
15
|
+
|
|
16
|
+
You should have received a copy of the GNU General Public License
|
|
17
|
+
along with this program; if not, write to the Free Software
|
|
18
|
+
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
19
|
+
02111-1307, USA.
|
|
20
|
+
=================================================================*/
|
|
21
|
+
#include "groupQuery.h"
|
|
22
|
+
|
|
23
|
+
namespace bzs
|
|
24
|
+
{
|
|
25
|
+
namespace db
|
|
26
|
+
{
|
|
27
|
+
namespace protocol
|
|
28
|
+
{
|
|
29
|
+
namespace tdap
|
|
30
|
+
{
|
|
31
|
+
namespace client
|
|
32
|
+
{
|
|
33
|
+
|
|
34
|
+
class DLLLIB recordset
|
|
35
|
+
{
|
|
36
|
+
|
|
37
|
+
friend class activeTable;
|
|
38
|
+
class recordsetImple* m_imple;
|
|
39
|
+
|
|
40
|
+
public:
|
|
41
|
+
typedef std::vector<row_ptr>::iterator iterator;
|
|
42
|
+
|
|
43
|
+
recordset();
|
|
44
|
+
recordset(const recordset& r);
|
|
45
|
+
recordset& operator=(const recordset& r);
|
|
46
|
+
~recordset();
|
|
47
|
+
recordset* clone() const;
|
|
48
|
+
row& operator[](size_t index) const;
|
|
49
|
+
row& first() const;
|
|
50
|
+
row& last() const;
|
|
51
|
+
size_t size() const;
|
|
52
|
+
size_t count() const;
|
|
53
|
+
void clearRecords();
|
|
54
|
+
const fielddefs* fieldDefs() const;
|
|
55
|
+
void clear();
|
|
56
|
+
recordset& top(recordset& c, int n) const;
|
|
57
|
+
iterator begin();
|
|
58
|
+
iterator end();
|
|
59
|
+
iterator erase(size_t index);
|
|
60
|
+
iterator erase(const iterator& it);
|
|
61
|
+
void removeField(int index);
|
|
62
|
+
recordset& matchBy(recordsetQuery& rq);
|
|
63
|
+
recordset& groupBy(groupQuery& gq);
|
|
64
|
+
recordset& orderBy(const _TCHAR* name1, const _TCHAR* name2 = NULL,
|
|
65
|
+
const _TCHAR* name3 = NULL, const _TCHAR* name4 = NULL,
|
|
66
|
+
const _TCHAR* name5 = NULL, const _TCHAR* name6 = NULL,
|
|
67
|
+
const _TCHAR* name7 = NULL, const _TCHAR* name8 = NULL);
|
|
68
|
+
recordset& orderBy(const sortFields& orders);
|
|
69
|
+
recordset& reverse();
|
|
70
|
+
void appendField(const _TCHAR* name, int type, short len);
|
|
71
|
+
recordset& operator+=(const recordset& r);
|
|
72
|
+
void release();
|
|
73
|
+
static recordset* create();
|
|
74
|
+
|
|
75
|
+
#ifdef _DEBUG
|
|
76
|
+
void dump();
|
|
77
|
+
#endif
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
} // namespace client
|
|
81
|
+
} // namespace tdap
|
|
82
|
+
} // namespace protocol
|
|
83
|
+
} // namespace db
|
|
84
|
+
} // namespace bzs
|
|
85
|
+
|
|
86
|
+
#endif // BZS_DB_PROTOCOL_TDAP_CLIENT_RECORDSET_H
|
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
#ifndef BZS_DB_PROTOCOL_TDAP_CLIENT_MEMRECORDSETIMPLE_H
|
|
2
|
+
#define BZS_DB_PROTOCOL_TDAP_CLIENT_MEMRECORDSETIMPLE_H
|
|
3
|
+
/*=================================================================
|
|
4
|
+
Copyright (C) 2014 BizStation Corp All rights reserved.
|
|
5
|
+
|
|
6
|
+
This program is free software; you can redistribute it and/or
|
|
7
|
+
modify it under the terms of the GNU General Public License
|
|
8
|
+
as published by the Free Software Foundation; either version 2
|
|
9
|
+
of the License, or (at your option) any later version.
|
|
10
|
+
|
|
11
|
+
This program is distributed in the hope that it will be useful,
|
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
GNU General Public License for more details.
|
|
15
|
+
|
|
16
|
+
You should have received a copy of the GNU General Public License
|
|
17
|
+
along with this program; if not, write to the Free Software
|
|
18
|
+
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
19
|
+
02111-1307, USA.
|
|
20
|
+
=================================================================*/
|
|
21
|
+
#include "trdormapi.h"
|
|
22
|
+
#include "groupQuery.h"
|
|
23
|
+
#ifdef _DEBUG
|
|
24
|
+
#include <iostream>
|
|
25
|
+
#endif
|
|
26
|
+
|
|
27
|
+
namespace bzs
|
|
28
|
+
{
|
|
29
|
+
namespace db
|
|
30
|
+
{
|
|
31
|
+
namespace protocol
|
|
32
|
+
{
|
|
33
|
+
namespace tdap
|
|
34
|
+
{
|
|
35
|
+
namespace client
|
|
36
|
+
{
|
|
37
|
+
|
|
38
|
+
struct sortDescription
|
|
39
|
+
{
|
|
40
|
+
short index;
|
|
41
|
+
bool asc;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
class recordsetSorter
|
|
45
|
+
{
|
|
46
|
+
const std::vector<sortDescription>& m_sortDesc;
|
|
47
|
+
|
|
48
|
+
public:
|
|
49
|
+
recordsetSorter(std::vector<sortDescription>& sortDesc)
|
|
50
|
+
: m_sortDesc(sortDesc)
|
|
51
|
+
{
|
|
52
|
+
}
|
|
53
|
+
bool operator()(const row_ptr& l, const row_ptr r) const
|
|
54
|
+
{
|
|
55
|
+
std::vector<sortDescription>::const_iterator it = m_sortDesc.begin();
|
|
56
|
+
while (it != m_sortDesc.end())
|
|
57
|
+
{
|
|
58
|
+
int ret = (*l)[(*it).index].comp((*r)[(*it).index], 0);
|
|
59
|
+
if (ret)
|
|
60
|
+
return ((*it).asc) ? (ret < 0) : (ret > 0);
|
|
61
|
+
|
|
62
|
+
++it;
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
class multiRecordAlocatorImple : public multiRecordAlocator
|
|
69
|
+
{
|
|
70
|
+
class recordsetImple* m_rs;
|
|
71
|
+
const std::vector<std::vector<int> >* m_joinRowMap;
|
|
72
|
+
int m_rowOffset;
|
|
73
|
+
int m_addType;
|
|
74
|
+
int m_curFirstFiled;
|
|
75
|
+
|
|
76
|
+
public:
|
|
77
|
+
inline multiRecordAlocatorImple(recordsetImple* rs);
|
|
78
|
+
inline void init(size_t recordCount, size_t recordLen, int addType,
|
|
79
|
+
const table* tb);
|
|
80
|
+
inline unsigned char* ptr(size_t row, int stat);
|
|
81
|
+
inline void setRowOffset(int v) { m_rowOffset = v; }
|
|
82
|
+
inline void setJoinType(int v) { m_addType = v; }
|
|
83
|
+
inline void setInvalidRecord(size_t row, bool v);
|
|
84
|
+
inline void setCurFirstFiled(int v) { m_curFirstFiled = v; }
|
|
85
|
+
inline void
|
|
86
|
+
setJoinRowMap(const std::vector<std::vector<int> >* v /*, size_t size*/)
|
|
87
|
+
{
|
|
88
|
+
m_joinRowMap = v; /*m_joinMapSize = size;*/
|
|
89
|
+
}
|
|
90
|
+
inline const std::vector<std::vector<int> >* joinRowMap() const
|
|
91
|
+
{
|
|
92
|
+
return m_joinRowMap;
|
|
93
|
+
}
|
|
94
|
+
inline void duplicateRow(int row, int count);
|
|
95
|
+
inline void removeLastMemBlock(int row);
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
class recordsetImple
|
|
99
|
+
{
|
|
100
|
+
friend class multiRecordAlocatorImple;
|
|
101
|
+
boost::shared_ptr<fielddefs> m_fds;
|
|
102
|
+
boost::shared_ptr<multiRecordAlocatorImple> m_mra;
|
|
103
|
+
std::vector<row_ptr> m_recordset;
|
|
104
|
+
std::vector<boost::shared_ptr<autoMemory> > m_memblock;
|
|
105
|
+
std::vector<boost::shared_ptr<fielddefs> > m_unionFds;
|
|
106
|
+
|
|
107
|
+
/* for registerMemoryBlock temp data */
|
|
108
|
+
size_t m_joinRows;
|
|
109
|
+
|
|
110
|
+
/*
|
|
111
|
+
for optimazing join.
|
|
112
|
+
If the first reading is using by unique key , set that field count.
|
|
113
|
+
*/
|
|
114
|
+
short m_uniqueReadMaxField;
|
|
115
|
+
|
|
116
|
+
public:
|
|
117
|
+
typedef std::vector<row_ptr>::iterator iterator;
|
|
118
|
+
|
|
119
|
+
private:
|
|
120
|
+
void registerMemoryBlock(unsigned char* ptr, size_t size, size_t recordLen,
|
|
121
|
+
int addtype, const table* tb = NULL)
|
|
122
|
+
{
|
|
123
|
+
autoMemory* am = new autoMemory(ptr, size, 0, true);
|
|
124
|
+
m_memblock.push_back(boost::shared_ptr<autoMemory>(am));
|
|
125
|
+
unsigned char* p = am->ptr;
|
|
126
|
+
// copy fileds
|
|
127
|
+
if (addtype & mra_nextrows)
|
|
128
|
+
{
|
|
129
|
+
if (addtype == mra_nextrows)
|
|
130
|
+
m_mra->setRowOffset((int)m_recordset.size()); // no join
|
|
131
|
+
else
|
|
132
|
+
m_mra->setRowOffset((int)m_joinRows); // Join
|
|
133
|
+
}
|
|
134
|
+
else
|
|
135
|
+
{
|
|
136
|
+
// assert(tb);
|
|
137
|
+
m_joinRows = 0;
|
|
138
|
+
m_mra->setRowOffset(0);
|
|
139
|
+
m_mra->setCurFirstFiled((int)m_fds->size());
|
|
140
|
+
if (tb)
|
|
141
|
+
m_fds->copyFrom(tb);
|
|
142
|
+
if (tb && (addtype == mra_nojoin))
|
|
143
|
+
{
|
|
144
|
+
const keydef& kd = tb->tableDef()->keyDefs[tb->keyNum()];
|
|
145
|
+
m_uniqueReadMaxField = (kd.segments[0].flags.bit0 == false)
|
|
146
|
+
? (short)m_fds->size()
|
|
147
|
+
: 0;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
*(am->endFieldIndex) = (short)m_fds->size();
|
|
152
|
+
size_t rows = size / recordLen;
|
|
153
|
+
|
|
154
|
+
// set record pointer to each record
|
|
155
|
+
if ((addtype & mra_innerjoin) || (addtype & mra_outerjoin))
|
|
156
|
+
{
|
|
157
|
+
// Join optimazing
|
|
158
|
+
const std::vector<std::vector<int> >* jmap = m_mra->joinRowMap();
|
|
159
|
+
|
|
160
|
+
if (jmap)
|
|
161
|
+
{
|
|
162
|
+
// At Join that if some base records reference to a joined
|
|
163
|
+
// record
|
|
164
|
+
// that the joined record pointer is shared by some
|
|
165
|
+
// base records.
|
|
166
|
+
for (int i = 0; i < (int)rows; ++i)
|
|
167
|
+
{
|
|
168
|
+
const std::vector<int>& map = (*jmap)[i + m_joinRows];
|
|
169
|
+
for (int j = 0; j < (int)map.size(); ++j)
|
|
170
|
+
m_recordset[map[j]]->setRecordData(
|
|
171
|
+
p + recordLen * i, 0, am->endFieldIndex, false);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
else
|
|
175
|
+
{
|
|
176
|
+
for (int i = 0; i < (int)rows; ++i)
|
|
177
|
+
m_recordset[i + m_joinRows]->setRecordData(
|
|
178
|
+
p + recordLen * i, 0, am->endFieldIndex, false);
|
|
179
|
+
}
|
|
180
|
+
m_joinRows += rows;
|
|
181
|
+
}
|
|
182
|
+
else
|
|
183
|
+
{ // create new record
|
|
184
|
+
size_t reserveSize = m_recordset.size() + rows;
|
|
185
|
+
m_recordset.reserve(reserveSize);
|
|
186
|
+
for (int i = 0; i < (int)rows; ++i)
|
|
187
|
+
{
|
|
188
|
+
row_ptr rec(memoryRecord::create(*m_fds),
|
|
189
|
+
&memoryRecord::release);
|
|
190
|
+
rec->setRecordData(p + recordLen * i, 0, am->endFieldIndex,
|
|
191
|
+
false);
|
|
192
|
+
m_recordset.push_back(rec);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
void makeSortFields(const _TCHAR* name,
|
|
198
|
+
std::vector<sortDescription>& sortDesc, bool asc = true)
|
|
199
|
+
{
|
|
200
|
+
sortDescription sd;
|
|
201
|
+
sd.index = m_fds->indexByName(name);
|
|
202
|
+
if (sd.index == -1)
|
|
203
|
+
THROW_BZS_ERROR_WITH_MSG(_T("orderBy:Invalid field name"));
|
|
204
|
+
sd.asc = asc;
|
|
205
|
+
sortDesc.push_back(sd);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
int getMemBlockIndex(unsigned char* ptr) const
|
|
209
|
+
{
|
|
210
|
+
for (int i = 0; i < (int)m_memblock.size(); ++i)
|
|
211
|
+
{
|
|
212
|
+
const boost::shared_ptr<autoMemory>& am = m_memblock[i];
|
|
213
|
+
if ((ptr >= am->ptr) && (ptr < am->ptr + am->size))
|
|
214
|
+
return i;
|
|
215
|
+
}
|
|
216
|
+
assert(0);
|
|
217
|
+
return -1;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Duplicate row for hasManyJoin
|
|
221
|
+
void duplicateRow(int row, int count)
|
|
222
|
+
{
|
|
223
|
+
row_ptr& r = m_recordset[row];
|
|
224
|
+
memoryRecord* p = dynamic_cast<memoryRecord*>(r.get());
|
|
225
|
+
|
|
226
|
+
m_recordset.reserve(m_recordset.size() + count);
|
|
227
|
+
m_recordset.insert(m_recordset.begin() + row, count, row_ptr());
|
|
228
|
+
for (int i = 0; i < count; ++i)
|
|
229
|
+
m_recordset[i + row].reset(new memoryRecord(*p),
|
|
230
|
+
&memoryRecord::release);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
public:
|
|
234
|
+
inline recordsetImple()
|
|
235
|
+
: m_fds(fielddefs::create(), boost::bind(&fielddefs::release, _1)),
|
|
236
|
+
m_joinRows(0), m_uniqueReadMaxField(0)
|
|
237
|
+
{
|
|
238
|
+
m_mra.reset(new multiRecordAlocatorImple(this));
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
inline ~recordsetImple() {}
|
|
242
|
+
|
|
243
|
+
inline void checkIndex(size_t index)
|
|
244
|
+
{
|
|
245
|
+
if (index >= m_recordset.size())
|
|
246
|
+
THROW_BZS_ERROR_WITH_MSG(_T("Invalid row index of recordset."));
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/* This clone is deep copy.
|
|
250
|
+
But text and blob field data memory are shared.
|
|
251
|
+
*/
|
|
252
|
+
inline recordsetImple* clone() const
|
|
253
|
+
{
|
|
254
|
+
recordsetImple* p = new recordsetImple();
|
|
255
|
+
p->m_joinRows = m_joinRows;
|
|
256
|
+
p->m_uniqueReadMaxField = m_uniqueReadMaxField;
|
|
257
|
+
p->m_unionFds = m_unionFds;
|
|
258
|
+
p->m_fds.reset(m_fds->clone(), boost::bind(&fielddefs::release, _1));
|
|
259
|
+
|
|
260
|
+
std::vector<__int64> offsets;
|
|
261
|
+
for (int i = 0; i < (int)m_memblock.size(); ++i)
|
|
262
|
+
{
|
|
263
|
+
autoMemory* am = new autoMemory(m_memblock[i]->ptr,
|
|
264
|
+
m_memblock[i]->size, 0, true);
|
|
265
|
+
*am->endFieldIndex = *m_memblock[i]->endFieldIndex;
|
|
266
|
+
p->m_memblock.push_back(boost::shared_ptr<autoMemory>(am));
|
|
267
|
+
offsets.push_back((__int64)(am->ptr - m_memblock[i]->ptr));
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
for (int i = 0; i < (int)m_recordset.size(); ++i)
|
|
271
|
+
{
|
|
272
|
+
memoryRecord* row =
|
|
273
|
+
dynamic_cast<memoryRecord*>(m_recordset[i].get());
|
|
274
|
+
memoryRecord* mr = memoryRecord::create(*p->m_fds);
|
|
275
|
+
row_ptr rec(mr, &memoryRecord::release);
|
|
276
|
+
p->m_recordset.push_back(rec);
|
|
277
|
+
|
|
278
|
+
for (int j = 0; j < (int)row->memBlockSize(); ++j)
|
|
279
|
+
{
|
|
280
|
+
const autoMemory& mb = row->memBlock(j);
|
|
281
|
+
int index = getMemBlockIndex(mb.ptr);
|
|
282
|
+
#pragma warn -8072
|
|
283
|
+
unsigned char* ptr = mb.ptr + offsets[index];
|
|
284
|
+
#pragma warn .8072
|
|
285
|
+
const boost::shared_ptr<autoMemory>& am = p->m_memblock[index];
|
|
286
|
+
mr->setRecordData(ptr, mb.size, am->endFieldIndex, mb.owner);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return p;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
inline short uniqueReadMaxField() const { return m_uniqueReadMaxField; }
|
|
293
|
+
|
|
294
|
+
inline void clearRecords()
|
|
295
|
+
{
|
|
296
|
+
m_recordset.clear();
|
|
297
|
+
m_uniqueReadMaxField = 0;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
inline const fielddefs* fieldDefs() const { return m_fds.get(); }
|
|
301
|
+
|
|
302
|
+
inline void clear()
|
|
303
|
+
{
|
|
304
|
+
clearRecords();
|
|
305
|
+
m_fds->clear();
|
|
306
|
+
m_unionFds.clear();
|
|
307
|
+
m_memblock.clear();
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
inline row_ptr& getRow(size_t index) { return m_recordset[index]; }
|
|
311
|
+
|
|
312
|
+
inline row& operator[](size_t index) const
|
|
313
|
+
{
|
|
314
|
+
return *m_recordset[index].get();
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
inline row& first() const
|
|
318
|
+
{
|
|
319
|
+
if (m_recordset.size() == 0)
|
|
320
|
+
THROW_BZS_ERROR_WITH_MSG(_T("Invalid index of recordset."));
|
|
321
|
+
return *m_recordset[0].get();
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
inline row& last() const
|
|
325
|
+
{
|
|
326
|
+
if (m_recordset.size() == 0)
|
|
327
|
+
THROW_BZS_ERROR_WITH_MSG(_T("Invalid index of recordset."));
|
|
328
|
+
return *m_recordset[m_recordset.size() - 1].get();
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
inline recordsetImple& top(recordsetImple& c, int n) const
|
|
332
|
+
{
|
|
333
|
+
c = *this;
|
|
334
|
+
c.clearRecords();
|
|
335
|
+
n = std::min(n, (int)m_recordset.size());
|
|
336
|
+
for (int i = 0; i < n; ++i)
|
|
337
|
+
c.push_back(m_recordset[i]);
|
|
338
|
+
return c;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
inline iterator begin() { return m_recordset.begin(); }
|
|
342
|
+
|
|
343
|
+
inline iterator end() { return m_recordset.end(); }
|
|
344
|
+
|
|
345
|
+
inline iterator erase(size_t index)
|
|
346
|
+
{
|
|
347
|
+
return m_recordset.erase(m_recordset.begin() + index);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
inline iterator erase(const iterator& it) { return m_recordset.erase(it); }
|
|
351
|
+
|
|
352
|
+
inline void push_back(row_ptr r) { m_recordset.push_back(r); };
|
|
353
|
+
|
|
354
|
+
inline size_t size() const { return m_recordset.size(); }
|
|
355
|
+
|
|
356
|
+
inline size_t count() const { return m_recordset.size(); }
|
|
357
|
+
|
|
358
|
+
void readBefore(const table_ptr tb, const aliasMap_type* alias)
|
|
359
|
+
{
|
|
360
|
+
tb->setMra(m_mra.get());
|
|
361
|
+
m_fds->setAliases(alias);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
typedef fielddefs header_type;
|
|
365
|
+
typedef int key_type;
|
|
366
|
+
typedef row_ptr row_type;
|
|
367
|
+
typedef row row_pure_type;
|
|
368
|
+
|
|
369
|
+
key_type resolvKeyValue(const std::_tstring& name, bool noexception = false)
|
|
370
|
+
{
|
|
371
|
+
int index = m_fds->indexByName(name);
|
|
372
|
+
if (index != -1)
|
|
373
|
+
return index;
|
|
374
|
+
if (!noexception)
|
|
375
|
+
THROW_BZS_ERROR_WITH_MSG(_T("groupQuery:Invalid key name"));
|
|
376
|
+
|
|
377
|
+
return (key_type)m_fds->size();
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
inline void removeField(int index)
|
|
381
|
+
{
|
|
382
|
+
m_fds->remove(index);
|
|
383
|
+
for (int i = 0; i < (int)m_unionFds.size(); ++i)
|
|
384
|
+
m_unionFds[i]->remove(index);
|
|
385
|
+
|
|
386
|
+
for (int i = 0; i < (int)m_memblock.size(); ++i)
|
|
387
|
+
{
|
|
388
|
+
if (*(m_memblock[i]->endFieldIndex) > index)
|
|
389
|
+
{
|
|
390
|
+
short v = *(m_memblock[i]->endFieldIndex) - 1;
|
|
391
|
+
*(m_memblock[i]->endFieldIndex) = v;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
inline recordsetImple& matchBy(recordsetQuery& rq)
|
|
397
|
+
{
|
|
398
|
+
m_fds->setAliases(NULL);
|
|
399
|
+
if (m_recordset.size())
|
|
400
|
+
{
|
|
401
|
+
rq.init(fieldDefs());
|
|
402
|
+
for (int i = (int)m_recordset.size() - 1; i >= 0; --i)
|
|
403
|
+
if (!rq.match(m_recordset[i]))
|
|
404
|
+
erase(i);
|
|
405
|
+
}
|
|
406
|
+
return *this;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
inline recordsetImple& groupBy(groupQuery& gq)
|
|
410
|
+
{
|
|
411
|
+
m_fds->setAliases(NULL);
|
|
412
|
+
if (m_recordset.size())
|
|
413
|
+
gq.grouping(*this);
|
|
414
|
+
return *this;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
inline recordsetImple&
|
|
418
|
+
orderBy(const _TCHAR* name1, const _TCHAR* name2 = NULL,
|
|
419
|
+
const _TCHAR* name3 = NULL, const _TCHAR* name4 = NULL,
|
|
420
|
+
const _TCHAR* name5 = NULL, const _TCHAR* name6 = NULL,
|
|
421
|
+
const _TCHAR* name7 = NULL, const _TCHAR* name8 = NULL)
|
|
422
|
+
{
|
|
423
|
+
if (m_recordset.size())
|
|
424
|
+
{
|
|
425
|
+
std::vector<sortDescription> sds;
|
|
426
|
+
makeSortFields(name1, sds, true);
|
|
427
|
+
if (name2)
|
|
428
|
+
makeSortFields(name2, sds, true);
|
|
429
|
+
if (name3)
|
|
430
|
+
makeSortFields(name3, sds, true);
|
|
431
|
+
if (name4)
|
|
432
|
+
makeSortFields(name4, sds, true);
|
|
433
|
+
if (name5)
|
|
434
|
+
makeSortFields(name5, sds, true);
|
|
435
|
+
if (name6)
|
|
436
|
+
makeSortFields(name6, sds, true);
|
|
437
|
+
if (name7)
|
|
438
|
+
makeSortFields(name7, sds, true);
|
|
439
|
+
if (name8)
|
|
440
|
+
makeSortFields(name8, sds, true);
|
|
441
|
+
std::sort(begin(), end(), recordsetSorter(sds));
|
|
442
|
+
}
|
|
443
|
+
return *this;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
inline recordsetImple& orderBy(const sortFields& orders)
|
|
447
|
+
{
|
|
448
|
+
if (m_recordset.size())
|
|
449
|
+
{
|
|
450
|
+
std::vector<sortDescription> sds;
|
|
451
|
+
|
|
452
|
+
for (int i = 0; i < (int)orders.size(); ++i)
|
|
453
|
+
makeSortFields(orders[i].name.c_str(), sds, orders[i].asc);
|
|
454
|
+
|
|
455
|
+
std::sort(begin(), end(), recordsetSorter(sds));
|
|
456
|
+
}
|
|
457
|
+
return *this;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
inline recordsetImple& reverse()
|
|
461
|
+
{
|
|
462
|
+
std::reverse(begin(), end());
|
|
463
|
+
return *this;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
inline void appendField(const _TCHAR* name, int type, short len)
|
|
467
|
+
{
|
|
468
|
+
assert(m_fds->size());
|
|
469
|
+
fielddef fd((*m_fds)[0]);
|
|
470
|
+
fd.len = len;
|
|
471
|
+
fd.pos = 0;
|
|
472
|
+
fd.type = type;
|
|
473
|
+
fd.setName(name);
|
|
474
|
+
m_fds->push_back(&fd);
|
|
475
|
+
for (int i = 0; i < (int)m_unionFds.size(); ++i)
|
|
476
|
+
m_unionFds[i]->push_back(&fd);
|
|
477
|
+
registerMemoryBlock(NULL, fd.len * size(), fd.len, mra_outerjoin);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
inline recordsetImple& operator+=(const recordsetImple& r)
|
|
481
|
+
{
|
|
482
|
+
if (!m_fds->canUnion(*r.m_fds))
|
|
483
|
+
THROW_BZS_ERROR_WITH_MSG(_T("Recordsets are different format"));
|
|
484
|
+
|
|
485
|
+
m_recordset.reserve(m_recordset.size() + r.size());
|
|
486
|
+
m_unionFds.push_back(r.m_fds);
|
|
487
|
+
for (size_t i = 0; i < r.size(); ++i)
|
|
488
|
+
m_recordset.push_back(r.m_recordset[i]);
|
|
489
|
+
for (size_t i = 0; i < r.m_memblock.size(); ++i)
|
|
490
|
+
m_memblock.push_back(r.m_memblock[i]);
|
|
491
|
+
return *this;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
#ifdef _DEBUG
|
|
495
|
+
void dump()
|
|
496
|
+
{
|
|
497
|
+
const fielddefs& fields = *fieldDefs();
|
|
498
|
+
for (int j = 0; j < (int)fields.size(); ++j)
|
|
499
|
+
std::tcout << fields[j].name() << _T("\t");
|
|
500
|
+
std::tcout << _T("\n");
|
|
501
|
+
|
|
502
|
+
for (int i = 0; i < (int)size(); ++i)
|
|
503
|
+
{
|
|
504
|
+
row& m = (operator[](i));
|
|
505
|
+
for (int j = 0; j < (int)m.size(); ++j)
|
|
506
|
+
{
|
|
507
|
+
std::tcout << m[(short)j].c_str() << _T("\t");
|
|
508
|
+
if (j == (int)m.size() - 1)
|
|
509
|
+
std::tcout << _T("\n");
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
#endif
|
|
514
|
+
};
|
|
515
|
+
|
|
516
|
+
inline multiRecordAlocatorImple::multiRecordAlocatorImple(recordsetImple* rs)
|
|
517
|
+
: m_rs(rs), m_joinRowMap(NULL), m_rowOffset(0), m_addType(0),
|
|
518
|
+
m_curFirstFiled(0)
|
|
519
|
+
{
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
inline void multiRecordAlocatorImple::init(size_t recordCount, size_t recordLen,
|
|
523
|
+
int addType, const table* tb)
|
|
524
|
+
{
|
|
525
|
+
m_rs->registerMemoryBlock(NULL, recordCount * recordLen, recordLen,
|
|
526
|
+
addType | m_addType, tb);
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
inline unsigned char* multiRecordAlocatorImple::ptr(size_t row, int stat)
|
|
530
|
+
{
|
|
531
|
+
int col = (stat == mra_current_block) ? m_curFirstFiled : 0;
|
|
532
|
+
size_t rowNum = m_joinRowMap ? (*m_joinRowMap)[row + m_rowOffset][0]
|
|
533
|
+
: row + m_rowOffset;
|
|
534
|
+
return (*m_rs)[rowNum].ptr(col);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
inline void multiRecordAlocatorImple::setInvalidRecord(size_t row, bool v)
|
|
538
|
+
{
|
|
539
|
+
if (m_joinRowMap)
|
|
540
|
+
{
|
|
541
|
+
const std::vector<int>& map = (*m_joinRowMap)[row + m_rowOffset];
|
|
542
|
+
for (int j = 0; j < (int)map.size(); ++j)
|
|
543
|
+
(*m_rs)[map[j]].setInvalidRecord(v);
|
|
544
|
+
}
|
|
545
|
+
else
|
|
546
|
+
(*m_rs)[row + m_rowOffset].setInvalidRecord(v);
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
inline void multiRecordAlocatorImple::duplicateRow(int row, int count)
|
|
550
|
+
{
|
|
551
|
+
m_rs->duplicateRow(row, count);
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
inline void multiRecordAlocatorImple::removeLastMemBlock(int row)
|
|
555
|
+
{
|
|
556
|
+
(*m_rs)[row].removeLastMemBlock();
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
template <> inline recordsetImple::iterator begin(recordsetImple& m)
|
|
560
|
+
{
|
|
561
|
+
return m.begin();
|
|
562
|
+
}
|
|
563
|
+
template <> inline recordsetImple::iterator end(recordsetImple& m)
|
|
564
|
+
{
|
|
565
|
+
return m.end();
|
|
566
|
+
}
|
|
567
|
+
template <> inline void push_back(recordsetImple& m, row_ptr c)
|
|
568
|
+
{
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
/* for groupby */
|
|
572
|
+
template <> inline void clear(recordsetImple& m)
|
|
573
|
+
{
|
|
574
|
+
return m.clearRecords();
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/* for groupby */
|
|
578
|
+
template <>
|
|
579
|
+
inline recordsetImple::key_type
|
|
580
|
+
resolvKeyValue(recordsetImple& m, const std::_tstring& name, bool noexception)
|
|
581
|
+
{
|
|
582
|
+
return m.resolvKeyValue(name, noexception);
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
inline row* create(recordsetImple& m, int)
|
|
586
|
+
{
|
|
587
|
+
return NULL;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
} // namespace client
|
|
591
|
+
} // namespace tdap
|
|
592
|
+
} // namespace protocol
|
|
593
|
+
} // namespace db
|
|
594
|
+
} // namespace bzs
|
|
595
|
+
|
|
596
|
+
#endif // BZS_DB_PROTOCOL_TDAP_CLIENT_MEMRECORDSETIMPLE_H
|