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,1288 @@
|
|
|
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
|
+
#include "serializer.h"
|
|
21
|
+
|
|
22
|
+
#pragma package(smart_init)
|
|
23
|
+
#ifdef BCB_32
|
|
24
|
+
#pragma option push
|
|
25
|
+
#pragma option -Vbr-
|
|
26
|
+
#pragma option -vi-
|
|
27
|
+
#endif
|
|
28
|
+
|
|
29
|
+
#include <bzs/db/protocol/tdap/client/groupQuery.h>
|
|
30
|
+
#include <bzs/db/protocol/tdap/client/activeTable.h>
|
|
31
|
+
#include <boost/serialization/vector.hpp>
|
|
32
|
+
#include <boost/serialization/shared_ptr.hpp>
|
|
33
|
+
#include <boost/serialization/export.hpp>
|
|
34
|
+
#include <boost/archive/xml_oarchive.hpp>
|
|
35
|
+
#include <boost/archive/xml_iarchive.hpp>
|
|
36
|
+
#include <fstream>
|
|
37
|
+
|
|
38
|
+
#ifdef __BCPLUSPLUS__
|
|
39
|
+
#define BZS_LINK_BOOST_SERIALIZATION
|
|
40
|
+
#include <bzs/env/boost_bcb_link.h>
|
|
41
|
+
#endif
|
|
42
|
+
|
|
43
|
+
using namespace boost::archive;
|
|
44
|
+
using namespace boost::serialization;
|
|
45
|
+
|
|
46
|
+
BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::sum, "sum");
|
|
47
|
+
BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::count, "count");
|
|
48
|
+
BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::avg, "avg");
|
|
49
|
+
BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::min, "min");
|
|
50
|
+
BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::max, "max");
|
|
51
|
+
|
|
52
|
+
BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::readStatement,
|
|
53
|
+
"readStatement");
|
|
54
|
+
BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::readHasMany,
|
|
55
|
+
"readHasMany");
|
|
56
|
+
BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::orderByStatement,
|
|
57
|
+
"orderByStatement");
|
|
58
|
+
BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::matchByStatement,
|
|
59
|
+
"matchByStatement");
|
|
60
|
+
BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::groupByStatement,
|
|
61
|
+
"groupByStatement");
|
|
62
|
+
BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::reverseOrderStatement,
|
|
63
|
+
"reverseOrderStatement");
|
|
64
|
+
|
|
65
|
+
BOOST_CLASS_VERSION(bzs::db::protocol::tdap::client::groupFuncBase, 1)
|
|
66
|
+
|
|
67
|
+
namespace bzs
|
|
68
|
+
{
|
|
69
|
+
namespace db
|
|
70
|
+
{
|
|
71
|
+
namespace protocol
|
|
72
|
+
{
|
|
73
|
+
namespace tdap
|
|
74
|
+
{
|
|
75
|
+
namespace client
|
|
76
|
+
{
|
|
77
|
+
|
|
78
|
+
client::query* replaceQueryParams(client::query* tq, client::query& tmpq,
|
|
79
|
+
struct queryStatementsImple* parent);
|
|
80
|
+
|
|
81
|
+
void toU8(std::_tstring& src, std::string& dst)
|
|
82
|
+
{
|
|
83
|
+
#ifdef _UNICODE
|
|
84
|
+
char buf[2048];
|
|
85
|
+
WideCharToMultiByte(CP_UTF8, 0, src.c_str(), -1, buf, 2048, NULL, NULL);
|
|
86
|
+
dst = buf;
|
|
87
|
+
|
|
88
|
+
#else
|
|
89
|
+
dst = src;
|
|
90
|
+
#endif
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
void fromU8(std::string& src, std::_tstring& dst)
|
|
94
|
+
{
|
|
95
|
+
#ifdef _UNICODE
|
|
96
|
+
wchar_t buf[2048];
|
|
97
|
+
MultiByteToWideChar(CP_UTF8, 0, src.c_str(), -1, buf, 2048);
|
|
98
|
+
dst = buf;
|
|
99
|
+
#else
|
|
100
|
+
dst = src;
|
|
101
|
+
#endif
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
template <class Archive>
|
|
105
|
+
void serialize_string(Archive& ar, const char* name, std::_tstring& v)
|
|
106
|
+
{
|
|
107
|
+
std::string s;
|
|
108
|
+
if (!Archive::is_loading::value)
|
|
109
|
+
toU8(v, s);
|
|
110
|
+
ar& boost::serialization::make_nvp(name, s);
|
|
111
|
+
if (Archive::is_loading::value)
|
|
112
|
+
fromU8(s, v);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
template <class Archive>
|
|
116
|
+
void serialize(Archive&, executable&, const unsigned int)
|
|
117
|
+
{
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
template <class Archive>
|
|
121
|
+
void serialize(Archive& ar, sortField& q, const unsigned int)
|
|
122
|
+
{
|
|
123
|
+
|
|
124
|
+
serialize_string(ar, "name", q.name);
|
|
125
|
+
ar& boost::serialization::make_nvp("asc", q.asc);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
template <class Archive>
|
|
129
|
+
void serialize(Archive& ar, sortFields& q, const unsigned int)
|
|
130
|
+
{
|
|
131
|
+
int count = (int)q.m_params.size();
|
|
132
|
+
ar& boost::serialization::make_nvp("count", count);
|
|
133
|
+
for (int i = 0; i < count; i++)
|
|
134
|
+
{
|
|
135
|
+
if (Archive::is_loading::value)
|
|
136
|
+
{
|
|
137
|
+
sortField f;
|
|
138
|
+
ar& boost::serialization::make_nvp("field", f);
|
|
139
|
+
q.m_params.push_back(f);
|
|
140
|
+
}
|
|
141
|
+
else
|
|
142
|
+
ar& boost::serialization::make_nvp("field", q.m_params[i]);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
template <class Archive>
|
|
147
|
+
void serialize(Archive& ar, groupByStatement& q, const unsigned int /*version*/)
|
|
148
|
+
{
|
|
149
|
+
boost::serialization::base_object<executable>(q);
|
|
150
|
+
ar& boost::serialization::make_nvp(
|
|
151
|
+
"keyFields", boost::serialization::base_object<fieldNames>(q));
|
|
152
|
+
ar& boost::serialization::make_nvp("functions", *q.m_statements);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
template <class Archive>
|
|
156
|
+
void serialize(Archive& ar, matchByStatement& q, const unsigned int /*version*/)
|
|
157
|
+
{
|
|
158
|
+
boost::serialization::base_object<executable>(q);
|
|
159
|
+
ar& make_nvp("matchByStatement",
|
|
160
|
+
boost::serialization::base_object<recordsetQuery>(q));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
template <class Archive>
|
|
164
|
+
void serialize(Archive& ar, orderByStatement& q, const unsigned int /*version*/)
|
|
165
|
+
{
|
|
166
|
+
boost::serialization::base_object<executable>(q);
|
|
167
|
+
ar& boost::serialization::make_nvp("sortFields", *q.m_sortFields);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
template <class Archive>
|
|
171
|
+
void serialize(Archive& /*ar*/, reverseOrderStatement& q,
|
|
172
|
+
const unsigned int /*version*/)
|
|
173
|
+
{
|
|
174
|
+
boost::serialization::base_object<executable>(q);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
template <class Archive>
|
|
178
|
+
void serialize(Archive& ar, readStatement& q, const unsigned int /*version*/)
|
|
179
|
+
{
|
|
180
|
+
boost::serialization::base_object<executable>(q);
|
|
181
|
+
ar& boost::serialization::make_nvp(
|
|
182
|
+
"keyFields", boost::serialization::base_object<fieldNames>(q));
|
|
183
|
+
ar& boost::serialization::make_nvp(
|
|
184
|
+
"query", boost::serialization::base_object<query>(q));
|
|
185
|
+
ar& boost::serialization::make_nvp("params", *q.internalPtr());
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
template <class Archive>
|
|
189
|
+
void serialize(Archive& ar, readHasMany& q, const unsigned int /*version*/)
|
|
190
|
+
{
|
|
191
|
+
|
|
192
|
+
ar& boost::serialization::make_nvp(
|
|
193
|
+
"readStatement", boost::serialization::base_object<readStatement>(q));
|
|
194
|
+
ar& boost::serialization::make_nvp("params", *q.internalPtr());
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
template <class Archive>
|
|
198
|
+
void serialize(Archive& ar, queryBase& q, const unsigned int version)
|
|
199
|
+
{
|
|
200
|
+
split_free(ar, q, version);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
template <class Archive>
|
|
204
|
+
void save(Archive& ar, const queryBase& q, const unsigned int /*version*/)
|
|
205
|
+
{
|
|
206
|
+
std::_tstring s = q.toString();
|
|
207
|
+
|
|
208
|
+
serialize_string(ar, "queryString", s);
|
|
209
|
+
int v = q.getReject();
|
|
210
|
+
ar& make_nvp("reject", v);
|
|
211
|
+
v = q.getLimit();
|
|
212
|
+
ar& make_nvp("limit", v);
|
|
213
|
+
v = q.getOptimize();
|
|
214
|
+
ar& make_nvp("optimize", v);
|
|
215
|
+
v = q.isBookmarkAlso();
|
|
216
|
+
ar& make_nvp("boolmarkAlso", v);
|
|
217
|
+
v = q.isAll();
|
|
218
|
+
ar& make_nvp("isAll", v);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
template <class Archive>
|
|
222
|
+
void load(Archive& ar, queryBase& q, const unsigned int /*version*/)
|
|
223
|
+
{
|
|
224
|
+
std::_tstring s;
|
|
225
|
+
int v;
|
|
226
|
+
|
|
227
|
+
q.reset();
|
|
228
|
+
serialize_string(ar, "queryString", s);
|
|
229
|
+
q.queryString(s.c_str());
|
|
230
|
+
|
|
231
|
+
ar& make_nvp("reject", v);
|
|
232
|
+
q.reject(v);
|
|
233
|
+
|
|
234
|
+
ar& make_nvp("limit", v);
|
|
235
|
+
q.limit(v);
|
|
236
|
+
|
|
237
|
+
ar& make_nvp("optimize", v);
|
|
238
|
+
q.optimize((queryBase::eOptimize)v);
|
|
239
|
+
|
|
240
|
+
ar& make_nvp("boolmarkAlso", v);
|
|
241
|
+
q.bookmarkAlso(v != 0);
|
|
242
|
+
|
|
243
|
+
ar& make_nvp("isAll", v);
|
|
244
|
+
if (v)
|
|
245
|
+
q.all();
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
template <class Archive>
|
|
249
|
+
void serialize(Archive& ar, fieldNames& q, const unsigned int /*version*/)
|
|
250
|
+
{
|
|
251
|
+
int count = q.count();
|
|
252
|
+
ar& boost::serialization::make_nvp("count", count);
|
|
253
|
+
std::_tstring s;
|
|
254
|
+
for (int i = 0; i < count; i++)
|
|
255
|
+
{
|
|
256
|
+
if (Archive::is_loading::value)
|
|
257
|
+
{
|
|
258
|
+
serialize_string(ar, "value", s);
|
|
259
|
+
q.addValue(s.c_str());
|
|
260
|
+
}
|
|
261
|
+
else
|
|
262
|
+
{
|
|
263
|
+
s = q.getValue(i);
|
|
264
|
+
serialize_string(ar, "value", s);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
template <class Archive>
|
|
270
|
+
void serialize(Archive& ar, query& q, const unsigned int /*version*/)
|
|
271
|
+
{
|
|
272
|
+
ar& make_nvp("readQuery", boost::serialization::base_object<queryBase>(q));
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
template <class Archive>
|
|
276
|
+
void serialize(Archive& ar, recordsetQuery& q, const unsigned int /*version*/)
|
|
277
|
+
{
|
|
278
|
+
queryBase* qq = q.internalQuery();
|
|
279
|
+
ar& make_nvp("recordsetQuery", *qq);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
template <class Archive>
|
|
283
|
+
void serialize(Archive& ar, groupFuncBase& q, const unsigned int ver)
|
|
284
|
+
{
|
|
285
|
+
ar& boost::serialization::make_nvp(
|
|
286
|
+
"query", boost::serialization::base_object<recordsetQuery>(q));
|
|
287
|
+
|
|
288
|
+
fieldNames& fns = q.targetNames();
|
|
289
|
+
if (ver >= 1)
|
|
290
|
+
ar& make_nvp("targetNames", fns);
|
|
291
|
+
|
|
292
|
+
std::_tstring s;
|
|
293
|
+
|
|
294
|
+
if (Archive::is_loading::value)
|
|
295
|
+
{
|
|
296
|
+
// For compatibility
|
|
297
|
+
if (ver < 1)
|
|
298
|
+
{
|
|
299
|
+
serialize_string(ar, "targetName", s);
|
|
300
|
+
q.targetNames().addValue(s.c_str());
|
|
301
|
+
}
|
|
302
|
+
serialize_string(ar, "resultName", s);
|
|
303
|
+
q.setResultName(s.c_str());
|
|
304
|
+
}
|
|
305
|
+
else
|
|
306
|
+
{
|
|
307
|
+
if (q.resultName())
|
|
308
|
+
s = q.resultName();
|
|
309
|
+
else
|
|
310
|
+
s = _T("");
|
|
311
|
+
serialize_string(ar, "resultName", s);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
template <class Archive>
|
|
316
|
+
void serialize(Archive& ar, sum& q, const unsigned int /*version*/)
|
|
317
|
+
{
|
|
318
|
+
ar& make_nvp("param", boost::serialization::base_object<groupFuncBase>(q));
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
template <class Archive>
|
|
322
|
+
void serialize(Archive& ar, count& q, const unsigned int /*version*/)
|
|
323
|
+
{
|
|
324
|
+
ar& make_nvp("param", boost::serialization::base_object<groupFuncBase>(q));
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
template <class Archive>
|
|
328
|
+
void serialize(Archive& ar, avg& q, const unsigned int /*version*/)
|
|
329
|
+
{
|
|
330
|
+
ar& make_nvp("param", boost::serialization::base_object<groupFuncBase>(q));
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
template <class Archive>
|
|
334
|
+
void serialize(Archive& ar, min& q, const unsigned int /*version*/)
|
|
335
|
+
{
|
|
336
|
+
ar& make_nvp("param", boost::serialization::base_object<groupFuncBase>(q));
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
template <class Archive>
|
|
340
|
+
void serialize(Archive& ar, max& q, const unsigned int /*version*/)
|
|
341
|
+
{
|
|
342
|
+
ar& make_nvp("param", boost::serialization::base_object<groupFuncBase>(q));
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
template <class Archive>
|
|
346
|
+
void serialize(Archive& ar, groupQuery& q, const unsigned int /*version*/)
|
|
347
|
+
{
|
|
348
|
+
fieldNames& v = const_cast<fieldNames&>(q.getKeyFields());
|
|
349
|
+
ar& make_nvp("keyFields", v);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
struct aliasPair
|
|
353
|
+
{
|
|
354
|
+
std::_tstring first;
|
|
355
|
+
std::_tstring second;
|
|
356
|
+
aliasPair() {}
|
|
357
|
+
aliasPair(const _TCHAR* f, const _TCHAR* s) : first(f), second(s) {}
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
typedef aliasPair alias_type;
|
|
361
|
+
|
|
362
|
+
template <class Archive>
|
|
363
|
+
void serialize(Archive& ar, alias_type& q, const unsigned int /*version*/)
|
|
364
|
+
{
|
|
365
|
+
std::_tstring s = q.first;
|
|
366
|
+
std::_tstring s2 = q.second;
|
|
367
|
+
serialize_string(ar, "first", s);
|
|
368
|
+
serialize_string(ar, "second", s2);
|
|
369
|
+
if (Archive::is_loading::value)
|
|
370
|
+
{
|
|
371
|
+
q.first = s;
|
|
372
|
+
q.second = s2;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
//---------------------------------------------------------------------------
|
|
377
|
+
// class executable
|
|
378
|
+
//---------------------------------------------------------------------------
|
|
379
|
+
void executable::release()
|
|
380
|
+
{
|
|
381
|
+
delete this;
|
|
382
|
+
};
|
|
383
|
+
|
|
384
|
+
//---------------------------------------------------------------------------
|
|
385
|
+
// class groupByStatement
|
|
386
|
+
//---------------------------------------------------------------------------
|
|
387
|
+
class prepairedValues
|
|
388
|
+
{
|
|
389
|
+
const std::vector<std::_tstring>* m_values;
|
|
390
|
+
mutable int m_index;
|
|
391
|
+
|
|
392
|
+
public:
|
|
393
|
+
inline void setValues(const std::vector<std::_tstring>* values)
|
|
394
|
+
{
|
|
395
|
+
m_values = values;
|
|
396
|
+
m_index = 0;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
const _TCHAR* replace(const _TCHAR* v) const
|
|
400
|
+
{
|
|
401
|
+
if (_tcscmp(v, _T("?")) == 0)
|
|
402
|
+
{
|
|
403
|
+
if (m_index >= (int)m_values->size())
|
|
404
|
+
THROW_BZS_ERROR_WITH_MSG(_T("Too few values for prepair."));
|
|
405
|
+
return (*m_values)[m_index++].c_str();
|
|
406
|
+
}
|
|
407
|
+
return v;
|
|
408
|
+
}
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
//---------------------------------------------------------------------------
|
|
412
|
+
// class groupByStatement
|
|
413
|
+
//---------------------------------------------------------------------------
|
|
414
|
+
groupByStatement* groupByStatement::create()
|
|
415
|
+
{
|
|
416
|
+
return new groupByStatement();
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
groupByStatement::groupByStatement()
|
|
420
|
+
: fieldNames(), m_statements(new std::vector<groupFuncBase*>())
|
|
421
|
+
{
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
groupByStatement::~groupByStatement()
|
|
425
|
+
{
|
|
426
|
+
reset();
|
|
427
|
+
delete m_statements;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
groupFuncBase& groupByStatement::addFunction(eFunc v,
|
|
431
|
+
const fieldNames& targetNames,
|
|
432
|
+
const _TCHAR* resultName)
|
|
433
|
+
{
|
|
434
|
+
groupFuncBase* func;
|
|
435
|
+
switch (v)
|
|
436
|
+
{
|
|
437
|
+
case fsum:
|
|
438
|
+
func = new client::sum(targetNames, resultName);
|
|
439
|
+
break;
|
|
440
|
+
case fcount:
|
|
441
|
+
func = new client::count(resultName);
|
|
442
|
+
break;
|
|
443
|
+
case favg:
|
|
444
|
+
func = new client::avg(targetNames, resultName);
|
|
445
|
+
break;
|
|
446
|
+
case fmin:
|
|
447
|
+
func = new client::min(targetNames, resultName);
|
|
448
|
+
break;
|
|
449
|
+
case fmax:
|
|
450
|
+
func = new client::max(targetNames, resultName);
|
|
451
|
+
break;
|
|
452
|
+
};
|
|
453
|
+
m_statements->push_back(func);
|
|
454
|
+
return *func;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
groupFuncBase& groupByStatement::function(int index)
|
|
458
|
+
{
|
|
459
|
+
assert(index >= 0 && index < (int)m_statements->size());
|
|
460
|
+
return *((*m_statements)[index]);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
groupByStatement& groupByStatement::reset()
|
|
464
|
+
{
|
|
465
|
+
for (int i = 0; i < (int)m_statements->size(); ++i)
|
|
466
|
+
delete ((*m_statements)[i]);
|
|
467
|
+
m_statements->clear();
|
|
468
|
+
fieldNames::reset();
|
|
469
|
+
return *this;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
int groupByStatement::size() const
|
|
473
|
+
{
|
|
474
|
+
return (int)m_statements->size();
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
void groupByStatement::execute(recordset& rs)
|
|
478
|
+
{
|
|
479
|
+
const _TCHAR* keys[8] = { NULL };
|
|
480
|
+
for (int i = 0; i < count(); ++i)
|
|
481
|
+
keys[i] = getValue(i);
|
|
482
|
+
groupQuery q;
|
|
483
|
+
q.keyField(keys[0], keys[1], keys[2], keys[3], keys[4], keys[5], keys[6],
|
|
484
|
+
keys[7]);
|
|
485
|
+
std::vector<boost::shared_ptr<groupFuncBase> > statements;
|
|
486
|
+
for (int i = 0; i < (int)m_statements->size(); ++i)
|
|
487
|
+
{
|
|
488
|
+
boost::shared_ptr<groupFuncBase> p((*m_statements)[i]->clone());
|
|
489
|
+
statements.push_back(p);
|
|
490
|
+
query* pq = p->internalQuery();
|
|
491
|
+
replaceQueryParams(NULL, *pq, m_parent);
|
|
492
|
+
q.addFunction(p.get());
|
|
493
|
+
}
|
|
494
|
+
rs.groupBy(q);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
//---------------------------------------------------------------------------
|
|
498
|
+
// class matchByStatement
|
|
499
|
+
//---------------------------------------------------------------------------
|
|
500
|
+
matchByStatement* matchByStatement::create()
|
|
501
|
+
{
|
|
502
|
+
return new matchByStatement();
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
void matchByStatement::execute(recordset& rs)
|
|
506
|
+
{
|
|
507
|
+
client::query q;
|
|
508
|
+
client::query* ret = replaceQueryParams(internalQuery(), q, m_parent);
|
|
509
|
+
if (ret != internalQuery())
|
|
510
|
+
{
|
|
511
|
+
recordsetQuery rq;
|
|
512
|
+
*rq.internalQuery() = *ret;
|
|
513
|
+
rs.matchBy(rq);
|
|
514
|
+
}
|
|
515
|
+
else
|
|
516
|
+
rs.matchBy(*this);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
//---------------------------------------------------------------------------
|
|
520
|
+
// class orderByStatement
|
|
521
|
+
//---------------------------------------------------------------------------
|
|
522
|
+
orderByStatement* orderByStatement::create()
|
|
523
|
+
{
|
|
524
|
+
return new orderByStatement();
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
orderByStatement::orderByStatement() : m_sortFields(new sortFields())
|
|
528
|
+
{
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
orderByStatement::~orderByStatement()
|
|
532
|
+
{
|
|
533
|
+
delete m_sortFields;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
void orderByStatement::execute(recordset& rs)
|
|
537
|
+
{
|
|
538
|
+
rs.orderBy(*m_sortFields);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
void orderByStatement::add(const _TCHAR* name, bool asc)
|
|
542
|
+
{
|
|
543
|
+
m_sortFields->add(name, asc);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
int orderByStatement::size() const
|
|
547
|
+
{
|
|
548
|
+
return (int)m_sortFields->size();
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
const sortField& orderByStatement::get(int index) const
|
|
552
|
+
{
|
|
553
|
+
return (*m_sortFields)[index];
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
orderByStatement& orderByStatement::reset()
|
|
557
|
+
{
|
|
558
|
+
m_sortFields->clear();
|
|
559
|
+
return *this;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
//---------------------------------------------------------------------------
|
|
563
|
+
// class reverseOrderStatement
|
|
564
|
+
//---------------------------------------------------------------------------
|
|
565
|
+
reverseOrderStatement* reverseOrderStatement::create()
|
|
566
|
+
{
|
|
567
|
+
return new reverseOrderStatement();
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
void reverseOrderStatement::execute(recordset& rs)
|
|
571
|
+
{
|
|
572
|
+
rs.reverse();
|
|
573
|
+
};
|
|
574
|
+
|
|
575
|
+
//---------------------------------------------------------------------------
|
|
576
|
+
// struct queryStatementsImple
|
|
577
|
+
//---------------------------------------------------------------------------
|
|
578
|
+
struct queryStatementsImple
|
|
579
|
+
{
|
|
580
|
+
idatabaseManager* dbm;
|
|
581
|
+
database* db;
|
|
582
|
+
int id;
|
|
583
|
+
std::_tstring title;
|
|
584
|
+
std::_tstring description;
|
|
585
|
+
std::vector<executable*> statements;
|
|
586
|
+
prepairedValues pv;
|
|
587
|
+
|
|
588
|
+
inline queryStatementsImple() : dbm(NULL), db(NULL){};
|
|
589
|
+
|
|
590
|
+
~queryStatementsImple() { reset(); }
|
|
591
|
+
|
|
592
|
+
void reset()
|
|
593
|
+
{
|
|
594
|
+
for (int i = 0; i < (int)statements.size(); ++i)
|
|
595
|
+
statements[i]->release();
|
|
596
|
+
statements.clear();
|
|
597
|
+
title = _T("");
|
|
598
|
+
description = _T("");
|
|
599
|
+
id = 0;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
inline void execute(recordset& rs, executeListner* listner)
|
|
603
|
+
{
|
|
604
|
+
for (size_t i = 0; i < statements.size(); ++i)
|
|
605
|
+
{
|
|
606
|
+
statements[i]->execute(rs);
|
|
607
|
+
if (listner)
|
|
608
|
+
listner->onExecuted(statements[i], rs);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
private:
|
|
613
|
+
friend class boost::serialization::access;
|
|
614
|
+
template <class Archive>
|
|
615
|
+
void serialize(Archive& ar, const unsigned int version);
|
|
616
|
+
};
|
|
617
|
+
|
|
618
|
+
//---------------------------------------------------------------------------
|
|
619
|
+
// struct queryStatementImple
|
|
620
|
+
//---------------------------------------------------------------------------
|
|
621
|
+
struct queryStatementImple
|
|
622
|
+
{
|
|
623
|
+
struct queryStatementsImple* parent;
|
|
624
|
+
std::_tstring database;
|
|
625
|
+
std::_tstring table;
|
|
626
|
+
int option;
|
|
627
|
+
fieldNames* keyFields;
|
|
628
|
+
client::query* query;
|
|
629
|
+
readStatement::eReadType readType;
|
|
630
|
+
short index;
|
|
631
|
+
// int dbIndex;
|
|
632
|
+
|
|
633
|
+
std::vector<alias_type> aliases;
|
|
634
|
+
|
|
635
|
+
queryStatementImple(){};
|
|
636
|
+
|
|
637
|
+
void alias(const _TCHAR* src, const _TCHAR* dst)
|
|
638
|
+
{
|
|
639
|
+
aliases.push_back(alias_type(src, dst));
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
inline void use(idatabaseManager* dbm, const connectParams* p)
|
|
643
|
+
{
|
|
644
|
+
/*dbIndex = dbm->findDbIndex(p);
|
|
645
|
+
if (dbIndex==-1)
|
|
646
|
+
return false;*/
|
|
647
|
+
dbm->use(p);
|
|
648
|
+
// return dbm->db()->isOpened();
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
inline void use(client::database* db, const connectParams* p)
|
|
652
|
+
{
|
|
653
|
+
if (db && db->isOpened())
|
|
654
|
+
return;
|
|
655
|
+
if (p)
|
|
656
|
+
connectOpen(db, *p, false);
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
template <class Database> inline void execute(recordset& rs, Database db)
|
|
660
|
+
{
|
|
661
|
+
|
|
662
|
+
const _TCHAR* keys[8] = { NULL };
|
|
663
|
+
for (int i = 0; i < keyFields->count(); ++i)
|
|
664
|
+
keys[i] = parent->pv.replace(keyFields->getValue(i));
|
|
665
|
+
|
|
666
|
+
client::query q;
|
|
667
|
+
client::query* tq = replaceQueryParams(query, q, parent);
|
|
668
|
+
|
|
669
|
+
if (database != _T(""))
|
|
670
|
+
{
|
|
671
|
+
connectParams p(database.c_str());
|
|
672
|
+
use(db, &p);
|
|
673
|
+
}
|
|
674
|
+
else
|
|
675
|
+
use(db, NULL);
|
|
676
|
+
|
|
677
|
+
/*if (!isOpened(db, p)) //Change current db in dbm
|
|
678
|
+
connect(db, p, false); //Change current db in dbm
|
|
679
|
+
*/
|
|
680
|
+
|
|
681
|
+
activeTable at(db, table.c_str());
|
|
682
|
+
at.index(index).option(option);
|
|
683
|
+
for (int i = 0; i < (int)aliases.size(); ++i)
|
|
684
|
+
at.alias(aliases[i].first.c_str(), aliases[i].second.c_str());
|
|
685
|
+
if (readType == readStatement::opRead)
|
|
686
|
+
{
|
|
687
|
+
at.keyValue(keys[0], keys[1], keys[2], keys[3], keys[4], keys[5],
|
|
688
|
+
keys[6], keys[7]);
|
|
689
|
+
at.read(rs, *tq);
|
|
690
|
+
}
|
|
691
|
+
else if (readType == readStatement::opJoin)
|
|
692
|
+
at.join(rs, *tq, keys[0], keys[1], keys[2], keys[3], keys[4],
|
|
693
|
+
keys[5], keys[6], keys[7]);
|
|
694
|
+
else if (readType == readStatement::opOuterJoin)
|
|
695
|
+
at.outerJoin(rs, *tq, keys[0], keys[1], keys[2], keys[3], keys[4],
|
|
696
|
+
keys[5], keys[6], keys[7]);
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
private:
|
|
700
|
+
friend class boost::serialization::access;
|
|
701
|
+
template <class Archive>
|
|
702
|
+
void serialize(Archive& ar, const unsigned int version)
|
|
703
|
+
{
|
|
704
|
+
ar& make_nvp("readType", readType);
|
|
705
|
+
serialize_string(ar, "database", database);
|
|
706
|
+
serialize_string(ar, "table", table);
|
|
707
|
+
ar& make_nvp("index", index);
|
|
708
|
+
int count = (int)aliases.size();
|
|
709
|
+
ar& boost::serialization::make_nvp("alias_count", count);
|
|
710
|
+
alias_type a;
|
|
711
|
+
for (int i = 0; i < count; i++)
|
|
712
|
+
{
|
|
713
|
+
if (!Archive::is_loading::value)
|
|
714
|
+
a = aliases[i];
|
|
715
|
+
ar& make_nvp("alias", a);
|
|
716
|
+
if (Archive::is_loading::value)
|
|
717
|
+
aliases.push_back(a);
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
};
|
|
721
|
+
|
|
722
|
+
// template <class Archive>
|
|
723
|
+
// void serialize(Archive& ar, readStatement& q, const unsigned int version);
|
|
724
|
+
|
|
725
|
+
template <class Archive>
|
|
726
|
+
void queryStatementsImple::serialize(Archive& ar, const unsigned int version)
|
|
727
|
+
{
|
|
728
|
+
ar& make_nvp("id", id);
|
|
729
|
+
serialize_string(ar, "title", title);
|
|
730
|
+
serialize_string(ar, "description", description);
|
|
731
|
+
ar& make_nvp("items", statements);
|
|
732
|
+
if (Archive::is_loading::value)
|
|
733
|
+
{
|
|
734
|
+
for (int i = 0; i < (int)statements.size(); ++i)
|
|
735
|
+
{
|
|
736
|
+
readStatement* p = dynamic_cast<readStatement*>(statements[i]);
|
|
737
|
+
if (p)
|
|
738
|
+
p->m_impl->parent = this;
|
|
739
|
+
else
|
|
740
|
+
{
|
|
741
|
+
matchByStatement* pm =
|
|
742
|
+
dynamic_cast<matchByStatement*>(statements[i]);
|
|
743
|
+
if (pm)
|
|
744
|
+
pm->m_parent = this;
|
|
745
|
+
else
|
|
746
|
+
{
|
|
747
|
+
groupByStatement* pg =
|
|
748
|
+
dynamic_cast<groupByStatement*>(statements[i]);
|
|
749
|
+
if (pg)
|
|
750
|
+
pg->m_parent = this;
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
//---------------------------------------------------------------------------
|
|
758
|
+
// class readStatement
|
|
759
|
+
//---------------------------------------------------------------------------
|
|
760
|
+
readStatement* readStatement::create()
|
|
761
|
+
{
|
|
762
|
+
return new readStatement();
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
readStatement::readStatement() : m_impl(new queryStatementImple)
|
|
766
|
+
{
|
|
767
|
+
m_impl->keyFields = this;
|
|
768
|
+
m_impl->query = this;
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
readStatement::~readStatement()
|
|
772
|
+
{
|
|
773
|
+
delete m_impl;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
const _TCHAR* readStatement::getDatabaseUri() const
|
|
777
|
+
{
|
|
778
|
+
return m_impl->database.c_str();
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
readStatement& readStatement::databaseUri(const _TCHAR* v)
|
|
782
|
+
{
|
|
783
|
+
m_impl->database = v;
|
|
784
|
+
return *this;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
const _TCHAR* readStatement::getTableName() const
|
|
788
|
+
{
|
|
789
|
+
return m_impl->table.c_str();
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
readStatement& readStatement::tableName(const _TCHAR* v)
|
|
793
|
+
{
|
|
794
|
+
m_impl->table = v;
|
|
795
|
+
return *this;
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
int readStatement::getIndex() const
|
|
799
|
+
{
|
|
800
|
+
return m_impl->index;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
readStatement& readStatement::index(int v)
|
|
804
|
+
{
|
|
805
|
+
m_impl->index = v;
|
|
806
|
+
return *this;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
int readStatement::getOption() const
|
|
810
|
+
{
|
|
811
|
+
return m_impl->option;
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
readStatement& readStatement::option(int v)
|
|
815
|
+
{
|
|
816
|
+
m_impl->option = v;
|
|
817
|
+
return *this;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
readStatement::eReadType readStatement::getReadType() const
|
|
821
|
+
{
|
|
822
|
+
return m_impl->readType;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
readStatement& readStatement::readType(readStatement::eReadType v)
|
|
826
|
+
{
|
|
827
|
+
m_impl->readType = v;
|
|
828
|
+
return *this;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
queryStatementImple* readStatement::internalPtr() const
|
|
832
|
+
{
|
|
833
|
+
return m_impl;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
readStatement& readStatement::alias(const _TCHAR* src, const _TCHAR* dst)
|
|
837
|
+
{
|
|
838
|
+
m_impl->alias(src, dst);
|
|
839
|
+
return *this;
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
readStatement& readStatement::reset()
|
|
843
|
+
{
|
|
844
|
+
query::reset();
|
|
845
|
+
fieldNames::reset();
|
|
846
|
+
m_impl->aliases.clear();
|
|
847
|
+
return *this;
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
int readStatement::aliasCount() const
|
|
851
|
+
{
|
|
852
|
+
return (int)m_impl->aliases.size();
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
const _TCHAR* readStatement::getAliasFirst(int index) const
|
|
856
|
+
{
|
|
857
|
+
return m_impl->aliases[index].first.c_str();
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
const _TCHAR* readStatement::getAliasSecond(int index) const
|
|
861
|
+
{
|
|
862
|
+
return m_impl->aliases[index].second.c_str();
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
void readStatement::execute(recordset& rs)
|
|
866
|
+
{
|
|
867
|
+
if (m_impl->parent->dbm)
|
|
868
|
+
m_impl->execute(rs, m_impl->parent->dbm);
|
|
869
|
+
else if (m_impl->parent->db)
|
|
870
|
+
m_impl->execute(rs, m_impl->parent->db);
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
//---------------------------------------------------------------------------
|
|
874
|
+
// class queryExecuter
|
|
875
|
+
//---------------------------------------------------------------------------
|
|
876
|
+
queryStatements* queryStatements::create(idatabaseManager& dbm)
|
|
877
|
+
{
|
|
878
|
+
return new queryStatements(dbm);
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
queryStatements* queryStatements::create(database* db)
|
|
882
|
+
{
|
|
883
|
+
return new queryStatements(db);
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
void queryStatements::release()
|
|
887
|
+
{
|
|
888
|
+
delete this;
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
queryStatements::queryStatements(idatabaseManager& dbm)
|
|
892
|
+
: m_impl(new queryStatementsImple)
|
|
893
|
+
{
|
|
894
|
+
m_impl->dbm = &dbm;
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
queryStatements::queryStatements(database* db)
|
|
898
|
+
: m_impl(new queryStatementsImple)
|
|
899
|
+
{
|
|
900
|
+
m_impl->db = db;
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
queryStatements::~queryStatements()
|
|
904
|
+
{
|
|
905
|
+
delete m_impl;
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
int queryStatements::getId() const
|
|
909
|
+
{
|
|
910
|
+
return m_impl->id;
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
queryStatements& queryStatements::id(int v)
|
|
914
|
+
{
|
|
915
|
+
m_impl->id = v;
|
|
916
|
+
return *this;
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
const _TCHAR* queryStatements::getTitle() const
|
|
920
|
+
{
|
|
921
|
+
return m_impl->title.c_str();
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
queryStatements& queryStatements::title(const _TCHAR* v)
|
|
925
|
+
{
|
|
926
|
+
m_impl->title = v;
|
|
927
|
+
return *this;
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
const _TCHAR* queryStatements::getDescription() const
|
|
931
|
+
{
|
|
932
|
+
return m_impl->description.c_str();
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
queryStatements& queryStatements::description(const _TCHAR* v)
|
|
936
|
+
{
|
|
937
|
+
m_impl->description = v;
|
|
938
|
+
return *this;
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
readStatement* queryStatements::addRead(readStatement::eReadType type)
|
|
942
|
+
{
|
|
943
|
+
readStatement* p = readStatement::create();
|
|
944
|
+
p->readType(type);
|
|
945
|
+
p->m_impl->parent = this->m_impl;
|
|
946
|
+
m_impl->statements.push_back(p);
|
|
947
|
+
return p;
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
readHasMany* queryStatements::addHasManyRead()
|
|
951
|
+
{
|
|
952
|
+
readHasMany* p = readHasMany::create();
|
|
953
|
+
m_impl->statements.push_back(p);
|
|
954
|
+
return p;
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
groupByStatement* queryStatements::addGroupBy()
|
|
958
|
+
{
|
|
959
|
+
groupByStatement* p = groupByStatement::create();
|
|
960
|
+
p->m_parent = this->m_impl;
|
|
961
|
+
m_impl->statements.push_back(p);
|
|
962
|
+
return p;
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
orderByStatement* queryStatements::addOrderBy()
|
|
966
|
+
{
|
|
967
|
+
orderByStatement* p = orderByStatement::create();
|
|
968
|
+
m_impl->statements.push_back(p);
|
|
969
|
+
return p;
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
matchByStatement* queryStatements::addMatchBy()
|
|
973
|
+
{
|
|
974
|
+
matchByStatement* p = matchByStatement::create();
|
|
975
|
+
p->m_parent = this->m_impl;
|
|
976
|
+
m_impl->statements.push_back(p);
|
|
977
|
+
return p;
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
reverseOrderStatement* queryStatements::addReverseOrder()
|
|
981
|
+
{
|
|
982
|
+
reverseOrderStatement* p = reverseOrderStatement::create();
|
|
983
|
+
m_impl->statements.push_back(p);
|
|
984
|
+
return p;
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
executable* queryStatements::get(int index)
|
|
988
|
+
{
|
|
989
|
+
return m_impl->statements[index];
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
void queryStatements::pop_back()
|
|
993
|
+
{
|
|
994
|
+
m_impl->statements.pop_back();
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
int queryStatements::size() const
|
|
998
|
+
{
|
|
999
|
+
return (int)m_impl->statements.size();
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
queryStatementsImple* queryStatements::internalPtr() const
|
|
1003
|
+
{
|
|
1004
|
+
return m_impl;
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
void queryStatements::save(const _TCHAR* filename)
|
|
1008
|
+
{
|
|
1009
|
+
#ifdef _UNICODE
|
|
1010
|
+
char p[MAX_PATH];
|
|
1011
|
+
WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, filename, -1, p, MAX_PATH,
|
|
1012
|
+
NULL, NULL);
|
|
1013
|
+
#else
|
|
1014
|
+
const char* p = filename;
|
|
1015
|
+
|
|
1016
|
+
#endif
|
|
1017
|
+
std::ofstream file(p);
|
|
1018
|
+
xml_oarchive oa(file);
|
|
1019
|
+
queryStatementsImple& queryStatements = *m_impl;
|
|
1020
|
+
oa << BOOST_SERIALIZATION_NVP(queryStatements);
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
void queryStatements::load(const _TCHAR* filename)
|
|
1024
|
+
{
|
|
1025
|
+
|
|
1026
|
+
#ifdef _UNICODE
|
|
1027
|
+
char p[MAX_PATH];
|
|
1028
|
+
WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, filename, -1, p, MAX_PATH,
|
|
1029
|
+
NULL, NULL);
|
|
1030
|
+
|
|
1031
|
+
#else
|
|
1032
|
+
const char* p = filename;
|
|
1033
|
+
|
|
1034
|
+
#endif
|
|
1035
|
+
m_impl->reset();
|
|
1036
|
+
std::ifstream file(p);
|
|
1037
|
+
xml_iarchive ia(file);
|
|
1038
|
+
queryStatementsImple& queryStatements = *m_impl;
|
|
1039
|
+
ia >> BOOST_SERIALIZATION_NVP(queryStatements);
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
void queryStatements::save(std::stringstream& sf)
|
|
1043
|
+
{
|
|
1044
|
+
xml_oarchive oa(sf);
|
|
1045
|
+
queryStatementsImple& queryStatements = *m_impl;
|
|
1046
|
+
oa << BOOST_SERIALIZATION_NVP(queryStatements);
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
void queryStatements::load(std::stringstream& sf)
|
|
1050
|
+
{
|
|
1051
|
+
m_impl->reset();
|
|
1052
|
+
xml_iarchive ia(sf);
|
|
1053
|
+
queryStatementsImple& queryStatements = *m_impl;
|
|
1054
|
+
ia >> BOOST_SERIALIZATION_NVP(queryStatements);
|
|
1055
|
+
}
|
|
1056
|
+
|
|
1057
|
+
void queryStatements::execute(recordset& rs,
|
|
1058
|
+
const std::vector<std::_tstring>* values,
|
|
1059
|
+
executeListner* listner)
|
|
1060
|
+
{
|
|
1061
|
+
m_impl->pv.setValues(values);
|
|
1062
|
+
m_impl->execute(rs, listner);
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
void queryStatements::clear()
|
|
1066
|
+
{
|
|
1067
|
+
m_impl->reset();
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
int queryStatements::statementType(int index)
|
|
1071
|
+
{
|
|
1072
|
+
if (dynamic_cast<readHasMany*>(m_impl->statements[index]))
|
|
1073
|
+
return 2;
|
|
1074
|
+
if (dynamic_cast<readStatement*>(m_impl->statements[index]))
|
|
1075
|
+
return 1;
|
|
1076
|
+
if (dynamic_cast<groupByStatement*>(m_impl->statements[index]))
|
|
1077
|
+
return 3;
|
|
1078
|
+
if (dynamic_cast<orderByStatement*>(m_impl->statements[index]))
|
|
1079
|
+
return 4;
|
|
1080
|
+
if (dynamic_cast<matchByStatement*>(m_impl->statements[index]))
|
|
1081
|
+
return 5;
|
|
1082
|
+
if (dynamic_cast<reverseOrderStatement*>(m_impl->statements[index]))
|
|
1083
|
+
return 6;
|
|
1084
|
+
|
|
1085
|
+
return 0;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
readStatement* queryStatements::getReadStatement(executable* e)
|
|
1089
|
+
{
|
|
1090
|
+
return dynamic_cast<readStatement*>(e);
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
readHasMany* queryStatements::getReadHasMany(executable* e)
|
|
1094
|
+
{
|
|
1095
|
+
return dynamic_cast<readHasMany*>(e);
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
groupByStatement* queryStatements::getGroupByStatement(executable* e)
|
|
1099
|
+
{
|
|
1100
|
+
return dynamic_cast<groupByStatement*>(e);
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
orderByStatement* queryStatements::getOrderByStatement(executable* e)
|
|
1104
|
+
{
|
|
1105
|
+
return dynamic_cast<orderByStatement*>(e);
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
matchByStatement* queryStatements::getMatchByStatement(executable* e)
|
|
1109
|
+
{
|
|
1110
|
+
return dynamic_cast<matchByStatement*>(e);
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
reverseOrderStatement* queryStatements::getReverseOrderStatement(executable* e)
|
|
1114
|
+
{
|
|
1115
|
+
return dynamic_cast<reverseOrderStatement*>(e);
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
const readStatement*
|
|
1119
|
+
queryStatements::getReadStatement(const executable* e) const
|
|
1120
|
+
{
|
|
1121
|
+
return dynamic_cast<const readStatement*>(e);
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
const readHasMany* queryStatements::getReadHasMany(const executable* e) const
|
|
1125
|
+
{
|
|
1126
|
+
return dynamic_cast<const readHasMany*>(e);
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
const groupByStatement*
|
|
1130
|
+
queryStatements::getGroupByStatement(const executable* e) const
|
|
1131
|
+
{
|
|
1132
|
+
return dynamic_cast<const groupByStatement*>(e);
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
const orderByStatement*
|
|
1136
|
+
queryStatements::getOrderByStatement(const executable* e) const
|
|
1137
|
+
{
|
|
1138
|
+
return dynamic_cast<const orderByStatement*>(e);
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
const matchByStatement*
|
|
1142
|
+
queryStatements::getMatchByStatement(const executable* e) const
|
|
1143
|
+
{
|
|
1144
|
+
return dynamic_cast<const matchByStatement*>(e);
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
const reverseOrderStatement*
|
|
1148
|
+
queryStatements::getReverseOrderStatement(const executable* e) const
|
|
1149
|
+
{
|
|
1150
|
+
return dynamic_cast<const reverseOrderStatement*>(e);
|
|
1151
|
+
}
|
|
1152
|
+
|
|
1153
|
+
//---------------------------------------------------------------------------
|
|
1154
|
+
// struct readHasManyImple
|
|
1155
|
+
//---------------------------------------------------------------------------
|
|
1156
|
+
|
|
1157
|
+
struct readHasManyImple
|
|
1158
|
+
{
|
|
1159
|
+
fieldNames columns;
|
|
1160
|
+
recordsets rss;
|
|
1161
|
+
|
|
1162
|
+
void reset()
|
|
1163
|
+
{
|
|
1164
|
+
rss.clear();
|
|
1165
|
+
columns.reset();
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
template <class Archive>
|
|
1169
|
+
void serialize(Archive& ar, const unsigned int version)
|
|
1170
|
+
{
|
|
1171
|
+
ar& make_nvp("columns", columns);
|
|
1172
|
+
}
|
|
1173
|
+
};
|
|
1174
|
+
|
|
1175
|
+
//---------------------------------------------------------------------------
|
|
1176
|
+
// class readHasMany
|
|
1177
|
+
//---------------------------------------------------------------------------
|
|
1178
|
+
|
|
1179
|
+
readHasMany::readHasMany()
|
|
1180
|
+
: readStatement(), m_readHasManyImpl(new readHasManyImple)
|
|
1181
|
+
{
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
readHasMany::~readHasMany()
|
|
1185
|
+
{
|
|
1186
|
+
delete m_readHasManyImpl;
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
readHasManyImple* readHasMany::internalPtr() const
|
|
1190
|
+
{
|
|
1191
|
+
return m_readHasManyImpl;
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
recordsets& readHasMany::recordsets()
|
|
1195
|
+
{
|
|
1196
|
+
return m_readHasManyImpl->rss;
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
void readHasMany::addkeyValueColumn(const _TCHAR* name)
|
|
1200
|
+
{
|
|
1201
|
+
m_readHasManyImpl->columns.addValue(name);
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
const _TCHAR* readHasMany::getkeyValueColumn(int index) const
|
|
1205
|
+
{
|
|
1206
|
+
return m_readHasManyImpl->columns.getValue(index);
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
int readHasMany::keyValueColumns() const
|
|
1210
|
+
{
|
|
1211
|
+
return m_readHasManyImpl->columns.count();
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
readHasMany& readHasMany::reset()
|
|
1215
|
+
{
|
|
1216
|
+
readStatement::reset();
|
|
1217
|
+
m_readHasManyImpl->reset();
|
|
1218
|
+
return *this;
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
void readHasMany::execute(recordset& rs)
|
|
1222
|
+
{
|
|
1223
|
+
m_readHasManyImpl->rss.clear();
|
|
1224
|
+
|
|
1225
|
+
std::vector<int> indexes;
|
|
1226
|
+
const fielddefs* fds = rs.fieldDefs();
|
|
1227
|
+
for (int i = 0; i < m_readHasManyImpl->columns.count(); ++i)
|
|
1228
|
+
indexes.push_back(fds->indexByName(getkeyValueColumn(i)));
|
|
1229
|
+
|
|
1230
|
+
for (int i = 0; i < (int)rs.size(); ++i)
|
|
1231
|
+
{
|
|
1232
|
+
fieldNames::reset();
|
|
1233
|
+
// setkey values
|
|
1234
|
+
for (int j = 0; j < (int)indexes.size(); ++j)
|
|
1235
|
+
{
|
|
1236
|
+
const _TCHAR* p = rs[i][indexes[j]].c_str();
|
|
1237
|
+
addValue(p);
|
|
1238
|
+
if (j == 0)
|
|
1239
|
+
addLogic(getkeyValueColumn(j), _T("="), p);
|
|
1240
|
+
else
|
|
1241
|
+
addLogic(_T("and"), getkeyValueColumn(j), _T("="), p);
|
|
1242
|
+
}
|
|
1243
|
+
recordset* tmp = new recordset();
|
|
1244
|
+
boost::shared_ptr<recordset> r(tmp,
|
|
1245
|
+
boost::bind(&recordset::release, tmp));
|
|
1246
|
+
m_readHasManyImpl->rss.push_back(r);
|
|
1247
|
+
readStatement::execute(*r);
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
client::query* replaceQueryParams(client::query* tq, client::query& tmpq,
|
|
1252
|
+
queryStatementsImple* parent)
|
|
1253
|
+
{
|
|
1254
|
+
|
|
1255
|
+
int n = 0;
|
|
1256
|
+
if (tq)
|
|
1257
|
+
n = tq->whereTokens();
|
|
1258
|
+
else
|
|
1259
|
+
n = tmpq.whereTokens();
|
|
1260
|
+
if (n)
|
|
1261
|
+
{
|
|
1262
|
+
if (tq)
|
|
1263
|
+
tmpq = *tq;
|
|
1264
|
+
for (int i = 0; i < n; ++i)
|
|
1265
|
+
{
|
|
1266
|
+
if (_tcscmp(tmpq.getWhereToken(i), _T("?")) == 0)
|
|
1267
|
+
tmpq.setWhereToken(i,
|
|
1268
|
+
parent->pv.replace(tmpq.getWhereToken(i)));
|
|
1269
|
+
}
|
|
1270
|
+
return &tmpq;
|
|
1271
|
+
}
|
|
1272
|
+
return tq;
|
|
1273
|
+
}
|
|
1274
|
+
|
|
1275
|
+
readHasMany* readHasMany::create()
|
|
1276
|
+
{
|
|
1277
|
+
return new readHasMany();
|
|
1278
|
+
}
|
|
1279
|
+
|
|
1280
|
+
} // namespace client
|
|
1281
|
+
} // namespace tdap
|
|
1282
|
+
} // namespace protocol
|
|
1283
|
+
} // namespace db
|
|
1284
|
+
} // namespace bzs
|
|
1285
|
+
|
|
1286
|
+
#ifdef BCB_32
|
|
1287
|
+
#pragma option pop
|
|
1288
|
+
#endif
|