transactd 2.1.0 → 2.2.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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/bin/common/tdclc_32_2_2.dll +0 -0
  3. data/bin/common/tdclc_64_2_2.dll +0 -0
  4. data/build/swig/ruby/generate.cmd +45 -0
  5. data/build/swig/ruby/generate.sh +40 -0
  6. data/build/swig/ruby/tdclrb_wrap.cpp +406 -969
  7. data/build/swig/tdcl.i +88 -0
  8. data/build/tdclc/CMakeLists.txt +5 -1
  9. data/build/tdclc/tdclc.cbproj +1 -1
  10. data/build/tdclc/tdclc.rc +4 -4
  11. data/build/tdclcpp/tdclcpp.rc +4 -4
  12. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  13. data/build/tdclrb/tdclrb.rc +4 -4
  14. data/source/bzs/db/engine/mysql/database.cpp +165 -74
  15. data/source/bzs/db/engine/mysql/database.h +19 -5
  16. data/source/bzs/db/engine/mysql/dbManager.cpp +33 -11
  17. data/source/bzs/db/engine/mysql/dbManager.h +6 -1
  18. data/source/bzs/db/engine/mysql/mydebuglog.h +12 -0
  19. data/source/bzs/db/engine/mysql/mysqlInternal.h +10 -3
  20. data/source/bzs/db/engine/mysql/mysqlThd.cpp +20 -8
  21. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +12 -7
  22. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +1 -1
  23. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +1 -0
  24. data/source/bzs/db/protocol/tdap/client/client.cpp +17 -15
  25. data/source/bzs/db/protocol/tdap/client/client.h +102 -30
  26. data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +1 -1
  27. data/source/bzs/db/protocol/tdap/client/database.cpp +32 -10
  28. data/source/bzs/db/protocol/tdap/client/database.h +1 -0
  29. data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +0 -2
  30. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +2 -0
  31. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +47 -42
  32. data/source/bzs/db/protocol/tdap/client/fields.h +3 -1
  33. data/source/bzs/db/protocol/tdap/client/filter.h +3 -3
  34. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +18 -2
  35. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +3 -2
  36. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +14 -6
  37. data/source/bzs/db/protocol/tdap/client/nsTable.h +12 -12
  38. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +6 -3
  39. data/source/bzs/db/protocol/tdap/client/request.h +1 -0
  40. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +101 -64
  41. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +3 -0
  42. data/source/bzs/db/protocol/tdap/client/stringConverter.h +9 -13
  43. data/source/bzs/db/protocol/tdap/client/table.cpp +73 -56
  44. data/source/bzs/db/protocol/tdap/client/table.h +8 -8
  45. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +52 -100
  46. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +8 -1
  47. data/source/bzs/db/protocol/tdap/mysql/request.h +6 -0
  48. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +349 -189
  49. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +28 -12
  50. data/source/bzs/db/protocol/tdap/tdapRequest.h +5 -4
  51. data/source/bzs/db/protocol/tdap/tdapSchema.h +6 -1
  52. data/source/bzs/db/protocol/tdap/tdapcapi.h +29 -4
  53. data/source/bzs/db/protocol/tdap/uri.h +297 -0
  54. data/source/bzs/db/transactd/appModule.cpp +41 -16
  55. data/source/bzs/db/transactd/appModule.h +1 -2
  56. data/source/bzs/db/transactd/transactd.cpp +37 -14
  57. data/source/bzs/env/crosscompile.h +1 -3
  58. data/source/bzs/example/queryData.cpp +2 -2
  59. data/source/bzs/netsvc/client/iconnection.h +3 -1
  60. data/source/bzs/netsvc/client/tcpClient.cpp +75 -28
  61. data/source/bzs/netsvc/client/tcpClient.h +94 -62
  62. data/source/bzs/netsvc/server/IAppModule.h +2 -2
  63. data/source/bzs/netsvc/server/serverCpt.cpp +17 -10
  64. data/source/bzs/netsvc/server/serverPipe.cpp +26 -19
  65. data/source/bzs/netsvc/server/serverTpool.cpp +8 -2
  66. data/source/bzs/rtl/debuglog.cpp +21 -5
  67. data/source/bzs/rtl/debuglog.h +1 -1
  68. data/source/bzs/test/tdclphp/transactd_Test.php +183 -37
  69. data/source/bzs/test/tdclphp/transactd_pool_Test.php +1 -2
  70. data/source/bzs/test/tdclrb/transactd_spec.rb +183 -39
  71. data/source/bzs/test/transactdBench/scaling_bench.cpp +3 -3
  72. data/source/bzs/test/trdclengn/test_trdclengn.cpp +172 -57
  73. data/source/global/boost/sha1.hpp +223 -0
  74. data/source/global/tdclatl/ConnectParams.cpp +2 -2
  75. data/source/global/tdclatl/ConnectParams.h +1 -1
  76. data/source/global/tdclatl/Database.cpp +18 -0
  77. data/source/global/tdclatl/Database.h +5 -0
  78. data/source/global/tdclatl/tdclatl.idl +23 -1
  79. data/source/linux/linuxTypes.h +2 -0
  80. metadata +8 -6
  81. data/bin/common/tdclc_32_2_1.dll +0 -0
  82. data/bin/common/tdclc_64_2_1.dll +0 -0
  83. data/source/bzs/db/protocol/tdap/client/memRecordset.cpp +0 -448
  84. data/source/bzs/db/protocol/tdap/client/memRecordset.h +0 -159
