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,863 @@
|
|
|
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 "database.h"
|
|
23
|
+
|
|
24
|
+
#include "table.h"
|
|
25
|
+
|
|
26
|
+
#include "dbDef.h"
|
|
27
|
+
#include <limits.h>
|
|
28
|
+
#include <sys/stat.h>
|
|
29
|
+
#include <stdio.h>
|
|
30
|
+
#include <vector>
|
|
31
|
+
#include "stringConverter.h"
|
|
32
|
+
|
|
33
|
+
#pragma package(smart_init)
|
|
34
|
+
|
|
35
|
+
namespace bzs
|
|
36
|
+
{
|
|
37
|
+
namespace db
|
|
38
|
+
{
|
|
39
|
+
namespace protocol
|
|
40
|
+
{
|
|
41
|
+
namespace tdap
|
|
42
|
+
{
|
|
43
|
+
namespace client
|
|
44
|
+
{
|
|
45
|
+
|
|
46
|
+
struct dbimple
|
|
47
|
+
{
|
|
48
|
+
|
|
49
|
+
_TCHAR rootDir[MAX_PATH];
|
|
50
|
+
bool isOpened;
|
|
51
|
+
dbdef* dbDef;
|
|
52
|
+
void* optionalData;
|
|
53
|
+
bool isTableReadOnly;
|
|
54
|
+
bool lockReadOnly;
|
|
55
|
+
deleteRecordFn m_deleteRecordFn;
|
|
56
|
+
copyDataFn m_copyDataFn;
|
|
57
|
+
|
|
58
|
+
dbimple() : dbDef(NULL), isOpened(false), m_deleteRecordFn(NULL),m_copyDataFn(NULL), optionalData(NULL),
|
|
59
|
+
isTableReadOnly(false), lockReadOnly(false)
|
|
60
|
+
{
|
|
61
|
+
rootDir[0] = 0x00;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
dbimple& operator = (const dbimple & rt)
|
|
65
|
+
{
|
|
66
|
+
if (&rt != this)
|
|
67
|
+
{
|
|
68
|
+
dbDef = rt.dbDef;
|
|
69
|
+
_tcscpy(rootDir, rt.rootDir);
|
|
70
|
+
isOpened = rt.isOpened;
|
|
71
|
+
optionalData = rt.optionalData;
|
|
72
|
+
isTableReadOnly = rt.isTableReadOnly;
|
|
73
|
+
lockReadOnly = rt.lockReadOnly;
|
|
74
|
+
m_deleteRecordFn = rt.m_deleteRecordFn;
|
|
75
|
+
m_copyDataFn = rt.m_copyDataFn;
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
return *this;
|
|
79
|
+
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
void database::destroy(database* db) {delete db;}
|
|
84
|
+
|
|
85
|
+
database::database() : nsdatabase()
|
|
86
|
+
{
|
|
87
|
+
m_impl = new dbimple();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
database::~database()
|
|
91
|
+
{
|
|
92
|
+
close();
|
|
93
|
+
delete m_impl;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
void database::release()
|
|
97
|
+
{
|
|
98
|
+
if (m_impl->dbDef)
|
|
99
|
+
{
|
|
100
|
+
m_impl->dbDef->release();
|
|
101
|
+
m_impl->dbDef = NULL;
|
|
102
|
+
}
|
|
103
|
+
nsdatabase::release();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
dbdef* database::dbDef() const {return m_impl->dbDef;}
|
|
107
|
+
|
|
108
|
+
const _TCHAR* database::rootDir() const {return m_impl->rootDir;}
|
|
109
|
+
|
|
110
|
+
void database::setRootDir(const _TCHAR* directory) {setDir(directory);}
|
|
111
|
+
|
|
112
|
+
void* database::optionalData() const {return m_impl->optionalData;}
|
|
113
|
+
|
|
114
|
+
void database::setOptionalData(void* v) {m_impl->optionalData = v;}
|
|
115
|
+
|
|
116
|
+
bool database::tableReadOnly() const {return m_impl->isTableReadOnly;}
|
|
117
|
+
|
|
118
|
+
const deleteRecordFn database::onDeleteRecord() const {return m_impl->m_deleteRecordFn;}
|
|
119
|
+
|
|
120
|
+
void database::setOnDeleteRecord(const deleteRecordFn v) {m_impl->m_deleteRecordFn = v;}
|
|
121
|
+
|
|
122
|
+
const copyDataFn database::onCopyData() const {return m_impl->m_copyDataFn;}
|
|
123
|
+
|
|
124
|
+
void database::setOnCopyData(const copyDataFn v) {m_impl->m_copyDataFn = v;}
|
|
125
|
+
|
|
126
|
+
void database::setLockReadOnly(bool v) {m_impl->lockReadOnly = v;}
|
|
127
|
+
|
|
128
|
+
bool database::isOpened() const {return m_impl->isOpened;}
|
|
129
|
+
|
|
130
|
+
void database::create(const _TCHAR* fullpath, short type)
|
|
131
|
+
{
|
|
132
|
+
if (!m_impl->dbDef)
|
|
133
|
+
m_impl->dbDef = new dbdef(this, type); // Create TabelDef here.
|
|
134
|
+
m_impl->dbDef->create(fullpath);
|
|
135
|
+
m_stat = m_impl->dbDef->stat();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
void database::drop()
|
|
139
|
+
{
|
|
140
|
+
if (m_impl->dbDef == NULL)
|
|
141
|
+
m_stat = STATUS_DB_YET_OPEN;
|
|
142
|
+
_TCHAR FullPath[MAX_PATH];
|
|
143
|
+
std::vector<std::_tstring>fileNames;
|
|
144
|
+
for (int i = 0; i <= m_impl->dbDef->tableCount(); i++)
|
|
145
|
+
{
|
|
146
|
+
if (m_impl->dbDef->tableDefs(i))
|
|
147
|
+
{
|
|
148
|
+
_stprintf_s(FullPath, MAX_PATH, _T("%s") PSEPARATOR _T("%s"), rootDir(),
|
|
149
|
+
m_impl->dbDef->tableDefs(i)->fileName());
|
|
150
|
+
fileNames.push_back(FullPath);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
fileNames.push_back(m_impl->dbDef->uri());
|
|
154
|
+
close();
|
|
155
|
+
if (m_stat)
|
|
156
|
+
return;
|
|
157
|
+
|
|
158
|
+
for (size_t i = 0; i < fileNames.size(); i++)
|
|
159
|
+
{
|
|
160
|
+
nsdatabase::dropTable(fileNames[i].c_str());
|
|
161
|
+
if (m_stat && (m_stat == STATUS_TABLE_NOTOPEN))
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
void database::dropTable(const _TCHAR* TableName)
|
|
167
|
+
{
|
|
168
|
+
_TCHAR FullPath[MAX_PATH];
|
|
169
|
+
_tcscpy(FullPath, rootDir());
|
|
170
|
+
_tcscat(FullPath, PSEPARATOR);
|
|
171
|
+
short index = m_impl->dbDef->tableNumByName(TableName);
|
|
172
|
+
if (index == -1)
|
|
173
|
+
m_stat = STATUS_TABLENAME_NOTFOUND;
|
|
174
|
+
else
|
|
175
|
+
_tcscat(FullPath, m_impl->dbDef->tableDefs(index)->fileName());
|
|
176
|
+
nsdatabase::dropTable(FullPath);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
void database::setDir(const _TCHAR* directory)
|
|
180
|
+
{
|
|
181
|
+
_tcscpy(m_impl->rootDir, directory);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
database& database:: operator = (const database & rt)
|
|
185
|
+
{
|
|
186
|
+
if (&rt != this)
|
|
187
|
+
{
|
|
188
|
+
nsdatabase::operator=(rt);
|
|
189
|
+
m_impl->dbimple:: operator=(*(rt.m_impl));
|
|
190
|
+
rt.m_impl->dbDef->addref();
|
|
191
|
+
}
|
|
192
|
+
return *this;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
database* database::clone()
|
|
196
|
+
{
|
|
197
|
+
if (!m_impl->dbDef)
|
|
198
|
+
m_impl->dbDef = new dbdef(this, TYPE_SCHEMA_BDF);
|
|
199
|
+
database* p = new database();
|
|
200
|
+
*p = *this;
|
|
201
|
+
return p;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
void database::getBtrVersion(btrVersions* versions)
|
|
205
|
+
{
|
|
206
|
+
uchar_td* posblk = NULL;
|
|
207
|
+
if (m_impl->dbDef)
|
|
208
|
+
posblk = const_cast<uchar_td*>(m_impl->dbDef->posblk());
|
|
209
|
+
nsdatabase::getBtrVersion(versions, posblk);
|
|
210
|
+
|
|
211
|
+
}
|
|
212
|
+
void database::onCopyDataInternal(table* tb, int recordCount, int count, bool& cancel)
|
|
213
|
+
{
|
|
214
|
+
if (m_impl->m_copyDataFn)
|
|
215
|
+
m_impl->m_copyDataFn(this, recordCount, count, cancel);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
void database::setTableReadOnly(bool value)
|
|
219
|
+
{
|
|
220
|
+
if (!m_impl->lockReadOnly)
|
|
221
|
+
m_impl->isTableReadOnly = value;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
void database::doOpen(const _TCHAR* uri, short type, short mode, const _TCHAR* ownername)
|
|
225
|
+
{
|
|
226
|
+
m_stat = STATUS_SUCCESS;
|
|
227
|
+
m_impl->dbDef->setDefType(type);
|
|
228
|
+
m_impl->dbDef->open(uri, (char_td)mode, ownername);
|
|
229
|
+
|
|
230
|
+
if ((m_stat == STATUS_SUCCESS) &&
|
|
231
|
+
(m_impl->dbDef->m_stat == STATUS_INVALID_OWNERNAME) && (type == 0))
|
|
232
|
+
m_impl->dbDef->m_stat = STATUS_DIFFERENT_DBVERSION;
|
|
233
|
+
|
|
234
|
+
m_stat = m_impl->dbDef->m_stat;
|
|
235
|
+
m_impl->isOpened = (m_stat == STATUS_SUCCESS);//important
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
bool database::open(const _TCHAR* _uri, short type, short mode, const _TCHAR* dir,
|
|
239
|
+
const _TCHAR* ownername)
|
|
240
|
+
{
|
|
241
|
+
|
|
242
|
+
_TCHAR buf[MAX_PATH];
|
|
243
|
+
m_stat = STATUS_SUCCESS;
|
|
244
|
+
if (!m_impl->isOpened)
|
|
245
|
+
{
|
|
246
|
+
if (setUri(_uri) == false)
|
|
247
|
+
{
|
|
248
|
+
m_stat = 11;
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
if (dir && dir[0])
|
|
252
|
+
{
|
|
253
|
+
setDir(dir);
|
|
254
|
+
if (m_stat)
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
else
|
|
258
|
+
{
|
|
259
|
+
if (m_impl->rootDir[0] == 0x00)
|
|
260
|
+
{
|
|
261
|
+
nstable::getDirURI(uri(), buf);
|
|
262
|
+
setDir(buf);
|
|
263
|
+
if (m_stat)
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (!m_impl->dbDef)
|
|
268
|
+
m_impl->dbDef = new dbdef(this, type);
|
|
269
|
+
|
|
270
|
+
doOpen(_uri, type, mode, ownername);
|
|
271
|
+
if ((m_stat == STATUS_TABLE_NOTOPEN) && isUseTransactd()
|
|
272
|
+
&& _tcsstr(_uri, TRANSACTD_SCHEMANAME))
|
|
273
|
+
{
|
|
274
|
+
// Specified TRANSACTD_SCHEMANAME and no table
|
|
275
|
+
// Auto make schema.
|
|
276
|
+
create(_uri, TYPE_SCHEMA_BDF);
|
|
277
|
+
if (m_stat == STATUS_SUCCESS)
|
|
278
|
+
{
|
|
279
|
+
doOpen(_uri, type, mode, ownername);
|
|
280
|
+
if (m_stat == STATUS_SUCCESS)
|
|
281
|
+
{
|
|
282
|
+
m_impl->dbDef->autoMakeSchema();
|
|
283
|
+
m_impl->dbDef->close();
|
|
284
|
+
doOpen(_uri, type, mode, ownername);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
}
|
|
290
|
+
if (m_impl->isOpened && onOpenAfter())
|
|
291
|
+
return true;
|
|
292
|
+
|
|
293
|
+
m_impl->isOpened = false;
|
|
294
|
+
m_impl->dbDef->close();
|
|
295
|
+
m_impl->dbDef->release();
|
|
296
|
+
m_impl->dbDef = NULL;
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
char* database::getContinuousList(int option)
|
|
301
|
+
{
|
|
302
|
+
char* fileList = (char*)malloc(64000);
|
|
303
|
+
memset(fileList, 0, 64000);
|
|
304
|
+
tabledef* TableDef;
|
|
305
|
+
_TCHAR buf[MAX_PATH];
|
|
306
|
+
char tmp[MAX_PATH];
|
|
307
|
+
char* tmpPtr;
|
|
308
|
+
for (short i = 0; i < m_impl->dbDef->tableCount(); i++)
|
|
309
|
+
{
|
|
310
|
+
TableDef = m_impl->dbDef->tableDefs(i);
|
|
311
|
+
if (TableDef)
|
|
312
|
+
{
|
|
313
|
+
getTableUri(buf, TableDef->id);
|
|
314
|
+
tmpPtr = (char*)toChar(tmp, buf, MAX_PATH);
|
|
315
|
+
char* p = strstr(tmpPtr, PSEPARATOR_A PSEPARATOR_A);
|
|
316
|
+
if (p)
|
|
317
|
+
p = strstr(p + 2, PSEPARATOR_A);
|
|
318
|
+
if (p == NULL)
|
|
319
|
+
p = tmpPtr;
|
|
320
|
+
strcat(fileList, p);
|
|
321
|
+
strcat(fileList, ",");
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
tmpPtr = (char*)toChar(tmp, uri(), MAX_PATH);
|
|
325
|
+
strcat(fileList, tmpPtr); // add schema table too.
|
|
326
|
+
return fileList;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
short database::continuous(char_td IsEnd, bool inclideRepfile)
|
|
330
|
+
{ // Local databse only.Cnat not use remote database.
|
|
331
|
+
if (!m_impl->isOpened)
|
|
332
|
+
return STATUS_DB_YET_OPEN;
|
|
333
|
+
char tmp[128] = {0x00};
|
|
334
|
+
char* buf = getContinuousList(inclideRepfile);
|
|
335
|
+
uint_td buflen = (uint_td)strlen(buf) + 1;
|
|
336
|
+
m_stat = m_btrcallid(TD_BACKUPMODE, tmp, buf, &buflen, 0, 0, IsEnd, clientID());
|
|
337
|
+
free(buf);
|
|
338
|
+
return m_stat;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
void database::doClose()
|
|
342
|
+
{
|
|
343
|
+
m_stat = STATUS_SUCCESS;
|
|
344
|
+
|
|
345
|
+
if (m_impl->dbDef)
|
|
346
|
+
m_impl->dbDef->release();
|
|
347
|
+
m_impl->dbDef = NULL;
|
|
348
|
+
|
|
349
|
+
nsdatabase::reset();
|
|
350
|
+
m_impl->isOpened = false;
|
|
351
|
+
m_impl->rootDir[0] = 0x00;
|
|
352
|
+
m_impl->lockReadOnly = false;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
void database::close() {doClose();}
|
|
356
|
+
|
|
357
|
+
_TCHAR* database::getTableUri(_TCHAR* buf, short FileNum)
|
|
358
|
+
{
|
|
359
|
+
m_stat = STATUS_SUCCESS;
|
|
360
|
+
if ((m_impl->dbDef) && (m_impl->isOpened))
|
|
361
|
+
{
|
|
362
|
+
if (_tcsstr(m_impl->dbDef->tableDefs(FileNum)->fileName(), PSEPARATOR) == NULL)
|
|
363
|
+
_stprintf_s(buf, MAX_PATH, _T("%s") PSEPARATOR _T("%s"), m_impl->rootDir,
|
|
364
|
+
m_impl->dbDef->tableDefs(FileNum)->fileName());
|
|
365
|
+
else
|
|
366
|
+
_tcscpy(buf, m_impl->dbDef->tableDefs(FileNum)->fileName());
|
|
367
|
+
return buf;
|
|
368
|
+
}
|
|
369
|
+
m_stat = STATUS_DB_YET_OPEN;
|
|
370
|
+
return NULL;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
table* database::openTable(const _TCHAR* TableName, short mode, bool AutoCreate,
|
|
374
|
+
const _TCHAR* OrnerName, const _TCHAR* pPath)
|
|
375
|
+
{
|
|
376
|
+
short filenum;
|
|
377
|
+
m_stat = 0;
|
|
378
|
+
if ((m_impl->dbDef) && (m_impl->isOpened))
|
|
379
|
+
{
|
|
380
|
+
filenum = m_impl->dbDef->tableNumByName(TableName);
|
|
381
|
+
if (filenum == -1)
|
|
382
|
+
{
|
|
383
|
+
m_stat = m_impl->dbDef->m_stat;
|
|
384
|
+
if (m_stat == STATUS_SUCCESS)
|
|
385
|
+
m_stat = STATUS_TABLENAME_NOTFOUND;
|
|
386
|
+
|
|
387
|
+
return NULL;
|
|
388
|
+
}
|
|
389
|
+
return openTable(filenum, mode, AutoCreate, OrnerName, pPath);
|
|
390
|
+
}
|
|
391
|
+
m_stat = STATUS_DB_YET_OPEN;
|
|
392
|
+
return NULL;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
table* database::createTableObject()
|
|
396
|
+
{
|
|
397
|
+
return new table(this);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
table* database::openTable(short FileNum, short mode, bool AutoCreate, const _TCHAR* OrnerName,
|
|
401
|
+
const _TCHAR* path)
|
|
402
|
+
{
|
|
403
|
+
/* Select directory
|
|
404
|
+
- Fiest, Specify Direct.
|
|
405
|
+
- Second, specified in filename.
|
|
406
|
+
- Thard, Smae as schem table.
|
|
407
|
+
*/
|
|
408
|
+
|
|
409
|
+
_TCHAR buf[MAX_PATH];
|
|
410
|
+
bool regularDir = false;
|
|
411
|
+
bool NewFile = false;
|
|
412
|
+
m_stat = 0;
|
|
413
|
+
|
|
414
|
+
if ((!m_impl->dbDef) || (!m_impl->isOpened)) {
|
|
415
|
+
m_stat = STATUS_DB_YET_OPEN;
|
|
416
|
+
return NULL;
|
|
417
|
+
}
|
|
418
|
+
if (m_impl->rootDir[0] == 0x00)
|
|
419
|
+
{
|
|
420
|
+
m_stat = STATUS_DB_YET_OPEN;
|
|
421
|
+
return NULL;
|
|
422
|
+
}
|
|
423
|
+
tabledef* td = m_impl->dbDef->tableDefs(FileNum);
|
|
424
|
+
if (!td)
|
|
425
|
+
{
|
|
426
|
+
m_stat = STATUS_INVALID_TABLE_IDX;
|
|
427
|
+
return NULL;
|
|
428
|
+
}
|
|
429
|
+
table* tb = createTableObject();
|
|
430
|
+
dbdef::cacheFieldPos(td);
|
|
431
|
+
|
|
432
|
+
if ((path == NULL) || (path[0]==0x00))
|
|
433
|
+
{
|
|
434
|
+
if (_tcsstr(td->fileName(), PSEPARATOR) == NULL)
|
|
435
|
+
{
|
|
436
|
+
getTableUri(buf, FileNum);
|
|
437
|
+
regularDir = true;
|
|
438
|
+
}
|
|
439
|
+
else
|
|
440
|
+
_tcscpy(buf, td->fileName());
|
|
441
|
+
}
|
|
442
|
+
else
|
|
443
|
+
_tcscpy(buf, path);
|
|
444
|
+
|
|
445
|
+
if (m_impl->isTableReadOnly)
|
|
446
|
+
mode = TD_OPEN_READONLY;
|
|
447
|
+
tb->open(buf, (char_td)mode, OrnerName);
|
|
448
|
+
if ((tb->m_stat == STATUS_TABLE_NOTOPEN) || (tb->m_stat == ERROR_NOSPECIFY_TABLE))
|
|
449
|
+
{
|
|
450
|
+
if (AutoCreate)
|
|
451
|
+
{
|
|
452
|
+
createTable(FileNum, buf);
|
|
453
|
+
if (m_stat != STATUS_SUCCESS)
|
|
454
|
+
{
|
|
455
|
+
m_stat = tb->m_stat;
|
|
456
|
+
tb->release();
|
|
457
|
+
return NULL;
|
|
458
|
+
}
|
|
459
|
+
else
|
|
460
|
+
{
|
|
461
|
+
tb->open(buf, (char_td)mode);
|
|
462
|
+
if ((OrnerName) && (OrnerName[0]))
|
|
463
|
+
tb->setOwnerName(OrnerName);
|
|
464
|
+
NewFile = true;
|
|
465
|
+
}
|
|
466
|
+
}else
|
|
467
|
+
{
|
|
468
|
+
m_stat = tb->m_stat;
|
|
469
|
+
tb->release();
|
|
470
|
+
return NULL;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
tb->init(td, FileNum, regularDir);
|
|
474
|
+
|
|
475
|
+
if ((m_stat != 0) || (tb->m_stat != 0) || !onTableOpened(tb, FileNum, mode, NewFile))
|
|
476
|
+
{
|
|
477
|
+
m_stat = tb->m_stat;
|
|
478
|
+
tb->release();
|
|
479
|
+
return NULL;
|
|
480
|
+
}
|
|
481
|
+
return tb;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
bool database::createTable(short FileNum, const _TCHAR* FilePath)
|
|
485
|
+
{
|
|
486
|
+
if (isTransactdUri(FilePath))
|
|
487
|
+
{
|
|
488
|
+
if (setUseTransactd() == false)
|
|
489
|
+
return false;
|
|
490
|
+
|
|
491
|
+
char buf2[MAX_PATH]={0x00};
|
|
492
|
+
_TCHAR posblk[128] = {0x00};
|
|
493
|
+
|
|
494
|
+
const char* p = toServerUri(buf2, MAX_PATH, FilePath, isUseTransactd());
|
|
495
|
+
|
|
496
|
+
m_stat = m_btrcallid(TD_CREATETABLE, posblk, m_impl->dbDef->tableDefs(FileNum),
|
|
497
|
+
&m_impl->dbDef->m_datalen, (void*)p, (uchar_td)strlen(p), CR_SUBOP_BY_TABLEDEF /* exists check */ ,
|
|
498
|
+
clientID());
|
|
499
|
+
}
|
|
500
|
+
else
|
|
501
|
+
{
|
|
502
|
+
const _TCHAR* buf;
|
|
503
|
+
fileSpec* fs = (fileSpec*) malloc(1024);
|
|
504
|
+
if (fs == NULL)
|
|
505
|
+
{
|
|
506
|
+
m_stat = STATUS_CANT_ALLOC_MEMORY;
|
|
507
|
+
return false;
|
|
508
|
+
}
|
|
509
|
+
m_impl->dbDef->getFileSpec(fs, FileNum);
|
|
510
|
+
if (FilePath)
|
|
511
|
+
buf = FilePath;
|
|
512
|
+
else
|
|
513
|
+
buf = m_impl->dbDef->tableDefs(FileNum)->fileName();
|
|
514
|
+
nsdatabase::createTable(fs, 1024, buf, CR_SUBOP_BY_FILESPEC);
|
|
515
|
+
free(fs);
|
|
516
|
+
}
|
|
517
|
+
return (m_stat == 0);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
int moveVaileRecord(table* src)
|
|
521
|
+
{
|
|
522
|
+
int count = 0;
|
|
523
|
+
bookmark_td bm = 0;
|
|
524
|
+
src->stepLast();
|
|
525
|
+
while (src->stat() == STATUS_SUCCESS)
|
|
526
|
+
{
|
|
527
|
+
bm = src->bookmark();
|
|
528
|
+
++count;
|
|
529
|
+
src->stepPrev();
|
|
530
|
+
}
|
|
531
|
+
if (count)
|
|
532
|
+
{
|
|
533
|
+
src->seekByBookmark(bm);
|
|
534
|
+
return count;
|
|
535
|
+
}
|
|
536
|
+
return 0;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
short database::assignSchemaData(dbdef* src)
|
|
540
|
+
{
|
|
541
|
+
beginTrn();
|
|
542
|
+
int Count;
|
|
543
|
+
|
|
544
|
+
Count = 1;
|
|
545
|
+
|
|
546
|
+
dbdef* defDest = dbDef();
|
|
547
|
+
int recordCount = src->tableCount();
|
|
548
|
+
|
|
549
|
+
for (int i=0;i<=src->tableCount();i++)
|
|
550
|
+
{
|
|
551
|
+
tabledef* td = src->tableDefs(i);
|
|
552
|
+
if (td)
|
|
553
|
+
{
|
|
554
|
+
tabledef tdtmp = *td;
|
|
555
|
+
tdtmp.fieldCount = 0;
|
|
556
|
+
tdtmp.keyCount = 0;
|
|
557
|
+
defDest->insertTable(&tdtmp);
|
|
558
|
+
for (int j=0;j<td->fieldCount;++j)
|
|
559
|
+
{
|
|
560
|
+
fielddef& fd = td->fieldDefs[j];
|
|
561
|
+
*defDest->insertField(td->id, j) = fd;
|
|
562
|
+
}
|
|
563
|
+
for (int j=0;j<td->keyCount;++j)
|
|
564
|
+
{
|
|
565
|
+
keydef& kd = td->keyDefs[j];
|
|
566
|
+
*defDest->insertKey(td->id, j) = kd;
|
|
567
|
+
}
|
|
568
|
+
defDest->updateTableDef(td->id);
|
|
569
|
+
if (defDest->stat() != 0) break;
|
|
570
|
+
}
|
|
571
|
+
bool Cancel = false;
|
|
572
|
+
onCopyDataInternal(NULL, recordCount, Count, Cancel);
|
|
573
|
+
if (Cancel)
|
|
574
|
+
return -1;
|
|
575
|
+
Count++;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
if ((nstable::tdapErr((HWND)NULL, src->stat()) == 0) && (defDest->stat() == 0))
|
|
580
|
+
{
|
|
581
|
+
endTrn();
|
|
582
|
+
return 0;
|
|
583
|
+
}
|
|
584
|
+
abortTrn();
|
|
585
|
+
if (nstable::tdapErr((HWND)NULL, src->stat()))
|
|
586
|
+
return src->stat();
|
|
587
|
+
|
|
588
|
+
return defDest->stat();
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
/* Copy from src to dest table.
|
|
592
|
+
* Copy as same field name.
|
|
593
|
+
* If turbo then copy use memcpy and offset dest of first address.
|
|
594
|
+
*/
|
|
595
|
+
#pragma warn -8004
|
|
596
|
+
short database::copyTableData(table* dest, table* src, bool turbo, int offset, short keyNum,
|
|
597
|
+
int maxSkip)
|
|
598
|
+
{
|
|
599
|
+
ushort_td ins_rows = 0;
|
|
600
|
+
bool repData = false;
|
|
601
|
+
if (_tcsstr(dest->tableDef()->fileName(), _T("rep.dat")))
|
|
602
|
+
repData = true;
|
|
603
|
+
|
|
604
|
+
int SkipCount = 0;
|
|
605
|
+
short NewFieldNum[256] = {-1};
|
|
606
|
+
int cpytype[256] = {0}; // 0 mem 1 str
|
|
607
|
+
short i, j;
|
|
608
|
+
int Count;
|
|
609
|
+
int recordCount = src->recordCount();
|
|
610
|
+
for (i = 0; i < src->tableDef()->fieldCount; i++)
|
|
611
|
+
{
|
|
612
|
+
for (j = 0; j < dest->tableDef()->fieldCount; j++)
|
|
613
|
+
{
|
|
614
|
+
if (strcmp(dest->tableDef()->fieldDefs[j].nameA(),
|
|
615
|
+
src->tableDef()->fieldDefs[i].nameA()) == 0)
|
|
616
|
+
{
|
|
617
|
+
NewFieldNum[i] = j;
|
|
618
|
+
if (src->tableDef()->fieldDefs[i].type == ft_lvar)
|
|
619
|
+
cpytype[i] = 0;
|
|
620
|
+
else if (src->tableDef()->fieldDefs[i].type != dest->tableDef()
|
|
621
|
+
->fieldDefs[NewFieldNum[i]].type)
|
|
622
|
+
cpytype[i] = 1; //diffrent type
|
|
623
|
+
else if (src->tableDef()->fieldDefs[i].len != dest->tableDef()
|
|
624
|
+
->fieldDefs[NewFieldNum[i]].len)
|
|
625
|
+
cpytype[i] = 1; //different size
|
|
626
|
+
else
|
|
627
|
+
cpytype[i] = 0;
|
|
628
|
+
break;
|
|
629
|
+
}
|
|
630
|
+
else
|
|
631
|
+
NewFieldNum[i] = -1;
|
|
632
|
+
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
src->setKeyNum((char_td)keyNum);
|
|
636
|
+
if (keyNum == -1)
|
|
637
|
+
src->stepFirst();
|
|
638
|
+
else
|
|
639
|
+
src->seekFirst();
|
|
640
|
+
Count = 1;
|
|
641
|
+
|
|
642
|
+
int len;
|
|
643
|
+
while (1)
|
|
644
|
+
{
|
|
645
|
+
if (src->stat())
|
|
646
|
+
{
|
|
647
|
+
while (src->stat() != STATUS_EOF)
|
|
648
|
+
{
|
|
649
|
+
if (maxSkip != -1)
|
|
650
|
+
break;
|
|
651
|
+
if (recordCount < SkipCount + Count)
|
|
652
|
+
{
|
|
653
|
+
if (src->stat() == STATUS_IO_ERROR)
|
|
654
|
+
{
|
|
655
|
+
int n = moveVaileRecord(src);
|
|
656
|
+
if (n)
|
|
657
|
+
SkipCount = recordCount - n - Count;
|
|
658
|
+
else
|
|
659
|
+
break;
|
|
660
|
+
}
|
|
661
|
+
else
|
|
662
|
+
break;
|
|
663
|
+
}
|
|
664
|
+
if (keyNum == -1)
|
|
665
|
+
src->stepNext();
|
|
666
|
+
else
|
|
667
|
+
src->seekNext();
|
|
668
|
+
|
|
669
|
+
SkipCount++;
|
|
670
|
+
if (src->stat() == STATUS_SUCCESS)
|
|
671
|
+
break;
|
|
672
|
+
|
|
673
|
+
}
|
|
674
|
+
if (src->stat())
|
|
675
|
+
break;
|
|
676
|
+
}
|
|
677
|
+
dest->clearBuffer();
|
|
678
|
+
if (turbo)
|
|
679
|
+
{
|
|
680
|
+
if (dest->m_buflen + offset < src->datalen())
|
|
681
|
+
return STATUS_CANT_ALLOC_MEMORY;
|
|
682
|
+
if (offset)
|
|
683
|
+
memset(dest->fieldPtr(0), 0, offset);
|
|
684
|
+
memcpy((char*)dest->fieldPtr(0) + offset, src->fieldPtr(0), src->datalen());
|
|
685
|
+
}
|
|
686
|
+
else
|
|
687
|
+
{
|
|
688
|
+
for (i = 0; i < src->tableDef()->fieldCount; i++)
|
|
689
|
+
{
|
|
690
|
+
if (NewFieldNum[i] != -1)
|
|
691
|
+
{
|
|
692
|
+
// If diffrent field type then convert to string then copy.
|
|
693
|
+
if (cpytype[i] != 0)
|
|
694
|
+
dest->setFV(NewFieldNum[i], src->getFVstr(i));
|
|
695
|
+
else
|
|
696
|
+
{
|
|
697
|
+
len = src->tableDef()->fieldDefs[i].len;
|
|
698
|
+
if (src->tableDef()->fieldDefs[i].len >
|
|
699
|
+
dest->tableDef()->fieldDefs[NewFieldNum[i]].len)
|
|
700
|
+
len = dest->tableDef()->fieldDefs[NewFieldNum[i]].len;
|
|
701
|
+
memcpy(dest->fieldPtr(NewFieldNum[i]), src->fieldPtr(i), len);
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
bool Cancel = false;
|
|
707
|
+
onCopyDataInternal(dest, recordCount, Count, Cancel);
|
|
708
|
+
if (Cancel)
|
|
709
|
+
return -1;
|
|
710
|
+
Count++;
|
|
711
|
+
|
|
712
|
+
if (repData)
|
|
713
|
+
{
|
|
714
|
+
|
|
715
|
+
dest->m_datalen = src->m_datalen;
|
|
716
|
+
dest->tdap(TD_REC_INSERT);
|
|
717
|
+
}
|
|
718
|
+
else
|
|
719
|
+
ins_rows += dest->insert();
|
|
720
|
+
if (dest->stat() == STATUS_INVALID_VALLEN)
|
|
721
|
+
SkipCount++;
|
|
722
|
+
else if (dest->stat() == STATUS_DUPPLICATE_KEYVALUE)
|
|
723
|
+
SkipCount++;
|
|
724
|
+
else if (dest->stat() != STATUS_SUCCESS)
|
|
725
|
+
return dest->stat();
|
|
726
|
+
if (keyNum == -1)
|
|
727
|
+
src->stepNext();
|
|
728
|
+
else
|
|
729
|
+
src->seekNext();
|
|
730
|
+
}
|
|
731
|
+
if ((SkipCount) && (maxSkip == -1))
|
|
732
|
+
{
|
|
733
|
+
bool Cancel = false;
|
|
734
|
+
onCopyDataInternal(dest, recordCount, Count, Cancel);
|
|
735
|
+
if (Cancel)
|
|
736
|
+
return -1;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
if (src->stat() == 9)
|
|
740
|
+
return 0;
|
|
741
|
+
return src->stat();
|
|
742
|
+
}
|
|
743
|
+
#pragma warn .8004
|
|
744
|
+
|
|
745
|
+
void database::doConvertTable(short TableIndex, bool Turbo, const _TCHAR* OwnerName)
|
|
746
|
+
{
|
|
747
|
+
table* src;
|
|
748
|
+
table* dest;
|
|
749
|
+
_TCHAR szTempPath[MAX_PATH];
|
|
750
|
+
_TCHAR buf[MAX_PATH];
|
|
751
|
+
|
|
752
|
+
short ret;
|
|
753
|
+
if (m_impl->dbDef->tableDefs(TABLE_NUM_TMP) == NULL)
|
|
754
|
+
{
|
|
755
|
+
m_stat = STATUS_NODEF_FOR_CONVERT;
|
|
756
|
+
return;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
tabledef* TableDef = m_impl->dbDef->tableDefs(TABLE_NUM_TMP);
|
|
760
|
+
TableDef->fieldDefs = dbdef::getFieldDef(TableDef);
|
|
761
|
+
TableDef->keyDefs = dbdef::getKeyDef(TableDef);
|
|
762
|
+
|
|
763
|
+
src = openTable(TABLE_NUM_TMP, TD_OPEN_EXCLUSIVE, false, OwnerName);
|
|
764
|
+
if (!src)
|
|
765
|
+
return;
|
|
766
|
+
|
|
767
|
+
TableDef = m_impl->dbDef->tableDefs(TableIndex);
|
|
768
|
+
short len = TableDef->maxRecordLen;
|
|
769
|
+
|
|
770
|
+
TableDef->preAlloc = (ushort_td)(src->recordCount() / TableDef->pageSize / len);
|
|
771
|
+
TableDef->flags.bit2 = true;
|
|
772
|
+
|
|
773
|
+
_tcscpy(szTempPath, getTableUri(buf, TableIndex));
|
|
774
|
+
|
|
775
|
+
_TCHAR* pireod = _tcsrchr(szTempPath, '.');
|
|
776
|
+
if (pireod)
|
|
777
|
+
* pireod = 0x00;
|
|
778
|
+
_tcscat(szTempPath, _T("_conv_dest.tmp"));
|
|
779
|
+
|
|
780
|
+
createTable(TableIndex, szTempPath);
|
|
781
|
+
dest = openTable(TableIndex, TD_OPEN_EXCLUSIVE, true, NULL, szTempPath);
|
|
782
|
+
if (!dest)
|
|
783
|
+
{
|
|
784
|
+
src->release();
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
787
|
+
beginTrn();
|
|
788
|
+
ret = 0;
|
|
789
|
+
dest->setNoUpdateTimeStamp(true);
|
|
790
|
+
if (src->recordCount(false)) // estimate
|
|
791
|
+
ret = copyTableData(dest, src, Turbo);
|
|
792
|
+
if (ret == 0)
|
|
793
|
+
endTrn();
|
|
794
|
+
else
|
|
795
|
+
abortTrn();
|
|
796
|
+
dest->release();
|
|
797
|
+
src->release();
|
|
798
|
+
|
|
799
|
+
|
|
800
|
+
if (ret == 0)
|
|
801
|
+
{
|
|
802
|
+
_TCHAR tmp[MAX_PATH];
|
|
803
|
+
_tcscpy(tmp, getTableUri(buf, TableIndex));
|
|
804
|
+
if (isUseTransactd())
|
|
805
|
+
swapTablename(szTempPath, tmp);
|
|
806
|
+
else
|
|
807
|
+
{
|
|
808
|
+
|
|
809
|
+
_TCHAR* pireod = _tcsrchr(tmp, '.');
|
|
810
|
+
if (pireod)
|
|
811
|
+
* pireod = 0x00;
|
|
812
|
+
_tcscat(tmp, _T("_conv_src.tmp"));
|
|
813
|
+
rename(getTableUri(buf, TableIndex), tmp);
|
|
814
|
+
if (m_stat)
|
|
815
|
+
return;
|
|
816
|
+
rename(szTempPath, getTableUri(buf, TableIndex));
|
|
817
|
+
if (m_stat)
|
|
818
|
+
{
|
|
819
|
+
rename(tmp, getTableUri(buf, TableIndex));
|
|
820
|
+
return;
|
|
821
|
+
}
|
|
822
|
+
nsdatabase::dropTable(tmp);
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
else
|
|
826
|
+
m_stat = ret;
|
|
827
|
+
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
void database::convertTable(short tableIndex, bool turbo, const _TCHAR* ownername)
|
|
831
|
+
{
|
|
832
|
+
doConvertTable(tableIndex, turbo, ownername);
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
bool database::existsTableFile(short TableIndex, const _TCHAR* OwnerName)
|
|
836
|
+
{
|
|
837
|
+
|
|
838
|
+
if (TableIndex == TABLE_NUM_TMP)
|
|
839
|
+
{
|
|
840
|
+
m_impl->dbDef->tableDefs(TABLE_NUM_TMP)->fieldDefs =
|
|
841
|
+
dbdef::getFieldDef(m_impl->dbDef->tableDefs(TABLE_NUM_TMP));
|
|
842
|
+
m_impl->dbDef->tableDefs(TABLE_NUM_TMP)->keyDefs = dbdef::getKeyDef(m_impl->dbDef->tableDefs(512));
|
|
843
|
+
}
|
|
844
|
+
table* bao = openTable(TableIndex, TD_OPEN_READONLY, false, OwnerName);
|
|
845
|
+
bool ret = false;
|
|
846
|
+
if (m_stat == STATUS_TABLE_NOTOPEN)
|
|
847
|
+
ret = false;
|
|
848
|
+
else if (m_stat == STATUS_INVALID_OWNERNAME)
|
|
849
|
+
ret = true;
|
|
850
|
+
else if (m_stat == STATUS_SUCCESS)
|
|
851
|
+
ret = true;
|
|
852
|
+
if (bao)
|
|
853
|
+
bao->release();
|
|
854
|
+
m_stat = 0;
|
|
855
|
+
return ret;
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
|
|
859
|
+
}// namespace client
|
|
860
|
+
}// namespace btrv
|
|
861
|
+
}// namespace protocol
|
|
862
|
+
}// namespace db
|
|
863
|
+
}// namespace bzs
|