transactd 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/BUILD_UNIX-JA +6 -6
  3. data/README +16 -16
  4. data/README-JA +16 -16
  5. data/bin/common/tdclc_32_2_1.dll +0 -0
  6. data/bin/common/tdclc_64_2_1.dll +0 -0
  7. data/build/common/transactd_cl_common.cmake +0 -1
  8. data/build/common/transactd_common.cmake +28 -38
  9. data/build/swig/ruby/ruby.swg +36 -30
  10. data/build/swig/ruby/tdclrb_wrap.cpp +35016 -0
  11. data/build/swig/tdcl.i +217 -62
  12. data/build/tdclc/CMakeLists.txt +14 -26
  13. data/build/tdclc/libtdclcm.map +4 -0
  14. data/build/tdclc/tdclc.cbproj +1 -1
  15. data/build/tdclc/tdclc.rc +0 -0
  16. data/build/tdclcpp/CMakeLists.txt +7 -22
  17. data/build/tdclcpp/tdclcpp.rc +0 -0
  18. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  19. data/build/tdclrb/CMakeLists.txt +7 -49
  20. data/build/tdclrb/tdclrb.rc +62 -0
  21. data/source/bzs/db/blobBuffer.h +5 -0
  22. data/source/bzs/db/blobStructs.h +2 -0
  23. data/source/bzs/db/engine/mysql/IReadRecords.h +9 -0
  24. data/source/bzs/db/engine/mysql/database.cpp +391 -169
  25. data/source/bzs/db/engine/mysql/database.h +178 -40
  26. data/source/bzs/db/engine/mysql/dbManager.cpp +45 -3
  27. data/source/bzs/db/engine/mysql/dbManager.h +3 -39
  28. data/source/bzs/db/engine/mysql/errorMessage.cpp +11 -7
  29. data/source/bzs/db/engine/mysql/errorMessage.h +1 -1
  30. data/source/bzs/db/engine/mysql/mydebuglog.cpp +1 -2
  31. data/source/bzs/db/engine/mysql/mysqlInternal.h +8 -8
  32. data/source/bzs/db/engine/mysql/mysqlThd.cpp +11 -0
  33. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +1 -1
  34. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +41 -6
  35. data/source/bzs/db/protocol/tdap/client/activeTable.h +177 -8
  36. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +141 -62
  37. data/source/bzs/db/protocol/tdap/client/client.cpp +39 -35
  38. data/source/bzs/db/protocol/tdap/client/client.h +52 -25
  39. data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +17 -0
  40. data/source/bzs/db/protocol/tdap/client/connectionPool.h +1 -0
  41. data/source/bzs/db/protocol/tdap/client/database.cpp +5 -1
  42. data/source/bzs/db/protocol/tdap/client/database.h +1 -1
  43. data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +49 -12
  44. data/source/bzs/db/protocol/tdap/client/databaseManager.h +42 -5
  45. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +4 -2
  46. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +71 -41
  47. data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +49 -49
  48. data/source/bzs/db/protocol/tdap/client/field.cpp +22 -13
  49. data/source/bzs/db/protocol/tdap/client/field.h +7 -3
  50. data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +1 -1
  51. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +0 -1
  52. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
  53. data/source/bzs/db/protocol/tdap/client/fields.h +111 -24
  54. data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +1 -1
  55. data/source/bzs/db/protocol/tdap/client/filter.h +687 -310
  56. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +12 -4
  57. data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +1 -1
  58. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +190 -32
  59. data/source/bzs/db/protocol/tdap/client/memRecord.h +64 -22
  60. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +4 -4
  61. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -2
  62. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +6 -3
  63. data/source/bzs/db/protocol/tdap/client/nsTable.h +1 -1
  64. data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +19 -8
  65. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +194 -87
  66. data/source/bzs/db/protocol/tdap/client/request.h +84 -26
  67. data/source/bzs/db/protocol/tdap/client/stringConverter.h +22 -12
  68. data/source/bzs/db/protocol/tdap/client/table.cpp +494 -286
  69. data/source/bzs/db/protocol/tdap/client/table.h +48 -5
  70. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +133 -87
  71. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +22 -22
  72. data/source/bzs/db/protocol/tdap/client/trdormapi.h +43 -18
  73. data/source/bzs/db/protocol/tdap/client/trnsctcl.def +3 -3
  74. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +1 -0
  75. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +268 -74
  76. data/source/bzs/db/protocol/tdap/mysql/request.h +4 -4
  77. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +179 -43
  78. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
  79. data/source/bzs/db/protocol/tdap/tdapRequest.h +15 -14
  80. data/source/bzs/db/protocol/tdap/tdapSchema.h +125 -90
  81. data/source/bzs/db/protocol/tdap/tdapcapi.h +46 -5
  82. data/source/bzs/db/transactd/appModule.h +1 -1
  83. data/source/bzs/db/transactd/connManager.cpp +2 -0
  84. data/source/bzs/db/transactd/transactd.cpp +1 -0
  85. data/source/bzs/env/compiler.h +10 -0
  86. data/source/bzs/env/mbcswchrLinux.cpp +42 -6
  87. data/source/bzs/env/mbcswchrLinux.h +40 -12
  88. data/source/bzs/example/queryData.cpp +33 -4
  89. data/source/bzs/netsvc/client/iconnection.h +107 -0
  90. data/source/bzs/netsvc/client/tcpClient.cpp +15 -1
  91. data/source/bzs/netsvc/client/tcpClient.h +96 -87
  92. data/source/bzs/netsvc/server/serverCpt.cpp +5 -6
  93. data/source/bzs/rtl/benchmark.cpp +2 -2
  94. data/source/bzs/rtl/stringBuffers.cpp +3 -3
  95. data/source/bzs/rtl/stringBuffers.h +2 -2
  96. data/source/bzs/test/tdclatl/bench_query_atl.js +92 -99
  97. data/source/bzs/test/tdclatl/test_query_atl.js +224 -115
  98. data/source/bzs/test/tdclphp/bench.php +126 -101
  99. data/source/bzs/test/tdclphp/transactd_Test.php +1122 -158
  100. data/source/bzs/test/tdclrb/bench_tdclcpp.rb +12 -14
  101. data/source/bzs/test/tdclrb/transactd_spec.rb +1127 -142
  102. data/source/bzs/test/transactdBench/query_bench.cpp +32 -15
  103. data/source/bzs/test/transactdBench/scaling_bench.cpp +32 -7
  104. data/source/bzs/test/transactdBench/transactdBench.cpp +1 -1
  105. data/source/bzs/test/transactdBench/workerBase.h +46 -0
  106. data/source/bzs/test/transactdBench/workerMySQLImple.h +15 -7
  107. data/source/bzs/test/transactdBench/workerTransactdImple.h +10 -18
  108. data/source/bzs/test/trdclengn/test_trdclengn.cpp +1487 -174
  109. data/source/global/ormsrcgen/main.cpp +2 -0
  110. data/source/global/tdclatl/Database.cpp +2 -2
  111. data/source/global/tdclatl/Database.h +1 -1
  112. data/source/global/tdclatl/FieldDefs.cpp +0 -3
  113. data/source/global/tdclatl/PooledDbManager.cpp +2 -2
  114. data/source/global/tdclatl/PooledDbManager.h +1 -1
  115. data/source/global/tdclatl/PreparedQuery.cpp +53 -0
  116. data/source/global/tdclatl/PreparedQuery.h +61 -0
  117. data/source/global/tdclatl/QueryBase.cpp +2 -1
  118. data/source/global/tdclatl/QueryBase.h +1 -1
  119. data/source/global/tdclatl/Record.cpp +3 -15
  120. data/source/global/tdclatl/Recordset.cpp +15 -10
  121. data/source/global/tdclatl/Recordset.h +3 -0
  122. data/source/global/tdclatl/Table.cpp +42 -7
  123. data/source/global/tdclatl/Table.h +3 -1
  124. data/source/global/tdclatl/activeTable.cpp +264 -76
  125. data/source/global/tdclatl/activeTable.h +12 -3
  126. data/source/global/tdclatl/tdclatl.idl +92 -10
  127. data/source/linux/charsetConvert.h +7 -7
  128. data/transactd.gemspec +14 -27
  129. metadata +18 -27
  130. data/bin/common/tdclc_32_2_0.dll +0 -0
  131. data/bin/common/tdclc_64_2_0.dll +0 -0
  132. data/build/swig/php/generate.cmake.in +0 -56
  133. data/build/swig/php/generate.cmd.in +0 -47
  134. data/build/swig/php/php.swg +0 -197
  135. data/build/swig/php/transactd.no_yield.php +0 -4494
  136. data/build/swig/php/transactd.no_yield.php.git.patch +0 -685
  137. data/build/swig/php/transactd.no_yield.php.patch +0 -685
  138. data/build/swig/php/transactd.yield.php +0 -4461
  139. data/build/swig/php/transactd.yield.php.git.patch +0 -652
  140. data/build/swig/php/transactd.yield.php.patch +0 -652
  141. data/build/swig/ruby/generate.cmake.in +0 -35
  142. data/build/swig/ruby/generate.cmd.in +0 -19
  143. data/build/tdclc/BUILDNUMBER.txt +0 -1
  144. data/build/tdclcpp/BUILDNUMBER.txt +0 -1
  145. data/build/tdclrb/BUILDNUMBER.txt +0 -1
  146. 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
