transactd 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/BUILD_UNIX-JA +6 -6
  3. data/README +20 -18
  4. data/README-JA +19 -17
  5. data/RELEASE_NOTE +144 -0
  6. data/RELEASE_NOTE-JA +153 -0
  7. data/bin/common/tdclc_32_2_3.dll +0 -0
  8. data/bin/common/tdclc_64_2_3.dll +0 -0
  9. data/build/common/get_ruby_path.cmake +1 -1
  10. data/build/swig/ruby/ruby.swg +10 -9
  11. data/build/swig/ruby/tdclrb_wrap.cpp +1416 -561
  12. data/build/swig/tdcl.i +30 -3
  13. data/build/tdclc/tdclc.cbproj +1 -1
  14. data/build/tdclc/tdclc.rc +4 -4
  15. data/build/tdclcpp/BUILDNUMBER.txt +1 -0
  16. data/build/tdclcpp/tdclcpp.rc +4 -4
  17. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  18. data/build/tdclrb/BUILDNUMBER.txt +1 -0
  19. data/build/tdclrb/tdclrb.rc +4 -4
  20. data/source/bzs/db/engine/mysql/database.cpp +85 -41
  21. data/source/bzs/db/engine/mysql/database.h +35 -5
  22. data/source/bzs/db/engine/mysql/mysqlInternal.h +189 -37
  23. data/source/bzs/db/engine/mysql/mysqlThd.cpp +21 -21
  24. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +11 -0
  25. data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
  26. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +11 -4
  27. data/source/bzs/db/protocol/tdap/client/client.h +30 -1
  28. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +2 -1
  29. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +35 -5
  30. data/source/bzs/db/protocol/tdap/client/field.cpp +100 -51
  31. data/source/bzs/db/protocol/tdap/client/field.h +7 -7
  32. data/source/bzs/db/protocol/tdap/client/filter.h +20 -6
  33. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +337 -58
  34. data/source/bzs/db/protocol/tdap/client/groupQuery.h +56 -13
  35. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +83 -5
  36. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
  37. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -2
  38. data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
  39. data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +20 -6
  40. data/source/bzs/db/protocol/tdap/client/recordset.cpp +7 -0
  41. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +8 -4
  42. data/source/bzs/db/protocol/tdap/client/request.h +11 -1
  43. data/source/bzs/db/protocol/tdap/client/serializer.cpp +40 -2
  44. data/source/bzs/db/protocol/tdap/client/serializer.h +4 -2
  45. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +1 -0
  46. data/source/bzs/db/protocol/tdap/client/stringConverter.h +4 -4
  47. data/source/bzs/db/protocol/tdap/client/table.cpp +124 -71
  48. data/source/bzs/db/protocol/tdap/client/table.h +8 -7
  49. data/source/bzs/db/protocol/tdap/client/trdormapi.h +33 -1
  50. data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
  51. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +3 -1
  52. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +20 -4
  53. data/source/bzs/db/protocol/tdap/mysql/request.h +14 -0
  54. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +132 -69
  55. data/source/bzs/db/protocol/tdap/tdapRequest.h +18 -4
  56. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +32 -22
  57. data/source/bzs/db/protocol/tdap/tdapSchema.h +69 -4
  58. data/source/bzs/db/protocol/tdap/tdapcapi.h +13 -5
  59. data/source/bzs/db/protocol/tdap/uri.h +4 -4
  60. data/source/bzs/db/transactd/transactd.cpp +6 -5
  61. data/source/bzs/env/crosscompile.cpp +17 -0
  62. data/source/bzs/env/crosscompile.h +4 -1
  63. data/source/bzs/env/mbcswchrLinux.cpp +3 -0
  64. data/source/bzs/example/deleteRecords.cpp +13 -0
  65. data/source/bzs/example/deleteRecords_c.cpp +8 -1
  66. data/source/bzs/example/insertRecords.cpp +14 -0
  67. data/source/bzs/example/insertRecords_c.cpp +8 -1
  68. data/source/bzs/example/ormap_c.cpp +8 -1
  69. data/source/bzs/example/queryData.cpp +92 -2
  70. data/source/bzs/example/queryData.h +3 -1
  71. data/source/bzs/example/readRecords.cpp +13 -0
  72. data/source/bzs/example/readRecords_c.cpp +8 -1
  73. data/source/bzs/example/updateRecords.cpp +13 -0
  74. data/source/bzs/example/updateRecords_c.cpp +8 -1
  75. data/source/bzs/example/update_with_transaction.cpp +13 -0
  76. data/source/bzs/example/update_with_transaction_c.cpp +8 -1
  77. data/source/bzs/example/useORMRecord.cpp +9 -3
  78. data/source/bzs/netsvc/client/iconnection.h +8 -0
  79. data/source/bzs/netsvc/client/tcpClient.cpp +61 -16
  80. data/source/bzs/netsvc/client/tcpClient.h +430 -214
  81. data/source/bzs/netsvc/server/serverPipe.cpp +2 -2
  82. data/source/bzs/test/tdclphp/transactd_Test.php +115 -19
  83. data/source/bzs/test/tdclphp/transactd_blob_Test.php +33 -5
  84. data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +21 -3
  85. data/source/bzs/test/tdclphp/transactd_pool_Test.php +17 -3
  86. data/source/bzs/test/tdclrb/transactd_blob_spec.rb +26 -8
  87. data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +13 -6
  88. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +14 -8
  89. data/source/bzs/test/tdclrb/transactd_spec.rb +117 -27
  90. data/source/bzs/test/transactdBench/scaling_bench.cpp +5 -5
  91. data/source/bzs/test/transactdBench/workerBase.h +2 -2
  92. data/source/bzs/test/trdclengn/test_trdclengn.cpp +898 -51
  93. data/source/global/tdclatl/Database.cpp +12 -0
  94. data/source/global/tdclatl/Database.h +4 -0
  95. data/source/global/tdclatl/FieldDef.cpp +19 -0
  96. data/source/global/tdclatl/FieldDef.h +4 -0
  97. data/source/global/tdclatl/FieldDefs.cpp +14 -16
  98. data/source/global/tdclatl/GroupQuery.cpp +21 -16
  99. data/source/global/tdclatl/GroupQuery.h +1 -1
  100. data/source/global/tdclatl/QueryBase.cpp +14 -0
  101. data/source/global/tdclatl/QueryBase.h +2 -0
  102. data/source/global/tdclatl/Record.cpp +41 -10
  103. data/source/global/tdclatl/Record.h +1 -1
  104. data/source/global/tdclatl/Recordset.cpp +117 -31
  105. data/source/global/tdclatl/Recordset.h +6 -5
  106. data/source/global/tdclatl/Table.cpp +24 -28
  107. data/source/global/tdclatl/Table.h +3 -4
  108. data/source/global/tdclatl/activeTable.cpp +149 -103
  109. data/source/global/tdclatl/activeTable.h +1 -1
  110. data/source/global/tdclatl/tdclatl.idl +38 -18
  111. data/transactd.gemspec +1 -1
  112. metadata +8 -4
  113. data/bin/common/tdclc_32_2_2.dll +0 -0
  114. data/bin/common/tdclc_64_2_2.dll +0 -0
