transactd 2.0.1 → 2.1.0

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.
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