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,724 @@
|
|
|
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
|
+
//#define BOOST_THREAD_BUILD_LIB
|
|
23
|
+
#if (__BCPLUSPLUS__ && _WIN64)
|
|
24
|
+
# define BOOST_ALL_NO_LIB
|
|
25
|
+
#endif
|
|
26
|
+
|
|
27
|
+
#include "nsDatabase.h"
|
|
28
|
+
#include "nsTable.h"
|
|
29
|
+
#include "stringConverter.h"
|
|
30
|
+
#include <sys/stat.h>
|
|
31
|
+
#include <stdio.h>
|
|
32
|
+
#include <boost/thread/mutex.hpp>
|
|
33
|
+
|
|
34
|
+
#ifdef LINUX
|
|
35
|
+
#include <dlfcn.h>
|
|
36
|
+
#include <cstddef>
|
|
37
|
+
#include <bzs/env/crosscompile.h>
|
|
38
|
+
typedef void* HANDLE;
|
|
39
|
+
typedef void* HINSTANCE;
|
|
40
|
+
#endif
|
|
41
|
+
|
|
42
|
+
#pragma package(smart_init)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
#if (__BCPLUSPLUS__)
|
|
46
|
+
# ifdef _WIN64
|
|
47
|
+
# pragma comment(lib, "boost_chrono-bcb64-mt-1_50.a")
|
|
48
|
+
# pragma comment(lib, "boost_thread-bcb64-mt-1_50.a")
|
|
49
|
+
# else
|
|
50
|
+
# pragma comment(lib, "libboost_system-bcb-mt-s-1_39.lib")
|
|
51
|
+
# pragma comment(lib, "libboost_filesystem-bcb-mt-s-1_39.lib")
|
|
52
|
+
# pragma comment(lib, "libboost_thread-bcb-mt-s-1_39.lib")
|
|
53
|
+
# endif
|
|
54
|
+
#endif
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
namespace bzs
|
|
59
|
+
{
|
|
60
|
+
namespace db
|
|
61
|
+
{
|
|
62
|
+
namespace protocol
|
|
63
|
+
{
|
|
64
|
+
namespace tdap
|
|
65
|
+
{
|
|
66
|
+
namespace client
|
|
67
|
+
{
|
|
68
|
+
extern EnginsFunc engins;
|
|
69
|
+
unsigned int g_lastTrnTime = 0;
|
|
70
|
+
unsigned int nsdatabase::m_execCodepage = GetACP();
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
void registEnginsPtr(EnginsFunc func) {engins = func;}
|
|
74
|
+
|
|
75
|
+
BTRCALLID_PTR BTRCALLIDX = NULL;
|
|
76
|
+
BTRCALLID_PTR MYTICALLID = NULL;
|
|
77
|
+
|
|
78
|
+
HANDLE hBtrvDLL = NULL;
|
|
79
|
+
HANDLE hTrsdDLL = NULL;
|
|
80
|
+
|
|
81
|
+
#ifdef LINUX
|
|
82
|
+
#define LIB_PREFIX "lib"
|
|
83
|
+
#else
|
|
84
|
+
#define LIB_PREFIX
|
|
85
|
+
#endif
|
|
86
|
+
|
|
87
|
+
BTRCALLID_PTR getTrnsctdEntryPoint()
|
|
88
|
+
{
|
|
89
|
+
if (MYTICALLID)
|
|
90
|
+
return MYTICALLID;
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
if (hTrsdDLL == NULL)
|
|
94
|
+
hTrsdDLL = LoadLibraryA(LIB_PREFIX TDCLC_LIBNAME);
|
|
95
|
+
|
|
96
|
+
if (hTrsdDLL)
|
|
97
|
+
MYTICALLID = (BTRCALLID_PTR)GetProcAddress((HINSTANCE)hTrsdDLL, "BTRCALLID");
|
|
98
|
+
return MYTICALLID;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
BTRCALLID_PTR getBtrvEntryPoint() {return BTRCALLIDX;}
|
|
102
|
+
|
|
103
|
+
int smartLoadLibrary()
|
|
104
|
+
{
|
|
105
|
+
int ret = 0;
|
|
106
|
+
if (hBtrvDLL == NULL)
|
|
107
|
+
hBtrvDLL = LoadLibrary(_T("W3Btrv7"));
|
|
108
|
+
|
|
109
|
+
if (hBtrvDLL == NULL)
|
|
110
|
+
hBtrvDLL = LoadLibrary(_T("WBtrv32"));
|
|
111
|
+
|
|
112
|
+
if (hBtrvDLL)
|
|
113
|
+
BTRCALLIDX = (BTRCALLID_PTR)GetProcAddress((HINSTANCE)hBtrvDLL, "BTRCALLID");
|
|
114
|
+
if (BTRCALLIDX)
|
|
115
|
+
ret = 1;
|
|
116
|
+
MYTICALLID = getTrnsctdEntryPoint();
|
|
117
|
+
if (MYTICALLID)
|
|
118
|
+
ret = 2;
|
|
119
|
+
return ret;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
void smartFreeLibrary()
|
|
123
|
+
{
|
|
124
|
+
if (hBtrvDLL)
|
|
125
|
+
FreeLibrary((HINSTANCE)hBtrvDLL);
|
|
126
|
+
|
|
127
|
+
if (hTrsdDLL)
|
|
128
|
+
FreeLibrary((HINSTANCE)hTrsdDLL);
|
|
129
|
+
hBtrvDLL = NULL;
|
|
130
|
+
hTrsdDLL = NULL;
|
|
131
|
+
BTRCALLIDX = NULL;
|
|
132
|
+
MYTICALLID = NULL;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
struct nsdbimpl
|
|
136
|
+
{
|
|
137
|
+
int refCount;
|
|
138
|
+
int tranCount;
|
|
139
|
+
unsigned short id;
|
|
140
|
+
short snapShotCount;
|
|
141
|
+
nstable* tables[nsdatabase::maxtables];
|
|
142
|
+
uchar_td clientID[16];
|
|
143
|
+
uchar_td* cid() {return clientID;}
|
|
144
|
+
_TCHAR bdfPath[MAX_PATH];
|
|
145
|
+
short tableCount;
|
|
146
|
+
short lockWaitCount;
|
|
147
|
+
short lockWaitTime;
|
|
148
|
+
bool uriMode;
|
|
149
|
+
bool uselongFilename;
|
|
150
|
+
bool localSharing;
|
|
151
|
+
|
|
152
|
+
nsdbimpl() : refCount(1), snapShotCount(0), tranCount(0), uselongFilename(false), tableCount(0),
|
|
153
|
+
lockWaitCount(10), lockWaitTime(100), localSharing(false), uriMode(false)
|
|
154
|
+
{
|
|
155
|
+
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
void setId(unsigned short id_)
|
|
159
|
+
{
|
|
160
|
+
id = id_;
|
|
161
|
+
|
|
162
|
+
// make client id
|
|
163
|
+
memset(clientID, 0, 12);
|
|
164
|
+
clientID[12] = 'G';
|
|
165
|
+
clientID[13] = 'X';
|
|
166
|
+
memcpy(&clientID[14], &id, 2);
|
|
167
|
+
bdfPath[0] = 0x00;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
nsdbimpl& operator= (const nsdbimpl & rt)
|
|
171
|
+
{
|
|
172
|
+
if (&rt != this)
|
|
173
|
+
{
|
|
174
|
+
lockWaitCount = rt.lockWaitCount;
|
|
175
|
+
lockWaitTime = rt.lockWaitCount;
|
|
176
|
+
uselongFilename = rt.uselongFilename;
|
|
177
|
+
uriMode = rt.uriMode;
|
|
178
|
+
}
|
|
179
|
+
return *this;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
boost::mutex g_mutex;
|
|
185
|
+
|
|
186
|
+
nsdatabase::nsdatabase() : m_stat(0)
|
|
187
|
+
{
|
|
188
|
+
m_nsimpl = new nsdbimpl();
|
|
189
|
+
int type = 0;
|
|
190
|
+
if (hBtrvDLL == 0x00)
|
|
191
|
+
type = smartLoadLibrary();
|
|
192
|
+
|
|
193
|
+
m_btrcallid = getBtrvEntryPoint();
|
|
194
|
+
if (m_btrcallid == NULL)
|
|
195
|
+
m_btrcallid = getTrnsctdEntryPoint();
|
|
196
|
+
|
|
197
|
+
if ((type == 2) || MYTICALLID)
|
|
198
|
+
setUseLongFilename(true);
|
|
199
|
+
else
|
|
200
|
+
{
|
|
201
|
+
btrVersions v;
|
|
202
|
+
memset(&v, 0, sizeof(btrVersions));
|
|
203
|
+
uchar_td posblk[POS_BLOCK_SIZE] = {0x00};
|
|
204
|
+
getBtrVersion(&v, posblk);
|
|
205
|
+
if ((v.versions[1].majorVersion >= 9) || (v.versions[0].majorVersion >= 9))
|
|
206
|
+
setUseLongFilename(true);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
for (int i = 0; i < maxtables; i++)
|
|
210
|
+
m_nsimpl->tables[i] = NULL;
|
|
211
|
+
|
|
212
|
+
boost::mutex::scoped_lock lck(g_mutex);
|
|
213
|
+
// serach empty
|
|
214
|
+
int i;
|
|
215
|
+
for (i = 0; i < MAX_BTRENGIN; i++)
|
|
216
|
+
if (engins()[i] == NULL)
|
|
217
|
+
break;
|
|
218
|
+
|
|
219
|
+
engins()[i] = this;
|
|
220
|
+
|
|
221
|
+
// no empty
|
|
222
|
+
if (MAX_BTRENGIN == i)
|
|
223
|
+
{
|
|
224
|
+
m_stat = -1;
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
m_nsimpl->setId((unsigned short)i);
|
|
228
|
+
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
int nsdatabase::refCount()const {return m_nsimpl->refCount;}
|
|
232
|
+
|
|
233
|
+
void nsdatabase::addref()
|
|
234
|
+
{
|
|
235
|
+
++m_nsimpl->refCount;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
void nsdatabase::release()
|
|
239
|
+
{
|
|
240
|
+
if (--m_nsimpl->refCount == 0)
|
|
241
|
+
delete this;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
nsdatabase::~nsdatabase()
|
|
245
|
+
{
|
|
246
|
+
reset();
|
|
247
|
+
|
|
248
|
+
boost::mutex::scoped_lock lck(g_mutex);
|
|
249
|
+
if (m_nsimpl->id != 0)
|
|
250
|
+
engins()[m_nsimpl->id] = NULL;
|
|
251
|
+
delete m_nsimpl;
|
|
252
|
+
#ifdef _WIN32
|
|
253
|
+
OutputDebugString(_T("delete database\n"));
|
|
254
|
+
#endif
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
nsdatabase* nsdatabase::clone() const
|
|
258
|
+
{
|
|
259
|
+
nsdatabase* p = new nsdatabase();
|
|
260
|
+
*p = *this;
|
|
261
|
+
return p;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
nsdatabase& nsdatabase:: operator = (const nsdatabase & rt)
|
|
265
|
+
{
|
|
266
|
+
if (&rt != this)
|
|
267
|
+
{
|
|
268
|
+
*m_nsimpl = *rt.m_nsimpl;
|
|
269
|
+
setUri(rt.uri());
|
|
270
|
+
m_btrcallid = rt.m_btrcallid;
|
|
271
|
+
}
|
|
272
|
+
return *this;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
int nsdatabase::enableTrn() const {return m_nsimpl->tranCount;}
|
|
276
|
+
|
|
277
|
+
short nsdatabase::stat() const {return m_stat;}
|
|
278
|
+
|
|
279
|
+
uchar_td* nsdatabase::clientID() const {return m_nsimpl->clientID;}
|
|
280
|
+
|
|
281
|
+
short nsdatabase::openTableCount() const {return m_nsimpl->tableCount;}
|
|
282
|
+
|
|
283
|
+
_TCHAR* nsdatabase::uri() const {return m_nsimpl->bdfPath;}
|
|
284
|
+
|
|
285
|
+
bool nsdatabase::uriMode() const {return m_nsimpl->uriMode;}
|
|
286
|
+
|
|
287
|
+
nstable** nsdatabase::tables() {return m_nsimpl->tables;}
|
|
288
|
+
|
|
289
|
+
short nsdatabase::lockWaitCount() const {return m_nsimpl->lockWaitCount;}
|
|
290
|
+
|
|
291
|
+
void nsdatabase::setLockWaitCount(short v) {m_nsimpl->lockWaitCount = v;}
|
|
292
|
+
|
|
293
|
+
short nsdatabase::lockWaitTime() const {return m_nsimpl->lockWaitTime;}
|
|
294
|
+
|
|
295
|
+
void nsdatabase::setLockWaitTime(short v) {m_nsimpl->lockWaitTime = v;}
|
|
296
|
+
|
|
297
|
+
bool nsdatabase::localSharing() const {return m_nsimpl->localSharing;}
|
|
298
|
+
|
|
299
|
+
void nsdatabase::setLocalSharing(bool v) {m_nsimpl->localSharing = v;}
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
bool nsdatabase::setUri(const _TCHAR* Path)
|
|
304
|
+
{
|
|
305
|
+
_TCHAR buf[MAX_PATH];
|
|
306
|
+
|
|
307
|
+
#ifdef _WIN32
|
|
308
|
+
_TCHAR* lpFilePart;
|
|
309
|
+
if (useLongFilename() == false)
|
|
310
|
+
{
|
|
311
|
+
GetFullPathName(Path, MAX_PATH, buf, &lpFilePart);
|
|
312
|
+
GetShortPathName(buf, m_nsimpl->bdfPath, MAX_PATH);
|
|
313
|
+
_tcsmupr((_TUCHAR*)m_nsimpl->bdfPath);
|
|
314
|
+
}
|
|
315
|
+
else
|
|
316
|
+
#endif
|
|
317
|
+
_tcscpy(m_nsimpl->bdfPath, Path);
|
|
318
|
+
|
|
319
|
+
m_nsimpl->uriMode = false;
|
|
320
|
+
if (_tcsstr(m_nsimpl->bdfPath, _T("btrv://")) || _tcsstr(m_nsimpl->bdfPath, _T("tdap://")))
|
|
321
|
+
m_nsimpl->uriMode = true;
|
|
322
|
+
#ifdef _WIN32
|
|
323
|
+
else
|
|
324
|
+
{
|
|
325
|
+
struct _stat statbuf;
|
|
326
|
+
if (_tstat(m_nsimpl->bdfPath, &statbuf) == -1)
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
#endif
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
void nsdatabase::createTable(fileSpec *pfs, uint_td len, const _TCHAR *pFullPath, short_td mode)
|
|
334
|
+
{
|
|
335
|
+
_TCHAR buf[MAX_PATH];
|
|
336
|
+
_TCHAR posblk[128] = {0x00};
|
|
337
|
+
#ifdef _WIN32
|
|
338
|
+
if ((useLongFilename() == false) && _tcsstr(pFullPath, _T(" ")))
|
|
339
|
+
{
|
|
340
|
+
GetShortPathName(pFullPath, buf, MAX_PATH);
|
|
341
|
+
}
|
|
342
|
+
else
|
|
343
|
+
#endif
|
|
344
|
+
{
|
|
345
|
+
_tcscpy(buf, pFullPath);
|
|
346
|
+
}
|
|
347
|
+
// tdap
|
|
348
|
+
if (isTransactdUri(buf))
|
|
349
|
+
{
|
|
350
|
+
if (setUseTransactd() == false)
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
char buf2[MAX_PATH]={0x00};;
|
|
355
|
+
const char* p = toServerUri(buf2, MAX_PATH, buf, isUseTransactd());
|
|
356
|
+
|
|
357
|
+
m_stat = m_btrcallid(TD_CREATETABLE, posblk, pfs, &len, (void*)p, (uchar_td)strlen(p),
|
|
358
|
+
(char_td)mode, m_nsimpl->clientID);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
void nsdatabase::dropTable(const _TCHAR* pFullPath)
|
|
362
|
+
{
|
|
363
|
+
_TCHAR buf[MAX_PATH];
|
|
364
|
+
_TCHAR posblk[128] = {0x00};
|
|
365
|
+
#ifdef _WIN32
|
|
366
|
+
if ((useLongFilename() == false) && _tcsstr(pFullPath, _T(" ")))
|
|
367
|
+
{
|
|
368
|
+
GetShortPathName(pFullPath, buf, MAX_PATH);
|
|
369
|
+
}
|
|
370
|
+
else
|
|
371
|
+
#endif
|
|
372
|
+
{
|
|
373
|
+
_tcscpy(buf, pFullPath);
|
|
374
|
+
}
|
|
375
|
+
// tdap
|
|
376
|
+
if (isTransactdUri(buf))
|
|
377
|
+
{
|
|
378
|
+
if (setUseTransactd() == false)
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
char buf2[MAX_PATH]={0x00};
|
|
383
|
+
const char* p = toServerUri(buf2, MAX_PATH, buf, isUseTransactd());
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
m_stat = m_btrcallid(TD_CREATETABLE, posblk, NULL, NULL, (void*)p, (uchar_td)strlen(p)+1, CR_SUBOP_DROP,
|
|
387
|
+
m_nsimpl->clientID);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
void nsdatabase::swapTablename(const _TCHAR* Name1, const _TCHAR* Name2)
|
|
391
|
+
{
|
|
392
|
+
_TCHAR posblk[128] = {0x00};
|
|
393
|
+
|
|
394
|
+
char buf1[MAX_PATH]={0x00};
|
|
395
|
+
char buf2[MAX_PATH]={0x00};
|
|
396
|
+
const char* p = toServerUri(buf1, MAX_PATH, Name1, isUseTransactd());
|
|
397
|
+
const char* p2 = toServerUri(buf2, MAX_PATH, Name2, isUseTransactd());
|
|
398
|
+
uint_td len = (uint_td)strlen(p);
|
|
399
|
+
|
|
400
|
+
m_stat = m_btrcallid(TD_CREATETABLE, posblk, (void*)p, &len, (void*)p2, (uchar_td)strlen(p2),
|
|
401
|
+
CR_SUBOP_SWAPNAME, m_nsimpl->clientID);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
void nsdatabase::rename(const _TCHAR* pFullPath, const _TCHAR* newName)
|
|
405
|
+
{
|
|
406
|
+
_TCHAR buf[MAX_PATH];
|
|
407
|
+
_TCHAR posblk[128] = {0x00};
|
|
408
|
+
#ifdef _WIN32
|
|
409
|
+
if ((useLongFilename() == false) && _tcsstr(pFullPath, _T(" ")))
|
|
410
|
+
{
|
|
411
|
+
GetShortPathName(pFullPath, buf, MAX_PATH);
|
|
412
|
+
}
|
|
413
|
+
else
|
|
414
|
+
#endif
|
|
415
|
+
{
|
|
416
|
+
_tcscpy(buf, pFullPath);
|
|
417
|
+
}
|
|
418
|
+
if (isTransactdUri(buf))
|
|
419
|
+
{
|
|
420
|
+
if (setUseTransactd() == false)
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
char buf2[MAX_PATH]={0x00};
|
|
425
|
+
const char* p = toServerUri(buf2, MAX_PATH, buf, isUseTransactd());
|
|
426
|
+
uint_td len = (uint_td)strlen(p);
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
char bufNew[MAX_PATH]={0x00};
|
|
431
|
+
#ifdef _WIN32
|
|
432
|
+
if ((useLongFilename() == false) && _tcsstr(newName, _T(" ")))
|
|
433
|
+
GetShortPathName(newName, buf, MAX_PATH);
|
|
434
|
+
else
|
|
435
|
+
#endif
|
|
436
|
+
_tcscpy(buf, newName);
|
|
437
|
+
toServerUri(bufNew, MAX_PATH, newName, isUseTransactd());
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
m_stat = m_btrcallid(TD_CREATETABLE, posblk, (void*)p, &len, (void*)bufNew, (uchar_td)strlen(bufNew),
|
|
442
|
+
CR_SUBOP_RENAME, m_nsimpl->clientID);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
void nsdatabase::registerTable(nstable* tb)
|
|
446
|
+
{
|
|
447
|
+
int i;
|
|
448
|
+
for (i = 0; i < maxtables; i++)
|
|
449
|
+
{
|
|
450
|
+
if (m_nsimpl->tables[i] == NULL)
|
|
451
|
+
{
|
|
452
|
+
m_nsimpl->tables[i] = tb;
|
|
453
|
+
m_nsimpl->tableCount++;
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
void nsdatabase::unregisterTable(nstable* table)
|
|
460
|
+
{
|
|
461
|
+
int i;
|
|
462
|
+
for (i = 0; i < maxtables; i++)
|
|
463
|
+
{
|
|
464
|
+
if (m_nsimpl->tables[i] == table)
|
|
465
|
+
{
|
|
466
|
+
m_nsimpl->tables[i] = NULL;
|
|
467
|
+
m_nsimpl->tableCount--;
|
|
468
|
+
break;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
void nsdatabase::reset()
|
|
475
|
+
{
|
|
476
|
+
int i;
|
|
477
|
+
|
|
478
|
+
if (m_nsimpl->tranCount)
|
|
479
|
+
{
|
|
480
|
+
#ifdef _WIN32
|
|
481
|
+
#ifdef ARBTREGN_PKG
|
|
482
|
+
int ret = MessageBox(NULL, _T("Is an uncompleted transaction aborted?"), NULL, 33);
|
|
483
|
+
#else
|
|
484
|
+
int ret = 2;
|
|
485
|
+
#endif
|
|
486
|
+
#else
|
|
487
|
+
int ret = 2;
|
|
488
|
+
#endif
|
|
489
|
+
|
|
490
|
+
m_nsimpl->tranCount = 1;
|
|
491
|
+
if (ret == 1)
|
|
492
|
+
abortTrn();
|
|
493
|
+
else
|
|
494
|
+
endTrn();
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
for (i = 0; i < maxtables; i++)
|
|
498
|
+
{
|
|
499
|
+
if (m_nsimpl->tables[i] != NULL)
|
|
500
|
+
{
|
|
501
|
+
m_nsimpl->tables[i]->destroy();
|
|
502
|
+
m_nsimpl->tables[i] = NULL;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
m_nsimpl->lockWaitCount = 10;
|
|
506
|
+
m_nsimpl->lockWaitTime = 200;
|
|
507
|
+
m_nsimpl->tableCount = 0;
|
|
508
|
+
m_nsimpl->bdfPath[0] = 0x00;
|
|
509
|
+
if (m_btrcallid)
|
|
510
|
+
{
|
|
511
|
+
m_stat = m_btrcallid(TD_RESET_CLIENT, NULL, NULL, NULL, NULL, 0, 0, m_nsimpl->clientID);
|
|
512
|
+
m_stat = m_btrcallid(TD_STOP_ENGINE, NULL, NULL, NULL, NULL, 0, 0, m_nsimpl->clientID);
|
|
513
|
+
if (m_stat == ERROR_TD_NOT_CONNECTED)
|
|
514
|
+
m_stat = STATUS_SUCCESS;
|
|
515
|
+
}
|
|
516
|
+
if (getBtrvEntryPoint())
|
|
517
|
+
m_btrcallid = getBtrvEntryPoint();
|
|
518
|
+
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
void nsdatabase::beginSnapshot()
|
|
522
|
+
{
|
|
523
|
+
if (m_nsimpl->snapShotCount == 0)
|
|
524
|
+
m_stat = m_btrcallid(TD_BEGIN_SHAPSHOT, NULL, NULL, NULL, NULL, 0, 0, m_nsimpl->clientID);
|
|
525
|
+
m_nsimpl->snapShotCount++;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
void nsdatabase::endSnapshot()
|
|
529
|
+
{
|
|
530
|
+
m_nsimpl->snapShotCount--;
|
|
531
|
+
if (m_nsimpl->snapShotCount == 0)
|
|
532
|
+
m_stat = m_btrcallid(TD_END_SNAPSHOT, NULL, NULL, NULL, NULL, 0, 0, m_nsimpl->clientID);
|
|
533
|
+
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
void nsdatabase::beginTrn(short BIAS)
|
|
537
|
+
{
|
|
538
|
+
if (m_nsimpl->tranCount == 0)
|
|
539
|
+
{
|
|
540
|
+
m_stat = m_btrcallid((ushort_td)(BIAS + TD_BEGIN_TRANSACTION), NULL, NULL, NULL, NULL, 0, 0,
|
|
541
|
+
m_nsimpl->clientID);
|
|
542
|
+
if (m_stat == 0)
|
|
543
|
+
m_nsimpl->tranCount++;
|
|
544
|
+
}else
|
|
545
|
+
m_nsimpl->tranCount++;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
void nsdatabase::endTrn()
|
|
549
|
+
{
|
|
550
|
+
|
|
551
|
+
m_nsimpl->tranCount--;
|
|
552
|
+
if (m_nsimpl->tranCount == 0)
|
|
553
|
+
{
|
|
554
|
+
m_stat = m_btrcallid(TD_END_TRANSACTION, NULL, NULL, NULL, NULL, 0, 0, m_nsimpl->clientID);
|
|
555
|
+
|
|
556
|
+
#ifdef _WIN32
|
|
557
|
+
g_lastTrnTime = GetTickCount();
|
|
558
|
+
#endif
|
|
559
|
+
}
|
|
560
|
+
if (m_nsimpl->tranCount < 0)
|
|
561
|
+
m_nsimpl->tranCount = 0;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
void nsdatabase::abortTrn()
|
|
565
|
+
{
|
|
566
|
+
m_stat = m_btrcallid(TD_ABORT_TRANSACTION, NULL, NULL, NULL, NULL, 0, 0, m_nsimpl->clientID);
|
|
567
|
+
|
|
568
|
+
m_nsimpl->tranCount = 0;
|
|
569
|
+
#ifdef _WIN32
|
|
570
|
+
g_lastTrnTime = GetTickCount();
|
|
571
|
+
#endif
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
short_td nsdatabase::tdapErr(HWND hWnd, _TCHAR* retbuf) {
|
|
575
|
+
return nstable::tdapErr(hWnd, m_stat, _T("Engin"), retbuf);}
|
|
576
|
+
|
|
577
|
+
void nsdatabase::getBtrVersion(btrVersions* Vers, uchar_td* posblk)
|
|
578
|
+
{
|
|
579
|
+
|
|
580
|
+
uchar_td posblkTmp[128] = {0x00};
|
|
581
|
+
if (posblk == NULL)
|
|
582
|
+
posblk = posblkTmp;
|
|
583
|
+
|
|
584
|
+
uint_td datalen = sizeof(btrVersions);
|
|
585
|
+
|
|
586
|
+
m_stat = m_btrcallid(TD_VERSION, posblk, Vers, &datalen, NULL, 0, 0, m_nsimpl->clientID);
|
|
587
|
+
{
|
|
588
|
+
bool remote = false;
|
|
589
|
+
if (uriMode())
|
|
590
|
+
remote = true;
|
|
591
|
+
#ifdef _WIN32
|
|
592
|
+
else if (_tcsstr(m_nsimpl->bdfPath, PSEPARATOR PSEPARATOR) == m_nsimpl->bdfPath)
|
|
593
|
+
remote = true;
|
|
594
|
+
else
|
|
595
|
+
{
|
|
596
|
+
_TCHAR drive[3] = {0x00};
|
|
597
|
+
_tcsncpy(drive, m_nsimpl->bdfPath, 2);
|
|
598
|
+
if (DRIVE_REMOTE == GetDriveType(drive))
|
|
599
|
+
remote = true;
|
|
600
|
+
}
|
|
601
|
+
#endif
|
|
602
|
+
if (remote)
|
|
603
|
+
{
|
|
604
|
+
//faile shareing
|
|
605
|
+
if (datalen / 5 == 2)
|
|
606
|
+
{
|
|
607
|
+
Vers->versions[2] = Vers->versions[1];
|
|
608
|
+
Vers->versions[2].type = 'F';
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
else
|
|
612
|
+
memset(&Vers->versions[2], 0, sizeof(btrVersion));
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
bool nsdatabase::useLongFilename() {return m_nsimpl->uselongFilename;}
|
|
618
|
+
|
|
619
|
+
void nsdatabase::setUseLongFilename(bool value) {m_nsimpl->uselongFilename = value;}
|
|
620
|
+
|
|
621
|
+
bool nsdatabase::setUseTransactd()
|
|
622
|
+
{
|
|
623
|
+
m_btrcallid = getTrnsctdEntryPoint();
|
|
624
|
+
if (m_btrcallid == NULL)
|
|
625
|
+
m_stat = STATUS_REQUESTER_DEACTIVE; // can not load db engin;
|
|
626
|
+
else
|
|
627
|
+
{
|
|
628
|
+
m_nsimpl->uriMode = true;
|
|
629
|
+
setLockWaitCount(0);
|
|
630
|
+
setLockWaitTime(0);
|
|
631
|
+
|
|
632
|
+
}
|
|
633
|
+
return (m_btrcallid != NULL);
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
bool nsdatabase::isTransactdUri(const _TCHAR* uri) {return (_tcsstr(uri, _T("tdap://")) != NULL);
|
|
637
|
+
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
bool nsdatabase::isUseTransactd() {return (m_btrcallid == getTrnsctdEntryPoint());}
|
|
641
|
+
|
|
642
|
+
void nsdatabase::readDatabaseDirectory(_TCHAR* retBuf, uchar_td buflen)
|
|
643
|
+
{
|
|
644
|
+
// keynum is drive name A=1 B=2 C=3 0=default
|
|
645
|
+
char tmp[128];
|
|
646
|
+
m_stat = m_btrcallid(TD_GETDIRECTORY, NULL, NULL, NULL, tmp, 128, 0, m_nsimpl->clientID);
|
|
647
|
+
toTChar(retBuf, tmp, buflen);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
bool nsdatabase::connect(const _TCHAR* URI, bool newConnection)
|
|
651
|
+
{
|
|
652
|
+
if (isTransactdUri(URI))
|
|
653
|
+
if (!setUseTransactd())
|
|
654
|
+
return false;
|
|
655
|
+
|
|
656
|
+
uint_td datalen = 0;
|
|
657
|
+
|
|
658
|
+
char uri_a[MAX_PATH]={0x00};
|
|
659
|
+
const char* p = toServerUri(uri_a, MAX_PATH, URI, isUseTransactd());
|
|
660
|
+
char_td keyNum = newConnection ? 3 : 0;
|
|
661
|
+
m_stat = m_btrcallid(TD_CONNECT, NULL, NULL, &datalen, (void*)p, (keylen_td)(strlen(p) + 1),
|
|
662
|
+
keyNum, clientID());
|
|
663
|
+
if (m_stat)
|
|
664
|
+
return false;
|
|
665
|
+
return true;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
bool nsdatabase::disconnect(const _TCHAR* URI)
|
|
669
|
+
{
|
|
670
|
+
if (isTransactdUri(URI))
|
|
671
|
+
if (!setUseTransactd())
|
|
672
|
+
return false;
|
|
673
|
+
uint_td datalen = 0;
|
|
674
|
+
char uri_a[MAX_PATH];
|
|
675
|
+
const char* p = toServerUri(uri_a, MAX_PATH, URI, isUseTransactd());
|
|
676
|
+
m_stat = m_btrcallid(TD_CONNECT, NULL, NULL, &datalen, (void*)p, (keylen_td)(strlen(p) + 1), 1,
|
|
677
|
+
clientID());
|
|
678
|
+
if (m_stat)
|
|
679
|
+
return false;
|
|
680
|
+
return true;
|
|
681
|
+
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
bool nsdatabase::trnsactionFlushWaitStatus()
|
|
685
|
+
{
|
|
686
|
+
bool ret = false;
|
|
687
|
+
#ifdef _WIN32
|
|
688
|
+
if (g_lastTrnTime)
|
|
689
|
+
ret = ((GetTickCount() - g_lastTrnTime) < 8000);
|
|
690
|
+
else
|
|
691
|
+
#endif
|
|
692
|
+
g_lastTrnTime = 0;
|
|
693
|
+
return ret;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
void nsdatabase::setExecCodePage(unsigned int codepage)
|
|
697
|
+
{
|
|
698
|
+
m_execCodepage = codepage;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
unsigned int nsdatabase::execCodePage()
|
|
702
|
+
{
|
|
703
|
+
return m_execCodepage;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
const char* nsdatabase::toServerUri(char* buf, int buflen, const _TCHAR* src, bool trd)
|
|
707
|
+
{
|
|
708
|
+
#ifdef _UNICODE
|
|
709
|
+
if (trd)
|
|
710
|
+
{
|
|
711
|
+
stringConverter cv(CP_UTF8, GetACP());
|
|
712
|
+
cv.convert(buf, buflen, src, strlen_t(src));
|
|
713
|
+
return buf;
|
|
714
|
+
}
|
|
715
|
+
#endif
|
|
716
|
+
return toChar(buf, src, buflen);
|
|
717
|
+
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
}// namespace client
|
|
721
|
+
}// namespace tdap
|
|
722
|
+
}// namespace protocol
|
|
723
|
+
}// namespace db
|
|
724
|
+
}// namespace bzs
|