@@ -23,16 +23,24 @@ require 'transactd'
23
23
  require 'rbconfig'
24
24
  IS_WINDOWS = (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)
25
25
 
26
+ def getEnv(valuename)
27
+ return ENV[valuename] if ENV[valuename] != nil
28
+ return ''
29
+ end
30
+
26
31
  def getHost()
27
- hostname = 'localhost/'
28
- if (ENV['TRANSACTD_RSPEC_HOST'] != nil && ENV['TRANSACTD_RSPEC_HOST'] != '')
29
- hostname = ENV['TRANSACTD_RSPEC_HOST']
30
- end
32
+ hostname = getEnv('TRANSACTD_RSPEC_HOST')
33
+ hostname = '127.0.0.1/' if hostname == ''
31
34
  hostname = hostname + '/' unless (hostname =~ /\/$/)
32
35
  return hostname
33
36
  end
34
37
 
35
38
  HOSTNAME = getHost()
39
+ USERNAME = getEnv('TRANSACTD_RSPEC_USER')
40
+ USERPART = USERNAME == '' ? '' : USERNAME + '@'
41
+ PASSWORD = getEnv('TRANSACTD_RSPEC_PASS')
42
+ PASSPART = PASSWORD == '' ? '' : '&pwd=' + PASSWORD
43
+ PASSPART2 = PASSWORD == '' ? '' : '?pwd=' + PASSWORD
36
44
  DBNAME = 'test'
