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,371 @@
|
|
|
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 "queryData.h"
|
|
22
|
+
#include <bzs/db/protocol/tdap/mysql/characterset.h>
|
|
23
|
+
#include <iostream>
|
|
24
|
+
|
|
25
|
+
#pragma package(smart_init)
|
|
26
|
+
|
|
27
|
+
using namespace bzs::db::protocol::tdap::client;
|
|
28
|
+
using namespace bzs::db::protocol::tdap;
|
|
29
|
+
|
|
30
|
+
#ifndef USE_PSQL_DATABASE
|
|
31
|
+
|
|
32
|
+
#define USER_STRING_TYPE ft_myvarchar
|
|
33
|
+
#define GROUP_STRING_TYPE ft_myvarbinary
|
|
34
|
+
|
|
35
|
+
#else
|
|
36
|
+
|
|
37
|
+
#define USER_STRING_TYPE ft_zstring
|
|
38
|
+
#define GROUP_STRING_TYPE ft_zstring
|
|
39
|
+
|
|
40
|
+
#endif
|
|
41
|
+
|
|
42
|
+
const _TCHAR* name_field_str(_TCHAR* buf)
|
|
43
|
+
{
|
|
44
|
+
#ifdef LINUX
|
|
45
|
+
return "名前";
|
|
46
|
+
#else
|
|
47
|
+
#ifdef _UNICODE
|
|
48
|
+
return L"名前";
|
|
49
|
+
#else
|
|
50
|
+
WideCharToMultiByte(CP_UTF8, 0, L"名前", -1, buf, 30, NULL, NULL);
|
|
51
|
+
return buf;
|
|
52
|
+
#endif
|
|
53
|
+
#endif
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
bool showDbdefError(dbdef* def, const _TCHAR* msg)
|
|
57
|
+
{
|
|
58
|
+
std::tcout << msg << _T(" erorr:No.") << def->stat();
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
bool showTableError(table* tb, const _TCHAR* msg)
|
|
63
|
+
{
|
|
64
|
+
std::tcout << msg << _T(" erorr:No.") << tb->stat();
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
bool showDbError(database* db, const _TCHAR* msg)
|
|
69
|
+
{
|
|
70
|
+
std::tcout << msg << _T(" erorr:No.") << db->stat();
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
bool createUserTable(dbdef* def)
|
|
75
|
+
{
|
|
76
|
+
short tableid = 1;
|
|
77
|
+
tabledef t;
|
|
78
|
+
tabledef* td = &t;
|
|
79
|
+
td->charsetIndex = mysql::charsetIndex(GetACP());
|
|
80
|
+
td->schemaCodePage = CP_UTF8;
|
|
81
|
+
td->id = tableid;
|
|
82
|
+
td->setTableName(_T("user"));
|
|
83
|
+
td->setFileName(_T("user.dat"));
|
|
84
|
+
|
|
85
|
+
def->insertTable(td);
|
|
86
|
+
if (def->stat() != 0)
|
|
87
|
+
return showDbdefError(def, _T("user insertTable"));
|
|
88
|
+
|
|
89
|
+
short filedIndex = 0;
|
|
90
|
+
fielddef* fd = def->insertField(tableid, filedIndex);
|
|
91
|
+
fd->setName(_T("id"));
|
|
92
|
+
fd->type = ft_autoinc;
|
|
93
|
+
fd->len = 4;
|
|
94
|
+
|
|
95
|
+
++filedIndex;
|
|
96
|
+
fd = def->insertField(tableid, filedIndex);
|
|
97
|
+
|
|
98
|
+
_TCHAR tmp[30];
|
|
99
|
+
fd->setName(name_field_str(tmp));
|
|
100
|
+
fd->type = USER_STRING_TYPE;
|
|
101
|
+
fd->setLenByCharnum(20);
|
|
102
|
+
|
|
103
|
+
++filedIndex;
|
|
104
|
+
fd = def->insertField(tableid, filedIndex);
|
|
105
|
+
fd->setName(_T("group"));
|
|
106
|
+
fd->type = ft_integer;
|
|
107
|
+
fd->len = 4;
|
|
108
|
+
|
|
109
|
+
++filedIndex;
|
|
110
|
+
fd = def->insertField(tableid, filedIndex);
|
|
111
|
+
fd->setName(_T("tel"));
|
|
112
|
+
fd->type = USER_STRING_TYPE;
|
|
113
|
+
fd->setLenByCharnum(21);
|
|
114
|
+
|
|
115
|
+
char keyNum = 0;
|
|
116
|
+
keydef* kd = def->insertKey(tableid, keyNum);
|
|
117
|
+
keySegment* seg1 = &kd->segments[0];
|
|
118
|
+
seg1->fieldNum = 0;
|
|
119
|
+
seg1->flags.bit8 = true; // extended key type
|
|
120
|
+
seg1->flags.bit1 = true; // chanageable
|
|
121
|
+
kd->segmentCount = 1;
|
|
122
|
+
td = def->tableDefs(tableid);
|
|
123
|
+
td->primaryKeyNum = keyNum;
|
|
124
|
+
|
|
125
|
+
++keyNum;
|
|
126
|
+
kd = def->insertKey(tableid, keyNum);
|
|
127
|
+
seg1 = &kd->segments[0];
|
|
128
|
+
seg1->fieldNum = 2;
|
|
129
|
+
seg1->flags.bit0 = true;
|
|
130
|
+
seg1->flags.bit8 = true;
|
|
131
|
+
seg1->flags.bit1 = true;
|
|
132
|
+
kd->segmentCount = 1;
|
|
133
|
+
|
|
134
|
+
def->updateTableDef(tableid);
|
|
135
|
+
if (def->stat() != 0)
|
|
136
|
+
return showDbdefError(def, _T("user updateTableDef"));
|
|
137
|
+
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
bool createGroupTable(dbdef* def)
|
|
142
|
+
{
|
|
143
|
+
short tableid = 2;
|
|
144
|
+
tabledef t;
|
|
145
|
+
tabledef* td = &t;
|
|
146
|
+
td->charsetIndex = mysql::charsetIndex(GetACP());
|
|
147
|
+
td->schemaCodePage = CP_UTF8;
|
|
148
|
+
td->id = tableid;
|
|
149
|
+
td->setTableName(_T("groups"));
|
|
150
|
+
td->setFileName(_T("groups"));
|
|
151
|
+
|
|
152
|
+
def->insertTable(td);
|
|
153
|
+
if (def->stat() != 0)
|
|
154
|
+
return showDbdefError(def, _T("groups insertTable"));
|
|
155
|
+
|
|
156
|
+
short filedIndex = 0;
|
|
157
|
+
fielddef* fd = def->insertField(tableid, filedIndex);
|
|
158
|
+
fd->setName(_T("code"));
|
|
159
|
+
fd->type = ft_integer;
|
|
160
|
+
fd->len = 4;
|
|
161
|
+
|
|
162
|
+
++filedIndex;
|
|
163
|
+
fd = def->insertField(tableid, filedIndex);
|
|
164
|
+
fd->setName(_T("name"));
|
|
165
|
+
fd->type = GROUP_STRING_TYPE;
|
|
166
|
+
fd->len = 33;
|
|
167
|
+
|
|
168
|
+
char keyNum = 0;
|
|
169
|
+
keydef* kd = def->insertKey(tableid, keyNum);
|
|
170
|
+
keySegment* seg1 = &kd->segments[0];
|
|
171
|
+
seg1->fieldNum = 0;
|
|
172
|
+
seg1->flags.bit8 = true; // extended key type
|
|
173
|
+
seg1->flags.bit1 = true; // chanageable
|
|
174
|
+
kd->segmentCount = 1;
|
|
175
|
+
|
|
176
|
+
td = def->tableDefs(tableid);
|
|
177
|
+
td->primaryKeyNum = keyNum;
|
|
178
|
+
def->updateTableDef(tableid);
|
|
179
|
+
if (def->stat() != 0)
|
|
180
|
+
return showDbdefError(def, _T("groups updateTableDef"));
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
bool createUserExtTable(dbdef* def)
|
|
185
|
+
{
|
|
186
|
+
short tableid = 3;
|
|
187
|
+
tabledef t;
|
|
188
|
+
tabledef* td = &t;
|
|
189
|
+
td->charsetIndex = mysql::charsetIndex(GetACP());
|
|
190
|
+
td->schemaCodePage = CP_UTF8;
|
|
191
|
+
td->id = tableid;
|
|
192
|
+
td->setTableName(_T("extention"));
|
|
193
|
+
td->setFileName(_T("extention"));
|
|
194
|
+
|
|
195
|
+
def->insertTable(td);
|
|
196
|
+
if (def->stat() != 0)
|
|
197
|
+
return showDbdefError(def, _T("extention insertTable"));
|
|
198
|
+
|
|
199
|
+
short filedIndex = 0;
|
|
200
|
+
fielddef* fd = def->insertField(tableid, filedIndex);
|
|
201
|
+
fd->setName(_T("id"));
|
|
202
|
+
fd->type = ft_integer;
|
|
203
|
+
fd->len = 4;
|
|
204
|
+
|
|
205
|
+
++filedIndex;
|
|
206
|
+
fd = def->insertField(tableid, filedIndex);
|
|
207
|
+
fd->setName(_T("comment"));
|
|
208
|
+
fd->type = USER_STRING_TYPE;
|
|
209
|
+
|
|
210
|
+
fd->setLenByCharnum(60);
|
|
211
|
+
|
|
212
|
+
char keyNum = 0;
|
|
213
|
+
keydef* kd = def->insertKey(tableid, keyNum);
|
|
214
|
+
keySegment* seg1 = &kd->segments[0];
|
|
215
|
+
seg1->fieldNum = 0;
|
|
216
|
+
seg1->flags.bit8 = true; // extended key type
|
|
217
|
+
seg1->flags.bit1 = true; // chanageable
|
|
218
|
+
kd->segmentCount = 1;
|
|
219
|
+
td = def->tableDefs(tableid);
|
|
220
|
+
td->primaryKeyNum = keyNum;
|
|
221
|
+
def->updateTableDef(tableid);
|
|
222
|
+
if (def->stat() != 0)
|
|
223
|
+
return showDbdefError(def, _T("extention updateTableDef"));
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
bool createCacheTable(dbdef* def)
|
|
228
|
+
{
|
|
229
|
+
short tableid = 4;
|
|
230
|
+
tabledef t;
|
|
231
|
+
tabledef* td = &t;
|
|
232
|
+
td->charsetIndex = mysql::charsetIndex(GetACP());
|
|
233
|
+
td->schemaCodePage = CP_UTF8;
|
|
234
|
+
td->id = tableid;
|
|
235
|
+
td->setTableName(_T("cache"));
|
|
236
|
+
td->setFileName(_T("cache"));
|
|
237
|
+
|
|
238
|
+
def->insertTable(td);
|
|
239
|
+
if (def->stat() != 0)
|
|
240
|
+
return showDbdefError(def, _T("cache insertTable"));
|
|
241
|
+
|
|
242
|
+
short filedIndex = 0;
|
|
243
|
+
fielddef* fd = def->insertField(tableid, filedIndex);
|
|
244
|
+
fd->setName(_T("id"));
|
|
245
|
+
fd->type = ft_autoinc;
|
|
246
|
+
fd->len = 4;
|
|
247
|
+
|
|
248
|
+
++filedIndex;
|
|
249
|
+
fd = def->insertField(tableid, filedIndex);
|
|
250
|
+
fd->setName(_T("value"));
|
|
251
|
+
fd->type = GROUP_STRING_TYPE;
|
|
252
|
+
|
|
253
|
+
fd->len = 60000;
|
|
254
|
+
|
|
255
|
+
char keyNum = 0;
|
|
256
|
+
keydef* kd = def->insertKey(tableid, keyNum);
|
|
257
|
+
keySegment* seg1 = &kd->segments[0];
|
|
258
|
+
seg1->fieldNum = 0;
|
|
259
|
+
seg1->flags.bit8 = true; // extended key type
|
|
260
|
+
seg1->flags.bit1 = true; // chanageable
|
|
261
|
+
kd->segmentCount = 1;
|
|
262
|
+
td = def->tableDefs(tableid);
|
|
263
|
+
td->primaryKeyNum = keyNum;
|
|
264
|
+
def->updateTableDef(tableid);
|
|
265
|
+
if (def->stat() != 0)
|
|
266
|
+
return showDbdefError(def, _T("cache updateTableDef"));
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
bool insertData(database_ptr db, int maxId)
|
|
271
|
+
{
|
|
272
|
+
_TCHAR tmp[256];
|
|
273
|
+
table* tbu = db->openTable(_T("user"), TD_OPEN_NORMAL);
|
|
274
|
+
if (db->stat())
|
|
275
|
+
{
|
|
276
|
+
showDbError(db.get(), _T("openTable user"));
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
table* tbg = db->openTable(_T("groups"), TD_OPEN_NORMAL);
|
|
281
|
+
if (db->stat())
|
|
282
|
+
{
|
|
283
|
+
showDbError(db.get(), _T("openTable groups"));
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
table* tbe = db->openTable(_T("extention"), TD_OPEN_NORMAL);
|
|
288
|
+
if (db->stat())
|
|
289
|
+
{
|
|
290
|
+
showDbError(db.get(), _T("openTable extention"));
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
dbTransaction trn(db);
|
|
295
|
+
trn.begin();
|
|
296
|
+
|
|
297
|
+
tbu->clearBuffer();
|
|
298
|
+
for (int i = 1; i <= maxId; ++i)
|
|
299
|
+
{
|
|
300
|
+
tbu->setFV((short)0, i);
|
|
301
|
+
_stprintf_s(tmp, 256, _T("%d user"), i);
|
|
302
|
+
tbu->setFV(1, tmp);
|
|
303
|
+
tbu->setFV(_T("group"), ((i - 1) % 5) + 1);
|
|
304
|
+
tbu->insert();
|
|
305
|
+
if (tbu->stat() != 0)
|
|
306
|
+
return showTableError(tbu, _T("user insert"));
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
tbg->clearBuffer();
|
|
310
|
+
for (int i = 1; i <= 100; ++i)
|
|
311
|
+
{
|
|
312
|
+
tbg->setFV((short)0, i);
|
|
313
|
+
_stprintf_s(tmp, 256, _T("%d group"), i);
|
|
314
|
+
tbg->setFV(1, tmp);
|
|
315
|
+
tbg->insert();
|
|
316
|
+
if (tbg->stat() != 0)
|
|
317
|
+
return showTableError(tbg, _T("groups insert"));
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
tbe->clearBuffer();
|
|
321
|
+
for (int i = 1; i <= maxId; ++i)
|
|
322
|
+
{
|
|
323
|
+
tbe->setFV((short)0, i);
|
|
324
|
+
_stprintf_s(tmp, 256, _T("%d comment"), i);
|
|
325
|
+
tbe->setFV(1, tmp);
|
|
326
|
+
tbe->insert();
|
|
327
|
+
if (tbe->stat() != 0)
|
|
328
|
+
return showTableError(tbe, _T("extention insert"));
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
trn.end();
|
|
332
|
+
tbg->release();
|
|
333
|
+
tbu->release();
|
|
334
|
+
tbe->release();
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
int prebuiltData(database_ptr db, const connectParams& param, bool foceCreate,
|
|
339
|
+
int maxId)
|
|
340
|
+
{
|
|
341
|
+
try
|
|
342
|
+
{
|
|
343
|
+
if (db->open(param.uri(), TD_OPEN_NORMAL))
|
|
344
|
+
{
|
|
345
|
+
if (foceCreate)
|
|
346
|
+
dropDatabase(db);
|
|
347
|
+
else
|
|
348
|
+
return 0;
|
|
349
|
+
}
|
|
350
|
+
std::tcout << _T("\nInserting query test data. Please wait ... ")
|
|
351
|
+
<< std::flush;
|
|
352
|
+
createDatabase(db, param);
|
|
353
|
+
openDatabase(db, param);
|
|
354
|
+
if (!createUserTable(db->dbDef()))
|
|
355
|
+
return 1;
|
|
356
|
+
if (!createGroupTable(db->dbDef()))
|
|
357
|
+
return 1;
|
|
358
|
+
if (!createUserExtTable(db->dbDef()))
|
|
359
|
+
return 1;
|
|
360
|
+
|
|
361
|
+
if (!insertData(db, maxId))
|
|
362
|
+
return 1;
|
|
363
|
+
std::tcout << _T("done!") << std::endl;
|
|
364
|
+
return 0;
|
|
365
|
+
}
|
|
366
|
+
catch (bzs::rtl::exception& e)
|
|
367
|
+
{
|
|
368
|
+
std::tcout << *bzs::rtl::getMsg(e) << std::endl;
|
|
369
|
+
return 1;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//---------------------------------------------------------------------------
|
|
2
|
+
|
|
3
|
+
#ifndef BZS_EXSAMPLE_QUERYDATA_H
|
|
4
|
+
#define BZS_EXSAMPLE_QUERYDATA_H
|
|
5
|
+
//---------------------------------------------------------------------------
|
|
6
|
+
#include <bzs/db/protocol/tdap/client/trdboostapi.h>
|
|
7
|
+
|
|
8
|
+
int prebuiltData(bzs::db::protocol::tdap::client::database_ptr db,
|
|
9
|
+
const bzs::db::protocol::tdap::client::connectParams& param,
|
|
10
|
+
bool foceCreate = false, int maxId = 20000);
|
|
11
|
+
|
|
12
|
+
bool createCacheTable(bzs::db::protocol::tdap::client::dbdef* def);
|
|
13
|
+
|
|
14
|
+
const _TCHAR* name_field_str(_TCHAR* buf);
|
|
15
|
+
|
|
16
|
+
#endif // BZS_EXSAMPLE_QUERYDATA_H
|
|
@@ -0,0 +1,109 @@
|
|
|
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
|
+
#include <bzs/db/protocol/tdap/client/activeTable.h>
|
|
20
|
+
#include <bzs/example/queryData.h>
|
|
21
|
+
#include <iostream>
|
|
22
|
+
#include <locale.h>
|
|
23
|
+
|
|
24
|
+
using namespace bzs::db::protocol::tdap::client;
|
|
25
|
+
using namespace bzs::db::protocol::tdap;
|
|
26
|
+
|
|
27
|
+
static const char_td keynum_group = 1;
|
|
28
|
+
static const char_td primary_key = 0;
|
|
29
|
+
|
|
30
|
+
void showConsole(recordset& rowset)
|
|
31
|
+
{
|
|
32
|
+
const fielddefs& fields = *rowset.fieldDefs();
|
|
33
|
+
for (int j = 0; j < (int)fields.size(); ++j)
|
|
34
|
+
std::tcout << fields[j].name() << _T("\t");
|
|
35
|
+
std::tcout << _T("\n");
|
|
36
|
+
|
|
37
|
+
for (int i = 0; i < (int)rowset.size(); ++i)
|
|
38
|
+
{
|
|
39
|
+
row& m = rowset[i];
|
|
40
|
+
for (int j = 0; j < (int)m.size(); ++j)
|
|
41
|
+
{
|
|
42
|
+
std::tcout << m[(short)j].c_str() << _T("\t");
|
|
43
|
+
if (j == (int)m.size() - 1)
|
|
44
|
+
std::tcout << _T("\n");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
void execute(recordset& rs, activeTable& atu, activeTable& atg,
|
|
50
|
+
activeTable& ate)
|
|
51
|
+
{
|
|
52
|
+
query query;
|
|
53
|
+
|
|
54
|
+
rs.clear();
|
|
55
|
+
atu.alias(_T("名前"), _T("name"));
|
|
56
|
+
|
|
57
|
+
query.select(_T("id"), _T("name"), _T("group"))
|
|
58
|
+
.where(_T("id"), _T("<="), 15);
|
|
59
|
+
atu.index(0).keyValue(1).read(rs, query);
|
|
60
|
+
|
|
61
|
+
/* Join extention::comment
|
|
62
|
+
Use "joinHasOneOrHasMany" optimaize option.
|
|
63
|
+
Because this join is has one and atu.index(0) is unique key,
|
|
64
|
+
then join key values(id) are all unique.
|
|
65
|
+
*/
|
|
66
|
+
query.reset().select(_T("comment")).optimize(
|
|
67
|
+
queryBase::joinHasOneOrHasMany);
|
|
68
|
+
ate.index(0).join(rs, query, _T("id"));
|
|
69
|
+
|
|
70
|
+
// Join group::name
|
|
71
|
+
atg.alias(_T("name"), _T("group_name"));
|
|
72
|
+
query.reset().select(_T("group_name"));
|
|
73
|
+
atg.index(0).join(rs, query, _T("group"));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
#pragma warning(disable : 4101)
|
|
77
|
+
#pragma argsused
|
|
78
|
+
int _tmain(int argc, _TCHAR* argv[])
|
|
79
|
+
{
|
|
80
|
+
database_ptr db = createDatabaseObject();
|
|
81
|
+
try
|
|
82
|
+
{
|
|
83
|
+
connectParams param(_T("tdap"), _T("localhost"), _T("querytest"),
|
|
84
|
+
_T("test.bdf"));
|
|
85
|
+
param.setMode(TD_OPEN_NORMAL);
|
|
86
|
+
if (prebuiltData(db, param, false, 20))
|
|
87
|
+
{
|
|
88
|
+
std::tcout << "The query data build error." << std::endl;
|
|
89
|
+
return 1;
|
|
90
|
+
}
|
|
91
|
+
activeTable atu(db, _T("user"));
|
|
92
|
+
activeTable atg(db, _T("groups"));
|
|
93
|
+
activeTable ate(db, _T("extention"));
|
|
94
|
+
|
|
95
|
+
recordset rs;
|
|
96
|
+
execute(rs, atu, atg, ate);
|
|
97
|
+
showConsole(rs);
|
|
98
|
+
std::cout << "Execute query success. rs.size = " << rs.size()
|
|
99
|
+
<< std::endl;
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
catch (bzs::rtl::exception& e)
|
|
104
|
+
{
|
|
105
|
+
std::tcout << *bzs::rtl::getMsg(e) << std::endl;
|
|
106
|
+
}
|
|
107
|
+
return 1;
|
|
108
|
+
}
|
|
109
|
+
#pragma warning(default : 4101)
|
|
@@ -15,7 +15,7 @@ And O/R mapping to the user class.
|
|
|
15
15
|
This program use the filter operation on server side.
|
|
16
16
|
|
|
17
17
|
Please execute "create database" , "change schema" and "insert records" example
|
|
18
|
-
|
|
18
|
+
before execute this example.
|
|
19
19
|
|
|
20
20
|
*/
|
|
21
21
|
|
|
@@ -33,54 +33,53 @@ public:
|
|
|
33
33
|
std::_tstring name;
|
|
34
34
|
int group;
|
|
35
35
|
std::_tstring tel;
|
|
36
|
-
|
|
37
36
|
};
|
|
38
37
|
|
|
39
38
|
/** dump user to screen */
|
|
40
39
|
void dumpUser(const user* user)
|
|
41
40
|
{
|
|
42
|
-
_tprintf(_T(" id %d\n")
|
|
43
|
-
_tprintf(_T(" name %s\n")
|
|
44
|
-
_tprintf(_T(" group %d\n")
|
|
45
|
-
_tprintf(_T(" tel %s\n\n")
|
|
46
|
-
|
|
41
|
+
_tprintf(_T(" id %d\n"), user->id);
|
|
42
|
+
_tprintf(_T(" name %s\n"), user->name.c_str());
|
|
43
|
+
_tprintf(_T(" group %d\n"), user->group);
|
|
44
|
+
_tprintf(_T(" tel %s\n\n"), user->tel.c_str());
|
|
47
45
|
}
|
|
48
46
|
|
|
49
47
|
/** O/R mapping functional object*/
|
|
50
48
|
class userMappper
|
|
51
49
|
{
|
|
52
50
|
std::vector<user*>& m_users;
|
|
51
|
+
|
|
53
52
|
public:
|
|
54
|
-
userMappper(std::vector<user*>& users):m_users(users){}
|
|
53
|
+
userMappper(std::vector<user*>& users) : m_users(users) {}
|
|
55
54
|
void operator()(table* tb)
|
|
56
55
|
{
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
56
|
+
user* u = new user();
|
|
57
|
+
u->id = tb->getFVint(fieldnum_id);
|
|
58
|
+
u->name = tb->getFVstr(fieldnum_name);
|
|
59
|
+
u->group = tb->getFVint(fieldnum_group);
|
|
60
|
+
u->tel = tb->getFVstr(fieldnum_tel);
|
|
61
|
+
m_users.push_back(u);
|
|
63
62
|
}
|
|
64
63
|
};
|
|
65
64
|
|
|
66
65
|
/** show database operation error
|
|
67
66
|
*/
|
|
68
|
-
void showError(const _TCHAR* caption,const _TCHAR* tableName, short statusCode)
|
|
67
|
+
void showError(const _TCHAR* caption, const _TCHAR* tableName, short statusCode)
|
|
69
68
|
{
|
|
70
|
-
_TCHAR tmp[1024]={0x00};
|
|
69
|
+
_TCHAR tmp[1024] = { 0x00 };
|
|
71
70
|
nstable::tdapErr(0x00, statusCode, tableName, tmp);
|
|
72
|
-
_tprintf(_T("%s error No.%ld %s\n"),caption, statusCode, tmp);
|
|
71
|
+
_tprintf(_T("%s error No.%ld %s\n"), caption, statusCode, tmp);
|
|
73
72
|
}
|
|
74
73
|
|
|
75
74
|
bool readUsers(table* tb, std::vector<user*>& users)
|
|
76
75
|
{
|
|
77
76
|
userMappper ormap(users);
|
|
78
77
|
tb->clearBuffer();
|
|
79
|
-
tb->setKeyNum(keynum_group); //use group key
|
|
80
|
-
tb->setFV(fieldnum_group, 3)
|
|
78
|
+
tb->setKeyNum(keynum_group); // use group key
|
|
79
|
+
tb->setFV(fieldnum_group, 3); // set group = 3;
|
|
81
80
|
tb->seekGreater(true /*orEqual*/);
|
|
82
81
|
if (tb->stat() == 0)
|
|
83
|
-
tb->setFilter(_T("group = 3"), 1/*rejectCount*/, 0/*max records*/);
|
|
82
|
+
tb->setFilter(_T("group = 3"), 1 /*rejectCount*/, 0 /*max records*/);
|
|
84
83
|
while (1)
|
|
85
84
|
{
|
|
86
85
|
if (tb->stat() != 0)
|
|
@@ -122,17 +121,18 @@ int _tmain(int argc, _TCHAR* argv[])
|
|
|
122
121
|
showError(_T("open user table"), NULL, db->stat());
|
|
123
122
|
else
|
|
124
123
|
{
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
_tprintf(_T("Read records success.\nRecord count = %d\n"),
|
|
124
|
+
std::vector<user*> users;
|
|
125
|
+
if (readUsers(tbu, users))
|
|
126
|
+
{
|
|
127
|
+
_tprintf(_T("Read records success.\nRecord count = %d\n"),
|
|
128
|
+
users.size());
|
|
129
129
|
std::for_each(users.begin(), users.end(), dumpUser);
|
|
130
|
-
|
|
130
|
+
}
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
for (size_t i = 0; i < users.size(); ++i)
|
|
133
133
|
delete users[i];
|
|
134
134
|
|
|
135
|
-
|
|
135
|
+
tbu->release();
|
|
136
136
|
}
|
|
137
137
|
db->close();
|
|
138
138
|
}
|