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,1985 @@
|
|
|
1
|
+
/* =================================================================
|
|
2
|
+
Copyright (C) 2000-2013 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 "field.h"
|
|
20
|
+
#include "fields.h"
|
|
21
|
+
#include "nsDatabase.h"
|
|
22
|
+
#include <bzs/db/protocol/tdap/myDateTime.cpp>
|
|
23
|
+
#include <bzs/db/protocol/tdap/fieldComp.h>
|
|
24
|
+
#include "stringConverter.h"
|
|
25
|
+
#include <bzs/rtl/stringBuffers.h>
|
|
26
|
+
#include <boost/shared_array.hpp>
|
|
27
|
+
|
|
28
|
+
#ifdef BCB_32
|
|
29
|
+
#pragma option push
|
|
30
|
+
#pragma option -O1
|
|
31
|
+
#include <boost/unordered_map.hpp>
|
|
32
|
+
#pragma option pop
|
|
33
|
+
#else
|
|
34
|
+
#include <boost/unordered_map.hpp>
|
|
35
|
+
#endif
|
|
36
|
+
|
|
37
|
+
#pragma package(smart_init)
|
|
38
|
+
|
|
39
|
+
namespace bzs
|
|
40
|
+
{
|
|
41
|
+
namespace db
|
|
42
|
+
{
|
|
43
|
+
namespace protocol
|
|
44
|
+
{
|
|
45
|
+
namespace tdap
|
|
46
|
+
{
|
|
47
|
+
namespace client
|
|
48
|
+
{
|
|
49
|
+
|
|
50
|
+
//------------------------------------------------------------------------------
|
|
51
|
+
// class fieldShare
|
|
52
|
+
//------------------------------------------------------------------------------
|
|
53
|
+
struct Imple
|
|
54
|
+
{
|
|
55
|
+
stringConverter* cv;
|
|
56
|
+
bzs::rtl::stringBuffer strBufs;
|
|
57
|
+
std::vector<boost::shared_array<char> > blobs;
|
|
58
|
+
|
|
59
|
+
Imple() : strBufs(4096)
|
|
60
|
+
{
|
|
61
|
+
cv = new stringConverter(nsdatabase::execCodePage(),
|
|
62
|
+
nsdatabase::execCodePage());
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
~Imple() { delete cv; }
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
fieldShare::fieldShare()
|
|
69
|
+
: m_imple(new Imple()), myDateTimeValueByBtrv(true), trimPadChar(true),
|
|
70
|
+
usePadChar(true), logicalToString(false)
|
|
71
|
+
{
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
fieldShare::~fieldShare()
|
|
75
|
+
{
|
|
76
|
+
delete m_imple;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
stringConverter* fieldShare::cv()
|
|
80
|
+
{
|
|
81
|
+
return m_imple->cv;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
bzs::rtl::stringBuffer* fieldShare::strBufs()
|
|
85
|
+
{
|
|
86
|
+
return &m_imple->strBufs;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
void fieldShare::blobPushBack(char* p)
|
|
90
|
+
{
|
|
91
|
+
m_imple->blobs.push_back(boost::shared_array<char>(p));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
void fieldShare::blobClear()
|
|
95
|
+
{
|
|
96
|
+
m_imple->blobs.clear();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
//------------------------------------------------------------------------------
|
|
100
|
+
// class fielddefs
|
|
101
|
+
//------------------------------------------------------------------------------
|
|
102
|
+
|
|
103
|
+
struct infoImple
|
|
104
|
+
{
|
|
105
|
+
std::vector<fielddef> fields;
|
|
106
|
+
boost::unordered_map<std::_tstring, int> map;
|
|
107
|
+
const aliasMap_type* aliasMap;
|
|
108
|
+
|
|
109
|
+
infoImple() : aliasMap(NULL) {}
|
|
110
|
+
infoImple(const infoImple& r)
|
|
111
|
+
: fields(r.fields), map(r.map), aliasMap(r.aliasMap){};
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
fielddefs::fielddefs() : fieldShare(), m_imple(new infoImple)
|
|
115
|
+
{
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// A fieldShare is need no copy member(s)
|
|
119
|
+
fielddefs::fielddefs(const fielddefs& r)
|
|
120
|
+
: fieldShare(), m_imple(new infoImple(*r.m_imple))
|
|
121
|
+
{
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// A fieldShare is no copy member(s)
|
|
125
|
+
fielddefs& fielddefs::operator=(const fielddefs& r)
|
|
126
|
+
{
|
|
127
|
+
if (this != &r)
|
|
128
|
+
{
|
|
129
|
+
*m_imple = *r.m_imple;
|
|
130
|
+
}
|
|
131
|
+
return *this;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
void fielddefs::aliasing(fielddef* p) const
|
|
135
|
+
{
|
|
136
|
+
if (m_imple->aliasMap)
|
|
137
|
+
{
|
|
138
|
+
const _TCHAR* ret = m_imple->aliasMap->get(p->name());
|
|
139
|
+
if (ret[0])
|
|
140
|
+
p->setName(ret);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
fielddefs::~fielddefs()
|
|
145
|
+
{
|
|
146
|
+
delete m_imple;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
fielddefs* fielddefs::clone() const
|
|
150
|
+
{
|
|
151
|
+
fielddefs* p = new fielddefs(*this);
|
|
152
|
+
return p;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
void fielddefs::setAliases(const aliasMap_type* p)
|
|
156
|
+
{
|
|
157
|
+
m_imple->aliasMap = p;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
void fielddefs::addAllFileds(tabledef* def)
|
|
161
|
+
{
|
|
162
|
+
m_imple->fields.clear();
|
|
163
|
+
for (int i = 0; i < def->fieldCount; ++i)
|
|
164
|
+
push_back(&def->fieldDefs[i]);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
void fielddefs::push_back(const fielddef* p, bool rePosition)
|
|
168
|
+
{
|
|
169
|
+
m_imple->fields.push_back(*p);
|
|
170
|
+
int index = (int)m_imple->fields.size() - 1;
|
|
171
|
+
fielddef* pp = &m_imple->fields[index];
|
|
172
|
+
|
|
173
|
+
// convert field name of table charset to recordset schema charset.
|
|
174
|
+
_TCHAR tmp[FIELD_NAME_SIZE * 3];
|
|
175
|
+
pp->setName(p->name(tmp));
|
|
176
|
+
|
|
177
|
+
if (rePosition)
|
|
178
|
+
{
|
|
179
|
+
if (index == 0)
|
|
180
|
+
pp->pos = 0;
|
|
181
|
+
else
|
|
182
|
+
{
|
|
183
|
+
fielddef* bf = &m_imple->fields[index - 1];
|
|
184
|
+
pp->pos = bf->pos + bf->len;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// reset update indicator
|
|
188
|
+
pp->enableFlags.bitE = false;
|
|
189
|
+
aliasing(pp);
|
|
190
|
+
m_imple->map[pp->name()] = index;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
void fielddefs::remove(int index)
|
|
194
|
+
{
|
|
195
|
+
m_imple->map.erase(m_imple->fields[index].name());
|
|
196
|
+
m_imple->fields.erase(m_imple->fields.begin() + index);
|
|
197
|
+
boost::unordered_map<std::_tstring, int>::iterator it =
|
|
198
|
+
m_imple->map.begin();
|
|
199
|
+
while (it != m_imple->map.end())
|
|
200
|
+
{
|
|
201
|
+
if ((*it).second > index)
|
|
202
|
+
(*it).second--;
|
|
203
|
+
++it;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
void fielddefs::reserve(size_t size)
|
|
208
|
+
{
|
|
209
|
+
m_imple->fields.reserve(size);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
void fielddefs::clear()
|
|
213
|
+
{
|
|
214
|
+
m_imple->fields.clear();
|
|
215
|
+
m_imple->map.clear();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
void fielddefs::resetUpdateIndicator()
|
|
219
|
+
{
|
|
220
|
+
std::vector<fielddef>::iterator it = m_imple->fields.begin();
|
|
221
|
+
while (it != m_imple->fields.end())
|
|
222
|
+
{
|
|
223
|
+
(*it).enableFlags.bitE = false;
|
|
224
|
+
++it;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
bool fielddefs::checkIndex(int index) const
|
|
229
|
+
{
|
|
230
|
+
return (index >= 0 && index < (int)m_imple->fields.size());
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
int fielddefs::indexByName(const std::_tstring& name) const
|
|
234
|
+
{
|
|
235
|
+
if (m_imple->map.count(name) == 0)
|
|
236
|
+
return -1;
|
|
237
|
+
|
|
238
|
+
return m_imple->map.at(name);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const fielddef& fielddefs::operator[](int index) const
|
|
242
|
+
{
|
|
243
|
+
assert(checkIndex(index));
|
|
244
|
+
|
|
245
|
+
return m_imple->fields[index];
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const fielddef& fielddefs::operator[](const _TCHAR* name) const
|
|
249
|
+
{
|
|
250
|
+
return m_imple->fields[indexByName(std::_tstring(name))];
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const fielddef& fielddefs::operator[](const std::_tstring& name) const
|
|
254
|
+
{
|
|
255
|
+
return m_imple->fields[indexByName(name)];
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
size_t fielddefs::size() const
|
|
259
|
+
{
|
|
260
|
+
return m_imple->fields.size();
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
size_t fielddefs::totalFieldLen() const
|
|
264
|
+
{
|
|
265
|
+
const fielddef& fd = m_imple->fields[m_imple->fields.size() - 1];
|
|
266
|
+
return fd.pos + fd.len;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
void fielddefs::copyFrom(const table* tb)
|
|
270
|
+
{
|
|
271
|
+
int n = tb->getCurProcFieldCount();
|
|
272
|
+
m_imple->fields.reserve(n + size());
|
|
273
|
+
const tabledef* def = tb->tableDef();
|
|
274
|
+
int pos = 0;
|
|
275
|
+
for (int i = 0; i < n; ++i)
|
|
276
|
+
{
|
|
277
|
+
fielddef fd = def->fieldDefs[tb->getCurProcFieldIndex(i)];
|
|
278
|
+
fd.pos = pos;
|
|
279
|
+
push_back(&fd);
|
|
280
|
+
pos += fd.len;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Defalut field charset
|
|
284
|
+
cv()->setCodePage(mysql::codePage(def->charsetIndex));
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
bool fielddefs::canUnion(const fielddefs& src) const
|
|
288
|
+
{
|
|
289
|
+
if (size() != src.size())
|
|
290
|
+
return false;
|
|
291
|
+
for (int i = 0; i < (int)m_imple->fields.size(); ++i)
|
|
292
|
+
{
|
|
293
|
+
const fielddef& l = m_imple->fields[i];
|
|
294
|
+
const fielddef& r = src.m_imple->fields[i];
|
|
295
|
+
if (l.pos != r.pos)
|
|
296
|
+
return false;
|
|
297
|
+
if (l.len != r.len)
|
|
298
|
+
return false;
|
|
299
|
+
if (l.type != r.type)
|
|
300
|
+
return false;
|
|
301
|
+
if (l.charsetIndex() != r.charsetIndex())
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
fielddefs* fielddefs::create()
|
|
308
|
+
{
|
|
309
|
+
return new fielddefs();
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
void fielddefs::release()
|
|
313
|
+
{
|
|
314
|
+
delete this;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
//------------------------------------------------------------------------------
|
|
318
|
+
// class field
|
|
319
|
+
//------------------------------------------------------------------------------
|
|
320
|
+
static fielddef fdDummy;
|
|
321
|
+
|
|
322
|
+
DLLLIB const fielddef& dummyFd()
|
|
323
|
+
{
|
|
324
|
+
fdDummy.type = ft_integer;
|
|
325
|
+
fdDummy.pos = 0;
|
|
326
|
+
fdDummy.len = 2;
|
|
327
|
+
fdDummy.setName(_T("Invalid filed"));
|
|
328
|
+
return fdDummy;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// const field fieldDummy(NULL, initDummy(), NULL);
|
|
332
|
+
|
|
333
|
+
inline __int64 getValue64(const fielddef& fd, const uchar_td* ptr)
|
|
334
|
+
{
|
|
335
|
+
__int64 ret = 0;
|
|
336
|
+
if (ptr)
|
|
337
|
+
{
|
|
338
|
+
switch (fd.type)
|
|
339
|
+
{
|
|
340
|
+
case ft_integer:
|
|
341
|
+
case ft_autoinc:
|
|
342
|
+
switch (fd.len)
|
|
343
|
+
{
|
|
344
|
+
case 1:
|
|
345
|
+
ret = *((char*)(ptr + fd.pos));
|
|
346
|
+
break;
|
|
347
|
+
case 2:
|
|
348
|
+
ret = *((short*)(ptr + fd.pos));
|
|
349
|
+
break;
|
|
350
|
+
case 4:
|
|
351
|
+
ret = *((int*)(ptr + fd.pos));
|
|
352
|
+
break;
|
|
353
|
+
case 8:
|
|
354
|
+
ret = *((__int64*)(ptr + fd.pos));
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
case ft_autoIncUnsigned:
|
|
358
|
+
case ft_uinteger:
|
|
359
|
+
case ft_logical:
|
|
360
|
+
case ft_bit:
|
|
361
|
+
case ft_currency:
|
|
362
|
+
case ft_date:
|
|
363
|
+
case ft_time:
|
|
364
|
+
case ft_timestamp:
|
|
365
|
+
case ft_mydate:
|
|
366
|
+
case ft_mytime:
|
|
367
|
+
case ft_mydatetime:
|
|
368
|
+
case ft_mytimestamp:
|
|
369
|
+
switch (fd.len)
|
|
370
|
+
{
|
|
371
|
+
case 1:
|
|
372
|
+
ret = *((unsigned char*)(ptr + fd.pos));
|
|
373
|
+
break;
|
|
374
|
+
case 2:
|
|
375
|
+
ret = *((unsigned short*)(ptr + fd.pos));
|
|
376
|
+
break;
|
|
377
|
+
case 4:
|
|
378
|
+
ret = *((unsigned int*)(ptr + fd.pos));
|
|
379
|
+
break;
|
|
380
|
+
case 3:
|
|
381
|
+
case 5:
|
|
382
|
+
case 6:
|
|
383
|
+
case 7:
|
|
384
|
+
memcpy(&ret, ptr + fd.pos, fd.len);
|
|
385
|
+
break;
|
|
386
|
+
case 8:
|
|
387
|
+
ret = *((__int64*)(ptr + fd.pos));
|
|
388
|
+
break;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return ret;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
inline void setValue(const fielddef& fd, uchar_td* ptr, __int64 value)
|
|
396
|
+
{
|
|
397
|
+
if (!ptr)
|
|
398
|
+
return;
|
|
399
|
+
switch (fd.type)
|
|
400
|
+
{
|
|
401
|
+
case ft_integer:
|
|
402
|
+
case ft_autoinc:
|
|
403
|
+
{
|
|
404
|
+
switch (fd.len)
|
|
405
|
+
{
|
|
406
|
+
case 1:
|
|
407
|
+
*((char*)(ptr + fd.pos)) = (char)value;
|
|
408
|
+
break;
|
|
409
|
+
case 2:
|
|
410
|
+
*((short*)(ptr + fd.pos)) = (short)value;
|
|
411
|
+
break;
|
|
412
|
+
case 4:
|
|
413
|
+
*((int*)(ptr + fd.pos)) = (int)value;
|
|
414
|
+
break;
|
|
415
|
+
case 8:
|
|
416
|
+
*((__int64*)(ptr + fd.pos)) = value;
|
|
417
|
+
break;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
case ft_autoIncUnsigned:
|
|
421
|
+
case ft_uinteger:
|
|
422
|
+
case ft_logical:
|
|
423
|
+
case ft_bit:
|
|
424
|
+
case ft_currency:
|
|
425
|
+
case ft_date:
|
|
426
|
+
case ft_time:
|
|
427
|
+
case ft_timestamp:
|
|
428
|
+
case ft_mytime:
|
|
429
|
+
case ft_mydate:
|
|
430
|
+
case ft_mydatetime:
|
|
431
|
+
case ft_mytimestamp:
|
|
432
|
+
memcpy(ptr + fd.pos, &value, fd.len);
|
|
433
|
+
break;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
void* field::ptr() const
|
|
438
|
+
{
|
|
439
|
+
return m_ptr + m_fd->pos;
|
|
440
|
+
;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
void field::setFVA(const char* data)
|
|
444
|
+
{
|
|
445
|
+
if (!m_ptr)
|
|
446
|
+
return;
|
|
447
|
+
__int64 value;
|
|
448
|
+
double fltValue;
|
|
449
|
+
|
|
450
|
+
char* p = (char*)m_ptr + m_fd->pos;
|
|
451
|
+
if (data == NULL)
|
|
452
|
+
{
|
|
453
|
+
memset(p, 0, m_fd->len);
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
switch (m_fd->type)
|
|
458
|
+
{
|
|
459
|
+
case ft_string:
|
|
460
|
+
return store<stringStore, char, char>(p, data, *m_fd, m_fds->cv(),
|
|
461
|
+
m_fds->usePadChar);
|
|
462
|
+
case ft_note:
|
|
463
|
+
case ft_zstring:
|
|
464
|
+
return store<zstringStore, char, char>(p, data, *m_fd, m_fds->cv());
|
|
465
|
+
case ft_wzstring:
|
|
466
|
+
return store<wzstringStore, WCHAR, char>(p, data, *m_fd, m_fds->cv());
|
|
467
|
+
case ft_wstring:
|
|
468
|
+
return store<wstringStore, WCHAR, char>(p, data, *m_fd, m_fds->cv(),
|
|
469
|
+
m_fds->usePadChar);
|
|
470
|
+
case ft_mychar:
|
|
471
|
+
return store<myCharStore, char, char>(p, data, *m_fd, m_fds->cv());
|
|
472
|
+
case ft_myvarchar:
|
|
473
|
+
return store<myVarCharStore, char, char>(p, data, *m_fd, m_fds->cv());
|
|
474
|
+
case ft_lstring:
|
|
475
|
+
case ft_myvarbinary:
|
|
476
|
+
return store<myVarBinaryStore, char, char>(p, data, *m_fd, m_fds->cv());
|
|
477
|
+
case ft_mywchar:
|
|
478
|
+
return store<myWcharStore, WCHAR, char>(p, data, *m_fd, m_fds->cv());
|
|
479
|
+
case ft_mywvarchar:
|
|
480
|
+
return store<myWvarCharStore, WCHAR, char>(p, data, *m_fd, m_fds->cv());
|
|
481
|
+
case ft_mywvarbinary:
|
|
482
|
+
return store<myWvarBinaryStore, WCHAR, char>(p, data, *m_fd,
|
|
483
|
+
m_fds->cv());
|
|
484
|
+
case ft_myblob:
|
|
485
|
+
case ft_mytext:
|
|
486
|
+
{
|
|
487
|
+
char* tmp = blobStore<char>(p, data, *m_fd, m_fds->cv());
|
|
488
|
+
m_fds->blobPushBack(tmp);
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
case ft_decimal:
|
|
492
|
+
case ft_money:
|
|
493
|
+
case ft_numeric:
|
|
494
|
+
case ft_bfloat:
|
|
495
|
+
case ft_numericsts:
|
|
496
|
+
case ft_numericsa:
|
|
497
|
+
case ft_currency: // currecy
|
|
498
|
+
case ft_float: // float double
|
|
499
|
+
fltValue = atof(data);
|
|
500
|
+
setFV(fltValue);
|
|
501
|
+
return;
|
|
502
|
+
case ft_lvar: // Lvar
|
|
503
|
+
return;
|
|
504
|
+
|
|
505
|
+
case ft_date: // date mm/dd/yy
|
|
506
|
+
value = /*StrToBtrDate*/ atobtrd((const char*)data).i;
|
|
507
|
+
break;
|
|
508
|
+
case ft_time: // time hh:nn:ss
|
|
509
|
+
value = /*StrToBtrTime*/ atobtrt((const char*)data).i;
|
|
510
|
+
break;
|
|
511
|
+
case ft_autoIncUnsigned:
|
|
512
|
+
case ft_uinteger:
|
|
513
|
+
case ft_integer:
|
|
514
|
+
case ft_autoinc:
|
|
515
|
+
case ft_bit:
|
|
516
|
+
value = _atoi64(data);
|
|
517
|
+
break;
|
|
518
|
+
case ft_logical:
|
|
519
|
+
if (m_fds->logicalToString)
|
|
520
|
+
{
|
|
521
|
+
char tmp[5];
|
|
522
|
+
strncpy(tmp, data, 5);
|
|
523
|
+
if (strcmp(_strupr(tmp), "YES") == 0)
|
|
524
|
+
value = 1;
|
|
525
|
+
else
|
|
526
|
+
value = 0;
|
|
527
|
+
}
|
|
528
|
+
else
|
|
529
|
+
value = atol(data);
|
|
530
|
+
break;
|
|
531
|
+
case ft_timestamp:
|
|
532
|
+
case ft_mytimestamp:
|
|
533
|
+
value = 0;
|
|
534
|
+
break;
|
|
535
|
+
case ft_mydate:
|
|
536
|
+
{
|
|
537
|
+
myDate d;
|
|
538
|
+
d = data;
|
|
539
|
+
value = d.getValue();
|
|
540
|
+
break;
|
|
541
|
+
}
|
|
542
|
+
case ft_mytime:
|
|
543
|
+
{
|
|
544
|
+
myTime t(m_fd->len);
|
|
545
|
+
t = data;
|
|
546
|
+
value = t.getValue();
|
|
547
|
+
break;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
case ft_mydatetime:
|
|
551
|
+
{
|
|
552
|
+
myDateTime t(m_fd->len);
|
|
553
|
+
t = data;
|
|
554
|
+
value = t.getValue();
|
|
555
|
+
break;
|
|
556
|
+
}
|
|
557
|
+
default:
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
setValue(*m_fd, (uchar_td*)m_ptr, value);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
#ifdef _WIN32
|
|
564
|
+
|
|
565
|
+
void field::setFVW(const wchar_t* data)
|
|
566
|
+
{
|
|
567
|
+
if (!m_ptr)
|
|
568
|
+
return;
|
|
569
|
+
int value;
|
|
570
|
+
double fltValue;
|
|
571
|
+
|
|
572
|
+
char* p = (char*)m_ptr + m_fd->pos;
|
|
573
|
+
if (data == NULL)
|
|
574
|
+
{
|
|
575
|
+
memset(p, 0, m_fd->len);
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
switch (m_fd->type)
|
|
580
|
+
{
|
|
581
|
+
case ft_string:
|
|
582
|
+
return store<stringStore, char, WCHAR>(p, data, *m_fd, m_fds->cv(),
|
|
583
|
+
m_fds->usePadChar);
|
|
584
|
+
case ft_note:
|
|
585
|
+
case ft_zstring:
|
|
586
|
+
return store<zstringStore, char, WCHAR>(p, data, *m_fd, m_fds->cv());
|
|
587
|
+
case ft_wzstring:
|
|
588
|
+
return store<wzstringStore, WCHAR, WCHAR>(p, data, *m_fd, m_fds->cv());
|
|
589
|
+
case ft_wstring:
|
|
590
|
+
return store<wstringStore, WCHAR, WCHAR>(p, data, *m_fd, m_fds->cv(),
|
|
591
|
+
m_fds->usePadChar);
|
|
592
|
+
case ft_mychar:
|
|
593
|
+
return store<myCharStore, char, WCHAR>(p, data, *m_fd, m_fds->cv());
|
|
594
|
+
case ft_myvarchar:
|
|
595
|
+
return store<myVarCharStore, char, WCHAR>(p, data, *m_fd, m_fds->cv());
|
|
596
|
+
case ft_lstring:
|
|
597
|
+
case ft_myvarbinary:
|
|
598
|
+
return store<myVarBinaryStore, char, WCHAR>(p, data, *m_fd,
|
|
599
|
+
m_fds->cv());
|
|
600
|
+
case ft_mywchar:
|
|
601
|
+
return store<myWcharStore, WCHAR, WCHAR>(p, data, *m_fd, m_fds->cv());
|
|
602
|
+
case ft_mywvarchar:
|
|
603
|
+
return store<myWvarCharStore, WCHAR, WCHAR>(p, data, *m_fd,
|
|
604
|
+
m_fds->cv());
|
|
605
|
+
case ft_mywvarbinary:
|
|
606
|
+
return store<myWvarBinaryStore, WCHAR, WCHAR>(p, data, *m_fd,
|
|
607
|
+
m_fds->cv());
|
|
608
|
+
case ft_myblob:
|
|
609
|
+
case ft_mytext:
|
|
610
|
+
{
|
|
611
|
+
char* tmp = blobStore<WCHAR>(p, data, *m_fd, m_fds->cv());
|
|
612
|
+
m_fds->blobPushBack(tmp);
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
case ft_date: // date mm/dd/yy
|
|
617
|
+
value = /*StrToBtrDate*/ atobtrd(data).i;
|
|
618
|
+
setFV(value);
|
|
619
|
+
break;
|
|
620
|
+
case ft_time: // time hh:nn:ss
|
|
621
|
+
value = /*StrToBtrTime*/ atobtrt(data).i;
|
|
622
|
+
setFV(value);
|
|
623
|
+
return;
|
|
624
|
+
|
|
625
|
+
case ft_autoIncUnsigned:
|
|
626
|
+
case ft_uinteger:
|
|
627
|
+
case ft_integer:
|
|
628
|
+
case ft_autoinc:
|
|
629
|
+
case ft_bit:
|
|
630
|
+
{
|
|
631
|
+
__int64 v = _wtoi64(data);
|
|
632
|
+
setFV(v);
|
|
633
|
+
break;
|
|
634
|
+
}
|
|
635
|
+
case ft_logical:
|
|
636
|
+
if (m_fds->logicalToString)
|
|
637
|
+
{
|
|
638
|
+
wchar_t tmp[5];
|
|
639
|
+
wcsncpy(tmp, data, 5);
|
|
640
|
+
|
|
641
|
+
if (wcscmp(_wcsupr(tmp), L"YES") == 0)
|
|
642
|
+
value = 1;
|
|
643
|
+
else
|
|
644
|
+
value = 0;
|
|
645
|
+
}
|
|
646
|
+
else
|
|
647
|
+
value = _wtol(data);
|
|
648
|
+
setFV(value);
|
|
649
|
+
break;
|
|
650
|
+
|
|
651
|
+
case ft_decimal:
|
|
652
|
+
case ft_money:
|
|
653
|
+
case ft_numeric:
|
|
654
|
+
case ft_bfloat:
|
|
655
|
+
case ft_numericsts:
|
|
656
|
+
case ft_numericsa:
|
|
657
|
+
case ft_currency:
|
|
658
|
+
case ft_float:
|
|
659
|
+
fltValue = _wtof(data);
|
|
660
|
+
setFV(fltValue);
|
|
661
|
+
break;
|
|
662
|
+
case ft_timestamp:
|
|
663
|
+
{
|
|
664
|
+
__int64 v = 0;
|
|
665
|
+
setFV(v);
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
case ft_mydate:
|
|
669
|
+
{
|
|
670
|
+
myDate d;
|
|
671
|
+
d = data;
|
|
672
|
+
setValue(*m_fd, (uchar_td*)m_ptr, d.getValue());
|
|
673
|
+
return;
|
|
674
|
+
}
|
|
675
|
+
case ft_mytime:
|
|
676
|
+
{
|
|
677
|
+
myTime t(m_fd->len);
|
|
678
|
+
t = data;
|
|
679
|
+
setValue(*m_fd, (uchar_td*)m_ptr, t.getValue());
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
682
|
+
case ft_mydatetime:
|
|
683
|
+
{
|
|
684
|
+
myDateTime t(m_fd->len);
|
|
685
|
+
t = data;
|
|
686
|
+
setFV(t.getValue());
|
|
687
|
+
return;
|
|
688
|
+
}
|
|
689
|
+
case ft_mytimestamp:
|
|
690
|
+
case ft_lvar:
|
|
691
|
+
break;
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
#endif //_WIN32
|
|
696
|
+
|
|
697
|
+
void field::setFV(unsigned char data)
|
|
698
|
+
{
|
|
699
|
+
|
|
700
|
+
int value = (int)data;
|
|
701
|
+
setFV(value);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
void field::setFV(int data)
|
|
705
|
+
{
|
|
706
|
+
if (!m_ptr)
|
|
707
|
+
return;
|
|
708
|
+
char buf[20];
|
|
709
|
+
double d;
|
|
710
|
+
int v = data;
|
|
711
|
+
switch (m_fd->type)
|
|
712
|
+
{
|
|
713
|
+
case ft_mydate:
|
|
714
|
+
{
|
|
715
|
+
myDate myd;
|
|
716
|
+
myd.setValue(data, m_fds->myDateTimeValueByBtrv);
|
|
717
|
+
setValue(*m_fd, (uchar_td*)m_ptr, myd.getValue());
|
|
718
|
+
break;
|
|
719
|
+
}
|
|
720
|
+
case ft_mytime:
|
|
721
|
+
{
|
|
722
|
+
myTime myt(m_fd->len);
|
|
723
|
+
myt.setValue(data, m_fds->myDateTimeValueByBtrv);
|
|
724
|
+
setValue(*m_fd, (uchar_td*)m_ptr, myt.getValue());
|
|
725
|
+
break;
|
|
726
|
+
}
|
|
727
|
+
case ft_integer:
|
|
728
|
+
case ft_date:
|
|
729
|
+
case ft_time:
|
|
730
|
+
case ft_autoIncUnsigned:
|
|
731
|
+
case ft_uinteger:
|
|
732
|
+
case ft_logical:
|
|
733
|
+
case ft_autoinc:
|
|
734
|
+
case ft_bit:
|
|
735
|
+
case ft_mydatetime:
|
|
736
|
+
switch (m_fd->len)
|
|
737
|
+
{
|
|
738
|
+
case 1:
|
|
739
|
+
*((char*)((char*)m_ptr + m_fd->pos)) = (char)v;
|
|
740
|
+
break;
|
|
741
|
+
case 2:
|
|
742
|
+
*((short*)((char*)m_ptr + m_fd->pos)) = (short)v;
|
|
743
|
+
break;
|
|
744
|
+
case 3:
|
|
745
|
+
memcpy((char*)m_ptr + m_fd->pos, &v, 3);
|
|
746
|
+
break;
|
|
747
|
+
case 4:
|
|
748
|
+
*((int*)((char*)m_ptr + m_fd->pos)) = v;
|
|
749
|
+
break;
|
|
750
|
+
case 8:
|
|
751
|
+
*((__int64*)((char*)m_ptr + m_fd->pos)) = v;
|
|
752
|
+
break;
|
|
753
|
+
}
|
|
754
|
+
break;
|
|
755
|
+
|
|
756
|
+
case ft_timestamp:
|
|
757
|
+
{
|
|
758
|
+
__int64 v = 0;
|
|
759
|
+
setFV(v);
|
|
760
|
+
return;
|
|
761
|
+
}
|
|
762
|
+
case ft_decimal:
|
|
763
|
+
case ft_money:
|
|
764
|
+
case ft_numeric:
|
|
765
|
+
case ft_bfloat:
|
|
766
|
+
case ft_numericsts:
|
|
767
|
+
case ft_numericsa:
|
|
768
|
+
|
|
769
|
+
case ft_currency:
|
|
770
|
+
case ft_float:
|
|
771
|
+
d = (double)data;
|
|
772
|
+
setFV(d);
|
|
773
|
+
break;
|
|
774
|
+
case ft_string:
|
|
775
|
+
case ft_zstring:
|
|
776
|
+
case ft_note:
|
|
777
|
+
case ft_myvarbinary:
|
|
778
|
+
case ft_myvarchar:
|
|
779
|
+
case ft_mychar:
|
|
780
|
+
if (data == 0)
|
|
781
|
+
setFVA("");
|
|
782
|
+
else
|
|
783
|
+
{
|
|
784
|
+
_ltoa_s(data, buf, 20, 10);
|
|
785
|
+
setFVA(buf);
|
|
786
|
+
}
|
|
787
|
+
break;
|
|
788
|
+
case ft_mywvarbinary:
|
|
789
|
+
case ft_mywvarchar:
|
|
790
|
+
case ft_mywchar:
|
|
791
|
+
case ft_wstring:
|
|
792
|
+
case ft_wzstring:
|
|
793
|
+
{
|
|
794
|
+
if (data == 0)
|
|
795
|
+
setFV(_T(""));
|
|
796
|
+
else
|
|
797
|
+
{
|
|
798
|
+
_TCHAR buf[30];
|
|
799
|
+
_ltot_s(data, buf, 30, 10);
|
|
800
|
+
setFV(buf);
|
|
801
|
+
}
|
|
802
|
+
break;
|
|
803
|
+
}
|
|
804
|
+
case ft_lvar:
|
|
805
|
+
break;
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
void field::setFV(double data)
|
|
810
|
+
{
|
|
811
|
+
if (!m_ptr)
|
|
812
|
+
return;
|
|
813
|
+
char buf[20];
|
|
814
|
+
__int64 i64;
|
|
815
|
+
switch (m_fd->type)
|
|
816
|
+
{
|
|
817
|
+
case ft_currency: // currency
|
|
818
|
+
i64 = (__int64)(data * 10000 + 0.5);
|
|
819
|
+
setFV(i64);
|
|
820
|
+
break;
|
|
821
|
+
case ft_bfloat: // bfloat
|
|
822
|
+
case ft_float:
|
|
823
|
+
switch (m_fd->len)
|
|
824
|
+
{
|
|
825
|
+
case 4:
|
|
826
|
+
*((float*)((char*)m_ptr + m_fd->pos)) = (float)data;
|
|
827
|
+
break;
|
|
828
|
+
case 8:
|
|
829
|
+
*((double*)((char*)m_ptr + m_fd->pos)) = data;
|
|
830
|
+
break;
|
|
831
|
+
default:
|
|
832
|
+
break;
|
|
833
|
+
}
|
|
834
|
+
break;
|
|
835
|
+
case ft_decimal:
|
|
836
|
+
case ft_money:
|
|
837
|
+
setFVDecimal(data);
|
|
838
|
+
break;
|
|
839
|
+
case ft_numeric:
|
|
840
|
+
case ft_numericsts:
|
|
841
|
+
case ft_numericsa:
|
|
842
|
+
setFVNumeric(data);
|
|
843
|
+
break;
|
|
844
|
+
|
|
845
|
+
case ft_integer:
|
|
846
|
+
case ft_date:
|
|
847
|
+
case ft_time:
|
|
848
|
+
case ft_autoIncUnsigned:
|
|
849
|
+
case ft_uinteger:
|
|
850
|
+
case ft_logical:
|
|
851
|
+
case ft_autoinc:
|
|
852
|
+
case ft_timestamp:
|
|
853
|
+
case ft_bit:
|
|
854
|
+
case ft_mydate:
|
|
855
|
+
case ft_mytime:
|
|
856
|
+
case ft_mydatetime:
|
|
857
|
+
case ft_mytimestamp:
|
|
858
|
+
i64 = (__int64)data;
|
|
859
|
+
setFV(i64);
|
|
860
|
+
break;
|
|
861
|
+
case ft_string:
|
|
862
|
+
case ft_zstring:
|
|
863
|
+
case ft_note:
|
|
864
|
+
case ft_myvarbinary:
|
|
865
|
+
case ft_myvarchar:
|
|
866
|
+
case ft_mychar:
|
|
867
|
+
if (data == 0)
|
|
868
|
+
setFVA("");
|
|
869
|
+
else
|
|
870
|
+
{
|
|
871
|
+
sprintf(buf, "%f", data);
|
|
872
|
+
setFVA(buf);
|
|
873
|
+
break;
|
|
874
|
+
}
|
|
875
|
+
case ft_lvar:
|
|
876
|
+
break;
|
|
877
|
+
case ft_mywvarbinary:
|
|
878
|
+
case ft_mywvarchar:
|
|
879
|
+
case ft_mywchar:
|
|
880
|
+
case ft_wstring:
|
|
881
|
+
case ft_wzstring:
|
|
882
|
+
{
|
|
883
|
+
if (data == 0)
|
|
884
|
+
setFV(_T(""));
|
|
885
|
+
else
|
|
886
|
+
{
|
|
887
|
+
_TCHAR buf[40];
|
|
888
|
+
_stprintf_s(buf, 40, _T("%f"), data);
|
|
889
|
+
setFV(buf);
|
|
890
|
+
}
|
|
891
|
+
break;
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
void field::setFV(short data)
|
|
897
|
+
{
|
|
898
|
+
int value = (int)data;
|
|
899
|
+
setFV(value);
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
void field::setFV(float data)
|
|
903
|
+
{
|
|
904
|
+
double value = (double)data;
|
|
905
|
+
setFV(value);
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
short field::getFVsht() const
|
|
909
|
+
{
|
|
910
|
+
return (short)getFVlng();
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
int field::getFVlng() const
|
|
914
|
+
{
|
|
915
|
+
if (!m_ptr)
|
|
916
|
+
return 0;
|
|
917
|
+
int ret = 0;
|
|
918
|
+
switch (m_fd->type)
|
|
919
|
+
{
|
|
920
|
+
case ft_integer:
|
|
921
|
+
case ft_autoinc:
|
|
922
|
+
switch (m_fd->len)
|
|
923
|
+
{
|
|
924
|
+
case 1:
|
|
925
|
+
ret = *(((char*)m_ptr + m_fd->pos));
|
|
926
|
+
break;
|
|
927
|
+
case 2:
|
|
928
|
+
ret = *((short*)((char*)m_ptr + m_fd->pos));
|
|
929
|
+
break;
|
|
930
|
+
case 3:
|
|
931
|
+
memcpy(&ret, (char*)m_ptr + m_fd->pos, 3);
|
|
932
|
+
ret = ((ret & 0xFFFFFF) << 8) / 0x100;
|
|
933
|
+
break;
|
|
934
|
+
case 8:
|
|
935
|
+
case 4:
|
|
936
|
+
ret = *((int*)((char*)m_ptr + m_fd->pos));
|
|
937
|
+
break;
|
|
938
|
+
}
|
|
939
|
+
break;
|
|
940
|
+
case ft_autoIncUnsigned:
|
|
941
|
+
case ft_uinteger:
|
|
942
|
+
case ft_logical:
|
|
943
|
+
case ft_bit:
|
|
944
|
+
case ft_date:
|
|
945
|
+
case ft_time:
|
|
946
|
+
case ft_timestamp:
|
|
947
|
+
case ft_mydatetime:
|
|
948
|
+
case ft_mytimestamp:
|
|
949
|
+
switch (m_fd->len)
|
|
950
|
+
{
|
|
951
|
+
case 1:
|
|
952
|
+
ret = *((unsigned char*)((char*)m_ptr + m_fd->pos));
|
|
953
|
+
break;
|
|
954
|
+
case 2:
|
|
955
|
+
ret = *((unsigned short*)((char*)m_ptr + m_fd->pos));
|
|
956
|
+
break;
|
|
957
|
+
case 3:
|
|
958
|
+
memcpy(&ret, (char*)m_ptr + m_fd->pos, 3);
|
|
959
|
+
break;
|
|
960
|
+
case 8:
|
|
961
|
+
case 4:
|
|
962
|
+
ret = *((unsigned int*)((char*)m_ptr + m_fd->pos));
|
|
963
|
+
break;
|
|
964
|
+
}
|
|
965
|
+
break;
|
|
966
|
+
case ft_mydate:
|
|
967
|
+
{
|
|
968
|
+
myDate myd;
|
|
969
|
+
myd.setValue((int)getValue64(*m_fd, (const uchar_td*)m_ptr));
|
|
970
|
+
ret = myd.getValue(m_fds->myDateTimeValueByBtrv);
|
|
971
|
+
break;
|
|
972
|
+
}
|
|
973
|
+
case ft_mytime:
|
|
974
|
+
{
|
|
975
|
+
myTime myt(m_fd->len);
|
|
976
|
+
myt.setValue((int)getValue64(*m_fd, (const uchar_td*)m_ptr));
|
|
977
|
+
ret = (int)myt.getValue(m_fds->myDateTimeValueByBtrv);
|
|
978
|
+
break;
|
|
979
|
+
;
|
|
980
|
+
}
|
|
981
|
+
case ft_string:
|
|
982
|
+
case ft_zstring:
|
|
983
|
+
case ft_note:
|
|
984
|
+
case ft_myvarbinary:
|
|
985
|
+
case ft_myvarchar:
|
|
986
|
+
case ft_mychar:
|
|
987
|
+
ret = atol(getFVAstr());
|
|
988
|
+
break;
|
|
989
|
+
case ft_wstring:
|
|
990
|
+
case ft_wzstring:
|
|
991
|
+
case ft_mywvarbinary:
|
|
992
|
+
case ft_mywvarchar:
|
|
993
|
+
case ft_mywchar:
|
|
994
|
+
ret = _ttol(getFVstr());
|
|
995
|
+
break;
|
|
996
|
+
case ft_currency:
|
|
997
|
+
ret = (long)(*((__int64*)((char*)m_ptr + m_fd->pos)) / 10000);
|
|
998
|
+
break;
|
|
999
|
+
case ft_bfloat:
|
|
1000
|
+
case ft_float:
|
|
1001
|
+
ret = (long)getFVdbl();
|
|
1002
|
+
break;
|
|
1003
|
+
case ft_decimal:
|
|
1004
|
+
case ft_money:
|
|
1005
|
+
ret = (long)getFVDecimal();
|
|
1006
|
+
break;
|
|
1007
|
+
case ft_numeric:
|
|
1008
|
+
case ft_numericsts:
|
|
1009
|
+
case ft_numericsa:
|
|
1010
|
+
ret = (long)getFVnumeric();
|
|
1011
|
+
break;
|
|
1012
|
+
|
|
1013
|
+
case ft_lvar:
|
|
1014
|
+
break;
|
|
1015
|
+
default:
|
|
1016
|
+
return 0;
|
|
1017
|
+
}
|
|
1018
|
+
return ret;
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
float field::getFVflt() const
|
|
1022
|
+
{
|
|
1023
|
+
return (float)getFVdbl();
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
double field::getFVdbl() const
|
|
1027
|
+
{
|
|
1028
|
+
if (!m_ptr)
|
|
1029
|
+
return 0;
|
|
1030
|
+
double ret = 0;
|
|
1031
|
+
switch (m_fd->type)
|
|
1032
|
+
{
|
|
1033
|
+
case ft_currency:
|
|
1034
|
+
ret = (double)*((__int64*)((char*)m_ptr + m_fd->pos));
|
|
1035
|
+
ret = ret / 10000;
|
|
1036
|
+
break;
|
|
1037
|
+
|
|
1038
|
+
case ft_bfloat:
|
|
1039
|
+
case ft_timestamp:
|
|
1040
|
+
case ft_float:
|
|
1041
|
+
switch (m_fd->len)
|
|
1042
|
+
{
|
|
1043
|
+
case 4:
|
|
1044
|
+
ret = (double)*((float*)((char*)m_ptr + m_fd->pos));
|
|
1045
|
+
break;
|
|
1046
|
+
case 10: // long double
|
|
1047
|
+
case 8:
|
|
1048
|
+
ret = (double)*((double*)((char*)m_ptr + m_fd->pos));
|
|
1049
|
+
break;
|
|
1050
|
+
}
|
|
1051
|
+
break;
|
|
1052
|
+
case ft_string:
|
|
1053
|
+
case ft_zstring:
|
|
1054
|
+
case ft_note:
|
|
1055
|
+
case ft_myvarbinary:
|
|
1056
|
+
case ft_myvarchar:
|
|
1057
|
+
case ft_mychar:
|
|
1058
|
+
ret = atof(getFVAstr());
|
|
1059
|
+
break;
|
|
1060
|
+
case ft_wstring:
|
|
1061
|
+
case ft_wzstring:
|
|
1062
|
+
case ft_mywvarbinary:
|
|
1063
|
+
case ft_mywvarchar:
|
|
1064
|
+
case ft_mywchar:
|
|
1065
|
+
ret = _ttof(getFVstr());
|
|
1066
|
+
break;
|
|
1067
|
+
case ft_integer:
|
|
1068
|
+
case ft_date:
|
|
1069
|
+
case ft_time:
|
|
1070
|
+
case ft_autoIncUnsigned:
|
|
1071
|
+
case ft_uinteger:
|
|
1072
|
+
case ft_logical:
|
|
1073
|
+
case ft_autoinc:
|
|
1074
|
+
case ft_bit:
|
|
1075
|
+
case ft_mydate:
|
|
1076
|
+
case ft_mytime:
|
|
1077
|
+
case ft_mydatetime:
|
|
1078
|
+
case ft_mytimestamp:
|
|
1079
|
+
ret = (double)getFV64();
|
|
1080
|
+
break;
|
|
1081
|
+
|
|
1082
|
+
case ft_decimal:
|
|
1083
|
+
case ft_money:
|
|
1084
|
+
ret = getFVDecimal();
|
|
1085
|
+
break;
|
|
1086
|
+
case ft_numeric:
|
|
1087
|
+
case ft_numericsts:
|
|
1088
|
+
case ft_numericsa:
|
|
1089
|
+
ret = getFVnumeric();
|
|
1090
|
+
break;
|
|
1091
|
+
case ft_lvar:
|
|
1092
|
+
break;
|
|
1093
|
+
default:
|
|
1094
|
+
return 0;
|
|
1095
|
+
}
|
|
1096
|
+
return ret;
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
unsigned char field::getFVbyt() const
|
|
1100
|
+
{
|
|
1101
|
+
return (unsigned char)getFVlng();
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
#ifdef _WIN32
|
|
1105
|
+
|
|
1106
|
+
const wchar_t* field::getFVWstr() const
|
|
1107
|
+
{
|
|
1108
|
+
if (!m_ptr)
|
|
1109
|
+
return L"";
|
|
1110
|
+
char* data = (char*)m_ptr + m_fd->pos;
|
|
1111
|
+
switch (m_fd->type)
|
|
1112
|
+
{
|
|
1113
|
+
case ft_string:
|
|
1114
|
+
return read<stringStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1115
|
+
m_fds->cv(), m_fds->trimPadChar);
|
|
1116
|
+
case ft_note:
|
|
1117
|
+
case ft_zstring:
|
|
1118
|
+
return read<zstringStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1119
|
+
m_fds->cv());
|
|
1120
|
+
case ft_wzstring:
|
|
1121
|
+
return read<wzstringStore, WCHAR, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1122
|
+
m_fds->cv());
|
|
1123
|
+
case ft_wstring:
|
|
1124
|
+
return read<wstringStore, WCHAR, WCHAR>(
|
|
1125
|
+
data, m_fds->strBufs(), *m_fd, m_fds->cv(), m_fds->trimPadChar);
|
|
1126
|
+
case ft_mychar:
|
|
1127
|
+
return read<myCharStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1128
|
+
m_fds->cv(), m_fds->trimPadChar);
|
|
1129
|
+
case ft_myvarchar:
|
|
1130
|
+
return read<myVarCharStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1131
|
+
m_fds->cv());
|
|
1132
|
+
case ft_lstring:
|
|
1133
|
+
case ft_myvarbinary:
|
|
1134
|
+
return read<myVarBinaryStore, char, WCHAR>(data, m_fds->strBufs(),
|
|
1135
|
+
*m_fd, m_fds->cv());
|
|
1136
|
+
case ft_mywchar:
|
|
1137
|
+
return read<myWcharStore, WCHAR, WCHAR>(
|
|
1138
|
+
data, m_fds->strBufs(), *m_fd, m_fds->cv(), m_fds->trimPadChar);
|
|
1139
|
+
case ft_mywvarchar:
|
|
1140
|
+
return read<myWvarCharStore, WCHAR, WCHAR>(data, m_fds->strBufs(),
|
|
1141
|
+
*m_fd, m_fds->cv());
|
|
1142
|
+
case ft_mywvarbinary:
|
|
1143
|
+
return read<myWvarBinaryStore, WCHAR, WCHAR>(data, m_fds->strBufs(),
|
|
1144
|
+
*m_fd, m_fds->cv());
|
|
1145
|
+
case ft_myblob:
|
|
1146
|
+
case ft_mytext:
|
|
1147
|
+
return readBlob<WCHAR>(data, m_fds->strBufs(), *m_fd, m_fds->cv());
|
|
1148
|
+
}
|
|
1149
|
+
wchar_t* p = (wchar_t*)m_fds->strBufs()->getPtrW(max(m_fd->len * 2, 50));
|
|
1150
|
+
|
|
1151
|
+
wchar_t buf[10] = L"%0.";
|
|
1152
|
+
|
|
1153
|
+
switch (m_fd->type)
|
|
1154
|
+
{
|
|
1155
|
+
|
|
1156
|
+
case ft_integer:
|
|
1157
|
+
case ft_bit:
|
|
1158
|
+
case ft_autoinc:
|
|
1159
|
+
_i64tow_s(getFV64(), p, 50, 10);
|
|
1160
|
+
return p;
|
|
1161
|
+
case ft_logical:
|
|
1162
|
+
if (m_fds->logicalToString)
|
|
1163
|
+
{
|
|
1164
|
+
if (getFVlng())
|
|
1165
|
+
return L"Yes";
|
|
1166
|
+
else
|
|
1167
|
+
return L"No";
|
|
1168
|
+
}
|
|
1169
|
+
else
|
|
1170
|
+
_i64tow_s(getFV64(), p, 50, 10);
|
|
1171
|
+
|
|
1172
|
+
case ft_bfloat:
|
|
1173
|
+
case ft_float:
|
|
1174
|
+
case ft_currency:
|
|
1175
|
+
{
|
|
1176
|
+
|
|
1177
|
+
swprintf_s(p, 50, L"%lf", getFVdbl());
|
|
1178
|
+
int k = (int)wcslen(p) - 1;
|
|
1179
|
+
while (k >= 0)
|
|
1180
|
+
{
|
|
1181
|
+
if (p[k] == L'0')
|
|
1182
|
+
p[k] = 0x00;
|
|
1183
|
+
else if (p[k] == L'.')
|
|
1184
|
+
{
|
|
1185
|
+
p[k] = 0x00;
|
|
1186
|
+
break;
|
|
1187
|
+
}
|
|
1188
|
+
else
|
|
1189
|
+
break;
|
|
1190
|
+
k--;
|
|
1191
|
+
}
|
|
1192
|
+
break;
|
|
1193
|
+
}
|
|
1194
|
+
case ft_autoIncUnsigned:
|
|
1195
|
+
case ft_uinteger:
|
|
1196
|
+
swprintf_s(p, 50, L"%lu", getFV64());
|
|
1197
|
+
break;
|
|
1198
|
+
case ft_date:
|
|
1199
|
+
return btrdtoa(getFVlng(), p);
|
|
1200
|
+
case ft_time:
|
|
1201
|
+
return btrttoa(getFVlng(), p);
|
|
1202
|
+
case ft_mydate:
|
|
1203
|
+
{
|
|
1204
|
+
myDate d;
|
|
1205
|
+
d.setValue((int)getValue64(*m_fd, (const uchar_td*)m_ptr));
|
|
1206
|
+
return d.toStr(p, m_fds->myDateTimeValueByBtrv);
|
|
1207
|
+
}
|
|
1208
|
+
case ft_mytime:
|
|
1209
|
+
{
|
|
1210
|
+
|
|
1211
|
+
myTime t(m_fd->len);
|
|
1212
|
+
t.setValue(getValue64(*m_fd, (const uchar_td*)m_ptr));
|
|
1213
|
+
return t.toStr(p);
|
|
1214
|
+
}
|
|
1215
|
+
case ft_mydatetime:
|
|
1216
|
+
{
|
|
1217
|
+
myDateTime t(m_fd->len);
|
|
1218
|
+
t.setValue(getFV64());
|
|
1219
|
+
return t.toStr(p);
|
|
1220
|
+
}
|
|
1221
|
+
case ft_mytimestamp:
|
|
1222
|
+
{
|
|
1223
|
+
myTimeStamp ts(m_fd->len);
|
|
1224
|
+
ts.setValue(getFV64());
|
|
1225
|
+
return ts.toStr(p);
|
|
1226
|
+
}
|
|
1227
|
+
case ft_decimal:
|
|
1228
|
+
case ft_money:
|
|
1229
|
+
case ft_numeric:
|
|
1230
|
+
case ft_numericsts:
|
|
1231
|
+
case ft_numericsa:
|
|
1232
|
+
_ltow_s(m_fd->decimals, p, 50, 10);
|
|
1233
|
+
wcscat(buf, p);
|
|
1234
|
+
wcscat(buf, L"lf");
|
|
1235
|
+
swprintf(p, 50, buf, getFVdbl());
|
|
1236
|
+
break;
|
|
1237
|
+
case ft_lvar:
|
|
1238
|
+
return NULL;
|
|
1239
|
+
case ft_timestamp:
|
|
1240
|
+
return btrTimeStamp(getFV64()).toString(p);
|
|
1241
|
+
default:
|
|
1242
|
+
p[0] = 0x00;
|
|
1243
|
+
}
|
|
1244
|
+
return p;
|
|
1245
|
+
}
|
|
1246
|
+
|
|
1247
|
+
#endif //_WIN32
|
|
1248
|
+
|
|
1249
|
+
const char* field::getFVAstr() const
|
|
1250
|
+
{
|
|
1251
|
+
if (!m_ptr)
|
|
1252
|
+
return "";
|
|
1253
|
+
|
|
1254
|
+
char buf[10] = "%0.";
|
|
1255
|
+
|
|
1256
|
+
char* data = (char*)m_ptr + m_fd->pos;
|
|
1257
|
+
switch (m_fd->type)
|
|
1258
|
+
{
|
|
1259
|
+
|
|
1260
|
+
case ft_string:
|
|
1261
|
+
return read<stringStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
1262
|
+
m_fds->cv(), m_fds->trimPadChar);
|
|
1263
|
+
case ft_note:
|
|
1264
|
+
case ft_zstring:
|
|
1265
|
+
return read<zstringStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
1266
|
+
m_fds->cv());
|
|
1267
|
+
case ft_wzstring:
|
|
1268
|
+
return read<wzstringStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
|
|
1269
|
+
m_fds->cv());
|
|
1270
|
+
case ft_wstring:
|
|
1271
|
+
return read<wstringStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
|
|
1272
|
+
m_fds->cv(), m_fds->trimPadChar);
|
|
1273
|
+
case ft_mychar:
|
|
1274
|
+
return read<myCharStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
1275
|
+
m_fds->cv(), m_fds->trimPadChar);
|
|
1276
|
+
case ft_myvarchar:
|
|
1277
|
+
return read<myVarCharStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
1278
|
+
m_fds->cv());
|
|
1279
|
+
case ft_lstring:
|
|
1280
|
+
case ft_myvarbinary:
|
|
1281
|
+
return read<myVarBinaryStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
1282
|
+
m_fds->cv());
|
|
1283
|
+
case ft_mywchar:
|
|
1284
|
+
return read<myWcharStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
|
|
1285
|
+
m_fds->cv(), m_fds->trimPadChar);
|
|
1286
|
+
case ft_mywvarchar:
|
|
1287
|
+
return read<myWvarCharStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
|
|
1288
|
+
m_fds->cv());
|
|
1289
|
+
case ft_mywvarbinary:
|
|
1290
|
+
return read<myWvarBinaryStore, WCHAR, char>(data, m_fds->strBufs(),
|
|
1291
|
+
*m_fd, m_fds->cv());
|
|
1292
|
+
case ft_myblob:
|
|
1293
|
+
case ft_mytext:
|
|
1294
|
+
return readBlob<char>(data, m_fds->strBufs(), *m_fd, m_fds->cv());
|
|
1295
|
+
}
|
|
1296
|
+
char* p = m_fds->strBufs()->getPtrA(max(m_fd->len * 2, 50));
|
|
1297
|
+
switch (m_fd->type)
|
|
1298
|
+
{
|
|
1299
|
+
case ft_integer:
|
|
1300
|
+
case ft_bit:
|
|
1301
|
+
case ft_autoinc:
|
|
1302
|
+
_i64toa_s(getFV64(), p, 50, 10);
|
|
1303
|
+
return p;
|
|
1304
|
+
case ft_logical:
|
|
1305
|
+
if (m_fds->logicalToString)
|
|
1306
|
+
{
|
|
1307
|
+
if (getFVlng())
|
|
1308
|
+
return "Yes";
|
|
1309
|
+
else
|
|
1310
|
+
return "No";
|
|
1311
|
+
}
|
|
1312
|
+
else
|
|
1313
|
+
_i64toa_s(getFV64(), p, 50, 10);
|
|
1314
|
+
break;
|
|
1315
|
+
case ft_bfloat:
|
|
1316
|
+
case ft_float:
|
|
1317
|
+
case ft_currency:
|
|
1318
|
+
{
|
|
1319
|
+
sprintf(p, "%lf", getFVdbl());
|
|
1320
|
+
size_t k = strlen(p) - 1;
|
|
1321
|
+
while (1)
|
|
1322
|
+
{
|
|
1323
|
+
if (p[k] == '0')
|
|
1324
|
+
p[k] = 0x00;
|
|
1325
|
+
else if (p[k] == '.')
|
|
1326
|
+
{
|
|
1327
|
+
p[k] = 0x00;
|
|
1328
|
+
break;
|
|
1329
|
+
}
|
|
1330
|
+
else
|
|
1331
|
+
break;
|
|
1332
|
+
k--;
|
|
1333
|
+
}
|
|
1334
|
+
break;
|
|
1335
|
+
}
|
|
1336
|
+
case ft_date:
|
|
1337
|
+
return btrdtoa(getFVlng(), p);
|
|
1338
|
+
case ft_time:
|
|
1339
|
+
return btrttoa(getFVlng(), p);
|
|
1340
|
+
case ft_autoIncUnsigned:
|
|
1341
|
+
case ft_uinteger:
|
|
1342
|
+
sprintf_s(p, 50, "%llu", (unsigned __int64)getFV64());
|
|
1343
|
+
break;
|
|
1344
|
+
|
|
1345
|
+
case ft_mydate:
|
|
1346
|
+
{
|
|
1347
|
+
myDate d;
|
|
1348
|
+
d.setValue((int)getValue64(*m_fd, (const uchar_td*)m_ptr));
|
|
1349
|
+
return d.toStr(p, m_fds->myDateTimeValueByBtrv);
|
|
1350
|
+
}
|
|
1351
|
+
case ft_mytime:
|
|
1352
|
+
{
|
|
1353
|
+
myTime t(m_fd->len);
|
|
1354
|
+
t.setValue(getValue64(*m_fd, (const uchar_td*)m_ptr));
|
|
1355
|
+
return t.toStr(p);
|
|
1356
|
+
}
|
|
1357
|
+
case ft_mytimestamp:
|
|
1358
|
+
{
|
|
1359
|
+
myTimeStamp ts(m_fd->len);
|
|
1360
|
+
ts.setValue(getFV64());
|
|
1361
|
+
return ts.toStr(p);
|
|
1362
|
+
}
|
|
1363
|
+
case ft_mydatetime:
|
|
1364
|
+
{
|
|
1365
|
+
myDateTime t(m_fd->len);
|
|
1366
|
+
t.setValue(getFV64());
|
|
1367
|
+
return t.toStr(p);
|
|
1368
|
+
}
|
|
1369
|
+
case ft_decimal:
|
|
1370
|
+
case ft_money:
|
|
1371
|
+
case ft_numeric:
|
|
1372
|
+
case ft_numericsts:
|
|
1373
|
+
case ft_numericsa:
|
|
1374
|
+
_ltoa_s(m_fd->decimals, p, 50, 10);
|
|
1375
|
+
strcat(buf, p);
|
|
1376
|
+
strcat(buf, "lf");
|
|
1377
|
+
sprintf_s(p, 50, buf, getFVdbl());
|
|
1378
|
+
break;
|
|
1379
|
+
case ft_lvar:
|
|
1380
|
+
return NULL;
|
|
1381
|
+
case ft_timestamp:
|
|
1382
|
+
return btrTimeStamp(getFV64()).toString(p);
|
|
1383
|
+
default:
|
|
1384
|
+
p[0] = 0x00;
|
|
1385
|
+
}
|
|
1386
|
+
return p;
|
|
1387
|
+
}
|
|
1388
|
+
|
|
1389
|
+
int field::getFVint() const
|
|
1390
|
+
{
|
|
1391
|
+
return (int)getFVlng();
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
__int64 field::getFV64() const
|
|
1395
|
+
{
|
|
1396
|
+
if (!m_ptr)
|
|
1397
|
+
return 0;
|
|
1398
|
+
|
|
1399
|
+
switch (m_fd->len)
|
|
1400
|
+
{
|
|
1401
|
+
case 8:
|
|
1402
|
+
switch (m_fd->type)
|
|
1403
|
+
{
|
|
1404
|
+
case ft_autoIncUnsigned:
|
|
1405
|
+
case ft_uinteger:
|
|
1406
|
+
case ft_integer:
|
|
1407
|
+
case ft_logical:
|
|
1408
|
+
case ft_autoinc:
|
|
1409
|
+
case ft_bit:
|
|
1410
|
+
case ft_currency:
|
|
1411
|
+
case ft_timestamp:
|
|
1412
|
+
case ft_mydatetime:
|
|
1413
|
+
case ft_mytimestamp:
|
|
1414
|
+
return (__int64) * ((__int64*)((char*)m_ptr + m_fd->pos));
|
|
1415
|
+
}
|
|
1416
|
+
return 0;
|
|
1417
|
+
case 7:
|
|
1418
|
+
case 6:
|
|
1419
|
+
case 5:
|
|
1420
|
+
switch (m_fd->type)
|
|
1421
|
+
{
|
|
1422
|
+
case ft_mytime:
|
|
1423
|
+
case ft_mydatetime:
|
|
1424
|
+
case ft_mytimestamp:
|
|
1425
|
+
{
|
|
1426
|
+
__int64 v = 0;
|
|
1427
|
+
memcpy(&v, (char*)m_ptr + m_fd->pos, m_fd->len);
|
|
1428
|
+
return v;
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
return 0;
|
|
1432
|
+
default:
|
|
1433
|
+
|
|
1434
|
+
return (__int64)getFVlng();
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
|
|
1438
|
+
void field::setFV(__int64 data)
|
|
1439
|
+
{
|
|
1440
|
+
if (!m_ptr)
|
|
1441
|
+
return;
|
|
1442
|
+
|
|
1443
|
+
switch (m_fd->len)
|
|
1444
|
+
{
|
|
1445
|
+
case 8:
|
|
1446
|
+
switch (m_fd->type)
|
|
1447
|
+
{
|
|
1448
|
+
case ft_autoIncUnsigned:
|
|
1449
|
+
case ft_uinteger:
|
|
1450
|
+
case ft_integer:
|
|
1451
|
+
case ft_logical:
|
|
1452
|
+
case ft_autoinc:
|
|
1453
|
+
case ft_bit:
|
|
1454
|
+
case ft_currency:
|
|
1455
|
+
case ft_mydatetime:
|
|
1456
|
+
case ft_mytimestamp:
|
|
1457
|
+
*((__int64*)((char*)m_ptr + m_fd->pos)) = data;
|
|
1458
|
+
break;
|
|
1459
|
+
case ft_timestamp:
|
|
1460
|
+
{
|
|
1461
|
+
btrDate d;
|
|
1462
|
+
d.i = getNowDate();
|
|
1463
|
+
btrTime t;
|
|
1464
|
+
t.i = getNowTime();
|
|
1465
|
+
*((__int64*)((char*)m_ptr + m_fd->pos)) = btrTimeStamp(d, t).i64;
|
|
1466
|
+
break;
|
|
1467
|
+
}
|
|
1468
|
+
case ft_float:
|
|
1469
|
+
{
|
|
1470
|
+
double d = (double)data;
|
|
1471
|
+
setFV(d);
|
|
1472
|
+
break;
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
break;
|
|
1476
|
+
case 7:
|
|
1477
|
+
case 6:
|
|
1478
|
+
case 5:
|
|
1479
|
+
switch (m_fd->type)
|
|
1480
|
+
{
|
|
1481
|
+
case ft_mytime:
|
|
1482
|
+
case ft_mydatetime:
|
|
1483
|
+
case ft_mytimestamp:
|
|
1484
|
+
memcpy((char*)m_ptr + m_fd->pos, &data, m_fd->len);
|
|
1485
|
+
break;
|
|
1486
|
+
default:
|
|
1487
|
+
break;
|
|
1488
|
+
}
|
|
1489
|
+
break;
|
|
1490
|
+
default:
|
|
1491
|
+
{
|
|
1492
|
+
int value = (int)data;
|
|
1493
|
+
setFV(value);
|
|
1494
|
+
break;
|
|
1495
|
+
}
|
|
1496
|
+
}
|
|
1497
|
+
}
|
|
1498
|
+
|
|
1499
|
+
/* if blob and text ,set binary data that is only set pointer. it is not copied.
|
|
1500
|
+
* Caller must hold data until it sends to the server.
|
|
1501
|
+
*/
|
|
1502
|
+
void field::setFV(const void* data, uint_td size)
|
|
1503
|
+
{
|
|
1504
|
+
if (!m_ptr)
|
|
1505
|
+
return;
|
|
1506
|
+
switch (m_fd->type)
|
|
1507
|
+
{
|
|
1508
|
+
case ft_myvarbinary:
|
|
1509
|
+
case ft_myvarchar:
|
|
1510
|
+
case ft_mywvarbinary:
|
|
1511
|
+
case ft_mywvarchar:
|
|
1512
|
+
case ft_lstring:
|
|
1513
|
+
{
|
|
1514
|
+
int sizeByte = m_fd->varLenBytes();
|
|
1515
|
+
size = std::min<uint_td>((uint_td)(m_fd->len - sizeByte), size);
|
|
1516
|
+
memset((char*)m_ptr + m_fd->pos, 0, m_fd->len);
|
|
1517
|
+
memcpy((char*)m_ptr + m_fd->pos, &size, sizeByte);
|
|
1518
|
+
memcpy((char*)m_ptr + m_fd->pos + sizeByte, data, size);
|
|
1519
|
+
break;
|
|
1520
|
+
}
|
|
1521
|
+
case ft_myblob:
|
|
1522
|
+
case ft_mytext:
|
|
1523
|
+
{
|
|
1524
|
+
int sizeByte = m_fd->len - 8;
|
|
1525
|
+
memset((char*)m_ptr + m_fd->pos, 0, m_fd->len);
|
|
1526
|
+
memcpy((char*)m_ptr + m_fd->pos, &size, sizeByte);
|
|
1527
|
+
memcpy((char*)m_ptr + m_fd->pos + sizeByte, &data, sizeof(char*));
|
|
1528
|
+
break;
|
|
1529
|
+
}
|
|
1530
|
+
case ft_lvar:
|
|
1531
|
+
{
|
|
1532
|
+
int sizeByte = 2;
|
|
1533
|
+
size = std::min<uint_td>((uint_td)(m_fd->len - sizeByte), size);
|
|
1534
|
+
memset((char*)m_ptr + m_fd->pos, 0, m_fd->len);
|
|
1535
|
+
memcpy((char*)m_ptr + m_fd->pos, &size, sizeByte);
|
|
1536
|
+
memcpy((char*)m_ptr + m_fd->pos + sizeByte, data, size);
|
|
1537
|
+
break;
|
|
1538
|
+
}
|
|
1539
|
+
default:
|
|
1540
|
+
size = std::min<uint_td>((uint_td)m_fd->len, size);
|
|
1541
|
+
memset((char*)m_ptr + m_fd->pos, 0, m_fd->len);
|
|
1542
|
+
memcpy((char*)m_ptr + m_fd->pos, data, size);
|
|
1543
|
+
}
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1546
|
+
/* offset is writen at data that is first address of data
|
|
1547
|
+
* text is not converted to unicode form stored charset.
|
|
1548
|
+
*/
|
|
1549
|
+
void* field::getFVbin(uint_td& size) const
|
|
1550
|
+
{
|
|
1551
|
+
if (!m_ptr)
|
|
1552
|
+
return 0;
|
|
1553
|
+
|
|
1554
|
+
switch (m_fd->type)
|
|
1555
|
+
{
|
|
1556
|
+
case ft_myvarbinary:
|
|
1557
|
+
case ft_myvarchar:
|
|
1558
|
+
case ft_mywvarbinary:
|
|
1559
|
+
case ft_mywvarchar:
|
|
1560
|
+
case ft_lstring:
|
|
1561
|
+
{
|
|
1562
|
+
int sizeByte = m_fd->varLenBytes();
|
|
1563
|
+
size = 0;
|
|
1564
|
+
memcpy(&size, (char*)m_ptr + m_fd->pos, sizeByte);
|
|
1565
|
+
return (void*)((char*)m_ptr + m_fd->pos + sizeByte);
|
|
1566
|
+
}
|
|
1567
|
+
case ft_myblob:
|
|
1568
|
+
case ft_mytext:
|
|
1569
|
+
{
|
|
1570
|
+
int sizeByte = m_fd->len - 8;
|
|
1571
|
+
size = 0;
|
|
1572
|
+
memcpy(&size, (char*)m_ptr + m_fd->pos, sizeByte);
|
|
1573
|
+
char** ptr = (char**)((char*)m_ptr + m_fd->pos + sizeByte);
|
|
1574
|
+
return (void*)*ptr;
|
|
1575
|
+
}
|
|
1576
|
+
case ft_lvar:
|
|
1577
|
+
{
|
|
1578
|
+
int sizeByte = 2;
|
|
1579
|
+
size = 0;
|
|
1580
|
+
memcpy(&size, (char*)m_ptr + m_fd->pos, sizeByte);
|
|
1581
|
+
return (void*)((char*)m_ptr + m_fd->pos + sizeByte);
|
|
1582
|
+
}
|
|
1583
|
+
}
|
|
1584
|
+
return NULL;
|
|
1585
|
+
}
|
|
1586
|
+
|
|
1587
|
+
double field::getFVDecimal() const
|
|
1588
|
+
{
|
|
1589
|
+
if (!m_ptr)
|
|
1590
|
+
return 0;
|
|
1591
|
+
|
|
1592
|
+
unsigned char buf[20] = { 0x00 };
|
|
1593
|
+
char result[30] = { 0x00 };
|
|
1594
|
+
char n[10];
|
|
1595
|
+
int i;
|
|
1596
|
+
char* t;
|
|
1597
|
+
unsigned char sign;
|
|
1598
|
+
int len = m_fd->len;
|
|
1599
|
+
result[0] = '+';
|
|
1600
|
+
memcpy(buf, (void*)((char*)m_ptr + m_fd->pos), len);
|
|
1601
|
+
sign = (unsigned char)(buf[len - 1] & 0x0F);
|
|
1602
|
+
buf[len - 1] = (unsigned char)(buf[len - 1] & 0xF0);
|
|
1603
|
+
for (i = 0; i < len; i++)
|
|
1604
|
+
{
|
|
1605
|
+
sprintf_s(n, 50, "%02x", buf[i]);
|
|
1606
|
+
strcat(result, n);
|
|
1607
|
+
}
|
|
1608
|
+
i = (int)strlen(result);
|
|
1609
|
+
|
|
1610
|
+
if (sign == 13)
|
|
1611
|
+
result[0] = '-';
|
|
1612
|
+
result[i - 1] = 0x00;
|
|
1613
|
+
|
|
1614
|
+
t = result + (m_fd->len * 2) - m_fd->decimals;
|
|
1615
|
+
strcpy((char*)buf, t);
|
|
1616
|
+
*t = '.';
|
|
1617
|
+
strcpy(t + 1, (char*)buf);
|
|
1618
|
+
return atof(result);
|
|
1619
|
+
}
|
|
1620
|
+
|
|
1621
|
+
double field::getFVnumeric() const
|
|
1622
|
+
{
|
|
1623
|
+
if (!m_ptr)
|
|
1624
|
+
return 0;
|
|
1625
|
+
|
|
1626
|
+
char* t;
|
|
1627
|
+
char dp[] = "{ABCDEFGHI}JKLMNOPQR";
|
|
1628
|
+
char dpsa[] = "PQRSTUVWXYpqrstuvwxy";
|
|
1629
|
+
char* pdp = NULL;
|
|
1630
|
+
char i;
|
|
1631
|
+
char buf[20] = { 0x00 };
|
|
1632
|
+
char dummy[20];
|
|
1633
|
+
|
|
1634
|
+
buf[0] = '+';
|
|
1635
|
+
strncpy(buf + 1, (char*)((char*)m_ptr + m_fd->pos), m_fd->len);
|
|
1636
|
+
|
|
1637
|
+
t = &(buf[m_fd->len]);
|
|
1638
|
+
|
|
1639
|
+
switch (m_fd->type)
|
|
1640
|
+
{
|
|
1641
|
+
case ft_numeric:
|
|
1642
|
+
pdp = dp;
|
|
1643
|
+
break;
|
|
1644
|
+
case ft_numericsa:
|
|
1645
|
+
pdp = dpsa;
|
|
1646
|
+
break;
|
|
1647
|
+
case ft_numericsts:
|
|
1648
|
+
buf[0] = *t;
|
|
1649
|
+
*t = 0x00;
|
|
1650
|
+
break;
|
|
1651
|
+
}
|
|
1652
|
+
|
|
1653
|
+
if (pdp)
|
|
1654
|
+
{
|
|
1655
|
+
for (i = 0; i < 21; i++)
|
|
1656
|
+
{
|
|
1657
|
+
if (*t == pdp[i])
|
|
1658
|
+
{
|
|
1659
|
+
if (i > 10)
|
|
1660
|
+
{
|
|
1661
|
+
buf[0] = '-';
|
|
1662
|
+
*t = (char)(i + 38);
|
|
1663
|
+
}
|
|
1664
|
+
else
|
|
1665
|
+
*t = (char)(i + 48);
|
|
1666
|
+
break;
|
|
1667
|
+
}
|
|
1668
|
+
}
|
|
1669
|
+
}
|
|
1670
|
+
|
|
1671
|
+
t = buf + strlen(buf) - m_fd->decimals;
|
|
1672
|
+
strcpy(dummy, t);
|
|
1673
|
+
*t = '.';
|
|
1674
|
+
strcpy(t + 1, dummy);
|
|
1675
|
+
return atof(buf);
|
|
1676
|
+
}
|
|
1677
|
+
|
|
1678
|
+
void field::setFVDecimal(double data)
|
|
1679
|
+
{ // Double -> Decimal
|
|
1680
|
+
if (!m_ptr)
|
|
1681
|
+
return;
|
|
1682
|
+
|
|
1683
|
+
char buf[30] = "%+0";
|
|
1684
|
+
char dummy[30];
|
|
1685
|
+
int point;
|
|
1686
|
+
bool sign = false;
|
|
1687
|
+
unsigned char n;
|
|
1688
|
+
int i, k;
|
|
1689
|
+
int strl;
|
|
1690
|
+
bool offset = false;
|
|
1691
|
+
;
|
|
1692
|
+
point = (m_fd->len) * 2;
|
|
1693
|
+
_ltoa_s(point, dummy, 30, 10);
|
|
1694
|
+
strcat(buf, dummy);
|
|
1695
|
+
strcat(buf, ".");
|
|
1696
|
+
_ltoa_s(m_fd->decimals, dummy, 30, 10);
|
|
1697
|
+
strcat(buf, dummy);
|
|
1698
|
+
strcat(buf, "lf");
|
|
1699
|
+
sprintf(dummy, buf, data);
|
|
1700
|
+
if (dummy[0] == '-')
|
|
1701
|
+
sign = true;
|
|
1702
|
+
|
|
1703
|
+
strl = (int)strlen(dummy + 1) - 1;
|
|
1704
|
+
if (strl % 2 == 1)
|
|
1705
|
+
strl = strl / 2;
|
|
1706
|
+
else
|
|
1707
|
+
{
|
|
1708
|
+
strl = strl / 2 + 1;
|
|
1709
|
+
offset = true;
|
|
1710
|
+
}
|
|
1711
|
+
memset(buf, 0, 30);
|
|
1712
|
+
k = 0;
|
|
1713
|
+
n = 0;
|
|
1714
|
+
point = (int)strlen(dummy + 1);
|
|
1715
|
+
if (strl <= m_fd->len)
|
|
1716
|
+
{
|
|
1717
|
+
for (i = 1; i <= point; i++)
|
|
1718
|
+
{
|
|
1719
|
+
if ((dummy[i] == '-') || (dummy[i] == '.'))
|
|
1720
|
+
;
|
|
1721
|
+
else
|
|
1722
|
+
{
|
|
1723
|
+
if (offset)
|
|
1724
|
+
{
|
|
1725
|
+
n = (unsigned char)(n + dummy[i] - 48);
|
|
1726
|
+
buf[k] = n;
|
|
1727
|
+
offset = false;
|
|
1728
|
+
k++;
|
|
1729
|
+
}
|
|
1730
|
+
else
|
|
1731
|
+
{
|
|
1732
|
+
n = (unsigned char)(dummy[i] - 48);
|
|
1733
|
+
n = (unsigned char)(n << 4);
|
|
1734
|
+
offset = true;
|
|
1735
|
+
;
|
|
1736
|
+
}
|
|
1737
|
+
}
|
|
1738
|
+
}
|
|
1739
|
+
if (sign)
|
|
1740
|
+
buf[k] += ((unsigned char)(n + 13));
|
|
1741
|
+
else
|
|
1742
|
+
buf[k] += ((unsigned char)(n + 12));
|
|
1743
|
+
}
|
|
1744
|
+
memcpy((void*)((char*)m_ptr + m_fd->pos), buf, m_fd->len);
|
|
1745
|
+
}
|
|
1746
|
+
|
|
1747
|
+
void field::setFVNumeric(double data)
|
|
1748
|
+
{ // Double -> Numeric
|
|
1749
|
+
if (!m_ptr)
|
|
1750
|
+
return;
|
|
1751
|
+
|
|
1752
|
+
char buf[30] = "%+0";
|
|
1753
|
+
char dummy[30];
|
|
1754
|
+
int point;
|
|
1755
|
+
int n;
|
|
1756
|
+
char dp[] = "{ABCDEFGHI}JKLMNOPQR";
|
|
1757
|
+
char dpsa[] = "PQRSTUVWXYpqrstuvwxy";
|
|
1758
|
+
bool sign = false;
|
|
1759
|
+
char* t;
|
|
1760
|
+
|
|
1761
|
+
point = m_fd->len + 1;
|
|
1762
|
+
|
|
1763
|
+
_ltoa_s(point, dummy, 30, 10);
|
|
1764
|
+
strcat(buf, dummy);
|
|
1765
|
+
strcat(buf, ".");
|
|
1766
|
+
_ltoa_s(m_fd->decimals, dummy, 30, 10);
|
|
1767
|
+
strcat(buf, dummy);
|
|
1768
|
+
strcat(buf, "lf");
|
|
1769
|
+
sprintf(dummy, buf, data);
|
|
1770
|
+
if (dummy[0] == '-')
|
|
1771
|
+
sign = true;
|
|
1772
|
+
|
|
1773
|
+
strcpy(buf, &dummy[point - m_fd->decimals] + 1);
|
|
1774
|
+
dummy[point - m_fd->decimals] = 0x00;
|
|
1775
|
+
strcat(dummy, buf);
|
|
1776
|
+
|
|
1777
|
+
n = atol(&dummy[m_fd->len]);
|
|
1778
|
+
if (sign)
|
|
1779
|
+
n += 10;
|
|
1780
|
+
t = dummy + 1;
|
|
1781
|
+
switch (m_fd->type)
|
|
1782
|
+
{
|
|
1783
|
+
case ft_numeric:
|
|
1784
|
+
dummy[m_fd->len] = dp[n];
|
|
1785
|
+
break;
|
|
1786
|
+
case ft_numericsa:
|
|
1787
|
+
dummy[m_fd->len] = dpsa[n];
|
|
1788
|
+
break;
|
|
1789
|
+
case ft_numericsts:
|
|
1790
|
+
if (sign)
|
|
1791
|
+
strcat(dummy, "-");
|
|
1792
|
+
else
|
|
1793
|
+
strcat(dummy, "+");
|
|
1794
|
+
t += 1;
|
|
1795
|
+
break;
|
|
1796
|
+
}
|
|
1797
|
+
|
|
1798
|
+
memcpy((void*)((char*)m_ptr + m_fd->pos), t, m_fd->len);
|
|
1799
|
+
}
|
|
1800
|
+
|
|
1801
|
+
template <class T>
|
|
1802
|
+
inline int compNumber(const field& l, const field& r, char logType)
|
|
1803
|
+
{
|
|
1804
|
+
return compare<T>((const char*)l.ptr(), (const char*)r.ptr());
|
|
1805
|
+
}
|
|
1806
|
+
|
|
1807
|
+
inline int compNumber24(const field& l, const field& r, char logType)
|
|
1808
|
+
{
|
|
1809
|
+
return compareInt24((const char*)l.ptr(), (const char*)r.ptr());
|
|
1810
|
+
}
|
|
1811
|
+
|
|
1812
|
+
inline int compNumberU24(const field& l, const field& r, char logType)
|
|
1813
|
+
{
|
|
1814
|
+
return compareUint24((const char*)l.ptr(), (const char*)r.ptr());
|
|
1815
|
+
}
|
|
1816
|
+
|
|
1817
|
+
inline int compMem(const field& l, const field& r, char logType)
|
|
1818
|
+
{
|
|
1819
|
+
return memcmp((const char*)l.ptr(), (const char*)r.ptr(), l.len());
|
|
1820
|
+
}
|
|
1821
|
+
|
|
1822
|
+
inline int compString(const field& l, const field& r, char logType)
|
|
1823
|
+
{
|
|
1824
|
+
return strncmp((const char*)l.ptr(), (const char*)r.ptr(), l.len());
|
|
1825
|
+
}
|
|
1826
|
+
|
|
1827
|
+
inline int compiString(const field& l, const field& r, char logType)
|
|
1828
|
+
{
|
|
1829
|
+
return _strnicmp((const char*)l.ptr(), (const char*)r.ptr(), l.len());
|
|
1830
|
+
}
|
|
1831
|
+
|
|
1832
|
+
inline int compWString(const field& l, const field& r, char logType)
|
|
1833
|
+
{
|
|
1834
|
+
return wcsncmp16((char16_t*)l.ptr(), (char16_t*)r.ptr(), l.len());
|
|
1835
|
+
}
|
|
1836
|
+
|
|
1837
|
+
inline int compiWString(const field& l, const field& r, char logType)
|
|
1838
|
+
{
|
|
1839
|
+
return wcsnicmp16((char16_t*)l.ptr(), (char16_t*)r.ptr(), l.len());
|
|
1840
|
+
}
|
|
1841
|
+
|
|
1842
|
+
template <class T>
|
|
1843
|
+
inline int compVarString(const field& l, const field& r, char logType)
|
|
1844
|
+
{
|
|
1845
|
+
return compareVartype<T>((const char*)l.ptr(), (const char*)r.ptr(),
|
|
1846
|
+
l.type() == ft_myvarbinary, logType);
|
|
1847
|
+
}
|
|
1848
|
+
|
|
1849
|
+
template <class T>
|
|
1850
|
+
inline int compWVarString(const field& l, const field& r, char logType)
|
|
1851
|
+
{
|
|
1852
|
+
return compareWvartype<T>((const char*)l.ptr(), (const char*)r.ptr(),
|
|
1853
|
+
l.type() == ft_mywvarbinary, logType);
|
|
1854
|
+
}
|
|
1855
|
+
|
|
1856
|
+
inline int compBlob(const field& l, const field& r, char logType)
|
|
1857
|
+
{
|
|
1858
|
+
return compareBlobType((const char*)l.ptr(), (const char*)r.ptr(),
|
|
1859
|
+
l.type() == ft_myblob, logType, l.blobLenBytes());
|
|
1860
|
+
}
|
|
1861
|
+
|
|
1862
|
+
compFieldFunc field::getCompFunc(char logType) const
|
|
1863
|
+
{
|
|
1864
|
+
switch (m_fd->type)
|
|
1865
|
+
{
|
|
1866
|
+
case ft_integer:
|
|
1867
|
+
case ft_autoinc:
|
|
1868
|
+
case ft_currency:
|
|
1869
|
+
{
|
|
1870
|
+
switch (m_fd->len)
|
|
1871
|
+
{
|
|
1872
|
+
case 1:
|
|
1873
|
+
return &compNumber<char>;
|
|
1874
|
+
case 2:
|
|
1875
|
+
return &compNumber<short>;
|
|
1876
|
+
case 3:
|
|
1877
|
+
return &compNumber24;
|
|
1878
|
+
case 4:
|
|
1879
|
+
return &compNumber<int>;
|
|
1880
|
+
case 8:
|
|
1881
|
+
return &compNumber<__int64>;
|
|
1882
|
+
}
|
|
1883
|
+
}
|
|
1884
|
+
case ft_mychar:
|
|
1885
|
+
case ft_string:
|
|
1886
|
+
if (logType & CMPLOGICAL_CASEINSENSITIVE)
|
|
1887
|
+
return &compiString;
|
|
1888
|
+
return &compMem;
|
|
1889
|
+
case ft_zstring:
|
|
1890
|
+
case ft_note:
|
|
1891
|
+
if (logType & CMPLOGICAL_CASEINSENSITIVE)
|
|
1892
|
+
return &compiString;
|
|
1893
|
+
return &compString;
|
|
1894
|
+
case ft_logical:
|
|
1895
|
+
case ft_uinteger:
|
|
1896
|
+
case ft_autoIncUnsigned:
|
|
1897
|
+
case ft_date:
|
|
1898
|
+
case ft_time:
|
|
1899
|
+
case ft_timestamp:
|
|
1900
|
+
case ft_mydate:
|
|
1901
|
+
{
|
|
1902
|
+
switch (m_fd->len)
|
|
1903
|
+
{
|
|
1904
|
+
case 1:
|
|
1905
|
+
return &compNumber<unsigned char>;
|
|
1906
|
+
case 2:
|
|
1907
|
+
return &compNumber<unsigned short>;
|
|
1908
|
+
case 3:
|
|
1909
|
+
return &compNumberU24;
|
|
1910
|
+
case 4:
|
|
1911
|
+
return &compNumber<unsigned int>;
|
|
1912
|
+
case 8:
|
|
1913
|
+
return &compNumber<unsigned __int64>;
|
|
1914
|
+
}
|
|
1915
|
+
}
|
|
1916
|
+
case ft_mytime:
|
|
1917
|
+
case ft_mydatetime:
|
|
1918
|
+
case ft_mytimestamp:
|
|
1919
|
+
return &compMem;
|
|
1920
|
+
case ft_float:
|
|
1921
|
+
switch (m_fd->len)
|
|
1922
|
+
{
|
|
1923
|
+
case 4:
|
|
1924
|
+
return &compNumber<float>;
|
|
1925
|
+
case 8:
|
|
1926
|
+
return &compNumber<double>;
|
|
1927
|
+
}
|
|
1928
|
+
case ft_mywchar:
|
|
1929
|
+
case ft_wstring:
|
|
1930
|
+
case ft_wzstring:
|
|
1931
|
+
if (logType & CMPLOGICAL_CASEINSENSITIVE)
|
|
1932
|
+
return &compiWString;
|
|
1933
|
+
if ((m_fd->type == ft_wstring) || (m_fd->type == ft_mywchar))
|
|
1934
|
+
return &compMem;
|
|
1935
|
+
return &compWString;
|
|
1936
|
+
case ft_lstring:
|
|
1937
|
+
case ft_myvarchar:
|
|
1938
|
+
case ft_myvarbinary:
|
|
1939
|
+
if (m_fd->varLenBytes() == 1)
|
|
1940
|
+
return &compVarString<unsigned char>;
|
|
1941
|
+
return &compVarString<unsigned short>;
|
|
1942
|
+
case ft_mywvarchar:
|
|
1943
|
+
case ft_mywvarbinary:
|
|
1944
|
+
if (m_fd->varLenBytes() == 1)
|
|
1945
|
+
return &compWVarString<unsigned char>;
|
|
1946
|
+
return &compWVarString<unsigned short>;
|
|
1947
|
+
case ft_mytext:
|
|
1948
|
+
case ft_myblob:
|
|
1949
|
+
return &compBlob;
|
|
1950
|
+
}
|
|
1951
|
+
return NULL;
|
|
1952
|
+
}
|
|
1953
|
+
|
|
1954
|
+
int field::comp(const field& r, char logType) const
|
|
1955
|
+
{
|
|
1956
|
+
compFieldFunc f = getCompFunc(logType);
|
|
1957
|
+
return f(*this, r, logType);
|
|
1958
|
+
}
|
|
1959
|
+
|
|
1960
|
+
bool field::isCompPartAndMakeValue()
|
|
1961
|
+
{
|
|
1962
|
+
bool ret = false;
|
|
1963
|
+
if (m_fd->isStringType())
|
|
1964
|
+
{
|
|
1965
|
+
_TCHAR* p = (_TCHAR*)getFVstr();
|
|
1966
|
+
if (p)
|
|
1967
|
+
{
|
|
1968
|
+
size_t n = _tcslen(p);
|
|
1969
|
+
if (n && ((ret = (p[n - 1] == _T('*'))) != 0))
|
|
1970
|
+
{
|
|
1971
|
+
p[n - 1] = 0x00;
|
|
1972
|
+
setFV(p);
|
|
1973
|
+
}
|
|
1974
|
+
}
|
|
1975
|
+
else
|
|
1976
|
+
setFV(_T(""));
|
|
1977
|
+
}
|
|
1978
|
+
return ret;
|
|
1979
|
+
}
|
|
1980
|
+
|
|
1981
|
+
} // namespace client
|
|
1982
|
+
} // namespace tdap
|
|
1983
|
+
} // namespace protocol
|
|
1984
|
+
} // namespace db
|
|
1985
|
+
} // namespace bzs
|