transactd 2.4.0 → 2.4.2
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/BUILD_UNIX-JA.md +37 -29
- data/BUILD_WIN-JA.md +96 -69
- data/CMakeLists.txt +7 -17
- data/README-JA.md +22 -17
- data/README.md +23 -16
- data/{RELEASE_NOTE-JA → RELEASE_NOTE-JA.md} +163 -98
- data/{RELEASE_NOTE → RELEASE_NOTE.md} +165 -99
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- data/build/common/get_boost_libs.cmake +2 -0
- data/build/common/system.cmake +6 -4
- data/build/common/transactd_cl_output.cmake +14 -2
- data/build/common/transactd_common.cmake +34 -12
- data/build/tdclc/CMakeLists.txt +10 -2
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/CMakeLists.txt +34 -9
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclrb/CMakeLists.txt +24 -15
- data/build/tdclrb/gem/Makefile.win32-VS +2 -2
- data/build/tdclrb/gem_output.cmake +27 -10
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +18 -18
- data/source/bzs/db/engine/mysql/database.h +4 -4
- data/source/bzs/db/engine/mysql/dbManager.cpp +1 -2
- data/source/bzs/db/engine/mysql/mysqlInternal.h +23 -2
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +3 -2
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +26 -12
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +3 -3
- data/source/bzs/db/protocol/tdap/client/field.cpp +74 -23
- data/source/bzs/db/protocol/tdap/client/field.h +3 -1
- data/source/bzs/db/protocol/tdap/client/filter.h +4 -4
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +3 -1
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +16 -9
- data/source/bzs/db/protocol/tdap/client/memRecord.h +2 -2
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +3 -2
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +12 -0
- data/source/bzs/db/protocol/tdap/client/serializer.h +1 -0
- data/source/bzs/db/protocol/tdap/client/table.cpp +60 -109
- data/source/bzs/db/protocol/tdap/client/table.h +2 -1
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +13 -0
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +1 -1
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +8 -8
- data/source/bzs/db/protocol/tdap/fieldComp.h +6 -0
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +147 -46
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +78 -0
- data/source/bzs/db/protocol/tdap/tdapSchema.h +6 -1
- data/source/bzs/db/protocol/tdap/tdapcapi.h +3 -3
- data/source/bzs/db/transactd/transactd.cpp +1 -1
- data/source/bzs/env/compiler.h +12 -0
- data/source/bzs/env/tcharMinGW.h +1 -0
- data/source/bzs/netsvc/client/tcpClient.h +4 -2
- data/source/bzs/netsvc/server/serverCpt.cpp +1 -0
- data/source/bzs/netsvc/server/serverTpool.cpp +3 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +2 -2
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +6 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +2 -2
- data/source/global/ormsrcgen/srcgen.cpp +1 -2
- data/source/linux/tchar.h +1 -0
- metadata +4 -4
@@ -1659,7 +1659,7 @@ double field::getFVnumeric() const
|
|
1659
1659
|
char dp[] = "{ABCDEFGHI}JKLMNOPQR";
|
1660
1660
|
char dpsa[] = "PQRSTUVWXYpqrstuvwxy";
|
1661
1661
|
char* pdp = NULL;
|
1662
|
-
|
1662
|
+
int i;
|
1663
1663
|
char buf[20] = { 0x00 };
|
1664
1664
|
char dummy[20];
|
1665
1665
|
|
@@ -1836,6 +1836,20 @@ inline int compNumber(const field& l, const field& r, char logType)
|
|
1836
1836
|
return compare<T>((const char*)l.ptr(), (const char*)r.ptr());
|
1837
1837
|
}
|
1838
1838
|
|
1839
|
+
template <class T>
|
1840
|
+
inline int compBitAnd(const field& l, const field& r, char logType)
|
1841
|
+
{
|
1842
|
+
return bitMask<T>((const char*)l.ptr(), (const char*)r.ptr());
|
1843
|
+
}
|
1844
|
+
|
1845
|
+
inline int compBitAnd24(const field& l, const field& r, char logType)
|
1846
|
+
{
|
1847
|
+
|
1848
|
+
int lv = ((*((int*)(const char*)l.ptr()) & 0xFFFFFF) << 8) / 0x100;
|
1849
|
+
int rv = ((*((int*)(const char*)r.ptr()) & 0xFFFFFF) << 8) / 0x100;
|
1850
|
+
return bitMask<int>((const char*)&lv, (const char*)&rv);
|
1851
|
+
}
|
1852
|
+
|
1839
1853
|
inline int compNumber24(const field& l, const field& r, char logType)
|
1840
1854
|
{
|
1841
1855
|
return compareInt24((const char*)l.ptr(), (const char*)r.ptr());
|
@@ -1899,18 +1913,37 @@ compFieldFunc field::getCompFunc(char logType) const
|
|
1899
1913
|
case ft_autoinc:
|
1900
1914
|
case ft_currency:
|
1901
1915
|
{
|
1902
|
-
|
1916
|
+
if (logType & eBitAnd)
|
1903
1917
|
{
|
1904
|
-
|
1905
|
-
|
1906
|
-
|
1907
|
-
|
1908
|
-
|
1909
|
-
|
1910
|
-
|
1911
|
-
|
1912
|
-
|
1913
|
-
|
1918
|
+
|
1919
|
+
switch (m_fd->len)
|
1920
|
+
{
|
1921
|
+
case 1:
|
1922
|
+
return &compBitAnd<char>;
|
1923
|
+
case 2:
|
1924
|
+
return &compBitAnd<short>;
|
1925
|
+
case 3:
|
1926
|
+
return &compBitAnd24;
|
1927
|
+
case 4:
|
1928
|
+
return &compBitAnd<int>;
|
1929
|
+
case 8:
|
1930
|
+
return &compBitAnd<__int64>;
|
1931
|
+
}
|
1932
|
+
}else
|
1933
|
+
{
|
1934
|
+
switch (m_fd->len)
|
1935
|
+
{
|
1936
|
+
case 1:
|
1937
|
+
return &compNumber<char>;
|
1938
|
+
case 2:
|
1939
|
+
return &compNumber<short>;
|
1940
|
+
case 3:
|
1941
|
+
return &compNumber24;
|
1942
|
+
case 4:
|
1943
|
+
return &compNumber<int>;
|
1944
|
+
case 8:
|
1945
|
+
return &compNumber<__int64>;
|
1946
|
+
}
|
1914
1947
|
}
|
1915
1948
|
}
|
1916
1949
|
case ft_mychar:
|
@@ -1931,18 +1964,36 @@ compFieldFunc field::getCompFunc(char logType) const
|
|
1931
1964
|
case ft_timestamp:
|
1932
1965
|
case ft_mydate:
|
1933
1966
|
{
|
1934
|
-
|
1967
|
+
if (logType & eBitAnd)
|
1935
1968
|
{
|
1936
|
-
|
1937
|
-
|
1938
|
-
|
1939
|
-
|
1940
|
-
|
1941
|
-
|
1942
|
-
|
1943
|
-
|
1944
|
-
|
1945
|
-
|
1969
|
+
switch (m_fd->len)
|
1970
|
+
{
|
1971
|
+
case 1:
|
1972
|
+
return &compBitAnd<unsigned char>;
|
1973
|
+
case 2:
|
1974
|
+
return &compBitAnd<unsigned short>;
|
1975
|
+
case 3:
|
1976
|
+
return &compBitAnd24;
|
1977
|
+
case 4:
|
1978
|
+
return &compBitAnd<unsigned int>;
|
1979
|
+
case 8:
|
1980
|
+
return &compBitAnd<unsigned __int64>;
|
1981
|
+
}
|
1982
|
+
}else
|
1983
|
+
{
|
1984
|
+
switch (m_fd->len)
|
1985
|
+
{
|
1986
|
+
case 1:
|
1987
|
+
return &compNumber<unsigned char>;
|
1988
|
+
case 2:
|
1989
|
+
return &compNumber<unsigned short>;
|
1990
|
+
case 3:
|
1991
|
+
return &compNumberU24;
|
1992
|
+
case 4:
|
1993
|
+
return &compNumber<unsigned int>;
|
1994
|
+
case 8:
|
1995
|
+
return &compNumber<unsigned __int64>;
|
1996
|
+
}
|
1946
1997
|
}
|
1947
1998
|
}
|
1948
1999
|
case ft_mytime:
|
@@ -85,8 +85,9 @@ class DLLLIB fielddefs : public fieldShare
|
|
85
85
|
friend class recordsetQuery;
|
86
86
|
friend struct recordsetQueryImple;
|
87
87
|
friend class fieldsBase;
|
88
|
-
|
88
|
+
public:
|
89
89
|
void addAllFileds(tabledef* def);
|
90
|
+
protected:
|
90
91
|
void copyFrom(const class table* tb);
|
91
92
|
bool canUnion(const fielddefs& r) const;
|
92
93
|
size_t totalFieldLen() const;
|
@@ -95,6 +96,7 @@ class DLLLIB fielddefs : public fieldShare
|
|
95
96
|
void push_back(const fielddef* p, bool rePosition = false);
|
96
97
|
void remove(int index);
|
97
98
|
void reserve(size_t size);
|
99
|
+
public:
|
98
100
|
void clear();
|
99
101
|
|
100
102
|
public:
|
@@ -806,7 +806,7 @@ class filter
|
|
806
806
|
{
|
807
807
|
int keySize = q->getJoinKeySize();
|
808
808
|
uchar_td* dataBuf;
|
809
|
-
keydef* kd = &m_tb->tableDef()->keyDefs[m_tb->keyNum()];
|
809
|
+
keydef* kd = &m_tb->tableDef()->keyDefs[(int)m_tb->keyNum()];
|
810
810
|
|
811
811
|
if (!prebuiltSeeks(kd, keyValues.size(), q, keySize, &dataBuf))
|
812
812
|
return false;
|
@@ -1098,7 +1098,7 @@ public:
|
|
1098
1098
|
bool supplySeekValues(const T& values, size_t size, int keySize)
|
1099
1099
|
{
|
1100
1100
|
uchar_td* dataBuf;
|
1101
|
-
keydef* kd = &m_tb->tableDef()->keyDefs[m_tb->keyNum()];
|
1101
|
+
keydef* kd = &m_tb->tableDef()->keyDefs[(int)m_tb->keyNum()];
|
1102
1102
|
|
1103
1103
|
if (!prebuiltSeeks(kd, size, NULL, keySize, &dataBuf))
|
1104
1104
|
return false;
|
@@ -1113,7 +1113,7 @@ public:
|
|
1113
1113
|
|
1114
1114
|
bool beginSupplySeekValues(size_t size, int keySize)
|
1115
1115
|
{
|
1116
|
-
keydef* kd = &m_tb->tableDef()->keyDefs[m_tb->keyNum()];
|
1116
|
+
keydef* kd = &m_tb->tableDef()->keyDefs[(int)m_tb->keyNum()];
|
1117
1117
|
|
1118
1118
|
if (!prebuiltSeeks(kd, size, NULL, keySize, &m_buftmp))
|
1119
1119
|
return false;
|
@@ -1126,7 +1126,7 @@ public:
|
|
1126
1126
|
bool supplySeekValue(const uchar_td* ptr[] , int len[], int keySize, int& index)
|
1127
1127
|
{
|
1128
1128
|
const tabledef* td = m_tb->tableDef();
|
1129
|
-
keydef* kd = &td->keyDefs[m_tb->keyNum()];
|
1129
|
+
keydef* kd = &td->keyDefs[(int)m_tb->keyNum()];
|
1130
1130
|
fielddef* fds = td->fieldDefs;
|
1131
1131
|
|
1132
1132
|
seek& l = m_seeks[index];
|
@@ -268,10 +268,11 @@ void recordsetQuery::init(const fielddefs* fdinfo)
|
|
268
268
|
|
269
269
|
bool recordsetQuery::isMatch(int ret, unsigned char compType) const
|
270
270
|
{
|
271
|
-
compType &= 0xf; // lower
|
271
|
+
compType &= 0xf; // lower than 15
|
272
272
|
switch ((eCompType)compType)
|
273
273
|
{
|
274
274
|
case eEqual:
|
275
|
+
case eBitAnd:
|
275
276
|
return (ret == 0);
|
276
277
|
case eGreaterEq:
|
277
278
|
return (ret >= 0);
|
@@ -282,6 +283,7 @@ bool recordsetQuery::isMatch(int ret, unsigned char compType) const
|
|
282
283
|
case eLess:
|
283
284
|
return (ret < 0);
|
284
285
|
case eNotEq:
|
286
|
+
case eNotBitAnd:
|
285
287
|
return (ret != 0);
|
286
288
|
}
|
287
289
|
return false;
|
@@ -336,22 +336,29 @@ void writableRecord::insert()
|
|
336
336
|
copyFromBuffer(m_tb);
|
337
337
|
}
|
338
338
|
|
339
|
-
void writableRecord::del(bool KeysetAlrady)
|
339
|
+
void writableRecord::del(bool KeysetAlrady, bool noSeek)
|
340
340
|
{
|
341
341
|
if (!KeysetAlrady)
|
342
342
|
copyToBuffer(m_tb);
|
343
|
-
|
344
|
-
|
345
|
-
|
343
|
+
if (noSeek == false)
|
344
|
+
{
|
345
|
+
m_tb->seek();
|
346
|
+
if (m_tb->stat())
|
347
|
+
nstable::throwError(_T("activeTable delete "), m_tb->stat());
|
348
|
+
}
|
346
349
|
deleteRecord(m_tb);
|
347
350
|
}
|
348
351
|
|
349
|
-
void writableRecord::update()
|
352
|
+
void writableRecord::update(bool KeysetAlrady, bool noSeek)
|
350
353
|
{
|
351
|
-
|
352
|
-
|
353
|
-
if (
|
354
|
-
|
354
|
+
if (!KeysetAlrady)
|
355
|
+
copyToBuffer(m_tb);
|
356
|
+
if (noSeek == false)
|
357
|
+
{
|
358
|
+
m_tb->seek();
|
359
|
+
if (m_tb->stat())
|
360
|
+
nstable::throwError(_T("activeTable update "), m_tb->stat());
|
361
|
+
}
|
355
362
|
copyToBuffer(m_tb, true /*only changed*/);
|
356
363
|
updateRecord(m_tb);
|
357
364
|
}
|
@@ -173,8 +173,8 @@ public:
|
|
173
173
|
bool read(bool KeysetAlrady = false);
|
174
174
|
bool read(bookmark_td& bm);
|
175
175
|
void insert();
|
176
|
-
void del(bool KeysetAlrady = false);
|
177
|
-
void update();
|
176
|
+
void del(bool KeysetAlrady = false, bool noSeek = false);
|
177
|
+
void update(bool KeysetAlrady = false, bool noSeek = false);
|
178
178
|
void save();
|
179
179
|
|
180
180
|
};
|
@@ -786,7 +786,7 @@ bool nsdatabase::connect(const _TCHAR* URI, bool newConnection)
|
|
786
786
|
|
787
787
|
char uri_a[MAX_PATH] = { 0x00 };
|
788
788
|
const char* p = toServerUri(uri_a, MAX_PATH, URI, isUseTransactd());
|
789
|
-
char_td keyNum = newConnection ? 3 : 0;
|
789
|
+
char_td keyNum = (isUseTransactd() == false) ? 0 : newConnection ? 3 : 0;
|
790
790
|
m_stat = m_btrcallid(TD_CONNECT, NULL, NULL, &datalen, (void*)p,
|
791
791
|
(keylen_td)(strlen(p) + 1), keyNum, clientID());
|
792
792
|
if (m_stat)
|
@@ -152,7 +152,7 @@ private:
|
|
152
152
|
m_fds->copyFrom(tb);
|
153
153
|
if (tb && (addtype == mra_nojoin))
|
154
154
|
{
|
155
|
-
const keydef& kd = tb->tableDef()->keyDefs[tb->keyNum()];
|
155
|
+
const keydef& kd = tb->tableDef()->keyDefs[(int)tb->keyNum()];
|
156
156
|
m_uniqueReadMaxField = (kd.segments[0].flags.bit0 == false)
|
157
157
|
? (short)m_fds->size()
|
158
158
|
: 0;
|
@@ -580,7 +580,8 @@ public:
|
|
580
580
|
m_fds->push_back(&fd);
|
581
581
|
for (int i = 0; i < (int)m_unionFds.size(); ++i)
|
582
582
|
m_unionFds[i]->push_back(&fd);
|
583
|
-
|
583
|
+
if (size())
|
584
|
+
registerMemoryBlock(NULL, fd.len * size(), fd.len, mra_outerjoin);
|
584
585
|
}
|
585
586
|
|
586
587
|
inline recordsetImple& operator+=(const recordsetImple& r)
|
@@ -647,6 +647,13 @@ struct queryStatementsImple
|
|
647
647
|
}
|
648
648
|
}
|
649
649
|
|
650
|
+
void move(int from, int to)
|
651
|
+
{
|
652
|
+
executable* p = statements[from];
|
653
|
+
statements.erase(statements.begin() + from);
|
654
|
+
statements.insert(statements.begin() + to, p);
|
655
|
+
}
|
656
|
+
|
650
657
|
private:
|
651
658
|
friend class boost::serialization::access;
|
652
659
|
template <class Archive>
|
@@ -1105,6 +1112,11 @@ void queryStatements::clear()
|
|
1105
1112
|
m_impl->reset();
|
1106
1113
|
}
|
1107
1114
|
|
1115
|
+
void queryStatements::move(int from, int to)
|
1116
|
+
{
|
1117
|
+
m_impl->move(from, to);
|
1118
|
+
}
|
1119
|
+
|
1108
1120
|
int queryStatements::statementType(int index)
|
1109
1121
|
{
|
1110
1122
|
if (dynamic_cast<readHasMany*>(m_impl->statements[index]))
|
@@ -233,38 +233,58 @@ public:
|
|
233
233
|
}
|
234
234
|
}
|
235
235
|
|
236
|
+
inline char* moveCurrentData(char* ptr, unsigned short& len, int& sqnum)
|
237
|
+
{
|
238
|
+
len = *((unsigned short*)ptr);
|
239
|
+
ptr += DATASIZE_BYTE;
|
240
|
+
sqnum = *((int*)(ptr));
|
241
|
+
ptr += sizeof(int);
|
242
|
+
ptr += len;
|
243
|
+
return ptr;
|
244
|
+
}
|
245
|
+
|
236
246
|
inline void hasManyJoinMra(int rowCount, uchar_td* data)
|
237
247
|
{
|
238
248
|
int rowOffset = 0;
|
239
|
-
int row = 0;
|
249
|
+
int row = 0;
|
240
250
|
int count = 0;
|
241
|
-
|
251
|
+
int sqnum = 0;
|
242
252
|
unsigned short len = 0;
|
243
|
-
|
253
|
+
|
254
|
+
char* ptr = (char*)data + DATASIZE_BYTE; // rowCount
|
255
|
+
ptr = moveCurrentData(ptr, len, sqnum); // getFirst
|
256
|
+
for (int i = 1; i < (int)rowCount; ++i)
|
244
257
|
{
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
258
|
+
if (sqnum == row)
|
259
|
+
{
|
260
|
+
++count;
|
261
|
+
|
262
|
+
//if row == 0
|
263
|
+
if (len == 0)
|
264
|
+
{
|
265
|
+
++row;
|
266
|
+
count = 0;
|
267
|
+
}
|
268
|
+
|
269
|
+
}else if(sqnum != row)
|
254
270
|
{
|
255
|
-
if (count)
|
271
|
+
if (--count > 0)
|
256
272
|
{
|
257
273
|
m_tb->m_impl->mraPtr->duplicateRow(row + rowOffset, count);
|
258
274
|
rowOffset += count;
|
259
275
|
}
|
260
276
|
++row;
|
261
|
-
count = 0;
|
277
|
+
count = (len == 0) ? 0 : 1;
|
278
|
+
|
262
279
|
}
|
263
|
-
|
264
|
-
++count;
|
280
|
+
ptr = moveCurrentData(ptr, len, sqnum);
|
265
281
|
}
|
266
|
-
if (
|
282
|
+
if (sqnum == row)
|
283
|
+
count = (len == 0) ? 0 : count + 1;
|
284
|
+
|
285
|
+
if (--count > 0)
|
267
286
|
m_tb->m_impl->mraPtr->duplicateRow(row + rowOffset, count);
|
287
|
+
|
268
288
|
}
|
269
289
|
|
270
290
|
inline void reset(filter* p, uchar_td* data, unsigned int totalSize,
|
@@ -291,7 +311,6 @@ public:
|
|
291
311
|
const tabledef* td = m_tb->tableDef();
|
292
312
|
ushort_td fieldCount = m_filter->fieldCount();
|
293
313
|
m_tmpPtr = mra->ptr(m_row, mra_current_block);
|
294
|
-
int resultOffset = 0;
|
295
314
|
|
296
315
|
while (m_row < m_rowCount)
|
297
316
|
{
|
@@ -302,7 +321,7 @@ public:
|
|
302
321
|
if (m_filter->fieldSelected())
|
303
322
|
{
|
304
323
|
uchar_td* fieldPtr = m_ptr;
|
305
|
-
resultOffset = 0;
|
324
|
+
int resultOffset = 0;
|
306
325
|
int blobFieldNum = 0;
|
307
326
|
for (int i = 0; i < fieldCount; i++)
|
308
327
|
{
|
@@ -324,21 +343,17 @@ public:
|
|
324
343
|
{
|
325
344
|
memset(m_tmpPtr, 0, td->maxRecordLen);
|
326
345
|
memcpy(m_tmpPtr, m_ptr, m_len);
|
327
|
-
m_unpackLen =
|
328
|
-
resultOffset = m_unpackLen;
|
346
|
+
m_unpackLen = td->unPack((char*)m_tmpPtr, m_len);
|
329
347
|
}
|
330
348
|
else
|
331
|
-
{
|
332
349
|
memcpy(m_tmpPtr, m_ptr, m_len);
|
333
|
-
resultOffset = m_len;
|
334
|
-
}
|
335
350
|
if (bd)
|
336
351
|
bd = m_tb->setBlobFieldPointer((char*)m_tmpPtr, m_hd, bd);
|
337
352
|
}
|
338
353
|
}
|
339
354
|
++m_row;
|
340
355
|
moveNextRow(bookmarkSize);
|
341
|
-
m_tmpPtr +=
|
356
|
+
m_tmpPtr += recordLen;
|
342
357
|
}
|
343
358
|
}
|
344
359
|
//prebuilt next ead operation
|
@@ -407,7 +422,7 @@ public:
|
|
407
422
|
{
|
408
423
|
memset(m_tmpPtr, 0, td->maxRecordLen);
|
409
424
|
memcpy(m_tmpPtr, m_ptr, m_len);
|
410
|
-
m_unpackLen =
|
425
|
+
m_unpackLen = td->unPack((char*)m_tmpPtr, m_len);
|
411
426
|
}
|
412
427
|
else
|
413
428
|
m_tmpPtr = m_ptr;
|
@@ -1218,7 +1233,7 @@ void table::getKeySpec(keySpec* ks, bool SpecifyKeyNum)
|
|
1218
1233
|
short FieldNum;
|
1219
1234
|
int j;
|
1220
1235
|
tabledef* td = (*m_tableDef);
|
1221
|
-
KeyDef = &td->keyDefs[m_keynum];
|
1236
|
+
KeyDef = &td->keyDefs[(int)m_keynum];
|
1222
1237
|
for (j = 0; j < KeyDef->segmentCount; j++)
|
1223
1238
|
{
|
1224
1239
|
FieldNum = KeyDef->segments[j].fieldNum;
|
@@ -1261,7 +1276,7 @@ void table::doCreateIndex(bool SpecifyKeyNum)
|
|
1261
1276
|
}
|
1262
1277
|
else
|
1263
1278
|
{
|
1264
|
-
int segmentCount = (*m_tableDef)->keyDefs[m_keynum].segmentCount;
|
1279
|
+
int segmentCount = (*m_tableDef)->keyDefs[(int)m_keynum].segmentCount;
|
1265
1280
|
keySpec* ks = (keySpec*)malloc(sizeof(keySpec) * segmentCount);
|
1266
1281
|
memset(ks, 0, sizeof(keySpec) * segmentCount);
|
1267
1282
|
getKeySpec(ks, SpecifyKeyNum);
|
@@ -1290,7 +1305,7 @@ bool table::isUniqeKey(char_td keynum)
|
|
1290
1305
|
{
|
1291
1306
|
if ((keynum >= 0) && (keynum < (*m_tableDef)->keyCount))
|
1292
1307
|
{
|
1293
|
-
keydef* kd = &(*m_tableDef)->keyDefs[m_keynum];
|
1308
|
+
keydef* kd = &(*m_tableDef)->keyDefs[(int)m_keynum];
|
1294
1309
|
return !(kd->segments[0].flags.bit0);
|
1295
1310
|
}
|
1296
1311
|
return false;
|
@@ -1388,7 +1403,7 @@ void* table::attachBuffer(void* NewPtr, bool unpack, size_t size)
|
|
1388
1403
|
m_pdata = NewPtr;
|
1389
1404
|
ushort_td len = (*m_tableDef)->maxRecordLen;
|
1390
1405
|
if (unpack)
|
1391
|
-
len = unPack((char*)m_pdata, size);
|
1406
|
+
len = (*m_tableDef)->unPack((char*)m_pdata, size);
|
1392
1407
|
m_datalen = len;
|
1393
1408
|
return oldptr;
|
1394
1409
|
}
|
@@ -1436,7 +1451,7 @@ keylen_td table::writeKeyDataTo(uchar_td* to, int keySize)
|
|
1436
1451
|
if ((*m_tableDef)->keyCount)
|
1437
1452
|
{
|
1438
1453
|
keydef& keydef =
|
1439
|
-
(*m_tableDef)->keyDefs[(
|
1454
|
+
(*m_tableDef)->keyDefs[(int)m_impl->keyNumIndex[(int)m_keynum]];
|
1440
1455
|
uchar_td* start = to;
|
1441
1456
|
if (keySize == 0)
|
1442
1457
|
keySize = keydef.segmentCount;
|
@@ -1458,40 +1473,19 @@ keylen_td table::writeKeyData()
|
|
1458
1473
|
return writeKeyDataTo((uchar_td*)m_impl->keybuf, 0);
|
1459
1474
|
}
|
1460
1475
|
|
1461
|
-
|
1476
|
+
|
1477
|
+
uint_td table::unPack(char* ptr, size_t size)
|
1462
1478
|
{
|
1463
|
-
|
1464
|
-
|
1465
|
-
int movelen;
|
1466
|
-
for (int i = 0; i < (*m_tableDef)->fieldCount; i++)
|
1467
|
-
{
|
1468
|
-
fielddef& fd = (*m_tableDef)->fieldDefs[i];
|
1469
|
-
if (fd.type == ft_myfixedbinary)
|
1470
|
-
{
|
1471
|
-
memmove(pos + 2, pos, fd.len - 2); // move as size pace in the field
|
1472
|
-
*((unsigned short*)(pos)) = fd.len - 2; // fixed size
|
1473
|
-
pos += fd.len;
|
1474
|
-
}
|
1475
|
-
else
|
1476
|
-
{
|
1477
|
-
int blen = fd.varLenBytes();
|
1478
|
-
int dl = fd.len; // length
|
1479
|
-
if (blen == 1)
|
1480
|
-
dl = *((unsigned char*)(pos)) + blen;
|
1481
|
-
else if (blen == 2)
|
1482
|
-
dl = *((unsigned short*)(pos)) + blen;
|
1483
|
-
pos += dl;
|
1484
|
-
if ((movelen = fd.len - dl) != 0)
|
1485
|
-
{
|
1486
|
-
end -= movelen;
|
1487
|
-
memmove(pos, pos + movelen, end - pos);
|
1488
|
-
}
|
1489
|
-
}
|
1490
|
-
}
|
1491
|
-
m_impl->dataPacked = true;
|
1492
|
-
return (uint_td)(pos - ptr);
|
1479
|
+
m_impl->dataPacked = false;
|
1480
|
+
return tableDef()->unPack(ptr, size);
|
1493
1481
|
}
|
1494
1482
|
|
1483
|
+
uint_td table::pack(char* ptr, size_t size)
|
1484
|
+
{
|
1485
|
+
m_impl->dataPacked = true;
|
1486
|
+
return tableDef()->pack(ptr, size);
|
1487
|
+
}
|
1488
|
+
|
1495
1489
|
uint_td table::doGetWriteImageLen()
|
1496
1490
|
{
|
1497
1491
|
tabledef* td = (*m_tableDef);
|
@@ -1550,49 +1544,6 @@ uint_td table::doGetWriteImageLen()
|
|
1550
1544
|
}
|
1551
1545
|
}
|
1552
1546
|
|
1553
|
-
uint_td table::unPack(char* ptr, size_t size)
|
1554
|
-
{
|
1555
|
-
char* pos = ptr;
|
1556
|
-
const char* end = pos + size;
|
1557
|
-
tabledef* td = *m_tableDef;
|
1558
|
-
const char* max = pos + td->maxRecordLen;
|
1559
|
-
int movelen;
|
1560
|
-
for (int i = 0; i < td->fieldCount; i++)
|
1561
|
-
{
|
1562
|
-
fielddef& fd = td->fieldDefs[i];
|
1563
|
-
if (fd.type == ft_myfixedbinary)
|
1564
|
-
{
|
1565
|
-
int dl = *((unsigned short*)(pos));
|
1566
|
-
memmove(pos, pos + 2, dl);
|
1567
|
-
pos += fd.len - 2;
|
1568
|
-
*((unsigned short*)(pos)) = 0x00;
|
1569
|
-
;
|
1570
|
-
pos += 2;
|
1571
|
-
}
|
1572
|
-
else
|
1573
|
-
{
|
1574
|
-
int blen = fd.varLenBytes();
|
1575
|
-
int dl = fd.len; // length
|
1576
|
-
if (blen == 1)
|
1577
|
-
dl = *((unsigned char*)(pos)) + blen;
|
1578
|
-
else if (blen == 2)
|
1579
|
-
dl = *((unsigned short*)(pos)) + blen;
|
1580
|
-
if ((movelen = fd.len - dl) != 0)
|
1581
|
-
{
|
1582
|
-
if (max < end + movelen)
|
1583
|
-
return 0;
|
1584
|
-
char* src = pos + dl;
|
1585
|
-
memmove(pos + fd.len, src, end - src);
|
1586
|
-
memset(src, 0, movelen);
|
1587
|
-
end += movelen;
|
1588
|
-
}
|
1589
|
-
pos += fd.len;
|
1590
|
-
}
|
1591
|
-
}
|
1592
|
-
m_impl->dataPacked = false;
|
1593
|
-
return (uint_td)(pos - ptr);
|
1594
|
-
}
|
1595
|
-
|
1596
1547
|
void table::addBlobEndRow()
|
1597
1548
|
{
|
1598
1549
|
char_td knum = m_keynum;
|
@@ -2015,7 +1966,7 @@ short_td table::doBtrvErr(HWND hWnd, _TCHAR* retbuf)
|
|
2015
1966
|
bool table::setSeekValueField(int row)
|
2016
1967
|
{
|
2017
1968
|
const std::vector<client::seek>& keyValues = m_impl->filterPtr->seeks();
|
2018
|
-
keydef* kd = &tableDef()->keyDefs[keyNum()];
|
1969
|
+
keydef* kd = &tableDef()->keyDefs[(int)keyNum()];
|
2019
1970
|
if (keyValues.size() % kd->segmentCount)
|
2020
1971
|
return false;
|
2021
1972
|
// Check uniqe key
|
@@ -2055,9 +2006,9 @@ void table::keyValueDescription(_TCHAR* buf, int bufsize)
|
|
2055
2006
|
if (stat() == STATUS_NOT_FOUND_TI)
|
2056
2007
|
{
|
2057
2008
|
|
2058
|
-
for (int i = 0; i < tableDef()->keyDefs[keyNum()].segmentCount; i++)
|
2009
|
+
for (int i = 0; i < tableDef()->keyDefs[(int)keyNum()].segmentCount; i++)
|
2059
2010
|
{
|
2060
|
-
short fnum = tableDef()->keyDefs[keyNum()].segments[i].fieldNum;
|
2011
|
+
short fnum = tableDef()->keyDefs[(int)keyNum()].segments[i].fieldNum;
|
2061
2012
|
s += std::_tstring(tableDef()->fieldDefs[fnum].name()) + _T(" = ") +
|
2062
2013
|
getFVstr(fnum) + _T("\n");
|
2063
2014
|
}
|
@@ -2475,7 +2426,7 @@ const _TCHAR* queryBase::toString() const
|
|
2475
2426
|
for (size_t i = 0; i < wheres.size(); i += 4)
|
2476
2427
|
{
|
2477
2428
|
if (i + 1 < wheres.size())
|
2478
|
-
s += wheres[i] + _T(" ") + wheres[i + 1];
|
2429
|
+
s += wheres[i] + _T(" ") + escape_value(wheres[i + 1]);
|
2479
2430
|
if (i + 2 < wheres.size())
|
2480
2431
|
s += _T(" '") + escape_value(wheres[i + 2]) + _T("' ");
|
2481
2432
|
if (i + 3 < wheres.size())
|
@@ -132,7 +132,8 @@ protected:
|
|
132
132
|
void* reallocDataBuffer(uint_td v);
|
133
133
|
int dataBufferLen() const;
|
134
134
|
uint_td unPack(char* ptr, size_t size);
|
135
|
-
uint_td pack(char* ptr, size_t size);
|
135
|
+
uint_td pack(char* ptr, size_t size);
|
136
|
+
|
136
137
|
keylen_td writeKeyData(); // orverride
|
137
138
|
keylen_td writeKeyDataTo(uchar_td* to, int keySize);
|
138
139
|
|
@@ -101,6 +101,19 @@ public:
|
|
101
101
|
: m_type(TYPE_SCHEMA_BDF), m_mode(TD_OPEN_READONLY)
|
102
102
|
{
|
103
103
|
_tcscpy_s(m_buf, MAX_PATH, uri);
|
104
|
+
size_t len = _tcslen(uri);
|
105
|
+
if (len > 5)
|
106
|
+
{
|
107
|
+
_TCHAR tmp[10];
|
108
|
+
_tcscpy_s(tmp, 10, uri + len - 4);
|
109
|
+
#ifdef _tcsupr_s
|
110
|
+
_tcsupr_s(tmp, 10);
|
111
|
+
#else
|
112
|
+
_tcsupr(tmp);
|
113
|
+
#endif
|
114
|
+
if (_tcscmp(tmp, _T(".DDF"))==0)
|
115
|
+
m_type = TYPE_SCHEMA_DDF;
|
116
|
+
}
|
104
117
|
}
|
105
118
|
inline void setMode(char_td v) { m_mode = v; }
|
106
119
|
|
@@ -172,7 +172,7 @@ public:
|
|
172
172
|
if (keynum < td.keyCount)
|
173
173
|
{
|
174
174
|
tb->clearBuffer();
|
175
|
-
const keydef kd = td.keyDefs[keynum];
|
175
|
+
const keydef kd = td.keyDefs[(int)keynum];
|
176
176
|
if (kd.segmentCount > 0)
|
177
177
|
tb->setFV(kd.segments[0].fieldNum, kv0);
|
178
178
|
if (kd.segmentCount > 1)
|