@@ -1,448 +0,0 @@
1
- /*=================================================================
2
- Copyright (C) 2014 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
- #pragma hdrstop
20
-
21
- #include "memRecordset.h"
22
-
23
- #ifdef _DEBUG
24
- #include <iostream>
25
- #endif
26
- #pragma package(smart_init)
27
-
28
- namespace bzs
29
- {
30
- namespace db
31
- {
32
- namespace protocol
33
- {
34
- namespace tdap
35
- {
36
- namespace client
37
- {
38
-
39
- // ---------------------------------------------------------------------------
40
- // class multiRecordAlocatorImple
41
- // ---------------------------------------------------------------------------
42
- class multiRecordAlocatorImple : public multiRecordAlocator
43
- {
44
- class recordset* m_rs;
45
- int m_rowOffset;
46
- int m_addType;
47
- int m_curFirstFiled;
48
- const std::vector<std::vector<int> >* m_joinRowMap;
49
-
50
- public:
51
- inline multiRecordAlocatorImple(recordset* rs)
52
- : m_rs(rs), m_rowOffset(0), m_addType(0), m_curFirstFiled(0),
53
- m_joinRowMap(NULL)
54
- {
55
- }
56
-
57
- inline void init(size_t recordCount, size_t recordLen, int addType,
58
- const table* tb)
59
- {
60
- m_rs->registerMemoryBlock(NULL, recordCount * recordLen, recordLen,
61
- addType | m_addType, tb);
62
- }
63
-
64
- inline unsigned char* ptr(size_t row, int stat)
65
- {
66
- int col = (stat == mra_current_block) ? m_curFirstFiled : 0;
67
- size_t rowNum = m_joinRowMap ? (*m_joinRowMap)[row + m_rowOffset][0]
68
- : row + m_rowOffset;
69
- return (*m_rs)[rowNum].ptr(col);
70
- }
71
-
72
- inline void setRowOffset(int v) { m_rowOffset = v; }
73
-
74
- inline void setJoinType(int v) { m_addType = v; }
75
-
76
- inline void setInvalidRecord(size_t row, bool v)
77
- {
78
- (*m_rs)[row + m_rowOffset].setInvalidRecord(v);
79
- }
80
-
81
- inline void setCurFirstFiled(int v) { m_curFirstFiled = v; }
82
-
83
- inline void setJoinRowMap(const std::vector<std::vector<int> >* v)
84
- {
85
- m_joinRowMap = v; /*m_joinMapSize = size;*/
86
- }
87
-
88
- inline const std::vector<std::vector<int> >* joinRowMap() const
89
- {
90
- return m_joinRowMap;
91
- }
92
- };
93
-
94
- // ---------------------------------------------------------------------------
95
- // class recordsetSorter
96
- // ---------------------------------------------------------------------------
97
- class recordsetSorter
98
- {
99
- const std::vector<int>& m_fieldNums;
100
-
101
- public:
102
- recordsetSorter(const std::vector<int>& fieldNums) : m_fieldNums(fieldNums)
103
- {
104
- }
105
- bool operator()(const row_ptr& l, const row_ptr r) const
106
- {
107
- std::vector<int>::const_iterator it = m_fieldNums.begin();
108
- while (it != m_fieldNums.end())
109
- {
110
- int ret = (*l)[*it].comp((*r)[*it], 0);
111
- if (ret)
112
- return (ret < 0);
113
- ++it;
114
- }
115
- return false;
116
- }
117
- };
118
-
119
- // ---------------------------------------------------------------------------
120
- // class recordset
121
- // ---------------------------------------------------------------------------
122
- recordset::recordset()
123
- : m_fds(fielddefs::create(), &fielddefs::destroy), m_joinRows(0),
124
- m_uniqueReadMaxField(0)
125
- {
126
- m_mra.reset(new multiRecordAlocatorImple(this));
127
- }
128
-
129
- recordset::~recordset()
130
- {
131
- }
132
-
133
- void recordset::registerMemoryBlock(unsigned char* ptr, size_t size,
134
- size_t recordLen, int addtype,
135
- const table* tb)
136
- {
137
- autoMemory* am = new autoMemory(ptr, size, 0, true);
138
- m_memblock.push_back(boost::shared_ptr<autoMemory>(am));
139
- unsigned char* p = am->ptr;
140
- // copy fileds
141
- if (addtype & mra_nextrows)
142
- {
143
- if (addtype == mra_nextrows)
144
- m_mra->setRowOffset((int)m_recordset.size()); // no join
145
- else
146
- m_mra->setRowOffset((int)m_joinRows); // Join
147
- }
148
- else
149
- {
150
- // assert(tb);
151
- m_joinRows = 0;
152
- m_mra->setRowOffset(0);
153
- m_mra->setCurFirstFiled((int)m_fds->size());
154
- if (tb)
155
- m_fds->copyFrom(tb);
156
- if (tb && (addtype == mra_nojoin))
157
- {
158
- const keydef& kd = tb->tableDef()->keyDefs[tb->keyNum()];
159
- m_uniqueReadMaxField =
160
- (kd.segments[0].flags.bit0 == false) ? (short)m_fds->size() : 0;
161
- }
162
- }
163
-
164
- *(am->endFieldIndex) = (short)m_fds->size();
165
- size_t rows = size / recordLen;
166
-
167
- // set record pointer to each record
168
- if ((addtype & mra_innerjoin) || (addtype & mra_outerjoin))
169
- {
170
- // Join optimazing
171
- const std::vector<std::vector<int> >* jmap = m_mra->joinRowMap();
172
-
173
- if (jmap)
174
- {
175
- // At Join that if some base records reference to a joined record
176
- // that the joined record pointer is shared by some base
177
- // records.
178
- for (int i = 0; i < (int)rows; ++i)
179
- {
180
- const std::vector<int>& map = (*jmap)[i + m_joinRows];
181
- for (int j = 0; j < (int)map.size(); ++j)
182
- m_recordset[map[j]]->setRecordData(
183
- p + recordLen * i, 0, am->endFieldIndex, false);
184
- }
185
- }
186
- else
187
- {
188
- for (int i = 0; i < (int)rows; ++i)
189
- m_recordset[i + m_joinRows]->setRecordData(
190
- p + recordLen * i, 0, am->endFieldIndex, false);
191
- }
192
- m_joinRows += rows;
193
- }
194
- else
195
- { // create new record
196
- size_t reserveSize = m_recordset.size() + rows;
197
- m_recordset.reserve(reserveSize);
198
- for (int i = 0; i < (int)rows; ++i)
199
- {
200
- row_ptr rec(memoryRecord::create(*m_fds), &memoryRecord::release);
201
- rec->setRecordData(p + recordLen * i, 0, am->endFieldIndex, false);
202
- m_recordset.push_back(rec);
203
- }
204
- }
205
- }
206
-
207
- void recordset::makeSortFields(const _TCHAR* name, std::vector<int>& fieldNums)
208
- {
209
- int index = m_fds->indexByName(name);
210
- if (index == -1)
211
- THROW_BZS_ERROR_WITH_MSG(_T("oorderBy:Invalid field name"));
212
- fieldNums.push_back(index);
213
- }
214
-
215
- int recordset::getMemBlockIndex(unsigned char* ptr) const
216
- {
217
- for (int i = 0; i < (int)m_memblock.size(); ++i)
218
- {
219
- const boost::shared_ptr<autoMemory>& am = m_memblock[i];
220
- if ((ptr >= am->ptr) && (ptr < am->ptr + am->size))
221
- return i;
222
- }
223
- assert(0);
224
- return -1;
225
- }
226
-
227
- /* This clone is deep copy.
228
- But text and blob field data memory are shared.
229
- */
230
- recordset* recordset::clone() const
231
- {
232
- recordset* p = new recordset();
233
- p->m_joinRows = m_joinRows;
234
- p->m_uniqueReadMaxField = m_uniqueReadMaxField;
235
- p->m_unionFds = m_unionFds;
236
- p->m_fds.reset(m_fds->clone(), &fielddefs::destroy);
237
-
238
- std::vector<__int64> offsets;
239
- for (int i = 0; i < (int)m_memblock.size(); ++i)
240
- {
241
- autoMemory* am =
242
- new autoMemory(m_memblock[i]->ptr, m_memblock[i]->size, 0, true);
243
- *am->endFieldIndex = *m_memblock[i]->endFieldIndex;
244
- p->m_memblock.push_back(boost::shared_ptr<autoMemory>(am));
245
- offsets.push_back((__int64)(am->ptr - m_memblock[i]->ptr));
246
- }
247
-
248
- for (int i = 0; i < (int)m_recordset.size(); ++i)
249
- {
250
- memoryRecord* row = dynamic_cast<memoryRecord*>(m_recordset[i].get());
251
- memoryRecord* mr = memoryRecord::create(*p->m_fds);
252
- row_ptr rec(mr, &memoryRecord::release);
253
- p->m_recordset.push_back(rec);
254
-
255
- for (int j = 0; j < (int)row->memBlockSize(); ++j)
256
- {
257
- const autoMemory& mb = row->memBlock(j);
258
- int index = getMemBlockIndex(mb.ptr);
259
- unsigned char* ptr = mb.ptr + offsets[index];
260
- const boost::shared_ptr<autoMemory>& am = p->m_memblock[index];
261
- mr->setRecordData(ptr, mb.size, am->endFieldIndex, mb.owner);
262
- }
263
- }
264
- return p;
265
- }
266
-
267
- void recordset::clearRecords()
268
- {
269
- m_recordset.clear();
270
- m_uniqueReadMaxField = 0;
271
- }
272
-
273
- void recordset::clear()
274
- {
275
- clearRecords();
276
- m_fds->clear();
277
- m_unionFds.clear();
278
- m_memblock.clear();
279
- }
280
-
281
- recordset& recordset::top(recordset& c, int n)
282
- {
283
- c = *this;
284
- c.clearRecords();
285
- for (int i = 0; i < n; ++i)
286
- c.push_back(m_recordset[i]);
287
- return c;
288
- }
289
-
290
- recordset::iterator recordset::begin()
291
- {
292
- return m_recordset.begin();
293
- }
294
-
295
- recordset::iterator recordset::end()
296
- {
297
- return m_recordset.end();
298
- }
299
-
300
- recordset::iterator recordset::erase(size_t index)
301
- {
302
- return m_recordset.erase(m_recordset.begin() + index);
303
- }
304
-
305
- recordset::iterator recordset::erase(const iterator& it)
306
- {
307
- return m_recordset.erase(it);
308
- }
309
-
310
- void recordset::push_back(row_ptr r)
311
- {
312
- m_recordset.push_back(r);
313
- };
314
-
315
- void recordset::readBefore(const table_ptr tb, const aliasMap_type* alias)
316
- {
317
- tb->setMra(m_mra.get());
318
- m_fds->setAliases(alias);
319
- }
320
-
321
- recordset::key_type recordset::resolvKeyValue(const std::_tstring& name,
322
- bool noexception)
323
- {
324
- int index = m_fds->indexByName(name);
325
- if (index != -1)
326
- return index;
327
- if (!noexception)
328
- THROW_BZS_ERROR_WITH_MSG(_T("groupQuery:Invalid key name"));
329
-
330
- return (key_type)m_fds->size();
331
- }
332
-
333
- void recordset::removeField(int index)
334
- {
335
- m_fds->remove(index);
336
- for (int i = 0; i < (int)m_unionFds.size(); ++i)
337
- m_unionFds[i]->remove(index);
338
-
339
- for (int i = 0; i < (int)m_memblock.size(); ++i)
340
- {
341
- if (*(m_memblock[i]->endFieldIndex) > index)
342
- {
343
- short v = *(m_memblock[i]->endFieldIndex) - 1;
344
- *(m_memblock[i]->endFieldIndex) = v;
345
- }
346
- }
347
- }
348
-
349
- recordset& recordset::matchBy(recordsetQuery& rq)
350
- {
351
- rq.init(fieldDefs());
352
- for (int i = (int)m_recordset.size() - 1; i >= 0; --i)
353
- if (!rq.match(m_recordset[i]))
354
- erase(i);
355
- return *this;
356
- }
357
-
358
- recordset& recordset::groupBy(groupQuery& gq)
359
- {
360
- gq.grouping(*this);
361
- return *this;
362
- }
363
-
364
- recordset& recordset::orderBy(const _TCHAR* name1, const _TCHAR* name2,
365
- const _TCHAR* name3, const _TCHAR* name4,
366
- const _TCHAR* name5, const _TCHAR* name6,
367
- const _TCHAR* name7, const _TCHAR* name8)
368
- {
369
- std::vector<int> fieldNums;
370
- makeSortFields(name1, fieldNums);
371
- if (name2)
372
- makeSortFields(name2, fieldNums);
373
- if (name3)
374
- makeSortFields(name3, fieldNums);
375
- if (name4)
376
- makeSortFields(name4, fieldNums);
377
- if (name5)
378
- makeSortFields(name5, fieldNums);
379
- if (name6)
380
- makeSortFields(name6, fieldNums);
381
- if (name7)
382
- makeSortFields(name7, fieldNums);
383
- if (name8)
384
- makeSortFields(name8, fieldNums);
385
- std::sort(begin(), end(), recordsetSorter(fieldNums));
386
- return *this;
387
- }
388
-
389
- inline recordset& recordset::reverse()
390
- {
391
- std::reverse(begin(), end());
392
- return *this;
393
- }
394
-
395
- void recordset::appendCol(const _TCHAR* name, int type, short len)
396
- {
397
- assert(m_fds->size());
398
- fielddef fd((*m_fds)[0]);
399
- fd.len = len;
400
- fd.pos = 0;
401
- fd.type = type;
402
- fd.setName(name);
403
- m_fds->push_back(&fd);
404
- for (int i = 0; i < (int)m_unionFds.size(); ++i)
405
- m_unionFds[i]->push_back(&fd);
406
- registerMemoryBlock(NULL, fd.len * size(), fd.len, mra_outerjoin);
407
- }
408
-
409
- recordset& recordset::operator+=(const recordset& r)
410
- {
411
- if (!m_fds->canUnion(*r.m_fds))
412
- THROW_BZS_ERROR_WITH_MSG(_T("Recordsets are different format"));
413
-
414
- m_recordset.reserve(m_recordset.size() + r.size());
415
- m_unionFds.push_back(r.m_fds);
416
- for (size_t i = 0; i < r.size(); ++i)
417
- m_recordset.push_back(r.m_recordset[i]);
418
- for (size_t i = 0; i < r.m_memblock.size(); ++i)
419
- m_memblock.push_back(r.m_memblock[i]);
420
- return *this;
421
- }
422
-
423
- #ifdef _DEBUG
424
- void recordset::dump()
425
- {
426
- const fielddefs& fields = *fieldDefs();
427
- for (int j = 0; j < (int)fields.size(); ++j)
428
- std::tcout << fields[j].name() << _T("\t");
429
- std::tcout << _T("\n");
430
-
431
- for (int i = 0; i < (int)size(); ++i)
432
- {
433
- row& m = (operator[](i));
434
- for (int j = 0; j < (int)m.size(); ++j)
435
- {
436
- std::tcout << m[(short)j].c_str() << _T("\t");
437
- if (j == (int)m.size() - 1)
438
- std::tcout << _T("\n");
439
- }
440
- }
441
- }
442
- #endif
443
-
444
- } // namespace client
445
- } // namespace tdap
446
- } // namespace protocol
447
- } // namespace db
448
- } // namespace bzs
@@ -1,159 +0,0 @@
1
- #ifndef BZS_DB_PROTOCOL_TDAP_CLIENT_MEMRECORDSET_H
2
- #define BZS_DB_PROTOCOL_TDAP_CLIENT_MEMRECORDSET_H
3
- /*=================================================================
4
- Copyright (C) 2014 BizStation Corp All rights reserved.
5
-
6
- This program is free software; you can redistribute it and/or
7
- modify it under the terms of the GNU General Public License
8
- as published by the Free Software Foundation; either version 2
9
- of the License, or (at your option) any later version.
10
-
11
- This program is distributed in the hope that it will be useful,
12
- but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- GNU General Public License for more details.
15
-
16
- You should have received a copy of the GNU General Public License
17
- along with this program; if not, write to the Free Software
18
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19
- 02111-1307, USA.
20
- =================================================================*/
21
- #include "groupQuery.h"
22
-
23
- namespace bzs
24
- {
25
- namespace db
26
- {
27
- namespace protocol
28
- {
29
- namespace tdap
30
- {
31
- namespace client
32
- {
33
-
34
- class AGRPACK recordset
35
- {
36
- friend class multiRecordAlocatorImple;
37
- boost::shared_ptr<fielddefs> m_fds;
38
- boost::shared_ptr<class multiRecordAlocatorImple> m_mra;
39
- std::vector<row_ptr> m_recordset;
40
- std::vector<boost::shared_ptr<autoMemory> > m_memblock;
41
- std::vector<boost::shared_ptr<fielddefs> > m_unionFds;
42
-
43
- /* for registerMemoryBlock temp data */
44
- size_t m_joinRows;
45
-
46
- /*
47
- for optimazing join.
48
- If the first reading is using by unique key , set that field count.
49
- */
50
- short m_uniqueReadMaxField;
51
-
52
- public:
53
- typedef std::vector<row_ptr>::iterator iterator;
54
-
55
- private:
56
- void registerMemoryBlock(unsigned char* ptr, size_t size, size_t recordLen,
57
- int addtype, const table* tb = NULL);
58
- void makeSortFields(const _TCHAR* name, std::vector<int>& fieldNums);
59
- int getMemBlockIndex(unsigned char* ptr) const;
60
-
61
- public:
62
- typedef fielddefs header_type;
63
- typedef int key_type;
64
- typedef row_ptr row_type;
65
- typedef row row_pure_type;
66
-
67
- recordset();
68
- ~recordset();
69
- /* This clone is deep copy.
70
- But text and blob field data memory are shared.
71
- */
72
- recordset* clone() const;
73
-
74
- inline short uniqueReadMaxField() const { return m_uniqueReadMaxField; }
75
-
76
- inline row_ptr& getRow(size_t index) { return m_recordset[index]; }
77
-
78
- inline row& operator[](size_t index) { return *m_recordset[index].get(); }
79
-
80
- inline row& first() { return *m_recordset[0].get(); }
81
-
82
- inline row& last() { return *m_recordset[m_recordset.size() - 1].get(); }
83
-
84
- inline size_t size() const { return m_recordset.size(); }
85
-
86
- inline size_t count() const { return m_recordset.size(); }
87
-
88
- void clearRecords();
89
- const fielddefs* fieldDefs() const { return m_fds.get(); }
90
- void clear();
91
- recordset& top(recordset& c, int n);
92
- iterator begin();
93
- iterator end();
94
- iterator erase(size_t index);
95
- iterator erase(const iterator& it);
96
- void push_back(row_ptr r);
97
- void readBefore(const table_ptr tb, const aliasMap_type* alias);
98
-
99
- key_type resolvKeyValue(const std::_tstring& name,
100
- bool noexception = false);
101
- void removeField(int index);
102
- recordset& matchBy(recordsetQuery& rq);
103
- recordset& groupBy(groupQuery& gq);
104
- recordset& orderBy(const _TCHAR* name1, const _TCHAR* name2 = NULL,
105
- const _TCHAR* name3 = NULL, const _TCHAR* name4 = NULL,
106
- const _TCHAR* name5 = NULL, const _TCHAR* name6 = NULL,
107
- const _TCHAR* name7 = NULL, const _TCHAR* name8 = NULL);
108
- recordset& reverse();
109
- void appendCol(const _TCHAR* name, int type, short len);
110
- recordset& operator+=(const recordset& r);
111
-
112
- #ifdef _DEBUG
113
- void dump();
114
-
115
- #endif
116
- };
117
-
118
- /** @cond INTERNAL */
119
-
120
- inline recordset::iterator begin(recordset& m)
121
- {
122
- return m.begin();
123
- }
124
- inline recordset::iterator end(recordset& m)
125
- {
126
- return m.end();
127
- }
128
- inline void push_back(recordset& m, row_ptr c)
129
- {
130
- }
131
-
132
- /* for groupby */
133
- inline void clear(recordset& m)
134
- {
135
- return m.clearRecords();
136
- }
137
-
138
- /* for groupby */
139
- inline recordset::key_type resolvKeyValue(recordset& m,
140
- const std::_tstring& name,
141
- bool noexception = false)
142
- {
143
- return m.resolvKeyValue(name, noexception);
144
- }
145
-
146
- inline row* create(recordset& m, int)
147
- {
148
- return NULL;
149
- }
150
-
151
- /** @endcond */
152
-
153
- } // namespace client
154
- } // namespace tdap
155
- } // namespace protocol
156
- } // namespace db
157
- } // namespace bzs
158
-
159
- #endif // BZS_DB_PROTOCOL_TDAP_CLIENT_MEMRECORDSET_H