transactd 1.0.1
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 +7 -0
- data/BUILD_UNIX-JA +174 -0
- data/BUILD_WIN-JA +256 -0
- data/CMakeLists.txt +96 -0
- data/COPYING +339 -0
- data/README +406 -0
- data/README-JA +424 -0
- data/bin/common/tdclc_32_1_0.dll +0 -0
- data/bin/common/tdclc_64_1_0.dll +0 -0
- data/build/common/check_for_link_iconv.cmake +73 -0
- data/build/common/copyifgreater.cmd +30 -0
- data/build/common/copyifgreater.js +290 -0
- data/build/common/get_boost_libs.cmake +106 -0
- data/build/common/get_ruby_path.cmake +115 -0
- data/build/common/options.cmake +127 -0
- data/build/common/smart_install.cmake +263 -0
- data/build/common/system.cmake +122 -0
- data/build/common/transactd.rc.in +52 -0
- data/build/common/transactd_cl_common.cmake +101 -0
- data/build/common/transactd_cl_output.cmake +93 -0
- data/build/common/transactd_common.cmake +237 -0
- data/build/common/transactd_required.cmake +28 -0
- data/build/swig/ruby/generate.cmake.in +35 -0
- data/build/swig/ruby/generate.cmd.in +19 -0
- data/build/swig/ruby/ruby.swg +101 -0
- data/build/swig/tdcl.i +188 -0
- data/build/tdclc/BUILDNUMBER.txt +1 -0
- data/build/tdclc/CMakeLists.txt +170 -0
- data/build/tdclc/tdclc_32.cbproj +181 -0
- data/build/tdclc/tdclc_64.cbproj +205 -0
- data/build/tdclcpp/BUILDNUMBER.txt +1 -0
- data/build/tdclcpp/CMakeLists.txt +142 -0
- data/build/tdclcpp/tdclcpp_bcb_32.cbproj +239 -0
- data/build/tdclcpp/tdclcpp_bcb_64.cbproj +304 -0
- data/build/tdclrb/BUILDNUMBER.txt +1 -0
- data/build/tdclrb/CMakeLists.txt +258 -0
- data/build/tdclrb/GEM_VERSION +3 -0
- data/build/tdclrb/bldgem/extconf.rb +123 -0
- data/build/tdclrb/gem/INSTALLLOG.win32 +9 -0
- data/build/tdclrb/gem/Makefile.win32-VS +65 -0
- data/build/tdclrb/gem/Makefile.win32-prebuilt +48 -0
- data/build/tdclrb/gem/detect.rb +31 -0
- data/build/tdclrb/gem/helper.rb +113 -0
- data/build/tdclrb/gem/transactd.rb +22 -0
- data/build/tdclrb/gem_output.cmake +44 -0
- data/source/bzs/db/IBlobBuffer.h +51 -0
- data/source/bzs/db/blobBuffer.h +177 -0
- data/source/bzs/db/blobStructs.h +85 -0
- data/source/bzs/db/engine/mysql/IReadRecords.h +52 -0
- data/source/bzs/db/engine/mysql/bookmark.h +195 -0
- data/source/bzs/db/engine/mysql/database.cpp +1882 -0
- data/source/bzs/db/engine/mysql/database.h +465 -0
- data/source/bzs/db/engine/mysql/dbManager.cpp +303 -0
- data/source/bzs/db/engine/mysql/dbManager.h +143 -0
- data/source/bzs/db/engine/mysql/errorMessage.cpp +75 -0
- data/source/bzs/db/engine/mysql/errorMessage.h +43 -0
- data/source/bzs/db/engine/mysql/fieldAccess.h +158 -0
- data/source/bzs/db/engine/mysql/mydebuglog.cpp +349 -0
- data/source/bzs/db/engine/mysql/mydebuglog.h +89 -0
- data/source/bzs/db/engine/mysql/mysqlInternal.h +171 -0
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +169 -0
- data/source/bzs/db/engine/mysql/mysqlThd.h +35 -0
- data/source/bzs/db/engine/mysql/percentageKey.h +260 -0
- data/source/bzs/db/protocol/ICommandExecuter.h +49 -0
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +689 -0
- data/source/bzs/db/protocol/hs/hsCommandExecuter.h +228 -0
- data/source/bzs/db/protocol/tdap/btrDate.cpp +437 -0
- data/source/bzs/db/protocol/tdap/btrDate.h +227 -0
- data/source/bzs/db/protocol/tdap/client/bulkInsert.h +127 -0
- data/source/bzs/db/protocol/tdap/client/client.cpp +106 -0
- data/source/bzs/db/protocol/tdap/client/client.h +292 -0
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +144 -0
- data/source/bzs/db/protocol/tdap/client/connMgr.h +82 -0
- data/source/bzs/db/protocol/tdap/client/database.cpp +863 -0
- data/source/bzs/db/protocol/tdap/client/database.h +118 -0
- data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +100 -0
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +1640 -0
- data/source/bzs/db/protocol/tdap/client/dbDef.h +135 -0
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +434 -0
- data/source/bzs/db/protocol/tdap/client/errorMessage.cpp +92 -0
- data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +98 -0
- data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +174 -0
- data/source/bzs/db/protocol/tdap/client/fieldDDF.h +91 -0
- data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +140 -0
- data/source/bzs/db/protocol/tdap/client/fileDDF.h +86 -0
- data/source/bzs/db/protocol/tdap/client/filter.cpp +527 -0
- data/source/bzs/db/protocol/tdap/client/filter.h +154 -0
- data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +137 -0
- data/source/bzs/db/protocol/tdap/client/indexDDF.h +84 -0
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +724 -0
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +123 -0
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +899 -0
- data/source/bzs/db/protocol/tdap/client/nsTable.h +199 -0
- data/source/bzs/db/protocol/tdap/client/request.h +198 -0
- data/source/bzs/db/protocol/tdap/client/sharedData.cpp +58 -0
- data/source/bzs/db/protocol/tdap/client/sharedData.h +56 -0
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +574 -0
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +53 -0
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +627 -0
- data/source/bzs/db/protocol/tdap/client/table.cpp +2613 -0
- data/source/bzs/db/protocol/tdap/client/table.h +221 -0
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +1096 -0
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +179 -0
- data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +40 -0
- data/source/bzs/db/protocol/tdap/client/trnsctcl.def +11 -0
- data/source/bzs/db/protocol/tdap/myDateTime.cpp +500 -0
- data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +184 -0
- data/source/bzs/db/protocol/tdap/mysql/characterset.h +60 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +284 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +53 -0
- data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +383 -0
- data/source/bzs/db/protocol/tdap/mysql/debuglog.h +106 -0
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +680 -0
- data/source/bzs/db/protocol/tdap/mysql/request.h +202 -0
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +1020 -0
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +141 -0
- data/source/bzs/db/protocol/tdap/tdapRequest.h +190 -0
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +295 -0
- data/source/bzs/db/protocol/tdap/tdapSchema.h +558 -0
- data/source/bzs/db/protocol/tdap/tdapcapi.h +423 -0
- data/source/bzs/db/transactd/appBuilderImple.h +55 -0
- data/source/bzs/db/transactd/appModule.cpp +183 -0
- data/source/bzs/db/transactd/appModule.h +80 -0
- data/source/bzs/db/transactd/connManager.cpp +201 -0
- data/source/bzs/db/transactd/connManager.h +60 -0
- data/source/bzs/db/transactd/connectionRecord.h +69 -0
- data/source/bzs/db/transactd/transactd.cpp +325 -0
- data/source/bzs/env/compiler.h +135 -0
- data/source/bzs/env/crosscompile.cpp +130 -0
- data/source/bzs/env/crosscompile.h +150 -0
- data/source/bzs/env/fileopen.h +36 -0
- data/source/bzs/env/mbcswchrLinux.cpp +40 -0
- data/source/bzs/env/mbcswchrLinux.h +88 -0
- data/source/bzs/env/tstring.h +183 -0
- data/source/bzs/example/changeSchema.cpp +117 -0
- data/source/bzs/example/changeSchema_c.cpp +78 -0
- data/source/bzs/example/connection_pool_c.cpp +171 -0
- data/source/bzs/example/createDatabase.cpp +305 -0
- data/source/bzs/example/createDatabase_c.cpp +202 -0
- data/source/bzs/example/deleteRecords.cpp +87 -0
- data/source/bzs/example/deleteRecords_c.cpp +57 -0
- data/source/bzs/example/dropDatabase.cpp +59 -0
- data/source/bzs/example/dropDatabase_c.cpp +34 -0
- data/source/bzs/example/insertRecords.cpp +212 -0
- data/source/bzs/example/insertRecords_c.cpp +153 -0
- data/source/bzs/example/readRecords.cpp +141 -0
- data/source/bzs/example/readRecords_c.cpp +107 -0
- data/source/bzs/example/updateRecords.cpp +99 -0
- data/source/bzs/example/updateRecords_c.cpp +71 -0
- data/source/bzs/example/update_with_transaction.cpp +104 -0
- data/source/bzs/example/update_with_transaction_c.cpp +80 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +226 -0
- data/source/bzs/netsvc/client/tcpClient.h +489 -0
- data/source/bzs/netsvc/server/IAppModule.h +94 -0
- data/source/bzs/netsvc/server/iserver.h +65 -0
- data/source/bzs/netsvc/server/serverCpt.cpp +522 -0
- data/source/bzs/netsvc/server/serverCpt.h +88 -0
- data/source/bzs/netsvc/server/serverPipe.cpp +705 -0
- data/source/bzs/netsvc/server/serverPipe.h +96 -0
- data/source/bzs/netsvc/server/serverTpool.cpp +416 -0
- data/source/bzs/netsvc/server/serverTpool.h +84 -0
- data/source/bzs/rtl/benchmark.cpp +96 -0
- data/source/bzs/rtl/benchmark.h +65 -0
- data/source/bzs/rtl/datetime.cpp +375 -0
- data/source/bzs/rtl/datetime.h +53 -0
- data/source/bzs/rtl/debuglog.cpp +106 -0
- data/source/bzs/rtl/debuglog.h +97 -0
- data/source/bzs/rtl/exception.h +116 -0
- data/source/bzs/rtl/stl_uty.cpp +35 -0
- data/source/bzs/rtl/stl_uty.h +29 -0
- data/source/bzs/rtl/stringBuffers.cpp +101 -0
- data/source/bzs/rtl/stringBuffers.h +58 -0
- data/source/bzs/rtl/strtrim.cpp +135 -0
- data/source/bzs/rtl/strtrim.h +46 -0
- data/source/bzs/test/tdclatl/bench_tdclatl.js +445 -0
- data/source/bzs/test/tdclrb/bench_tdclcpp.rb +375 -0
- data/source/bzs/test/tdclrb/prepare.rb +226 -0
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +172 -0
- data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +208 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +1536 -0
- data/source/bzs/test/transactdBench/transactdBench.cpp +430 -0
- data/source/bzs/test/transactdBench/transactdBench2.cpp +342 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +2030 -0
- data/source/global/tdclatl/Database.cpp +503 -0
- data/source/global/tdclatl/Database.h +139 -0
- data/source/global/tdclatl/DbDef.cpp +242 -0
- data/source/global/tdclatl/DbDef.h +79 -0
- data/source/global/tdclatl/Field.cpp +92 -0
- data/source/global/tdclatl/Field.h +59 -0
- data/source/global/tdclatl/FieldDef.cpp +238 -0
- data/source/global/tdclatl/FieldDef.h +87 -0
- data/source/global/tdclatl/Flags.cpp +111 -0
- data/source/global/tdclatl/Flags.h +55 -0
- data/source/global/tdclatl/KeyDef.cpp +51 -0
- data/source/global/tdclatl/KeyDef.h +55 -0
- data/source/global/tdclatl/KeySegment.cpp +55 -0
- data/source/global/tdclatl/Table.cpp +600 -0
- data/source/global/tdclatl/Table.h +144 -0
- data/source/global/tdclatl/TableDef.cpp +291 -0
- data/source/global/tdclatl/TableDef.h +86 -0
- data/source/global/tdclatl/TdVersion.cpp +74 -0
- data/source/global/tdclatl/TdVersion.h +54 -0
- data/source/global/tdclatl/_IDatabaseEvents_CP.h +113 -0
- data/source/global/tdclatl/dllmain.cpp +30 -0
- data/source/global/tdclatl/dllmain.h +27 -0
- data/source/global/tdclatl/keySegment.h +57 -0
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/stdafx.cpp +2 -0
- data/source/global/tdclatl/stdafx.h +25 -0
- data/source/global/tdclatl/targetver.h +4 -0
- data/source/global/tdclatl/tdclatl.cpp +68 -0
- data/source/global/tdclatl/tdclatl.def +10 -0
- data/source/global/tdclatl/tdclatl.idl +1035 -0
- data/source/linux/charsetConvert.h +112 -0
- data/source/linux/linuxTypes.h +33 -0
- data/source/linux/tchar.h +428 -0
- data/transactd.gemspec +97 -0
- metadata +267 -0
|
@@ -0,0 +1,2613 @@
|
|
|
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 <bzs/env/tstring.h>
|
|
20
|
+
#pragma hdrstop
|
|
21
|
+
|
|
22
|
+
#include "table.h"
|
|
23
|
+
#include "filter.h"
|
|
24
|
+
#include "database.h"
|
|
25
|
+
#include "bulkInsert.h"
|
|
26
|
+
#include "stringConverter.h"
|
|
27
|
+
#include <bzs/rtl/strtrim.h>
|
|
28
|
+
#include <bzs/rtl/stringBuffers.h>
|
|
29
|
+
#include <bzs/db/protocol/tdap/myDateTime.cpp>
|
|
30
|
+
#include <bzs/db/blobStructs.h>
|
|
31
|
+
#include <vector>
|
|
32
|
+
#include <algorithm>
|
|
33
|
+
#include <boost/timer.hpp>
|
|
34
|
+
#include <boost/shared_array.hpp>
|
|
35
|
+
|
|
36
|
+
#pragma package(smart_init)
|
|
37
|
+
|
|
38
|
+
#ifdef __BCPLUSPLUS__
|
|
39
|
+
#define _strupr strupr
|
|
40
|
+
#endif
|
|
41
|
+
|
|
42
|
+
using namespace bzs::db;
|
|
43
|
+
using namespace bzs::rtl;
|
|
44
|
+
using namespace bzs::db::protocol::tdap;
|
|
45
|
+
|
|
46
|
+
namespace bzs
|
|
47
|
+
{
|
|
48
|
+
namespace db
|
|
49
|
+
{
|
|
50
|
+
namespace protocol
|
|
51
|
+
{
|
|
52
|
+
namespace tdap
|
|
53
|
+
{
|
|
54
|
+
namespace client
|
|
55
|
+
{
|
|
56
|
+
|
|
57
|
+
#ifdef _WIN32
|
|
58
|
+
#ifdef _INICODE
|
|
59
|
+
#define EXEC_CODEPAGE CP_UTF16
|
|
60
|
+
#else
|
|
61
|
+
#define EXEC_CODEPAGE GetACP()
|
|
62
|
+
#endif
|
|
63
|
+
#else
|
|
64
|
+
#define EXEC_CODEPAGE CP_UTF8
|
|
65
|
+
#endif
|
|
66
|
+
|
|
67
|
+
#define BOOKMARK_ALLOC_SIZE 40960
|
|
68
|
+
#define BOOKMARK_SIZE 4
|
|
69
|
+
#define DATASIZE_BYTE 2
|
|
70
|
+
|
|
71
|
+
class CFiledNameIndex
|
|
72
|
+
{
|
|
73
|
+
|
|
74
|
+
public:
|
|
75
|
+
CFiledNameIndex(short i, std::_tstring n);
|
|
76
|
+
bool operator < (const CFiledNameIndex& rt) const ;
|
|
77
|
+
|
|
78
|
+
short index;
|
|
79
|
+
|
|
80
|
+
std::_tstring name;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
class recordCache;
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
struct tbimpl
|
|
87
|
+
{
|
|
88
|
+
stringConverter* cv;
|
|
89
|
+
void* bookMarks;
|
|
90
|
+
filter* filterPtr;
|
|
91
|
+
recordCache* rc;
|
|
92
|
+
void* dataBak;
|
|
93
|
+
void* smartUpDate;
|
|
94
|
+
void* bfAtcPtr;
|
|
95
|
+
void* optionalData;
|
|
96
|
+
int bookMarksMemSize;
|
|
97
|
+
int maxBookMarkedCount;
|
|
98
|
+
char keybuf[MAX_KEYLEN];
|
|
99
|
+
char exNext;
|
|
100
|
+
char keyNumIndex[128];
|
|
101
|
+
short exSlideStat;
|
|
102
|
+
|
|
103
|
+
struct
|
|
104
|
+
{
|
|
105
|
+
unsigned char exBookMarking : 1;
|
|
106
|
+
unsigned char myDateTimeValueByBtrv: 1;
|
|
107
|
+
unsigned char trimPadChar: 1;
|
|
108
|
+
unsigned char usePadChar: 1;
|
|
109
|
+
unsigned char smartUpDateFlag: 1;
|
|
110
|
+
unsigned char logicalToString: 1;
|
|
111
|
+
unsigned char dataPacked: 1;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
std::vector<boost::shared_array<char> >blobs;
|
|
115
|
+
::bzs::rtl::stringBuffer strBufs;
|
|
116
|
+
std::vector<CFiledNameIndex>fields;
|
|
117
|
+
|
|
118
|
+
tbimpl() : strBufs(4096), bookMarks(NULL),bfAtcPtr(NULL), maxBookMarkedCount(0), bookMarksMemSize(0),
|
|
119
|
+
filterPtr(NULL), rc(NULL), dataBak(NULL), optionalData(NULL),myDateTimeValueByBtrv(true), trimPadChar(true),
|
|
120
|
+
usePadChar(true), smartUpDate(NULL), smartUpDateFlag(false)
|
|
121
|
+
, logicalToString(false),dataPacked(false)
|
|
122
|
+
{
|
|
123
|
+
memset(&keyNumIndex[0], 0, 128);
|
|
124
|
+
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
~tbimpl()
|
|
128
|
+
{
|
|
129
|
+
|
|
130
|
+
if (dataBak)
|
|
131
|
+
free(dataBak);
|
|
132
|
+
if (smartUpDate)
|
|
133
|
+
free(smartUpDate);
|
|
134
|
+
if (bookMarks)
|
|
135
|
+
free(bookMarks);
|
|
136
|
+
|
|
137
|
+
delete filterPtr;
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
// class recordCache
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
|
|
145
|
+
unsigned int hash(const char *s, int len)
|
|
146
|
+
{
|
|
147
|
+
unsigned int h = 0;
|
|
148
|
+
for (int i = 0; i < len; i++)
|
|
149
|
+
h = h * 137 + *(s + i);
|
|
150
|
+
return h % 1987;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
class recordCache
|
|
154
|
+
{
|
|
155
|
+
table* m_tb;
|
|
156
|
+
filter* m_pFilter;
|
|
157
|
+
unsigned int m_row;
|
|
158
|
+
unsigned int m_len;
|
|
159
|
+
unsigned int m_unpackLen;
|
|
160
|
+
unsigned int m_rowCount;
|
|
161
|
+
bookmark_td m_bookmark;
|
|
162
|
+
char* m_ptr;
|
|
163
|
+
char* m_tmpPtr;
|
|
164
|
+
blobHeader* m_hd;
|
|
165
|
+
|
|
166
|
+
public:
|
|
167
|
+
inline recordCache(table* tb) : m_tb(tb) {reset();}
|
|
168
|
+
|
|
169
|
+
inline void reset()
|
|
170
|
+
{
|
|
171
|
+
m_pFilter = NULL;
|
|
172
|
+
m_row = 0;
|
|
173
|
+
m_rowCount = 0;
|
|
174
|
+
m_ptr = NULL;
|
|
175
|
+
m_len = 0;
|
|
176
|
+
m_tmpPtr = NULL;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
inline void reset(filter* p, char* data, unsigned int totalSize, const blobHeader* hd)
|
|
180
|
+
{
|
|
181
|
+
m_pFilter = p;
|
|
182
|
+
m_row = 0;
|
|
183
|
+
m_rowCount = *((unsigned short*)data);
|
|
184
|
+
m_ptr = data + DATASIZE_BYTE;
|
|
185
|
+
m_len = m_unpackLen = *((unsigned short*)m_ptr); // Not include bookmark and size bytes.
|
|
186
|
+
m_ptr += DATASIZE_BYTE;
|
|
187
|
+
m_bookmark = *((bookmark_td*)(m_ptr));
|
|
188
|
+
m_ptr += BOOKMARK_SIZE;
|
|
189
|
+
m_tmpPtr = data + totalSize;
|
|
190
|
+
m_hd = const_cast<blobHeader*>(hd);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
inline const char* moveRow(int count)
|
|
194
|
+
{
|
|
195
|
+
for (int i = 0; i < count; i++)
|
|
196
|
+
{
|
|
197
|
+
m_ptr += m_len;
|
|
198
|
+
m_len = m_unpackLen = *((unsigned short*)m_ptr);
|
|
199
|
+
m_ptr += DATASIZE_BYTE;
|
|
200
|
+
m_bookmark = *((bookmark_td*)(m_ptr));
|
|
201
|
+
m_ptr += BOOKMARK_SIZE;
|
|
202
|
+
|
|
203
|
+
if (m_hd)
|
|
204
|
+
{
|
|
205
|
+
m_hd->nextField = (blobField*)m_hd->nextField->next();
|
|
206
|
+
++m_hd->curRow;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
m_tb->m_impl->strBufs.clear();
|
|
210
|
+
if (m_pFilter->fieldSelected())
|
|
211
|
+
{
|
|
212
|
+
int offset = 0;
|
|
213
|
+
memset(m_tmpPtr, 0, m_len);
|
|
214
|
+
for (int i = 0; i < m_pFilter->fieldCount(); i++)
|
|
215
|
+
{
|
|
216
|
+
memcpy((char*)m_tmpPtr + m_pFilter->fieldOffset(i), m_ptr + offset,
|
|
217
|
+
m_pFilter->fieldLen(i));
|
|
218
|
+
offset += m_pFilter->fieldLen(i);
|
|
219
|
+
}
|
|
220
|
+
m_tb->setBlobFieldPointer(m_tmpPtr, m_hd);
|
|
221
|
+
return m_tmpPtr;
|
|
222
|
+
}
|
|
223
|
+
else if (m_tb->valiableFormatType())
|
|
224
|
+
{
|
|
225
|
+
memcpy(m_tmpPtr, m_ptr, m_len);
|
|
226
|
+
m_unpackLen = m_tb->unPack((char*)m_tmpPtr, m_len);
|
|
227
|
+
m_tb->setBlobFieldPointer(m_tmpPtr, m_hd);
|
|
228
|
+
return m_tmpPtr;
|
|
229
|
+
}
|
|
230
|
+
else
|
|
231
|
+
{
|
|
232
|
+
m_tb->setBlobFieldPointer(m_ptr, m_hd);
|
|
233
|
+
return m_ptr;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
inline const char* setRow(unsigned int rowNum)
|
|
238
|
+
{
|
|
239
|
+
if (rowNum < m_rowCount)
|
|
240
|
+
{
|
|
241
|
+
unsigned int moveCount = rowNum - m_row;
|
|
242
|
+
m_row = rowNum;
|
|
243
|
+
return moveRow(moveCount);
|
|
244
|
+
}
|
|
245
|
+
return NULL;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
inline unsigned int len() const {return m_unpackLen;};
|
|
249
|
+
inline bookmark_td bookmarkCurRow() const {return m_bookmark;};
|
|
250
|
+
inline int row() const {return m_row;}
|
|
251
|
+
|
|
252
|
+
inline int rowCount() const {return m_rowCount;}
|
|
253
|
+
inline bool isEndOfRow(unsigned int row) const {return (m_rowCount && (row == m_rowCount));}
|
|
254
|
+
inline bool withinCache(unsigned int row) const {return (row < m_rowCount);}
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
// ---------------------------------------------------------------------------
|
|
258
|
+
// class CFiledNameIndex
|
|
259
|
+
// ---------------------------------------------------------------------------
|
|
260
|
+
CFiledNameIndex::CFiledNameIndex(short i, std::_tstring n) : index(i), name(n)
|
|
261
|
+
{
|
|
262
|
+
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
bool CFiledNameIndex:: operator < (const CFiledNameIndex& rt) const
|
|
266
|
+
{
|
|
267
|
+
return name < rt.name;
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
inline __int64 getValue64(const fielddef& fd, const uchar_td* ptr)
|
|
272
|
+
{
|
|
273
|
+
__int64 ret = 0;
|
|
274
|
+
switch (fd.type)
|
|
275
|
+
{
|
|
276
|
+
case ft_integer:
|
|
277
|
+
case ft_autoinc:
|
|
278
|
+
switch (fd.len)
|
|
279
|
+
{
|
|
280
|
+
case 1: ret = *((char*)(ptr + fd.pos));
|
|
281
|
+
break;
|
|
282
|
+
case 2: ret = *((short*)(ptr + fd.pos));
|
|
283
|
+
break;
|
|
284
|
+
case 4: ret = *((int*)(ptr + fd.pos));
|
|
285
|
+
break;
|
|
286
|
+
case 8: ret = *((__int64*)(ptr + fd.pos));
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
case ft_uinteger:
|
|
290
|
+
case ft_logical:
|
|
291
|
+
case ft_bit:
|
|
292
|
+
case ft_currency:
|
|
293
|
+
case ft_date:
|
|
294
|
+
case ft_time:
|
|
295
|
+
case ft_timestamp:
|
|
296
|
+
case ft_mydate:
|
|
297
|
+
case ft_mytime:
|
|
298
|
+
case ft_mydatetime:
|
|
299
|
+
case ft_mytimestamp:
|
|
300
|
+
switch (fd.len)
|
|
301
|
+
{
|
|
302
|
+
case 1: ret = *((unsigned char*)(ptr + fd.pos));
|
|
303
|
+
break;
|
|
304
|
+
case 2: ret = *((unsigned short*)(ptr + fd.pos));
|
|
305
|
+
break;
|
|
306
|
+
case 4: ret = *((unsigned int*)(ptr + fd.pos));
|
|
307
|
+
break;
|
|
308
|
+
case 3:
|
|
309
|
+
case 5:
|
|
310
|
+
case 6:
|
|
311
|
+
case 7: memcpy(&ret, ptr + fd.pos, fd.len);
|
|
312
|
+
break;
|
|
313
|
+
case 8: ret = *((__int64*)(ptr + fd.pos));
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return ret;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
inline void setValue(const fielddef& fd, uchar_td* ptr, __int64 value)
|
|
321
|
+
{
|
|
322
|
+
switch (fd.type)
|
|
323
|
+
{
|
|
324
|
+
case ft_integer:
|
|
325
|
+
case ft_autoinc:
|
|
326
|
+
{
|
|
327
|
+
switch (fd.len)
|
|
328
|
+
{
|
|
329
|
+
case 1: *((char*)(ptr + fd.pos)) = (char)value;
|
|
330
|
+
break;
|
|
331
|
+
case 2: *((short*)(ptr + fd.pos)) = (short)value;
|
|
332
|
+
break;
|
|
333
|
+
case 4: *((int*)(ptr + fd.pos)) = (int)value;
|
|
334
|
+
break;
|
|
335
|
+
case 8: *((__int64*)(ptr + fd.pos)) = (int)value;
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
case ft_uinteger:
|
|
340
|
+
case ft_logical:
|
|
341
|
+
case ft_bit:
|
|
342
|
+
case ft_currency:
|
|
343
|
+
case ft_date:
|
|
344
|
+
case ft_time:
|
|
345
|
+
case ft_timestamp:
|
|
346
|
+
case ft_mytime:
|
|
347
|
+
case ft_mydate:
|
|
348
|
+
case ft_mydatetime:
|
|
349
|
+
case ft_mytimestamp: memcpy(ptr + fd.pos, &value, fd.len);
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
table::table(nsdatabase *pbe) : nstable(pbe)
|
|
359
|
+
{
|
|
360
|
+
m_impl = new tbimpl();
|
|
361
|
+
|
|
362
|
+
m_impl->cv = new stringConverter(nsdatabase::execCodePage(), nsdatabase::execCodePage());
|
|
363
|
+
|
|
364
|
+
m_impl->rc = new recordCache(this);
|
|
365
|
+
|
|
366
|
+
m_keybuflen = MAX_KEYLEN;
|
|
367
|
+
m_pdata = NULL;
|
|
368
|
+
m_keybuf = &m_impl->keybuf[0];
|
|
369
|
+
m_keynum = 0;
|
|
370
|
+
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
table::~table()
|
|
374
|
+
{
|
|
375
|
+
delete m_impl->rc;
|
|
376
|
+
delete m_impl->cv;
|
|
377
|
+
delete m_impl;
|
|
378
|
+
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
inline uchar_td table::charset() const {return m_tableDef->charsetIndex;};
|
|
382
|
+
|
|
383
|
+
bool table::trimPadChar() const {return m_impl->trimPadChar;}
|
|
384
|
+
|
|
385
|
+
void table::setTrimPadChar(bool v) {m_impl->trimPadChar = v;}
|
|
386
|
+
|
|
387
|
+
bool table::usePadChar() const {return m_impl->usePadChar;};
|
|
388
|
+
|
|
389
|
+
void table::setUsePadChar(bool v) {m_impl->usePadChar = v;};
|
|
390
|
+
|
|
391
|
+
void* table::dataBak() const {return m_impl->dataBak;};
|
|
392
|
+
|
|
393
|
+
void table::setDataBak(void* v) {m_impl->dataBak = v;};
|
|
394
|
+
|
|
395
|
+
void* table::optionalData() const {return m_impl->optionalData;}
|
|
396
|
+
|
|
397
|
+
void table::setOptionalData(void* v) {m_impl->optionalData = v;}
|
|
398
|
+
|
|
399
|
+
bool table::myDateTimeValueByBtrv() const {return m_impl->myDateTimeValueByBtrv;}
|
|
400
|
+
|
|
401
|
+
bool table::logicalToString() const {return m_impl->logicalToString;};
|
|
402
|
+
|
|
403
|
+
void table::setLogicalToString(bool v) {m_impl->logicalToString = v;}
|
|
404
|
+
|
|
405
|
+
void table::setBookMarks(int StartId, void* Data, ushort_td Count)
|
|
406
|
+
{
|
|
407
|
+
long size = (StartId + Count) * 6;
|
|
408
|
+
if (m_impl->bookMarksMemSize < size)
|
|
409
|
+
{
|
|
410
|
+
|
|
411
|
+
m_impl->bookMarks = realloc(m_impl->bookMarks, size + BOOKMARK_ALLOC_SIZE);
|
|
412
|
+
m_impl->bookMarksMemSize = size + BOOKMARK_ALLOC_SIZE;
|
|
413
|
+
}
|
|
414
|
+
if (m_impl->bookMarks)
|
|
415
|
+
{
|
|
416
|
+
if (StartId + Count - 1 > m_impl->maxBookMarkedCount)
|
|
417
|
+
m_impl->maxBookMarkedCount = StartId + Count - 1;
|
|
418
|
+
memcpy((void*)((char*)m_impl->bookMarks + ((StartId - 1) * 6)), Data, Count * 6);
|
|
419
|
+
}
|
|
420
|
+
else
|
|
421
|
+
m_stat = STATUS_CANT_ALLOC_MEMORY;
|
|
422
|
+
return;
|
|
423
|
+
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
inline short calcNextReadRecordCount(ushort_td curCount, int eTime)
|
|
427
|
+
{
|
|
428
|
+
ushort_td ret = curCount;
|
|
429
|
+
if (eTime == 0)
|
|
430
|
+
ret = (ushort_td)(curCount * (short)2);
|
|
431
|
+
else
|
|
432
|
+
ret = (ushort_td)(curCount * ((float)100 / (float)eTime));
|
|
433
|
+
|
|
434
|
+
if (ret > 10000)
|
|
435
|
+
return 10000;
|
|
436
|
+
if (ret == 0)
|
|
437
|
+
return 1;
|
|
438
|
+
return ret;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
uint_td table::doRecordCount(bool estimate, bool fromCurrent)
|
|
442
|
+
{
|
|
443
|
+
uint_td result = 0;
|
|
444
|
+
|
|
445
|
+
if (m_impl->filterPtr)
|
|
446
|
+
{
|
|
447
|
+
short curStat = m_stat;
|
|
448
|
+
m_impl->exBookMarking = true;
|
|
449
|
+
ushort_td recCountOnce = 50;
|
|
450
|
+
|
|
451
|
+
bookmark_td bm = bookmark();
|
|
452
|
+
ushort_td tmpFieldCount = m_impl->filterPtr->fieldCount();
|
|
453
|
+
ushort_td tmpRejectCount = m_impl->filterPtr->rejectCount();
|
|
454
|
+
ushort_td tmpRecCount = m_impl->filterPtr->recordCount();
|
|
455
|
+
_TCHAR* str = new _TCHAR[_tcslen(filterStr()) + 1];
|
|
456
|
+
if (str)
|
|
457
|
+
{
|
|
458
|
+
_tcscpy(str, filterStr());
|
|
459
|
+
m_impl->filterPtr->setFieldCount(0);
|
|
460
|
+
m_stat = 0;
|
|
461
|
+
m_impl->filterPtr->setFilter(str, tmpRejectCount, 10000);
|
|
462
|
+
if (m_stat != 0)
|
|
463
|
+
{
|
|
464
|
+
// restore filter string
|
|
465
|
+
m_impl->filterPtr->setFieldCount(tmpFieldCount);
|
|
466
|
+
m_impl->filterPtr->setFilter(str, tmpRejectCount, tmpRecCount);
|
|
467
|
+
delete[]str;
|
|
468
|
+
str = NULL;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
else
|
|
472
|
+
assert(0);
|
|
473
|
+
m_impl->maxBookMarkedCount = 0;
|
|
474
|
+
if (fromCurrent)
|
|
475
|
+
m_stat = curStat;
|
|
476
|
+
else
|
|
477
|
+
seekFirst();
|
|
478
|
+
|
|
479
|
+
*(m_impl->filterPtr->recordCountDirect()) = recCountOnce;
|
|
480
|
+
if (m_stat == 0)
|
|
481
|
+
{
|
|
482
|
+
m_impl->filterPtr->setPosTypeNext(false);
|
|
483
|
+
boost::timer t;
|
|
484
|
+
btrvGetExtend(TD_KEY_NEXT_MULTI);
|
|
485
|
+
int eTime = (int)(t.elapsed() * 1000);
|
|
486
|
+
while ((m_stat == 0) || (m_stat == STATUS_LIMMIT_OF_REJECT) || (m_stat == STATUS_EOF)
|
|
487
|
+
|| (m_stat == STATUS_REACHED_FILTER_COND))
|
|
488
|
+
{
|
|
489
|
+
bool Complete = false;
|
|
490
|
+
if ((m_stat == STATUS_EOF) || (m_stat == STATUS_REACHED_FILTER_COND))
|
|
491
|
+
{
|
|
492
|
+
Complete = true;
|
|
493
|
+
m_stat = STATUS_EOF;
|
|
494
|
+
}
|
|
495
|
+
else if (m_stat == STATUS_LIMMIT_OF_REJECT)
|
|
496
|
+
{
|
|
497
|
+
if (tmpRejectCount != 0)
|
|
498
|
+
{
|
|
499
|
+
if (tmpRejectCount == 1)
|
|
500
|
+
m_stat = STATUS_EOF;
|
|
501
|
+
Complete = true;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
recCountOnce = calcNextReadRecordCount(recCountOnce, eTime);
|
|
505
|
+
|
|
506
|
+
*(m_impl->filterPtr->recordCountDirect()) = recCountOnce;
|
|
507
|
+
result += *((ushort_td*)m_impl->dataBak);
|
|
508
|
+
setBookMarks(m_impl->maxBookMarkedCount + 1, (void*)((char*)m_impl->dataBak + 2),
|
|
509
|
+
*((ushort_td*)m_impl->dataBak));
|
|
510
|
+
m_impl->maxBookMarkedCount = result;
|
|
511
|
+
|
|
512
|
+
onRecordCounting(result, Complete);
|
|
513
|
+
if (Complete)
|
|
514
|
+
break;
|
|
515
|
+
t.restart();
|
|
516
|
+
m_impl->filterPtr->setPosTypeNext(true);
|
|
517
|
+
btrvGetExtend(TD_KEY_NEXT_MULTI);
|
|
518
|
+
eTime = (int)(t.elapsed() * 1000);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
short tmpStat = m_stat;
|
|
522
|
+
if (str)
|
|
523
|
+
{
|
|
524
|
+
setFilter(str, tmpRejectCount, tmpRecCount);
|
|
525
|
+
delete[]str;
|
|
526
|
+
}
|
|
527
|
+
if (bm)
|
|
528
|
+
seekByBookmark(bm);
|
|
529
|
+
m_impl->exBookMarking = false;
|
|
530
|
+
m_stat = tmpStat;
|
|
531
|
+
}
|
|
532
|
+
else
|
|
533
|
+
return nstable::doRecordCount(estimate, fromCurrent);
|
|
534
|
+
|
|
535
|
+
return result;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
void table::btrvGetExtend(ushort_td op)
|
|
539
|
+
{
|
|
540
|
+
|
|
541
|
+
if (op >= TD_KEY_GE_NEXT_MULTI)
|
|
542
|
+
m_keylen = writeKeyData();
|
|
543
|
+
m_pdata = m_impl->dataBak;
|
|
544
|
+
m_impl->filterPtr->WriteBuffer();
|
|
545
|
+
m_datalen = m_impl->filterPtr->exDataBufLen();
|
|
546
|
+
tdap(op);
|
|
547
|
+
short stat = m_stat;
|
|
548
|
+
m_impl->rc->reset(m_impl->filterPtr, (char*)m_impl->dataBak, m_datalen, blobFieldUsed() ?
|
|
549
|
+
getBlobHeader() : NULL);
|
|
550
|
+
|
|
551
|
+
m_stat = stat;
|
|
552
|
+
m_impl->exSlideStat = m_stat;
|
|
553
|
+
//There is the right record.
|
|
554
|
+
if (m_impl->rc->rowCount() && (!m_impl->exBookMarking))
|
|
555
|
+
{
|
|
556
|
+
m_pdata = (void*)m_impl->rc->setRow(0);
|
|
557
|
+
m_datalen = m_impl->rc->len();
|
|
558
|
+
|
|
559
|
+
m_stat = STATUS_SUCCESS;
|
|
560
|
+
}else if ((m_stat == STATUS_LIMMIT_OF_REJECT) && (m_impl->filterPtr->rejectCount()>=1))
|
|
561
|
+
m_stat = STATUS_EOF;
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
void table::getRecords(ushort_td op)
|
|
567
|
+
{
|
|
568
|
+
do
|
|
569
|
+
{
|
|
570
|
+
btrvGetExtend(op);
|
|
571
|
+
m_impl->filterPtr->setPosTypeNext(true);
|
|
572
|
+
|
|
573
|
+
}while (m_stat == STATUS_LIMMIT_OF_REJECT && (m_impl->filterPtr->rejectCount()==0));
|
|
574
|
+
if ((m_stat == STATUS_REACHED_FILTER_COND) || (m_stat == STATUS_LIMMIT_OF_REJECT))
|
|
575
|
+
m_stat = STATUS_EOF;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
bookmark_td table::bookmarkFindCurrent() const
|
|
579
|
+
{
|
|
580
|
+
|
|
581
|
+
if (!m_impl->rc->isEndOfRow(m_impl->rc->row()))
|
|
582
|
+
return m_impl->rc->bookmarkCurRow();
|
|
583
|
+
return 0;
|
|
584
|
+
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
void table::find(eFindType type)
|
|
588
|
+
{
|
|
589
|
+
if (nsdb()->isUseTransactd())
|
|
590
|
+
{
|
|
591
|
+
m_impl->rc->reset();
|
|
592
|
+
ushort_td op = (type == findForword) ? TD_KEY_GE_NEXT_MULTI:TD_KEY_LE_PREV_MULTI;
|
|
593
|
+
doFind(op, true/*notIncCurrent*/);
|
|
594
|
+
}
|
|
595
|
+
else
|
|
596
|
+
{
|
|
597
|
+
if (type == findForword)
|
|
598
|
+
seekGreater(true);
|
|
599
|
+
else
|
|
600
|
+
seekLessThan(true);
|
|
601
|
+
if (m_stat == 0)
|
|
602
|
+
{
|
|
603
|
+
if (type == findForword)
|
|
604
|
+
findNext(true);
|
|
605
|
+
else
|
|
606
|
+
findPrev(true);
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
void table::findFirst()
|
|
614
|
+
{
|
|
615
|
+
seekFirst();
|
|
616
|
+
if (m_stat == 0)
|
|
617
|
+
{
|
|
618
|
+
if (m_impl->filterPtr)
|
|
619
|
+
{
|
|
620
|
+
m_impl->exNext = 1;
|
|
621
|
+
m_impl->filterPtr->setPosTypeNext(false);
|
|
622
|
+
getRecords(TD_KEY_NEXT_MULTI);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
void table::findLast()
|
|
628
|
+
{
|
|
629
|
+
seekLast();
|
|
630
|
+
if (m_stat == 0)
|
|
631
|
+
{
|
|
632
|
+
if (m_impl->filterPtr)
|
|
633
|
+
{
|
|
634
|
+
m_impl->exNext = -1;
|
|
635
|
+
m_impl->filterPtr->setPosTypeNext(false);
|
|
636
|
+
getRecords(TD_KEY_PREV_MULTI);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
void table::doFind( ushort_td op, bool notIncCurrent)
|
|
642
|
+
{
|
|
643
|
+
/*
|
|
644
|
+
First, read from cache.
|
|
645
|
+
If whole row readed from cache then select operation by m_impl->exSlideStat
|
|
646
|
+
|
|
647
|
+
*/
|
|
648
|
+
m_stat = 0;
|
|
649
|
+
int row = m_impl->rc->row() + 1;
|
|
650
|
+
|
|
651
|
+
if (m_impl->rc->withinCache(row) && (!m_impl->exBookMarking))
|
|
652
|
+
{ /* read from cache */
|
|
653
|
+
m_pdata = (void*)m_impl->rc->setRow(row);
|
|
654
|
+
m_datalen = m_impl->rc->len();
|
|
655
|
+
}
|
|
656
|
+
else if (m_impl->rc->isEndOfRow(row))
|
|
657
|
+
{
|
|
658
|
+
/* whole row readed */
|
|
659
|
+
/* A special situation that if rejectCount() == 0 and status = STATUS_LIMMIT_OF_REJECT
|
|
660
|
+
then it continues . */
|
|
661
|
+
if ((m_impl->exSlideStat == 0)
|
|
662
|
+
|| ((m_impl->exSlideStat == STATUS_LIMMIT_OF_REJECT)
|
|
663
|
+
&& (m_impl->filterPtr->rejectCount() == 0)))
|
|
664
|
+
{
|
|
665
|
+
getRecords(op);
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
if ((m_impl->exSlideStat == STATUS_LIMMIT_OF_REJECT) ||
|
|
669
|
+
(m_impl->exSlideStat == STATUS_REACHED_FILTER_COND))
|
|
670
|
+
m_stat = STATUS_EOF;
|
|
671
|
+
else
|
|
672
|
+
m_stat = m_impl->exSlideStat;
|
|
673
|
+
m_impl->exSlideStat = 0;
|
|
674
|
+
}
|
|
675
|
+
else
|
|
676
|
+
{
|
|
677
|
+
m_impl->exNext = ((op == TD_KEY_NEXT_MULTI) || (op == TD_KEY_GE_NEXT_MULTI)) ? 1: -1;
|
|
678
|
+
m_impl->filterPtr->setPosTypeNext(notIncCurrent);
|
|
679
|
+
getRecords(op);
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
void table::findNext(bool notIncCurrent)
|
|
685
|
+
{
|
|
686
|
+
|
|
687
|
+
if (m_impl->filterPtr)
|
|
688
|
+
doFind(TD_KEY_NEXT_MULTI, notIncCurrent);
|
|
689
|
+
else if (notIncCurrent == true)
|
|
690
|
+
seekNext();
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
void table::findPrev(bool notIncCurrent)
|
|
694
|
+
{
|
|
695
|
+
if (m_impl->filterPtr)
|
|
696
|
+
doFind(TD_KEY_PREV_MULTI, notIncCurrent);
|
|
697
|
+
else if (notIncCurrent == true)
|
|
698
|
+
seekPrev();
|
|
699
|
+
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
void table::setFilter(const _TCHAR* str, ushort_td RejectCount, ushort_td CashCount)
|
|
703
|
+
{
|
|
704
|
+
|
|
705
|
+
m_stat = 0;
|
|
706
|
+
m_pdata = m_impl->dataBak;
|
|
707
|
+
m_impl->rc->reset();
|
|
708
|
+
m_impl->exBookMarking = false;
|
|
709
|
+
m_impl->exSlideStat = 0;
|
|
710
|
+
m_impl->exNext = 0;
|
|
711
|
+
if (str[0] == 0x00)
|
|
712
|
+
{
|
|
713
|
+
m_impl->maxBookMarkedCount = 0;
|
|
714
|
+
delete m_impl->filterPtr;
|
|
715
|
+
m_impl->filterPtr = NULL;
|
|
716
|
+
return;
|
|
717
|
+
}
|
|
718
|
+
if (m_impl->filterPtr)
|
|
719
|
+
m_impl->filterPtr->init(this);
|
|
720
|
+
else
|
|
721
|
+
m_impl->filterPtr = new filter(this);
|
|
722
|
+
if (m_impl->filterPtr == NULL)
|
|
723
|
+
{
|
|
724
|
+
m_stat = STATUS_CANT_ALLOC_MEMORY;
|
|
725
|
+
return;
|
|
726
|
+
|
|
727
|
+
}
|
|
728
|
+
if (!m_impl->filterPtr->setFilter(str, RejectCount, CashCount))
|
|
729
|
+
{
|
|
730
|
+
m_stat = STATUS_FILTERSTRING_ERROR;
|
|
731
|
+
delete m_impl->filterPtr;
|
|
732
|
+
m_impl->filterPtr = NULL;
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
if (!m_impl->bookMarks)
|
|
736
|
+
{
|
|
737
|
+
m_impl->bookMarks = malloc(40960);
|
|
738
|
+
if (m_impl->bookMarks)
|
|
739
|
+
m_impl->bookMarksMemSize = 40960;
|
|
740
|
+
else
|
|
741
|
+
{
|
|
742
|
+
m_stat = STATUS_FILTERSTRING_ERROR;
|
|
743
|
+
delete m_impl->filterPtr;
|
|
744
|
+
m_impl->filterPtr = NULL;
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
const _TCHAR* table::filterStr()
|
|
750
|
+
{
|
|
751
|
+
if (m_impl->filterPtr)
|
|
752
|
+
return m_impl->filterPtr->filterStr();
|
|
753
|
+
else
|
|
754
|
+
return NULL;
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
void table::clearBuffer()
|
|
758
|
+
{
|
|
759
|
+
memset(m_pdata, 0x00, m_buflen);
|
|
760
|
+
if (blobFieldUsed())
|
|
761
|
+
resetSendBlob();
|
|
762
|
+
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
void table::getKeySpec(keySpec* ks, bool SpecifyKeyNum)
|
|
766
|
+
{
|
|
767
|
+
keydef* KeyDef;
|
|
768
|
+
short FieldNum;
|
|
769
|
+
int j;
|
|
770
|
+
|
|
771
|
+
KeyDef = &m_tableDef->keyDefs[m_keynum];
|
|
772
|
+
for (j = 0; j < KeyDef->segmentCount; j++)
|
|
773
|
+
{
|
|
774
|
+
FieldNum = KeyDef->segments[j].fieldNum;
|
|
775
|
+
ks[j].keyPos = (ushort_td)(m_tableDef->fieldDefs[FieldNum].pos + 1);
|
|
776
|
+
ks[j].keyLen = m_tableDef->fieldDefs[FieldNum].len;
|
|
777
|
+
ks[j].keyFlag.all = KeyDef->segments[j].flags.all;
|
|
778
|
+
ks[j].keyCount = 0;
|
|
779
|
+
ks[j].keyType = m_tableDef->fieldDefs[FieldNum].type;
|
|
780
|
+
|
|
781
|
+
if (ks[j].keyFlag.bit3 == true)
|
|
782
|
+
ks[j].nullValue = m_tableDef->fieldDefs[FieldNum].nullValue;
|
|
783
|
+
else
|
|
784
|
+
ks[j].nullValue = 0;
|
|
785
|
+
ks[j].reserve2[0] = 0;
|
|
786
|
+
ks[j].reserve2[1] = 0;
|
|
787
|
+
|
|
788
|
+
if (SpecifyKeyNum == true)
|
|
789
|
+
ks[j].keyNo = m_keynum;
|
|
790
|
+
else
|
|
791
|
+
ks[j].keyNo = 0;
|
|
792
|
+
|
|
793
|
+
ks[j].acsNo = 0;
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
void table::doCreateIndex(bool SpecifyKeyNum)
|
|
798
|
+
{
|
|
799
|
+
int segmentCount = m_tableDef->keyDefs[m_keynum].segmentCount;
|
|
800
|
+
keySpec* ks = new keySpec[segmentCount];
|
|
801
|
+
getKeySpec(ks, SpecifyKeyNum);
|
|
802
|
+
m_pdata = ks;
|
|
803
|
+
m_datalen = sizeof(keySpec) * segmentCount;
|
|
804
|
+
nstable::doCreateIndex(SpecifyKeyNum);
|
|
805
|
+
m_pdata = m_impl->dataBak;
|
|
806
|
+
delete[]ks;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
void table::smartUpdate()
|
|
810
|
+
{
|
|
811
|
+
if (!m_impl->smartUpDate)
|
|
812
|
+
m_impl->smartUpDate = malloc(m_buflen);
|
|
813
|
+
if (m_impl->smartUpDate)
|
|
814
|
+
{
|
|
815
|
+
memcpy(m_impl->smartUpDate, data(), m_buflen);
|
|
816
|
+
m_impl->smartUpDateFlag = true;
|
|
817
|
+
}
|
|
818
|
+
else
|
|
819
|
+
m_impl->smartUpDateFlag = false;
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
bool table::isUniqeKey(char_td keynum)
|
|
823
|
+
{
|
|
824
|
+
if ((keynum>=0) && (keynum < m_tableDef->keyCount))
|
|
825
|
+
{
|
|
826
|
+
keydef* kd = &m_tableDef->keyDefs[m_keynum];
|
|
827
|
+
return !(kd->segments[0].flags.bit0);
|
|
828
|
+
}
|
|
829
|
+
return false;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
bool table::onUpdateCheck(eUpdateType type)
|
|
833
|
+
{
|
|
834
|
+
//Check uniqe key
|
|
835
|
+
if (type == changeInKey)
|
|
836
|
+
{
|
|
837
|
+
if (!isUniqeKey(m_keynum))
|
|
838
|
+
{
|
|
839
|
+
m_stat = STATUS_INVALID_KEYNUM;
|
|
840
|
+
return false;
|
|
841
|
+
}else
|
|
842
|
+
{
|
|
843
|
+
if (nsdb()->isUseTransactd()==false)
|
|
844
|
+
{
|
|
845
|
+
//backup update data
|
|
846
|
+
smartUpdate();
|
|
847
|
+
seek();
|
|
848
|
+
m_impl->smartUpDateFlag = false;
|
|
849
|
+
if (m_stat)
|
|
850
|
+
return false;
|
|
851
|
+
memcpy(m_pdata, m_impl->smartUpDate, m_datalen);
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
else if (m_impl->smartUpDateFlag)
|
|
856
|
+
{
|
|
857
|
+
m_stat = 0;
|
|
858
|
+
if (memcmp(m_impl->smartUpDate, data(), m_buflen) == 0)
|
|
859
|
+
{
|
|
860
|
+
m_impl->smartUpDateFlag = false;
|
|
861
|
+
return false;
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
return true;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
void table::onUpdateAfter(int beforeResult)
|
|
868
|
+
{
|
|
869
|
+
if (blobFieldUsed())
|
|
870
|
+
resetSendBlob();
|
|
871
|
+
if (valiableFormatType() && m_impl->dataPacked)
|
|
872
|
+
m_datalen = unPack((char*)m_pdata, m_datalen);
|
|
873
|
+
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
bool table::onDeleteCheck(bool inkey)
|
|
877
|
+
{
|
|
878
|
+
client::database *db = static_cast<client::database*>(nsdb());
|
|
879
|
+
deleteRecordFn func = db->onDeleteRecord();
|
|
880
|
+
if (func)
|
|
881
|
+
{
|
|
882
|
+
if (func(db, this, inkey))
|
|
883
|
+
{
|
|
884
|
+
m_stat = STATUS_CANT_DEL_FOR_REL;
|
|
885
|
+
return false;
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
return true;
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
ushort_td table::doCommitBulkInsert(bool autoCommit)
|
|
892
|
+
{
|
|
893
|
+
ushort_td ret = nstable::doCommitBulkInsert(autoCommit);
|
|
894
|
+
if (blobFieldUsed())
|
|
895
|
+
resetSendBlob();
|
|
896
|
+
return ret;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
void table::onInsertAfter(int beforeResult)
|
|
900
|
+
{
|
|
901
|
+
if (valiableFormatType() && m_impl->dataPacked)
|
|
902
|
+
m_datalen = unPack((char*)m_pdata, m_datalen);
|
|
903
|
+
if (blobFieldUsed())
|
|
904
|
+
resetSendBlob();
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
void* table::attachBuffer(void* NewPtr, bool unpack, size_t size)
|
|
908
|
+
{
|
|
909
|
+
void* oldptr;
|
|
910
|
+
if (!m_impl->bfAtcPtr)
|
|
911
|
+
m_impl->bfAtcPtr = m_pdata;
|
|
912
|
+
oldptr = m_pdata;
|
|
913
|
+
m_pdata = NewPtr;
|
|
914
|
+
ushort_td len = recordLength();
|
|
915
|
+
if (len < m_tableDef->maxRecordLen)
|
|
916
|
+
len = m_tableDef->maxRecordLen;
|
|
917
|
+
if (unpack)
|
|
918
|
+
len = unPack((char*)m_pdata, size);
|
|
919
|
+
m_datalen = len;
|
|
920
|
+
return oldptr;
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
void table::dettachBuffer()
|
|
924
|
+
{
|
|
925
|
+
if (m_impl->bfAtcPtr)
|
|
926
|
+
m_pdata = m_impl->bfAtcPtr;
|
|
927
|
+
m_impl->bfAtcPtr = NULL;
|
|
928
|
+
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
void table::init(tabledef* Def, short fnum, bool regularDir) {doInit(Def, fnum, regularDir);}
|
|
932
|
+
|
|
933
|
+
void table::doInit(tabledef* Def, short fnum, bool /*regularDir*/)
|
|
934
|
+
{
|
|
935
|
+
m_tableDef = Def;
|
|
936
|
+
ushort_td len;
|
|
937
|
+
|
|
938
|
+
m_impl->cv->setCodePage(mysql::codePage(m_tableDef->charsetIndex));
|
|
939
|
+
|
|
940
|
+
if ((len = recordLength()) < m_tableDef->maxRecordLen)
|
|
941
|
+
len = m_tableDef->maxRecordLen;
|
|
942
|
+
|
|
943
|
+
if (len == 0)
|
|
944
|
+
{
|
|
945
|
+
m_stat = STATUS_INVALID_RECLEN;
|
|
946
|
+
return;
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
for (short i = 0; i < m_tableDef->keyCount; i++)
|
|
950
|
+
{
|
|
951
|
+
if (m_tableDef->flags.bitA == true)
|
|
952
|
+
m_impl->keyNumIndex[m_tableDef->keyDefs[i].keyNumber] = (char)i;
|
|
953
|
+
else
|
|
954
|
+
m_impl->keyNumIndex[i] = (char)i;
|
|
955
|
+
}
|
|
956
|
+
if (m_impl->dataBak)
|
|
957
|
+
free(m_impl->dataBak);
|
|
958
|
+
m_impl->dataBak = (void*) malloc(len);
|
|
959
|
+
|
|
960
|
+
if (m_impl->dataBak == NULL)
|
|
961
|
+
{
|
|
962
|
+
if (m_impl->dataBak)
|
|
963
|
+
free(m_impl->dataBak);
|
|
964
|
+
m_impl->dataBak = NULL;
|
|
965
|
+
m_stat = STATUS_CANT_ALLOC_MEMORY;
|
|
966
|
+
return;
|
|
967
|
+
}
|
|
968
|
+
m_pdata = m_impl->dataBak;
|
|
969
|
+
m_buflen = len;
|
|
970
|
+
m_datalen = len;
|
|
971
|
+
setTableid(fnum);
|
|
972
|
+
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
keylen_td table::writeKeyData()
|
|
976
|
+
{
|
|
977
|
+
if (m_tableDef->keyCount)
|
|
978
|
+
{
|
|
979
|
+
keydef& keydef = m_tableDef->keyDefs[(short)m_impl->keyNumIndex[m_keynum]];
|
|
980
|
+
uchar_td* to = (uchar_td*)m_impl->keybuf;
|
|
981
|
+
|
|
982
|
+
for (int j = 0; j < keydef.segmentCount; j++)
|
|
983
|
+
{
|
|
984
|
+
int fdnum = keydef.segments[j].fieldNum;
|
|
985
|
+
fielddef& fd = m_tableDef->fieldDefs[fdnum];
|
|
986
|
+
uchar_td* from = (uchar_td*)m_pdata + fd.pos;
|
|
987
|
+
to = fd.keyCopy(to, from);
|
|
988
|
+
}
|
|
989
|
+
return (keylen_td)(to - (uchar_td*)m_impl->keybuf);
|
|
990
|
+
}
|
|
991
|
+
return 0;
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
uint_td table::pack(char*ptr, size_t size)
|
|
995
|
+
{
|
|
996
|
+
char* pos = ptr;
|
|
997
|
+
char* end = pos + size;
|
|
998
|
+
int movelen;
|
|
999
|
+
for (int i = 0; i < m_tableDef->fieldCount; i++)
|
|
1000
|
+
{
|
|
1001
|
+
fielddef& fd = m_tableDef->fieldDefs[i];
|
|
1002
|
+
int blen = fd.varLenBytes();
|
|
1003
|
+
int dl = fd.len; // length
|
|
1004
|
+
if (blen == 1)
|
|
1005
|
+
dl = *((unsigned char*)(pos)) + blen;
|
|
1006
|
+
else if (blen == 2)
|
|
1007
|
+
dl = *((unsigned short*)(pos)) + blen;
|
|
1008
|
+
pos += dl;
|
|
1009
|
+
if ((movelen = fd.len - dl) != 0)
|
|
1010
|
+
{
|
|
1011
|
+
end -= movelen;
|
|
1012
|
+
memmove(pos, pos + movelen, end - pos);
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
m_impl->dataPacked = true;
|
|
1016
|
+
return (uint_td)(pos - ptr);
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
uint_td table::doGetWriteImageLen()
|
|
1020
|
+
{
|
|
1021
|
+
if (!blobFieldUsed() && !valiableFormatType() && (m_tableDef->flags.bit0 == false))
|
|
1022
|
+
return m_buflen;
|
|
1023
|
+
// Make blob pointer list
|
|
1024
|
+
if (blobFieldUsed())
|
|
1025
|
+
{
|
|
1026
|
+
for (ushort_td i = 0; i < m_tableDef->fieldCount; i++)
|
|
1027
|
+
{
|
|
1028
|
+
fielddef& fd = m_tableDef->fieldDefs[i];
|
|
1029
|
+
uint_td bytes = fd.blobLenBytes();
|
|
1030
|
+
if (bytes)
|
|
1031
|
+
{
|
|
1032
|
+
uchar_td* fdptr = (uchar_td*)m_pdata + fd.pos;
|
|
1033
|
+
blob b(fd.blobDataLen(fdptr), i, fd.blobDataPtr(fdptr));
|
|
1034
|
+
addSendBlob(&b);
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
addBlobEndRow(); // end row
|
|
1038
|
+
}
|
|
1039
|
+
else
|
|
1040
|
+
addSendBlob(NULL);
|
|
1041
|
+
|
|
1042
|
+
if (valiableFormatType())
|
|
1043
|
+
return pack((char*)m_pdata, m_buflen);
|
|
1044
|
+
else
|
|
1045
|
+
{
|
|
1046
|
+
fielddef* FieldDef = &m_tableDef->fieldDefs[m_tableDef->fieldCount - 1];
|
|
1047
|
+
size_t len = 0;
|
|
1048
|
+
short* pos;
|
|
1049
|
+
|
|
1050
|
+
if (FieldDef->type == ft_note)
|
|
1051
|
+
len = strlen((char*)fieldPtr((short)(m_tableDef->fieldCount - 1))) + 1;
|
|
1052
|
+
else if (FieldDef->type == ft_lvar)
|
|
1053
|
+
{
|
|
1054
|
+
// xx................xx.............00
|
|
1055
|
+
// ln--data----------ln-----data----00
|
|
1056
|
+
pos = (short*)fieldPtr((short)(m_tableDef->fieldCount - 1));
|
|
1057
|
+
while (*pos)
|
|
1058
|
+
{
|
|
1059
|
+
len += 2; // size
|
|
1060
|
+
len += *pos;
|
|
1061
|
+
pos = (short*)((char*)pos + (*pos + 2)); // next position
|
|
1062
|
+
|
|
1063
|
+
}
|
|
1064
|
+
len += 2;
|
|
1065
|
+
}
|
|
1066
|
+
else
|
|
1067
|
+
len = FieldDef->len;
|
|
1068
|
+
|
|
1069
|
+
len += FieldDef->pos;
|
|
1070
|
+
|
|
1071
|
+
return (uint_td)len;
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
|
|
1075
|
+
uint_td table::unPack(char* ptr, size_t size)
|
|
1076
|
+
{
|
|
1077
|
+
char* pos = ptr;
|
|
1078
|
+
const char* end = pos + size;
|
|
1079
|
+
const char* max = pos + m_buflen;
|
|
1080
|
+
int movelen;
|
|
1081
|
+
for (int i = 0; i < m_tableDef->fieldCount; i++)
|
|
1082
|
+
{
|
|
1083
|
+
fielddef& fd = m_tableDef->fieldDefs[i];
|
|
1084
|
+
int blen = fd.varLenBytes();
|
|
1085
|
+
int dl = fd.len; // length
|
|
1086
|
+
if (blen == 1)
|
|
1087
|
+
dl = *((unsigned char*)(pos)) + blen;
|
|
1088
|
+
else if (blen == 2)
|
|
1089
|
+
dl = *((unsigned short*)(pos)) + blen;
|
|
1090
|
+
if ((movelen = fd.len - dl) != 0)
|
|
1091
|
+
{
|
|
1092
|
+
if (max < end + movelen)
|
|
1093
|
+
return 0;
|
|
1094
|
+
const char* src = pos + dl;
|
|
1095
|
+
memmove(pos + fd.len, src, end - src);
|
|
1096
|
+
end += movelen;
|
|
1097
|
+
}
|
|
1098
|
+
pos += fd.len;
|
|
1099
|
+
}
|
|
1100
|
+
m_impl->dataPacked = false;
|
|
1101
|
+
return (uint_td)(pos - ptr);
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
void table::addBlobEndRow()
|
|
1105
|
+
{
|
|
1106
|
+
char_td knum = m_keynum;
|
|
1107
|
+
m_keynum = TD_ASBLOB_ENDROW;
|
|
1108
|
+
addSendBlob(NULL);
|
|
1109
|
+
m_keynum = knum;
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
void table::resetSendBlob()
|
|
1113
|
+
{
|
|
1114
|
+
addSendBlob(NULL);
|
|
1115
|
+
m_impl->blobs.clear();
|
|
1116
|
+
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
void table::addSendBlob(const blob* blob)
|
|
1120
|
+
{
|
|
1121
|
+
short stat = m_stat;
|
|
1122
|
+
const void *tmp = data();
|
|
1123
|
+
setData((void*)blob);
|
|
1124
|
+
tdap(TD_ADD_SENDBLOB);
|
|
1125
|
+
setData((void*)tmp);
|
|
1126
|
+
m_stat = stat;
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
const blobHeader* table::getBlobHeader()
|
|
1130
|
+
{
|
|
1131
|
+
short stat = m_stat;
|
|
1132
|
+
const blobHeader* p;
|
|
1133
|
+
const void *tmp = data();
|
|
1134
|
+
setData(&p);
|
|
1135
|
+
tdap(TD_GET_BLOB_BUF);
|
|
1136
|
+
setData((void*)tmp);
|
|
1137
|
+
std::swap(stat, m_stat);
|
|
1138
|
+
|
|
1139
|
+
if (stat)
|
|
1140
|
+
return NULL;
|
|
1141
|
+
return p;
|
|
1142
|
+
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
void table::setBlobFieldPointer(char* ptr, const blobHeader* hd)
|
|
1146
|
+
{
|
|
1147
|
+
if (hd)
|
|
1148
|
+
{
|
|
1149
|
+
assert(hd->curRow < hd->rows);
|
|
1150
|
+
const blobField* f = hd->nextField;
|
|
1151
|
+
for (int i = 0; i < hd->fieldCount; i++)
|
|
1152
|
+
{
|
|
1153
|
+
fielddef& fd = m_tableDef->fieldDefs[f->fieldNum];
|
|
1154
|
+
char* fdptr = ptr + fd.pos;
|
|
1155
|
+
int sizeByte = fd.blobLenBytes();
|
|
1156
|
+
memcpy(fdptr, &f->size, sizeByte);
|
|
1157
|
+
const char* data = f->data();
|
|
1158
|
+
memcpy(fdptr + sizeByte, &data, sizeof(char*));
|
|
1159
|
+
f = f->next();
|
|
1160
|
+
}
|
|
1161
|
+
++hd->curRow;
|
|
1162
|
+
hd->nextField = (blobField*)f;
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
}
|
|
1166
|
+
|
|
1167
|
+
void table::onReadAfter()
|
|
1168
|
+
{
|
|
1169
|
+
m_impl->strBufs.clear();
|
|
1170
|
+
if (valiableFormatType())
|
|
1171
|
+
{
|
|
1172
|
+
m_datalen = unPack((char*)m_pdata, m_datalen);
|
|
1173
|
+
if (m_datalen == 0)
|
|
1174
|
+
m_stat = 22;
|
|
1175
|
+
}
|
|
1176
|
+
if (blobFieldUsed())
|
|
1177
|
+
{
|
|
1178
|
+
const blobHeader* hd = getBlobHeader();
|
|
1179
|
+
setBlobFieldPointer((char*)m_pdata, hd);
|
|
1180
|
+
}
|
|
1181
|
+
if (m_buflen - m_datalen > 0)
|
|
1182
|
+
memset((char*)m_pdata + m_datalen, 0, m_buflen - m_datalen);
|
|
1183
|
+
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
short table::fieldNumByName(const _TCHAR* name)
|
|
1187
|
+
{
|
|
1188
|
+
short i=0;
|
|
1189
|
+
if (name == 0) return i;
|
|
1190
|
+
if (m_impl->fields.size() == 0)
|
|
1191
|
+
{
|
|
1192
|
+
#ifdef _UNICODE
|
|
1193
|
+
wchar_t buf[74];
|
|
1194
|
+
for (i = 0; i < m_tableDef->fieldCount; i++)
|
|
1195
|
+
m_impl->fields.push_back(CFiledNameIndex(i, m_tableDef->fieldDefs[i].name(buf)));
|
|
1196
|
+
#else
|
|
1197
|
+
for (i = 0; i < m_tableDef->fieldCount; i++)
|
|
1198
|
+
m_impl->fields.push_back(CFiledNameIndex(i, m_tableDef->fieldDefs[i].name()));
|
|
1199
|
+
#endif
|
|
1200
|
+
|
|
1201
|
+
sort(m_impl->fields.begin(), m_impl->fields.end());
|
|
1202
|
+
}
|
|
1203
|
+
if (binary_search(m_impl->fields.begin(), m_impl->fields.end(), CFiledNameIndex(0, name)))
|
|
1204
|
+
{
|
|
1205
|
+
std::vector<CFiledNameIndex>::iterator p;
|
|
1206
|
+
p = lower_bound(m_impl->fields.begin(), m_impl->fields.end(), CFiledNameIndex(0, name));
|
|
1207
|
+
return m_impl->fields[p - m_impl->fields.begin()].index;
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
return -1;
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
void* table::fieldPtr(short index)
|
|
1214
|
+
{
|
|
1215
|
+
if (checkIndex(index) == false)
|
|
1216
|
+
return NULL;
|
|
1217
|
+
return (void*)((char*) m_pdata + m_tableDef->fieldDefs[index].pos);
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
void table::setFVA(short index, const char* data)
|
|
1221
|
+
{
|
|
1222
|
+
|
|
1223
|
+
__int64 value;
|
|
1224
|
+
double fltValue;
|
|
1225
|
+
if (checkIndex(index) == false)
|
|
1226
|
+
return;
|
|
1227
|
+
fielddef& fd = m_tableDef->fieldDefs[index];
|
|
1228
|
+
|
|
1229
|
+
char* p = (char*)m_pdata + fd.pos;
|
|
1230
|
+
if (data == NULL)
|
|
1231
|
+
{
|
|
1232
|
+
memset(p, 0, fd.len);
|
|
1233
|
+
return;
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
switch (fd.type)
|
|
1237
|
+
{
|
|
1238
|
+
case ft_string:
|
|
1239
|
+
return store<stringStore, char, char>(p, data, fd, m_impl->cv, m_impl->usePadChar);
|
|
1240
|
+
case ft_note:
|
|
1241
|
+
case ft_zstring: return store<zstringStore, char, char>(p, data, fd, m_impl->cv);
|
|
1242
|
+
case ft_wzstring: return store<wzstringStore, WCHAR, char>(p, data, fd, m_impl->cv);
|
|
1243
|
+
case ft_wstring:
|
|
1244
|
+
return store<wstringStore, WCHAR, char>(p, data, fd, m_impl->cv, m_impl->usePadChar);
|
|
1245
|
+
case ft_mychar: return store<myCharStore, char, char>(p, data, fd, m_impl->cv);
|
|
1246
|
+
case ft_myvarchar: return store<myVarCharStore, char, char>(p, data, fd, m_impl->cv);
|
|
1247
|
+
case ft_lstring:
|
|
1248
|
+
case ft_myvarbinary: return store<myVarBinaryStore, char, char>(p, data, fd, m_impl->cv);
|
|
1249
|
+
case ft_mywchar: return store<myWcharStore, WCHAR, char>(p, data, fd, m_impl->cv);
|
|
1250
|
+
case ft_mywvarchar: return store<myWvarCharStore, WCHAR, char>(p, data, fd, m_impl->cv);
|
|
1251
|
+
case ft_mywvarbinary: return store<myWvarBinaryStore, WCHAR, char>(p, data, fd, m_impl->cv);
|
|
1252
|
+
case ft_myblob:
|
|
1253
|
+
case ft_mytext:
|
|
1254
|
+
{
|
|
1255
|
+
char* tmp = blobStore<char>(p, data, fd, m_impl->cv);
|
|
1256
|
+
m_impl->blobs.push_back(boost::shared_array<char>(tmp));
|
|
1257
|
+
return;
|
|
1258
|
+
}
|
|
1259
|
+
case ft_decimal:
|
|
1260
|
+
case ft_money:
|
|
1261
|
+
case ft_numeric:
|
|
1262
|
+
case ft_bfloat:
|
|
1263
|
+
case ft_numericsts:
|
|
1264
|
+
case ft_numericsa:
|
|
1265
|
+
case ft_currency: // currecy
|
|
1266
|
+
case ft_float: // float double
|
|
1267
|
+
fltValue = atof(data);
|
|
1268
|
+
setFV(index, fltValue);
|
|
1269
|
+
return;
|
|
1270
|
+
case ft_lvar: // Lvar
|
|
1271
|
+
return;
|
|
1272
|
+
|
|
1273
|
+
case ft_date: // date mm/dd/yy
|
|
1274
|
+
value = /*StrToBtrDate*/atobtrd((const char*) data).i;
|
|
1275
|
+
break;
|
|
1276
|
+
case ft_time: // time hh:nn:ss
|
|
1277
|
+
value = /*StrToBtrTime*/atobtrt((const char*)data).i;
|
|
1278
|
+
break;
|
|
1279
|
+
case ft_uinteger:
|
|
1280
|
+
case ft_integer:
|
|
1281
|
+
case ft_autoinc:
|
|
1282
|
+
case ft_bit: value = _atoi64(data);
|
|
1283
|
+
break;
|
|
1284
|
+
case ft_logical:
|
|
1285
|
+
if (m_impl->logicalToString)
|
|
1286
|
+
{
|
|
1287
|
+
char tmp[5];
|
|
1288
|
+
strncpy(tmp, data, 5);
|
|
1289
|
+
if (strcmp(_strupr(tmp), "YES") == 0)
|
|
1290
|
+
value = 1;
|
|
1291
|
+
else
|
|
1292
|
+
value = 0;
|
|
1293
|
+
}
|
|
1294
|
+
else
|
|
1295
|
+
value = atol(data);
|
|
1296
|
+
break;
|
|
1297
|
+
case ft_timestamp:
|
|
1298
|
+
case ft_mytimestamp: value = 0;
|
|
1299
|
+
break;
|
|
1300
|
+
case ft_mydate:
|
|
1301
|
+
{
|
|
1302
|
+
myDate d;
|
|
1303
|
+
d = data;
|
|
1304
|
+
value = d.getValue();
|
|
1305
|
+
break;
|
|
1306
|
+
}
|
|
1307
|
+
case ft_mytime:
|
|
1308
|
+
{
|
|
1309
|
+
myTime t(fd.len);
|
|
1310
|
+
t = data;
|
|
1311
|
+
value = t.getValue();
|
|
1312
|
+
break;
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
case ft_mydatetime:
|
|
1316
|
+
{
|
|
1317
|
+
myDateTime t(fd.len);
|
|
1318
|
+
t = data;
|
|
1319
|
+
value = t.getValue();
|
|
1320
|
+
break;
|
|
1321
|
+
}
|
|
1322
|
+
default: return;
|
|
1323
|
+
}
|
|
1324
|
+
setValue(fd, (uchar_td*)m_pdata, value);
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
#ifdef _WIN32
|
|
1328
|
+
|
|
1329
|
+
void table::setFVW(short index, const wchar_t* data)
|
|
1330
|
+
{
|
|
1331
|
+
|
|
1332
|
+
int value;
|
|
1333
|
+
double fltValue;
|
|
1334
|
+
if (checkIndex(index) == false)
|
|
1335
|
+
return;
|
|
1336
|
+
fielddef& fd = m_tableDef->fieldDefs[index];
|
|
1337
|
+
|
|
1338
|
+
char* p = (char*)m_pdata + fd.pos;
|
|
1339
|
+
if (data == NULL)
|
|
1340
|
+
{
|
|
1341
|
+
memset(p, 0, fd.len);
|
|
1342
|
+
return;
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
switch (fd.type)
|
|
1346
|
+
{
|
|
1347
|
+
case ft_string:
|
|
1348
|
+
return store<stringStore, char, WCHAR>(p, data, fd, m_impl->cv, m_impl->usePadChar);
|
|
1349
|
+
case ft_note:
|
|
1350
|
+
case ft_zstring: return store<zstringStore, char, WCHAR>(p, data, fd, m_impl->cv);
|
|
1351
|
+
case ft_wzstring: return store<wzstringStore, WCHAR, WCHAR>(p, data, fd, m_impl->cv);
|
|
1352
|
+
case ft_wstring:
|
|
1353
|
+
return store<wstringStore, WCHAR, WCHAR>(p, data, fd, m_impl->cv, m_impl->usePadChar);
|
|
1354
|
+
case ft_mychar: return store<myCharStore, char, WCHAR>(p, data, fd, m_impl->cv);
|
|
1355
|
+
case ft_myvarchar: return store<myVarCharStore, char, WCHAR>(p, data, fd, m_impl->cv);
|
|
1356
|
+
case ft_lstring:
|
|
1357
|
+
case ft_myvarbinary: return store<myVarBinaryStore, char, WCHAR>(p, data, fd, m_impl->cv);
|
|
1358
|
+
case ft_mywchar: return store<myWcharStore, WCHAR, WCHAR>(p, data, fd, m_impl->cv);
|
|
1359
|
+
case ft_mywvarchar: return store<myWvarCharStore, WCHAR, WCHAR>(p, data, fd, m_impl->cv);
|
|
1360
|
+
case ft_mywvarbinary: return store<myWvarBinaryStore, WCHAR, WCHAR>(p, data, fd, m_impl->cv);
|
|
1361
|
+
case ft_myblob:
|
|
1362
|
+
case ft_mytext:
|
|
1363
|
+
{
|
|
1364
|
+
char* tmp = blobStore<WCHAR>(p, data, fd, m_impl->cv);
|
|
1365
|
+
m_impl->blobs.push_back(boost::shared_array<char>(tmp));
|
|
1366
|
+
return;
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
case ft_date: // date mm/dd/yy
|
|
1370
|
+
value = /*StrToBtrDate*/atobtrd(data).i;
|
|
1371
|
+
setFV(index, value);
|
|
1372
|
+
break;
|
|
1373
|
+
case ft_time: // time hh:nn:ss
|
|
1374
|
+
value = /*StrToBtrTime*/atobtrt(data).i;
|
|
1375
|
+
setFV(index, value);
|
|
1376
|
+
return;
|
|
1377
|
+
|
|
1378
|
+
case ft_uinteger:
|
|
1379
|
+
case ft_integer:
|
|
1380
|
+
case ft_autoinc:
|
|
1381
|
+
case ft_bit:
|
|
1382
|
+
{
|
|
1383
|
+
__int64 v = _wtoi64(data);
|
|
1384
|
+
setFV(index, v);
|
|
1385
|
+
break;
|
|
1386
|
+
}
|
|
1387
|
+
case ft_logical:
|
|
1388
|
+
if (m_impl->logicalToString)
|
|
1389
|
+
{
|
|
1390
|
+
wchar_t tmp[5];
|
|
1391
|
+
wcsncpy(tmp, data, 5);
|
|
1392
|
+
|
|
1393
|
+
if (wcscmp(_wcsupr(tmp), L"YES") == 0)
|
|
1394
|
+
value = 1;
|
|
1395
|
+
else
|
|
1396
|
+
value = 0;
|
|
1397
|
+
}
|
|
1398
|
+
else
|
|
1399
|
+
value = _wtol(data);
|
|
1400
|
+
setFV(index, value);
|
|
1401
|
+
break;
|
|
1402
|
+
|
|
1403
|
+
case ft_decimal:
|
|
1404
|
+
case ft_money:
|
|
1405
|
+
case ft_numeric:
|
|
1406
|
+
case ft_bfloat:
|
|
1407
|
+
case ft_numericsts:
|
|
1408
|
+
case ft_numericsa:
|
|
1409
|
+
case ft_currency:
|
|
1410
|
+
case ft_float: fltValue = _wtof(data);
|
|
1411
|
+
setFV(index, fltValue);
|
|
1412
|
+
break;
|
|
1413
|
+
case ft_timestamp:
|
|
1414
|
+
{
|
|
1415
|
+
__int64 v = 0;
|
|
1416
|
+
setFV(index, v);
|
|
1417
|
+
return;
|
|
1418
|
+
}
|
|
1419
|
+
case ft_mydate:
|
|
1420
|
+
{
|
|
1421
|
+
myDate d;
|
|
1422
|
+
d = data;
|
|
1423
|
+
setValue(fd, (uchar_td *)m_pdata, d.getValue());
|
|
1424
|
+
return;
|
|
1425
|
+
}
|
|
1426
|
+
case ft_mytime:
|
|
1427
|
+
{
|
|
1428
|
+
myTime t(fd.len);
|
|
1429
|
+
t = data;
|
|
1430
|
+
setValue(fd, (uchar_td*)m_pdata, t.getValue());
|
|
1431
|
+
return;
|
|
1432
|
+
}
|
|
1433
|
+
case ft_mydatetime:
|
|
1434
|
+
{
|
|
1435
|
+
myDateTime t(fd.len);
|
|
1436
|
+
t = data;
|
|
1437
|
+
setFV(index, t.getValue());
|
|
1438
|
+
return;
|
|
1439
|
+
}
|
|
1440
|
+
case ft_mytimestamp:
|
|
1441
|
+
case ft_lvar: break;
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1444
|
+
}
|
|
1445
|
+
|
|
1446
|
+
void table::setFVW(const _TCHAR* FieldName, const wchar_t* data)
|
|
1447
|
+
{
|
|
1448
|
+
short index = fieldNumByName(FieldName);
|
|
1449
|
+
setFVW(index, data);
|
|
1450
|
+
}
|
|
1451
|
+
|
|
1452
|
+
#endif //_WIN32
|
|
1453
|
+
|
|
1454
|
+
void table::setFV(short index, unsigned char data)
|
|
1455
|
+
{
|
|
1456
|
+
int value = (long)data;
|
|
1457
|
+
setFV(index, value);
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
void table::setFV(short index, int data)
|
|
1461
|
+
{
|
|
1462
|
+
char buf[20];
|
|
1463
|
+
double d;
|
|
1464
|
+
if (checkIndex(index) == false)
|
|
1465
|
+
return;
|
|
1466
|
+
int v = data;
|
|
1467
|
+
fielddef& fd = m_tableDef->fieldDefs[index];
|
|
1468
|
+
switch (fd.type)
|
|
1469
|
+
{
|
|
1470
|
+
|
|
1471
|
+
case ft_mydate:
|
|
1472
|
+
{
|
|
1473
|
+
myDate myd;
|
|
1474
|
+
myd.setValue(data, m_impl->myDateTimeValueByBtrv);
|
|
1475
|
+
setValue(fd, (uchar_td*)m_pdata, myd.getValue());
|
|
1476
|
+
break;
|
|
1477
|
+
}
|
|
1478
|
+
case ft_mytime:
|
|
1479
|
+
{
|
|
1480
|
+
myTime myt(fd.len);
|
|
1481
|
+
myt.setValue(data, m_impl->myDateTimeValueByBtrv);
|
|
1482
|
+
setValue(fd, (uchar_td*)m_pdata, myt.getValue());
|
|
1483
|
+
break;
|
|
1484
|
+
}
|
|
1485
|
+
case ft_integer:
|
|
1486
|
+
case ft_date:
|
|
1487
|
+
case ft_time:
|
|
1488
|
+
case ft_uinteger:
|
|
1489
|
+
case ft_logical:
|
|
1490
|
+
case ft_autoinc:
|
|
1491
|
+
case ft_bit:
|
|
1492
|
+
case ft_mydatetime:
|
|
1493
|
+
switch (m_tableDef->fieldDefs[index].len)
|
|
1494
|
+
{
|
|
1495
|
+
case 1: *((char*)((char*)m_pdata + fd.pos)) = (char) v;
|
|
1496
|
+
break;
|
|
1497
|
+
case 2: *((short*)((char*)m_pdata + fd.pos)) = (short)v;
|
|
1498
|
+
break;
|
|
1499
|
+
case 3: memcpy((char*)m_pdata + fd.pos, &v, 3);
|
|
1500
|
+
break;
|
|
1501
|
+
case 4: *((int*)((char*)m_pdata + fd.pos)) = v;
|
|
1502
|
+
break;
|
|
1503
|
+
case 8: *((__int64*)((char*)m_pdata + fd.pos)) = v;
|
|
1504
|
+
break;
|
|
1505
|
+
}
|
|
1506
|
+
break;
|
|
1507
|
+
|
|
1508
|
+
case ft_timestamp:
|
|
1509
|
+
{
|
|
1510
|
+
__int64 v = 0;
|
|
1511
|
+
setFV(index, v);
|
|
1512
|
+
return;
|
|
1513
|
+
}
|
|
1514
|
+
case ft_decimal:
|
|
1515
|
+
case ft_money:
|
|
1516
|
+
case ft_numeric:
|
|
1517
|
+
case ft_bfloat:
|
|
1518
|
+
case ft_numericsts:
|
|
1519
|
+
case ft_numericsa:
|
|
1520
|
+
|
|
1521
|
+
case ft_currency:
|
|
1522
|
+
case ft_float: d = (double)data;
|
|
1523
|
+
setFV(index, d);
|
|
1524
|
+
break;
|
|
1525
|
+
case ft_string:
|
|
1526
|
+
case ft_zstring:
|
|
1527
|
+
case ft_note:
|
|
1528
|
+
case ft_myvarbinary:
|
|
1529
|
+
case ft_myvarchar:
|
|
1530
|
+
case ft_mychar:
|
|
1531
|
+
if (data == 0)
|
|
1532
|
+
setFVA(index, "");
|
|
1533
|
+
else
|
|
1534
|
+
{
|
|
1535
|
+
_ltoa_s(data, buf, 20, 10);
|
|
1536
|
+
setFVA(index, buf);
|
|
1537
|
+
}
|
|
1538
|
+
break;
|
|
1539
|
+
case ft_mywvarbinary:
|
|
1540
|
+
case ft_mywvarchar:
|
|
1541
|
+
case ft_mywchar:
|
|
1542
|
+
case ft_wstring:
|
|
1543
|
+
case ft_wzstring:
|
|
1544
|
+
{
|
|
1545
|
+
if (data == 0)
|
|
1546
|
+
setFV(index, _T(""));
|
|
1547
|
+
else
|
|
1548
|
+
{
|
|
1549
|
+
_TCHAR buf[30];
|
|
1550
|
+
_ltot_s(data, buf, 30, 10);
|
|
1551
|
+
setFV(index, buf);
|
|
1552
|
+
}
|
|
1553
|
+
break;
|
|
1554
|
+
}
|
|
1555
|
+
case ft_lvar: break;
|
|
1556
|
+
|
|
1557
|
+
}
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1560
|
+
void table::setFV(short index, double data)
|
|
1561
|
+
{
|
|
1562
|
+
char buf[20];
|
|
1563
|
+
__int64 i64;
|
|
1564
|
+
if (checkIndex(index) == false)
|
|
1565
|
+
return;
|
|
1566
|
+
|
|
1567
|
+
switch (m_tableDef->fieldDefs[index].type)
|
|
1568
|
+
{
|
|
1569
|
+
case ft_currency: // currency
|
|
1570
|
+
i64 = (__int64)(data * 10000 + 0.5);
|
|
1571
|
+
setFV(index, i64);
|
|
1572
|
+
break;
|
|
1573
|
+
case ft_bfloat: // bfloat
|
|
1574
|
+
case ft_float:
|
|
1575
|
+
switch (m_tableDef->fieldDefs[index].len)
|
|
1576
|
+
{
|
|
1577
|
+
case 4: *((float*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos)) = (float)data;
|
|
1578
|
+
break;
|
|
1579
|
+
case 8: *((double*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos)) = data;
|
|
1580
|
+
break;
|
|
1581
|
+
default:
|
|
1582
|
+
break;
|
|
1583
|
+
}
|
|
1584
|
+
break;
|
|
1585
|
+
case ft_decimal:
|
|
1586
|
+
case ft_money: setFVDecimal(index, data);
|
|
1587
|
+
break;
|
|
1588
|
+
case ft_numeric:
|
|
1589
|
+
case ft_numericsts:
|
|
1590
|
+
case ft_numericsa: setFVNumeric(index, data);
|
|
1591
|
+
break;
|
|
1592
|
+
|
|
1593
|
+
case ft_integer:
|
|
1594
|
+
case ft_date:
|
|
1595
|
+
case ft_time:
|
|
1596
|
+
case ft_uinteger:
|
|
1597
|
+
case ft_logical:
|
|
1598
|
+
case ft_autoinc:
|
|
1599
|
+
case ft_timestamp:
|
|
1600
|
+
case ft_bit:
|
|
1601
|
+
case ft_mydate:
|
|
1602
|
+
case ft_mytime:
|
|
1603
|
+
case ft_mydatetime:
|
|
1604
|
+
case ft_mytimestamp: i64 = (__int64)data;
|
|
1605
|
+
setFV(index, i64);
|
|
1606
|
+
break;
|
|
1607
|
+
case ft_string:
|
|
1608
|
+
case ft_zstring:
|
|
1609
|
+
case ft_note:
|
|
1610
|
+
case ft_myvarbinary:
|
|
1611
|
+
case ft_myvarchar:
|
|
1612
|
+
case ft_mychar:
|
|
1613
|
+
if (data == 0)
|
|
1614
|
+
setFVA(index, "");
|
|
1615
|
+
else
|
|
1616
|
+
{
|
|
1617
|
+
sprintf(buf, "%f", data);
|
|
1618
|
+
setFVA(index, buf);
|
|
1619
|
+
break;
|
|
1620
|
+
}
|
|
1621
|
+
case ft_lvar: break;
|
|
1622
|
+
case ft_mywvarbinary:
|
|
1623
|
+
case ft_mywvarchar:
|
|
1624
|
+
case ft_mywchar:
|
|
1625
|
+
case ft_wstring:
|
|
1626
|
+
case ft_wzstring:
|
|
1627
|
+
{
|
|
1628
|
+
if (data == 0)
|
|
1629
|
+
setFV(index, _T(""));
|
|
1630
|
+
else
|
|
1631
|
+
{
|
|
1632
|
+
_TCHAR buf[40];
|
|
1633
|
+
_stprintf_s(buf, 40, _T("%f"), data);
|
|
1634
|
+
setFV(index, buf);
|
|
1635
|
+
}
|
|
1636
|
+
break;
|
|
1637
|
+
}
|
|
1638
|
+
}
|
|
1639
|
+
}
|
|
1640
|
+
|
|
1641
|
+
void table::setFV(short index, bool data)
|
|
1642
|
+
{
|
|
1643
|
+
int value = (int)data;
|
|
1644
|
+
setFV(index, value);
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
void table::setFV(short index, short data)
|
|
1648
|
+
{
|
|
1649
|
+
int value = (int)data;
|
|
1650
|
+
setFV(index, value);
|
|
1651
|
+
}
|
|
1652
|
+
|
|
1653
|
+
void table::setFV(short index, float data)
|
|
1654
|
+
{
|
|
1655
|
+
double value = (double)data;
|
|
1656
|
+
setFV(index, value);
|
|
1657
|
+
|
|
1658
|
+
}
|
|
1659
|
+
|
|
1660
|
+
short table::getFVsht(short index) {return (short)getFVlng(index);}
|
|
1661
|
+
|
|
1662
|
+
int table::getFVlng(short index)
|
|
1663
|
+
{
|
|
1664
|
+
int ret = 0;
|
|
1665
|
+
|
|
1666
|
+
if (checkIndex(index) == false)
|
|
1667
|
+
return 0;
|
|
1668
|
+
fielddef& fd = m_tableDef->fieldDefs[index];
|
|
1669
|
+
switch (fd.type)
|
|
1670
|
+
{
|
|
1671
|
+
case ft_integer:
|
|
1672
|
+
case ft_autoinc:
|
|
1673
|
+
switch (fd.len)
|
|
1674
|
+
{
|
|
1675
|
+
case 1: ret = *(((char*)m_pdata + fd.pos));
|
|
1676
|
+
break;
|
|
1677
|
+
case 2: ret = *((short*)((char*)m_pdata + fd.pos));
|
|
1678
|
+
break;
|
|
1679
|
+
case 3: memcpy(&ret, (char*)m_pdata + fd.pos, 3);
|
|
1680
|
+
ret = ((ret & 0xFFFFFF) << 8) / 0x100;
|
|
1681
|
+
break;
|
|
1682
|
+
case 8:
|
|
1683
|
+
case 4: ret = *((int*)((char*)m_pdata + fd.pos));
|
|
1684
|
+
break;
|
|
1685
|
+
}
|
|
1686
|
+
break;
|
|
1687
|
+
case ft_uinteger:
|
|
1688
|
+
case ft_logical:
|
|
1689
|
+
case ft_bit:
|
|
1690
|
+
case ft_date:
|
|
1691
|
+
case ft_time:
|
|
1692
|
+
case ft_timestamp:
|
|
1693
|
+
case ft_mydatetime:
|
|
1694
|
+
case ft_mytimestamp:
|
|
1695
|
+
switch (fd.len)
|
|
1696
|
+
{
|
|
1697
|
+
case 1: ret = *((unsigned char*)((char*)m_pdata + fd.pos));
|
|
1698
|
+
break;
|
|
1699
|
+
case 2: ret = *((unsigned short*)((char*)m_pdata + fd.pos));
|
|
1700
|
+
break;
|
|
1701
|
+
case 3: memcpy(&ret, (char*)m_pdata + fd.pos, 3);
|
|
1702
|
+
break;
|
|
1703
|
+
case 8:
|
|
1704
|
+
case 4:
|
|
1705
|
+
ret = *((unsigned int*)((char*)m_pdata + fd.pos));
|
|
1706
|
+
break;
|
|
1707
|
+
}
|
|
1708
|
+
break;
|
|
1709
|
+
case ft_mydate:
|
|
1710
|
+
{
|
|
1711
|
+
myDate myd;
|
|
1712
|
+
myd.setValue((int)getValue64(fd, (const uchar_td*)m_pdata));
|
|
1713
|
+
ret = myd.getValue(m_impl->myDateTimeValueByBtrv);
|
|
1714
|
+
break;
|
|
1715
|
+
}
|
|
1716
|
+
case ft_mytime:
|
|
1717
|
+
{
|
|
1718
|
+
myTime myt(fd.len);
|
|
1719
|
+
myt.setValue((int)getValue64(fd, (const uchar_td*)m_pdata));
|
|
1720
|
+
ret = (int)myt.getValue(m_impl->myDateTimeValueByBtrv);
|
|
1721
|
+
break; ;
|
|
1722
|
+
}
|
|
1723
|
+
case ft_string:
|
|
1724
|
+
case ft_zstring:
|
|
1725
|
+
case ft_note:
|
|
1726
|
+
case ft_myvarbinary:
|
|
1727
|
+
case ft_myvarchar:
|
|
1728
|
+
case ft_mychar: ret = atol(getFVAstr(index));
|
|
1729
|
+
break;
|
|
1730
|
+
case ft_wstring:
|
|
1731
|
+
case ft_wzstring:
|
|
1732
|
+
case ft_mywvarbinary:
|
|
1733
|
+
case ft_mywvarchar:
|
|
1734
|
+
case ft_mywchar: ret = _ttol(getFVstr(index));
|
|
1735
|
+
break;
|
|
1736
|
+
case ft_currency: ret = (long)(*((__int64*)((char*)m_pdata + fd.pos)) / 10000);
|
|
1737
|
+
break;
|
|
1738
|
+
case ft_bfloat:
|
|
1739
|
+
case ft_float: ret = (long)getFVdbl(index);
|
|
1740
|
+
break;
|
|
1741
|
+
case ft_decimal:
|
|
1742
|
+
case ft_money: ret = (long)getFVDecimal(index);
|
|
1743
|
+
break;
|
|
1744
|
+
case ft_numeric:
|
|
1745
|
+
case ft_numericsts:
|
|
1746
|
+
case ft_numericsa: ret = (long)getFVnumeric(index);
|
|
1747
|
+
break;
|
|
1748
|
+
|
|
1749
|
+
case ft_lvar: break;
|
|
1750
|
+
default: return 0;
|
|
1751
|
+
}
|
|
1752
|
+
return ret;
|
|
1753
|
+
}
|
|
1754
|
+
|
|
1755
|
+
float table::getFVflt(short index) {return (float) getFVdbl(index);}
|
|
1756
|
+
|
|
1757
|
+
double table::getFVdbl(short index)
|
|
1758
|
+
{
|
|
1759
|
+
double ret = 0;
|
|
1760
|
+
if (checkIndex(index) == false)
|
|
1761
|
+
return 0;
|
|
1762
|
+
switch (m_tableDef->fieldDefs[index].type)
|
|
1763
|
+
{
|
|
1764
|
+
case ft_currency:
|
|
1765
|
+
ret = (double) * ((__int64*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos));
|
|
1766
|
+
ret = ret / 10000;
|
|
1767
|
+
break;
|
|
1768
|
+
|
|
1769
|
+
case ft_bfloat:
|
|
1770
|
+
case ft_timestamp:
|
|
1771
|
+
case ft_float:
|
|
1772
|
+
switch (m_tableDef->fieldDefs[index].len)
|
|
1773
|
+
{
|
|
1774
|
+
case 4: ret = (double) * ((float*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos));
|
|
1775
|
+
break;
|
|
1776
|
+
case 10: // long double
|
|
1777
|
+
case 8: ret = (double) * ((double*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos));
|
|
1778
|
+
break;
|
|
1779
|
+
}
|
|
1780
|
+
break;
|
|
1781
|
+
case ft_string:
|
|
1782
|
+
case ft_zstring:
|
|
1783
|
+
case ft_note:
|
|
1784
|
+
case ft_myvarbinary:
|
|
1785
|
+
case ft_myvarchar:
|
|
1786
|
+
case ft_mychar: ret = atof(getFVAstr(index));
|
|
1787
|
+
break;
|
|
1788
|
+
case ft_wstring:
|
|
1789
|
+
case ft_wzstring:
|
|
1790
|
+
case ft_mywvarbinary:
|
|
1791
|
+
case ft_mywvarchar:
|
|
1792
|
+
case ft_mywchar: ret = _ttof(getFVstr(index));
|
|
1793
|
+
break;
|
|
1794
|
+
case ft_integer:
|
|
1795
|
+
case ft_date:
|
|
1796
|
+
case ft_time:
|
|
1797
|
+
case ft_uinteger:
|
|
1798
|
+
case ft_logical:
|
|
1799
|
+
case ft_autoinc:
|
|
1800
|
+
case ft_bit:
|
|
1801
|
+
case ft_mydate:
|
|
1802
|
+
case ft_mytime:
|
|
1803
|
+
case ft_mydatetime:
|
|
1804
|
+
case ft_mytimestamp: ret = (double)getFV64(index);
|
|
1805
|
+
break;
|
|
1806
|
+
|
|
1807
|
+
case ft_decimal:
|
|
1808
|
+
case ft_money: ret = getFVDecimal(index);
|
|
1809
|
+
break;
|
|
1810
|
+
case ft_numeric:
|
|
1811
|
+
case ft_numericsts:
|
|
1812
|
+
case ft_numericsa: ret = getFVnumeric(index);
|
|
1813
|
+
break;
|
|
1814
|
+
case ft_lvar: break;
|
|
1815
|
+
default: return 0;
|
|
1816
|
+
}
|
|
1817
|
+
return ret;
|
|
1818
|
+
}
|
|
1819
|
+
|
|
1820
|
+
unsigned char table::getFVbyt(short index) {return (unsigned char)getFVlng(index);}
|
|
1821
|
+
|
|
1822
|
+
#ifdef _WIN32
|
|
1823
|
+
|
|
1824
|
+
const wchar_t* table::getFVWstr(short index)
|
|
1825
|
+
{
|
|
1826
|
+
|
|
1827
|
+
if (checkIndex(index) == false)
|
|
1828
|
+
return NULL;
|
|
1829
|
+
|
|
1830
|
+
fielddef& fd = m_tableDef->fieldDefs[index];
|
|
1831
|
+
char* data = (char*)m_pdata + fd.pos;
|
|
1832
|
+
switch (fd.type)
|
|
1833
|
+
{
|
|
1834
|
+
case ft_string:
|
|
1835
|
+
return read<stringStore, char, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv,
|
|
1836
|
+
m_impl->trimPadChar);
|
|
1837
|
+
case ft_note:
|
|
1838
|
+
case ft_zstring: return read<zstringStore, char, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1839
|
+
case ft_wzstring:
|
|
1840
|
+
return read<wzstringStore, WCHAR, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1841
|
+
case ft_wstring:
|
|
1842
|
+
return read<wstringStore, WCHAR, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv,
|
|
1843
|
+
m_impl->trimPadChar);
|
|
1844
|
+
case ft_mychar:
|
|
1845
|
+
return read<myCharStore, char, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv,
|
|
1846
|
+
m_impl->trimPadChar);
|
|
1847
|
+
case ft_myvarchar:
|
|
1848
|
+
return read<myVarCharStore, char, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1849
|
+
case ft_lstring:
|
|
1850
|
+
case ft_myvarbinary:
|
|
1851
|
+
return read<myVarBinaryStore, char, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1852
|
+
case ft_mywchar:
|
|
1853
|
+
return read<myWcharStore, WCHAR, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv,
|
|
1854
|
+
m_impl->trimPadChar);
|
|
1855
|
+
case ft_mywvarchar:
|
|
1856
|
+
return read<myWvarCharStore, WCHAR, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1857
|
+
case ft_mywvarbinary:
|
|
1858
|
+
return read<myWvarBinaryStore, WCHAR, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1859
|
+
case ft_myblob:
|
|
1860
|
+
case ft_mytext: return readBlob<WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1861
|
+
}
|
|
1862
|
+
wchar_t* p = (wchar_t*) m_impl->strBufs.getPtrW(max(fd.len * 2, 50));
|
|
1863
|
+
|
|
1864
|
+
wchar_t buf[10] = L"%0.";
|
|
1865
|
+
|
|
1866
|
+
switch (fd.type)
|
|
1867
|
+
{
|
|
1868
|
+
|
|
1869
|
+
case ft_integer:
|
|
1870
|
+
case ft_bit:
|
|
1871
|
+
case ft_autoinc: _i64tow_s(getFV64(index), p, 50, 10);
|
|
1872
|
+
return p;
|
|
1873
|
+
case ft_logical:
|
|
1874
|
+
if (m_impl->logicalToString)
|
|
1875
|
+
{
|
|
1876
|
+
if (getFVlng(index))
|
|
1877
|
+
return L"Yes";
|
|
1878
|
+
else
|
|
1879
|
+
return L"No";
|
|
1880
|
+
}
|
|
1881
|
+
else
|
|
1882
|
+
_i64tow_s(getFV64(index), p, 50, 10);
|
|
1883
|
+
|
|
1884
|
+
case ft_bfloat:
|
|
1885
|
+
case ft_float:
|
|
1886
|
+
case ft_currency:
|
|
1887
|
+
{
|
|
1888
|
+
|
|
1889
|
+
swprintf_s(p, 50, L"%lf", getFVdbl(index));
|
|
1890
|
+
int k = (int)wcslen(p) - 1;
|
|
1891
|
+
while (k >= 0)
|
|
1892
|
+
{
|
|
1893
|
+
if (p[k] == L'0')
|
|
1894
|
+
p[k] = 0x00;
|
|
1895
|
+
else if (p[k] == L'.')
|
|
1896
|
+
{
|
|
1897
|
+
p[k] = 0x00;
|
|
1898
|
+
break;
|
|
1899
|
+
}
|
|
1900
|
+
else
|
|
1901
|
+
break;
|
|
1902
|
+
k--;
|
|
1903
|
+
}
|
|
1904
|
+
break;
|
|
1905
|
+
}
|
|
1906
|
+
case ft_uinteger: swprintf_s(p, 50, L"%u", getFVlng(index));
|
|
1907
|
+
break;
|
|
1908
|
+
case ft_date: return btrdtoa(getFVlng(index), p);
|
|
1909
|
+
case ft_time: return btrttoa(getFVlng(index), p);
|
|
1910
|
+
case ft_mydate:
|
|
1911
|
+
{
|
|
1912
|
+
myDate d;
|
|
1913
|
+
d.setValue((int)getValue64(fd, (const uchar_td*)m_pdata));
|
|
1914
|
+
return d.toStr(p, m_impl->myDateTimeValueByBtrv);
|
|
1915
|
+
}
|
|
1916
|
+
case ft_mytime:
|
|
1917
|
+
{
|
|
1918
|
+
|
|
1919
|
+
myTime t(fd.len);
|
|
1920
|
+
t.setValue(getValue64(fd, (const uchar_td*)m_pdata));
|
|
1921
|
+
return t.toStr(p);
|
|
1922
|
+
|
|
1923
|
+
}
|
|
1924
|
+
case ft_mydatetime:
|
|
1925
|
+
{
|
|
1926
|
+
myDateTime t(fd.len);
|
|
1927
|
+
t.setValue(getFV64(index));
|
|
1928
|
+
return t.toStr(p);
|
|
1929
|
+
}
|
|
1930
|
+
case ft_mytimestamp:
|
|
1931
|
+
{
|
|
1932
|
+
myTimeStamp ts(fd.len);
|
|
1933
|
+
ts.setValue(getFV64(index));
|
|
1934
|
+
return ts.toStr(p);
|
|
1935
|
+
}
|
|
1936
|
+
case ft_decimal:
|
|
1937
|
+
case ft_money:
|
|
1938
|
+
case ft_numeric:
|
|
1939
|
+
case ft_numericsts:
|
|
1940
|
+
case ft_numericsa: _ltow_s(fd.decimals, p, 50, 10);
|
|
1941
|
+
wcscat(buf, p);
|
|
1942
|
+
wcscat(buf, L"lf");
|
|
1943
|
+
swprintf(p, 50, buf, getFVdbl(index));
|
|
1944
|
+
break;
|
|
1945
|
+
case ft_lvar: return NULL;
|
|
1946
|
+
case ft_timestamp: return btrTimeStamp(getFV64(index)).toString(p);
|
|
1947
|
+
default: p[0] = 0x00;
|
|
1948
|
+
}
|
|
1949
|
+
return p;
|
|
1950
|
+
}
|
|
1951
|
+
|
|
1952
|
+
const wchar_t* table::getFVWstr(const _TCHAR* FieldName)
|
|
1953
|
+
{
|
|
1954
|
+
short index = fieldNumByName(FieldName);
|
|
1955
|
+
return getFVWstr(index);
|
|
1956
|
+
|
|
1957
|
+
}
|
|
1958
|
+
#endif //_WIN32
|
|
1959
|
+
|
|
1960
|
+
const char* table::getFVAstr(short index)
|
|
1961
|
+
{
|
|
1962
|
+
char buf[10] = "%0.";
|
|
1963
|
+
|
|
1964
|
+
if (checkIndex(index) == false)
|
|
1965
|
+
return NULL;
|
|
1966
|
+
fielddef& fd = m_tableDef->fieldDefs[index];
|
|
1967
|
+
|
|
1968
|
+
char* data = (char*)m_pdata + fd.pos;
|
|
1969
|
+
switch (fd.type)
|
|
1970
|
+
{
|
|
1971
|
+
|
|
1972
|
+
case ft_string:
|
|
1973
|
+
return read<stringStore, char, char>(data, &m_impl->strBufs, fd, m_impl->cv,
|
|
1974
|
+
m_impl->trimPadChar);
|
|
1975
|
+
case ft_note:
|
|
1976
|
+
case ft_zstring: return read<zstringStore, char, char>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1977
|
+
case ft_wzstring:
|
|
1978
|
+
return read<wzstringStore, WCHAR, char>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1979
|
+
case ft_wstring:
|
|
1980
|
+
return read<wstringStore, WCHAR, char>(data, &m_impl->strBufs, fd, m_impl->cv,
|
|
1981
|
+
m_impl->trimPadChar);
|
|
1982
|
+
case ft_mychar:
|
|
1983
|
+
return read<myCharStore, char, char>(data, &m_impl->strBufs, fd, m_impl->cv,
|
|
1984
|
+
m_impl->trimPadChar);
|
|
1985
|
+
case ft_myvarchar:
|
|
1986
|
+
return read<myVarCharStore, char, char>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1987
|
+
case ft_lstring:
|
|
1988
|
+
case ft_myvarbinary:
|
|
1989
|
+
return read<myVarBinaryStore, char, char>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1990
|
+
case ft_mywchar:
|
|
1991
|
+
return read<myWcharStore, WCHAR, char>(data, &m_impl->strBufs, fd, m_impl->cv,
|
|
1992
|
+
m_impl->trimPadChar);
|
|
1993
|
+
case ft_mywvarchar:
|
|
1994
|
+
return read<myWvarCharStore, WCHAR, char>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1995
|
+
case ft_mywvarbinary:
|
|
1996
|
+
return read<myWvarBinaryStore, WCHAR, char>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1997
|
+
case ft_myblob:
|
|
1998
|
+
case ft_mytext: return readBlob<char>(data, &m_impl->strBufs, fd, m_impl->cv);
|
|
1999
|
+
}
|
|
2000
|
+
char* p = m_impl->strBufs.getPtrA(max(fd.len * 2, 50));
|
|
2001
|
+
switch (fd.type)
|
|
2002
|
+
{
|
|
2003
|
+
case ft_integer:
|
|
2004
|
+
case ft_bit:
|
|
2005
|
+
case ft_autoinc: _i64toa_s(getFV64(index), p, 50, 10);
|
|
2006
|
+
return p;
|
|
2007
|
+
case ft_logical:
|
|
2008
|
+
if (m_impl->logicalToString)
|
|
2009
|
+
{
|
|
2010
|
+
if (getFVlng(index))
|
|
2011
|
+
return "Yes";
|
|
2012
|
+
else
|
|
2013
|
+
return "No";
|
|
2014
|
+
}
|
|
2015
|
+
else
|
|
2016
|
+
_i64toa_s(getFV64(index), p, 50, 10);
|
|
2017
|
+
break;
|
|
2018
|
+
case ft_bfloat:
|
|
2019
|
+
case ft_float:
|
|
2020
|
+
case ft_currency:
|
|
2021
|
+
{
|
|
2022
|
+
sprintf(p, "%lf", getFVdbl(index));
|
|
2023
|
+
size_t k = strlen(p) - 1;
|
|
2024
|
+
while (1)
|
|
2025
|
+
{
|
|
2026
|
+
if (p[k] == '0')
|
|
2027
|
+
p[k] = 0x00;
|
|
2028
|
+
else if (p[k] == '.')
|
|
2029
|
+
{
|
|
2030
|
+
p[k] = 0x00;
|
|
2031
|
+
break;
|
|
2032
|
+
}
|
|
2033
|
+
else
|
|
2034
|
+
break;
|
|
2035
|
+
k--;
|
|
2036
|
+
}
|
|
2037
|
+
break;
|
|
2038
|
+
}
|
|
2039
|
+
case ft_date: return btrdtoa(getFVlng(index), p);
|
|
2040
|
+
case ft_time: return btrttoa(getFVlng(index), p);
|
|
2041
|
+
case ft_uinteger: sprintf(p, "%u", getFVlng(index));
|
|
2042
|
+
break;
|
|
2043
|
+
|
|
2044
|
+
case ft_mydate:
|
|
2045
|
+
{
|
|
2046
|
+
myDate d;
|
|
2047
|
+
d.setValue((int)getValue64(fd, (const uchar_td*)m_pdata));
|
|
2048
|
+
return d.toStr(p, m_impl->myDateTimeValueByBtrv);
|
|
2049
|
+
}
|
|
2050
|
+
case ft_mytime:
|
|
2051
|
+
{
|
|
2052
|
+
myTime t(fd.len);
|
|
2053
|
+
t.setValue(getValue64(fd, (const uchar_td*)m_pdata));
|
|
2054
|
+
return t.toStr(p);
|
|
2055
|
+
}
|
|
2056
|
+
case ft_mytimestamp:
|
|
2057
|
+
{
|
|
2058
|
+
myTimeStamp ts(fd.len);
|
|
2059
|
+
ts.setValue(getFV64(index));
|
|
2060
|
+
return ts.toStr(p);
|
|
2061
|
+
}
|
|
2062
|
+
case ft_mydatetime:
|
|
2063
|
+
{
|
|
2064
|
+
myDateTime t(fd.len);
|
|
2065
|
+
t.setValue(getFV64(index));
|
|
2066
|
+
return t.toStr(p);
|
|
2067
|
+
}
|
|
2068
|
+
case ft_decimal:
|
|
2069
|
+
case ft_money:
|
|
2070
|
+
case ft_numeric:
|
|
2071
|
+
case ft_numericsts:
|
|
2072
|
+
case ft_numericsa: _ltoa_s(fd.decimals, p, 50, 10);
|
|
2073
|
+
strcat(buf, p);
|
|
2074
|
+
strcat(buf, "lf");
|
|
2075
|
+
sprintf_s(p, 50, buf, getFVdbl(index));
|
|
2076
|
+
break;
|
|
2077
|
+
case ft_lvar: return NULL;
|
|
2078
|
+
case ft_timestamp: return btrTimeStamp(getFV64(index)).toString(p);
|
|
2079
|
+
default: p[0] = 0x00;
|
|
2080
|
+
}
|
|
2081
|
+
return p;
|
|
2082
|
+
}
|
|
2083
|
+
|
|
2084
|
+
int table::getFVint(short index) {return (int)getFVlng(index);}
|
|
2085
|
+
|
|
2086
|
+
int table::getFVint(const _TCHAR* FieldName)
|
|
2087
|
+
{
|
|
2088
|
+
short index = fieldNumByName(FieldName);
|
|
2089
|
+
return (int)getFVlng(index);
|
|
2090
|
+
|
|
2091
|
+
}
|
|
2092
|
+
|
|
2093
|
+
int table::getFVlng(const _TCHAR* FieldName)
|
|
2094
|
+
{
|
|
2095
|
+
short index = fieldNumByName(FieldName);
|
|
2096
|
+
return getFVlng(index);
|
|
2097
|
+
}
|
|
2098
|
+
|
|
2099
|
+
const char* table::getFVAstr(const _TCHAR* FieldName)
|
|
2100
|
+
{
|
|
2101
|
+
short index = fieldNumByName(FieldName);
|
|
2102
|
+
return getFVAstr(index);
|
|
2103
|
+
}
|
|
2104
|
+
|
|
2105
|
+
double table::getFVdbl(const _TCHAR* FieldName)
|
|
2106
|
+
{
|
|
2107
|
+
short index = fieldNumByName(FieldName);
|
|
2108
|
+
return getFVdbl(index);
|
|
2109
|
+
}
|
|
2110
|
+
|
|
2111
|
+
unsigned char table::getFVbyt(const _TCHAR* FieldName)
|
|
2112
|
+
{
|
|
2113
|
+
short index = fieldNumByName(FieldName);
|
|
2114
|
+
return getFVbyt(index);
|
|
2115
|
+
}
|
|
2116
|
+
|
|
2117
|
+
short table::getFVsht(const _TCHAR* FieldName)
|
|
2118
|
+
{
|
|
2119
|
+
short index = fieldNumByName(FieldName);
|
|
2120
|
+
return getFVsht(index);
|
|
2121
|
+
}
|
|
2122
|
+
|
|
2123
|
+
float table::getFVflt(const _TCHAR* FieldName)
|
|
2124
|
+
{
|
|
2125
|
+
short index = fieldNumByName(FieldName);
|
|
2126
|
+
return getFVflt(index);
|
|
2127
|
+
}
|
|
2128
|
+
|
|
2129
|
+
void table::setFV(const _TCHAR* FieldName, int data)
|
|
2130
|
+
{
|
|
2131
|
+
short index = fieldNumByName(FieldName);
|
|
2132
|
+
setFV(index, data);
|
|
2133
|
+
}
|
|
2134
|
+
|
|
2135
|
+
void table::setFVA(const _TCHAR* FieldName, const char* data)
|
|
2136
|
+
{
|
|
2137
|
+
short index = fieldNumByName(FieldName);
|
|
2138
|
+
setFVA(index, data);
|
|
2139
|
+
}
|
|
2140
|
+
|
|
2141
|
+
void table::setFV(const _TCHAR* FieldName, double data)
|
|
2142
|
+
{
|
|
2143
|
+
short index = fieldNumByName(FieldName);
|
|
2144
|
+
setFV(index, data);
|
|
2145
|
+
}
|
|
2146
|
+
|
|
2147
|
+
void table::setFV(const _TCHAR* FieldName, float data)
|
|
2148
|
+
{
|
|
2149
|
+
short index = fieldNumByName(FieldName);
|
|
2150
|
+
setFV(index, data);
|
|
2151
|
+
}
|
|
2152
|
+
|
|
2153
|
+
void table::setFV(const _TCHAR* FieldName, unsigned char data)
|
|
2154
|
+
{
|
|
2155
|
+
short index = fieldNumByName(FieldName);
|
|
2156
|
+
setFV(index, data);
|
|
2157
|
+
}
|
|
2158
|
+
|
|
2159
|
+
void table::setFV(const _TCHAR* FieldName, short data)
|
|
2160
|
+
{
|
|
2161
|
+
short index = fieldNumByName(FieldName);
|
|
2162
|
+
setFV(index, data);
|
|
2163
|
+
}
|
|
2164
|
+
|
|
2165
|
+
__int64 table::getFV64(const _TCHAR* FieldName)
|
|
2166
|
+
{
|
|
2167
|
+
short index = fieldNumByName(FieldName);
|
|
2168
|
+
return getFV64(index);
|
|
2169
|
+
}
|
|
2170
|
+
|
|
2171
|
+
void table::setFV(const _TCHAR* FieldName, __int64 data)
|
|
2172
|
+
{
|
|
2173
|
+
short index = fieldNumByName(FieldName);
|
|
2174
|
+
setFV(index, data);
|
|
2175
|
+
}
|
|
2176
|
+
|
|
2177
|
+
__int64 table::getFV64(short index)
|
|
2178
|
+
{
|
|
2179
|
+
if (checkIndex(index) == false)
|
|
2180
|
+
return 0;
|
|
2181
|
+
fielddef& fd = m_tableDef->fieldDefs[index];
|
|
2182
|
+
|
|
2183
|
+
switch (fd.len)
|
|
2184
|
+
{
|
|
2185
|
+
case 8:
|
|
2186
|
+
switch (fd.type)
|
|
2187
|
+
{
|
|
2188
|
+
case ft_uinteger:
|
|
2189
|
+
case ft_integer:
|
|
2190
|
+
case ft_logical:
|
|
2191
|
+
case ft_autoinc:
|
|
2192
|
+
case ft_bit:
|
|
2193
|
+
case ft_currency:
|
|
2194
|
+
case ft_timestamp:
|
|
2195
|
+
case ft_mydatetime:
|
|
2196
|
+
case ft_mytimestamp: return (__int64) *((__int64*)((char*)m_pdata + fd.pos));
|
|
2197
|
+
}
|
|
2198
|
+
return 0;
|
|
2199
|
+
case 7:
|
|
2200
|
+
case 6:
|
|
2201
|
+
case 5:
|
|
2202
|
+
switch (fd.type)
|
|
2203
|
+
{
|
|
2204
|
+
case ft_mytime:
|
|
2205
|
+
case ft_mydatetime:
|
|
2206
|
+
case ft_mytimestamp:
|
|
2207
|
+
{
|
|
2208
|
+
__int64 v = 0;
|
|
2209
|
+
memcpy(&v, (char*)m_pdata + fd.pos, fd.len);
|
|
2210
|
+
return v;
|
|
2211
|
+
}
|
|
2212
|
+
}
|
|
2213
|
+
return 0;
|
|
2214
|
+
default:
|
|
2215
|
+
|
|
2216
|
+
return (__int64) getFVlng(index);
|
|
2217
|
+
}
|
|
2218
|
+
|
|
2219
|
+
}
|
|
2220
|
+
|
|
2221
|
+
void table::setFV(short index, __int64 data)
|
|
2222
|
+
{
|
|
2223
|
+
if (checkIndex(index) == false)
|
|
2224
|
+
return;
|
|
2225
|
+
|
|
2226
|
+
fielddef& fd = m_tableDef->fieldDefs[index];
|
|
2227
|
+
switch (fd.len)
|
|
2228
|
+
{
|
|
2229
|
+
case 8:
|
|
2230
|
+
switch (fd.type)
|
|
2231
|
+
{
|
|
2232
|
+
case ft_uinteger:
|
|
2233
|
+
case ft_integer:
|
|
2234
|
+
case ft_logical:
|
|
2235
|
+
case ft_autoinc:
|
|
2236
|
+
case ft_bit:
|
|
2237
|
+
case ft_currency:
|
|
2238
|
+
case ft_mydatetime:
|
|
2239
|
+
case ft_mytimestamp: *((__int64*)((char*)m_pdata + fd.pos)) = data;
|
|
2240
|
+
break;
|
|
2241
|
+
case ft_timestamp:
|
|
2242
|
+
{
|
|
2243
|
+
btrDate d;
|
|
2244
|
+
d.i = getNowDate();
|
|
2245
|
+
btrTime t;
|
|
2246
|
+
t.i = getNowTime();
|
|
2247
|
+
*((__int64*)((char*)m_pdata + fd.pos)) = btrTimeStamp(d, t).i64;
|
|
2248
|
+
break;
|
|
2249
|
+
}
|
|
2250
|
+
case ft_float:
|
|
2251
|
+
{
|
|
2252
|
+
double d = (double)data;
|
|
2253
|
+
setFV(index, d);
|
|
2254
|
+
break;
|
|
2255
|
+
}
|
|
2256
|
+
}
|
|
2257
|
+
break;
|
|
2258
|
+
case 7:
|
|
2259
|
+
case 6:
|
|
2260
|
+
case 5:
|
|
2261
|
+
switch (fd.type)
|
|
2262
|
+
{
|
|
2263
|
+
case ft_mytime:
|
|
2264
|
+
case ft_mydatetime:
|
|
2265
|
+
case ft_mytimestamp: memcpy((char*)m_pdata + fd.pos, &data, fd.len);
|
|
2266
|
+
break;
|
|
2267
|
+
default: break;
|
|
2268
|
+
}
|
|
2269
|
+
break;
|
|
2270
|
+
default:
|
|
2271
|
+
{
|
|
2272
|
+
int value = (int)data;
|
|
2273
|
+
setFV(index, value);
|
|
2274
|
+
break;
|
|
2275
|
+
}
|
|
2276
|
+
}
|
|
2277
|
+
}
|
|
2278
|
+
|
|
2279
|
+
void table::setFV(const _TCHAR* FieldName, const void* data, uint_td size)
|
|
2280
|
+
{
|
|
2281
|
+
short index = fieldNumByName(FieldName);
|
|
2282
|
+
setFV(index, data, size);
|
|
2283
|
+
}
|
|
2284
|
+
|
|
2285
|
+
/* if blob and text ,set binary data that is only set pointer. it is not copied.
|
|
2286
|
+
* Caller must hold data until it sends to the server.
|
|
2287
|
+
*/
|
|
2288
|
+
void table::setFV(short index, const void* data, uint_td size)
|
|
2289
|
+
{
|
|
2290
|
+
if (checkIndex(index) == false)
|
|
2291
|
+
return;
|
|
2292
|
+
|
|
2293
|
+
fielddef& fd = m_tableDef->fieldDefs[index];
|
|
2294
|
+
|
|
2295
|
+
switch (fd.type)
|
|
2296
|
+
{
|
|
2297
|
+
case ft_myvarbinary:
|
|
2298
|
+
case ft_myvarchar:
|
|
2299
|
+
case ft_mywvarbinary:
|
|
2300
|
+
case ft_mywvarchar:
|
|
2301
|
+
case ft_lstring:
|
|
2302
|
+
{
|
|
2303
|
+
int sizeByte = fd.varLenBytes();
|
|
2304
|
+
size = std::min<uint_td>((uint_td)(fd.len - sizeByte), size);
|
|
2305
|
+
memset((char*)m_pdata + fd.pos, 0, fd.len);
|
|
2306
|
+
memcpy((char*)m_pdata + fd.pos, &size, sizeByte);
|
|
2307
|
+
memcpy((char*)m_pdata + fd.pos + sizeByte, data, size);
|
|
2308
|
+
break;
|
|
2309
|
+
}
|
|
2310
|
+
case ft_myblob:
|
|
2311
|
+
case ft_mytext:
|
|
2312
|
+
{
|
|
2313
|
+
int sizeByte = fd.len - 8;
|
|
2314
|
+
memset((char*)m_pdata + fd.pos, 0, fd.len);
|
|
2315
|
+
memcpy((char*)m_pdata + fd.pos, &size, sizeByte);
|
|
2316
|
+
memcpy((char*)m_pdata + fd.pos + sizeByte, &data, sizeof(char*));
|
|
2317
|
+
break;
|
|
2318
|
+
|
|
2319
|
+
}
|
|
2320
|
+
default: m_stat = STATUS_FIELDTYPE_NOTSUPPORT; // this field type is not supported.
|
|
2321
|
+
}
|
|
2322
|
+
}
|
|
2323
|
+
|
|
2324
|
+
void* table::getFVbin(const _TCHAR* FieldName, uint_td& size)
|
|
2325
|
+
{
|
|
2326
|
+
short index = fieldNumByName(FieldName);
|
|
2327
|
+
return getFVbin(index, size);
|
|
2328
|
+
}
|
|
2329
|
+
|
|
2330
|
+
/* offset is writen at data that is first address of data
|
|
2331
|
+
* text is not converted to unicode form stored charset.
|
|
2332
|
+
*/
|
|
2333
|
+
void* table::getFVbin(short index, uint_td& size)
|
|
2334
|
+
{
|
|
2335
|
+
if (checkIndex(index) == false)
|
|
2336
|
+
return NULL;
|
|
2337
|
+
|
|
2338
|
+
fielddef& fd = m_tableDef->fieldDefs[index];
|
|
2339
|
+
|
|
2340
|
+
switch (fd.type)
|
|
2341
|
+
{
|
|
2342
|
+
case ft_myvarbinary:
|
|
2343
|
+
case ft_myvarchar:
|
|
2344
|
+
case ft_mywvarbinary:
|
|
2345
|
+
case ft_mywvarchar:
|
|
2346
|
+
case ft_lstring:
|
|
2347
|
+
{
|
|
2348
|
+
int sizeByte = fd.varLenBytes();
|
|
2349
|
+
size = 0;
|
|
2350
|
+
memcpy(&size, (char*)m_pdata + fd.pos, sizeByte);
|
|
2351
|
+
return (void*)((char*)m_pdata + fd.pos + sizeByte);
|
|
2352
|
+
}
|
|
2353
|
+
case ft_myblob:
|
|
2354
|
+
case ft_mytext:
|
|
2355
|
+
{
|
|
2356
|
+
int sizeByte = fd.len - 8;
|
|
2357
|
+
size = 0;
|
|
2358
|
+
memcpy(&size, (char*)m_pdata + fd.pos, sizeByte);
|
|
2359
|
+
char** ptr = (char**)((char*)m_pdata + fd.pos + sizeByte);
|
|
2360
|
+
return (void*)*ptr;
|
|
2361
|
+
}
|
|
2362
|
+
}
|
|
2363
|
+
return NULL;
|
|
2364
|
+
}
|
|
2365
|
+
|
|
2366
|
+
bool table::checkIndex(short index)
|
|
2367
|
+
{
|
|
2368
|
+
if ((index >= m_tableDef->fieldCount) || (index < 0))
|
|
2369
|
+
{
|
|
2370
|
+
m_stat = STATUS_INVARID_FIELD_IDX;
|
|
2371
|
+
return false;
|
|
2372
|
+
}
|
|
2373
|
+
return true;
|
|
2374
|
+
}
|
|
2375
|
+
|
|
2376
|
+
double table::getFVDecimal(short index)
|
|
2377
|
+
{
|
|
2378
|
+
unsigned char buf[20] = {0x00};
|
|
2379
|
+
char result[30] = {0x00};
|
|
2380
|
+
char n[10];
|
|
2381
|
+
int i;
|
|
2382
|
+
char* t;
|
|
2383
|
+
unsigned char sign;
|
|
2384
|
+
int len = m_tableDef->fieldDefs[index].len;
|
|
2385
|
+
result[0] = '+';
|
|
2386
|
+
memcpy(buf, (void*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos), len);
|
|
2387
|
+
sign = (unsigned char)(buf[len - 1] & 0x0F);
|
|
2388
|
+
buf[len - 1] = (unsigned char)(buf[len - 1] & 0xF0);
|
|
2389
|
+
for (i = 0; i < len; i++)
|
|
2390
|
+
{
|
|
2391
|
+
sprintf_s(n, 50, "%02x", buf[i]);
|
|
2392
|
+
strcat(result, n);
|
|
2393
|
+
}
|
|
2394
|
+
i = (int)strlen(result);
|
|
2395
|
+
|
|
2396
|
+
if (sign == 13)
|
|
2397
|
+
result[0] = '-';
|
|
2398
|
+
result[i - 1] = 0x00;
|
|
2399
|
+
|
|
2400
|
+
|
|
2401
|
+
t = result + (m_tableDef->fieldDefs[index].len * 2) - m_tableDef->fieldDefs[index].decimals;
|
|
2402
|
+
strcpy((char*)buf, t);
|
|
2403
|
+
*t = '.';
|
|
2404
|
+
strcpy(t + 1, (char*)buf);
|
|
2405
|
+
return atof(result);
|
|
2406
|
+
}
|
|
2407
|
+
|
|
2408
|
+
double table::getFVnumeric(short index)
|
|
2409
|
+
{
|
|
2410
|
+
char* t;
|
|
2411
|
+
char dp[] = "{ABCDEFGHI}JKLMNOPQR";
|
|
2412
|
+
char dpsa[] = "PQRSTUVWXYpqrstuvwxy";
|
|
2413
|
+
char* pdp = NULL;
|
|
2414
|
+
char i;
|
|
2415
|
+
char buf[20] = {0x00};
|
|
2416
|
+
char dummy[20];
|
|
2417
|
+
|
|
2418
|
+
buf[0] = '+';
|
|
2419
|
+
strncpy(buf + 1, (char*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos),
|
|
2420
|
+
m_tableDef->fieldDefs[index].len);
|
|
2421
|
+
|
|
2422
|
+
t = &(buf[m_tableDef->fieldDefs[index].len]);
|
|
2423
|
+
|
|
2424
|
+
switch (m_tableDef->fieldDefs[index].type)
|
|
2425
|
+
{
|
|
2426
|
+
case ft_numeric: pdp = dp;
|
|
2427
|
+
break;
|
|
2428
|
+
case ft_numericsa: pdp = dpsa;
|
|
2429
|
+
break;
|
|
2430
|
+
case ft_numericsts: buf[0] = *t;
|
|
2431
|
+
*t = 0x00;
|
|
2432
|
+
break;
|
|
2433
|
+
}
|
|
2434
|
+
|
|
2435
|
+
if (pdp)
|
|
2436
|
+
{
|
|
2437
|
+
for (i = 0; i < 21; i++)
|
|
2438
|
+
{
|
|
2439
|
+
if (*t == pdp[i])
|
|
2440
|
+
{
|
|
2441
|
+
if (i > 10)
|
|
2442
|
+
{
|
|
2443
|
+
buf[0] = '-';
|
|
2444
|
+
*t = (char)(i + 38);
|
|
2445
|
+
}
|
|
2446
|
+
else
|
|
2447
|
+
*t = (char)(i + 48);
|
|
2448
|
+
break;
|
|
2449
|
+
}
|
|
2450
|
+
}
|
|
2451
|
+
}
|
|
2452
|
+
|
|
2453
|
+
t = buf + strlen(buf) - m_tableDef->fieldDefs[index].decimals;
|
|
2454
|
+
strcpy(dummy, t);
|
|
2455
|
+
*t = '.';
|
|
2456
|
+
strcpy(t + 1, dummy);
|
|
2457
|
+
return atof(buf);
|
|
2458
|
+
}
|
|
2459
|
+
|
|
2460
|
+
void table::setFVDecimal(short index, double data)
|
|
2461
|
+
{ // Double -> Decimal
|
|
2462
|
+
char buf[30] = "%+0";
|
|
2463
|
+
char dummy[30];
|
|
2464
|
+
int point;
|
|
2465
|
+
bool sign = false;
|
|
2466
|
+
unsigned char n;
|
|
2467
|
+
int i, k;
|
|
2468
|
+
int strl;
|
|
2469
|
+
bool offset = false; ;
|
|
2470
|
+
point = (m_tableDef->fieldDefs[index].len) * 2;
|
|
2471
|
+
_ltoa_s(point, dummy, 30, 10);
|
|
2472
|
+
strcat(buf, dummy);
|
|
2473
|
+
strcat(buf, ".");
|
|
2474
|
+
_ltoa_s(m_tableDef->fieldDefs[index].decimals, dummy, 30, 10);
|
|
2475
|
+
strcat(buf, dummy);
|
|
2476
|
+
strcat(buf, "lf");
|
|
2477
|
+
sprintf(dummy, buf, data);
|
|
2478
|
+
if (dummy[0] == '-')
|
|
2479
|
+
sign = true;
|
|
2480
|
+
|
|
2481
|
+
strl = (int)strlen(dummy + 1) - 1;
|
|
2482
|
+
if (strl % 2 == 1)
|
|
2483
|
+
strl = strl / 2;
|
|
2484
|
+
else
|
|
2485
|
+
{
|
|
2486
|
+
strl = strl / 2 + 1;
|
|
2487
|
+
offset = true;
|
|
2488
|
+
}
|
|
2489
|
+
memset(buf, 0, 30);
|
|
2490
|
+
k = 0;
|
|
2491
|
+
n = 0;
|
|
2492
|
+
point = (int)strlen(dummy + 1);
|
|
2493
|
+
if (strl <= m_tableDef->fieldDefs[index].len)
|
|
2494
|
+
{
|
|
2495
|
+
for (i = 1; i <= point; i++)
|
|
2496
|
+
{
|
|
2497
|
+
if ((dummy[i] == '-') || (dummy[i] == '.'));
|
|
2498
|
+
else
|
|
2499
|
+
{
|
|
2500
|
+
if (offset)
|
|
2501
|
+
{
|
|
2502
|
+
n = (unsigned char)(n + dummy[i] - 48);
|
|
2503
|
+
buf[k] = n;
|
|
2504
|
+
offset = false;
|
|
2505
|
+
k++;
|
|
2506
|
+
}
|
|
2507
|
+
else
|
|
2508
|
+
{
|
|
2509
|
+
n = (unsigned char)(dummy[i] - 48);
|
|
2510
|
+
n = (unsigned char)(n << 4);
|
|
2511
|
+
offset = true; ;
|
|
2512
|
+
}
|
|
2513
|
+
}
|
|
2514
|
+
}
|
|
2515
|
+
if (sign)
|
|
2516
|
+
buf[k] += ((unsigned char)(n + 13));
|
|
2517
|
+
else
|
|
2518
|
+
buf[k] += ((unsigned char)(n + 12));
|
|
2519
|
+
}
|
|
2520
|
+
memcpy((void*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos), buf,
|
|
2521
|
+
m_tableDef->fieldDefs[index].len);
|
|
2522
|
+
|
|
2523
|
+
}
|
|
2524
|
+
|
|
2525
|
+
void table::setFVNumeric(short index, double data)
|
|
2526
|
+
{ // Double -> Numeric
|
|
2527
|
+
char buf[30] = "%+0";
|
|
2528
|
+
char dummy[30];
|
|
2529
|
+
int point;
|
|
2530
|
+
int n;
|
|
2531
|
+
char dp[] = "{ABCDEFGHI}JKLMNOPQR";
|
|
2532
|
+
char dpsa[] = "PQRSTUVWXYpqrstuvwxy";
|
|
2533
|
+
bool sign = false;
|
|
2534
|
+
char* t;
|
|
2535
|
+
|
|
2536
|
+
point = m_tableDef->fieldDefs[index].len + 1;
|
|
2537
|
+
|
|
2538
|
+
_ltoa_s(point, dummy, 30, 10);
|
|
2539
|
+
strcat(buf, dummy);
|
|
2540
|
+
strcat(buf, ".");
|
|
2541
|
+
_ltoa_s(m_tableDef->fieldDefs[index].decimals, dummy, 30, 10);
|
|
2542
|
+
strcat(buf, dummy);
|
|
2543
|
+
strcat(buf, "lf");
|
|
2544
|
+
sprintf(dummy, buf, data);
|
|
2545
|
+
if (dummy[0] == '-')
|
|
2546
|
+
sign = true;
|
|
2547
|
+
|
|
2548
|
+
|
|
2549
|
+
strcpy(buf, &dummy[point - m_tableDef->fieldDefs[index].decimals] + 1);
|
|
2550
|
+
dummy[point - m_tableDef->fieldDefs[index].decimals] = 0x00;
|
|
2551
|
+
strcat(dummy, buf);
|
|
2552
|
+
|
|
2553
|
+
n = atol(&dummy[m_tableDef->fieldDefs[index].len]);
|
|
2554
|
+
if (sign)
|
|
2555
|
+
n += 10;
|
|
2556
|
+
t = dummy + 1;
|
|
2557
|
+
switch (m_tableDef->fieldDefs[index].type)
|
|
2558
|
+
{
|
|
2559
|
+
case ft_numeric: dummy[m_tableDef->fieldDefs[index].len] = dp[n];
|
|
2560
|
+
break;
|
|
2561
|
+
case ft_numericsa: dummy[m_tableDef->fieldDefs[index].len] = dpsa[n];
|
|
2562
|
+
break;
|
|
2563
|
+
case ft_numericsts:
|
|
2564
|
+
if (sign)
|
|
2565
|
+
strcat(dummy, "-");
|
|
2566
|
+
else
|
|
2567
|
+
strcat(dummy, "+");
|
|
2568
|
+
t += 1;
|
|
2569
|
+
break;
|
|
2570
|
+
}
|
|
2571
|
+
|
|
2572
|
+
memcpy((void*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos), t,
|
|
2573
|
+
m_tableDef->fieldDefs[index].len);
|
|
2574
|
+
}
|
|
2575
|
+
|
|
2576
|
+
unsigned int table::getRecordHash()
|
|
2577
|
+
{
|
|
2578
|
+
return hash((const char*)fieldPtr(0), datalen());
|
|
2579
|
+
}
|
|
2580
|
+
|
|
2581
|
+
|
|
2582
|
+
|
|
2583
|
+
|
|
2584
|
+
|
|
2585
|
+
int table::bookMarksCount() const
|
|
2586
|
+
{
|
|
2587
|
+
int ret;
|
|
2588
|
+
ret = m_impl->maxBookMarkedCount;
|
|
2589
|
+
return ret;
|
|
2590
|
+
}
|
|
2591
|
+
|
|
2592
|
+
void table::moveBookmarksId(long id)
|
|
2593
|
+
{
|
|
2594
|
+
long Point = (id - 1) * 6 + 2;
|
|
2595
|
+
|
|
2596
|
+
if ((id <= m_impl->maxBookMarkedCount) && (m_impl->bookMarks))
|
|
2597
|
+
seekByBookmark(*((bookmark_td*)((char*)m_impl->bookMarks + Point)));
|
|
2598
|
+
else
|
|
2599
|
+
seekByBookmark(0);
|
|
2600
|
+
}
|
|
2601
|
+
|
|
2602
|
+
short_td table::doBtrvErr(HWND hWnd, _TCHAR* retbuf)
|
|
2603
|
+
{
|
|
2604
|
+
return nstable::tdapErr(hWnd, m_stat, m_tableDef->tableName(), retbuf);
|
|
2605
|
+
}
|
|
2606
|
+
|
|
2607
|
+
|
|
2608
|
+
|
|
2609
|
+
}// namespace client
|
|
2610
|
+
}// namespace tdap
|
|
2611
|
+
}// namespace protocol
|
|
2612
|
+
}// namespace db
|
|
2613
|
+
}// namespace bzs
|