37
45
  DBNAME_VAR = 'testvar'
38
46
  DBNAME_SF = 'testString'
@@ -40,10 +48,12 @@ DBNAME_QT = 'querytest'
40
48
  TABLENAME = 'user'
41
49
  PROTOCOL = 'tdap://'
42
50
  BDFNAME = '?dbfile=test.bdf'
43
- URL = PROTOCOL + HOSTNAME + DBNAME + BDFNAME
44
- URL_VAR = PROTOCOL + HOSTNAME + DBNAME_VAR + BDFNAME
45
- URL_SF = PROTOCOL + HOSTNAME + DBNAME_SF + BDFNAME
46
- URL_QT = PROTOCOL + HOSTNAME + DBNAME_QT + BDFNAME
51
+ URL = PROTOCOL + USERPART + HOSTNAME + DBNAME + BDFNAME + PASSPART
52
+ URL_VAR = PROTOCOL + USERPART + HOSTNAME + DBNAME_VAR + BDFNAME + PASSPART
53
+ URL_SF = PROTOCOL + USERPART + HOSTNAME + DBNAME_SF + BDFNAME + PASSPART
54
+ URL_QT = PROTOCOL + USERPART + HOSTNAME + DBNAME_QT + BDFNAME + PASSPART
55
+ URL_HOST = PROTOCOL + USERPART + HOSTNAME + PASSPART2
56
+ URL_DB = PROTOCOL + USERPART + HOSTNAME + DBNAME + PASSPART2
47
57
  FDI_ID = 0
48
58
  FDI_NAME = 1
49
59
  FDI_GROUP = 2
@@ -97,8 +107,18 @@ def testCreateTable(db)
97
107
 
98
108
  fd = dbdef.insertField(1, 1)
99
109
  fd.setName('name')
100
- fd.type = Transactd::Ft_zstring
101
110
  fd.len = 33
111
+
112
+ #test padChar
113
+ fd.type = Transactd::Ft_string
114
+ fd.setPadCharSettings(true, false)
115
+ expect(fd.usePadChar()).to eq true;
116
+ expect(fd.trimPadChar()).to eq false;
117
+ fd.setPadCharSettings(false, true)
118
+ expect(fd.usePadChar()).to eq false;
119
+ expect(fd.trimPadChar()).to eq true;
120
+
121
+ fd.type = Transactd::Ft_zstring
102
122
  dbdef.updateTableDef(1)
103
123
  expect(dbdef.stat()).to eq 0
104
124
 
@@ -183,7 +203,7 @@ end
183
203
 
184
204
  def testVersion()
185
205
  db = Transactd::Database.new()
186
- db.connect(PROTOCOL + HOSTNAME)
206
+ db.connect(URL_HOST)
187
207
  expect(db.stat()).to eq 0
188
208
  vv = Transactd::BtrVersions.new()
189
209
  db.getBtrVersion(vv)
@@ -623,7 +643,7 @@ def testSnapshot()
623
643
  expect(db.stat()).to eq 0
