transactd 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +37 -4
  3. data/bin/common/tdclc_32_1_2.dll +0 -0
  4. data/bin/common/tdclc_64_1_2.dll +0 -0
  5. data/build/common/transactd_cl_common.cmake +0 -1
  6. data/build/common/transactd_common.cmake +26 -6
  7. data/build/swig/php/generate.cmake.in +58 -0
  8. data/build/swig/php/generate.cmd.in +41 -0
  9. data/build/swig/php/php.swg +155 -0
  10. data/build/swig/ruby/ruby.swg +38 -0
  11. data/build/swig/tdcl.i +133 -3
  12. data/build/tdclc/CMakeLists.txt +4 -1
  13. data/build/tdclc/tdclc_32.cbproj +1 -1
  14. data/build/tdclc/tdclc_64.cbproj +1 -1
  15. data/build/tdclcpp/CMakeLists.txt +1 -1
  16. data/build/tdclcpp/tdclcpp_bcb_32.cbproj +1 -4
  17. data/build/tdclcpp/tdclcpp_bcb_64.cbproj +0 -3
  18. data/build/tdclrb/CMakeLists.txt +1 -1
  19. data/build/tdclrb/GEM_VERSION +2 -2
  20. data/source/bzs/db/engine/mysql/IReadRecords.h +1 -1
  21. data/source/bzs/db/engine/mysql/bookmark.h +3 -3
  22. data/source/bzs/db/engine/mysql/database.cpp +95 -19
  23. data/source/bzs/db/engine/mysql/database.h +6 -6
  24. data/source/bzs/db/engine/mysql/mysqlInternal.h +43 -1
  25. data/source/bzs/db/engine/mysql/mysqlThd.cpp +10 -8
  26. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +1 -1
  27. data/source/bzs/db/protocol/tdap/btrDate.h +2 -2
  28. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +15 -8
  29. data/source/bzs/db/protocol/tdap/client/dbDef.h +2 -2
  30. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +4 -0
  31. data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +0 -5
  32. data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +0 -4
  33. data/source/bzs/db/protocol/tdap/client/filter.cpp +0 -484
  34. data/source/bzs/db/protocol/tdap/client/filter.h +696 -84
  35. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +13 -3
  36. data/source/bzs/db/protocol/tdap/client/nsTable.h +12 -6
  37. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -1
  38. data/source/bzs/db/protocol/tdap/client/stringConverter.h +1 -0
  39. data/source/bzs/db/protocol/tdap/client/table.cpp +519 -75
  40. data/source/bzs/db/protocol/tdap/client/table.h +49 -7
  41. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +145 -124
  42. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +39 -0
  43. data/source/bzs/db/protocol/tdap/client/trdormapi.h +872 -0
  44. data/source/bzs/db/protocol/tdap/myDateTime.cpp +8 -8
  45. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +7 -9
  46. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +406 -195
  47. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +64 -13
  48. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +2 -1
  49. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +35 -3
  50. data/source/bzs/db/protocol/tdap/tdapSchema.h +11 -3
  51. data/source/bzs/db/protocol/tdap/tdapcapi.h +63 -53
  52. data/source/bzs/env/crosscompile.h +8 -3
  53. data/source/bzs/example/connection_pool_c.cpp +1 -7
  54. data/source/bzs/example/useORM.cpp +585 -0
  55. data/source/bzs/rtl/exception.h +6 -0
  56. data/source/bzs/test/tdclatl/bench_tdclatl.js +12 -7
  57. data/source/bzs/test/tdclphp/transactd_Test.php +1845 -0
  58. data/source/bzs/test/tdclphp/transactd_blob_Test.php +325 -0
  59. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +183 -0
  60. data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +212 -0
  61. data/source/bzs/test/tdclrb/transactd_blob_spec.rb +332 -0
  62. data/source/bzs/test/tdclrb/transactd_spec.rb +256 -1
  63. data/source/bzs/test/trdclengn/test_blob.cpp +327 -0
  64. data/source/bzs/test/trdclengn/test_trdclengn.cpp +485 -5
  65. data/source/global/tdclatl/QueryBase.cpp +231 -0
  66. data/source/global/tdclatl/QueryBase.h +96 -0
  67. data/source/global/tdclatl/Table.cpp +24 -0
  68. data/source/global/tdclatl/Table.h +2 -1
  69. data/source/global/tdclatl/resource.h +0 -0
  70. data/source/global/tdclatl/tdclatl.idl +88 -2
  71. metadata +16 -3
  72. data/bin/common/tdclc_32_1_1.dll +0 -0
  73. data/bin/common/tdclc_64_1_1.dll +0 -0