- memoryRecord* mr = memoryRecord::create(m_imple->compFields);
218
- mr->setRecordData(0, 0, &m_imple->endIndex, true);
219
- m_imple->row.reset(mr);
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)
@@ -91,7 +91,7 @@ void indexDDF::createTable(const _TCHAR* fullpath)
91
91
  {
92
92
  fileSpec* fs;
93
93
  fs = (fileSpec*)malloc(512);
94
- memset(fs, 512, 0x00);
94
+ memset(fs, 0x00, 512);
95
95
  fs->recLen = 10;
96
96
  fs->pageSize = 4096;
97
97
  fs->indexCount = 3;
@@ -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), owner(false)
38
+ autoMemory::autoMemory() : refarymem(), ptr(0), endFieldIndex(NULL), size(0),
39
+ owner(false)
37
40
  {
38
41
  }
39
42
 
40
- autoMemory::autoMemory(unsigned char* p, size_t s, short* endIndex, bool own)
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
- else
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(fielddefs& fdinfo) : fieldsBase(fdinfo)
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), m_memblock(r.m_memblock)
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
- void memoryRecord::clear()
164
+ memoryRecord& memoryRecord::operator=(const memoryRecord& r)
101
165
  {
102
- for (int i = 0; i < (int)m_memblock.size(); ++i)
103
- memset(m_memblock[i].ptr, 0, m_memblock[i].size);
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
- m_fns.resetUpdateIndicator();
180
+ }
181
+ return *this;
106
182
  }
