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
@@ -100,6 +100,21 @@ def testCreateTable(db)
100
100
  fd.len = 33
101
101
  dbdef.updateTableDef(1)
102
102
  expect(dbdef.stat()).to eq 0
103
+
104
+ fd = dbdef.insertField(1, 2)
105
+ fd.setName('select')
106
+ fd.type = Transactd::Ft_integer
107
+ fd.len = 4
108
+ dbdef.updateTableDef(1)
109
+ expect(dbdef.stat()).to eq 0
110
+
111
+ fd = dbdef.insertField(1, 3)
112
+ fd.setName('in')
113
+ fd.type = Transactd::Ft_integer
114
+ fd.len = 4
115
+ dbdef.updateTableDef(1)
116
+ expect(dbdef.stat()).to eq 0
117
+
103
118
  kd = dbdef.insertKey(1,0)
104
119
  kd.segment(0).fieldNum = 0
105
120
  kd.segment(0).flags.bit8 = 1
@@ -191,6 +206,7 @@ def testFind(db)
191
206
  i = i - 1
192
207
  end
193
208
  # out of filter range (EOF)
209
+ tb.clearBuffer()
194
210
  v = TEST_COUNT
195
211
  tb.setFV(FDI_ID, v)
196
212
  tb.find(Transactd::Table::FindForword)
@@ -215,6 +231,79 @@ def testFindNext(db)
215
231
  tb.close()
216
232
  end
217
233
 
234
+ def testFindIn(db)
235
+ tb = testOpenTable(db)
236
+ tb.setKeyNum(0)
237
+ tb.clearBuffer()
238
+ q = Transactd::QueryBase.new()
239
+ q.addInValue('10', true)
240
+ q.addInValue('300000')
241
+ q.addInValue('50')
242
+ q.addInValue('-1')
243
+ q.addInValue('80')
244
+ q.addInValue('5000')
245
+
246
+ tb.setQuery(q)
247
+ expect(tb.stat()).to eq 0
248
+ tb.find()
249
+ expect(tb.stat()).to eq 0
250
+ expect(tb.getFVint(FDI_ID)).to eq 10
251
+ tb.findNext()
252
+ expect(tb.stat()).to eq Transactd::STATUS_NOT_FOUND_TI
253
+
254
+ msg = tb.keyValueDescription()
255
+ expect(msg).to eq "table:user\nstat:4\nid = 300000\n"
256
+
257
+ tb.findNext()
258
+ expect(tb.getFVint(FDI_ID)).to eq 50
259
+ tb.findNext()
260
+ expect(tb.stat()).to eq Transactd::STATUS_NOT_FOUND_TI
261
+
262
+ msg = tb.keyValueDescription()
263
+ expect(msg).to eq "table:user\nstat:4\nid = -1\n"
264
+
265
+ tb.findNext()
266
+ expect(tb.getFVint(FDI_ID)).to eq 80
267
+ tb.findNext()
268
+ expect(tb.getFVint(FDI_ID)).to eq 5000
269
+ tb.findNext()
270
+ expect(tb.stat()).to eq Transactd::STATUS_EOF
271
+
272
+ # Many params
273
+ q.addInValue('1', true)
274
+ 2.upto(10000) do |i|
275
+ q.addInValue(i.to_s)
276
+ end
277
+ tb.setQuery(q)
278
+ expect(tb.stat()).to eq 0
279
+
280
+ tb.find()
281
+ i = 0
282
+ while tb.stat() == 0 do
283
+ i = i + 1
284
+ expect(tb.getFVint(FDI_ID)).to eq i
285
+ tb.findNext(true)
286
+ end
287
+ expect(tb.stat()).to eq Transactd::STATUS_EOF
288
+ expect(i).to eq 10000
289
+
290
+ # LogicalCountLimit
291
+ q.select('id')
292
+ tb.setQuery(q)
293
+
294
+ tb.find()
295
+ i = 0
296
+ while tb.stat() == 0 do
297
+ i = i + 1
298
+ expect(tb.getFVint(FDI_ID)).to eq i
299
+ tb.findNext(true)
300
+ end
301
+ expect(tb.stat()).to eq Transactd::STATUS_EOF
302
+ expect(i).to eq 10000
303
+
304
+ tb.close()
305
+ end
306
+
218
307
  def testGetPercentage(db)