624
644
  expect(tbg).not_to be nil
625
645
  db2 = Transactd::Database.new()
626
- db2.connect(PROTOCOL + HOSTNAME + DBNAME , true)
646
+ db2.connect(URL_DB, true)
627
647
  expect(db2.stat()).to eq 0
628
648
  tb2 = testOpenTable(db2)
629
649
  expect(tb2).not_to be nil
@@ -753,7 +773,7 @@ def testTransactionLockRepeatable()
753
773
  tb = testOpenTable(db)
754
774
  expect(tb).not_to be nil
755
775
  db2 = Transactd::Database.new()
756
- db2.connect(PROTOCOL + HOSTNAME + DBNAME, true)
776
+ db2.connect(URL_DB, true)
757
777
  expect(db2.stat()).to eq 0
758
778
  tb2 = testOpenTable(db2)
759
779
  expect(tb2).not_to be nil
@@ -984,7 +1004,7 @@ def testTransactionLockReadCommited()
984
1004
  tb = testOpenTable(db)
985
1005
  expect(tb).not_to be nil
986
1006
  db2 = Transactd::Database.new()
987
- db2.connect(PROTOCOL + HOSTNAME + DBNAME, true)
1007
+ db2.connect(URL_DB, true)
988
1008
  expect(db2.stat()).to eq 0
989
1009
  tb2 = testOpenTable(db2)
990
1010
  expect(tb2).not_to be nil
@@ -1249,7 +1269,7 @@ def testRecordLock()
1249
1269
  tb = testOpenTable(db)
1250
1270
  expect(tb).not_to be nil
1251
1271
  db2 = Transactd::Database.new()
1252
- db2.connect(PROTOCOL + HOSTNAME + DBNAME, true)
1272
+ db2.connect(URL_DB, true)
1253
1273
  expect(db2.stat()).to eq 0
1254
1274
  tb2 = testOpenTable(db2)
1255
1275
  expect(tb2).not_to be nil
@@ -1385,7 +1405,7 @@ def testConflict()
1385
1405
  db = Transactd::Database.new()
1386
1406
  tb = testOpenTable(db)
1387
1407
  db2 = Transactd::Database.new()
1388
- db2.connect(PROTOCOL + HOSTNAME + DBNAME , true)
1408
+ db2.connect(URL_DB, true)
1389
1409
  expect(db2.stat()).to eq 0
1390
1410
  expect(tb).not_to be nil
1391
1411
  tb2 = testOpenTable(db2)
@@ -1444,7 +1464,7 @@ def testExclusive()
1444
1464
 
1445
1465
  # Can not open database from other connections.
1446
1466
  db2 = Transactd::Database.new()
1447
- db2.connect(PROTOCOL + HOSTNAME + DBNAME, true)
1467
+ db2.connect(URL_DB, true)
1448
1468
  expect(db2.stat()).to eq 0
1449
1469
  db2.open(URL, Transactd::TYPE_SCHEMA_BDF)
1450
1470
  # database open error. Check database::stat()
@@ -1467,7 +1487,7 @@ def testExclusive()
1467
1487
  db2.close()
1468
1488
 
1469
1489
  # Normal open
1470
- db2.connect(PROTOCOL + HOSTNAME + DBNAME, true)
1490
+ db2.connect(URL_DB, true)
1471
1491
  db2.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1472
1492
  expect(db2.stat()).to eq 0
1473
1493
  db2.close()
@@ -1629,7 +1649,7 @@ def testMissingUpdate()
1629
1649
  # Get lock(X) same record in parallel.
1630
1650
  w = Thread.new {
1631
1651
  db2 = Transactd::Database.new()
1632
- db2.connect(PROTOCOL + HOSTNAME + DBNAME, true)
1652
+ db2.connect(URL_DB, true)
1633
1653
  expect(db2.stat()).to eq 0
1634
1654
  db2.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1635
1655
  expect(db2.stat()).to eq 0
@@ -1643,7 +1663,7 @@ def testMissingUpdate()
1643
1663
  db2.close()
1644
1664
  v2
1645
1665
  }