@@ -262,6 +262,10 @@ extern "C" short_td __STDCALL
262
262
  client_t->req().paramMask = P_MASK_POSBLK|P_MASK_DATA
263
263
  |P_MASK_DATALEN|P_MASK_EX_SENDLEN;
264
264
  break;
265
+ case TD_KEY_SEEK_MULTI:
266
+ client_t->req().paramMask = P_MASK_POSBLK|P_MASK_DATA|P_MASK_KEYNUM
267
+ |P_MASK_DATALEN|P_MASK_EX_SENDLEN;
268
+ break;
265
269
  case TD_GETDIRECTORY:
266
270
  case TD_SETDIRECTORY:
267
271
  break;
@@ -83,11 +83,6 @@ void fieldDDF::writeRecordData()
83
83
  for (size_t i = strlen(datbuf.name); i < 20; i++)
84
84
  datbuf.name[i] = ' ';
85
85
 
86
- #ifdef DDF_PSQLV_MODE
87
- if (type == ft_logical)
88
- type = ft_uinteger;
89
-
90
- #endif
91
86
  datbuf.type = type;
92
87
  datbuf.pos = pos;
93
88
  datbuf.len = len;
@@ -87,10 +87,6 @@ void fileDDF::writeRecordData()
87
87
  strncpy(datbuf.filename, filename, 64);
88
88
  for (size_t i = strlen(datbuf.filename); i < 64; i++)
89
89
  datbuf.filename[i] = ' ';
90
- #ifdef DDF_PSQLV_MODE
91
- flag = 0;
92
-
93
- #endif
94
90
 
95
91
  datbuf.flag = flag;
96
92
  memset(datbuf.filler, 0, 9);
@@ -35,490 +35,6 @@ namespace tdap
35
35
  namespace client