219
308
  tb = testOpenTable(db)
220
309
  tb.clearBuffer()
@@ -448,7 +537,7 @@ def testSnapShot(db)
448
537
  if ISOLATION_READ_COMMITTED
449
538
  expect(tb2.stat()).to eq 0
450
539
  elsif ISOLATION_REPEATABLE_READ
451
- expect(tb2.stat()).to eq STATUS_LOCK_ERROR
540
+ expect(tb2.stat()).to eq Transactd::STATUS_LOCK_ERROR
452
541
  end
453
542
  # ----------------------------------------------------
454
543
  tb.seekFirst()
@@ -1263,6 +1352,7 @@ def testCreateTableStringFilter(db, id, name, type, type2)
1263
1352
  end
1264
1353
 
1265
1354
  def doTestInsertStringFilter(tb)
1355
+ tb.beginBulkInsert(BULKBUFSIZE)
1266
1356
  tb.clearBuffer()
1267
1357
  id = 1
1268
1358
  tb.setFV('id', id)
@@ -1293,6 +1383,7 @@ def doTestInsertStringFilter(tb)
1293
1383
  tb.setFV('name', 'おめでとうございます。')
1294
1384
  tb.setFV('namew', 'おめでとうございます。')
1295
1385
  tb.insert()
1386
+ tb.commitBulkInsert()
1296
1387
  end
1297
1388
 
1298
1389
  def doTestReadStringFilter(tb)
@@ -1325,18 +1416,91 @@ end
1325
1416
  def doTestSetStringFilter(tb)
1326
1417
  tb.setKeyNum(0)
1327
1418
  tb.clearBuffer()
1419
+
1328
1420
  tb.setFilter("name = 'あい*'", 0, 10)
1421
+ expect(tb.stat()).to eq 0
1329
1422
  tb.seekFirst()
1423
+ expect(tb.stat()).to eq 0
1330
1424
  tb.findNext(false)
1331
1425
  expect(tb.stat()).to eq 0
1332
1426
  expect(tb.getFVstr(FDI_NAME)).to eq 'あいうえおかきくこ'
1333
1427
  expect(tb.recordCount()).to eq 2
1428
+
1334
1429
  tb.setFilter("name <> 'あい*'", 0, 10)
1335
1430
  expect(tb.recordCount()).to eq 3
1431
+ tb.clearBuffer()
1432
+ tb.seekFirst()
1433
+ expect(tb.stat()).to eq 0
1434
+ tb.findNext(false)
1435
+ expect(tb.stat()).to eq 0
1436
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'A123456'
1437
+
1438
+ tb.findNext()
1439
+ expect(tb.stat()).to eq 0
1440
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'おはようございます'
1441
+
1442
+ tb.findNext()
1443
+ expect(tb.stat()).to eq 0
1444
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'おめでとうございます。'
1445
+
1446
+ tb.findNext()
1447
+ expect(tb.stat()).to eq Transactd::STATUS_EOF
1448
+
1449
+ tb.clearBuffer()
1450
+ tb.seekLast()
1451
+ tb.findPrev(false)
1452
+ expect(tb.stat()).to eq 0
1453
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'おめでとうございます。'
1454
+
1455
+ tb.findPrev()
1456
+ expect(tb.stat()).to eq 0
1457
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'おはようございます'
1458
+
1459
+ tb.findPrev(false)
1460
+ expect(tb.stat()).to eq 0
1461
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'A123456'
1462
+
1463
+ tb.findPrev()
1464
+ expect(tb.stat()).to eq Transactd::STATUS_EOF
1465
+
1336
1466
  tb.setFilter("name = 'あい'", 0, 10)
1337
1467
  expect(tb.recordCount()).to eq 0
1468
+
1338
1469
  tb.setFilter("name <> ''", 0, 10)
1339
1470
  expect(tb.recordCount()).to eq 5
