transactd 2.0.1 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/BUILD_UNIX-JA +6 -6
- data/README +16 -16
- data/README-JA +16 -16
- data/bin/common/tdclc_32_2_1.dll +0 -0
- data/bin/common/tdclc_64_2_1.dll +0 -0
- data/build/common/transactd_cl_common.cmake +0 -1
- data/build/common/transactd_common.cmake +28 -38
- data/build/swig/ruby/ruby.swg +36 -30
- data/build/swig/ruby/tdclrb_wrap.cpp +35016 -0
- data/build/swig/tdcl.i +217 -62
- data/build/tdclc/CMakeLists.txt +14 -26
- data/build/tdclc/libtdclcm.map +4 -0
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +0 -0
- data/build/tdclcpp/CMakeLists.txt +7 -22
- data/build/tdclcpp/tdclcpp.rc +0 -0
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/CMakeLists.txt +7 -49
- data/build/tdclrb/tdclrb.rc +62 -0
- data/source/bzs/db/blobBuffer.h +5 -0
- data/source/bzs/db/blobStructs.h +2 -0
- data/source/bzs/db/engine/mysql/IReadRecords.h +9 -0
- data/source/bzs/db/engine/mysql/database.cpp +391 -169
- data/source/bzs/db/engine/mysql/database.h +178 -40
- data/source/bzs/db/engine/mysql/dbManager.cpp +45 -3
- data/source/bzs/db/engine/mysql/dbManager.h +3 -39
- data/source/bzs/db/engine/mysql/errorMessage.cpp +11 -7
- data/source/bzs/db/engine/mysql/errorMessage.h +1 -1
- data/source/bzs/db/engine/mysql/mydebuglog.cpp +1 -2
- data/source/bzs/db/engine/mysql/mysqlInternal.h +8 -8
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +11 -0
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +41 -6
- data/source/bzs/db/protocol/tdap/client/activeTable.h +177 -8
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +141 -62
- data/source/bzs/db/protocol/tdap/client/client.cpp +39 -35
- data/source/bzs/db/protocol/tdap/client/client.h +52 -25
- data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +17 -0
- data/source/bzs/db/protocol/tdap/client/connectionPool.h +1 -0
- data/source/bzs/db/protocol/tdap/client/database.cpp +5 -1
- data/source/bzs/db/protocol/tdap/client/database.h +1 -1
- data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +49 -12
- data/source/bzs/db/protocol/tdap/client/databaseManager.h +42 -5
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +4 -2
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +71 -41
- data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +49 -49
- data/source/bzs/db/protocol/tdap/client/field.cpp +22 -13
- data/source/bzs/db/protocol/tdap/client/field.h +7 -3
- data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +0 -1
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
- data/source/bzs/db/protocol/tdap/client/fields.h +111 -24
- data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/filter.h +687 -310
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +12 -4
- data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +190 -32
- data/source/bzs/db/protocol/tdap/client/memRecord.h +64 -22
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +4 -4
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +6 -3
- data/source/bzs/db/protocol/tdap/client/nsTable.h +1 -1
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +19 -8
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +194 -87
- data/source/bzs/db/protocol/tdap/client/request.h +84 -26
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +22 -12
- data/source/bzs/db/protocol/tdap/client/table.cpp +494 -286
- data/source/bzs/db/protocol/tdap/client/table.h +48 -5
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +133 -87
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +22 -22
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +43 -18
- data/source/bzs/db/protocol/tdap/client/trnsctcl.def +3 -3
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +1 -0
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +268 -74
- data/source/bzs/db/protocol/tdap/mysql/request.h +4 -4
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +179 -43
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
- data/source/bzs/db/protocol/tdap/tdapRequest.h +15 -14
- data/source/bzs/db/protocol/tdap/tdapSchema.h +125 -90
- data/source/bzs/db/protocol/tdap/tdapcapi.h +46 -5
- data/source/bzs/db/transactd/appModule.h +1 -1
- data/source/bzs/db/transactd/connManager.cpp +2 -0
- data/source/bzs/db/transactd/transactd.cpp +1 -0
- data/source/bzs/env/compiler.h +10 -0
- data/source/bzs/env/mbcswchrLinux.cpp +42 -6
- data/source/bzs/env/mbcswchrLinux.h +40 -12
- data/source/bzs/example/queryData.cpp +33 -4
- data/source/bzs/netsvc/client/iconnection.h +107 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +15 -1
- data/source/bzs/netsvc/client/tcpClient.h +96 -87
- data/source/bzs/netsvc/server/serverCpt.cpp +5 -6
- data/source/bzs/rtl/benchmark.cpp +2 -2
- data/source/bzs/rtl/stringBuffers.cpp +3 -3
- data/source/bzs/rtl/stringBuffers.h +2 -2
- data/source/bzs/test/tdclatl/bench_query_atl.js +92 -99
- data/source/bzs/test/tdclatl/test_query_atl.js +224 -115
- data/source/bzs/test/tdclphp/bench.php +126 -101
- data/source/bzs/test/tdclphp/transactd_Test.php +1122 -158
- data/source/bzs/test/tdclrb/bench_tdclcpp.rb +12 -14
- data/source/bzs/test/tdclrb/transactd_spec.rb +1127 -142
- data/source/bzs/test/transactdBench/query_bench.cpp +32 -15
- data/source/bzs/test/transactdBench/scaling_bench.cpp +32 -7
- data/source/bzs/test/transactdBench/transactdBench.cpp +1 -1
- data/source/bzs/test/transactdBench/workerBase.h +46 -0
- data/source/bzs/test/transactdBench/workerMySQLImple.h +15 -7
- data/source/bzs/test/transactdBench/workerTransactdImple.h +10 -18
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +1487 -174
- data/source/global/ormsrcgen/main.cpp +2 -0
- data/source/global/tdclatl/Database.cpp +2 -2
- data/source/global/tdclatl/Database.h +1 -1
- data/source/global/tdclatl/FieldDefs.cpp +0 -3
- data/source/global/tdclatl/PooledDbManager.cpp +2 -2
- data/source/global/tdclatl/PooledDbManager.h +1 -1
- data/source/global/tdclatl/PreparedQuery.cpp +53 -0
- data/source/global/tdclatl/PreparedQuery.h +61 -0
- data/source/global/tdclatl/QueryBase.cpp +2 -1
- data/source/global/tdclatl/QueryBase.h +1 -1
- data/source/global/tdclatl/Record.cpp +3 -15
- data/source/global/tdclatl/Recordset.cpp +15 -10
- data/source/global/tdclatl/Recordset.h +3 -0
- data/source/global/tdclatl/Table.cpp +42 -7
- data/source/global/tdclatl/Table.h +3 -1
- data/source/global/tdclatl/activeTable.cpp +264 -76
- data/source/global/tdclatl/activeTable.h +12 -3
- data/source/global/tdclatl/tdclatl.idl +92 -10
- data/source/linux/charsetConvert.h +7 -7
- data/transactd.gemspec +14 -27
- metadata +18 -27
- data/bin/common/tdclc_32_2_0.dll +0 -0
- data/bin/common/tdclc_64_2_0.dll +0 -0
- data/build/swig/php/generate.cmake.in +0 -56
- data/build/swig/php/generate.cmd.in +0 -47
- data/build/swig/php/php.swg +0 -197
- data/build/swig/php/transactd.no_yield.php +0 -4494
- data/build/swig/php/transactd.no_yield.php.git.patch +0 -685
- data/build/swig/php/transactd.no_yield.php.patch +0 -685
- data/build/swig/php/transactd.yield.php +0 -4461
- data/build/swig/php/transactd.yield.php.git.patch +0 -652
- data/build/swig/php/transactd.yield.php.patch +0 -652
- data/build/swig/ruby/generate.cmake.in +0 -35
- data/build/swig/ruby/generate.cmd.in +0 -19
- data/build/tdclc/BUILDNUMBER.txt +0 -1
- data/build/tdclcpp/BUILDNUMBER.txt +0 -1
- data/build/tdclrb/BUILDNUMBER.txt +0 -1
- data/build/tdclrb/GEM_RELEASE_VERSION +0 -1
@@ -157,11 +157,19 @@ struct recordsetQueryImple
|
|
157
157
|
std::vector<char> combine;
|
158
158
|
short endIndex;
|
159
159
|
fielddefs compFields;
|
160
|
-
recordsetQueryImple() {}
|
160
|
+
recordsetQueryImple() : row(NULL) {}
|
161
161
|
recordsetQueryImple(const recordsetQueryImple& r)
|
162
162
|
: row(r.row), compType(r.compType), indexes(r.indexes),
|
163
163
|
combine(r.combine), endIndex(r.endIndex), compFields(r.compFields)
|
164
164
|
{
|
165
|
+
if (row)
|
166
|
+
row->addref();
|
167
|
+
}
|
168
|
+
|
169
|
+
~recordsetQueryImple()
|
170
|
+
{
|
171
|
+
if (row)
|
172
|
+
row->release();
|
165
173
|
}
|
166
174
|
};
|
167
175
|
|
@@ -214,9 +222,9 @@ void recordsetQuery::init(const fielddefs* fdinfo)
|
|
214
222
|
m_imple->indexes.push_back(index);
|
215
223
|
m_imple->compFields.push_back(&((*fdinfo)[index]), true /*rePosition*/);
|
216
224
|
}
|
217
|
-
|
218
|
-
|
219
|
-
m_imple->row
|
225
|
+
m_imple->row = memoryRecord::create(m_imple->compFields);
|
226
|
+
m_imple->row->addref();
|
227
|
+
m_imple->row->setRecordData(autoMemory::create(), 0, 0, &m_imple->endIndex, true);
|
220
228
|
|
221
229
|
int index = 0;
|
222
230
|
for (int i = 0; i < (int)tokns.size(); i += 4)
|
@@ -20,6 +20,8 @@
|
|
20
20
|
|
21
21
|
#include "memRecord.h"
|
22
22
|
#include <bzs/db/protocol/tdap/client/trdboostapi.h>
|
23
|
+
#include <new>
|
24
|
+
|
23
25
|
//---------------------------------------------------------------------------
|
24
26
|
#pragma package(smart_init)
|
25
27
|
namespace bzs
|
@@ -33,14 +35,23 @@ namespace tdap
|
|
33
35
|
namespace client
|
34
36
|
{
|
35
37
|
|
36
|
-
autoMemory::autoMemory() : ptr(0), endFieldIndex(NULL), size(0),
|
38
|
+
autoMemory::autoMemory() : refarymem(), ptr(0), endFieldIndex(NULL), size(0),
|
39
|
+
owner(false)
|
37
40
|
{
|
38
41
|
}
|
39
42
|
|
40
|
-
autoMemory::
|
41
|
-
: ptr(p), endFieldIndex(NULL), size((unsigned int)s), owner(own)
|
42
|
-
|
43
|
+
void autoMemory::setParams(unsigned char* p, size_t s, short* endIndex, bool own)
|
43
44
|
{
|
45
|
+
if (owner)
|
46
|
+
{
|
47
|
+
delete[] ptr;
|
48
|
+
delete endFieldIndex;
|
49
|
+
}
|
50
|
+
|
51
|
+
ptr = p;
|
52
|
+
size = (unsigned int)s;
|
53
|
+
owner = own;
|
54
|
+
endFieldIndex = endIndex;
|
44
55
|
if (owner)
|
45
56
|
{
|
46
57
|
ptr = new unsigned char[s];
|
@@ -52,8 +63,7 @@ autoMemory::autoMemory(unsigned char* p, size_t s, short* endIndex, bool own)
|
|
52
63
|
if (endIndex != NULL)
|
53
64
|
*endFieldIndex = *endIndex;
|
54
65
|
}
|
55
|
-
|
56
|
-
endFieldIndex = endIndex;
|
66
|
+
|
57
67
|
}
|
58
68
|
|
59
69
|
autoMemory::~autoMemory()
|
@@ -65,67 +75,146 @@ autoMemory::~autoMemory()
|
|
65
75
|
}
|
66
76
|
}
|
67
77
|
|
68
|
-
autoMemory::autoMemory(const autoMemory& p)
|
69
|
-
: ptr(p.ptr), endFieldIndex(p.endFieldIndex), size(p.size), owner(p.owner)
|
70
|
-
{
|
71
|
-
const_cast<autoMemory&>(p).owner = false;
|
72
|
-
// const_cast<autoMemory&>(p).ptr = NULL;
|
73
|
-
}
|
74
78
|
|
75
79
|
autoMemory& autoMemory::operator=(const autoMemory& p)
|
76
80
|
{
|
81
|
+
if (owner)
|
82
|
+
{
|
83
|
+
delete[] ptr;
|
84
|
+
delete endFieldIndex;
|
85
|
+
}
|
77
86
|
ptr = p.ptr;
|
78
87
|
size = p.size;
|
79
88
|
endFieldIndex = p.endFieldIndex;
|
80
89
|
owner = p.owner;
|
81
90
|
const_cast<autoMemory&>(p).owner = false;
|
82
|
-
// const_cast<autoMemory&>(p).ptr = NULL;
|
83
91
|
return *this;
|
84
92
|
}
|
85
93
|
|
94
|
+
void autoMemory::releaseMemory()
|
95
|
+
{
|
96
|
+
if (allocType() == MEM_ALLOC_TYPE_ONE)
|
97
|
+
delete this;
|
98
|
+
else
|
99
|
+
delete [] this;
|
100
|
+
}
|
101
|
+
|
102
|
+
autoMemory* autoMemory::create(int n)
|
103
|
+
{
|
104
|
+
assert(n);
|
105
|
+
autoMemory* p = new autoMemory[n];
|
106
|
+
p->setAllocTypeThis(MEM_ALLOC_TYPE_ARRAY);
|
107
|
+
for (int i = 1; i < n ; ++i)
|
108
|
+
{
|
109
|
+
autoMemory* pp = p + i;
|
110
|
+
pp->setAllocParent(p);
|
111
|
+
}
|
112
|
+
return p;
|
113
|
+
}
|
114
|
+
|
115
|
+
autoMemory* autoMemory::create()
|
116
|
+
{
|
117
|
+
autoMemory* p = new autoMemory();
|
118
|
+
p->setAllocTypeThis(MEM_ALLOC_TYPE_ONE);
|
119
|
+
return p;
|
120
|
+
}
|
121
|
+
|
86
122
|
//---------------------------------------------------------------------------
|
87
123
|
// class memoryRecord
|
88
124
|
//---------------------------------------------------------------------------
|
89
|
-
inline memoryRecord::memoryRecord(
|
125
|
+
inline memoryRecord::memoryRecord() : fieldsBase(NULL)
|
90
126
|
{
|
127
|
+
#ifdef JOIN_UNLIMIT
|
128
|
+
m_memblock.reserve(ROW_MEM_BLOCK_RESERVE);
|
129
|
+
#else
|
130
|
+
m_memblockSize = 0;
|
131
|
+
#endif
|
132
|
+
}
|
91
133
|
|
134
|
+
inline memoryRecord::memoryRecord(fielddefs& fdinfo) : fieldsBase(&fdinfo)
|
135
|
+
{
|
136
|
+
#ifdef JOIN_UNLIMIT
|
92
137
|
m_memblock.reserve(ROW_MEM_BLOCK_RESERVE);
|
138
|
+
#else
|
139
|
+
m_memblockSize = 0;
|
140
|
+
#endif
|
93
141
|
}
|
94
142
|
|
95
143
|
memoryRecord::memoryRecord(const memoryRecord& r)
|
96
|
-
: fieldsBase(r.m_fns)
|
144
|
+
: fieldsBase(r.m_fns)
|
145
|
+
{
|
146
|
+
#ifdef JOIN_UNLIMIT
|
147
|
+
m_memblock = r.m_memblock;
|
148
|
+
#else
|
149
|
+
m_memblockSize = r.m_memblockSize;
|
150
|
+
for (int i = 0; i < m_memblockSize; ++i)
|
151
|
+
m_memblock[i] = r.m_memblock[i];
|
152
|
+
#endif
|
153
|
+
for (int i = 0; i < memBlockSize(); ++i)
|
154
|
+
m_memblock[i]->addref();
|
155
|
+
|
156
|
+
}
|
157
|
+
|
158
|
+
memoryRecord::~memoryRecord()
|
97
159
|
{
|
160
|
+
for (int i = 0; i < memBlockSize(); ++i)
|
161
|
+
m_memblock[i]->release();
|
98
162
|
}
|
99
163
|
|
100
|
-
|
164
|
+
memoryRecord& memoryRecord::operator=(const memoryRecord& r)
|
101
165
|
{
|
102
|
-
|
103
|
-
|
166
|
+
if (this != &r)
|
167
|
+
{
|
168
|
+
m_fns = r.m_fns;
|
169
|
+
#ifdef JOIN_UNLIMIT
|
170
|
+
m_memblock = r.m_memblock;
|
171
|
+
#endif
|
172
|
+
for (int i = 0; i < memBlockSize(); ++i)
|
173
|
+
{
|
174
|
+
#ifndef JOIN_UNLIMIT
|
175
|
+
m_memblock[i] = r.m_memblock[i];
|
176
|
+
#endif
|
177
|
+
m_memblock[i]->addref();
|
178
|
+
}
|
104
179
|
|
105
|
-
|
180
|
+
}
|
181
|
+
return *this;
|
106
182
|
}
|
107
183
|
|
108
|
-
void memoryRecord::
|
109
|
-
|
184
|
+
void memoryRecord::clear()
|
185
|
+
{
|
186
|
+
for (int i = 0; i < memBlockSize(); ++i)
|
187
|
+
memset(m_memblock[i]->ptr, 0, m_memblock[i]->size);
|
188
|
+
m_fns->resetUpdateIndicator();
|
189
|
+
}
|
190
|
+
|
191
|
+
void memoryRecord::setRecordData(autoMemory* am, unsigned char* ptr,
|
192
|
+
size_t size, short* endFieldIndex, bool owner)
|
110
193
|
{
|
111
194
|
if ((size == 0) && owner)
|
112
195
|
{
|
113
|
-
size = m_fns
|
114
|
-
*endFieldIndex = (short)m_fns
|
196
|
+
size = m_fns->totalFieldLen();
|
197
|
+
*endFieldIndex = (short)m_fns->size();
|
115
198
|
}
|
116
|
-
|
199
|
+
am->setParams(ptr, size, endFieldIndex, owner);
|
200
|
+
am->addref();
|
201
|
+
#ifdef JOIN_UNLIMIT
|
117
202
|
m_memblock.push_back(am);
|
203
|
+
#else
|
204
|
+
m_memblock[m_memblockSize] = am;
|
205
|
+
++m_memblockSize;
|
206
|
+
#endif
|
118
207
|
}
|
119
208
|
|
120
209
|
void memoryRecord::copyToBuffer(table* tb, bool updateOnly) const
|
121
210
|
{
|
122
211
|
if (!updateOnly)
|
123
|
-
memcpy(tb->fieldPtr(0), ptr(0), m_fns
|
212
|
+
memcpy(tb->fieldPtr(0), ptr(0), m_fns->totalFieldLen());
|
124
213
|
else
|
125
214
|
{
|
126
|
-
for (int i = 0; i < (int)m_fns
|
215
|
+
for (int i = 0; i < (int)m_fns->size(); ++i)
|
127
216
|
{
|
128
|
-
const fielddef& fd = m_fns[i];
|
217
|
+
const fielddef& fd = (*m_fns)[i];
|
129
218
|
// ptr() return memory block first address
|
130
219
|
if (fd.enableFlags.bitE)
|
131
220
|
memcpy(tb->fieldPtr(i), ptr(i) + fd.pos, fd.len);
|
@@ -135,12 +224,64 @@ void memoryRecord::copyToBuffer(table* tb, bool updateOnly) const
|
|
135
224
|
|
136
225
|
memoryRecord* memoryRecord::create(fielddefs& fdinfo)
|
137
226
|
{
|
138
|
-
|
227
|
+
memoryRecord* p = new memoryRecord(fdinfo);
|
228
|
+
p->setAllocTypeThis(MEM_ALLOC_TYPE_ONE);
|
229
|
+
#ifdef DEBUG_TRACE_FIELDBASE_REFCOUNT
|
230
|
+
_TCHAR tmp[50];
|
231
|
+
wsprintf(tmp, _T("memoryRecord create one %p\n"), p);
|
232
|
+
OutputDebugString(tmp);
|
233
|
+
#endif
|
234
|
+
return p;
|
139
235
|
}
|
140
236
|
|
141
|
-
|
237
|
+
memoryRecord* memoryRecord::create(fielddefs& fdinfo, int n)
|
142
238
|
{
|
143
|
-
|
239
|
+
assert(n);
|
240
|
+
memoryRecord* p = new memoryRecord[n];
|
241
|
+
p->setFielddefs(&fdinfo);
|
242
|
+
p->setAllocTypeThis(MEM_ALLOC_TYPE_ARRAY);
|
243
|
+
|
244
|
+
for (int i = 1; i < n ; ++i)
|
245
|
+
{
|
246
|
+
memoryRecord* pp = p + i;
|
247
|
+
pp->setFielddefs(&fdinfo);
|
248
|
+
pp->setAllocParent(p);
|
249
|
+
}
|
250
|
+
#ifdef DEBUG_TRACE_FIELDBASE_REFCOUNT
|
251
|
+
_TCHAR tmp[50];
|
252
|
+
wsprintf(tmp, _T("memoryRecord create n %p\n"), p);
|
253
|
+
OutputDebugString(tmp);
|
254
|
+
#endif
|
255
|
+
return p;
|
256
|
+
}
|
257
|
+
|
258
|
+
//copy constractor
|
259
|
+
memoryRecord* memoryRecord::create(const memoryRecord& m, int n)
|
260
|
+
{
|
261
|
+
assert(n);
|
262
|
+
memoryRecord* p = new memoryRecord[n];
|
263
|
+
*p = m;
|
264
|
+
p->setAllocTypeThis(MEM_ALLOC_TYPE_ARRAY);
|
265
|
+
for (int i = 1; i < n ; ++i)
|
266
|
+
{
|
267
|
+
memoryRecord* pp = p + i;
|
268
|
+
*pp = m;
|
269
|
+
pp->setAllocParent(p);
|
270
|
+
}
|
271
|
+
#ifdef DEBUG_TRACE_FIELDBASE_REFCOUNT
|
272
|
+
_TCHAR tmp[50];
|
273
|
+
wsprintf(tmp, _T("memoryRecord create copy n %p\n"), p);
|
274
|
+
OutputDebugString(tmp);
|
275
|
+
#endif
|
276
|
+
return p;
|
277
|
+
}
|
278
|
+
|
279
|
+
void memoryRecord::releaseMemory()
|
280
|
+
{
|
281
|
+
if (allocType() == MEM_ALLOC_TYPE_ONE)
|
282
|
+
delete this;
|
283
|
+
else
|
284
|
+
delete [] this;
|
144
285
|
}
|
145
286
|
|
146
287
|
//---------------------------------------------------------------------------
|
@@ -154,7 +295,7 @@ writableRecord::writableRecord(table* tb, const aliasMap_type* alias)
|
|
154
295
|
m_fddefs->clear();
|
155
296
|
m_fddefs->setAliases(alias);
|
156
297
|
m_fddefs->copyFrom(m_tb);
|
157
|
-
setRecordData(0, 0, &m_endIndex, true);
|
298
|
+
setRecordData(autoMemory::create(), 0, 0, &m_endIndex, true);
|
158
299
|
}
|
159
300
|
|
160
301
|
fielddefs* writableRecord::fddefs()
|
@@ -221,9 +362,26 @@ void writableRecord::save()
|
|
221
362
|
|
222
363
|
writableRecord* writableRecord::create(table* tb, const aliasMap_type* alias)
|
223
364
|
{
|
224
|
-
|
365
|
+
writableRecord* p = new writableRecord(tb, alias);
|
366
|
+
p->setAllocTypeThis(MEM_ALLOC_TYPE_ONE);
|
367
|
+
|
368
|
+
#ifdef DEBUG_TRACE_FIELDBASE_REFCOUNT
|
369
|
+
_TCHAR tmp[50];
|
370
|
+
wsprintf(tmp, _T("writableRecord create one %p\n"), p);
|
371
|
+
OutputDebugString(tmp);
|
372
|
+
#endif
|
373
|
+
return p;
|
225
374
|
}
|
226
375
|
|
376
|
+
void writableRecord::releaseMemory()
|
377
|
+
{
|
378
|
+
if (allocType() == MEM_ALLOC_TYPE_ONE)
|
379
|
+
delete this;
|
380
|
+
else
|
381
|
+
delete [] this;
|
382
|
+
}
|
383
|
+
|
384
|
+
|
227
385
|
} // namespace client
|
228
386
|
} // namespace tdap
|
229
387
|
} // namespace protocol
|
@@ -33,19 +33,23 @@ namespace client
|
|
33
33
|
|
34
34
|
/** @cond INTERNAL */
|
35
35
|
|
36
|
-
class
|
36
|
+
class autoMemory : public refarymem
|
37
37
|
{
|
38
|
+
void releaseMemory();
|
38
39
|
|
39
|
-
public:
|
40
40
|
autoMemory();
|
41
|
-
explicit autoMemory(unsigned char* p, size_t s, short* endIndex, bool own);
|
42
41
|
autoMemory(const autoMemory& p);
|
43
42
|
~autoMemory();
|
43
|
+
public:
|
44
|
+
void setParams(unsigned char* p, size_t s, short* endIndex, bool own);
|
45
|
+
|
44
46
|
autoMemory& operator=(const bzs::db::protocol::tdap::client::autoMemory& p);
|
45
47
|
unsigned char* ptr;
|
46
48
|
short* endFieldIndex;
|
47
|
-
unsigned int size;
|
48
|
-
bool owner;
|
49
|
+
unsigned int size ;
|
50
|
+
bool owner ;
|
51
|
+
static autoMemory* create(int n);
|
52
|
+
static autoMemory* create();
|
49
53
|
};
|
50
54
|
|
51
55
|
/** @endcond */
|
@@ -54,25 +58,45 @@ public:
|
|
54
58
|
#pragma warning(disable : 4275)
|
55
59
|
#define ROW_MEM_BLOCK_RESERVE 4
|
56
60
|
|
61
|
+
#ifndef JOINLIMIT_PER_RECORD
|
62
|
+
#define JOINLIMIT_PER_RECORD 0
|
63
|
+
#endif
|
64
|
+
#if (JOINLIMIT_PER_RECORD < 1)
|
65
|
+
#define JOIN_UNLIMIT
|
66
|
+
#endif
|
67
|
+
|
57
68
|
class DLLLIB memoryRecord : public fieldsBase
|
58
69
|
{
|
59
70
|
friend class multiRecordAlocatorImple;
|
60
71
|
friend class recordsetImple;
|
72
|
+
friend class recordsetQuery;
|
73
|
+
|
74
|
+
#ifdef JOIN_UNLIMIT
|
75
|
+
std::vector<autoMemory*> m_memblock;
|
76
|
+
#else
|
77
|
+
autoMemory* m_memblock[JOINLIMIT_PER_RECORD];
|
78
|
+
int m_memblockSize;
|
79
|
+
#endif
|
61
80
|
|
62
|
-
|
81
|
+
static memoryRecord* create(fielddefs& fdinfo, int n);
|
82
|
+
static memoryRecord* create(const memoryRecord& m, int n);
|
63
83
|
|
64
84
|
protected:
|
65
85
|
/** @cond INTERNAL */
|
86
|
+
|
87
|
+
inline memoryRecord();
|
66
88
|
inline memoryRecord(fielddefs& fdinfo);
|
67
89
|
memoryRecord(const memoryRecord& r);
|
90
|
+
~memoryRecord();
|
91
|
+
memoryRecord& operator=(const memoryRecord& r);
|
68
92
|
void copyToBuffer(table* tb, bool updateOnly = false) const;
|
69
93
|
|
70
94
|
/* return memory block first address which not field ptr address */
|
71
95
|
inline unsigned char* ptr(int index) const
|
72
96
|
{
|
73
97
|
for (int i = 0; i < memBlockSize(); ++i)
|
74
|
-
if (*(m_memblock[i]
|
75
|
-
return m_memblock[i]
|
98
|
+
if (*(m_memblock[i]->endFieldIndex) > index)
|
99
|
+
return m_memblock[i]->ptr;
|
76
100
|
assert(0);
|
77
101
|
return NULL;
|
78
102
|
}
|
@@ -80,33 +104,47 @@ protected:
|
|
80
104
|
inline const autoMemory& memBlockByField(int index) const
|
81
105
|
{
|
82
106
|
for (int i = 0; i < memBlockSize(); ++i)
|
83
|
-
if (*(m_memblock[i]
|
84
|
-
return m_memblock[i];
|
107
|
+
if (*(m_memblock[i]->endFieldIndex) > index)
|
108
|
+
return *m_memblock[i];
|
85
109
|
assert(0);
|
86
110
|
return *((autoMemory*)0);
|
87
111
|
}
|
88
112
|
|
89
113
|
inline const autoMemory& memBlock(int index) const
|
90
114
|
{
|
91
|
-
return m_memblock[index];
|
115
|
+
return *m_memblock[index];
|
92
116
|
}
|
93
|
-
|
117
|
+
#ifdef JOIN_UNLIMIT
|
94
118
|
inline int memBlockSize() const { return (int)m_memblock.size(); }
|
95
|
-
|
119
|
+
#else
|
120
|
+
inline int memBlockSize() const { return m_memblockSize; }
|
121
|
+
#endif
|
96
122
|
inline void copyFromBuffer(const table* tb)
|
97
123
|
{
|
98
|
-
memcpy(ptr(0), tb->fieldPtr(0), m_fns
|
124
|
+
memcpy(ptr(0), tb->fieldPtr(0), m_fns->totalFieldLen());
|
125
|
+
}
|
126
|
+
|
127
|
+
void removeLastMemBlock()
|
128
|
+
{
|
129
|
+
if (memBlockSize())
|
130
|
+
{
|
131
|
+
m_memblock[memBlockSize()-1]->release();
|
132
|
+
#ifdef JOIN_UNLIMIT
|
133
|
+
m_memblock.pop_back();
|
134
|
+
#else
|
135
|
+
--m_memblockSize;
|
136
|
+
#endif
|
137
|
+
}
|
99
138
|
}
|
100
|
-
|
139
|
+
|
140
|
+
void setRecordData(autoMemory* am, unsigned char* ptr, size_t size,
|
141
|
+
short* endFieldIndex, bool owner = false);
|
142
|
+
void releaseMemory();
|
101
143
|
|
102
144
|
/** @endcond */
|
103
145
|
public:
|
104
146
|
void clear(); // orverride
|
105
|
-
|
106
|
-
bool owner = false);
|
107
|
-
|
108
|
-
static memoryRecord* create(fielddefs& fdinfo);
|
109
|
-
static void release(fieldsBase* p);
|
147
|
+
static memoryRecord* create(fielddefs& fdinfo); // For SWIG
|
110
148
|
};
|
111
149
|
|
112
150
|
#pragma warning(default : 4275)
|
@@ -115,25 +153,29 @@ public:
|
|
115
153
|
/* non copyable*/
|
116
154
|
class DLLLIB writableRecord : public memoryRecord
|
117
155
|
{
|
156
|
+
friend class activeTableImple;
|
157
|
+
|
118
158
|
fielddefs* m_fddefs;
|
119
159
|
table* m_tb;
|
120
160
|
short m_endIndex;
|
121
161
|
|
162
|
+
static writableRecord* create(table* tb, const aliasMap_type* alias);
|
122
163
|
writableRecord(table* tb, const aliasMap_type* alias);
|
123
164
|
writableRecord(const writableRecord&);
|
124
165
|
writableRecord& operator=(const writableRecord&);
|
125
166
|
|
126
167
|
fielddefs* fddefs();
|
168
|
+
void releaseMemory();
|
169
|
+
~writableRecord();
|
127
170
|
|
128
171
|
public:
|
129
|
-
|
172
|
+
|
130
173
|
bool read(bool KeysetAlrady = false);
|
131
174
|
void insert();
|
132
175
|
void del(bool KeysetAlrady = false);
|
133
176
|
void update();
|
134
177
|
void save();
|
135
178
|
|
136
|
-
static writableRecord* create(table* tb, const aliasMap_type* alias);
|
137
179
|
};
|
138
180
|
|
139
181
|
} // namespace client
|