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,899 @@
|
|
|
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
|
+
|
|
23
|
+
#include "nsTable.h"
|
|
24
|
+
#include "nsDatabase.h"
|
|
25
|
+
#include "bulkInsert.h"
|
|
26
|
+
|
|
27
|
+
#include <limits.h>
|
|
28
|
+
#include <string.h> // Required for _fstrstr()
|
|
29
|
+
#include <stdio.h>
|
|
30
|
+
#include <stdlib.h>
|
|
31
|
+
#include <time.h>
|
|
32
|
+
#include <boost/filesystem.hpp>
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
#pragma package(smart_init)
|
|
39
|
+
|
|
40
|
+
/* TODO: To be support internal started transction with original flag.*/
|
|
41
|
+
#ifdef __x86_64__
|
|
42
|
+
#define MEM_FREED_MAGIC_NUMBER (nstimpl*)0x0FEEEFEEEFEEEFEEE
|
|
43
|
+
#else
|
|
44
|
+
#define MEM_FREED_MAGIC_NUMBER (nstimpl*)0x0FEEEFEEE
|
|
45
|
+
#endif
|
|
46
|
+
namespace bzs
|
|
47
|
+
{
|
|
48
|
+
namespace db
|
|
49
|
+
{
|
|
50
|
+
namespace protocol
|
|
51
|
+
{
|
|
52
|
+
namespace tdap
|
|
53
|
+
{
|
|
54
|
+
namespace client
|
|
55
|
+
{
|
|
56
|
+
|
|
57
|
+
struct nstimpl
|
|
58
|
+
{
|
|
59
|
+
nstimpl():refCount(1), bulkIns(NULL), shared(false), isOpen(false)
|
|
60
|
+
{
|
|
61
|
+
posblk[0] = 0x00;
|
|
62
|
+
}
|
|
63
|
+
int refCount;
|
|
64
|
+
bulkInsert* bulkIns;
|
|
65
|
+
nsdatabase* nsdb;
|
|
66
|
+
percentage_td percentage;
|
|
67
|
+
bookmark_td bookmark;
|
|
68
|
+
_TCHAR uri[MAX_PATH];
|
|
69
|
+
uchar_td posblk[POS_BLOCK_SIZE];
|
|
70
|
+
short tableid;
|
|
71
|
+
bool shared;
|
|
72
|
+
bool isOpen;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// -----------------------------------------------------------------
|
|
76
|
+
// class nstable
|
|
77
|
+
// -----------------------------------------------------------------
|
|
78
|
+
extern TCHAR* getErrorMessageLocale(int errorCode, _TCHAR* buf, size_t size);
|
|
79
|
+
|
|
80
|
+
nstable::nstable(nsdatabase *pbe)
|
|
81
|
+
{
|
|
82
|
+
m_impl = new nstimpl();
|
|
83
|
+
m_impl->nsdb = pbe;
|
|
84
|
+
|
|
85
|
+
//addref to nsdatabase
|
|
86
|
+
pbe->addref();
|
|
87
|
+
if (pbe->openTableCount() == nsdatabase::maxtables)
|
|
88
|
+
{
|
|
89
|
+
m_stat = STATUS_LMITS_MAX_TABLES;
|
|
90
|
+
m_impl->nsdb = NULL;
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
pbe->registerTable(this);
|
|
94
|
+
m_keylen = 0;
|
|
95
|
+
m_keynum = 0;
|
|
96
|
+
m_pdata = NULL;
|
|
97
|
+
m_keybuf = NULL;
|
|
98
|
+
m_stat = STATUS_SUCCESS;
|
|
99
|
+
m_read = true;
|
|
100
|
+
m_write = true;
|
|
101
|
+
m_insart = true;
|
|
102
|
+
m_delete = true;
|
|
103
|
+
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
nstable::~nstable()
|
|
107
|
+
{
|
|
108
|
+
if (m_impl->bulkIns)
|
|
109
|
+
delete m_impl->bulkIns;
|
|
110
|
+
close();
|
|
111
|
+
|
|
112
|
+
if (!m_impl->shared)
|
|
113
|
+
m_impl->nsdb->unregisterTable(this);
|
|
114
|
+
m_impl->nsdb->internalRelease();
|
|
115
|
+
delete m_impl;
|
|
116
|
+
m_impl = MEM_FREED_MAGIC_NUMBER;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
TCHAR* nstable::getErrorMessage(int errorCode, _TCHAR* buf, size_t size)
|
|
120
|
+
{
|
|
121
|
+
return getErrorMessageLocale(errorCode, buf, size);
|
|
122
|
+
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* Key number is set by user.
|
|
126
|
+
KyeNum
|
|
127
|
+
- -1 = Unlock the record that specified by bm in multi records.
|
|
128
|
+
- -2 = Unlock all records
|
|
129
|
+
- �{ = Unlock single record.
|
|
130
|
+
*/
|
|
131
|
+
void nstable::unlock(bookmark_td bm)
|
|
132
|
+
{
|
|
133
|
+
void* db = m_pdata;
|
|
134
|
+
if (m_keynum == -1)
|
|
135
|
+
m_pdata = &bm;
|
|
136
|
+
m_datalen = 4;
|
|
137
|
+
tdap(TD_UNLOCK);
|
|
138
|
+
m_pdata = db;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
void nstable::seekByBookmark() {seekByBookmark(m_impl->bookmark);}
|
|
142
|
+
|
|
143
|
+
const _TCHAR* nstable::uri() const {return m_impl->uri;}
|
|
144
|
+
|
|
145
|
+
const uchar_td* nstable::posblk() const {return m_impl->posblk;}
|
|
146
|
+
|
|
147
|
+
nsdatabase* nstable::nsdb() const {return m_impl->nsdb;}
|
|
148
|
+
|
|
149
|
+
bulkInsert* nstable::bulkIns() const {return m_impl->bulkIns;}
|
|
150
|
+
|
|
151
|
+
void nstable::setIsOpen(bool v) {m_impl->isOpen = v;}
|
|
152
|
+
|
|
153
|
+
bool nstable::isOpen() const {return m_impl->isOpen;}
|
|
154
|
+
|
|
155
|
+
short nstable::tableid() const {return m_impl->tableid;}
|
|
156
|
+
|
|
157
|
+
void nstable::setTableid(short v) {m_impl->tableid = v;}
|
|
158
|
+
|
|
159
|
+
void nstable::setShared()
|
|
160
|
+
{
|
|
161
|
+
m_impl->shared = true;
|
|
162
|
+
m_impl->nsdb->unregisterTable(this);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
int nstable::refCount() const
|
|
166
|
+
{
|
|
167
|
+
return m_impl->refCount;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
void nstable::addref(void)
|
|
171
|
+
{
|
|
172
|
+
++m_impl->refCount;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
void nstable::release()
|
|
176
|
+
{
|
|
177
|
+
|
|
178
|
+
/* If before called database::drop() database::close() etc then nstable::destory called.
|
|
179
|
+
Client cache nstable pointer that is invalid.
|
|
180
|
+
It test by test method.
|
|
181
|
+
*/
|
|
182
|
+
try
|
|
183
|
+
{
|
|
184
|
+
if (test(this))
|
|
185
|
+
{
|
|
186
|
+
if (--m_impl->refCount == 0)
|
|
187
|
+
delete this;
|
|
188
|
+
}
|
|
189
|
+
}catch(...){}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
void nstable::destroy()
|
|
193
|
+
{
|
|
194
|
+
if (!m_impl->shared)
|
|
195
|
+
delete this;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
void nstable::doClose()
|
|
199
|
+
{
|
|
200
|
+
if (test(this) && m_impl && (m_impl->isOpen))
|
|
201
|
+
{
|
|
202
|
+
tdap(TD_CLOSETABLE);
|
|
203
|
+
if (m_stat == STATUS_SUCCESS)
|
|
204
|
+
m_impl->isOpen = false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
void nstable::stepFirst(ushort_td LockBias)
|
|
209
|
+
{
|
|
210
|
+
m_datalen = m_buflen;
|
|
211
|
+
tdap((ushort_td)(TD_POS_FIRST + LockBias));
|
|
212
|
+
if (m_stat == STATUS_SUCCESS)
|
|
213
|
+
onReadAfter();
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
void nstable::stepLast(ushort_td LockBias)
|
|
217
|
+
{
|
|
218
|
+
m_datalen = m_buflen;
|
|
219
|
+
tdap((ushort_td)(TD_POS_LAST + LockBias));
|
|
220
|
+
if (m_stat == STATUS_SUCCESS)
|
|
221
|
+
onReadAfter();
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
void nstable::stepPrev(ushort_td LockBias)
|
|
225
|
+
{
|
|
226
|
+
m_datalen = m_buflen;
|
|
227
|
+
tdap((ushort_td)(TD_POS_PREV + LockBias));
|
|
228
|
+
if (m_stat == STATUS_SUCCESS)
|
|
229
|
+
onReadAfter();
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
void nstable::stepNext(ushort_td LockBias)
|
|
233
|
+
{
|
|
234
|
+
m_datalen = m_buflen;
|
|
235
|
+
tdap((ushort_td)(TD_POS_NEXT + LockBias));
|
|
236
|
+
if (m_stat == STATUS_SUCCESS)
|
|
237
|
+
onReadAfter();
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
void nstable::seekFirst(ushort_td LockBias)
|
|
241
|
+
{
|
|
242
|
+
m_datalen = m_buflen;
|
|
243
|
+
m_keylen = m_keybuflen;
|
|
244
|
+
tdap((ushort_td)(TD_KEY_FIRST + LockBias));
|
|
245
|
+
if (m_stat == STATUS_SUCCESS)
|
|
246
|
+
onReadAfter();
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
void nstable::seekLast(ushort_td LockBias)
|
|
250
|
+
{
|
|
251
|
+
m_datalen = m_buflen;
|
|
252
|
+
m_keylen = m_keybuflen;
|
|
253
|
+
tdap((ushort_td)(TD_KEY_LAST + LockBias));
|
|
254
|
+
if (m_stat == STATUS_SUCCESS)
|
|
255
|
+
onReadAfter();
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
void nstable::seekPrev(ushort_td LockBias)
|
|
259
|
+
{
|
|
260
|
+
m_datalen = m_buflen;
|
|
261
|
+
m_keylen = m_keybuflen;
|
|
262
|
+
tdap((ushort_td)(TD_KEY_PREV + LockBias));
|
|
263
|
+
if (m_stat == STATUS_SUCCESS)
|
|
264
|
+
onReadAfter();
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
void nstable::seekNext(ushort_td LockBias)
|
|
268
|
+
{
|
|
269
|
+
m_datalen = m_buflen;
|
|
270
|
+
m_keylen = m_keybuflen;
|
|
271
|
+
tdap((ushort_td)(TD_KEY_NEXT + LockBias));
|
|
272
|
+
if (m_stat == STATUS_SUCCESS)
|
|
273
|
+
onReadAfter();
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
void nstable::seek(ushort_td LockBias)
|
|
277
|
+
{
|
|
278
|
+
m_keylen = writeKeyData();
|
|
279
|
+
m_datalen = m_buflen;
|
|
280
|
+
tdap((ushort_td)(TD_KEY_SEEK + LockBias));
|
|
281
|
+
if (m_stat == STATUS_SUCCESS)
|
|
282
|
+
onReadAfter();
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
void nstable::seekGreater(bool orEqual, ushort_td LockBias)
|
|
286
|
+
{
|
|
287
|
+
m_keylen = writeKeyData();
|
|
288
|
+
m_datalen = m_buflen;
|
|
289
|
+
if (orEqual)
|
|
290
|
+
tdap((ushort_td)(TD_KEY_OR_AFTER + LockBias));
|
|
291
|
+
else
|
|
292
|
+
tdap((ushort_td)(TD_KEY_AFTER + LockBias));
|
|
293
|
+
if (m_stat == STATUS_SUCCESS)
|
|
294
|
+
onReadAfter();
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
void nstable::seekLessThan(bool orEqual, ushort_td LockBias)
|
|
298
|
+
{
|
|
299
|
+
m_keylen = writeKeyData();
|
|
300
|
+
m_datalen = m_buflen;
|
|
301
|
+
if (orEqual)
|
|
302
|
+
tdap((ushort_td)(TD_KEY_OR_BEFORE + LockBias));
|
|
303
|
+
else
|
|
304
|
+
tdap((ushort_td)(TD_KEY_BEFORE + LockBias));
|
|
305
|
+
if (m_stat == STATUS_SUCCESS)
|
|
306
|
+
onReadAfter();
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
void nstable::doOpen(const _TCHAR* name, char_td mode, const _TCHAR* ownerName)
|
|
310
|
+
{
|
|
311
|
+
void* svm_keybuf = m_keybuf;
|
|
312
|
+
char_td svm_keynum = m_keynum;
|
|
313
|
+
keylen_td svm_keybuflen = m_keylen;
|
|
314
|
+
|
|
315
|
+
if (m_impl->nsdb == NULL)
|
|
316
|
+
{
|
|
317
|
+
m_stat = STATUS_LMITS_MAX_TABLES;
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
#ifdef _WIN32
|
|
321
|
+
// if name has space then covert to short path name.
|
|
322
|
+
if ((m_impl->nsdb->useLongFilename() == false) && _tcsstr(name, _T(" ")))
|
|
323
|
+
GetShortPathName(name, m_impl->uri, MAX_PATH);
|
|
324
|
+
else
|
|
325
|
+
#endif
|
|
326
|
+
if (m_impl->uri != name)
|
|
327
|
+
_tcscpy_s(m_impl->uri, MAX_PATH, name);
|
|
328
|
+
|
|
329
|
+
// for trnasctd
|
|
330
|
+
if (m_impl->nsdb->isTransactdUri(m_impl->uri))
|
|
331
|
+
{
|
|
332
|
+
if (m_impl->nsdb->setUseTransactd() == false)
|
|
333
|
+
{
|
|
334
|
+
m_stat = STATUS_REQUESTER_DEACTIVE;
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
char tmpName[MAX_PATH]={0x00};
|
|
340
|
+
const char* p = nsdatabase::toServerUri(tmpName, MAX_PATH, m_impl->uri, m_impl->nsdb->isUseTransactd());
|
|
341
|
+
m_keybuf = (void*)p;
|
|
342
|
+
m_keylen = (keylen_td)strlen(p) + 1;
|
|
343
|
+
|
|
344
|
+
if (m_impl->nsdb->localSharing())
|
|
345
|
+
m_keynum = (char_td)(mode - 64);
|
|
346
|
+
else
|
|
347
|
+
m_keynum = mode;
|
|
348
|
+
|
|
349
|
+
char ownerNameBuf[OWNERNAME_SIZE+1] = {0x00};
|
|
350
|
+
if (NULL != ownerName && 0x00 != ownerName[0])
|
|
351
|
+
{
|
|
352
|
+
const char* p = toChar(ownerNameBuf, ownerName, 22);
|
|
353
|
+
m_pdata = (void*)p;
|
|
354
|
+
m_datalen = (uint_td)strlen(p) + 1;
|
|
355
|
+
if (m_datalen > 11)
|
|
356
|
+
{
|
|
357
|
+
m_stat = STATUS_TOO_LONG_OWNERNAME;
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
}
|
|
362
|
+
else
|
|
363
|
+
m_datalen = 0;
|
|
364
|
+
|
|
365
|
+
tdap(TD_OPENTABLE);
|
|
366
|
+
if (m_stat == STATUS_SUCCESS)
|
|
367
|
+
m_impl->isOpen = true;
|
|
368
|
+
m_keybuf = svm_keybuf;
|
|
369
|
+
m_keynum = svm_keynum;
|
|
370
|
+
m_keylen = svm_keybuflen;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
void nstable::doUpdate(eUpdateType type)
|
|
374
|
+
{
|
|
375
|
+
int trnCount = nsdb()->enableTrn();
|
|
376
|
+
if (m_write == false)
|
|
377
|
+
{
|
|
378
|
+
m_stat = STATUS_NO_ACR_UPDATE_DELETE;
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
if (onUpdateCheck(type) == false)
|
|
385
|
+
return;
|
|
386
|
+
|
|
387
|
+
m_stat = STATUS_SUCCESS;
|
|
388
|
+
int option = onUpdateBefore();
|
|
389
|
+
if (m_stat)
|
|
390
|
+
{
|
|
391
|
+
if (trnCount < nsdb()->enableTrn())
|
|
392
|
+
nsdb()->abortTrn();
|
|
393
|
+
return ;
|
|
394
|
+
}
|
|
395
|
+
char_td keynum = m_keynum;
|
|
396
|
+
m_keylen = m_keybuflen;
|
|
397
|
+
|
|
398
|
+
if (type == changeCurrentNcc)
|
|
399
|
+
m_keynum = -1;
|
|
400
|
+
else
|
|
401
|
+
m_keylen = writeKeyData();
|
|
402
|
+
m_datalen = getWriteImageLen();
|
|
403
|
+
|
|
404
|
+
if (m_impl->nsdb->isUseTransactd() && (type == changeInKey))
|
|
405
|
+
tdap(TD_REC_UPDATEATKEY);
|
|
406
|
+
else
|
|
407
|
+
tdap(TD_REC_UPDATE);
|
|
408
|
+
m_keynum = keynum;
|
|
409
|
+
onUpdateAfter(option);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
void nstable::doDel(bool inkey)
|
|
413
|
+
{
|
|
414
|
+
if (m_delete == false)
|
|
415
|
+
{
|
|
416
|
+
m_stat = STATUS_NO_ACR_UPDATE_DELETE;
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
if (onDeleteCheck(inkey)==false)
|
|
420
|
+
return;
|
|
421
|
+
|
|
422
|
+
m_datalen = m_buflen;
|
|
423
|
+
if (m_impl->nsdb->isUseTransactd() && inkey)
|
|
424
|
+
{
|
|
425
|
+
if (!isUniqeKey(m_keynum))
|
|
426
|
+
{
|
|
427
|
+
m_stat = STATUS_INVALID_KEYNUM;
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
m_keylen = writeKeyData();
|
|
431
|
+
tdap(TD_REC_DELLETEATKEY);
|
|
432
|
+
}
|
|
433
|
+
else
|
|
434
|
+
{
|
|
435
|
+
if (inkey)
|
|
436
|
+
{
|
|
437
|
+
m_keylen = writeKeyData();
|
|
438
|
+
seek();
|
|
439
|
+
if (m_stat)
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
tdap(TD_REC_DELETE);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
void nstable::onInsertAfter(int beforeResult)
|
|
448
|
+
{
|
|
449
|
+
if (m_stat == STATUS_SUCCESS)
|
|
450
|
+
onReadAfter();
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
ushort_td nstable::doInsert(bool ncc)
|
|
454
|
+
{
|
|
455
|
+
int trnCount = nsdb()->enableTrn();
|
|
456
|
+
if (m_insart == false)
|
|
457
|
+
{
|
|
458
|
+
m_stat = STATUS_NO_ACR_INSERT;
|
|
459
|
+
return 0;
|
|
460
|
+
}
|
|
461
|
+
m_stat = STATUS_SUCCESS;
|
|
462
|
+
int option = onInsertBefore();
|
|
463
|
+
if (m_stat)
|
|
464
|
+
{
|
|
465
|
+
if (trnCount < nsdb()->enableTrn())
|
|
466
|
+
nsdb()->abortTrn();
|
|
467
|
+
return 0;
|
|
468
|
+
}
|
|
469
|
+
ushort_td ins_rows = 0;
|
|
470
|
+
char_td keynum = m_keynum;
|
|
471
|
+
m_keylen = m_keybuflen;
|
|
472
|
+
if (m_datalen > m_buflen)
|
|
473
|
+
m_stat = STATUS_INVALID_VALLEN;
|
|
474
|
+
m_datalen = getWriteImageLen();
|
|
475
|
+
if (m_impl->bulkIns)
|
|
476
|
+
ins_rows = m_impl->bulkIns->insert((const char*)data(), m_datalen, this);
|
|
477
|
+
else
|
|
478
|
+
{
|
|
479
|
+
tdap(TD_REC_INSERT);
|
|
480
|
+
if (ncc)
|
|
481
|
+
m_keynum = -1;
|
|
482
|
+
if (m_stat == STATUS_SUCCESS)
|
|
483
|
+
ins_rows = 1;
|
|
484
|
+
}
|
|
485
|
+
m_keynum = keynum;
|
|
486
|
+
onInsertAfter(option);
|
|
487
|
+
|
|
488
|
+
return ins_rows;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
void nstable::beginBulkInsert(int maxBuflen)
|
|
492
|
+
{
|
|
493
|
+
if (m_impl->bulkIns)
|
|
494
|
+
delete m_impl->bulkIns;
|
|
495
|
+
m_impl->bulkIns = new bulkInsert(maxBuflen);
|
|
496
|
+
m_stat = STATUS_SUCCESS;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
ushort_td nstable::doCommitBulkInsert(bool autoCommit)
|
|
500
|
+
{
|
|
501
|
+
ushort_td count = 0;
|
|
502
|
+
if (m_impl->bulkIns && m_impl->bulkIns->count())
|
|
503
|
+
{
|
|
504
|
+
void* p = m_pdata;
|
|
505
|
+
uint_td len = m_datalen;
|
|
506
|
+
m_pdata = m_impl->bulkIns->data();
|
|
507
|
+
m_datalen = m_impl->bulkIns->dataLen();
|
|
508
|
+
m_keylen = m_keybuflen;
|
|
509
|
+
tdap(TD_INSERT_BULK);
|
|
510
|
+
|
|
511
|
+
if (m_stat == STATUS_SUCCESS)
|
|
512
|
+
count = (*(ushort_td*)m_pdata);
|
|
513
|
+
m_pdata = p;
|
|
514
|
+
m_datalen = len;
|
|
515
|
+
if (!autoCommit)
|
|
516
|
+
{
|
|
517
|
+
delete m_impl->bulkIns;
|
|
518
|
+
m_impl->bulkIns = NULL;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
return count;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
void nstable::abortBulkInsert()
|
|
525
|
+
{
|
|
526
|
+
delete m_impl->bulkIns;
|
|
527
|
+
m_impl->bulkIns = NULL;
|
|
528
|
+
m_stat = STATUS_SUCCESS;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
bookmark_td nstable::bookmark()
|
|
532
|
+
{
|
|
533
|
+
void* db = m_pdata;
|
|
534
|
+
|
|
535
|
+
m_pdata = &m_impl->bookmark;
|
|
536
|
+
m_datalen = sizeof(bookmark_td);
|
|
537
|
+
tdap(TD_BOOKMARK);
|
|
538
|
+
m_pdata = db;
|
|
539
|
+
|
|
540
|
+
return m_impl->bookmark;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
void nstable::seekByBookmark(bookmark_td bm, ushort_td LockBias)
|
|
544
|
+
{
|
|
545
|
+
int count = 0;
|
|
546
|
+
memcpy(m_pdata, &bm, sizeof(bookmark_td));
|
|
547
|
+
m_datalen = m_buflen;
|
|
548
|
+
m_keylen = m_keybuflen;
|
|
549
|
+
tdap((ushort_td)(TD_MOVE_BOOKMARK + LockBias));
|
|
550
|
+
if (m_stat == STATUS_SUCCESS)
|
|
551
|
+
onReadAfter();
|
|
552
|
+
// TODO: This code has some problem.
|
|
553
|
+
while (m_stat == STATUS_BUFFERTOOSMALL)
|
|
554
|
+
{
|
|
555
|
+
count++;
|
|
556
|
+
m_buflen = m_buflen * 2;
|
|
557
|
+
m_datalen = m_buflen;
|
|
558
|
+
m_pdata = realloc(m_pdata, m_buflen);
|
|
559
|
+
memcpy(m_pdata, &bm, sizeof(bookmark_td));
|
|
560
|
+
tdap(TD_MOVE_BOOKMARK);
|
|
561
|
+
if (m_stat == STATUS_SUCCESS)
|
|
562
|
+
{
|
|
563
|
+
onReadAfter();
|
|
564
|
+
break;
|
|
565
|
+
}
|
|
566
|
+
if (count > 10)
|
|
567
|
+
break;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
percentage_td nstable::getPercentage()
|
|
572
|
+
{
|
|
573
|
+
void* db = m_pdata;
|
|
574
|
+
m_pdata = &m_impl->percentage;
|
|
575
|
+
m_datalen = sizeof(percentage_td);
|
|
576
|
+
m_keylen = m_keybuflen;
|
|
577
|
+
tdap(TD_GET_PER);
|
|
578
|
+
m_impl->percentage &= 0xffff;
|
|
579
|
+
m_pdata = db;
|
|
580
|
+
return m_impl->percentage;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
percentage_td nstable::getPercentage(bookmark_td bm)
|
|
584
|
+
{
|
|
585
|
+
void* db = m_pdata;
|
|
586
|
+
char_td ky = m_keynum;
|
|
587
|
+
|
|
588
|
+
m_pdata = &m_impl->percentage;
|
|
589
|
+
m_datalen = sizeof(percentage_td);
|
|
590
|
+
m_keynum = -1;
|
|
591
|
+
|
|
592
|
+
m_impl->percentage = bm;
|
|
593
|
+
m_keylen = m_keybuflen;
|
|
594
|
+
tdap(TD_GET_PER);
|
|
595
|
+
m_impl->percentage &= 0xffff;
|
|
596
|
+
|
|
597
|
+
m_pdata = db;
|
|
598
|
+
m_keynum = ky;
|
|
599
|
+
|
|
600
|
+
return m_impl->percentage;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
void nstable::seekByPercentage()
|
|
604
|
+
{
|
|
605
|
+
if (m_impl->percentage < 0)
|
|
606
|
+
m_impl->percentage = 0;
|
|
607
|
+
else if (m_impl->percentage > 10000)
|
|
608
|
+
m_impl->percentage = 10000;
|
|
609
|
+
memcpy(m_pdata, &m_impl->percentage, sizeof(TD_GET_PER));
|
|
610
|
+
m_datalen = m_buflen;
|
|
611
|
+
m_keylen = m_keybuflen;
|
|
612
|
+
tdap(TD_MOVE_PER);
|
|
613
|
+
if (m_stat == STATUS_SUCCESS)
|
|
614
|
+
onReadAfter();
|
|
615
|
+
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
void nstable::seekByPercentage(percentage_td pc)
|
|
619
|
+
{
|
|
620
|
+
if (pc < 0)
|
|
621
|
+
pc = 0;
|
|
622
|
+
else if (pc > 10000)
|
|
623
|
+
pc = 10000;
|
|
624
|
+
memcpy(m_pdata, &pc, sizeof(percentage_td));
|
|
625
|
+
m_datalen = m_buflen;
|
|
626
|
+
m_keylen = m_keybuflen;
|
|
627
|
+
tdap(TD_MOVE_PER);
|
|
628
|
+
if (m_stat == STATUS_SUCCESS)
|
|
629
|
+
onReadAfter();
|
|
630
|
+
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
void nstable::setOwnerName(const _TCHAR* Owner_p, char_td mode)
|
|
634
|
+
{
|
|
635
|
+
|
|
636
|
+
void* svm_pdata = m_pdata;
|
|
637
|
+
void* svm_keybuf = m_keybuf;
|
|
638
|
+
keylen_td svm_keybuflen = m_keylen;
|
|
639
|
+
char_td svm_keynum = m_keynum;
|
|
640
|
+
|
|
641
|
+
char buf[21];
|
|
642
|
+
const char* Owner = toChar(buf, Owner_p, 20);
|
|
643
|
+
|
|
644
|
+
char dataBuf[9];
|
|
645
|
+
char keyBuf[9];
|
|
646
|
+
|
|
647
|
+
m_datalen = (uint_td)strlen(Owner) + 1;
|
|
648
|
+
m_keylen = (keylen_td)(strlen(Owner) + 1);
|
|
649
|
+
m_keynum = mode;
|
|
650
|
+
strcpy(dataBuf, Owner);
|
|
651
|
+
strcpy(keyBuf, Owner);
|
|
652
|
+
m_pdata = dataBuf;
|
|
653
|
+
m_keybuf = keyBuf;
|
|
654
|
+
|
|
655
|
+
tdap(TD_SET_OWNERNAME);
|
|
656
|
+
|
|
657
|
+
m_pdata = svm_pdata;
|
|
658
|
+
m_keybuf = svm_keybuf;
|
|
659
|
+
m_keylen = svm_keybuflen;
|
|
660
|
+
m_keynum = svm_keynum;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
void nstable::clearOwnerName() {tdap(TD_CLEAR_OWNERNAME);}
|
|
664
|
+
|
|
665
|
+
void nstable::stats(void* dataBuf, uint_td len, bool estimate)
|
|
666
|
+
{
|
|
667
|
+
void* svm_pdata = m_pdata;
|
|
668
|
+
void* svm_keybuf = m_keybuf;
|
|
669
|
+
keylen_td svm_keybuflen = m_keylen;
|
|
670
|
+
char_td svm_keynum = m_keynum;
|
|
671
|
+
uchar_td keyBuf[255];
|
|
672
|
+
|
|
673
|
+
m_pdata = dataBuf;
|
|
674
|
+
m_datalen = len;
|
|
675
|
+
m_keybuf = keyBuf;
|
|
676
|
+
m_keylen = 255;
|
|
677
|
+
m_keynum = estimate;
|
|
678
|
+
|
|
679
|
+
tdap(TD_TABLE_INFO);
|
|
680
|
+
|
|
681
|
+
m_pdata = svm_pdata;
|
|
682
|
+
m_keybuf = svm_keybuf;
|
|
683
|
+
m_keylen = svm_keybuflen;
|
|
684
|
+
m_keynum = svm_keynum;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
uint_td nstable::doRecordCount(bool estimate, bool fromCurrent)
|
|
688
|
+
{
|
|
689
|
+
fileSpec *fs;
|
|
690
|
+
uint_td Count;
|
|
691
|
+
|
|
692
|
+
fs = (fileSpec*)malloc(1920);
|
|
693
|
+
stats(fs, 1920, estimate);
|
|
694
|
+
Count = fs->recCount;
|
|
695
|
+
free(fs);
|
|
696
|
+
return Count;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
ushort_td nstable::recordLength()
|
|
700
|
+
{
|
|
701
|
+
fileSpec *fs;
|
|
702
|
+
ushort_td len = 0;
|
|
703
|
+
|
|
704
|
+
fs = (fileSpec*)malloc(1920);
|
|
705
|
+
stats(fs, 1920, true);
|
|
706
|
+
if (m_stat == STATUS_SUCCESS)
|
|
707
|
+
len = fs->recLen;
|
|
708
|
+
free(fs);
|
|
709
|
+
return len;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
void nstable::doCreateIndex(bool specifyKeyNum)
|
|
713
|
+
{
|
|
714
|
+
if (specifyKeyNum)
|
|
715
|
+
m_keynum += ((uchar_td)0x80);
|
|
716
|
+
tdap(TD_BUILD_INDEX);
|
|
717
|
+
if (specifyKeyNum)
|
|
718
|
+
m_keynum -= ((uchar_td)0x80);
|
|
719
|
+
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
void nstable::dropIndex(bool NoRenumber)
|
|
723
|
+
{
|
|
724
|
+
if (NoRenumber)
|
|
725
|
+
m_keynum += ((uchar_td)0x80);
|
|
726
|
+
tdap(TD_DROP_INDEX);
|
|
727
|
+
if (NoRenumber)
|
|
728
|
+
m_keynum -= ((uchar_td)0x80);
|
|
729
|
+
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
short_td nstable::doBtrvErr(HWND hWnd, _TCHAR* retbuf)
|
|
733
|
+
{
|
|
734
|
+
return tdapErr(hWnd, m_stat, m_impl->uri, retbuf);
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
void nstable::tdap(ushort_td op)
|
|
738
|
+
{
|
|
739
|
+
short LoopCount = 0;
|
|
740
|
+
m_op = op;
|
|
741
|
+
if ((op > 4) && (!m_read))
|
|
742
|
+
{
|
|
743
|
+
m_stat = STATUS_NO_ACR_READ;
|
|
744
|
+
return;
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
do
|
|
748
|
+
{
|
|
749
|
+
if (m_op != TD_OPENTABLE && m_impl->isOpen == false)
|
|
750
|
+
{
|
|
751
|
+
m_stat = STATUS_TABLE_YET_OPEN;
|
|
752
|
+
return;
|
|
753
|
+
}
|
|
754
|
+
else if (m_op == TD_CLOSETABLE && m_impl->nsdb->enableTrn() > 0)
|
|
755
|
+
{
|
|
756
|
+
m_stat = STATUS_DURING_TRANSACTION;
|
|
757
|
+
return;
|
|
758
|
+
}
|
|
759
|
+
BTRCALLID_PTR func = m_impl->nsdb->btrvFunc();
|
|
760
|
+
m_stat = func(m_op, m_impl->posblk, m_pdata, &m_datalen, m_keybuf, m_keylen, m_keynum,
|
|
761
|
+
m_impl->nsdb->clientID());
|
|
762
|
+
|
|
763
|
+
// Wait for record lock or file lock.
|
|
764
|
+
//LoopCount++;
|
|
765
|
+
switch (m_stat)
|
|
766
|
+
{
|
|
767
|
+
case STATUS_LOCK_ERROR: Sleep(m_impl->nsdb->lockWaitTime());
|
|
768
|
+
break;
|
|
769
|
+
case STATUS_FILE_LOCKED: Sleep(m_impl->nsdb->lockWaitTime());
|
|
770
|
+
break;
|
|
771
|
+
|
|
772
|
+
default: return;
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
while ((m_stat != STATUS_SUCCESS)
|
|
776
|
+
&& (m_impl->nsdb->lockWaitCount() != LoopCount++));
|
|
777
|
+
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
/* tdap error handling
|
|
781
|
+
*/
|
|
782
|
+
short_td nstable::tdapErr(HWND hWnd, short_td status, const _TCHAR* TableName, _TCHAR* retbuf)
|
|
783
|
+
{
|
|
784
|
+
if (status == STATUS_SUCCESS) return 0;
|
|
785
|
+
else if (status == STATUS_EOF) return 0;
|
|
786
|
+
else if (status == STATUS_NOT_FOUND_TI) return 0;
|
|
787
|
+
|
|
788
|
+
_TCHAR buf[512];
|
|
789
|
+
short_td errorCode = status;
|
|
790
|
+
getErrorMessage(errorCode, buf, 512);
|
|
791
|
+
|
|
792
|
+
#pragma warning(disable:4996)
|
|
793
|
+
if (retbuf)
|
|
794
|
+
_stprintf(retbuf, _T("table_name:%s %s"), TableName, buf);
|
|
795
|
+
#pragma warning(default:4996)
|
|
796
|
+
|
|
797
|
+
if ((int)hWnd <= 0) return errorCode;
|
|
798
|
+
|
|
799
|
+
#ifdef _WIN32
|
|
800
|
+
if (TableName)
|
|
801
|
+
MessageBox(hWnd, buf, TableName, MB_OK | MB_ICONSTOP | MB_SYSTEMMODAL);
|
|
802
|
+
else
|
|
803
|
+
MessageBox(hWnd, buf, _T("tdapErr"), MB_OK | MB_ICONSTOP | MB_SYSTEMMODAL);
|
|
804
|
+
#endif
|
|
805
|
+
return errorCode;
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
|
|
809
|
+
void nstable::throwError(const _TCHAR* caption, short statusCode)
|
|
810
|
+
{
|
|
811
|
+
_TCHAR tmp[1024]={0x00};
|
|
812
|
+
nstable::tdapErr(0x00, statusCode, NULL, tmp);
|
|
813
|
+
_TCHAR tmp2[1024]={0x00};
|
|
814
|
+
_stprintf_s(tmp2, 1024, _T("%s\n%s\n"),caption, tmp);
|
|
815
|
+
THROW_BZS_ERROR_WITH_CODEMSG(statusCode, tmp2);
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
_TCHAR* nstable::getDirURI(const _TCHAR* path, _TCHAR* buf)
|
|
819
|
+
{
|
|
820
|
+
bool uri = false;
|
|
821
|
+
if (_tcsstr(path, _T("btrv://")) || _tcsstr(path, _T("tdap://")))
|
|
822
|
+
uri = true;
|
|
823
|
+
#ifdef _WIN32
|
|
824
|
+
if (uri == false)
|
|
825
|
+
_tfullpath(buf, path, MAX_PATH);
|
|
826
|
+
else
|
|
827
|
+
#endif
|
|
828
|
+
_tcscpy(buf, path);
|
|
829
|
+
_TUCHAR* p = _tcsmrchr((_TUCHAR*)buf, PSEPARATOR_C);
|
|
830
|
+
_TUCHAR* p2 = _tcsmrchr((_TUCHAR*)buf, '=');
|
|
831
|
+
if (p && p2)
|
|
832
|
+
{
|
|
833
|
+
if (p2 > p)
|
|
834
|
+
p = NULL;
|
|
835
|
+
else
|
|
836
|
+
p2 = NULL;
|
|
837
|
+
}
|
|
838
|
+
if (p)
|
|
839
|
+
* p = 0x00;
|
|
840
|
+
if (p2)
|
|
841
|
+
* (p2 + 1) = 0x00;
|
|
842
|
+
return buf;
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
/* Get file name from full path name.
|
|
846
|
+
*
|
|
847
|
+
*/
|
|
848
|
+
_TCHAR* nstable::getFileName(const _TCHAR* path, _TCHAR* filename)
|
|
849
|
+
{
|
|
850
|
+
|
|
851
|
+
_TUCHAR* p = _tcsmrchr((_TUCHAR*)path, PSEPARATOR_C);
|
|
852
|
+
_TUCHAR* p2 = _tcsmrchr((_TUCHAR*)path, '=');
|
|
853
|
+
filename[0] = 0x00;
|
|
854
|
+
if (p2 > p)
|
|
855
|
+
p = p2;
|
|
856
|
+
|
|
857
|
+
if (p)
|
|
858
|
+
{
|
|
859
|
+
p++;
|
|
860
|
+
if (*p)
|
|
861
|
+
_tcscpy(filename, (_TCHAR*)p);
|
|
862
|
+
}
|
|
863
|
+
else
|
|
864
|
+
_tcscpy(filename, path);
|
|
865
|
+
|
|
866
|
+
return filename;
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
bool nstable::existsFile(const _TCHAR* filename)
|
|
870
|
+
{
|
|
871
|
+
return boost::filesystem::exists(filename);
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
bool nstable::test(nstable* p)
|
|
875
|
+
{
|
|
876
|
+
try
|
|
877
|
+
{
|
|
878
|
+
|
|
879
|
+
char* pp = (char*)(p);
|
|
880
|
+
#ifdef _WIN32
|
|
881
|
+
_TCHAR buf[256];
|
|
882
|
+
wsprintf(buf, _T("test(%p) = %p\n"), p, *((nstimpl**)(pp + 4)));
|
|
883
|
+
OutputDebugString(buf);
|
|
884
|
+
#endif
|
|
885
|
+
#ifdef __x86_64__
|
|
886
|
+
return (MEM_FREED_MAGIC_NUMBER != *((nstimpl**)(pp + sizeof(char*))));
|
|
887
|
+
#else
|
|
888
|
+
return (MEM_FREED_MAGIC_NUMBER != *((nstimpl**)(pp + sizeof(char*))));
|
|
889
|
+
#endif
|
|
890
|
+
}
|
|
891
|
+
catch(...){};
|
|
892
|
+
return false;
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
}// namespace client
|
|
896
|
+
}// namespace tdap
|
|
897
|
+
}// namespace protocol
|
|
898
|
+
}// namespace db
|
|
899
|
+
}// namespace bzs
|