1471
+
1472
+ # testing that setFilter don't change field value
1473
+ tb.clearBuffer()
1474
+ tb.setFV('name', 'ABCDE')
1475
+ tb.setFilter("name = 'あい'", 0, 10)
1476
+ expect(tb.getFVstr(FDI_NAME)).to eq 'ABCDE'
1477
+ end
1478
+
1479
+ def doTestUpdateStringFilter(tb)
1480
+ tb.setKeyNum(0)
1481
+ tb.clearBuffer()
1482
+ tb.seekFirst()
1483
+ expect(tb.stat()).to eq 0
1484
+ tb.setFV('name', 'ABCDE')
1485
+ tb.setFV('namew', 'ABCDEW')
1486
+ tb.update()
1487
+ expect(tb.stat()).to eq 0
1488
+ tb.seekNext()
1489
+ expect(tb.stat()).to eq 0
1490
+
1491
+ tb.setFV('name', 'ABCDE2')
1492
+ tb.setFV('namew', 'ABCDEW2')
1493
+ tb.update()
1494
+ expect(tb.stat()).to eq 0
1495
+
1496
+ tb.seekFirst()
1497
+ expect(tb.stat()).to eq 0
1498
+ expect(tb.getFVstr(FDI_NAME)).to eq 'ABCDE'
1499
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'ABCDEW'
1500
+ tb.seekNext()
1501
+ expect(tb.stat()).to eq 0
1502
+ expect(tb.getFVstr(FDI_NAME)).to eq 'ABCDE2'
1503
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'ABCDEW2'
1340
1504
  end
1341
1505
 
1342
1506
  def doTestStringFilter(db, id, name, type, type2)
@@ -1346,6 +1510,7 @@ def doTestStringFilter(db, id, name, type, type2)
1346
1510
  doTestInsertStringFilter(tb)
1347
1511
  doTestReadStringFilter(tb)
1348
1512
  doTestSetStringFilter(tb)
1513
+ doTestUpdateStringFilter(tb)
1349
1514
  tb.close()
1350
1515
  end
1351
1516
 
@@ -1374,6 +1539,90 @@ def testDropDatabaseStringFilter(db)
1374
1539
  expect(db.stat()).to eq 0
1375
1540
  end
1376
1541
 
1542
+ def testQuery()
1543
+ q = Transactd::QueryBase.new()
1544
+ q.queryString("id = 0 and name = 'Abc efg'")
1545
+ expect(q.toString()).to eq "id = '0' and name = 'Abc efg'"
1546
+
1547
+ q.queryString('')
1548
+ q.where('id', '=', '0').andWhere('name', '=', 'Abc efg')
1549
+ expect(q.toString()).to eq "id = '0' and name = 'Abc efg'"
1550
+
1551
+ q.queryString("select id,name id = 0 AND name = 'Abc&' efg'")
1552
+ expect(q.toString()).to eq "select id,name id = '0' AND name = 'Abc&' efg'"
1553
+
1554
+ q.queryString('')
1555
+ q.select('id', 'name').where('id', '=', '0').andWhere('name', '=', "Abc' efg")
1556
+ expect(q.toString()).to eq "select id,name id = '0' and name = 'Abc&' efg'"
1557
+
1558
+ q.queryString("select id,name id = 0 AND name = 'Abc&& efg'")
1559
+ expect(q.toString()).to eq "select id,name id = '0' AND name = 'Abc&& efg'"
1560
+
1561
+ q.queryString('')
1562
+ q.select('id', 'name').where('id', '=', '0').andWhere('name', '=', 'Abc& efg')
1563
+ expect(q.toString()).to eq "select id,name id = '0' and name = 'Abc&& efg'"
1564
+
1565
+ q.queryString('*')
1566
+ expect(q.toString()).to eq '*'
1567
+
1568
+ q.all()
1569
+ expect(q.toString()).to eq '*'
1570
+
1571
+ q.queryString('Select id,name id = 2')
1572
+ expect(q.toString()).to eq "select id,name id = '2'"
1573
+
1574
+ q.queryString('')
1575
+ q.select('id', 'name').where('id', '=', '2')
1576
+ expect(q.toString()).to eq "select id,name id = '2'"
1577
+
1578
+ q.queryString('SELECT id,name,fc id = 2')
1579
+ expect(q.toString()).to eq "select id,name,fc id = '2'"
1580
+
1581
+ q.queryString('')
1582
+ q.select('id', 'name', 'fc').where('id', '=', '2')
1583
+ expect(q.toString()).to eq "select id,name,fc id = '2'"
1584
+
1585
+ q.queryString("select id,name,fc id = 2 and name = '3'")
1586
+ expect(q.toString()).to eq "select id,name,fc id = '2' and name = '3'"
1587
+
1588
+ q.queryString('')
1589
+ q.select('id', 'name', 'fc').where('id', '=', '2').andWhere('name', '=', '3')
1590
+ expect(q.toString()).to eq "select id,name,fc id = '2' and name = '3'"
1591
+
1592
+ # IN include
1593
+ q.queryString("select id,name,fc IN '1','2','3'")
1594
+ expect(q.toString()).to eq "select id,name,fc in '1','2','3'"
1595
+
1596
+ q.queryString('')
1597
+ q.select('id', 'name', 'fc').In('1', '2', '3')
1598
+ expect(q.toString()).to eq "select id,name,fc in '1','2','3'"
1599
+
1600
+ q.queryString("IN '1','2','3'")
1601
+ expect(q.toString()).to eq "in '1','2','3'"
1602
+
1603
+ q.queryString('IN 1,2,3')
1604
+ expect(q.toString()).to eq "in '1','2','3'"
1605
+
1606
+ q.queryString('')
1607
+ q.In('1', '2', '3')
1608
+ expect(q.toString()).to eq "in '1','2','3'"
1609
+
1610
+ # special field name
1611
+ q.queryString('select = 1')
1612
+ expect(q.toString()).to eq "select = '1'"
1613
+
1614
+ q.queryString('')
1615
+ q.where('select', '=', '1')
1616
+ expect(q.toString()).to eq "select = '1'"
1617
+
1618
+ q.queryString('in <> 1')
1619
+ expect(q.toString()).to eq "in <> '1'"
1620
+
1621
+ q.queryString('')
1622
+ q.where('in', '<>', '1')
1623
+ expect(q.toString()).to eq "in <> '1'"
1624
+ end
1625
+
1377
1626
 