36
36
  {
37
37
 
38
- inline ushort_td varlenForFilter(const fielddef& fd)
39
- {
40
- if (((fd.type >= ft_myvarchar) && (fd.type <= ft_mywvarbinary)) || fd.type == ft_lstring)
41
- return fd.len < 256 ? 1 : 2;
42
- else if ((fd.type == ft_myblob) || (fd.type == ft_mytext))
43
- return fd.len - 8;
44
- return 0;
45
- }
46
-
47
- /** Length of compare
48
- * if part of string or zstring then return strlen.
49
- */
50
- inline uint_td compDataLen(const fielddef& fd, const uchar_td* ptr, bool part)
51
- {
52
- uint_td length = fd.keyDataLen(ptr);
53
- if (part)
54
- {
55
- if ((fd.type == ft_string) || (fd.type == ft_zstring) || (fd.type == ft_note))
56
- length = (uint_td)strlen((const char*)ptr);
57
- else if ((fd.type == ft_wstring) || (fd.type == ft_wzstring))
58
- length = (uint_td)wcslen((const wchar_t*)ptr);
59
- }
60
- return length;
61
- }
62
-
63
- /** copy data for select comp
64
- */
65
- inline ushort_td copyForCompare(const fielddef& fd, uchar_td* to, const uchar_td* from, bool part)
66
- {
67
- ushort_td varlen = varlenForFilter(fd);
68
- int copylen = compDataLen(fd, from, part);
69
- if (varlen)
70
- memcpy(to, from, varlen);
71
- memcpy(to + varlen, fd.keyData(from), copylen);
72
- return copylen + varlen;
73
- }
74
-
75
- filter::filter(table* pBao)
76
- {
77
- m_pFilter = NULL;
78
- m_pEntendBuf = NULL;
79
- m_pEntendBuflen = 0;
80
-
81
- init(pBao);
82
-
83
- }
84
-
85
- void filter::init(table* pBao)
86
- {
87
- m_tb = pBao;
88
- strcpy(&m_PosType[0], "UC");
89
- m_RejectCount = 65000;
90
- m_iRecordCount = 1;
91
- m_iFieldCount = 1;
92
- memset(m_iFieldLen, 0, 255 * sizeof(ushort_td));
93
- memset(m_iFieldOffset, 0, 255 * sizeof(ushort_td));
94
- m_iFieldLen[0] = (ushort_td) m_tb->tableDef()->maxRecordLen;
95
- m_iFieldOffset[0] = 0;
96
- }
97
-
98
- filter::~filter()
99
- {
100
- if (m_pFilter != NULL)
101
- delete[]m_pFilter; ;
102
- if (m_pEntendBuf != NULL)
103
- free(m_pEntendBuf);
104
-
105
- }
106
-
107
- ushort_td filter::GetFieldLen(int index) {return m_iFieldLen[index];
108
-
109
- }
110
-
111
- ushort_td filter::GetFieldOffset(int index) {return m_iFieldOffset[index];}
112
-
113
- _TCHAR* filter::filterStr() {return m_pFilter;}
114
-
115
- bool filter::GetPosType()
116
- {
117
-
118
- if (strcmp(m_PosType, "UC") == 0)
119
- return false;
120
- else
121
- return true;
122
- }
123
-
124
- void filter::SetPosType(bool getnext)
125
- {
126
-
127
- if (getnext)
128
- strcpy(&m_PosType[0], "EG");
129
- else
130
- strcpy(&m_PosType[0], "UC");
131
- if (m_pEntendBuf)
132
- memcpy((void*)((char*)m_pEntendBuf + 2), &m_PosType[0], 2);
133
-
134
- }
135
-
136
- void filter::WriteBuffer() {memcpy(m_tb->dataBak(), m_pEntendBuf, m_pEntendBuflen);}
137
-
138
- bool filter::setFilter(const _TCHAR* str, ushort_td RejectCount, ushort_td CashCount)
139
- {
140
-
141
- _TCHAR* NewPointer;
142
-
143
- BFilter* itm;
144
- BFilter* Olditm = NULL;
145
-
146
- bool joint = false;
147
- bool cmpfield;
148
- ushort_td Oldlen;
149
- short OldfieldNum = -1;
150
- BFilterHeader* FilterHead;
151
- ushort_td LogicalCount = 0;
152
- BFilterDisc* disc;
153
-
154
- m_RejectCount = RejectCount;
155
- m_iRecordCount = CashCount;
156
-
157
- if (m_pFilter)
158
- delete[]m_pFilter;
159
- size_t size = _tcslen(str) + 2;
160
- m_pFilter = new _TCHAR[size];
161
- if (m_pFilter == NULL)
162
- return false;
163
- memset(m_pFilter, 0, size * sizeof(_TCHAR));
164
- _tcscpy(m_pFilter, str);
165
-
166
- int sDataBufSize = 8192;
167
- if (m_pEntendBuf == NULL)
168
- m_pEntendBuf = malloc(sDataBufSize);
169
- else
170
- memset(m_pEntendBuf, 0, sDataBufSize);
171
-
172
- if (m_pEntendBuf == NULL)
173
- return false;
174
-
175
- itm = (BFilter*)((char*)m_pEntendBuf + 8);
176
-
177
- NewPointer = m_pFilter;
178
-
179
- m_FieldSelected = false;
180
- if (m_pFilter[0] == '*')
181
- LogicalCount = 0;
182
- else
183
- {
184
-
185
- // -------------------------------------------------------------
186
- // SELECT
187
- if (_tcsstr(m_pFilter, _T("SELECT ")) == NewPointer)
188
- {
189
- if (!MakeFieldSelect(&NewPointer))
190
- return false;
191
- }
192
-
193
- while (1)
194
- {
195
- cmpfield = false;
196
-
197
- // -------------------------------------------------------------
198
- // Get filed number
199
- // -------------------------------------------------------------
200
- short fieldNum = GetField(&NewPointer);
201
- if (fieldNum == -1)
202
- break;
203
-
204
- LogicalCount++;
205
- fielddef* fd = &m_tb->tableDef()->fieldDefs[fieldNum];
206
- itm->Type = fd->type;
207
- itm->Len = fd->len;
208
- itm->Pos = fd->pos;
209
-
210
- // -------------------------------------------------------------
211
- // Get logical type
212
- // -------------------------------------------------------------
213
- itm->CompType = GetCompType(&NewPointer);
214
- if (itm->CompType == 255)
215
- return false;
216
-
217
- // -------------------------------------------------------------
218
- // Get compare value
219
- // if [fieldName] then comapre as field value
220
- // -------------------------------------------------------------
221
- _TCHAR* start = NewPointer;
222
- if (!GetCompStr(&NewPointer))
223
- return false;
224
- if (NewPointer == NULL)
225
- return false;
226
-
227
- int offset = 0;
228
- if (start[0] == '[')
229
- {
230
- start++;
231
- int num = m_tb->fieldNumByName(start);
232
- if (num != -1)
233
- {
234
- itm->Data = m_tb->tableDef()->fieldDefs[num].pos;
235
- itm->CompType |= CMPLOGICAL_FIELD;
236
- cmpfield = true;
237
- }
238
- }
239
- else
240
- {
241
-
242
- bool isPart = false;
243
- if (start[0] == '\'')
244
- {// string
245
- start++; // erase front '
246
- int len = (ushort_td) _tcslen(start);
247
- start[--len] = 0x00; // erase after '
248
- isPart = (start[len - 1] == '*');
249
- if (isPart)
250
- start[--len] = 0x00;
251
-
252
- }
253
- m_tb->setFV(fieldNum, start);
254
- itm->Len =
255
- copyForCompare(*fd, (uchar_td*)(&itm->Data),
256
- (const uchar_td*)m_tb->fieldPtr(fieldNum), isPart);
257
- if (!isPart && (fd->varLenBytes() || fd->blobLenBytes()))
258
- itm->CompType |= CMPLOGICAL_VAR_COMP_ALL; //match complate
259
- offset = itm->Len - 2;
260
- }
261
-
262
- // LogicalType
263
- itm->LogicalType = GetLogical(&NewPointer);
264
- // ------------------------------------------------------------
265
- // chain befor field
266
- // ------------------------------------------------------------
267
- Oldlen = fd->len;
268
-
269
- if ((joint == true) && (OldfieldNum + 1 == fieldNum) && (itm->CompType == 1) &&
270
- (cmpfield == false) && (itm->Len == fd->len) && (itm->Type != 11) &&
271
- (varlenForFilter(*fd) == 0))
272
- {
273
- Olditm->LogicalType = itm->LogicalType;
274
- Oldlen = itm->Len;
275
- memcpy((void*)((char*)(&Olditm->Data) + Olditm->Len), &itm->Data, itm->Len);
276
- Olditm->Len += Oldlen;
277
- Oldlen = Olditm->Len;
278
- itm = Olditm;
279
- itm->Type = 0; // comapre as string
280
-
281
- offset = itm->Len - 2;
282
- LogicalCount--;
283
- }
284
- if (itm->LogicalType != 0) // If zero then logical is end.
285
- {
286
- // ------------------------------------------------------------
287
- // Can it connect? not * and not zstring
288
- // ------------------------------------------------------------
289
- if ((itm->CompType == 1) && (itm->LogicalType == 1) && (cmpfield == false) &&
290
- (itm->Len == Oldlen) && (itm->Type != 11) && (varlenForFilter(*fd) == 0))
291
- joint = true;
292
- else
293
- joint = false;
294
- Olditm = itm;
295
- OldfieldNum = fieldNum;
296
- }
297
- // ------------------------------------------------------------
298
- // move pointer
299
- itm = (BFilter*)((char*)itm +sizeof(BFilter) + offset);
300
- }
301
- }
302
- _tcscpy(m_pFilter, str);
303
- // header
304
- FilterHead = (BFilterHeader*) m_pEntendBuf;
305
- FilterHead->BufLen = (ushort_td)((char*)itm - (char*)m_pEntendBuf + 4 + (m_iFieldCount * 4));
306
- memcpy(FilterHead->PosType, m_PosType, 2);
307
- FilterHead->RejectCount = m_RejectCount;
308
- FilterHead->LogicalCount = LogicalCount;
309
-
310
- // descipter
311
- disc = (BFilterDisc*)itm;
312
- disc->iRecordCount = m_iRecordCount;
313
- disc->iFieldCount = m_iFieldCount;
314
- int RecordSize = 0;
315
- for (int i = 0; i < m_iFieldCount; i++)
316
- {
317
- disc->iSelectFields[i].iFieldLen = m_iFieldLen[i];
318
- disc->iSelectFields[i].iFieldOffset = m_iFieldOffset[i];
319
- RecordSize += m_iFieldLen[i];
320
- }
321
- m_iRecordCountDirect = &disc->iRecordCount;
322
- m_pEntendBuflen = FilterHead->BufLen;
323
- if (disc->iRecordCount == 0)
324
- {
325
- disc->iRecordCount = (ushort_td)(57000 / (RecordSize + 6));
326
- }
327
- m_ExDataBufLen = (ushort_td)((disc->iRecordCount * (RecordSize + 6)) + 2);
328
-
329
- if ((ushort_td)m_ExDataBufLen < m_pEntendBuflen)
330
- m_ExDataBufLen = m_pEntendBuflen;
331
-
332
- uint_td len;
333
- if ((m_FieldSelected == false) && !m_tb->valiableFormatType())
334
- len = m_ExDataBufLen;
335
- else
336
- len = (uint_td)(m_ExDataBufLen + m_tb->buflen());
337
-
338
- if (m_tb->buflen() < len)
339
- {
340
- m_tb->setDataBak((void*) realloc(m_tb->dataBak(), len));
341
- m_tb->setData(m_tb->dataBak());
342
-
343
- if (m_tb->data() == NULL)
344
- return false;
345
-
346
- }
347
- return true;
348
- }
349
-
350
- bool filter::MakeFieldSelect(_TCHAR** str)
351
- {
352
- _TCHAR* p;
353
- _TCHAR* ret;
354
- _TCHAR* point[255];
355
- ushort_td index = 0;
356
- _TCHAR FiledName[20] = {0x00};
357
-
358
- m_iFieldCount = 0;
359
-
360
-
361
- *str += 7; // "select" length = 7
362
- point[index] = *str;
363
-
364
- ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str, (_TUCHAR*)_T(" "));
365
- if (ret == NULL)
366
- return false;
367
- ret[0] = 0x00; // set null
368
- *str = ret + 1;
369
-
370
- index++;
371
- p = (_TCHAR*)_tcsmstr((_TUCHAR*)point[index - 1], (_TUCHAR*)_T(",")) + 1;
372
- point[index] = p;
373
- p--;
374
- while (p)
375
- {
376
- index++;
377
- p = (_TCHAR*)_tcsmstr((_TUCHAR*)point[index - 1], (_TUCHAR*)_T(","));
378
- if (p)
379
- point[index] = p + 1;
380
- else
381
- break;
382
-
383
- }
384
- point[index] = ret + 1;
385
- size_t n;
386
- short FieldNum;
387
- for (int i = 0; i < index; i++)
388
- {
389
- n = point[i + 1] - point[i] - 1;
390
- _tcsncpy(FiledName, point[i], n);
391
- FiledName[n] = 0x00;
392
- FieldNum = m_tb->fieldNumByName(FiledName);
393
- if (FieldNum < 0)
394
- return false;
395
- m_iFieldLen[i] = m_tb->tableDef()->fieldDefs[FieldNum].len;
396
- m_iFieldOffset[i] = m_tb->tableDef()->fieldDefs[FieldNum].pos;
397
- }
398
- m_iFieldCount = index;
399
- m_FieldSelected = true;
400
-
401
- return true;
402
- }
403
-
404
- short filter::GetField(_TCHAR** str)
405
- {
406
- _TCHAR* ret;
407
- _TCHAR FiledName[20] = {0x00};
408
- int offset = 0;
409
- // Get string that until next space.
410
- if (*str[0] == '[')
411
- {
412
- offset = 1;
413
- ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str, (_TUCHAR*) _T("]"));
414
- }
415
- else
416
- ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str, (_TUCHAR*)_T(" "));
417
-
418
- if (ret)
419
- {
420
- _tcsncpy(FiledName, *str + offset, ret - *str - offset);
421
- *str = ret + 1 + offset;
422
- return m_tb->fieldNumByName(FiledName);
423
- }
424
- else
425
- return -1;
426
- }
427
-
428
- bool filter::GetCompStr(_TCHAR** str)
429
- {
430
- _TCHAR* ret;
431
- int offset = 0;
432
-
433
- // Get string that until next space.
434
- if (*str[0] == _T('['))
435
- {
436
- offset = 1;
437
- ret = _tcsstr(*str, _T("]"));
438
- if (!ret)
439
- return false;
440
- }
441
- else if (*str[0] == _T('\''))
442
- { // find next '
443
- ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str + 1, (_TUCHAR*)_T("\'"));
444
-
445
- if (ret)
446
- ret += 1;
447
- else
448
- return false;
449
- }
450
- else
451
- ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str, (_TUCHAR*)_T(" "));
452
-
453
- if (ret)
454
- {
455
- *ret = 0x00;
456
- *str = ret + 1 + offset;
457
-
458
- }
459
- return true;
460
- }
461
-
462
- uchar_td filter::GetLogical(_TCHAR** str)
463
- {
464
- _TCHAR* ret;
465
- _TCHAR LogicalStr[10] = {0x00};
466
-
467
- // Get string that until next space.
468
- ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str, (_TUCHAR*)_T(" "));
469
- if (ret)
470
- {
471
- _tcsncpy(LogicalStr, *str, ret - *str);
472
- _tcsmupr((_TUCHAR*)LogicalStr);
473
- *str = ret + 1;
474
- if (_tcscmp(LogicalStr, _T("AND")) == 0)
475
- return (uchar_td)1;
476
- else if (_tcscmp(LogicalStr, _T("OR")) == 0)
477
- return (uchar_td)2;
478
- else
479
- return 0;
480
- }
481
- else
482
- return 0;
483
- }
484
-
485
- uchar_td filter::GetCompType(_TCHAR** str)
486
- {
487
- _TCHAR* ret;
488
- _TCHAR cmpstr[10] = {0x00};
489
-
490
- // Get string that until next space.
491
- ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str, (_TUCHAR*)_T(" "));
492
- if (ret)
493
- {
494
- _tcsncpy(cmpstr, *str, ret - *str);
495
- *str = ret + 1;
496
- if (_tcscmp(cmpstr, _T("=")) == 0)
497
- return (uchar_td)1;
498
-
499
- if (_tcscmp(cmpstr, _T(">")) == 0)
500
- return (uchar_td)2;
501
-
502
- if (_tcscmp(cmpstr, _T("<")) == 0)
503
- return (uchar_td)3;
504
-
505
- if (_tcscmp(cmpstr, _T("<>")) == 0)
506
- return (uchar_td)4;
507
-
508
- if (_tcscmp(cmpstr, _T("=>")) == 0)
509
- return (uchar_td)5;
510
- if (_tcscmp(cmpstr, _T(">=")) == 0)
511
- return (uchar_td)5;
512
-
513
- if (_tcscmp(cmpstr, _T("=<")) == 0)
514
- return (uchar_td)6;
515
- if (_tcscmp(cmpstr, _T("<=")) == 0)
516
- return (uchar_td)6;
517
- return 255;
518
- }
519
- else
520
- return 255;
521
- }
522
38
 
523
39
  }// namespace client
524
40
  }// namespace tdap