107
183
 
108
- void memoryRecord::setRecordData(unsigned char* ptr, size_t size,
109
- short* endFieldIndex, bool owner)
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.totalFieldLen();
114
- *endFieldIndex = (short)m_fns.size();
196
+ size = m_fns->totalFieldLen();
197
+ *endFieldIndex = (short)m_fns->size();
115
198
  }
116
- autoMemory am(ptr, size, endFieldIndex, owner);
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.totalFieldLen());
212
+ memcpy(tb->fieldPtr(0), ptr(0), m_fns->totalFieldLen());
124
213
  else
125
214
  {
126
- for (int i = 0; i < (int)m_fns.size(); ++i)
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
- return new memoryRecord(fdinfo);
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
- void memoryRecord::release(fieldsBase* p)
237
+ memoryRecord* memoryRecord::create(fielddefs& fdinfo, int n)
142
238
  {
143
- delete p;
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
- return new writableRecord(tb, alias);
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 DLLLIB autoMemory
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
- std::vector<autoMemory> m_memblock;
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].endFieldIndex) > index)
75
- return m_memblock[i].ptr;
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].endFieldIndex) > index)
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.totalFieldLen());
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
- void removeLastMemBlock() { m_memblock.pop_back(); }
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
- void setRecordData(unsigned char* ptr, size_t size, short* endFieldIndex,
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
- ~writableRecord();
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