1646
- sleep(0.05)
1666
+ sleep(0.5)
1647
1667
  v = tb.getFVint(FDI_ID)
1648
1668
  v = v + 1
1649
1669
  tb.setFV(FDI_ID, v)
@@ -1673,7 +1693,7 @@ def testMissingUpdate()
1673
1693
  # Get lock(X) same record in parallel.
1674
1694
  w = Thread.new {
1675
1695
  db2 = Transactd::Database.new()
1676
- db2.connect(PROTOCOL + HOSTNAME + DBNAME, true)
1696
+ db2.connect(URL_DB, true)
1677
1697
  expect(db2.stat()).to eq 0
1678
1698
  db2.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1679
1699
  expect(db2.stat()).to eq 0
@@ -1688,7 +1708,7 @@ def testMissingUpdate()
1688
1708
  db2.close()
1689
1709
  v2
1690
1710
  }
1691
- sleep(0.05)
1711
+ sleep(0.5)
1692
1712
  v = tb.getFVint(FDI_ID)
1693
1713
  tb.del()
1694
1714
  v2 = w.join().value
@@ -1787,12 +1807,12 @@ end
1787
1807
 
1788
1808
  def testLogin()
1789
1809
  db = Transactd::Database.new()
1790
- db.connect(PROTOCOL + HOSTNAME)
1810
+ db.connect(URL_HOST)
1791
1811
  expect(db.stat()).to eq 0
1792
1812
  if db.stat() == 0
1793
1813
  # second connection
1794
1814
  db2 = Transactd::Database.new()
1795
- db2.connect(PROTOCOL + HOSTNAME, true)
1815
+ db2.connect(URL_HOST, true)
1796
1816
  expect(db2.stat()).to eq 0
1797
1817
  db2.disconnect()
1798
1818
  db.disconnect()
@@ -1811,7 +1831,7 @@ def testLogin()
1811
1831
  db.close()
1812
1832
  expect(db.stat()).to eq 0
1813
1833
  # true database name
1814
- db.connect(PROTOCOL + HOSTNAME + DBNAME)
1834
+ db.connect(URL_DB)
1815
1835
  expect(db.stat()).to eq 0
1816
1836
  if (db.stat() == 0)
1817
1837
  db.disconnect()
@@ -1821,7 +1841,7 @@ def testLogin()
1821
1841
  testDropDatabase(db)
1822
1842
  db.disconnect()
1823
1843
  expect(db.stat()).to eq 0
1824
- db.connect(PROTOCOL + HOSTNAME + DBNAME)
1844
+ db.connect(URL_DB)
1825
1845
  expect(db.stat()).to eq (Transactd::ERROR_NO_DATABASE)
1826
1846
  db.disconnect()
1827
1847
  expect(db.stat()).to eq 1
@@ -2835,11 +2855,11 @@ def createQTextention(db)
2835
2855
  end
2836
2856
 
2837
2857
  def insertQT(db, maxId)
2838
- db.beginTrn()
2839
2858
  # insert user data
2840
2859
  tb = db.openTable('user', Transactd::TD_OPEN_NORMAL)
2841
2860
  expect(db.stat()).to eq 0
2842
2861
  expect(tb).not_to be nil
2862
+ db.beginTrn()
2843
2863
  tb.clearBuffer()
2844
2864
  for i in 1..maxId
2845
2865
  tb.setFV(0, i)
@@ -2848,11 +2868,13 @@ def insertQT(db, maxId)
2848
2868
  tb.insert()
2849
2869
  expect(tb.stat()).to eq 0
2850
2870
  end
2871
+ db.endTrn()
2851
2872
  tb.close()
2852
2873
  # insert groups data