1378
1627
  describe Transactd do
1379
1628
  before :each do
@@ -1405,6 +1654,9 @@ describe Transactd do
1405
1654
  it 'findNext' do
1406
1655
  testFindNext(@db)
1407
1656
  end
1657
+ it 'findIn' do
1658
+ testFindIn(@db)
1659
+ end
1408
1660
  it 'get percentage' do
1409
1661
  testGetPercentage(@db)
1410
1662
  end
@@ -1465,6 +1717,9 @@ describe Transactd do
1465
1717
  it 'login' do
1466
1718
  testLogin(@db)
1467
1719
  end
1720
+ it 'query' do
1721
+ testQuery()
1722
+ end
1468
1723
  end
1469
1724
 
1470
1725
  describe Transactd, 'var tables' do
@@ -0,0 +1,327 @@
1
+ #include <boost/test/included/unit_test.hpp>
2
+ #include <bzs/db/protocol/tdap/client/database.h>
3
+ #include <bzs/db/protocol/tdap/client/table.h>
4
+ #include <bzs/db/protocol/tdap/client/dbDef.h>
5
+ #include <bzs/db/protocol/tdap/mysql/characterset.h>
6
+ #include <bzs/db/protocol/tdap/tdapcapi.h>
7
+ #include <bzs/db/protocol/tdap/client/stringConverter.h>
8
+ #include <stdio.h>
9
+ #include <bzs/db/protocol/tdap/client/filter.h>
10
+
11
+ using namespace bzs::db::protocol::tdap::client;
12
+ using namespace bzs::db::protocol::tdap;
13
+ using namespace std;
14
+ #define ISOLATION_READ_COMMITTED
15
+
16
+ #define URL _T("tdap://localhost/testString?dbfile=test.bdf")
17
+ #define TABLE_NAME _T("comments")
18
+ #define TABLE_ID 1
19
+
20
+ #define FDN_ID _T("id")
21
+ #define FDN_USER _T("user_id")
22
+ #define FDN_BODY _T("body")
23
+ #define FDN_IMAGE _T("image")
24
+ #define FDI_ID (short)0
25
+ #define FDI_USER (short)1
26
+ #define FDI_BODY (short)2
27
+ #define FDI_IMAGE (short)3
28
+
29
+ boost::unit_test::test_suite* init_unit_test_suite(int argc, char* argv[]);
30
+
31
+ boost::unit_test::test_suite* init_unit_test_suite(int argc, char* argv[])
32
+ {
33
+ return 0;
34
+ }
35
+
36
+ class fixture
37
+ {
38
+ mutable database* m_db;
39
+
40
+ public:
41
+ fixture() : m_db(NULL)
42
+ {
43
+ m_db = database::create();
44
+ if (!m_db)
45
+ printf("Error database::create()\n");
46
+ }
47
+
48
+ ~fixture()
49
+ {
50
+ if (m_db)
51
+ database::destroy(m_db);
52
+ }
53
+
54
+ ::database* db() const {return m_db;}
55
+ };
56
+
57
+ // ------------------------------------------------------------------------
58
+
59
+ void doInsertStringFileter(table* tb)
60
+ {
61
+ tb->clearBuffer();
62
+ tb->setFV(FDI_USER, 1);
63
+ tb->setFV(FDI_BODY, _T("1\ntest\nテスト\n\nあいうえおあいうえおb"));
64
+ tb->setFV(FDI_IMAGE, _T("1\ntest\nテスト\n\nあいうえおあいうえおi"));
65
+ tb->insert();
66
+
67
+ tb->clearBuffer();
68
+ tb->setFV(FDI_USER, 1);
69
+ tb->setFV(FDI_BODY, _T("2\ntest\nテスト\n\nあいうえおあいうえおb"));
70
+ tb->setFV(FDI_IMAGE, _T("2\ntest\nテスト\n\nあいうえおあいうえおi"));
71
+ tb->insert();
72
+
73
+ tb->clearBuffer();
74
+ tb->setFV(FDI_USER, 2);
75
+ tb->setFV(FDI_BODY, _T("3\ntest\nテスト\n\nあいうえおあいうえおb"));
76
+ tb->setFV(FDI_IMAGE, _T("3\ntest\nテスト\n\nあいうえおあいうえおi"));
77
+ tb->insert();
78
+ }
79
+
80
+ void doTestSeek(table* tb)
81
+ {
82
+ uint_td dummy = 0;
83
+ // 1
84
+ tb->clearBuffer();
85
+ tb->setFV(FDI_ID, 1);
86
+ tb->seek();
87
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestSeek - stat 1");
88
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 1, "doTestSeek - id 1");
89
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 1, "doTestSeek - user_id 1");
90
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
91
+ _tstring(_T("1\ntest\nテスト\n\nあいうえおあいうえお")), "doTestSeek - body 1");
92
+ // 2
93
+ tb->seekNext();
94
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestSeek - stat 2");
95
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 2, "doTestSeek - id 2");
96
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 1, "doTestSeek - user_id 2");
97
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
98
+ _tstring(_T("2\ntest\nテスト\n\nあいうえおあいうえお")), "doTestSeek - body 2");
99
+ // 3
100
+ tb->seekNext();
101
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestSeek - stat 3");
102
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 3, "doTestSeek - id 3");
103
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 2, "doTestSeek - user_id 3");
104
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
105
+ _tstring(_T("3\ntest\nテスト\n\nあいうえおあいうえお")), "doTestSeek - body 3");
106
+ // 2
107
+ tb->seekPrev();
108
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestSeek - stat 2");
109
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 2, "doTestSeek - id 2");
110
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 1, "doTestSeek - user_id 2");
111
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
112
+ _tstring(_T("2\ntest\nテスト\n\nあいうえおあいうえお")), "doTestSeek - body 2");
113
+ }
114
+
115
+ void doTestFind(table* tb)
116
+ {
117
+ tb->setKeyNum(0);
118
+ tb->clearBuffer();
119
+
120
+ tb->setFilter(_T("id >= 1 and id < 3"), 1, 0);
121
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestFind - setFilter");
122
+
123
+ tb->setFV(FDI_ID, 1);
124
+ tb->find(table::findForword);
125
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestFind - find");
126
+ BOOST_CHECK_MESSAGE(1 == tb->getFVint(FDI_ID), "doTestFind - getFVint 1");
127
+
128
+ tb->findNext(true);
129
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestFind - findNext");
130
+ BOOST_CHECK_MESSAGE(2 == tb->getFVint(FDI_ID), "doTestFind - getFVint 2");
131
+ BOOST_CHECK_MESSAGE(
132
+ _tstring(_T("2\ntest\nテスト\n\nあいうえおあいうえおb")) == _tstring(tb->getFVstr(FDI_BODY)),
133
+ "doTestFind - getFVstr 2");
134
+ tb->findNext(true);
135
+ BOOST_CHECK_MESSAGE(9 == tb->stat(), "doTestFind - findNext");
136
+ // 2
137
+ tb->findPrev(true);
138
+ BOOST_CHECK_MESSAGE(tb->stat() == STATUS_PROGRAM_ERROR, "doTestFind - findPrev");
139
+ }
140
+
141
+ void doTestUpdate(table* tb)
142
+ {
143
+ // select 1
144
+ tb->clearBuffer();
145
+ tb->setFV(FDI_ID, 1);
146
+ tb->seek();
147
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - stat 1");
148
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 1, "doTestUpdate - id 1");
149
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 1, "doTestUpdate - user_id 1");
150
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
151
+ _tstring(_T("1\ntest\nテスト\n\nあいうえおあいうえお")), "doTestUpdate - body 1");
152
+ // update
153
+ tb->setFV(FDI_USER, 11);
154
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - setFV stat 1");
155
+ tb->setFV(FDI_BODY, "1\nテスト\ntest\n\nABCDEFG");
156
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - setFV stat 1");
157
+ tb->update();
158
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - update stat 1");
159
+ // select 2
160
+ tb->seekNext();
161
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - stat 2");
162
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 2, "doTestUpdate - id 2");
163
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 1, "doTestUpdate - user_id 2");
164
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
165
+ _tstring(_T("2\ntest\nテスト\n\nあいうえおあいうえお")), "doTestUpdate - body 2");
166
+ // update
167
+ tb->setFV(FDI_USER, 12);
168
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - setFV stat 2");
169
+ tb->setFV(FDI_BODY, "2\nテスト\ntest\n\nABCDEFG");
170
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - setFV stat 2");
171
+ tb->update();
172
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - update stat 2");
173
+ // check 1
174
+ tb->seekPrev();
175
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - stat 2 1");
176
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 1, "doTestUpdate - id 2 1");
177
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 11, "doTestUpdate - user_id 2 1");
178
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
179
+ _tstring(_T("1\nテスト\ntest\n\nABCDEFG")), "doTestUpdate - body 2 1");
180
+ // check 2
181
+ tb->seekNext();
182
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - stat 2 2");
183
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 2, "doTestUpdate - id 2 2");
184
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 12, "doTestUpdate - user_id 2 2");
185
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
186
+ _tstring(_T("2\nテスト\ntest\n\nABCDEFG")), "doTestUpdate - body 2 2");
187
+ }
188
+
189
+ void doTestDelete(table* tb)
190
+ {
191
+ // delete 2
192
+ tb->clearBuffer();
193
+ tb->setFV(FDI_ID, 2);
194
+ tb->seek();
195
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestDelete - seek 2");
196
+ tb->del();
197
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestDelete - delete 2");
198
+ // select 1
199
+ tb->clearBuffer();
200
+ tb->setFV(FDI_ID, 1);
201
+ tb->seek();
202
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestDelete - stat 1");
203
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 1, "doTestDelete - id 1");
204
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 11, "doTestDelete - user_id 1");
205
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
206
+ _tstring(_T("1\nテスト\ntest\n\nABCDEFG")), "doTestDelete - body 1");
207
+ // next is 3
208
+ tb->seekNext();
209
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestDelete - stat 3");
210
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 3, "doTestDelete - id 3");
211
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 2, "doTestDelete - user_id 3");
212
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
213
+ _tstring(_T("3\ntest\nテスト\n\nあいうえおあいうえお")), "doTestDelete - body 3");
214
+ // eof
215
+ tb->seekNext();
216
+ BOOST_CHECK_MESSAGE(tb->stat() == STATUS_EOF, "doTestDelete - eof 3");
217
+ }
218
+
219
+ void createDatabase(database* db)
220
+ {
221
+ db->create(URL);
222
+ if (db->stat() == STATUS_TABLE_EXISTS_ERROR)
223
+ {
224
+ db->open(URL, 0, 0);
225
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "createNewDataBase 1");
226
+ db->drop();
227
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "drop stat=" << db->stat());
228
+ db->create(URL);
229
+ }
230
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "createNewDataBase");
231
+ }
232
+
233
+ void createTable(database* db)
234
+ {
235
+ // create table
236
+ dbdef* def = db->dbDef();
237
+ tabledef td;
238
+ memset(&td, 0, sizeof(td));
239
+ td.setTableName(TABLE_NAME);
240
+ _TCHAR buf[267];
241
+ _tcscpy_s(buf, 100, TABLE_NAME);
242
+ _tcscat_s(buf, 100, _T(".dat"));
243
+ td.setFileName(buf);
244
+ td.id = TABLE_ID;
245
+ td.primaryKeyNum = -1;
246
+ td.parentKeyNum = -1;
247
+ td.replicaKeyNum = -1;
248
+ td.pageSize = 2048;
249
+ td.charsetIndex = CHARSET_UTF8B4;
250
+
251
+ def->insertTable(&td);
252
+ BOOST_CHECK_MESSAGE(0 == def->stat(), "insertTable stat = " << def->stat());
253
+
254
+ fielddef* fd = def->insertField(TABLE_ID, FDI_ID);
255
+ fd->setName(FDN_ID);
256
+ fd->type = ft_autoinc;
257
+ fd->len = (ushort_td)4;
258
+ def->updateTableDef(TABLE_ID);
259
+ BOOST_CHECK_MESSAGE(0 == def->stat(), "updateTableDef 1 stat = " << def->stat());
260
+
261
+ fd = def->insertField(TABLE_ID, FDI_USER);
262
+ fd->setName(FDN_USER);
263
+ fd->type = ft_integer;
264
+ fd->len = (ushort_td)4;
265
+ def->updateTableDef(TABLE_ID);
266
+ BOOST_CHECK_MESSAGE(0 == def->stat(), "updateTableDef 1 stat = " << def->stat());
267
+
268
+ fd = def->insertField(TABLE_ID, FDI_BODY);
269
+ fd->setName(FDN_BODY);
270
+ fd->type = ft_mytext;
271
+ fd->len = 10;
272
+ def->updateTableDef(TABLE_ID);
273
+ BOOST_CHECK_MESSAGE(0 == def->stat(), "updateTableDef 2 stat = " << def->stat());
274
+
275
+ fd = def->insertField(TABLE_ID, FDI_IMAGE);
276
+ fd->setName(FDN_IMAGE);
277
+ fd->type = ft_myblob;
278
+ fd->len = 10;
279
+ def->updateTableDef(TABLE_ID);
280
+ BOOST_CHECK_MESSAGE(0 == def->stat(), "updateTableDef 3");
281
+
282
+ keydef* kd = def->insertKey(TABLE_ID, 0);
283
+ kd->segments[0].fieldNum = 0;
284
+ kd->segments[0].flags.bit8 = 1; // extended key type
285
+ kd->segments[0].flags.bit1 = 1; // changeable
286
+ kd->segmentCount = 1;
287
+ def->updateTableDef(TABLE_ID);
288
+ BOOST_CHECK_MESSAGE(0 == def->stat(), "updateTableDef 4");
289
+ }
290
+
291
+ void testStringFileter(database* db)
292
+ {
293
+ createDatabase(db);
294
+
295
+ db->open(URL, 0, 0);
296
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "createNewDataBase 1 stat = " << db->stat());
297
+
298
+ createTable(db);
299
+
300
+ table* tb = db->openTable(TABLE_ID);
301
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "openTable");
302
+
303
+ doInsertStringFileter(tb);
304
+ doTestSeek(tb);
305
+ doTestFind(tb);
306
+ doTestUpdate(tb);
307
+ doTestDelete(tb);
308
+
309
+ tb->release();
310
+
311
+ db->close();
312
+
313
+ db->open(URL, 0, 0);
314
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "drop 1");
315
+ db->drop();
316
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "drop stat=" << db->stat());
317
+ }
318
+
319
+
320
+ // ------------------------------------------------------------------------
321
+ BOOST_AUTO_TEST_SUITE(filter)
322
+
323
+ BOOST_FIXTURE_TEST_CASE(stringFileter, fixture) {testStringFileter(db());}
324
+
325
+ BOOST_AUTO_TEST_SUITE_END()
326
+ // ------------------------------------------------------------------------
327
+