transactd 3.5.0 → 3.6.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.
- checksums.yaml +4 -4
- data/bin/common/{tdclc_32_3_5.dll → tdclc_32_3_6.dll} +0 -0
- data/bin/common/tdclc_64_3_6.dll +0 -0
- data/build/swig/ruby/tdclrb_wrap.cpp +12524 -24430
- data/build/swig/tdcl.i +5 -0
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +210 -184
- data/source/bzs/db/engine/mysql/database.h +276 -105
- data/source/bzs/db/engine/mysql/mysqlInternal.h +37 -0
- data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +1 -0
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +4 -4
- data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +1 -0
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/database.cpp +7 -4
- data/source/bzs/db/protocol/tdap/client/database.h +6 -1
- data/source/bzs/db/protocol/tdap/client/databaseManager.h +2 -2
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +21 -9
- data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +10 -2
- data/source/bzs/db/protocol/tdap/client/field.cpp +29 -5
- data/source/bzs/db/protocol/tdap/client/field.h +3 -1
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +5 -0
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
- data/source/bzs/db/protocol/tdap/client/fields.h +9 -2
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +8 -4
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +18 -5
- data/source/bzs/db/protocol/tdap/client/memRecord.h +2 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +46 -13
- data/source/bzs/db/protocol/tdap/client/nsTable.h +5 -0
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +5 -0
- data/source/bzs/db/protocol/tdap/client/recordset.h +1 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +6 -2
- data/source/bzs/db/protocol/tdap/client/request.h +46 -38
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -3
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +29 -13
- data/source/bzs/db/protocol/tdap/client/table.cpp +60 -10
- data/source/bzs/db/protocol/tdap/client/table.h +4 -1
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +18 -1
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +10 -4
- data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
- data/source/bzs/db/protocol/tdap/mysql/characterset.h +1 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +11 -4
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -1
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +52 -94
- data/source/bzs/db/protocol/tdap/mysql/request.h +20 -13
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +92 -60
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
- data/source/bzs/db/protocol/tdap/tdapRequest.h +11 -0
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +83 -34
- data/source/bzs/db/protocol/tdap/tdapSchema.h +5 -1
- data/source/bzs/db/protocol/tdap/tdapcapi.h +7 -3
- data/source/bzs/example/ormap_c.cpp +2 -2
- data/source/bzs/netsvc/server/serverPipe.cpp +35 -1
- data/source/bzs/test/tdclatl/test_v3.js +48 -1
- data/source/bzs/test/tdclphp/bench.php +89 -76
- data/source/bzs/test/tdclphp/transactd_Test.php +691 -687
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +46 -43
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +46 -43
- data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +33 -33
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +29 -25
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +653 -183
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +40 -4
- data/source/bzs/test/tdclrb/transactd_fetch_spec.rb +785 -0
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +21 -1
- data/source/bzs/test/tdclrb/transactd_setget_spec.rb +450 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +14 -2
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +1192 -11
- data/source/bzs/test/trdclengn/testField.h +522 -1
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +37 -1
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +62 -4
- data/source/global/tdclatl/RecordsetQuery.cpp +2 -1
- data/source/global/tdclatl/RecordsetQuery.h +1 -1
- data/source/global/tdclatl/Table.cpp +17 -0
- data/source/global/tdclatl/Table.h +3 -1
- data/source/global/tdclatl/tdclatl.idl +7 -2
- data/transactd.gemspec +1 -1
- metadata +7 -5
- data/bin/common/tdclc_64_3_5.dll +0 -0
|
@@ -73,7 +73,7 @@ public:
|
|
|
73
73
|
int index = findTable(name);
|
|
74
74
|
if (index != -1)
|
|
75
75
|
return m_tables[index];
|
|
76
|
-
table_ptr t = openTable(m_db, name);
|
|
76
|
+
table_ptr t = openTable(m_db, name, TD_OPEN_NORMAL);
|
|
77
77
|
if (t)
|
|
78
78
|
m_tables.push_back(t);
|
|
79
79
|
return t;
|
|
@@ -190,7 +190,7 @@ public:
|
|
|
190
190
|
int index = findTable(name);
|
|
191
191
|
if (index != -1)
|
|
192
192
|
return m_tables[index];
|
|
193
|
-
table_ptr t = openTable(m_db, name);
|
|
193
|
+
table_ptr t = openTable(m_db, name, TD_OPEN_NORMAL);
|
|
194
194
|
if (t)
|
|
195
195
|
m_tables.push_back(t);
|
|
196
196
|
return t;
|
|
@@ -105,7 +105,7 @@ struct dbdimple
|
|
|
105
105
|
}
|
|
106
106
|
};
|
|
107
107
|
|
|
108
|
-
dbdef::dbdef(nsdatabase* pbe, short defType) : nstable(pbe)
|
|
108
|
+
dbdef::dbdef(nsdatabase* pbe, short defType, short mode) : nstable(pbe)
|
|
109
109
|
{
|
|
110
110
|
m_dimpl = new dbdimple();
|
|
111
111
|
m_dimpl->deftype = defType;
|
|
@@ -113,6 +113,7 @@ dbdef::dbdef(nsdatabase* pbe, short defType) : nstable(pbe)
|
|
|
113
113
|
m_keybuflen = 128;
|
|
114
114
|
m_keybuf = &m_dimpl->keybuf[0];
|
|
115
115
|
setShared();
|
|
116
|
+
setMode((char_td)mode);
|
|
116
117
|
}
|
|
117
118
|
|
|
118
119
|
dbdef::~dbdef()
|
|
@@ -745,6 +746,7 @@ tabledef* dbdef::initReadAfter(short tableIndex, const tabledef* data, uint_td d
|
|
|
745
746
|
td->setFielddefsPtr();
|
|
746
747
|
td->setKeydefsPtr();
|
|
747
748
|
td->autoIncExSpace = ((database*)nsdb())->defaultAutoIncSpace();
|
|
749
|
+
td->convertToUtf8Schema();
|
|
748
750
|
//Fix:Bug of maxRecordLen is mistake value saved, recalculate maxRecordLen.
|
|
749
751
|
td->calcReclordlen();
|
|
750
752
|
td->optionFlags.bitC = (td->fieldDefs[td->fieldCount -1].type == ft_myfixedbinary);
|
|
@@ -1014,12 +1016,14 @@ short dbdef::findKeynumByFieldNum(short tableIndex, short index)
|
|
|
1014
1016
|
short dbdef::tableNumByName(const _TCHAR* tableName)
|
|
1015
1017
|
{
|
|
1016
1018
|
char buf[74];
|
|
1019
|
+
const char* p = NULL;
|
|
1017
1020
|
for (short i = 1; i <= m_dimpl->tableCount; i++)
|
|
1018
1021
|
{
|
|
1019
1022
|
tabledef* td = tableDefs(i);
|
|
1020
1023
|
if (td)
|
|
1021
1024
|
{
|
|
1022
|
-
|
|
1025
|
+
if (!p)
|
|
1026
|
+
p = td->toChar(buf, tableName, 74);
|
|
1023
1027
|
if (strcmp(td->tableNameA(), p) == 0)
|
|
1024
1028
|
return i;
|
|
1025
1029
|
}
|
|
@@ -1277,6 +1281,9 @@ bool dbdef::isPassKey(uchar_td FieldType)
|
|
|
1277
1281
|
void dbdef::autoMakeSchema(bool nouseNullkey)
|
|
1278
1282
|
{
|
|
1279
1283
|
m_keynum = (int)nouseNullkey;
|
|
1284
|
+
if (database::compatibleMode() & database::CMP_MODE_BINFD_DEFAULT_STR)
|
|
1285
|
+
m_keynum += 2; // binary field defaut string
|
|
1286
|
+
|
|
1280
1287
|
tdap(TD_AUTOMEKE_SCHEMA);
|
|
1281
1288
|
}
|
|
1282
1289
|
|
|
@@ -1591,12 +1598,15 @@ void dbdef::openDdf(const _TCHAR* dir, short Mode, const _TCHAR* OwnerName)
|
|
|
1591
1598
|
insertKey(tbid, tableDefs(tbid)->keyCount);
|
|
1592
1599
|
|
|
1593
1600
|
KeyDef = &(tableDefs(tbid)->keyDefs[id->keyid]);
|
|
1594
|
-
if (
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1601
|
+
if (id->segmentnum < 8)
|
|
1602
|
+
{
|
|
1603
|
+
if (KeyDef->segmentCount < id->segmentnum + 1)
|
|
1604
|
+
KeyDef->segmentCount =
|
|
1605
|
+
(uchar_td)(id->segmentnum + 1);
|
|
1606
|
+
KeyDef->segments[id->segmentnum].fieldNum =
|
|
1607
|
+
(uchar_td)FieldIndex;
|
|
1608
|
+
KeyDef->segments[id->segmentnum].flags.all = id->flag;
|
|
1609
|
+
}
|
|
1600
1610
|
id->seekNext();
|
|
1601
1611
|
}
|
|
1602
1612
|
}
|
|
@@ -1813,7 +1823,10 @@ void dbdef::synchronizeSeverSchema(short tableIndex)
|
|
|
1813
1823
|
m_pdata = m_dimpl->bdf;
|
|
1814
1824
|
m_buflen = m_datalen = m_dimpl->bdfLen;
|
|
1815
1825
|
m_dimpl->bdf->id = tableIndex;
|
|
1826
|
+
m_keynum = SC_SUBOP_TABLEDEF;
|
|
1816
1827
|
tdap((ushort_td)TD_GET_SCHEMA);
|
|
1828
|
+
m_keybuf = tmp;
|
|
1829
|
+
m_keynum = 0;
|
|
1817
1830
|
if (m_stat == STATUS_SUCCESS)
|
|
1818
1831
|
{
|
|
1819
1832
|
if (m_datalen == 0)
|
|
@@ -1831,7 +1844,6 @@ void dbdef::synchronizeSeverSchema(short tableIndex)
|
|
|
1831
1844
|
delete tdold;
|
|
1832
1845
|
}
|
|
1833
1846
|
}
|
|
1834
|
-
m_keybuf = tmp;
|
|
1835
1847
|
}
|
|
1836
1848
|
|
|
1837
1849
|
} // namespace client
|
|
@@ -74,7 +74,7 @@ class DLLLIB dbdef : private nstable
|
|
|
74
74
|
void tableDefCopy(tabledef* dest, const tabledef* src, size_t size);
|
|
75
75
|
|
|
76
76
|
~dbdef();
|
|
77
|
-
dbdef(nsdatabase* pbe, short defType);
|
|
77
|
+
dbdef(nsdatabase* pbe, short defType, short mode);
|
|
78
78
|
void create(const _TCHAR* uri);
|
|
79
79
|
void autoMakeSchema(bool noUseNullkey);
|
|
80
80
|
bool testTablePtr(tabledef* td);
|
|
@@ -213,11 +213,16 @@ extern "C" PACKAGE_OSX short_td __STDCALL
|
|
|
213
213
|
case TD_UPDATE_PART:
|
|
214
214
|
client_t->cleanup();
|
|
215
215
|
return 0;
|
|
216
|
-
|
|
216
|
+
|
|
217
217
|
case TD_CLEAR_OWNERNAME:
|
|
218
218
|
case TD_AUTOMEKE_SCHEMA:
|
|
219
219
|
client_t->req().paramMask = P_MASK_POSBLK | P_MASK_KEYNUM;
|
|
220
220
|
break;
|
|
221
|
+
case TD_REC_DELETE:
|
|
222
|
+
client_t->req().paramMask = P_MASK_POSBLK | P_MASK_KEYNUM;
|
|
223
|
+
if (client_t->req().op > 100)
|
|
224
|
+
client_t->req().paramMask |= P_MASK_DATA | P_MASK_DATALEN;
|
|
225
|
+
break;
|
|
221
226
|
case TD_END_TRANSACTION:
|
|
222
227
|
case TD_BEGIN_TRANSACTION:
|
|
223
228
|
case TD_ABORT_TRANSACTION:
|
|
@@ -250,7 +255,10 @@ extern "C" PACKAGE_OSX short_td __STDCALL
|
|
|
250
255
|
case TD_KEY_LE_KO:
|
|
251
256
|
case TD_REC_DELLETEATKEY:
|
|
252
257
|
client_t->req().paramMask = P_MASK_KEYNAVI;
|
|
253
|
-
|
|
258
|
+
// Send updateTimepstamp value when op = TD_REC_DELLETEATKEY + 100
|
|
259
|
+
if (op == TD_REC_DELLETEATKEY && client_t->req().op > 100)
|
|
260
|
+
client_t->req().paramMask |= P_MASK_DATA;
|
|
261
|
+
else if (op > 50)
|
|
254
262
|
client_t->req().paramMask &= ~P_MASK_DATALEN;
|
|
255
263
|
break;
|
|
256
264
|
case TD_KEY_NEXT_MULTI:
|
|
@@ -314,6 +314,7 @@ public:
|
|
|
314
314
|
//------------------------------------------------------------------------------
|
|
315
315
|
// class fieldShare
|
|
316
316
|
//------------------------------------------------------------------------------
|
|
317
|
+
|
|
317
318
|
struct Imple
|
|
318
319
|
{
|
|
319
320
|
stringConverter* cv;
|
|
@@ -359,6 +360,11 @@ void fieldShare::blobClear()
|
|
|
359
360
|
m_imple->blobs.clear();
|
|
360
361
|
}
|
|
361
362
|
|
|
363
|
+
void fieldShare::blobResize(size_t size)
|
|
364
|
+
{
|
|
365
|
+
m_imple->blobs.resize(size);
|
|
366
|
+
}
|
|
367
|
+
|
|
362
368
|
//------------------------------------------------------------------------------
|
|
363
369
|
// class fielddefs
|
|
364
370
|
//------------------------------------------------------------------------------
|
|
@@ -463,21 +469,27 @@ void fielddefs::push_back(const fielddef* p)
|
|
|
463
469
|
++m_imple->mysqlnullEnable;
|
|
464
470
|
// reset update indicator
|
|
465
471
|
pp->enableFlags.bitE = false;
|
|
472
|
+
|
|
473
|
+
// For activeTable need replacing name
|
|
466
474
|
aliasing(pp);
|
|
467
475
|
m_imple->map[pp->name()] = index;
|
|
468
476
|
}
|
|
469
477
|
|
|
470
478
|
void fielddefs::remove(int index)
|
|
471
479
|
{
|
|
472
|
-
m_imple->map.erase(m_imple->fields[index].name());
|
|
473
480
|
m_imple->fields.erase(m_imple->fields.begin() + index);
|
|
474
481
|
boost::unordered_map<std::_tstring, int>::iterator it =
|
|
475
482
|
m_imple->map.begin();
|
|
476
483
|
while (it != m_imple->map.end())
|
|
477
484
|
{
|
|
478
|
-
if ((*it).second
|
|
479
|
-
(
|
|
480
|
-
|
|
485
|
+
if ((*it).second == index)
|
|
486
|
+
it = m_imple->map.erase(it);
|
|
487
|
+
else
|
|
488
|
+
{
|
|
489
|
+
if ((*it).second > index)
|
|
490
|
+
(*it).second--;
|
|
491
|
+
++it;
|
|
492
|
+
}
|
|
481
493
|
}
|
|
482
494
|
}
|
|
483
495
|
|
|
@@ -508,6 +520,14 @@ bool fielddefs::checkIndex(int index) const
|
|
|
508
520
|
return (index >= 0 && index < (int)m_imple->fields.size());
|
|
509
521
|
}
|
|
510
522
|
|
|
523
|
+
void fielddefs::addAliasName(int index, const _TCHAR* name)
|
|
524
|
+
{
|
|
525
|
+
assert(checkIndex(index));
|
|
526
|
+
//replace original name
|
|
527
|
+
m_imple->fields[index].setName(name);
|
|
528
|
+
m_imple->map[name] = index;
|
|
529
|
+
}
|
|
530
|
+
|
|
511
531
|
int fielddefs::indexByName(const std::_tstring& name) const
|
|
512
532
|
{
|
|
513
533
|
if (m_imple->map.count(name) == 0)
|
|
@@ -544,16 +564,20 @@ size_t fielddefs::totalFieldLen() const
|
|
|
544
564
|
return fd.pos + fd.len + fd.nullbytes();
|
|
545
565
|
}
|
|
546
566
|
|
|
547
|
-
void fielddefs::
|
|
567
|
+
void fielddefs::addAllFields(const tabledef* def)
|
|
548
568
|
{
|
|
549
569
|
m_imple->fields.clear();
|
|
550
570
|
m_imple->mysqlnullEnable = 0;
|
|
571
|
+
short blobCount = 0;
|
|
551
572
|
for (int i = 0; i < def->fieldCount; ++i)
|
|
552
573
|
{
|
|
553
574
|
const fielddef* fd = &def->fieldDefs[i];
|
|
554
575
|
push_back(fd);
|
|
555
576
|
m_imple->fields[m_imple->fields.size() - 1].setPadCharDefaultSettings();
|
|
577
|
+
if (fd->isBlob())
|
|
578
|
+
++blobCount;
|
|
556
579
|
}
|
|
580
|
+
blobResize(blobCount);
|
|
557
581
|
}
|
|
558
582
|
|
|
559
583
|
void fielddefs::addSelectedFields(const table* tb)
|
|
@@ -66,6 +66,7 @@ protected:
|
|
|
66
66
|
bzs::rtl::stringBuffer* strBufs() const;
|
|
67
67
|
void blobPushBack(char* p);
|
|
68
68
|
void blobClear();
|
|
69
|
+
void blobResize(size_t size);
|
|
69
70
|
};
|
|
70
71
|
|
|
71
72
|
/** @endcond */
|
|
@@ -100,13 +101,14 @@ class DLLLIB fielddefs : public fieldShare
|
|
|
100
101
|
public:
|
|
101
102
|
void clear();
|
|
102
103
|
fielddefs* clone() const;
|
|
104
|
+
void addAliasName(int index, const _TCHAR* name);
|
|
103
105
|
int indexByName(const std::_tstring& name) const;
|
|
104
106
|
const fielddef& operator[](int index) const;
|
|
105
107
|
const fielddef& operator[](const _TCHAR* name) const;
|
|
106
108
|
const fielddef& operator[](const std::_tstring& name) const;
|
|
107
109
|
bool checkIndex(int index) const;
|
|
108
110
|
size_t size() const;
|
|
109
|
-
void
|
|
111
|
+
void addAllFields(const tabledef* def);
|
|
110
112
|
void addSelectedFields(const class table* tb);
|
|
111
113
|
void release();
|
|
112
114
|
static fielddefs* create();
|
|
@@ -126,6 +126,8 @@ class fieldsBase : public refarymem
|
|
|
126
126
|
friend class recordsetImple; // setRecordData setFielddefs
|
|
127
127
|
friend class recordsetQuery; // setRecordData
|
|
128
128
|
friend class groupQueryImple; // setInvalidMemblock
|
|
129
|
+
friend class recordCache; // setInvalidMemblock
|
|
130
|
+
friend class table; // setInvalidMemblock
|
|
129
131
|
|
|
130
132
|
virtual unsigned char* ptr(int index) const = 0;
|
|
131
133
|
virtual unsigned char* nullPtr(int index) const = 0;
|
|
@@ -169,8 +171,13 @@ protected:
|
|
|
169
171
|
|
|
170
172
|
inline void setInvalidMemblock(short index)
|
|
171
173
|
{
|
|
172
|
-
|
|
173
|
-
|
|
174
|
+
if (index == -1)
|
|
175
|
+
m_InvalidFlags = 0;
|
|
176
|
+
else
|
|
177
|
+
{
|
|
178
|
+
int num = memoryBlockIndex(index);
|
|
179
|
+
m_InvalidFlags |= ((2L << num) | 1L);
|
|
180
|
+
}
|
|
174
181
|
}
|
|
175
182
|
|
|
176
183
|
/** @endcond */
|
|
@@ -503,11 +503,15 @@ public:
|
|
|
503
503
|
{
|
|
504
504
|
if (m_funcs[j]->isNull(i))
|
|
505
505
|
(*cur).setInvalidMemblock(m_funcs[j]->resultKey());
|
|
506
|
-
else if (m_funcs[j]->resultType() == ft_float)
|
|
507
|
-
setValue(cur, m_funcs[j]->resultKey(), m_funcs[j]->numericResult(i));
|
|
508
506
|
else
|
|
509
|
-
|
|
510
|
-
|
|
507
|
+
{
|
|
508
|
+
(*cur).setInvalidMemblock(-1);
|
|
509
|
+
if (m_funcs[j]->resultType() == ft_float)
|
|
510
|
+
setValue(cur, m_funcs[j]->resultKey(), m_funcs[j]->numericResult(i));
|
|
511
|
+
else
|
|
512
|
+
memcpy((*cur)[m_funcs[j]->resultKey()].ptr() ,
|
|
513
|
+
m_funcs[j]->stringResult(i), m_funcs[j]->resultLen());
|
|
514
|
+
}
|
|
511
515
|
}
|
|
512
516
|
mdls.push_back(cur);
|
|
513
517
|
}
|
|
@@ -146,13 +146,16 @@ memoryRecord::memoryRecord(const memoryRecord& r)
|
|
|
146
146
|
{
|
|
147
147
|
#ifdef JOIN_UNLIMIT
|
|
148
148
|
m_memblock = r.m_memblock;
|
|
149
|
+
for (int i = 0; i < memBlockSize(); ++i)
|
|
150
|
+
m_memblock[i]->addref();
|
|
149
151
|
#else
|
|
150
152
|
m_memblockSize = r.m_memblockSize;
|
|
151
153
|
for (int i = 0; i < m_memblockSize; ++i)
|
|
154
|
+
{
|
|
152
155
|
m_memblock[i] = r.m_memblock[i];
|
|
153
|
-
#endif
|
|
154
|
-
for (int i = 0; i < memBlockSize(); ++i)
|
|
155
156
|
m_memblock[i]->addref();
|
|
157
|
+
}
|
|
158
|
+
#endif
|
|
156
159
|
|
|
157
160
|
}
|
|
158
161
|
|
|
@@ -166,10 +169,15 @@ memoryRecord& memoryRecord::operator=(const memoryRecord& r)
|
|
|
166
169
|
{
|
|
167
170
|
if (this != &r)
|
|
168
171
|
{
|
|
169
|
-
|
|
172
|
+
for (int i = 0; i < memBlockSize(); ++i)
|
|
173
|
+
m_memblock[i]->release();
|
|
174
|
+
fieldsBase::operator=(r);
|
|
175
|
+
//m_fns = r.m_fns;
|
|
170
176
|
m_blockIndexCache = r.m_blockIndexCache;
|
|
171
177
|
#ifdef JOIN_UNLIMIT
|
|
172
178
|
m_memblock = r.m_memblock;
|
|
179
|
+
#else
|
|
180
|
+
m_memblockSize = r.m_memblockSize;
|
|
173
181
|
#endif
|
|
174
182
|
for (int i = 0; i < memBlockSize(); ++i)
|
|
175
183
|
{
|
|
@@ -178,7 +186,6 @@ memoryRecord& memoryRecord::operator=(const memoryRecord& r)
|
|
|
178
186
|
#endif
|
|
179
187
|
m_memblock[i]->addref();
|
|
180
188
|
}
|
|
181
|
-
|
|
182
189
|
}
|
|
183
190
|
return *this;
|
|
184
191
|
}
|
|
@@ -203,6 +210,8 @@ void memoryRecord::setRecordData(autoMemory* am, unsigned char* ptr,
|
|
|
203
210
|
#ifdef JOIN_UNLIMIT
|
|
204
211
|
m_memblock.push_back(am);
|
|
205
212
|
#else
|
|
213
|
+
if (m_memblockSize == JOINLIMIT_PER_RECORD)
|
|
214
|
+
THROW_BZS_ERROR_WITH_MSG(_T("The number of Join limit has been exceeded."));
|
|
206
215
|
m_memblock[m_memblockSize] = am;
|
|
207
216
|
++m_memblockSize;
|
|
208
217
|
#endif
|
|
@@ -358,6 +367,7 @@ void writableRecord::del(bool KeysetAlrady, bool noSeek)
|
|
|
358
367
|
if (m_tb->stat())
|
|
359
368
|
nstable::throwError(_T("activeTable delete "), m_tb->stat());
|
|
360
369
|
}
|
|
370
|
+
if (m_tb->updateConflictCheck()) copyToBuffer(m_tb);
|
|
361
371
|
deleteRecord(m_tb);
|
|
362
372
|
}
|
|
363
373
|
|
|
@@ -371,7 +381,7 @@ void writableRecord::update(bool KeysetAlrady, bool noSeek)
|
|
|
371
381
|
if (m_tb->stat())
|
|
372
382
|
nstable::throwError(_T("activeTable update "), m_tb->stat());
|
|
373
383
|
}
|
|
374
|
-
copyToBuffer(m_tb,
|
|
384
|
+
copyToBuffer(m_tb, !m_tb->updateConflictCheck() /*only changed*/);
|
|
375
385
|
updateRecord(m_tb);
|
|
376
386
|
}
|
|
377
387
|
|
|
@@ -380,7 +390,10 @@ void writableRecord::save()
|
|
|
380
390
|
copyToBuffer(m_tb);
|
|
381
391
|
m_tb->seek();
|
|
382
392
|
if (m_tb->stat() == STATUS_NOT_FOUND_TI)
|
|
393
|
+
{
|
|
383
394
|
insertRecord(m_tb);
|
|
395
|
+
copyFromBuffer(m_tb);
|
|
396
|
+
}
|
|
384
397
|
else
|
|
385
398
|
{
|
|
386
399
|
copyToBuffer(m_tb);
|
|
@@ -59,7 +59,7 @@ public:
|
|
|
59
59
|
#define ROW_MEM_BLOCK_RESERVE 4
|
|
60
60
|
|
|
61
61
|
#ifndef JOINLIMIT_PER_RECORD
|
|
62
|
-
#define JOINLIMIT_PER_RECORD
|
|
62
|
+
#define JOINLIMIT_PER_RECORD 14
|
|
63
63
|
#endif
|
|
64
64
|
#if (JOINLIMIT_PER_RECORD < 1)
|
|
65
65
|
#define JOIN_UNLIMIT
|
|
@@ -141,7 +141,6 @@ protected:
|
|
|
141
141
|
inline memoryRecord(fielddefs& fdinfo);
|
|
142
142
|
memoryRecord(const memoryRecord& r);
|
|
143
143
|
~memoryRecord();
|
|
144
|
-
memoryRecord& operator=(const memoryRecord& r);
|
|
145
144
|
void copyToBuffer(table* tb, bool updateOnly = false) const;
|
|
146
145
|
inline void copyFromBuffer(const table* tb)
|
|
147
146
|
{
|
|
@@ -153,6 +152,7 @@ protected:
|
|
|
153
152
|
/** @endcond */
|
|
154
153
|
public:
|
|
155
154
|
void clear(); // orverride
|
|
155
|
+
memoryRecord& operator=(const memoryRecord& r); // For SWIG
|
|
156
156
|
static memoryRecord* create(fielddefs& fdinfo); // For SWIG
|
|
157
157
|
};
|
|
158
158
|
|
|
@@ -51,7 +51,7 @@ struct nstimpl
|
|
|
51
51
|
{
|
|
52
52
|
nstimpl()
|
|
53
53
|
: bulkIns(NULL), refCount(1), percentage(0), bookmarkLen(0), tableid(0), mode(0),
|
|
54
|
-
shared(false), isOpen(false)
|
|
54
|
+
shared(false), isOpen(false), updateConflictCheck(false)
|
|
55
55
|
{
|
|
56
56
|
memset(posblk, 0 ,POS_BLOCK_SIZE);
|
|
57
57
|
uri[0] = 0x00;
|
|
@@ -68,6 +68,7 @@ struct nstimpl
|
|
|
68
68
|
char_td mode;
|
|
69
69
|
bool shared;
|
|
70
70
|
bool isOpen;
|
|
71
|
+
bool updateConflictCheck;
|
|
71
72
|
};
|
|
72
73
|
|
|
73
74
|
// -----------------------------------------------------------------
|
|
@@ -180,6 +181,11 @@ void nstable::setIsOpen(bool v)
|
|
|
180
181
|
m_impl->isOpen = v;
|
|
181
182
|
}
|
|
182
183
|
|
|
184
|
+
void nstable::setMode(char_td v)
|
|
185
|
+
{
|
|
186
|
+
m_impl->mode = v;
|
|
187
|
+
}
|
|
188
|
+
|
|
183
189
|
bool nstable::isOpen() const
|
|
184
190
|
{
|
|
185
191
|
return m_impl->isOpen;
|
|
@@ -452,6 +458,17 @@ clean:
|
|
|
452
458
|
m_pdata = data_bak;
|
|
453
459
|
}
|
|
454
460
|
|
|
461
|
+
bool nstable::setUpdateConflictCheck(bool v)
|
|
462
|
+
{
|
|
463
|
+
m_impl->updateConflictCheck = v;
|
|
464
|
+
return getUpdateStampEnable();
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
bool nstable::updateConflictCheck() const
|
|
468
|
+
{
|
|
469
|
+
return m_impl->updateConflictCheck;
|
|
470
|
+
}
|
|
471
|
+
|
|
455
472
|
void nstable::doUpdate(eUpdateType type)
|
|
456
473
|
{
|
|
457
474
|
int trnCount = nsdb()->enableTrn();
|
|
@@ -480,11 +497,11 @@ void nstable::doUpdate(eUpdateType type)
|
|
|
480
497
|
else
|
|
481
498
|
m_keylen = writeKeyData();
|
|
482
499
|
m_datalen = getWriteImageLen();
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
500
|
+
short op = (m_impl->nsdb->isUseTransactd() && (type == changeInKey)) ?
|
|
501
|
+
TD_REC_UPDATEATKEY : TD_REC_UPDATE;
|
|
502
|
+
if (m_impl->updateConflictCheck) op += 100;
|
|
503
|
+
|
|
504
|
+
tdap(op);
|
|
488
505
|
m_keynum = keynum;
|
|
489
506
|
onUpdateAfter(option);
|
|
490
507
|
}
|
|
@@ -500,15 +517,26 @@ void nstable::doDel(bool inkey)
|
|
|
500
517
|
return;
|
|
501
518
|
|
|
502
519
|
m_datalen = m_buflen;
|
|
520
|
+
if (inkey && !isUniqeKey(m_keynum))
|
|
521
|
+
{
|
|
522
|
+
m_stat = STATUS_INVALID_KEYNUM;
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
__int64 v = m_impl->updateConflictCheck ? getUpdateStampValue() : 0;
|
|
526
|
+
short op = v ? 100 : 0;
|
|
503
527
|
if (m_impl->nsdb->isUseTransactd() && inkey)
|
|
504
528
|
{
|
|
505
|
-
|
|
529
|
+
m_keylen = writeKeyData();
|
|
530
|
+
void* data_bak = m_pdata;
|
|
531
|
+
if (v)
|
|
506
532
|
{
|
|
507
|
-
|
|
508
|
-
|
|
533
|
+
m_datalen = sizeof(__int64);
|
|
534
|
+
m_pdata = &v;
|
|
509
535
|
}
|
|
510
|
-
|
|
511
|
-
tdap(
|
|
536
|
+
op += TD_REC_DELLETEATKEY;
|
|
537
|
+
tdap(op);
|
|
538
|
+
m_pdata = data_bak;
|
|
539
|
+
m_datalen = m_buflen;
|
|
512
540
|
}
|
|
513
541
|
else
|
|
514
542
|
{
|
|
@@ -516,10 +544,15 @@ void nstable::doDel(bool inkey)
|
|
|
516
544
|
{
|
|
517
545
|
m_keylen = writeKeyData();
|
|
518
546
|
seek();
|
|
519
|
-
if (m_stat)
|
|
547
|
+
if (m_stat) return;
|
|
548
|
+
if (v && v != getUpdateStampValue())
|
|
549
|
+
{
|
|
550
|
+
m_stat = STATUS_CHANGE_CONFLICT;
|
|
520
551
|
return;
|
|
552
|
+
}
|
|
521
553
|
}
|
|
522
|
-
|
|
554
|
+
op += TD_REC_DELETE;
|
|
555
|
+
tdap(op);
|
|
523
556
|
}
|
|
524
557
|
}
|
|
525
558
|
|
|
@@ -99,6 +99,7 @@ protected:
|
|
|
99
99
|
const _TCHAR* uri() const;
|
|
100
100
|
const uchar_td* posblk() const;
|
|
101
101
|
void setIsOpen(bool v);
|
|
102
|
+
void setMode(char_td v); //For dbdef in noschema mode.
|
|
102
103
|
|
|
103
104
|
bulkInsert* bulkIns() const;
|
|
104
105
|
virtual bool isUniqeKey(char_td keynum)
|
|
@@ -132,6 +133,8 @@ protected:
|
|
|
132
133
|
virtual short_td doBtrvErr(HWND hWnd, _TCHAR* retbuf);
|
|
133
134
|
virtual ushort_td doCommitBulkInsert(bool autoCommit);
|
|
134
135
|
virtual void doAbortBulkInsert();
|
|
136
|
+
virtual __int64 getUpdateStampValue() const {return 0;}
|
|
137
|
+
virtual bool getUpdateStampEnable() const {return false;}
|
|
135
138
|
inline void open(const _TCHAR* uri, char_td mode = 0,
|
|
136
139
|
const _TCHAR* ownerName = NULL)
|
|
137
140
|
{
|
|
@@ -229,6 +232,8 @@ public:
|
|
|
229
232
|
void unlock();
|
|
230
233
|
char_td mode() const;
|
|
231
234
|
void setTimestampMode(int mode);
|
|
235
|
+
bool setUpdateConflictCheck(bool v);
|
|
236
|
+
bool updateConflictCheck() const;
|
|
232
237
|
static _TCHAR* getFileName(const _TCHAR* uri, _TCHAR* retbuf);
|
|
233
238
|
static short_td tdapErr(HWND hWnd, short_td status,
|
|
234
239
|
const _TCHAR* tableName = NULL,
|
|
@@ -180,6 +180,11 @@ recordset& recordset::reverse()
|
|
|
180
180
|
return *this;
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
+
void recordset::reserve(size_t size)
|
|
184
|
+
{
|
|
185
|
+
m_imple->reserve(size);
|
|
186
|
+
}
|
|
187
|
+
|
|
183
188
|
void recordset::appendField(const _TCHAR* name, int type, short len)
|
|
184
189
|
{
|
|
185
190
|
m_imple->appendField(name, type, len);
|
|
@@ -71,6 +71,7 @@ public:
|
|
|
71
71
|
const _TCHAR* name7 = NULL, const _TCHAR* name8 = NULL);
|
|
72
72
|
recordset& orderBy(const sortFields& orders);
|
|
73
73
|
recordset& reverse();
|
|
74
|
+
void reserve(size_t size);
|
|
74
75
|
void appendField(const _TCHAR* name, int type, short len);
|
|
75
76
|
recordset& operator+=(const recordset& r);
|
|
76
77
|
void release();
|
|
@@ -289,8 +289,7 @@ private:
|
|
|
289
289
|
}
|
|
290
290
|
else
|
|
291
291
|
{ // create new record
|
|
292
|
-
|
|
293
|
-
m_recordset.reserve(reserveSize);
|
|
292
|
+
m_recordset.reserve(m_recordset.size() + rows);
|
|
294
293
|
memoryRecord* rec = memoryRecord::create(*m_fds, (int)rows);
|
|
295
294
|
autoMemory* ama = autoMemory::create((int)rows);
|
|
296
295
|
for (int i = 0; i < (int)rows; ++i)
|
|
@@ -693,6 +692,11 @@ public:
|
|
|
693
692
|
m_fds->strBufs()->clear();
|
|
694
693
|
}
|
|
695
694
|
|
|
695
|
+
inline void reserve(size_t size)
|
|
696
|
+
{
|
|
697
|
+
m_recordset.reserve(size);
|
|
698
|
+
}
|
|
699
|
+
|
|
696
700
|
#ifdef _DEBUG
|
|
697
701
|
void dump()
|
|
698
702
|
{
|