2853
2874
  tb = db.openTable('groups', Transactd::TD_OPEN_NORMAL)
2854
2875
  expect(db.stat()).to eq 0
2855
2876
  expect(tb).not_to be nil
2877
+ db.beginTrn()
2856
2878
  tb.clearBuffer()
2857
2879
  for i in 1..100
2858
2880
  tb.setFV(0, i)
@@ -2860,11 +2882,13 @@ def insertQT(db, maxId)
2860
2882
  tb.insert()
2861
2883
  expect(tb.stat()).to eq 0
2862
2884
  end
2885
+ db.endTrn()
2863
2886
  tb.close()
2864
2887
  # insert extention data
2865
2888
  tb = db.openTable('extention', Transactd::TD_OPEN_NORMAL)
2866
2889
  expect(db.stat()).to eq 0
2867
2890
  expect(tb).not_to be nil
2891
+ db.beginTrn()
2868
2892
  tb.clearBuffer()
2869
2893
  for i in 1..maxId
2870
2894
  tb.setFV(0, i)
@@ -2873,8 +2897,8 @@ def insertQT(db, maxId)
2873
2897
  tb.insert()
2874
2898
  expect(tb.stat()).to eq 0
2875
2899
  end
2876
- tb.close()
2877
2900
  db.endTrn()
2901
+ tb.close()
2878
2902
  end
2879
2903
 
2880
2904
  def testCreateQueryTest()
@@ -2931,6 +2955,8 @@ def testNewDelete()
2931
2955
  a = Transactd::Avg.new(fns)
2932
2956
  mi = Transactd::Min.new(fns)
2933
2957
  ma = Transactd::Max.new(fns)
2958
+ la = Transactd::Last.new(fns)
2959
+ fa = Transactd::First.new(fns)
2934
2960
  rs = Transactd::Recordset.new()
2935
2961
  # have to explicitly release
2936
2962
  atu.release()
@@ -3284,6 +3310,64 @@ def testServerPrepareJoin()
3284
3310
  db.close()
3285
3311
  end
3286
3312
 
3313
+ def testReadMore()
3314
+ db = Transactd::Database.new()
3315
+ db.open(URL_QT)
3316
+ expect(db.stat()).to eq 0
3317
+
3318
+ atu = Transactd::ActiveTable.new(db, 'user')
3319
+ atu.alias('名前', 'name')
3320
+ q = Transactd::Query.new()
3321
+
3322
+ #isStopAtLimit
3323
+ expect(q.isStopAtLimit()).to eq false
3324
+
3325
+ q.select('id', 'name', 'group')
3326
+ .where('name', '=', '1*')
3327
+ .reject(70).limit(8).stopAtLimit(true)
3328
+ expect(q.isStopAtLimit()).to eq true
3329
+
3330
+ stmt1 = atu.prepare(q)
3331
+ expect(stmt1).not_to eq nil
3332
+ rs = atu.index(0).keyValue(18).read(stmt1)
3333
+ expect(rs.size()).to eq 2
3334
+
3335
+ #readMore
3336
+ rs2 = atu.readMore()
3337
+ expect(rs2.size()).to eq 8
3338
+ rs.unionRecordset(rs2)
3339
+ expect(rs.size()).to eq 10
3340
+ end
3341
+
3342
+ def testFirstLastGroupFunction()
3343
+ db = Transactd::Database.new()
3344
+ db.open(URL_QT)
3345
+ expect(db.stat()).to eq 0
3346
+
3347
+ atu = Transactd::ActiveTable.new(db, 'user')
3348
+ atu.alias('名前', 'name')
3349
+ q = Transactd::Query.new()
3350
+ q.select('id', 'name', 'group')
3351
+ .where('name', '=', '1*')
3352
+ .reject(70).limit(8).stopAtLimit(true)
3353
+ stmt1 = atu.prepare(q)
3354
+ expect(stmt1).not_to eq nil
3355
+ rs = atu.index(0).keyValue(0).read(stmt1)
3356
+ expect(rs.size()).to eq 8
3357
+
3358
+ #grouping first and last
3359
+ gq = Transactd::GroupQuery.new()
3360
+ target = Transactd::FieldNames.new()
3361
+ target.addValue('name');
3362
+ last = Transactd::Last.new(target, 'last_rec_name')
3363
+ first = Transactd::First.new(target, 'first_rec_name')
3364
+ gq.addFunction(last);
3365
+ gq.addFunction(first);
3366
+ rs.groupBy(gq);
3367
+ expect(rs[0]['first_rec_name']).to eq "1 user";
3368
+ expect(rs[0]['last_rec_name']).to eq "16 user";
3369
+ end
3370
+
3287
3371
  def testWirtableRecord()
