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,145 @@
|
|
|
1
|
+
#ifndef BZS_DB_PROTOCOL_TDAP_CLIENT_MEMRECORD_H
|
|
2
|
+
#define BZS_DB_PROTOCOL_TDAP_CLIENT_MEMRECORD_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 "fields.h"
|
|
22
|
+
|
|
23
|
+
namespace bzs
|
|
24
|
+
{
|
|
25
|
+
namespace db
|
|
26
|
+
{
|
|
27
|
+
namespace protocol
|
|
28
|
+
{
|
|
29
|
+
namespace tdap
|
|
30
|
+
{
|
|
31
|
+
namespace client
|
|
32
|
+
{
|
|
33
|
+
|
|
34
|
+
/** @cond INTERNAL */
|
|
35
|
+
|
|
36
|
+
class DLLLIB autoMemory
|
|
37
|
+
{
|
|
38
|
+
|
|
39
|
+
public:
|
|
40
|
+
autoMemory();
|
|
41
|
+
explicit autoMemory(unsigned char* p, size_t s, short* endIndex, bool own);
|
|
42
|
+
autoMemory(const autoMemory& p);
|
|
43
|
+
~autoMemory();
|
|
44
|
+
autoMemory& operator=(const bzs::db::protocol::tdap::client::autoMemory& p);
|
|
45
|
+
unsigned char* ptr;
|
|
46
|
+
short* endFieldIndex;
|
|
47
|
+
unsigned int size;
|
|
48
|
+
bool owner;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/** @endcond */
|
|
52
|
+
|
|
53
|
+
#pragma warning(disable : 4251)
|
|
54
|
+
#pragma warning(disable : 4275)
|
|
55
|
+
#define ROW_MEM_BLOCK_RESERVE 4
|
|
56
|
+
|
|
57
|
+
class DLLLIB memoryRecord : public fieldsBase
|
|
58
|
+
{
|
|
59
|
+
friend class multiRecordAlocatorImple;
|
|
60
|
+
friend class recordsetImple;
|
|
61
|
+
|
|
62
|
+
std::vector<autoMemory> m_memblock;
|
|
63
|
+
|
|
64
|
+
protected:
|
|
65
|
+
/** @cond INTERNAL */
|
|
66
|
+
inline memoryRecord(fielddefs& fdinfo);
|
|
67
|
+
memoryRecord(const memoryRecord& r);
|
|
68
|
+
void copyToBuffer(table* tb, bool updateOnly = false) const;
|
|
69
|
+
|
|
70
|
+
/* return memory block first address which not field ptr address */
|
|
71
|
+
inline unsigned char* ptr(int index) const
|
|
72
|
+
{
|
|
73
|
+
for (int i = 0; i < memBlockSize(); ++i)
|
|
74
|
+
if (*(m_memblock[i].endFieldIndex) > index)
|
|
75
|
+
return m_memblock[i].ptr;
|
|
76
|
+
assert(0);
|
|
77
|
+
return NULL;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
inline const autoMemory& memBlockByField(int index) const
|
|
81
|
+
{
|
|
82
|
+
for (int i = 0; i < memBlockSize(); ++i)
|
|
83
|
+
if (*(m_memblock[i].endFieldIndex) > index)
|
|
84
|
+
return m_memblock[i];
|
|
85
|
+
assert(0);
|
|
86
|
+
return *((autoMemory*)0);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
inline const autoMemory& memBlock(int index) const
|
|
90
|
+
{
|
|
91
|
+
return m_memblock[index];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
inline int memBlockSize() const { return (int)m_memblock.size(); }
|
|
95
|
+
|
|
96
|
+
inline void copyFromBuffer(const table* tb)
|
|
97
|
+
{
|
|
98
|
+
memcpy(ptr(0), tb->fieldPtr(0), m_fns.totalFieldLen());
|
|
99
|
+
}
|
|
100
|
+
void removeLastMemBlock() { m_memblock.pop_back(); }
|
|
101
|
+
|
|
102
|
+
/** @endcond */
|
|
103
|
+
public:
|
|
104
|
+
void clear(); // orverride
|
|
105
|
+
void setRecordData(unsigned char* ptr, size_t size, short* endFieldIndex,
|
|
106
|
+
bool owner = false);
|
|
107
|
+
|
|
108
|
+
static memoryRecord* create(fielddefs& fdinfo);
|
|
109
|
+
static void release(fieldsBase* p);
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
#pragma warning(default : 4275)
|
|
113
|
+
#pragma warning(default : 4251)
|
|
114
|
+
|
|
115
|
+
/* non copyable*/
|
|
116
|
+
class DLLLIB writableRecord : public memoryRecord
|
|
117
|
+
{
|
|
118
|
+
fielddefs* m_fddefs;
|
|
119
|
+
table* m_tb;
|
|
120
|
+
short m_endIndex;
|
|
121
|
+
|
|
122
|
+
writableRecord(table* tb, const aliasMap_type* alias);
|
|
123
|
+
writableRecord(const writableRecord&);
|
|
124
|
+
writableRecord& operator=(const writableRecord&);
|
|
125
|
+
|
|
126
|
+
fielddefs* fddefs();
|
|
127
|
+
|
|
128
|
+
public:
|
|
129
|
+
~writableRecord();
|
|
130
|
+
bool read(bool KeysetAlrady = false);
|
|
131
|
+
void insert();
|
|
132
|
+
void del(bool KeysetAlrady = false);
|
|
133
|
+
void update();
|
|
134
|
+
void save();
|
|
135
|
+
|
|
136
|
+
static writableRecord* create(table* tb, const aliasMap_type* alias);
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
} // namespace client
|
|
140
|
+
} // namespace tdap
|
|
141
|
+
} // namespace protocol
|
|
142
|
+
} // namespace db
|
|
143
|
+
} // namespace bzs
|
|
144
|
+
|
|
145
|
+
#endif // BZS_DB_PROTOCOL_TDAP_CLIENT_MEMRECORD_H
|
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
/*=================================================================
|
|
2
|
+
Copyright (C) 2014 BizStation Corp All rights reserved.
|
|
3
|
+
|
|
4
|
+
This program is free software; you can redistribute it and/or
|
|
5
|
+
modify it under the terms of the GNU General Public License
|
|
6
|
+
as published by the Free Software Foundation; either version 2
|
|
7
|
+
of the License, or (at your option) any later version.
|
|
8
|
+
|
|
9
|
+
This program is distributed in the hope that it will be useful,
|
|
10
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
GNU General Public License for more details.
|
|
13
|
+
|
|
14
|
+
You should have received a copy of the GNU General Public License
|
|
15
|
+
along with this program; if not, write to the Free Software
|
|
16
|
+
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
17
|
+
02111-1307, USA.
|
|
18
|
+
=================================================================*/
|
|
19
|
+
#pragma hdrstop
|
|
20
|
+
|
|
21
|
+
#include "memRecordset.h"
|
|
22
|
+
|
|
23
|
+
#ifdef _DEBUG
|
|
24
|
+
#include <iostream>
|
|
25
|
+
#endif
|
|
26
|
+
#pragma package(smart_init)
|
|
27
|
+
|
|
28
|
+
namespace bzs
|
|
29
|
+
{
|
|
30
|
+
namespace db
|
|
31
|
+
{
|
|
32
|
+
namespace protocol
|
|
33
|
+
{
|
|
34
|
+
namespace tdap
|
|
35
|
+
{
|
|
36
|
+
namespace client
|
|
37
|
+
{
|
|
38
|
+
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// class multiRecordAlocatorImple
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
class multiRecordAlocatorImple : public multiRecordAlocator
|
|
43
|
+
{
|
|
44
|
+
class recordset* m_rs;
|
|
45
|
+
int m_rowOffset;
|
|
46
|
+
int m_addType;
|
|
47
|
+
int m_curFirstFiled;
|
|
48
|
+
const std::vector<std::vector<int> >* m_joinRowMap;
|
|
49
|
+
|
|
50
|
+
public:
|
|
51
|
+
inline multiRecordAlocatorImple(recordset* rs)
|
|
52
|
+
: m_rs(rs), m_rowOffset(0), m_addType(0), m_curFirstFiled(0),
|
|
53
|
+
m_joinRowMap(NULL)
|
|
54
|
+
{
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
inline void init(size_t recordCount, size_t recordLen, int addType,
|
|
58
|
+
const table* tb)
|
|
59
|
+
{
|
|
60
|
+
m_rs->registerMemoryBlock(NULL, recordCount * recordLen, recordLen,
|
|
61
|
+
addType | m_addType, tb);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
inline unsigned char* ptr(size_t row, int stat)
|
|
65
|
+
{
|
|
66
|
+
int col = (stat == mra_current_block) ? m_curFirstFiled : 0;
|
|
67
|
+
size_t rowNum = m_joinRowMap ? (*m_joinRowMap)[row + m_rowOffset][0]
|
|
68
|
+
: row + m_rowOffset;
|
|
69
|
+
return (*m_rs)[rowNum].ptr(col);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
inline void setRowOffset(int v) { m_rowOffset = v; }
|
|
73
|
+
|
|
74
|
+
inline void setJoinType(int v) { m_addType = v; }
|
|
75
|
+
|
|
76
|
+
inline void setInvalidRecord(size_t row, bool v)
|
|
77
|
+
{
|
|
78
|
+
(*m_rs)[row + m_rowOffset].setInvalidRecord(v);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
inline void setCurFirstFiled(int v) { m_curFirstFiled = v; }
|
|
82
|
+
|
|
83
|
+
inline void setJoinRowMap(const std::vector<std::vector<int> >* v)
|
|
84
|
+
{
|
|
85
|
+
m_joinRowMap = v; /*m_joinMapSize = size;*/
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
inline const std::vector<std::vector<int> >* joinRowMap() const
|
|
89
|
+
{
|
|
90
|
+
return m_joinRowMap;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
// class recordsetSorter
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
class recordsetSorter
|
|
98
|
+
{
|
|
99
|
+
const std::vector<int>& m_fieldNums;
|
|
100
|
+
|
|
101
|
+
public:
|
|
102
|
+
recordsetSorter(const std::vector<int>& fieldNums) : m_fieldNums(fieldNums)
|
|
103
|
+
{
|
|
104
|
+
}
|
|
105
|
+
bool operator()(const row_ptr& l, const row_ptr r) const
|
|
106
|
+
{
|
|
107
|
+
std::vector<int>::const_iterator it = m_fieldNums.begin();
|
|
108
|
+
while (it != m_fieldNums.end())
|
|
109
|
+
{
|
|
110
|
+
int ret = (*l)[*it].comp((*r)[*it], 0);
|
|
111
|
+
if (ret)
|
|
112
|
+
return (ret < 0);
|
|
113
|
+
++it;
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
// class recordset
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
recordset::recordset()
|
|
123
|
+
: m_fds(fielddefs::create(), &fielddefs::destroy), m_joinRows(0),
|
|
124
|
+
m_uniqueReadMaxField(0)
|
|
125
|
+
{
|
|
126
|
+
m_mra.reset(new multiRecordAlocatorImple(this));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
recordset::~recordset()
|
|
130
|
+
{
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
void recordset::registerMemoryBlock(unsigned char* ptr, size_t size,
|
|
134
|
+
size_t recordLen, int addtype,
|
|
135
|
+
const table* tb)
|
|
136
|
+
{
|
|
137
|
+
autoMemory* am = new autoMemory(ptr, size, 0, true);
|
|
138
|
+
m_memblock.push_back(boost::shared_ptr<autoMemory>(am));
|
|
139
|
+
unsigned char* p = am->ptr;
|
|
140
|
+
// copy fileds
|
|
141
|
+
if (addtype & mra_nextrows)
|
|
142
|
+
{
|
|
143
|
+
if (addtype == mra_nextrows)
|
|
144
|
+
m_mra->setRowOffset((int)m_recordset.size()); // no join
|
|
145
|
+
else
|
|
146
|
+
m_mra->setRowOffset((int)m_joinRows); // Join
|
|
147
|
+
}
|
|
148
|
+
else
|
|
149
|
+
{
|
|
150
|
+
// assert(tb);
|
|
151
|
+
m_joinRows = 0;
|
|
152
|
+
m_mra->setRowOffset(0);
|
|
153
|
+
m_mra->setCurFirstFiled((int)m_fds->size());
|
|
154
|
+
if (tb)
|
|
155
|
+
m_fds->copyFrom(tb);
|
|
156
|
+
if (tb && (addtype == mra_nojoin))
|
|
157
|
+
{
|
|
158
|
+
const keydef& kd = tb->tableDef()->keyDefs[tb->keyNum()];
|
|
159
|
+
m_uniqueReadMaxField =
|
|
160
|
+
(kd.segments[0].flags.bit0 == false) ? (short)m_fds->size() : 0;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
*(am->endFieldIndex) = (short)m_fds->size();
|
|
165
|
+
size_t rows = size / recordLen;
|
|
166
|
+
|
|
167
|
+
// set record pointer to each record
|
|
168
|
+
if ((addtype & mra_innerjoin) || (addtype & mra_outerjoin))
|
|
169
|
+
{
|
|
170
|
+
// Join optimazing
|
|
171
|
+
const std::vector<std::vector<int> >* jmap = m_mra->joinRowMap();
|
|
172
|
+
|
|
173
|
+
if (jmap)
|
|
174
|
+
{
|
|
175
|
+
// At Join that if some base records reference to a joined record
|
|
176
|
+
// that the joined record pointer is shared by some base
|
|
177
|
+
// records.
|
|
178
|
+
for (int i = 0; i < (int)rows; ++i)
|
|
179
|
+
{
|
|
180
|
+
const std::vector<int>& map = (*jmap)[i + m_joinRows];
|
|
181
|
+
for (int j = 0; j < (int)map.size(); ++j)
|
|
182
|
+
m_recordset[map[j]]->setRecordData(
|
|
183
|
+
p + recordLen * i, 0, am->endFieldIndex, false);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else
|
|
187
|
+
{
|
|
188
|
+
for (int i = 0; i < (int)rows; ++i)
|
|
189
|
+
m_recordset[i + m_joinRows]->setRecordData(
|
|
190
|
+
p + recordLen * i, 0, am->endFieldIndex, false);
|
|
191
|
+
}
|
|
192
|
+
m_joinRows += rows;
|
|
193
|
+
}
|
|
194
|
+
else
|
|
195
|
+
{ // create new record
|
|
196
|
+
size_t reserveSize = m_recordset.size() + rows;
|
|
197
|
+
m_recordset.reserve(reserveSize);
|
|
198
|
+
for (int i = 0; i < (int)rows; ++i)
|
|
199
|
+
{
|
|
200
|
+
row_ptr rec(memoryRecord::create(*m_fds), &memoryRecord::release);
|
|
201
|
+
rec->setRecordData(p + recordLen * i, 0, am->endFieldIndex, false);
|
|
202
|
+
m_recordset.push_back(rec);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
void recordset::makeSortFields(const _TCHAR* name, std::vector<int>& fieldNums)
|
|
208
|
+
{
|
|
209
|
+
int index = m_fds->indexByName(name);
|
|
210
|
+
if (index == -1)
|
|
211
|
+
THROW_BZS_ERROR_WITH_MSG(_T("oorderBy:Invalid field name"));
|
|
212
|
+
fieldNums.push_back(index);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
int recordset::getMemBlockIndex(unsigned char* ptr) const
|
|
216
|
+
{
|
|
217
|
+
for (int i = 0; i < (int)m_memblock.size(); ++i)
|
|
218
|
+
{
|
|
219
|
+
const boost::shared_ptr<autoMemory>& am = m_memblock[i];
|
|
220
|
+
if ((ptr >= am->ptr) && (ptr < am->ptr + am->size))
|
|
221
|
+
return i;
|
|
222
|
+
}
|
|
223
|
+
assert(0);
|
|
224
|
+
return -1;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/* This clone is deep copy.
|
|
228
|
+
But text and blob field data memory are shared.
|
|
229
|
+
*/
|
|
230
|
+
recordset* recordset::clone() const
|
|
231
|
+
{
|
|
232
|
+
recordset* p = new recordset();
|
|
233
|
+
p->m_joinRows = m_joinRows;
|
|
234
|
+
p->m_uniqueReadMaxField = m_uniqueReadMaxField;
|
|
235
|
+
p->m_unionFds = m_unionFds;
|
|
236
|
+
p->m_fds.reset(m_fds->clone(), &fielddefs::destroy);
|
|
237
|
+
|
|
238
|
+
std::vector<__int64> offsets;
|
|
239
|
+
for (int i = 0; i < (int)m_memblock.size(); ++i)
|
|
240
|
+
{
|
|
241
|
+
autoMemory* am =
|
|
242
|
+
new autoMemory(m_memblock[i]->ptr, m_memblock[i]->size, 0, true);
|
|
243
|
+
*am->endFieldIndex = *m_memblock[i]->endFieldIndex;
|
|
244
|
+
p->m_memblock.push_back(boost::shared_ptr<autoMemory>(am));
|
|
245
|
+
offsets.push_back((__int64)(am->ptr - m_memblock[i]->ptr));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
for (int i = 0; i < (int)m_recordset.size(); ++i)
|
|
249
|
+
{
|
|
250
|
+
memoryRecord* row = dynamic_cast<memoryRecord*>(m_recordset[i].get());
|
|
251
|
+
memoryRecord* mr = memoryRecord::create(*p->m_fds);
|
|
252
|
+
row_ptr rec(mr, &memoryRecord::release);
|
|
253
|
+
p->m_recordset.push_back(rec);
|
|
254
|
+
|
|
255
|
+
for (int j = 0; j < (int)row->memBlockSize(); ++j)
|
|
256
|
+
{
|
|
257
|
+
const autoMemory& mb = row->memBlock(j);
|
|
258
|
+
int index = getMemBlockIndex(mb.ptr);
|
|
259
|
+
unsigned char* ptr = mb.ptr + offsets[index];
|
|
260
|
+
const boost::shared_ptr<autoMemory>& am = p->m_memblock[index];
|
|
261
|
+
mr->setRecordData(ptr, mb.size, am->endFieldIndex, mb.owner);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return p;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
void recordset::clearRecords()
|
|
268
|
+
{
|
|
269
|
+
m_recordset.clear();
|
|
270
|
+
m_uniqueReadMaxField = 0;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
void recordset::clear()
|
|
274
|
+
{
|
|
275
|
+
clearRecords();
|
|
276
|
+
m_fds->clear();
|
|
277
|
+
m_unionFds.clear();
|
|
278
|
+
m_memblock.clear();
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
recordset& recordset::top(recordset& c, int n)
|
|
282
|
+
{
|
|
283
|
+
c = *this;
|
|
284
|
+
c.clearRecords();
|
|
285
|
+
for (int i = 0; i < n; ++i)
|
|
286
|
+
c.push_back(m_recordset[i]);
|
|
287
|
+
return c;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
recordset::iterator recordset::begin()
|
|
291
|
+
{
|
|
292
|
+
return m_recordset.begin();
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
recordset::iterator recordset::end()
|
|
296
|
+
{
|
|
297
|
+
return m_recordset.end();
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
recordset::iterator recordset::erase(size_t index)
|
|
301
|
+
{
|
|
302
|
+
return m_recordset.erase(m_recordset.begin() + index);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
recordset::iterator recordset::erase(const iterator& it)
|
|
306
|
+
{
|
|
307
|
+
return m_recordset.erase(it);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
void recordset::push_back(row_ptr r)
|
|
311
|
+
{
|
|
312
|
+
m_recordset.push_back(r);
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
void recordset::readBefore(const table_ptr tb, const aliasMap_type* alias)
|
|
316
|
+
{
|
|
317
|
+
tb->setMra(m_mra.get());
|
|
318
|
+
m_fds->setAliases(alias);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
recordset::key_type recordset::resolvKeyValue(const std::_tstring& name,
|
|
322
|
+
bool noexception)
|
|
323
|
+
{
|
|
324
|
+
int index = m_fds->indexByName(name);
|
|
325
|
+
if (index != -1)
|
|
326
|
+
return index;
|
|
327
|
+
if (!noexception)
|
|
328
|
+
THROW_BZS_ERROR_WITH_MSG(_T("groupQuery:Invalid key name"));
|
|
329
|
+
|
|
330
|
+
return (key_type)m_fds->size();
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
void recordset::removeField(int index)
|
|
334
|
+
{
|
|
335
|
+
m_fds->remove(index);
|
|
336
|
+
for (int i = 0; i < (int)m_unionFds.size(); ++i)
|
|
337
|
+
m_unionFds[i]->remove(index);
|
|
338
|
+
|
|
339
|
+
for (int i = 0; i < (int)m_memblock.size(); ++i)
|
|
340
|
+
{
|
|
341
|
+
if (*(m_memblock[i]->endFieldIndex) > index)
|
|
342
|
+
{
|
|
343
|
+
short v = *(m_memblock[i]->endFieldIndex) - 1;
|
|
344
|
+
*(m_memblock[i]->endFieldIndex) = v;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
recordset& recordset::matchBy(recordsetQuery& rq)
|
|
350
|
+
{
|
|
351
|
+
rq.init(fieldDefs());
|
|
352
|
+
for (int i = (int)m_recordset.size() - 1; i >= 0; --i)
|
|
353
|
+
if (!rq.match(m_recordset[i]))
|
|
354
|
+
erase(i);
|
|
355
|
+
return *this;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
recordset& recordset::groupBy(groupQuery& gq)
|
|
359
|
+
{
|
|
360
|
+
gq.grouping(*this);
|
|
361
|
+
return *this;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
recordset& recordset::orderBy(const _TCHAR* name1, const _TCHAR* name2,
|
|
365
|
+
const _TCHAR* name3, const _TCHAR* name4,
|
|
366
|
+
const _TCHAR* name5, const _TCHAR* name6,
|
|
367
|
+
const _TCHAR* name7, const _TCHAR* name8)
|
|
368
|
+
{
|
|
369
|
+
std::vector<int> fieldNums;
|
|
370
|
+
makeSortFields(name1, fieldNums);
|
|
371
|
+
if (name2)
|
|
372
|
+
makeSortFields(name2, fieldNums);
|
|
373
|
+
if (name3)
|
|
374
|
+
makeSortFields(name3, fieldNums);
|
|
375
|
+
if (name4)
|
|
376
|
+
makeSortFields(name4, fieldNums);
|
|
377
|
+
if (name5)
|
|
378
|
+
makeSortFields(name5, fieldNums);
|
|
379
|
+
if (name6)
|
|
380
|
+
makeSortFields(name6, fieldNums);
|
|
381
|
+
if (name7)
|
|
382
|
+
makeSortFields(name7, fieldNums);
|
|
383
|
+
if (name8)
|
|
384
|
+
makeSortFields(name8, fieldNums);
|
|
385
|
+
std::sort(begin(), end(), recordsetSorter(fieldNums));
|
|
386
|
+
return *this;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
inline recordset& recordset::reverse()
|
|
390
|
+
{
|
|
391
|
+
std::reverse(begin(), end());
|
|
392
|
+
return *this;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
void recordset::appendCol(const _TCHAR* name, int type, short len)
|
|
396
|
+
{
|
|
397
|
+
assert(m_fds->size());
|
|
398
|
+
fielddef fd((*m_fds)[0]);
|
|
399
|
+
fd.len = len;
|
|
400
|
+
fd.pos = 0;
|
|
401
|
+
fd.type = type;
|
|
402
|
+
fd.setName(name);
|
|
403
|
+
m_fds->push_back(&fd);
|
|
404
|
+
for (int i = 0; i < (int)m_unionFds.size(); ++i)
|
|
405
|
+
m_unionFds[i]->push_back(&fd);
|
|
406
|
+
registerMemoryBlock(NULL, fd.len * size(), fd.len, mra_outerjoin);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
recordset& recordset::operator+=(const recordset& r)
|
|
410
|
+
{
|
|
411
|
+
if (!m_fds->canUnion(*r.m_fds))
|
|
412
|
+
THROW_BZS_ERROR_WITH_MSG(_T("Recordsets are different format"));
|
|
413
|
+
|
|
414
|
+
m_recordset.reserve(m_recordset.size() + r.size());
|
|
415
|
+
m_unionFds.push_back(r.m_fds);
|
|
416
|
+
for (size_t i = 0; i < r.size(); ++i)
|
|
417
|
+
m_recordset.push_back(r.m_recordset[i]);
|
|
418
|
+
for (size_t i = 0; i < r.m_memblock.size(); ++i)
|
|
419
|
+
m_memblock.push_back(r.m_memblock[i]);
|
|
420
|
+
return *this;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
#ifdef _DEBUG
|
|
424
|
+
void recordset::dump()
|
|
425
|
+
{
|
|
426
|
+
const fielddefs& fields = *fieldDefs();
|
|
427
|
+
for (int j = 0; j < (int)fields.size(); ++j)
|
|
428
|
+
std::tcout << fields[j].name() << _T("\t");
|
|
429
|
+
std::tcout << _T("\n");
|
|
430
|
+
|
|
431
|
+
for (int i = 0; i < (int)size(); ++i)
|
|
432
|
+
{
|
|
433
|
+
row& m = (operator[](i));
|
|
434
|
+
for (int j = 0; j < (int)m.size(); ++j)
|
|
435
|
+
{
|
|
436
|
+
std::tcout << m[(short)j].c_str() << _T("\t");
|
|
437
|
+
if (j == (int)m.size() - 1)
|
|
438
|
+
std::tcout << _T("\n");
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
#endif
|
|
443
|
+
|
|
444
|
+
} // namespace client
|
|
445
|
+
} // namespace tdap
|
|
446
|
+
} // namespace protocol
|
|
447
|
+
} // namespace db
|
|
448
|
+
} // namespace bzs
|