transactd 2.4.5 → 3.0.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/CMakeLists.txt +1 -1
- data/README-JA.md +52 -529
- data/README.md +52 -523
- data/bin/common/tdclc_32_3_0.dll +0 -0
- data/bin/common/tdclc_64_3_0.dll +0 -0
- data/build/common/system.cmake +2 -1
- data/build/common/transactd_cl_common.cmake +3 -6
- data/build/swig/ruby/ruby.swg +85 -28
- data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
- data/build/swig/tdcl.i +161 -5
- data/build/tdclc/CMakeLists.txt +1 -0
- data/build/tdclc/tdclc.cbproj +7 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/blobStructs.h +1 -1
- data/source/bzs/db/engine/mysql/database.cpp +199 -74
- data/source/bzs/db/engine/mysql/database.h +47 -18
- data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
- data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
- data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
- data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
- data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
- data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
- data/source/bzs/db/protocol/tdap/client/client.h +82 -15
- data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
- data/source/bzs/db/protocol/tdap/client/database.h +19 -6
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
- data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
- data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
- data/source/bzs/db/protocol/tdap/client/field.h +110 -121
- data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
- data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
- data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
- data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
- data/source/bzs/db/protocol/tdap/client/request.h +2 -1
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
- data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
- data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
- data/source/bzs/db/protocol/tdap/client/table.h +112 -37
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
- data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
- data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
- data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
- data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
- data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
- data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
- data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
- data/source/bzs/db/protocol/tdap/uri.h +40 -32
- data/source/bzs/db/transactd/connManager.cpp +1 -1
- data/source/bzs/db/transactd/transactd.cpp +7 -0
- data/source/bzs/env/compiler.h +107 -94
- data/source/bzs/env/crosscompile.cpp +24 -12
- data/source/bzs/env/crosscompile.h +75 -6
- data/source/bzs/env/mbcswchrLinux.cpp +2 -2
- data/source/bzs/env/tcharMinGW.h +4 -0
- data/source/bzs/example/changeSchema.cpp +22 -17
- data/source/bzs/example/queryData.cpp +4 -0
- data/source/bzs/netsvc/client/iconnection.h +3 -1
- data/source/bzs/netsvc/client/tcpClient.h +10 -3
- data/source/bzs/rtl/stringBuffers.cpp +7 -0
- data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
- data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
- data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
- data/source/bzs/test/tdclatl/test_v3.js +1017 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
- data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
- data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
- data/source/bzs/test/trdclengn/testField.h +3305 -0
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
- data/source/bzs/test/trdclengn/testbase.h +137 -0
- data/source/global/ormsrcgen/srcgen.cpp +23 -12
- data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
- data/source/global/querystmts/querystmts.cpp +2 -3
- data/source/global/tdclatl/Bitset.cpp +38 -0
- data/source/global/tdclatl/Bitset.h +63 -0
- data/source/global/tdclatl/Database.cpp +59 -18
- data/source/global/tdclatl/Database.h +7 -4
- data/source/global/tdclatl/DbDef.cpp +6 -6
- data/source/global/tdclatl/DbDef.h +2 -1
- data/source/global/tdclatl/Field.cpp +112 -0
- data/source/global/tdclatl/Field.h +19 -5
- data/source/global/tdclatl/FieldDef.cpp +137 -16
- data/source/global/tdclatl/FieldDef.h +18 -2
- data/source/global/tdclatl/FieldDefs.cpp +54 -1
- data/source/global/tdclatl/FieldDefs.h +3 -0
- data/source/global/tdclatl/GroupQuery.cpp +8 -8
- data/source/global/tdclatl/QueryBase.cpp +65 -0
- data/source/global/tdclatl/QueryBase.h +10 -0
- data/source/global/tdclatl/Record.cpp +33 -2
- data/source/global/tdclatl/Record.h +3 -1
- data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
- data/source/global/tdclatl/RecordsetQuery.h +8 -0
- data/source/global/tdclatl/Table.cpp +127 -3
- data/source/global/tdclatl/Table.h +10 -1
- data/source/global/tdclatl/TableDef.cpp +41 -8
- data/source/global/tdclatl/TableDef.h +7 -2
- data/source/global/tdclatl/activeTable.cpp +40 -71
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +222 -28
- data/source/linux/tchar.h +100 -96
- data/transactd.gemspec +2 -2
- metadata +13 -11
- data/BUILD_UNIX-JA.md +0 -161
- data/BUILD_WIN-JA.md +0 -326
- data/README_ORMSRCGEN-JA.md +0 -115
- data/README_ORMSRCGEN.md +0 -118
- data/RELEASE_NOTE-JA.md +0 -356
- data/RELEASE_NOTE.md +0 -360
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- data/source/bzs/test/trdclengn/test_blob.cpp +0 -375
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
|
|
23
23
|
#include <bzs/db/protocol/tdap/tdapSchema.h>
|
|
24
24
|
#include <bzs/db/protocol/tdap/mysql/characterset.h>
|
|
25
|
-
#include <stdio.h>
|
|
26
25
|
#ifdef _WIN32
|
|
27
26
|
#include <windows.h>
|
|
28
27
|
#endif
|
|
@@ -100,6 +99,18 @@ const wchar_t* fielddef::chainChar() const
|
|
|
100
99
|
return p;
|
|
101
100
|
}
|
|
102
101
|
|
|
102
|
+
const wchar_t* fielddef::defaultValue_str() const
|
|
103
|
+
{
|
|
104
|
+
char tmp[MYSQL_FDNAME_SIZE];
|
|
105
|
+
const char* src = defaultValue_strA(tmp, MYSQL_FDNAME_SIZE);
|
|
106
|
+
wchar_t* p = namebuf();
|
|
107
|
+
MultiByteToWideChar(m_schemaCodePage,
|
|
108
|
+
(m_schemaCodePage == CP_UTF8) ? 0 : MB_PRECOMPOSED,
|
|
109
|
+
src, -1, p, MYSQL_FDNAME_SIZE);
|
|
110
|
+
return p;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
|
|
103
114
|
void fielddef::setName(const wchar_t* s)
|
|
104
115
|
{
|
|
105
116
|
WideCharToMultiByte(m_schemaCodePage,
|
|
@@ -114,6 +125,19 @@ void fielddef::setChainChar(const wchar_t* s)
|
|
|
114
125
|
s, -1, m_chainChar, 2, NULL, NULL);
|
|
115
126
|
}
|
|
116
127
|
|
|
128
|
+
void fielddef::setDefaultValue(const wchar_t* s)
|
|
129
|
+
{
|
|
130
|
+
int size = WideCharToMultiByte(m_schemaCodePage,
|
|
131
|
+
(m_schemaCodePage == CP_UTF8) ? 0 : WC_COMPOSITECHECK,
|
|
132
|
+
s, -1, NULL, 0, NULL, NULL);
|
|
133
|
+
char* p = new char[size + 1];
|
|
134
|
+
WideCharToMultiByte(m_schemaCodePage,
|
|
135
|
+
(m_schemaCodePage == CP_UTF8) ? 0 : WC_COMPOSITECHECK,
|
|
136
|
+
s, -1, p, size + 1, NULL, NULL);
|
|
137
|
+
setDefaultValue(p);
|
|
138
|
+
delete [] p;
|
|
139
|
+
}
|
|
140
|
+
|
|
117
141
|
const wchar_t* tabledef::fileName() const
|
|
118
142
|
{
|
|
119
143
|
wchar_t* p = namebuf();
|
|
@@ -132,7 +156,7 @@ const wchar_t* tabledef::tableName() const
|
|
|
132
156
|
return p;
|
|
133
157
|
}
|
|
134
158
|
|
|
135
|
-
const char* tabledef::toChar(char* buf, const wchar_t* s, int size)
|
|
159
|
+
const char* tabledef::toChar(char* buf, const wchar_t* s, int size) const
|
|
136
160
|
{
|
|
137
161
|
WideCharToMultiByte(schemaCodePage,
|
|
138
162
|
(schemaCodePage == CP_UTF8) ? 0 : WC_COMPOSITECHECK, s,
|
|
@@ -193,6 +217,12 @@ const char* fielddef::chainChar() const
|
|
|
193
217
|
return m_chainChar;
|
|
194
218
|
}
|
|
195
219
|
|
|
220
|
+
const char* fielddef::defaultValue_str() const
|
|
221
|
+
{
|
|
222
|
+
char* p = (char*)namebuf();
|
|
223
|
+
return defaultValue_strA(p, MYSQL_FDNAME_SIZE);
|
|
224
|
+
}
|
|
225
|
+
|
|
196
226
|
void fielddef::setName(const char* s)
|
|
197
227
|
{
|
|
198
228
|
#ifdef LINUX
|
|
@@ -259,7 +289,7 @@ void tabledef::setTableName(const char* s)
|
|
|
259
289
|
setTableNameA(s);
|
|
260
290
|
}
|
|
261
291
|
|
|
262
|
-
const char* tabledef::toChar(char* buf, const char* s, int size)
|
|
292
|
+
const char* tabledef::toChar(char* buf, const char* s, int size) const
|
|
263
293
|
{
|
|
264
294
|
#ifdef LINUX
|
|
265
295
|
if (schemaCodePage != CP_UTF8)
|
|
@@ -275,13 +305,253 @@ const char* tabledef::toChar(char* buf, const char* s, int size)
|
|
|
275
305
|
#endif // NOT _UNICODE
|
|
276
306
|
|
|
277
307
|
|
|
308
|
+
//--------------------------------------------------------------------
|
|
309
|
+
// struct keydef
|
|
310
|
+
//--------------------------------------------------------------------
|
|
311
|
+
short keydef::synchronize(const keydef* kd)
|
|
312
|
+
{
|
|
313
|
+
for (int i = 0; i < kd->segmentCount; ++i)
|
|
314
|
+
{
|
|
315
|
+
if (i < segmentCount)
|
|
316
|
+
{
|
|
317
|
+
if (segments[i].fieldNum == kd->segments[i].fieldNum)
|
|
318
|
+
{
|
|
319
|
+
const FLAGS f = kd->segments[i].flags;
|
|
320
|
+
segments[i].flags.bit1 = f.bit1;
|
|
321
|
+
segments[i].flags.bit2 = f.bit2;
|
|
322
|
+
segments[i].flags.bit3 = f.bit3;
|
|
323
|
+
segments[i].flags.bit7 = f.bit7;
|
|
324
|
+
segments[i].flags.bit8 = f.bit8;
|
|
325
|
+
segments[i].flags.bit9 = f.bit9;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
keyNumber = kd->keyNumber;
|
|
330
|
+
return 0;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
//--------------------------------------------------------------------
|
|
334
|
+
// struct fielddef
|
|
335
|
+
//--------------------------------------------------------------------
|
|
336
|
+
void fielddef::setDefaultValue(const char* s)
|
|
337
|
+
{
|
|
338
|
+
if (isBlob())
|
|
339
|
+
{
|
|
340
|
+
memset(m_defValue, 0, DEFAULT_VALUE_SIZE);
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
enableFlags.bitF = false;
|
|
345
|
+
__int64 i64 = 0;
|
|
346
|
+
switch(type)
|
|
347
|
+
{
|
|
348
|
+
case ft_time:
|
|
349
|
+
case ft_mytime:
|
|
350
|
+
{
|
|
351
|
+
myDateTime dt(7, true);
|
|
352
|
+
dt.setTime(s);
|
|
353
|
+
i64 = dt.getValue();
|
|
354
|
+
memcpy(m_defValue, &i64, 7);
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
case ft_date:
|
|
358
|
+
case ft_mydate:
|
|
359
|
+
case ft_datetime:
|
|
360
|
+
case ft_mytimestamp:
|
|
361
|
+
case ft_mydatetime:
|
|
362
|
+
i64 = str_to_64<myDateTime, char>(7, true, s);
|
|
363
|
+
memcpy(m_defValue, &i64, 7);
|
|
364
|
+
return;
|
|
365
|
+
case ft_integer:
|
|
366
|
+
case ft_autoinc:
|
|
367
|
+
{
|
|
368
|
+
*((__int64*)m_defValue) = _atoi64(s);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
case ft_uinteger:
|
|
372
|
+
case ft_logical:
|
|
373
|
+
case ft_set:
|
|
374
|
+
case ft_bit:
|
|
375
|
+
case ft_enum:
|
|
376
|
+
case ft_autoIncUnsigned:
|
|
377
|
+
case ft_myyear:
|
|
378
|
+
{
|
|
379
|
+
*((unsigned __int64*)m_defValue) = strtoull(s, NULL, 10);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
if (isNumericType())
|
|
385
|
+
{
|
|
386
|
+
*((double*)m_defValue) = atof(s);
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
m_defValue[7] = 0x00;
|
|
390
|
+
#ifdef LINUX
|
|
391
|
+
if (m_schemaCodePage != CP_UTF8)
|
|
392
|
+
u8tombc(s, strlen(s), m_defValue, 8);
|
|
393
|
+
else
|
|
394
|
+
#endif
|
|
395
|
+
strncpy_s(m_defValue, 8, s, sizeof(m_defValue) - 1);
|
|
396
|
+
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
void fielddef::setDefaultValue(__int64 v)
|
|
400
|
+
{
|
|
401
|
+
if ((v == DFV_TIMESTAMP_DEFAULT) &&
|
|
402
|
+
((type == ft_mytimestamp) || (type == ft_mytimestamp)))
|
|
403
|
+
{
|
|
404
|
+
*((__int64*)m_defValue) = v;
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
char tmp[100];
|
|
408
|
+
sprintf_s(tmp, 100, "%lld", v);
|
|
409
|
+
setDefaultValue(tmp);
|
|
410
|
+
}
|
|
278
411
|
|
|
279
|
-
|
|
412
|
+
void fielddef::setDefaultValue(double v)
|
|
280
413
|
{
|
|
281
|
-
|
|
414
|
+
if ((v == DFV_TIMESTAMP_DEFAULT) &&
|
|
415
|
+
((type == ft_mytimestamp) || (type == ft_mytimestamp)))
|
|
416
|
+
{
|
|
417
|
+
*((__int64*)m_defValue) = (__int64)v;
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
char tmp[100];
|
|
421
|
+
sprintf_s(tmp, 100, "%.*lf", decimals, v);
|
|
422
|
+
setDefaultValue(tmp);
|
|
282
423
|
}
|
|
283
424
|
|
|
284
|
-
|
|
425
|
+
const char* fielddef::defaultValue_strA(char* p, size_t size) const
|
|
426
|
+
{
|
|
427
|
+
if (*((__int64*)m_defValue) == 0) return "";
|
|
428
|
+
//char* p = namebufA();
|
|
429
|
+
if (isStringTypeForIndex(type))
|
|
430
|
+
{
|
|
431
|
+
#ifdef LINUX
|
|
432
|
+
if (m_schemaCodePage != CP_UTF8)
|
|
433
|
+
{
|
|
434
|
+
char* p = namebufA();
|
|
435
|
+
mbctou8(m_defValue, strlen(m_defValue), p, size);
|
|
436
|
+
return p;
|
|
437
|
+
}
|
|
438
|
+
#endif
|
|
439
|
+
return m_defValue;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
if (isDateTimeType())
|
|
443
|
+
{
|
|
444
|
+
bool tsu = isTimeStampOnUpdate();
|
|
445
|
+
*(const_cast<char*>(m_defValue) + 7) = 0x00;
|
|
446
|
+
__int64 i64 = *((__int64*)m_defValue);
|
|
447
|
+
myDateTime dt(4, true);
|
|
448
|
+
dt.setValue(i64); // i64 not equal dt.internalValue();
|
|
449
|
+
p[0] = 0x00;
|
|
450
|
+
|
|
451
|
+
switch(type)
|
|
452
|
+
{
|
|
453
|
+
case ft_date:
|
|
454
|
+
case ft_mydate:
|
|
455
|
+
if (dt.internalValue())
|
|
456
|
+
dt.dateStr(p, size);
|
|
457
|
+
break;
|
|
458
|
+
case ft_time:
|
|
459
|
+
case ft_mytime:
|
|
460
|
+
if (dt.internalValue())
|
|
461
|
+
dt.timeStr(p, size);
|
|
462
|
+
break;
|
|
463
|
+
case ft_datetime:
|
|
464
|
+
case ft_timestamp:
|
|
465
|
+
if (dt.internalValue())
|
|
466
|
+
dt.toString(p, size);
|
|
467
|
+
break;
|
|
468
|
+
case ft_mydatetime:
|
|
469
|
+
case ft_mytimestamp:
|
|
470
|
+
{
|
|
471
|
+
if (i64 == DFV_TIMESTAMP_DEFAULT)
|
|
472
|
+
{
|
|
473
|
+
*(const_cast<char*>(m_defValue) + 7) = tsu ? 1: 0;
|
|
474
|
+
return DFV_TIMESTAMP_DEFAULT_ASTR;
|
|
475
|
+
}
|
|
476
|
+
else if (dt.internalValue())
|
|
477
|
+
dt.toString(p, size);
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
480
|
+
default:
|
|
481
|
+
assert(0);
|
|
482
|
+
}
|
|
483
|
+
//restore
|
|
484
|
+
*(const_cast<char*>(m_defValue) + 7) = tsu ? 1: 0;
|
|
485
|
+
}else if (isIntegerType())
|
|
486
|
+
{
|
|
487
|
+
__int64 *v = (__int64*)m_defValue;
|
|
488
|
+
if ((type == ft_integer) || (type == ft_autoinc))
|
|
489
|
+
_i64toa_s(*v, p, size, 10);
|
|
490
|
+
else
|
|
491
|
+
_ui64toa_s((unsigned __int64)(*v), p, size, 10);
|
|
492
|
+
}else
|
|
493
|
+
sprintf_s(p, size, "%.*lf", decimals, *((double*)m_defValue));
|
|
494
|
+
|
|
495
|
+
return p;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
void fielddef::setDecimalDigits(int dig, int dec)
|
|
499
|
+
{
|
|
500
|
+
assert(sizeof(int) == 4);
|
|
501
|
+
if (type == ft_mydecimal)
|
|
502
|
+
{
|
|
503
|
+
decimals = (uchar_td)dec;
|
|
504
|
+
digits = dig;
|
|
505
|
+
int intdeg = digits - dec;
|
|
506
|
+
len = (ushort_td) (((intdeg / DIGITS_INT32) * sizeof(int)) +
|
|
507
|
+
decimalBytesBySurplus[intdeg % DIGITS_INT32]) +
|
|
508
|
+
(ushort_td) (((dec / DIGITS_INT32) * sizeof(int)) +
|
|
509
|
+
decimalBytesBySurplus[dec % DIGITS_INT32]) ;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
bool fielddef::operator==(const fielddef& r) const
|
|
514
|
+
{
|
|
515
|
+
//ignore m_nullbit m_nullbytes
|
|
516
|
+
if (this == &r) return true;
|
|
517
|
+
if (isStringType() && (m_charsetIndex != r.m_charsetIndex))
|
|
518
|
+
if (isPadCharType() &&
|
|
519
|
+
((isUsePadChar() != r.isUsePadChar()) || (isTrimPadChar() != r.isTrimPadChar())))
|
|
520
|
+
return false;
|
|
521
|
+
|
|
522
|
+
if (type != ft_float && (decimals != r.decimals))
|
|
523
|
+
return false;
|
|
524
|
+
|
|
525
|
+
_TCHAR tmp[256];
|
|
526
|
+
_tcscpy_s(tmp, 256, r.defaultValue_str());
|
|
527
|
+
bool ret = _tcscmp(defaultValue_str(), tmp) == 0;
|
|
528
|
+
return (ret &&
|
|
529
|
+
_tcscmp(name(), r.name(tmp)) == 0) &&
|
|
530
|
+
(type == r.type) &&
|
|
531
|
+
(len == r.len) &&
|
|
532
|
+
(viewNum == r.viewNum) &&
|
|
533
|
+
(viewWidth == r.viewWidth) &&
|
|
534
|
+
(max == r.max) &&
|
|
535
|
+
(min == r.min) &&
|
|
536
|
+
(lookTable == r.lookTable) &&
|
|
537
|
+
(lookField == r.lookField) &&
|
|
538
|
+
(memcmp(lookFields, r.lookFields, 3) == 0) &&
|
|
539
|
+
(pos == r.pos) &&
|
|
540
|
+
(m_nullbit == r.m_nullbit) &&
|
|
541
|
+
(m_nullbytes == r.m_nullbytes) &&
|
|
542
|
+
(memcmp(m_chainChar, r.m_chainChar, 2) == 0) &&
|
|
543
|
+
(ddfid == r.ddfid) &&
|
|
544
|
+
(filterId == r.filterId) &&
|
|
545
|
+
(filterKeynum == r.filterKeynum) &&
|
|
546
|
+
(nullValue == r.nullValue) &&
|
|
547
|
+
(userOption == r.userOption) &&
|
|
548
|
+
(lookDBNum == r.lookDBNum) &&
|
|
549
|
+
(keylen == r.keylen) &&
|
|
550
|
+
((m_options & ~FIELD_OPTION_MARIADB) == (r.m_options & ~FIELD_OPTION_MARIADB)) &&
|
|
551
|
+
(enableFlags.all == r.enableFlags.all);
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
unsigned int fielddef::charNum() const
|
|
285
555
|
{
|
|
286
556
|
if (type == ft_mychar)
|
|
287
557
|
return (unsigned int)len / mysql::charsize(m_charsetIndex);
|
|
@@ -296,38 +566,453 @@ unsigned int fielddef::charNum(/* int index */) const
|
|
|
296
566
|
return len;
|
|
297
567
|
}
|
|
298
568
|
|
|
569
|
+
bool fielddef::isValidCharNum() const
|
|
570
|
+
{
|
|
571
|
+
unsigned int num = charNum();
|
|
572
|
+
if (type == ft_mychar)
|
|
573
|
+
return ((unsigned int)len == num * mysql::charsize(m_charsetIndex));
|
|
574
|
+
else if (type == ft_mywchar)
|
|
575
|
+
return ((unsigned int)len == num * mysql::charsize(CHARSET_UTF16LE));
|
|
576
|
+
else if (type == ft_myvarchar)
|
|
577
|
+
return ((unsigned int)(len - varLenBytes()) == num * mysql::charsize(m_charsetIndex));
|
|
578
|
+
else if (type == ft_mywvarchar)
|
|
579
|
+
return ((unsigned int)(len - varLenBytes()) == num * mysql::charsize(CHARSET_UTF16LE));
|
|
580
|
+
return true;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
void fielddef::fixCharnum_bug()
|
|
584
|
+
{
|
|
585
|
+
unsigned int num = charNum();
|
|
586
|
+
if (type == ft_mychar)
|
|
587
|
+
len = num * mysql::charsize(m_charsetIndex);
|
|
588
|
+
else if (type == ft_mywchar)
|
|
589
|
+
len = num * mysql::charsize(CHARSET_UTF16LE);
|
|
590
|
+
else if (type == ft_myvarchar)
|
|
591
|
+
len = num * mysql::charsize(m_charsetIndex) + varLenBytes();
|
|
592
|
+
else if (type == ft_mywvarchar)
|
|
593
|
+
len = num * mysql::charsize(CHARSET_UTF16LE) + varLenBytes();
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
bool isCompatibleType(uchar_td l, uchar_td r, ushort_td rlen, uchar_td rchar)
|
|
597
|
+
{
|
|
598
|
+
if (l == ft_integer)
|
|
599
|
+
{
|
|
600
|
+
if ((r == ft_currency) && (rlen == 8)) return true;
|
|
601
|
+
if ((r == ft_currency) && (rlen == 8)) return true;
|
|
602
|
+
if ((r == ft_date) && (rlen == 4)) return true;
|
|
603
|
+
if ((r == ft_time) && (rlen == 4)) return true;
|
|
604
|
+
if ((r == ft_datetime) && (rlen == 8)) return true;
|
|
605
|
+
if ((r == ft_timestamp) && (rlen == 8)) return true;
|
|
606
|
+
}
|
|
607
|
+
else if (l == ft_uinteger)
|
|
608
|
+
{
|
|
609
|
+
if ((r == ft_logical) && (rlen <= 2)) return true;
|
|
610
|
+
if ((r == ft_bit) && (rlen <= 8)) return true;
|
|
611
|
+
if ((r == ft_enum) && (rlen <= 8)) return true;
|
|
612
|
+
if ((r == ft_set) && (rlen <= 8)) return true;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
|
|
616
|
+
// mywchar --> mywchar OK!
|
|
617
|
+
// string --> string OK!
|
|
618
|
+
// mychar --> mychar OK!
|
|
619
|
+
// mywchar --> mywchar OK!
|
|
620
|
+
|
|
621
|
+
if (l == ft_myvarbinary)
|
|
622
|
+
{
|
|
623
|
+
if (r == ft_myvarbinary) return true;
|
|
624
|
+
if (r == ft_mywvarbinary && rchar == CHARSET_UTF16LE) return true;
|
|
625
|
+
if (r == ft_lstring) return true;
|
|
626
|
+
if (r == ft_lvar) return true;
|
|
627
|
+
if (r == ft_note) return true;
|
|
628
|
+
if (r == ft_myfixedbinary) return true;
|
|
629
|
+
}
|
|
630
|
+
else if (l == ft_string)
|
|
631
|
+
{
|
|
632
|
+
if (r == ft_string) return true;
|
|
633
|
+
|
|
634
|
+
// zstring --> string
|
|
635
|
+
if ((r == ft_zstring) && (rchar != CHARSET_UTF16LE)) return true;
|
|
636
|
+
|
|
637
|
+
// wzstring --> string
|
|
638
|
+
if ((r == ft_wzstring) && (rchar == CHARSET_UTF16LE)) return true;
|
|
639
|
+
|
|
640
|
+
// wstring --> string
|
|
641
|
+
if ((r == ft_wstring) && (rchar == CHARSET_UTF16LE)) return true;
|
|
642
|
+
if (r == ft_decimal) return true;
|
|
643
|
+
if (r == ft_money) return true;
|
|
644
|
+
if (r == ft_numeric) return true;
|
|
645
|
+
if (r == ft_bfloat) return true;
|
|
646
|
+
if (r == ft_numericsts) return true;
|
|
647
|
+
if (r == ft_numericsa) return true;
|
|
648
|
+
if (r == ft_guid) return true;
|
|
649
|
+
}
|
|
650
|
+
return false;
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
short fielddef::synchronize(const fielddef* fd)
|
|
654
|
+
{
|
|
655
|
+
viewNum = fd->viewNum;
|
|
656
|
+
viewWidth = fd->viewWidth;
|
|
657
|
+
max = fd->max;
|
|
658
|
+
min = fd->min;
|
|
659
|
+
lookTable = fd->lookTable;
|
|
660
|
+
lookField = fd->lookField;
|
|
661
|
+
memcpy(lookFields, fd->lookFields, sizeof(uchar_td) * 3);
|
|
662
|
+
m_chainChar[0] = fd->m_chainChar[0];
|
|
663
|
+
m_chainChar[1] = fd->m_chainChar[1];
|
|
664
|
+
ddfid = fd->ddfid;
|
|
665
|
+
filterId = fd->filterId;
|
|
666
|
+
filterKeynum = fd->filterKeynum;
|
|
667
|
+
nullValue = fd->nullValue;
|
|
668
|
+
userOption = fd->userOption;
|
|
669
|
+
lookDBNum = fd->lookDBNum;
|
|
670
|
+
uchar_td nullable = m_options & FIELD_OPTION_NULLABLE;
|
|
671
|
+
m_options = fd->m_options;
|
|
672
|
+
m_options |= nullable;
|
|
673
|
+
bool defaultNull = enableFlags.bitF;
|
|
674
|
+
enableFlags = fd->enableFlags;
|
|
675
|
+
enableFlags.bitF = defaultNull;
|
|
676
|
+
if (type == ft_mychar || type == ft_string || type == ft_mywchar || type == ft_wstring)
|
|
677
|
+
m_padCharOptions = fd->m_padCharOptions;
|
|
678
|
+
if (fd->type == ft_myfixedbinary && len - 2 == fd->len)
|
|
679
|
+
{
|
|
680
|
+
len = fd->len ;
|
|
681
|
+
type = fd->type;
|
|
682
|
+
}
|
|
683
|
+
if (len == fd->len && isCompatibleType(type, fd->type, fd->len, fd->m_charsetIndex))
|
|
684
|
+
{
|
|
685
|
+
type = fd->type;
|
|
686
|
+
m_charsetIndex = fd->m_charsetIndex;
|
|
687
|
+
}
|
|
688
|
+
if (type == ft_lvar || type == ft_myfixedbinary)
|
|
689
|
+
setDefaultValue(0.0f);
|
|
690
|
+
|
|
691
|
+
if (type == ft_float)
|
|
692
|
+
decimals = fd->decimals;
|
|
693
|
+
return 0;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
|
|
697
|
+
#pragma warn -8056
|
|
698
|
+
|
|
699
|
+
#define CASE_DOUBLE_TYPE \
|
|
700
|
+
case ft_float: \
|
|
701
|
+
case ft_decimal: \
|
|
702
|
+
case ft_bfloat: \
|
|
703
|
+
case ft_numeric: \
|
|
704
|
+
case ft_money: \
|
|
705
|
+
case ft_currency: \
|
|
706
|
+
case ft_numericsts: \
|
|
707
|
+
case ft_numericsa: \
|
|
708
|
+
case ft_mydecimal:
|
|
709
|
+
|
|
710
|
+
#define CASE_INT_TYPE \
|
|
711
|
+
case ft_integer: \
|
|
712
|
+
case ft_autoinc: \
|
|
713
|
+
case ft_uinteger: \
|
|
714
|
+
case ft_logical: \
|
|
715
|
+
case ft_set: \
|
|
716
|
+
case ft_bit: \
|
|
717
|
+
case ft_enum: \
|
|
718
|
+
case ft_autoIncUnsigned: \
|
|
719
|
+
case ft_myyear:
|
|
720
|
+
|
|
721
|
+
double fielddef::defaultValue() const
|
|
722
|
+
{
|
|
723
|
+
assert(sizeof(double) == 8);
|
|
724
|
+
if (isDateTimeType())
|
|
725
|
+
return (double)(*((__int64*)m_defValue) & (0x00FFFFFFFFFFFFFFLL));
|
|
726
|
+
switch(type)
|
|
727
|
+
{
|
|
728
|
+
CASE_INT_TYPE
|
|
729
|
+
return (double)*((__int64*)m_defValue);
|
|
730
|
+
CASE_DOUBLE_TYPE
|
|
731
|
+
return *((double*)m_defValue);
|
|
732
|
+
}
|
|
733
|
+
if (isStringType())
|
|
734
|
+
return atof(m_defValue);
|
|
735
|
+
return 0;
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
__int64 fielddef::defaultValue64() const
|
|
739
|
+
{
|
|
740
|
+
assert(sizeof(__int64) == 8);
|
|
741
|
+
|
|
742
|
+
if (isDateTimeType())
|
|
743
|
+
return (*((__int64*)m_defValue) & (0x00FFFFFFFFFFFFFFLL));
|
|
744
|
+
switch(type)
|
|
745
|
+
{
|
|
746
|
+
CASE_INT_TYPE
|
|
747
|
+
return *((__int64*)m_defValue);
|
|
748
|
+
CASE_DOUBLE_TYPE
|
|
749
|
+
return (__int64)*((double*)m_defValue);
|
|
750
|
+
}
|
|
751
|
+
if (isStringType())
|
|
752
|
+
return _atoi64(m_defValue);
|
|
753
|
+
return 0;
|
|
754
|
+
}
|
|
755
|
+
#pragma warn .8056
|
|
756
|
+
|
|
757
|
+
//--------------------------------------------------------------------
|
|
758
|
+
// struvt tabledef
|
|
759
|
+
//--------------------------------------------------------------------
|
|
760
|
+
bool tabledef::operator==(const tabledef& r) const
|
|
761
|
+
{
|
|
762
|
+
if (this == &r) return true;
|
|
763
|
+
// remove file extention
|
|
764
|
+
_TCHAR tmp[256];
|
|
765
|
+
_TCHAR tmp2[256];
|
|
766
|
+
_tcscpy_s(tmp, 256, r.fileName());
|
|
767
|
+
_tcscpy_s(tmp2, 256, fileName());
|
|
768
|
+
_tcslwr_s(tmp, 256);
|
|
769
|
+
_tcslwr_s(tmp2, 256);
|
|
770
|
+
_TCHAR* p = _tcsrchr(tmp, _T('.'));
|
|
771
|
+
_TCHAR* p2 = _tcsrchr(tmp2, _T('.'));
|
|
772
|
+
if (p && !p2) *p = 0x00;
|
|
773
|
+
if( !p && p2) *p2 = 0x00;
|
|
774
|
+
|
|
775
|
+
bool ret = _tcscmp(tmp2, tmp) == 0;
|
|
776
|
+
if (!ret) return ret;
|
|
777
|
+
_tcscpy_s(tmp, 256, r.tableName());
|
|
778
|
+
ret = _tcscmp(tableName(), tmp) == 0;
|
|
779
|
+
|
|
780
|
+
return (ret) &&
|
|
781
|
+
(varSize == r.varSize) &&
|
|
782
|
+
(preAlloc == r.preAlloc) &&
|
|
783
|
+
(fieldCount == r.fieldCount) &&
|
|
784
|
+
(keyCount == r.keyCount) &&
|
|
785
|
+
(version == r.version) &&
|
|
786
|
+
(charsetIndex == r.charsetIndex) &&
|
|
787
|
+
(m_nullfields == r.m_nullfields) &&
|
|
788
|
+
(m_nullbytes == r.m_nullbytes) &&
|
|
789
|
+
(flags.all == r.flags.all) &&
|
|
790
|
+
(primaryKeyNum == r.primaryKeyNum) &&
|
|
791
|
+
(parentKeyNum == r.parentKeyNum) &&
|
|
792
|
+
(replicaKeyNum == r.replicaKeyNum) &&
|
|
793
|
+
(optionFlags.all == r.optionFlags.all) &&
|
|
794
|
+
(convertFileNum == r.convertFileNum) &&
|
|
795
|
+
(treeIndex == r.treeIndex) &&
|
|
796
|
+
(iconIndex == r.iconIndex) &&
|
|
797
|
+
(ddfid == r.ddfid) &&
|
|
798
|
+
(iconIndex2 == r.iconIndex2) &&
|
|
799
|
+
(iconIndex3 == r.iconIndex3) &&
|
|
800
|
+
(formatVersion == r.formatVersion) &&
|
|
801
|
+
(varSize == r.varSize) ;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
bool tabledef::isNullKey(const keydef& key) const
|
|
805
|
+
{
|
|
806
|
+
if (key.segments[0].flags.bit3 || key.segments[0].flags.bit9)
|
|
807
|
+
{
|
|
808
|
+
for (int j=0;j < key.segmentCount; ++j)
|
|
809
|
+
{
|
|
810
|
+
const fielddef& fd = fieldDefs[key.segments[j].fieldNum];
|
|
811
|
+
if (fd.nullValue != 0x00)
|
|
812
|
+
return false;
|
|
813
|
+
}
|
|
814
|
+
return true;
|
|
815
|
+
}
|
|
816
|
+
return false;
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
bool tabledef::isNeedNis(const keydef& key) const
|
|
820
|
+
{
|
|
821
|
+
/* bit3 all segment NULL key
|
|
822
|
+
bit9 part segment NULL key
|
|
823
|
+
if fd.nullValue != 0x00 then this field is type of not null.
|
|
824
|
+
*/
|
|
825
|
+
if (!isNULLFieldFirstKeySegField(key))
|
|
826
|
+
return isNullKey(key);
|
|
827
|
+
return false;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
bool tabledef::isNULLFieldFirstKeySegField(const keydef& key) const
|
|
831
|
+
{
|
|
832
|
+
// logical 1 byte and segmentCount = 1 and nullValue = 0x00
|
|
833
|
+
if ((key.segments[0].flags.bit3 || key.segments[0].flags.bit9) && key.segmentCount == 1)
|
|
834
|
+
{
|
|
835
|
+
const fielddef& fd = fieldDefs[key.segments[0].fieldNum];
|
|
836
|
+
return ((fd.len == 1) && (fd.type == ft_logical) && fd.nullValue == 0x00);
|
|
837
|
+
}
|
|
838
|
+
return false;
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
void tabledef::setMysqlNullMode(bool v)
|
|
842
|
+
{
|
|
843
|
+
if (m_mysqlNullMode != v)
|
|
844
|
+
{
|
|
845
|
+
m_mysqlNullMode = v;
|
|
846
|
+
calcReclordlen();
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
void tabledef::calcReclordlen(bool force)
|
|
851
|
+
{
|
|
852
|
+
if (m_inUse == 0 || force)
|
|
853
|
+
{
|
|
854
|
+
if (force) m_inUse = 0;
|
|
855
|
+
if (charsetIndex == 0)
|
|
856
|
+
charsetIndex = mysql::charsetIndex(GetACP());
|
|
857
|
+
|
|
858
|
+
int nisFieldNum = 0;
|
|
859
|
+
bool firstTimeStamp = true;
|
|
860
|
+
m_nullfields = 0;
|
|
861
|
+
m_nullbytes = 0;
|
|
862
|
+
m_maxRecordLen = 0;
|
|
863
|
+
|
|
864
|
+
// Check Null Key
|
|
865
|
+
for (int i = 0; i < keyCount; i++)
|
|
866
|
+
{
|
|
867
|
+
keydef& kd = keyDefs[i];
|
|
868
|
+
if (isNullKey(kd))
|
|
869
|
+
{
|
|
870
|
+
if (m_mysqlNullMode)
|
|
871
|
+
nisFieldNum += (isNeedNis(kd) ? 1 : 0);
|
|
872
|
+
if (isNULLFieldFirstKeySegField(kd))
|
|
873
|
+
{
|
|
874
|
+
fielddef& fd = fieldDefs[kd.segments[0].fieldNum];
|
|
875
|
+
fd.setNullable(true, true);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
for (int i = 0; i < fieldCount; i++)
|
|
881
|
+
{
|
|
882
|
+
fielddef& fd = fieldDefs[i];
|
|
883
|
+
if (fd.charsetIndex() == 0)
|
|
884
|
+
fd.setCharsetIndex(charsetIndex);
|
|
885
|
+
fd.setSchemaCodePage(schemaCodePage);
|
|
886
|
+
|
|
887
|
+
fd.m_nullbytes = 0;
|
|
888
|
+
fd.m_nullbit = 0;
|
|
889
|
+
if (fd.isNullable())
|
|
890
|
+
{
|
|
891
|
+
fd.m_nullbit = m_nullfields;
|
|
892
|
+
if (m_mysqlNullMode)
|
|
893
|
+
++m_nullfields;
|
|
894
|
+
}
|
|
895
|
+
double defaultValue = fd.defaultValue();
|
|
896
|
+
if (fd.type == ft_mytimestamp && fd.isNullable() == false &&
|
|
897
|
+
(defaultValue == 0 || defaultValue == DFV_TIMESTAMP_DEFAULT) && firstTimeStamp)
|
|
898
|
+
{
|
|
899
|
+
fd.setDefaultValue(DFV_TIMESTAMP_DEFAULT);
|
|
900
|
+
fd.setTimeStampOnUpdate(true);
|
|
901
|
+
firstTimeStamp = false;
|
|
902
|
+
}
|
|
903
|
+
if (fd.type == ft_mydatetime || fd.type == ft_mytime || fd.type == ft_mytimestamp)
|
|
904
|
+
{
|
|
905
|
+
if (isMariaTimeFormat())
|
|
906
|
+
fd.m_options |= FIELD_OPTION_MARIADB;
|
|
907
|
+
else
|
|
908
|
+
fd.m_options &= ~FIELD_OPTION_MARIADB;
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
if (fd.type == ft_mytimestamp && fd.decimals == 0)
|
|
912
|
+
fd.decimals = (fd.len - 4) * 2;
|
|
913
|
+
else if (fd.type == ft_mydatetime)
|
|
914
|
+
{
|
|
915
|
+
// datetime decimals is different by server version
|
|
916
|
+
if (fd.decimals == 0 && !isLegacyTimeFormat(fd))
|
|
917
|
+
fd.decimals = (fd.len - 5) * 2;
|
|
918
|
+
}
|
|
919
|
+
else if (fd.type == ft_mytime && fd.decimals == 0)
|
|
920
|
+
fd.decimals = (fd.len - 3) * 2;
|
|
921
|
+
else if (defaultValue && fd.isBlob())
|
|
922
|
+
fd.setDefaultValue(0.0f);
|
|
923
|
+
|
|
924
|
+
if (m_srvMajorVer)
|
|
925
|
+
{
|
|
926
|
+
if (isLegacyTimeFormat(fd))
|
|
927
|
+
{
|
|
928
|
+
fd.m_options |= FIELD_OPTION_REGACY_TIME;
|
|
929
|
+
fd.decimals = 0;
|
|
930
|
+
if (fd.type == ft_mydatetime)
|
|
931
|
+
fd.len = 8;
|
|
932
|
+
else if (fd.type == ft_mytime)
|
|
933
|
+
fd.len = 3;
|
|
934
|
+
else if (fd.type == ft_mytimestamp)
|
|
935
|
+
fd.len = 4;
|
|
936
|
+
}
|
|
937
|
+
else
|
|
938
|
+
fd.m_options &= ~FIELD_OPTION_REGACY_TIME;
|
|
939
|
+
}
|
|
940
|
+
fd.pos = m_maxRecordLen;
|
|
941
|
+
fd.fixCharnum_bug();
|
|
942
|
+
m_maxRecordLen += fd.len;
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
m_nullfields += nisFieldNum;
|
|
946
|
+
|
|
947
|
+
if (m_nullfields)
|
|
948
|
+
{
|
|
949
|
+
m_nullbytes = (m_nullfields + 7) / 8;
|
|
950
|
+
for (int i = 0; i < fieldCount; i++)
|
|
951
|
+
fieldDefs[i].m_nullbytes = m_nullbytes;
|
|
952
|
+
}
|
|
953
|
+
m_maxRecordLen += m_nullbytes;
|
|
954
|
+
// If valible length then specifing fixed length.
|
|
955
|
+
if ((fixedRecordLen == 0) || (flags.bit0 == false))
|
|
956
|
+
fixedRecordLen = m_maxRecordLen;
|
|
957
|
+
}else
|
|
958
|
+
;//assert(0);
|
|
959
|
+
}
|
|
960
|
+
|
|
299
961
|
uint_td tabledef::unPack(char* ptr, size_t size) const
|
|
300
962
|
{
|
|
301
|
-
char* pos = ptr;
|
|
963
|
+
char* pos = ptr + m_nullbytes;
|
|
302
964
|
const char* end = pos + size;
|
|
303
|
-
const char* max = pos +
|
|
965
|
+
const char* max = pos + m_maxRecordLen;
|
|
304
966
|
int movelen;
|
|
967
|
+
|
|
968
|
+
// if null then not recieved field data
|
|
969
|
+
unsigned char null_bit = 1;
|
|
970
|
+
unsigned char* null_ptr = (unsigned char*)ptr;
|
|
971
|
+
|
|
305
972
|
for (int i = 0; i < fieldCount; i++)
|
|
306
973
|
{
|
|
307
974
|
fielddef& fd = fieldDefs[i];
|
|
975
|
+
bool isNull = false;
|
|
976
|
+
if (fd.isNullable() && m_nullbytes)
|
|
977
|
+
{
|
|
978
|
+
isNull = (*null_ptr & null_bit) != 0;
|
|
979
|
+
if (null_bit == (unsigned char)128)
|
|
980
|
+
{
|
|
981
|
+
++null_ptr;
|
|
982
|
+
null_bit = 1;
|
|
983
|
+
}else
|
|
984
|
+
null_bit = null_bit << 1;
|
|
985
|
+
}
|
|
986
|
+
|
|
308
987
|
if (fd.type == ft_myfixedbinary)
|
|
309
988
|
{
|
|
310
989
|
int dl = *((unsigned short*)(pos));
|
|
311
990
|
memmove(pos, pos + 2, dl);
|
|
312
991
|
pos += fd.len - 2;
|
|
313
992
|
*((unsigned short*)(pos)) = 0x00;
|
|
314
|
-
;
|
|
315
993
|
pos += 2;
|
|
316
994
|
}
|
|
317
995
|
else
|
|
318
996
|
{
|
|
319
997
|
int blen = fd.varLenBytes();
|
|
320
998
|
int dl = fd.len; // length
|
|
321
|
-
if (
|
|
322
|
-
dl =
|
|
323
|
-
else if (blen
|
|
324
|
-
|
|
999
|
+
if (isNull)
|
|
1000
|
+
dl = 0;
|
|
1001
|
+
else if (blen)
|
|
1002
|
+
{
|
|
1003
|
+
if (blen == 1)
|
|
1004
|
+
dl = *((unsigned char*)(pos)) + blen;
|
|
1005
|
+
else if (blen == 2)
|
|
1006
|
+
dl = *((unsigned short*)(pos)) + blen;
|
|
1007
|
+
}
|
|
1008
|
+
|
|
325
1009
|
if ((movelen = fd.len - dl) != 0)
|
|
326
1010
|
{
|
|
327
1011
|
if (max < end + movelen)
|
|
328
1012
|
return 0;
|
|
329
1013
|
char* src = pos + dl;
|
|
330
|
-
|
|
1014
|
+
if (end > src)
|
|
1015
|
+
memmove(pos + fd.len, src, end - src);
|
|
331
1016
|
memset(src, 0, movelen);
|
|
332
1017
|
end += movelen;
|
|
333
1018
|
}
|
|
@@ -339,12 +1024,28 @@ uint_td tabledef::unPack(char* ptr, size_t size) const
|
|
|
339
1024
|
|
|
340
1025
|
uint_td tabledef::pack(char* ptr, size_t size) const
|
|
341
1026
|
{
|
|
342
|
-
char* pos = ptr;
|
|
1027
|
+
char* pos = ptr + m_nullbytes;
|
|
343
1028
|
char* end = pos + size;
|
|
344
1029
|
int movelen;
|
|
1030
|
+
|
|
1031
|
+
// if null then not copy field image (field length move)
|
|
1032
|
+
unsigned char null_bit = 1;
|
|
1033
|
+
unsigned char* null_ptr = (unsigned char*)ptr;
|
|
345
1034
|
for (int i = 0; i < fieldCount; i++)
|
|
346
1035
|
{
|
|
347
1036
|
fielddef& fd = fieldDefs[i];
|
|
1037
|
+
bool isNull = false;
|
|
1038
|
+
if (fd.isNullable() && m_nullbytes)
|
|
1039
|
+
{
|
|
1040
|
+
isNull = (*null_ptr & null_bit) != 0;
|
|
1041
|
+
if (null_bit == (unsigned char)128)
|
|
1042
|
+
{
|
|
1043
|
+
++null_ptr;
|
|
1044
|
+
null_bit = 1;
|
|
1045
|
+
}else
|
|
1046
|
+
null_bit = null_bit << 1;
|
|
1047
|
+
}
|
|
1048
|
+
|
|
348
1049
|
if (fd.type == ft_myfixedbinary)
|
|
349
1050
|
{
|
|
350
1051
|
memmove(pos + 2, pos, fd.len - 2); // move as size pace in the field
|
|
@@ -359,17 +1060,88 @@ uint_td tabledef::pack(char* ptr, size_t size) const
|
|
|
359
1060
|
dl = *((unsigned char*)(pos)) + blen;
|
|
360
1061
|
else if (blen == 2)
|
|
361
1062
|
dl = *((unsigned short*)(pos)) + blen;
|
|
362
|
-
|
|
1063
|
+
if (isNull)
|
|
1064
|
+
dl = 0;
|
|
1065
|
+
else
|
|
1066
|
+
pos += dl;
|
|
363
1067
|
if ((movelen = fd.len - dl) != 0)
|
|
364
1068
|
{
|
|
365
1069
|
end -= movelen;
|
|
366
1070
|
memmove(pos, pos + movelen, end - pos);
|
|
367
1071
|
}
|
|
368
1072
|
}
|
|
1073
|
+
|
|
369
1074
|
}
|
|
370
1075
|
return (uint_td)(pos - ptr);
|
|
371
1076
|
}
|
|
372
1077
|
|
|
1078
|
+
int tabledef::size() const
|
|
1079
|
+
{
|
|
1080
|
+
int len = (int)(sizeof(tabledef) + (sizeof(fielddef) * fieldCount) +
|
|
1081
|
+
(sizeof(keydef) * keyCount));
|
|
1082
|
+
const ushort_td* p = &varSize;
|
|
1083
|
+
*(const_cast<ushort_td*>(p)) = len - 4;
|
|
1084
|
+
return len;
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
short tabledef::fieldNumByName(const _TCHAR* name) const
|
|
1088
|
+
{
|
|
1089
|
+
char buf[74];
|
|
1090
|
+
const char* p = toChar(buf, name, 74);
|
|
1091
|
+
for (short i = 0; i < fieldCount; i++)
|
|
1092
|
+
{
|
|
1093
|
+
if (strcmp(fieldDefs[i].nameA(), p) == 0)
|
|
1094
|
+
return i;
|
|
1095
|
+
}
|
|
1096
|
+
return -1;
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
short tabledef::findKeynumByFieldNum(short fieldNum) const
|
|
1100
|
+
{
|
|
1101
|
+
for (short i = 0; i < keyCount; i++)
|
|
1102
|
+
{
|
|
1103
|
+
if (keyDefs[i].segments[0].fieldNum == fieldNum)
|
|
1104
|
+
return i;
|
|
1105
|
+
}
|
|
1106
|
+
return -1;
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
short tabledef::synchronize(const tabledef* td)
|
|
1110
|
+
{
|
|
1111
|
+
id = td->id;
|
|
1112
|
+
setTableName(td->tableName());
|
|
1113
|
+
preAlloc = td->preAlloc;
|
|
1114
|
+
version = td->version;
|
|
1115
|
+
m_inUse = td->m_inUse;
|
|
1116
|
+
m_mysqlNullMode = td->m_mysqlNullMode;
|
|
1117
|
+
parentKeyNum = td->parentKeyNum;
|
|
1118
|
+
replicaKeyNum = td->replicaKeyNum;
|
|
1119
|
+
optionFlags = td->optionFlags;
|
|
1120
|
+
convertFileNum = td->convertFileNum;
|
|
1121
|
+
treeIndex = td->treeIndex;
|
|
1122
|
+
iconIndex = td->iconIndex;
|
|
1123
|
+
ddfid = td->ddfid;
|
|
1124
|
+
autoIncExSpace = td->autoIncExSpace;
|
|
1125
|
+
iconIndex2 = td->iconIndex2;
|
|
1126
|
+
iconIndex3 = td->iconIndex3;
|
|
1127
|
+
formatVersion = td->formatVersion;
|
|
1128
|
+
parent = td->parent;
|
|
1129
|
+
flags = td->flags;
|
|
1130
|
+
for (int i=0;i<td->fieldCount; ++i)
|
|
1131
|
+
{
|
|
1132
|
+
fielddef* fd = &td->fieldDefs[i];
|
|
1133
|
+
short index = fieldNumByName(fd->name());
|
|
1134
|
+
if (index != -1)
|
|
1135
|
+
fieldDefs[index].synchronize(fd);
|
|
1136
|
+
}
|
|
1137
|
+
for (int i=0;i<td->keyCount; ++i)
|
|
1138
|
+
{
|
|
1139
|
+
if (i < keyCount)
|
|
1140
|
+
keyDefs[i].synchronize(&td->keyDefs[i]);
|
|
1141
|
+
}
|
|
1142
|
+
return 0;
|
|
1143
|
+
}
|
|
1144
|
+
|
|
373
1145
|
ushort_td lenByCharnum(uchar_td type, uchar_td charsetIndex, ushort_td charnum)
|
|
374
1146
|
{
|
|
375
1147
|
ushort_td len = charnum;
|
|
@@ -424,6 +1196,10 @@ const _TCHAR* getTypeName(short type)
|
|
|
424
1196
|
return _T("AutoIncrement");
|
|
425
1197
|
case ft_bit:
|
|
426
1198
|
return _T("Bit");
|
|
1199
|
+
case ft_enum:
|
|
1200
|
+
return _T("Enum");
|
|
1201
|
+
case ft_set:
|
|
1202
|
+
return _T("Set");
|
|
427
1203
|
case ft_numericsts:
|
|
428
1204
|
return _T("Numericsts");
|
|
429
1205
|
case ft_numericsa:
|
|
@@ -454,6 +1230,8 @@ const _TCHAR* getTypeName(short type)
|
|
|
454
1230
|
return _T("myChar");
|
|
455
1231
|
case ft_mywchar:
|
|
456
1232
|
return _T("myWChar");
|
|
1233
|
+
case ft_myyear:
|
|
1234
|
+
return _T("myYear");
|
|
457
1235
|
case ft_mydate:
|
|
458
1236
|
return _T("myDate");
|
|
459
1237
|
case ft_mytime:
|
|
@@ -466,10 +1244,16 @@ const _TCHAR* getTypeName(short type)
|
|
|
466
1244
|
return _T("myText");
|
|
467
1245
|
case ft_myblob:
|
|
468
1246
|
return _T("myBlob");
|
|
1247
|
+
case ft_mygeometry:
|
|
1248
|
+
return _T("myGeometry");
|
|
1249
|
+
case ft_myjson:
|
|
1250
|
+
return _T("myJson");
|
|
469
1251
|
case ft_autoIncUnsigned:
|
|
470
1252
|
return _T("AutoIncUnsigned");
|
|
471
1253
|
case ft_myfixedbinary:
|
|
472
1254
|
return _T("myFixedBinary");
|
|
1255
|
+
case ft_mydecimal:
|
|
1256
|
+
return _T("myDecimal");
|
|
473
1257
|
case ft_nullindicator:
|
|
474
1258
|
return _T("Nullindicator");
|
|
475
1259
|
default:
|
|
@@ -496,11 +1280,14 @@ int getTypeAlign(short type)
|
|
|
496
1280
|
case ft_mywchar:
|
|
497
1281
|
case ft_mywvarchar:
|
|
498
1282
|
case ft_mywvarbinary:
|
|
1283
|
+
case ft_myyear:
|
|
499
1284
|
case ft_mydate:
|
|
500
1285
|
case ft_mytime:
|
|
501
1286
|
case ft_mydatetime:
|
|
502
1287
|
case ft_mytimestamp:
|
|
503
1288
|
case ft_myblob:
|
|
1289
|
+
case ft_mygeometry:
|
|
1290
|
+
case ft_myjson:
|
|
504
1291
|
case ft_myfixedbinary:
|
|
505
1292
|
case ft_mytext:
|
|
506
1293
|
return BT_AL_LEFT;
|
|
@@ -610,7 +1397,11 @@ PACKAGE uchar_td getFilterLogicTypeCode(const _TCHAR* cmpstr)
|
|
|
610
1397
|
return (uchar_td)eLessEq | CMPLOGICAL_CASEINSENSITIVE;
|
|
611
1398
|
else if (_tcscmp(cmpstr, _T("<=i")) == 0)
|
|
612
1399
|
return (uchar_td)eLessEq | CMPLOGICAL_CASEINSENSITIVE;
|
|
613
|
-
|
|
1400
|
+
else if (_tcscmp(cmpstr, _T("<==>")) == 0)
|
|
1401
|
+
return (uchar_td)eIsNull;
|
|
1402
|
+
else if (_tcscmp(cmpstr, _T("<!=>")) == 0)
|
|
1403
|
+
return (uchar_td)eIsNotNull;
|
|
1404
|
+
return 255;
|
|
614
1405
|
}
|
|
615
1406
|
|
|
616
1407
|
} // namespace tdap
|