3288
3372
  db = Transactd::Database.new()
3289
3373
  db.open(URL_QT)
@@ -3474,6 +3558,12 @@ describe Transactd do
3474
3558
  it 'activetable and prepare (server)' do
3475
3559
  testServerPrepareJoin()
3476
3560
  end
3561
+ it 'activetable and readMore' do
3562
+ testReadMore()
3563
+ end
3564
+ it 'Grouping and first and last' do
3565
+ testFirstLastGroupFunction()
3566
+ end
3477
3567
  it 'write with writableRecord' do
3478
3568
  testWirtableRecord()
3479
3569
  end
@@ -52,7 +52,7 @@ struct commandLineParam
52
52
  avg_count = _ttol(argv[5]);
53
53
  stressMode = (loopCount == -1) ? true : false;
54
54
  if (stressMode)
55
- loopCount = 1;
55
+ loopCount = 10;
56
56
  }
57
57
  };
58
58
 
@@ -123,7 +123,7 @@ void makeMysqlParam(bzs::test::worker::mysql::connectParam& param,
123
123
  param.port = 0;
124
124
  }
125
125
 
126
- #define BENCH_TIMER_SECONDS 1.5f
126
+ #define BENCH_TIMER_SECONDS 2.0f
127
127
  double executeWorkers(const commandLineParam& cmd, const connectParams param,
128
128
  const bzs::test::worker::mysql::connectParam& paramMysql,
129
129
  int wn)
@@ -151,11 +151,11 @@ double executeWorkers(const commandLineParam& cmd, const connectParams param,
151
151
  }
152
152
  printf("*");
153
153
  fflush(stdout);
154
- Sleep(500);
154
+ Sleep(1000);
155
155
  sync.wait(); // start all workers
156
156
  if (cmd.stressMode)
157
157
  {
158
- Sleep(200);
158
+ Sleep(500);
159
159
  g_bench_signal = BENCH_SIGNAL_GREEN;
160
160
  //Measurement interval
161
161
  Sleep((unsigned int)(BENCH_TIMER_SECONDS * 1000));
@@ -184,7 +184,7 @@ int execute(const commandLineParam& cmd, const connectParams param,
184
184
  if (cmd.stressMode)
185
185
  {
186
186
  if (t)
187
- ts.value = (__int64)(t / BENCH_TIMER_SECONDS);
187
+ ts.value = (__int64)(t / BENCH_TIMER_SECONDS) * cmd.loopCount;
188
188
  }
189
189
  else
190
190
  {
@@ -92,7 +92,7 @@ public:
92
92
  else if (g_bench_signal == BENCH_SIGNAL_BLUE)
93
93
  {
94
94
  m_bresult = bm.end();
95
- dummyWork();
95
+ //dummyWork();
96
96
  break;
97
97
  }
98
98
  }
@@ -116,7 +116,7 @@ public:
116
116
  else if (g_bench_signal == BENCH_SIGNAL_BLUE)
117
117
  {
118
118
  m_bresult = bm.end();
119
- dummyWork();
119
+ //dummyWork();
120
120
  break;
121
121
  }
122
122
  }