heroku-tokyotyrant 0.4

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 (340) hide show
  1. data/COPYING +504 -0
  2. data/README.rdoc +231 -0
  3. data/Rakefile +72 -0
  4. data/benchmarks/balancer.rb +101 -0
  5. data/benchmarks/bulk_db.rb +74 -0
  6. data/benchmarks/bulk_table.rb +87 -0
  7. data/benchmarks/db.rb +114 -0
  8. data/benchmarks/table.rb +161 -0
  9. data/ext/extconf.rb +43 -0
  10. data/ext/tokyo/bin/tcamgr +0 -0
  11. data/ext/tokyo/bin/tcamttest +0 -0
  12. data/ext/tokyo/bin/tcatest +0 -0
  13. data/ext/tokyo/bin/tcbmgr +0 -0
  14. data/ext/tokyo/bin/tcbmttest +0 -0
  15. data/ext/tokyo/bin/tcbtest +0 -0
  16. data/ext/tokyo/bin/tcfmgr +0 -0
  17. data/ext/tokyo/bin/tcfmttest +0 -0
  18. data/ext/tokyo/bin/tcftest +0 -0
  19. data/ext/tokyo/bin/tchmgr +0 -0
  20. data/ext/tokyo/bin/tchmttest +0 -0
  21. data/ext/tokyo/bin/tchtest +0 -0
  22. data/ext/tokyo/bin/tcrmgr +0 -0
  23. data/ext/tokyo/bin/tcrmttest +0 -0
  24. data/ext/tokyo/bin/tcrtest +0 -0
  25. data/ext/tokyo/bin/tctmgr +0 -0
  26. data/ext/tokyo/bin/tctmttest +0 -0
  27. data/ext/tokyo/bin/tcttest +0 -0
  28. data/ext/tokyo/bin/tcucodec +0 -0
  29. data/ext/tokyo/bin/tcumttest +0 -0
  30. data/ext/tokyo/bin/tcutest +0 -0
  31. data/ext/tokyo/bin/ttserver +0 -0
  32. data/ext/tokyo/bin/ttulmgr +0 -0
  33. data/ext/tokyo/bin/ttultest +0 -0
  34. data/ext/tokyo/include/tcadb.h +548 -0
  35. data/ext/tokyo/include/tcbdb.h +1101 -0
  36. data/ext/tokyo/include/tcfdb.h +858 -0
  37. data/ext/tokyo/include/tchdb.h +871 -0
  38. data/ext/tokyo/include/tcrdb.h +801 -0
  39. data/ext/tokyo/include/tctdb.h +1086 -0
  40. data/ext/tokyo/include/tculog.h +392 -0
  41. data/ext/tokyo/include/tcutil.h +4184 -0
  42. data/ext/tokyo/include/ttutil.h +494 -0
  43. data/ext/tokyo/lib/libtokyocabinet.9.4.0.dylib +0 -0
  44. data/ext/tokyo/lib/libtokyocabinet.9.dylib +0 -0
  45. data/ext/tokyo/lib/libtokyocabinet.a +0 -0
  46. data/ext/tokyo/lib/libtokyocabinet.dylib +0 -0
  47. data/ext/tokyo/lib/libtokyotyrant.3.22.0.dylib +0 -0
  48. data/ext/tokyo/lib/libtokyotyrant.3.dylib +0 -0
  49. data/ext/tokyo/lib/libtokyotyrant.a +0 -0
  50. data/ext/tokyo/lib/libtokyotyrant.dylib +0 -0
  51. data/ext/tokyo/lib/pkgconfig/tokyocabinet.pc +14 -0
  52. data/ext/tokyo/lib/pkgconfig/tokyotyrant.pc +14 -0
  53. data/ext/tokyo/lib/ttskeldir.bundle +0 -0
  54. data/ext/tokyo/lib/ttskelmock.bundle +0 -0
  55. data/ext/tokyo/lib/ttskelnull.bundle +0 -0
  56. data/ext/tokyo/lib/ttskelproxy.bundle +0 -0
  57. data/ext/tokyo/libexec/tcawmgr.cgi +0 -0
  58. data/ext/tokyo/sbin/ttservctl +163 -0
  59. data/ext/tokyo/share/man/man1/tcamgr.1 +97 -0
  60. data/ext/tokyo/share/man/man1/tcamttest.1 +35 -0
  61. data/ext/tokyo/share/man/man1/tcatest.1 +55 -0
  62. data/ext/tokyo/share/man/man1/tcbmgr.1 +125 -0
  63. data/ext/tokyo/share/man/man1/tcbmttest.1 +81 -0
  64. data/ext/tokyo/share/man/man1/tcbtest.1 +107 -0
  65. data/ext/tokyo/share/man/man1/tcfmgr.1 +98 -0
  66. data/ext/tokyo/share/man/man1/tcfmttest.1 +62 -0
  67. data/ext/tokyo/share/man/man1/tcftest.1 +73 -0
  68. data/ext/tokyo/share/man/man1/tchmgr.1 +110 -0
  69. data/ext/tokyo/share/man/man1/tchmttest.1 +85 -0
  70. data/ext/tokyo/share/man/man1/tchtest.1 +95 -0
  71. data/ext/tokyo/share/man/man1/tcrmgr.1 +164 -0
  72. data/ext/tokyo/share/man/man1/tcrmttest.1 +55 -0
  73. data/ext/tokyo/share/man/man1/tcrtest.1 +89 -0
  74. data/ext/tokyo/share/man/man1/tctmgr.1 +140 -0
  75. data/ext/tokyo/share/man/man1/tctmttest.1 +92 -0
  76. data/ext/tokyo/share/man/man1/tcttest.1 +105 -0
  77. data/ext/tokyo/share/man/man1/tcucodec.1 +162 -0
  78. data/ext/tokyo/share/man/man1/tcumttest.1 +41 -0
  79. data/ext/tokyo/share/man/man1/tcutest.1 +81 -0
  80. data/ext/tokyo/share/man/man1/ttserver.1 +84 -0
  81. data/ext/tokyo/share/man/man1/ttulmgr.1 +40 -0
  82. data/ext/tokyo/share/man/man1/ttultest.1 +16 -0
  83. data/ext/tokyo/share/man/man3/tcadb.3 +676 -0
  84. data/ext/tokyo/share/man/man3/tcbdb.3 +1355 -0
  85. data/ext/tokyo/share/man/man3/tcfdb.3 +975 -0
  86. data/ext/tokyo/share/man/man3/tchdb.3 +898 -0
  87. data/ext/tokyo/share/man/man3/tclist.3 +1 -0
  88. data/ext/tokyo/share/man/man3/tcmap.3 +1 -0
  89. data/ext/tokyo/share/man/man3/tcmdb.3 +1 -0
  90. data/ext/tokyo/share/man/man3/tcmpool.3 +1 -0
  91. data/ext/tokyo/share/man/man3/tcrdb.3 +1309 -0
  92. data/ext/tokyo/share/man/man3/tctdb.3 +1110 -0
  93. data/ext/tokyo/share/man/man3/tctree.3 +1 -0
  94. data/ext/tokyo/share/man/man3/tculog.3 +15 -0
  95. data/ext/tokyo/share/man/man3/tcutil.3 +4518 -0
  96. data/ext/tokyo/share/man/man3/tcxstr.3 +1 -0
  97. data/ext/tokyo/share/man/man3/tokyocabinet.3 +132 -0
  98. data/ext/tokyo/share/man/man3/ttutil.3 +14 -0
  99. data/ext/tokyo/share/man/man8/ttservctl.8 +37 -0
  100. data/ext/tokyo/share/tokyocabinet/COPYING +504 -0
  101. data/ext/tokyo/share/tokyocabinet/ChangeLog +1252 -0
  102. data/ext/tokyo/share/tokyocabinet/THANKS +12 -0
  103. data/ext/tokyo/share/tokyocabinet/doc/benchmark.pdf +0 -0
  104. data/ext/tokyo/share/tokyocabinet/doc/common.css +211 -0
  105. data/ext/tokyo/share/tokyocabinet/doc/icon16.png +0 -0
  106. data/ext/tokyo/share/tokyocabinet/doc/index.html +156 -0
  107. data/ext/tokyo/share/tokyocabinet/doc/index.ja.html +197 -0
  108. data/ext/tokyo/share/tokyocabinet/doc/logo-ja.png +0 -0
  109. data/ext/tokyo/share/tokyocabinet/doc/logo.png +0 -0
  110. data/ext/tokyo/share/tokyocabinet/doc/spex-en.html +7145 -0
  111. data/ext/tokyo/share/tokyocabinet/doc/spex-ja.html +7476 -0
  112. data/ext/tokyo/share/tokyocabinet/doc/tokyoproducts.pdf +0 -0
  113. data/ext/tokyo/share/tokyocabinet/doc/tokyoproducts.ppt +0 -0
  114. data/ext/tokyo/share/tokyotyrant/COPYING +504 -0
  115. data/ext/tokyo/share/tokyotyrant/ChangeLog +578 -0
  116. data/ext/tokyo/share/tokyotyrant/THANKS +15 -0
  117. data/ext/tokyo/share/tokyotyrant/doc/common.css +211 -0
  118. data/ext/tokyo/share/tokyotyrant/doc/index.html +79 -0
  119. data/ext/tokyo/share/tokyotyrant/doc/spex.html +2264 -0
  120. data/ext/tokyo/share/tokyotyrant/ext/mapreduce.lua +57 -0
  121. data/ext/tokyo/share/tokyotyrant/ext/queue.lua +55 -0
  122. data/ext/tokyo/share/tokyotyrant/ext/senatus.lua +532 -0
  123. data/ext/tokyo/share/tokyotyrant/ext/usherette.lua +438 -0
  124. data/ext/tokyo_tyrant.c +147 -0
  125. data/ext/tokyo_tyrant.h +48 -0
  126. data/ext/tokyo_tyrant_db.c +227 -0
  127. data/ext/tokyo_tyrant_db.h +8 -0
  128. data/ext/tokyo_tyrant_module.c +453 -0
  129. data/ext/tokyo_tyrant_module.h +10 -0
  130. data/ext/tokyo_tyrant_query.c +226 -0
  131. data/ext/tokyo_tyrant_query.h +9 -0
  132. data/ext/tokyo_tyrant_table.c +319 -0
  133. data/ext/tokyo_tyrant_table.h +8 -0
  134. data/ext/tokyocabinet-1.4.41/COPYING +504 -0
  135. data/ext/tokyocabinet-1.4.41/ChangeLog +1252 -0
  136. data/ext/tokyocabinet-1.4.41/Makefile.in +825 -0
  137. data/ext/tokyocabinet-1.4.41/README +38 -0
  138. data/ext/tokyocabinet-1.4.41/THANKS +12 -0
  139. data/ext/tokyocabinet-1.4.41/bros/Makefile +133 -0
  140. data/ext/tokyocabinet-1.4.41/bros/bdbtest.c +438 -0
  141. data/ext/tokyocabinet-1.4.41/bros/cdbtest.c +219 -0
  142. data/ext/tokyocabinet-1.4.41/bros/cmpsqltctest.c +186 -0
  143. data/ext/tokyocabinet-1.4.41/bros/gdbmtest.c +216 -0
  144. data/ext/tokyocabinet-1.4.41/bros/mapreporter +72 -0
  145. data/ext/tokyocabinet-1.4.41/bros/maptest.cc +677 -0
  146. data/ext/tokyocabinet-1.4.41/bros/ndbmtest.c +204 -0
  147. data/ext/tokyocabinet-1.4.41/bros/qdbmtest.c +375 -0
  148. data/ext/tokyocabinet-1.4.41/bros/reporter +141 -0
  149. data/ext/tokyocabinet-1.4.41/bros/result.xls +0 -0
  150. data/ext/tokyocabinet-1.4.41/bros/sdbmtest.c +204 -0
  151. data/ext/tokyocabinet-1.4.41/bros/sqltest.c +404 -0
  152. data/ext/tokyocabinet-1.4.41/bros/tctest.c +748 -0
  153. data/ext/tokyocabinet-1.4.41/bros/tdbtest.c +205 -0
  154. data/ext/tokyocabinet-1.4.41/configure +7402 -0
  155. data/ext/tokyocabinet-1.4.41/configure.in +362 -0
  156. data/ext/tokyocabinet-1.4.41/doc/benchmark.pdf +0 -0
  157. data/ext/tokyocabinet-1.4.41/doc/common.css +211 -0
  158. data/ext/tokyocabinet-1.4.41/doc/icon16.png +0 -0
  159. data/ext/tokyocabinet-1.4.41/doc/index.html +156 -0
  160. data/ext/tokyocabinet-1.4.41/doc/index.ja.html +197 -0
  161. data/ext/tokyocabinet-1.4.41/doc/logo-ja.png +0 -0
  162. data/ext/tokyocabinet-1.4.41/doc/logo.png +0 -0
  163. data/ext/tokyocabinet-1.4.41/doc/spex-en.html +7145 -0
  164. data/ext/tokyocabinet-1.4.41/doc/spex-ja.html +7476 -0
  165. data/ext/tokyocabinet-1.4.41/doc/tokyoproducts.pdf +0 -0
  166. data/ext/tokyocabinet-1.4.41/doc/tokyoproducts.ppt +0 -0
  167. data/ext/tokyocabinet-1.4.41/example/Makefile +113 -0
  168. data/ext/tokyocabinet-1.4.41/example/tcadbex.c +55 -0
  169. data/ext/tokyocabinet-1.4.41/example/tcbdbex.c +64 -0
  170. data/ext/tokyocabinet-1.4.41/example/tcfdbex.c +60 -0
  171. data/ext/tokyocabinet-1.4.41/example/tchdbex.c +60 -0
  172. data/ext/tokyocabinet-1.4.41/example/tctchat.c +97 -0
  173. data/ext/tokyocabinet-1.4.41/example/tctchat.tmpl +141 -0
  174. data/ext/tokyocabinet-1.4.41/example/tctdbex.c +85 -0
  175. data/ext/tokyocabinet-1.4.41/example/tctsearch.c +95 -0
  176. data/ext/tokyocabinet-1.4.41/example/tctsearch.tmpl +122 -0
  177. data/ext/tokyocabinet-1.4.41/example/tcutilex.c +77 -0
  178. data/ext/tokyocabinet-1.4.41/f.tsv +2 -0
  179. data/ext/tokyocabinet-1.4.41/lab/calccomp +118 -0
  180. data/ext/tokyocabinet-1.4.41/lab/datechange +56 -0
  181. data/ext/tokyocabinet-1.4.41/lab/diffcheck +45 -0
  182. data/ext/tokyocabinet-1.4.41/lab/htmltotsv +102 -0
  183. data/ext/tokyocabinet-1.4.41/lab/magic +19 -0
  184. data/ext/tokyocabinet-1.4.41/lab/printenv.cgi +27 -0
  185. data/ext/tokyocabinet-1.4.41/lab/stepcount +26 -0
  186. data/ext/tokyocabinet-1.4.41/lab/stopwatch +61 -0
  187. data/ext/tokyocabinet-1.4.41/lab/tabcheck +43 -0
  188. data/ext/tokyocabinet-1.4.41/lab/wgettsv +239 -0
  189. data/ext/tokyocabinet-1.4.41/lab/widthcheck +57 -0
  190. data/ext/tokyocabinet-1.4.41/man/htmltoman +104 -0
  191. data/ext/tokyocabinet-1.4.41/man/tcadb.3 +676 -0
  192. data/ext/tokyocabinet-1.4.41/man/tcamgr.1 +97 -0
  193. data/ext/tokyocabinet-1.4.41/man/tcamttest.1 +35 -0
  194. data/ext/tokyocabinet-1.4.41/man/tcatest.1 +55 -0
  195. data/ext/tokyocabinet-1.4.41/man/tcbdb.3 +1355 -0
  196. data/ext/tokyocabinet-1.4.41/man/tcbmgr.1 +125 -0
  197. data/ext/tokyocabinet-1.4.41/man/tcbmttest.1 +81 -0
  198. data/ext/tokyocabinet-1.4.41/man/tcbtest.1 +107 -0
  199. data/ext/tokyocabinet-1.4.41/man/tcfdb.3 +975 -0
  200. data/ext/tokyocabinet-1.4.41/man/tcfmgr.1 +98 -0
  201. data/ext/tokyocabinet-1.4.41/man/tcfmttest.1 +62 -0
  202. data/ext/tokyocabinet-1.4.41/man/tcftest.1 +73 -0
  203. data/ext/tokyocabinet-1.4.41/man/tchdb.3 +898 -0
  204. data/ext/tokyocabinet-1.4.41/man/tchmgr.1 +110 -0
  205. data/ext/tokyocabinet-1.4.41/man/tchmttest.1 +85 -0
  206. data/ext/tokyocabinet-1.4.41/man/tchtest.1 +95 -0
  207. data/ext/tokyocabinet-1.4.41/man/tclist.3 +1 -0
  208. data/ext/tokyocabinet-1.4.41/man/tcmap.3 +1 -0
  209. data/ext/tokyocabinet-1.4.41/man/tcmdb.3 +1 -0
  210. data/ext/tokyocabinet-1.4.41/man/tcmpool.3 +1 -0
  211. data/ext/tokyocabinet-1.4.41/man/tctdb.3 +1110 -0
  212. data/ext/tokyocabinet-1.4.41/man/tctmgr.1 +140 -0
  213. data/ext/tokyocabinet-1.4.41/man/tctmttest.1 +92 -0
  214. data/ext/tokyocabinet-1.4.41/man/tctree.3 +1 -0
  215. data/ext/tokyocabinet-1.4.41/man/tcttest.1 +105 -0
  216. data/ext/tokyocabinet-1.4.41/man/tcucodec.1 +162 -0
  217. data/ext/tokyocabinet-1.4.41/man/tcumttest.1 +41 -0
  218. data/ext/tokyocabinet-1.4.41/man/tcutest.1 +81 -0
  219. data/ext/tokyocabinet-1.4.41/man/tcutil.3 +4518 -0
  220. data/ext/tokyocabinet-1.4.41/man/tcxstr.3 +1 -0
  221. data/ext/tokyocabinet-1.4.41/man/tokyocabinet.3 +132 -0
  222. data/ext/tokyocabinet-1.4.41/md5.c +381 -0
  223. data/ext/tokyocabinet-1.4.41/md5.h +101 -0
  224. data/ext/tokyocabinet-1.4.41/myconf.c +493 -0
  225. data/ext/tokyocabinet-1.4.41/myconf.h +549 -0
  226. data/ext/tokyocabinet-1.4.41/tcadb.c +4339 -0
  227. data/ext/tokyocabinet-1.4.41/tcadb.h +548 -0
  228. data/ext/tokyocabinet-1.4.41/tcamgr.c +1019 -0
  229. data/ext/tokyocabinet-1.4.41/tcamttest.c +542 -0
  230. data/ext/tokyocabinet-1.4.41/tcatest.c +1845 -0
  231. data/ext/tokyocabinet-1.4.41/tcawmgr.c +482 -0
  232. data/ext/tokyocabinet-1.4.41/tcbdb.c +4180 -0
  233. data/ext/tokyocabinet-1.4.41/tcbdb.h +1101 -0
  234. data/ext/tokyocabinet-1.4.41/tcbmgr.c +1012 -0
  235. data/ext/tokyocabinet-1.4.41/tcbmttest.c +1810 -0
  236. data/ext/tokyocabinet-1.4.41/tcbtest.c +2586 -0
  237. data/ext/tokyocabinet-1.4.41/tcfdb.c +2746 -0
  238. data/ext/tokyocabinet-1.4.41/tcfdb.h +858 -0
  239. data/ext/tokyocabinet-1.4.41/tcfmgr.c +786 -0
  240. data/ext/tokyocabinet-1.4.41/tcfmttest.c +1220 -0
  241. data/ext/tokyocabinet-1.4.41/tcftest.c +1695 -0
  242. data/ext/tokyocabinet-1.4.41/tchdb.c +5153 -0
  243. data/ext/tokyocabinet-1.4.41/tchdb.h +871 -0
  244. data/ext/tokyocabinet-1.4.41/tchmgr.c +842 -0
  245. data/ext/tokyocabinet-1.4.41/tchmttest.c +1757 -0
  246. data/ext/tokyocabinet-1.4.41/tchtest.c +2129 -0
  247. data/ext/tokyocabinet-1.4.41/tctdb.c +6199 -0
  248. data/ext/tokyocabinet-1.4.41/tctdb.h +1086 -0
  249. data/ext/tokyocabinet-1.4.41/tctmgr.c +1241 -0
  250. data/ext/tokyocabinet-1.4.41/tctmttest.c +1563 -0
  251. data/ext/tokyocabinet-1.4.41/tcttest.c +2062 -0
  252. data/ext/tokyocabinet-1.4.41/tcucodec.c +1357 -0
  253. data/ext/tokyocabinet-1.4.41/tcumttest.c +578 -0
  254. data/ext/tokyocabinet-1.4.41/tcutest.c +1875 -0
  255. data/ext/tokyocabinet-1.4.41/tcutil.c +10528 -0
  256. data/ext/tokyocabinet-1.4.41/tcutil.h +4184 -0
  257. data/ext/tokyocabinet-1.4.41/tokyocabinet.idl +336 -0
  258. data/ext/tokyocabinet-1.4.41/tokyocabinet.pc.in +14 -0
  259. data/ext/tokyotyrant-1.1.39/COPYING +504 -0
  260. data/ext/tokyotyrant-1.1.39/ChangeLog +578 -0
  261. data/ext/tokyotyrant-1.1.39/Makefile.in +365 -0
  262. data/ext/tokyotyrant-1.1.39/README +38 -0
  263. data/ext/tokyotyrant-1.1.39/THANKS +15 -0
  264. data/ext/tokyotyrant-1.1.39/configure +6979 -0
  265. data/ext/tokyotyrant-1.1.39/configure.in +300 -0
  266. data/ext/tokyotyrant-1.1.39/doc/common.css +211 -0
  267. data/ext/tokyotyrant-1.1.39/doc/index.html +79 -0
  268. data/ext/tokyotyrant-1.1.39/doc/spex.html +2264 -0
  269. data/ext/tokyotyrant-1.1.39/example/Makefile +68 -0
  270. data/ext/tokyotyrant-1.1.39/example/httptest.pl +88 -0
  271. data/ext/tokyotyrant-1.1.39/example/mcftest.pl +39 -0
  272. data/ext/tokyotyrant-1.1.39/example/mctest.pl +43 -0
  273. data/ext/tokyotyrant-1.1.39/example/tcrdbex +0 -0
  274. data/ext/tokyotyrant-1.1.39/example/tcrdbex.c +49 -0
  275. data/ext/tokyotyrant-1.1.39/example/tcrdbex.o +0 -0
  276. data/ext/tokyotyrant-1.1.39/example/tcrdbtblex +0 -0
  277. data/ext/tokyotyrant-1.1.39/example/tcrdbtblex.c +79 -0
  278. data/ext/tokyotyrant-1.1.39/example/tcrdbtblex.o +0 -0
  279. data/ext/tokyotyrant-1.1.39/ext/mapreduce.lua +57 -0
  280. data/ext/tokyotyrant-1.1.39/ext/queue.lua +55 -0
  281. data/ext/tokyotyrant-1.1.39/ext/senatus.lua +532 -0
  282. data/ext/tokyotyrant-1.1.39/ext/usherette.lua +438 -0
  283. data/ext/tokyotyrant-1.1.39/lab/datechange +56 -0
  284. data/ext/tokyotyrant-1.1.39/lab/diffcheck +45 -0
  285. data/ext/tokyotyrant-1.1.39/lab/fibonacci.lua +20 -0
  286. data/ext/tokyotyrant-1.1.39/lab/footprint.lua +67 -0
  287. data/ext/tokyotyrant-1.1.39/lab/highlow.lua +88 -0
  288. data/ext/tokyotyrant-1.1.39/lab/killdualmaster +12 -0
  289. data/ext/tokyotyrant-1.1.39/lab/rundualmaster +38 -0
  290. data/ext/tokyotyrant-1.1.39/lab/stepcount +26 -0
  291. data/ext/tokyotyrant-1.1.39/lab/tabcheck +43 -0
  292. data/ext/tokyotyrant-1.1.39/lab/ushrtregister.pl +55 -0
  293. data/ext/tokyotyrant-1.1.39/lab/widthcheck +57 -0
  294. data/ext/tokyotyrant-1.1.39/man/htmltoman +100 -0
  295. data/ext/tokyotyrant-1.1.39/man/tcrdb.3 +1309 -0
  296. data/ext/tokyotyrant-1.1.39/man/tcrmgr.1 +164 -0
  297. data/ext/tokyotyrant-1.1.39/man/tcrmttest.1 +55 -0
  298. data/ext/tokyotyrant-1.1.39/man/tcrtest.1 +89 -0
  299. data/ext/tokyotyrant-1.1.39/man/tculog.3 +15 -0
  300. data/ext/tokyotyrant-1.1.39/man/ttservctl.8 +37 -0
  301. data/ext/tokyotyrant-1.1.39/man/ttserver.1 +84 -0
  302. data/ext/tokyotyrant-1.1.39/man/ttulmgr.1 +40 -0
  303. data/ext/tokyotyrant-1.1.39/man/ttultest.1 +16 -0
  304. data/ext/tokyotyrant-1.1.39/man/ttutil.3 +14 -0
  305. data/ext/tokyotyrant-1.1.39/myconf.c +169 -0
  306. data/ext/tokyotyrant-1.1.39/myconf.h +408 -0
  307. data/ext/tokyotyrant-1.1.39/scrext.c +2394 -0
  308. data/ext/tokyotyrant-1.1.39/scrext.h +96 -0
  309. data/ext/tokyotyrant-1.1.39/tcrdb.c +2637 -0
  310. data/ext/tokyotyrant-1.1.39/tcrdb.h +801 -0
  311. data/ext/tokyotyrant-1.1.39/tcrmgr.c +1559 -0
  312. data/ext/tokyotyrant-1.1.39/tcrmttest.c +915 -0
  313. data/ext/tokyotyrant-1.1.39/tcrtest.c +1542 -0
  314. data/ext/tokyotyrant-1.1.39/tculog.c +1211 -0
  315. data/ext/tokyotyrant-1.1.39/tculog.h +392 -0
  316. data/ext/tokyotyrant-1.1.39/tokyotyrant.idl +143 -0
  317. data/ext/tokyotyrant-1.1.39/tokyotyrant.pc.in +14 -0
  318. data/ext/tokyotyrant-1.1.39/ttservctl +163 -0
  319. data/ext/tokyotyrant-1.1.39/ttserver.c +3583 -0
  320. data/ext/tokyotyrant-1.1.39/ttskeldir.c +141 -0
  321. data/ext/tokyotyrant-1.1.39/ttskelmock.c +64 -0
  322. data/ext/tokyotyrant-1.1.39/ttskelnull.c +79 -0
  323. data/ext/tokyotyrant-1.1.39/ttskelproxy.c +74 -0
  324. data/ext/tokyotyrant-1.1.39/ttulmgr.c +266 -0
  325. data/ext/tokyotyrant-1.1.39/ttultest.c +371 -0
  326. data/ext/tokyotyrant-1.1.39/ttutil.c +1510 -0
  327. data/ext/tokyotyrant-1.1.39/ttutil.h +494 -0
  328. data/lib/tokyo_tyrant/balancer.rb +189 -0
  329. data/spec/ext.lua +4 -0
  330. data/spec/plu_db.rb +538 -0
  331. data/spec/spec.rb +1 -0
  332. data/spec/spec_base.rb +17 -0
  333. data/spec/start_tyrants.sh +36 -0
  334. data/spec/stop_tyrants.sh +9 -0
  335. data/spec/tokyo_tyrant_balancer_db_spec.rb +160 -0
  336. data/spec/tokyo_tyrant_balancer_table_spec.rb +177 -0
  337. data/spec/tokyo_tyrant_query_spec.rb +159 -0
  338. data/spec/tokyo_tyrant_spec.rb +254 -0
  339. data/spec/tokyo_tyrant_table_spec.rb +301 -0
  340. metadata +402 -0
@@ -0,0 +1,1563 @@
1
+ /*************************************************************************************************
2
+ * The test cases of the table database API
3
+ * Copyright (C) 2006-2009 Mikio Hirabayashi
4
+ * This file is part of Tokyo Cabinet.
5
+ * Tokyo Cabinet is free software; you can redistribute it and/or modify it under the terms of
6
+ * the GNU Lesser General Public License as published by the Free Software Foundation; either
7
+ * version 2.1 of the License or any later version. Tokyo Cabinet is distributed in the hope
8
+ * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
9
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
10
+ * License for more details.
11
+ * You should have received a copy of the GNU Lesser General Public License along with Tokyo
12
+ * Cabinet; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
13
+ * Boston, MA 02111-1307 USA.
14
+ *************************************************************************************************/
15
+
16
+
17
+ #include <tcutil.h>
18
+ #include <tctdb.h>
19
+ #include "myconf.h"
20
+
21
+ #define RECBUFSIZ 48 // buffer for records
22
+
23
+ typedef struct { // type of structure for write thread
24
+ TCTDB *tdb;
25
+ int rnum;
26
+ bool rnd;
27
+ int id;
28
+ } TARGWRITE;
29
+
30
+ typedef struct { // type of structure for read thread
31
+ TCTDB *tdb;
32
+ int rnum;
33
+ bool rnd;
34
+ int id;
35
+ } TARGREAD;
36
+
37
+ typedef struct { // type of structure for remove thread
38
+ TCTDB *tdb;
39
+ int rnum;
40
+ bool rnd;
41
+ int id;
42
+ } TARGREMOVE;
43
+
44
+ typedef struct { // type of structure for wicked thread
45
+ TCTDB *tdb;
46
+ int rnum;
47
+ int id;
48
+ } TARGWICKED;
49
+
50
+ typedef struct { // type of structure for typical thread
51
+ TCTDB *tdb;
52
+ int rnum;
53
+ int rratio;
54
+ int id;
55
+ } TARGTYPICAL;
56
+
57
+
58
+ /* global variables */
59
+ const char *g_progname; // program name
60
+ unsigned int g_randseed; // random seed
61
+ int g_dbgfd; // debugging output
62
+
63
+
64
+ /* function prototypes */
65
+ int main(int argc, char **argv);
66
+ static void usage(void);
67
+ static void iprintf(const char *format, ...);
68
+ static void iputchar(int c);
69
+ static void eprint(TCTDB *tdb, int line, const char *func);
70
+ static void sysprint(void);
71
+ static int myrand(int range);
72
+ static int myrandnd(int range);
73
+ static int runwrite(int argc, char **argv);
74
+ static int runread(int argc, char **argv);
75
+ static int runremove(int argc, char **argv);
76
+ static int runwicked(int argc, char **argv);
77
+ static int runtypical(int argc, char **argv);
78
+ static int procwrite(const char *path, int tnum, int rnum, int bnum, int apow, int fpow,
79
+ int opts, int rcnum, int lcnum, int ncnum, int xmsiz, int dfunit,
80
+ int iflags, int omode, bool rnd);
81
+ static int procread(const char *path, int tnum, int rcnum, int lcnum, int ncnum,
82
+ int xmsiz, int dfunit, int omode, bool rnd);
83
+ static int procremove(const char *path, int tnum, int rcnum, int lcnum, int ncnum,
84
+ int xmsiz, int dfunit, int omode, bool rnd);
85
+ static int procwicked(const char *path, int tnum, int rnum, int opts, int omode);
86
+ static int proctypical(const char *path, int tnum, int rnum, int bnum, int apow, int fpow,
87
+ int opts, int rcnum, int lcnum, int ncnum, int xmsiz, int dfunit,
88
+ int omode, int rratio);
89
+ static void *threadwrite(void *targ);
90
+ static void *threadread(void *targ);
91
+ static void *threadremove(void *targ);
92
+ static void *threadwicked(void *targ);
93
+ static void *threadtypical(void *targ);
94
+
95
+
96
+ /* main routine */
97
+ int main(int argc, char **argv){
98
+ g_progname = argv[0];
99
+ const char *ebuf = getenv("TCRNDSEED");
100
+ g_randseed = ebuf ? tcatoix(ebuf) : tctime() * 1000;
101
+ srand(g_randseed);
102
+ ebuf = getenv("TCDBGFD");
103
+ g_dbgfd = ebuf ? tcatoix(ebuf) : UINT16_MAX;
104
+ if(argc < 2) usage();
105
+ int rv = 0;
106
+ if(!strcmp(argv[1], "write")){
107
+ rv = runwrite(argc, argv);
108
+ } else if(!strcmp(argv[1], "read")){
109
+ rv = runread(argc, argv);
110
+ } else if(!strcmp(argv[1], "remove")){
111
+ rv = runremove(argc, argv);
112
+ } else if(!strcmp(argv[1], "wicked")){
113
+ rv = runwicked(argc, argv);
114
+ } else if(!strcmp(argv[1], "typical")){
115
+ rv = runtypical(argc, argv);
116
+ } else {
117
+ usage();
118
+ }
119
+ if(rv != 0){
120
+ printf("FAILED: TCRNDSEED=%u PID=%d", g_randseed, (int)getpid());
121
+ for(int i = 0; i < argc; i++){
122
+ printf(" %s", argv[i]);
123
+ }
124
+ printf("\n\n");
125
+ }
126
+ return rv;
127
+ }
128
+
129
+
130
+ /* print the usage and exit */
131
+ static void usage(void){
132
+ fprintf(stderr, "%s: test cases of the table database API of Tokyo Cabinet\n", g_progname);
133
+ fprintf(stderr, "\n");
134
+ fprintf(stderr, "usage:\n");
135
+ fprintf(stderr, " %s write [-tl] [-td|-tb|-tt|-tx] [-rc num] [-lc num] [-nc num]"
136
+ " [-xm num] [-df num] [-ip] [-is] [-in] [-it] [-if] [-ix] [-nl|-nb] [-rnd]"
137
+ " path tnum rnum [bnum [apow [fpow]]]\n", g_progname);
138
+ fprintf(stderr, " %s read [-rc num] [-lc num] [-nc num] [-xm num] [-df num] [-nl|-nb] [-rnd]"
139
+ " path tnum\n", g_progname);
140
+ fprintf(stderr, " %s remove [-rc num] [-lc num] [-nc num] [-xm num] [-df num]"
141
+ " [-nl|-nb] [-rnd] path tnum\n", g_progname);
142
+ fprintf(stderr, " %s wicked [-tl] [-td|-tb|-tt|-tx] [-nl|-nb] path tnum rnum\n", g_progname);
143
+ fprintf(stderr, " %s typical [-tl] [-td|-tb|-tt|-tx] [-rc num] [-lc num] [-nc num]"
144
+ " [-xm num] [-df num] [-nl|-nb] [-rr num] path tnum rnum [bnum [apow [fpow]]]\n",
145
+ g_progname);
146
+ fprintf(stderr, "\n");
147
+ exit(1);
148
+ }
149
+
150
+
151
+ /* print formatted information string and flush the buffer */
152
+ static void iprintf(const char *format, ...){
153
+ va_list ap;
154
+ va_start(ap, format);
155
+ vprintf(format, ap);
156
+ fflush(stdout);
157
+ va_end(ap);
158
+ }
159
+
160
+
161
+ /* print a character and flush the buffer */
162
+ static void iputchar(int c){
163
+ putchar(c);
164
+ fflush(stdout);
165
+ }
166
+
167
+
168
+ /* print error message of table database */
169
+ static void eprint(TCTDB *tdb, int line, const char *func){
170
+ const char *path = tctdbpath(tdb);
171
+ int ecode = tctdbecode(tdb);
172
+ fprintf(stderr, "%s: %s: %d: %s: error: %d: %s\n",
173
+ g_progname, path ? path : "-", line, func, ecode, tctdberrmsg(ecode));
174
+ }
175
+
176
+
177
+ /* print system information */
178
+ static void sysprint(void){
179
+ TCMAP *info = tcsysinfo();
180
+ if(info){
181
+ tcmapiterinit(info);
182
+ const char *kbuf;
183
+ while((kbuf = tcmapiternext2(info)) != NULL){
184
+ iprintf("sys_%s: %s\n", kbuf, tcmapiterval2(kbuf));
185
+ }
186
+ tcmapdel(info);
187
+ }
188
+ }
189
+
190
+
191
+ /* get a random number */
192
+ static int myrand(int range){
193
+ if(range < 2) return 0;
194
+ int high = (unsigned int)rand() >> 4;
195
+ int low = range * (rand() / (RAND_MAX + 1.0));
196
+ low &= (unsigned int)INT_MAX >> 4;
197
+ return (high + low) % range;
198
+ }
199
+
200
+
201
+ /* get a random number based on normal distribution */
202
+ static int myrandnd(int range){
203
+ int num = (int)tcdrandnd(range >> 1, range / 10);
204
+ return (num < 0 || num >= range) ? 0 : num;
205
+ }
206
+
207
+
208
+ /* parse arguments of write command */
209
+ static int runwrite(int argc, char **argv){
210
+ char *path = NULL;
211
+ char *tstr = NULL;
212
+ char *rstr = NULL;
213
+ char *bstr = NULL;
214
+ char *astr = NULL;
215
+ char *fstr = NULL;
216
+ int opts = 0;
217
+ int rcnum = 0;
218
+ int lcnum = 0;
219
+ int ncnum = 0;
220
+ int xmsiz = -1;
221
+ int dfunit = 0;
222
+ int iflags = 0;
223
+ int omode = 0;
224
+ bool rnd = false;
225
+ for(int i = 2; i < argc; i++){
226
+ if(!path && argv[i][0] == '-'){
227
+ if(!strcmp(argv[i], "-tl")){
228
+ opts |= TDBTLARGE;
229
+ } else if(!strcmp(argv[i], "-td")){
230
+ opts |= TDBTDEFLATE;
231
+ } else if(!strcmp(argv[i], "-tb")){
232
+ opts |= TDBTBZIP;
233
+ } else if(!strcmp(argv[i], "-tt")){
234
+ opts |= TDBTTCBS;
235
+ } else if(!strcmp(argv[i], "-tx")){
236
+ opts |= TDBTEXCODEC;
237
+ } else if(!strcmp(argv[i], "-rc")){
238
+ if(++i >= argc) usage();
239
+ rcnum = tcatoix(argv[i]);
240
+ } else if(!strcmp(argv[i], "-lc")){
241
+ if(++i >= argc) usage();
242
+ lcnum = tcatoix(argv[i]);
243
+ } else if(!strcmp(argv[i], "-nc")){
244
+ if(++i >= argc) usage();
245
+ ncnum = tcatoix(argv[i]);
246
+ } else if(!strcmp(argv[i], "-xm")){
247
+ if(++i >= argc) usage();
248
+ xmsiz = tcatoix(argv[i]);
249
+ } else if(!strcmp(argv[i], "-df")){
250
+ if(++i >= argc) usage();
251
+ dfunit = tcatoix(argv[i]);
252
+ } else if(!strcmp(argv[i], "-ip")){
253
+ iflags |= 1 << 0;
254
+ } else if(!strcmp(argv[i], "-is")){
255
+ iflags |= 1 << 1;
256
+ } else if(!strcmp(argv[i], "-in")){
257
+ iflags |= 1 << 2;
258
+ } else if(!strcmp(argv[i], "-it")){
259
+ iflags |= 1 << 3;
260
+ } else if(!strcmp(argv[i], "-if")){
261
+ iflags |= 1 << 4;
262
+ } else if(!strcmp(argv[i], "-ix")){
263
+ iflags |= 1 << 5;
264
+ } else if(!strcmp(argv[i], "-nl")){
265
+ omode |= TDBONOLCK;
266
+ } else if(!strcmp(argv[i], "-nb")){
267
+ omode |= TDBOLCKNB;
268
+ } else if(!strcmp(argv[i], "-rnd")){
269
+ rnd = true;
270
+ } else {
271
+ usage();
272
+ }
273
+ } else if(!path){
274
+ path = argv[i];
275
+ } else if(!tstr){
276
+ tstr = argv[i];
277
+ } else if(!rstr){
278
+ rstr = argv[i];
279
+ } else if(!bstr){
280
+ bstr = argv[i];
281
+ } else if(!astr){
282
+ astr = argv[i];
283
+ } else if(!fstr){
284
+ fstr = argv[i];
285
+ } else {
286
+ usage();
287
+ }
288
+ }
289
+ if(!path || !tstr || !rstr) usage();
290
+ int tnum = tcatoix(tstr);
291
+ int rnum = tcatoix(rstr);
292
+ if(tnum < 1 || rnum < 1) usage();
293
+ int bnum = bstr ? tcatoix(bstr) : -1;
294
+ int apow = astr ? tcatoix(astr) : -1;
295
+ int fpow = fstr ? tcatoix(fstr) : -1;
296
+ int rv = procwrite(path, tnum, rnum, bnum, apow, fpow, opts, rcnum, lcnum, ncnum,
297
+ xmsiz, dfunit, iflags, omode, rnd);
298
+ return rv;
299
+ }
300
+
301
+
302
+ /* parse arguments of read command */
303
+ static int runread(int argc, char **argv){
304
+ char *path = NULL;
305
+ char *tstr = NULL;
306
+ int rcnum = 0;
307
+ int lcnum = 0;
308
+ int ncnum = 0;
309
+ int xmsiz = -1;
310
+ int dfunit = 0;
311
+ int omode = 0;
312
+ bool rnd = false;
313
+ for(int i = 2; i < argc; i++){
314
+ if(!path && argv[i][0] == '-'){
315
+ if(!strcmp(argv[i], "-rc")){
316
+ if(++i >= argc) usage();
317
+ rcnum = tcatoix(argv[i]);
318
+ } else if(!strcmp(argv[i], "-lc")){
319
+ if(++i >= argc) usage();
320
+ lcnum = tcatoix(argv[i]);
321
+ } else if(!strcmp(argv[i], "-nc")){
322
+ if(++i >= argc) usage();
323
+ ncnum = tcatoix(argv[i]);
324
+ } else if(!strcmp(argv[i], "-xm")){
325
+ if(++i >= argc) usage();
326
+ xmsiz = tcatoix(argv[i]);
327
+ } else if(!strcmp(argv[i], "-df")){
328
+ if(++i >= argc) usage();
329
+ dfunit = tcatoix(argv[i]);
330
+ } else if(!strcmp(argv[i], "-nl")){
331
+ omode |= TDBONOLCK;
332
+ } else if(!strcmp(argv[i], "-nb")){
333
+ omode |= TDBOLCKNB;
334
+ } else if(!strcmp(argv[i], "-rnd")){
335
+ rnd = true;
336
+ } else {
337
+ usage();
338
+ }
339
+ } else if(!path){
340
+ path = argv[i];
341
+ } else if(!tstr){
342
+ tstr = argv[i];
343
+ } else {
344
+ usage();
345
+ }
346
+ }
347
+ if(!path || !tstr) usage();
348
+ int tnum = tcatoix(tstr);
349
+ if(tnum < 1) usage();
350
+ int rv = procread(path, tnum, rcnum, lcnum, ncnum, xmsiz, dfunit, omode, rnd);
351
+ return rv;
352
+ }
353
+
354
+
355
+ /* parse arguments of remove command */
356
+ static int runremove(int argc, char **argv){
357
+ char *path = NULL;
358
+ char *tstr = NULL;
359
+ int rcnum = 0;
360
+ int lcnum = 0;
361
+ int ncnum = 0;
362
+ int xmsiz = -1;
363
+ int dfunit = 0;
364
+ int omode = 0;
365
+ bool rnd = false;
366
+ for(int i = 2; i < argc; i++){
367
+ if(!path && argv[i][0] == '-'){
368
+ if(!strcmp(argv[i], "-rc")){
369
+ if(++i >= argc) usage();
370
+ rcnum = tcatoix(argv[i]);
371
+ } else if(!strcmp(argv[i], "-lc")){
372
+ if(++i >= argc) usage();
373
+ lcnum = tcatoix(argv[i]);
374
+ } else if(!strcmp(argv[i], "-nc")){
375
+ if(++i >= argc) usage();
376
+ ncnum = tcatoix(argv[i]);
377
+ } else if(!strcmp(argv[i], "-xm")){
378
+ if(++i >= argc) usage();
379
+ xmsiz = tcatoix(argv[i]);
380
+ } else if(!strcmp(argv[i], "-df")){
381
+ if(++i >= argc) usage();
382
+ dfunit = tcatoix(argv[i]);
383
+ } else if(!strcmp(argv[i], "-nl")){
384
+ omode |= TDBONOLCK;
385
+ } else if(!strcmp(argv[i], "-nb")){
386
+ omode |= TDBOLCKNB;
387
+ } else if(!strcmp(argv[i], "-rnd")){
388
+ rnd = true;
389
+ } else {
390
+ usage();
391
+ }
392
+ } else if(!path){
393
+ path = argv[i];
394
+ } else if(!tstr){
395
+ tstr = argv[i];
396
+ } else {
397
+ usage();
398
+ }
399
+ }
400
+ if(!path || !tstr) usage();
401
+ int tnum = tcatoix(tstr);
402
+ if(tnum < 1) usage();
403
+ int rv = procremove(path, tnum, rcnum, lcnum, ncnum, xmsiz, dfunit, omode, rnd);
404
+ return rv;
405
+ }
406
+
407
+
408
+ /* parse arguments of wicked command */
409
+ static int runwicked(int argc, char **argv){
410
+ char *path = NULL;
411
+ char *tstr = NULL;
412
+ char *rstr = NULL;
413
+ int opts = 0;
414
+ int omode = 0;
415
+ for(int i = 2; i < argc; i++){
416
+ if(!path && argv[i][0] == '-'){
417
+ if(!strcmp(argv[i], "-tl")){
418
+ opts |= TDBTLARGE;
419
+ } else if(!strcmp(argv[i], "-td")){
420
+ opts |= TDBTDEFLATE;
421
+ } else if(!strcmp(argv[i], "-tb")){
422
+ opts |= TDBTBZIP;
423
+ } else if(!strcmp(argv[i], "-tt")){
424
+ opts |= TDBTTCBS;
425
+ } else if(!strcmp(argv[i], "-tx")){
426
+ opts |= TDBTEXCODEC;
427
+ } else if(!strcmp(argv[i], "-nl")){
428
+ omode |= TDBONOLCK;
429
+ } else if(!strcmp(argv[i], "-nb")){
430
+ omode |= TDBOLCKNB;
431
+ } else {
432
+ usage();
433
+ }
434
+ } else if(!path){
435
+ path = argv[i];
436
+ } else if(!tstr){
437
+ tstr = argv[i];
438
+ } else if(!rstr){
439
+ rstr = argv[i];
440
+ } else {
441
+ usage();
442
+ }
443
+ }
444
+ if(!path || !tstr || !rstr) usage();
445
+ int tnum = tcatoix(tstr);
446
+ int rnum = tcatoix(rstr);
447
+ if(tnum < 1 || rnum < 1) usage();
448
+ int rv = procwicked(path, tnum, rnum, opts, omode);
449
+ return rv;
450
+ }
451
+
452
+
453
+ /* parse arguments of typical command */
454
+ static int runtypical(int argc, char **argv){
455
+ char *path = NULL;
456
+ char *tstr = NULL;
457
+ char *rstr = NULL;
458
+ char *bstr = NULL;
459
+ char *astr = NULL;
460
+ char *fstr = NULL;
461
+ int opts = 0;
462
+ int rcnum = 0;
463
+ int lcnum = 0;
464
+ int ncnum = 0;
465
+ int xmsiz = -1;
466
+ int dfunit = 0;
467
+ int omode = 0;
468
+ int rratio = -1;
469
+ for(int i = 2; i < argc; i++){
470
+ if(!path && argv[i][0] == '-'){
471
+ if(!strcmp(argv[i], "-tl")){
472
+ opts |= TDBTLARGE;
473
+ } else if(!strcmp(argv[i], "-td")){
474
+ opts |= TDBTDEFLATE;
475
+ } else if(!strcmp(argv[i], "-tb")){
476
+ opts |= TDBTBZIP;
477
+ } else if(!strcmp(argv[i], "-tt")){
478
+ opts |= TDBTTCBS;
479
+ } else if(!strcmp(argv[i], "-tx")){
480
+ opts |= TDBTEXCODEC;
481
+ } else if(!strcmp(argv[i], "-rc")){
482
+ if(++i >= argc) usage();
483
+ rcnum = tcatoix(argv[i]);
484
+ } else if(!strcmp(argv[i], "-lc")){
485
+ if(++i >= argc) usage();
486
+ lcnum = tcatoix(argv[i]);
487
+ } else if(!strcmp(argv[i], "-nc")){
488
+ if(++i >= argc) usage();
489
+ ncnum = tcatoix(argv[i]);
490
+ } else if(!strcmp(argv[i], "-xm")){
491
+ if(++i >= argc) usage();
492
+ xmsiz = tcatoix(argv[i]);
493
+ } else if(!strcmp(argv[i], "-df")){
494
+ if(++i >= argc) usage();
495
+ dfunit = tcatoix(argv[i]);
496
+ } else if(!strcmp(argv[i], "-nl")){
497
+ omode |= TDBONOLCK;
498
+ } else if(!strcmp(argv[i], "-nb")){
499
+ omode |= TDBOLCKNB;
500
+ } else if(!strcmp(argv[i], "-rr")){
501
+ if(++i >= argc) usage();
502
+ rratio = tcatoix(argv[i]);
503
+ } else {
504
+ usage();
505
+ }
506
+ } else if(!path){
507
+ path = argv[i];
508
+ } else if(!tstr){
509
+ tstr = argv[i];
510
+ } else if(!rstr){
511
+ rstr = argv[i];
512
+ } else if(!bstr){
513
+ bstr = argv[i];
514
+ } else if(!astr){
515
+ astr = argv[i];
516
+ } else if(!fstr){
517
+ fstr = argv[i];
518
+ } else {
519
+ usage();
520
+ }
521
+ }
522
+ if(!path || !tstr || !rstr) usage();
523
+ int tnum = tcatoix(tstr);
524
+ int rnum = tcatoix(rstr);
525
+ if(tnum < 1 || rnum < 1) usage();
526
+ int bnum = bstr ? tcatoix(bstr) : -1;
527
+ int apow = astr ? tcatoix(astr) : -1;
528
+ int fpow = fstr ? tcatoix(fstr) : -1;
529
+ int rv = proctypical(path, tnum, rnum, bnum, apow, fpow, opts, rcnum, lcnum, ncnum,
530
+ xmsiz, dfunit, omode, rratio);
531
+ return rv;
532
+ }
533
+
534
+
535
+ /* perform write command */
536
+ static int procwrite(const char *path, int tnum, int rnum, int bnum, int apow, int fpow,
537
+ int opts, int rcnum, int lcnum, int ncnum, int xmsiz, int dfunit,
538
+ int iflags, int omode, bool rnd){
539
+ iprintf("<Writing Test>\n seed=%u path=%s tnum=%d rnum=%d bnum=%d apow=%d fpow=%d"
540
+ " opts=%d rcnum=%d lcnum=%d ncnum=%d xmsiz=%d dfunit=%d iflags=%d"
541
+ " omode=%d rnd=%d\n\n",
542
+ g_randseed, path, tnum, rnum, bnum, apow, fpow, opts, rcnum, lcnum, ncnum,
543
+ xmsiz, dfunit, iflags, omode, rnd);
544
+ bool err = false;
545
+ double stime = tctime();
546
+ TCTDB *tdb = tctdbnew();
547
+ if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd);
548
+ if(!tctdbsetmutex(tdb)){
549
+ eprint(tdb, __LINE__, "tctdbsetmutex");
550
+ err = true;
551
+ }
552
+ if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){
553
+ eprint(tdb, __LINE__, "tctdbsetcodecfunc");
554
+ err = true;
555
+ }
556
+ if(!tctdbtune(tdb, bnum, apow, fpow, opts)){
557
+ eprint(tdb, __LINE__, "tctdbtune");
558
+ err = true;
559
+ }
560
+ if(!tctdbsetcache(tdb, rcnum, lcnum, ncnum)){
561
+ eprint(tdb, __LINE__, "tctdbsetcache");
562
+ err = true;
563
+ }
564
+ if(xmsiz >= 0 && !tctdbsetxmsiz(tdb, xmsiz)){
565
+ eprint(tdb, __LINE__, "tctdbsetxmsiz");
566
+ err = true;
567
+ }
568
+ if(dfunit >= 0 && !tctdbsetdfunit(tdb, dfunit)){
569
+ eprint(tdb, __LINE__, "tctdbsetdfunit");
570
+ err = true;
571
+ }
572
+ if(!tctdbopen(tdb, path, TDBOWRITER | TDBOCREAT | TDBOTRUNC | omode)){
573
+ eprint(tdb, __LINE__, "tctdbopen");
574
+ err = true;
575
+ }
576
+ if((iflags & (1 << 0)) && !tctdbsetindex(tdb, "", TDBITDECIMAL)){
577
+ eprint(tdb, __LINE__, "tctdbsetindex");
578
+ err = true;
579
+ }
580
+ if((iflags & (1 << 1)) && !tctdbsetindex(tdb, "str", TDBITLEXICAL)){
581
+ eprint(tdb, __LINE__, "tctdbsetindex");
582
+ err = true;
583
+ }
584
+ if((iflags & (1 << 2)) && !tctdbsetindex(tdb, "num", TDBITDECIMAL)){
585
+ eprint(tdb, __LINE__, "tctdbsetindex");
586
+ err = true;
587
+ }
588
+ if((iflags & (1 << 3)) && !tctdbsetindex(tdb, "type", TDBITDECIMAL)){
589
+ eprint(tdb, __LINE__, "tctdbsetindex");
590
+ err = true;
591
+ }
592
+ if((iflags & (1 << 4)) && !tctdbsetindex(tdb, "flag", TDBITTOKEN)){
593
+ eprint(tdb, __LINE__, "tctdbsetindex");
594
+ err = true;
595
+ }
596
+ if((iflags & (1 << 5)) && !tctdbsetindex(tdb, "text", TDBITQGRAM)){
597
+ eprint(tdb, __LINE__, "tctdbsetindex");
598
+ err = true;
599
+ }
600
+ TARGWRITE targs[tnum];
601
+ pthread_t threads[tnum];
602
+ if(tnum == 1){
603
+ targs[0].tdb = tdb;
604
+ targs[0].rnum = rnum;
605
+ targs[0].rnd = rnd;
606
+ targs[0].id = 0;
607
+ if(threadwrite(targs) != NULL) err = true;
608
+ } else {
609
+ for(int i = 0; i < tnum; i++){
610
+ targs[i].tdb = tdb;
611
+ targs[i].rnum = rnum;
612
+ targs[i].rnd = rnd;
613
+ targs[i].id = i;
614
+ if(pthread_create(threads + i, NULL, threadwrite, targs + i) != 0){
615
+ eprint(tdb, __LINE__, "pthread_create");
616
+ targs[i].id = -1;
617
+ err = true;
618
+ }
619
+ }
620
+ for(int i = 0; i < tnum; i++){
621
+ if(targs[i].id == -1) continue;
622
+ void *rv;
623
+ if(pthread_join(threads[i], &rv) != 0){
624
+ eprint(tdb, __LINE__, "pthread_join");
625
+ err = true;
626
+ } else if(rv){
627
+ err = true;
628
+ }
629
+ }
630
+ }
631
+ iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb));
632
+ iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb));
633
+ sysprint();
634
+ if(!tctdbclose(tdb)){
635
+ eprint(tdb, __LINE__, "tctdbclose");
636
+ err = true;
637
+ }
638
+ tctdbdel(tdb);
639
+ iprintf("time: %.3f\n", tctime() - stime);
640
+ iprintf("%s\n\n", err ? "error" : "ok");
641
+ return err ? 1 : 0;
642
+ }
643
+
644
+
645
+ /* perform read command */
646
+ static int procread(const char *path, int tnum, int rcnum, int lcnum, int ncnum,
647
+ int xmsiz, int dfunit, int omode, bool rnd){
648
+ iprintf("<Reading Test>\n seed=%u path=%s tnum=%d rcnum=%d lcnum=%d ncnum=%d"
649
+ " xmsiz=%d dfunit=%d omode=%d rnd=%d\n\n",
650
+ g_randseed, path, tnum, rcnum, lcnum, ncnum, xmsiz, dfunit, omode, rnd);
651
+ bool err = false;
652
+ double stime = tctime();
653
+ TCTDB *tdb = tctdbnew();
654
+ if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd);
655
+ if(!tctdbsetmutex(tdb)){
656
+ eprint(tdb, __LINE__, "tctdbsetmutex");
657
+ err = true;
658
+ }
659
+ if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){
660
+ eprint(tdb, __LINE__, "tctdbsetcodecfunc");
661
+ err = true;
662
+ }
663
+ if(!tctdbsetcache(tdb, rcnum, lcnum, ncnum)){
664
+ eprint(tdb, __LINE__, "tctdbsetcache");
665
+ err = true;
666
+ }
667
+ if(xmsiz >= 0 && !tctdbsetxmsiz(tdb, xmsiz)){
668
+ eprint(tdb, __LINE__, "tctdbsetxmsiz");
669
+ err = true;
670
+ }
671
+ if(dfunit >= 0 && !tctdbsetdfunit(tdb, dfunit)){
672
+ eprint(tdb, __LINE__, "tctdbsetdfunit");
673
+ err = true;
674
+ }
675
+ if(!tctdbopen(tdb, path, TDBOREADER | omode)){
676
+ eprint(tdb, __LINE__, "tctdbopen");
677
+ err = true;
678
+ }
679
+ int rnum = tctdbrnum(tdb) / tnum;
680
+ TARGREAD targs[tnum];
681
+ pthread_t threads[tnum];
682
+ if(tnum == 1){
683
+ targs[0].tdb = tdb;
684
+ targs[0].rnum = rnum;
685
+ targs[0].rnd = rnd;
686
+ targs[0].id = 0;
687
+ if(threadread(targs) != NULL) err = true;
688
+ } else {
689
+ for(int i = 0; i < tnum; i++){
690
+ targs[i].tdb = tdb;
691
+ targs[i].rnum = rnum;
692
+ targs[i].rnd = rnd;
693
+ targs[i].id = i;
694
+ if(pthread_create(threads + i, NULL, threadread, targs + i) != 0){
695
+ eprint(tdb, __LINE__, "pthread_create");
696
+ targs[i].id = -1;
697
+ err = true;
698
+ }
699
+ }
700
+ for(int i = 0; i < tnum; i++){
701
+ if(targs[i].id == -1) continue;
702
+ void *rv;
703
+ if(pthread_join(threads[i], &rv) != 0){
704
+ eprint(tdb, __LINE__, "pthread_join");
705
+ err = true;
706
+ } else if(rv){
707
+ err = true;
708
+ }
709
+ }
710
+ }
711
+ iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb));
712
+ iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb));
713
+ sysprint();
714
+ if(!tctdbclose(tdb)){
715
+ eprint(tdb, __LINE__, "tctdbclose");
716
+ err = true;
717
+ }
718
+ tctdbdel(tdb);
719
+ iprintf("time: %.3f\n", tctime() - stime);
720
+ iprintf("%s\n\n", err ? "error" : "ok");
721
+ return err ? 1 : 0;
722
+ }
723
+
724
+
725
+ /* perform remove command */
726
+ static int procremove(const char *path, int tnum, int rcnum, int lcnum, int ncnum,
727
+ int xmsiz, int dfunit, int omode, bool rnd){
728
+ iprintf("<Removing Test>\n seed=%u path=%s tnum=%d rcnum=%d lcnum=%d ncnum=%d"
729
+ " xmsiz=%d dfunit=%d omode=%d rnd=%d\n\n",
730
+ g_randseed, path, tnum, rcnum, lcnum, ncnum, xmsiz, dfunit, omode, rnd);
731
+ bool err = false;
732
+ double stime = tctime();
733
+ TCTDB *tdb = tctdbnew();
734
+ if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd);
735
+ if(!tctdbsetmutex(tdb)){
736
+ eprint(tdb, __LINE__, "tctdbsetmutex");
737
+ err = true;
738
+ }
739
+ if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){
740
+ eprint(tdb, __LINE__, "tctdbsetcodecfunc");
741
+ err = true;
742
+ }
743
+ if(!tctdbsetcache(tdb, rcnum, lcnum, ncnum)){
744
+ eprint(tdb, __LINE__, "tctdbsetcache");
745
+ err = true;
746
+ }
747
+ if(xmsiz >= 0 && !tctdbsetxmsiz(tdb, xmsiz)){
748
+ eprint(tdb, __LINE__, "tctdbsetxmsiz");
749
+ err = true;
750
+ }
751
+ if(dfunit >= 0 && !tctdbsetdfunit(tdb, dfunit)){
752
+ eprint(tdb, __LINE__, "tctdbsetdfunit");
753
+ err = true;
754
+ }
755
+ if(!tctdbopen(tdb, path, TDBOWRITER | omode)){
756
+ eprint(tdb, __LINE__, "tctdbopen");
757
+ err = true;
758
+ }
759
+ int rnum = tctdbrnum(tdb) / tnum;
760
+ TARGREMOVE targs[tnum];
761
+ pthread_t threads[tnum];
762
+ if(tnum == 1){
763
+ targs[0].tdb = tdb;
764
+ targs[0].rnum = rnum;
765
+ targs[0].rnd = rnd;
766
+ targs[0].id = 0;
767
+ if(threadremove(targs) != NULL) err = true;
768
+ } else {
769
+ for(int i = 0; i < tnum; i++){
770
+ targs[i].tdb = tdb;
771
+ targs[i].rnum = rnum;
772
+ targs[i].rnd = rnd;
773
+ targs[i].id = i;
774
+ if(pthread_create(threads + i, NULL, threadremove, targs + i) != 0){
775
+ eprint(tdb, __LINE__, "pthread_create");
776
+ targs[i].id = -1;
777
+ err = true;
778
+ }
779
+ }
780
+ for(int i = 0; i < tnum; i++){
781
+ if(targs[i].id == -1) continue;
782
+ void *rv;
783
+ if(pthread_join(threads[i], &rv) != 0){
784
+ eprint(tdb, __LINE__, "pthread_join");
785
+ err = true;
786
+ } else if(rv){
787
+ err = true;
788
+ }
789
+ }
790
+ }
791
+ iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb));
792
+ iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb));
793
+ sysprint();
794
+ if(!tctdbclose(tdb)){
795
+ eprint(tdb, __LINE__, "tctdbclose");
796
+ err = true;
797
+ }
798
+ tctdbdel(tdb);
799
+ iprintf("time: %.3f\n", tctime() - stime);
800
+ iprintf("%s\n\n", err ? "error" : "ok");
801
+ return err ? 1 : 0;
802
+ }
803
+
804
+
805
+ /* perform wicked command */
806
+ static int procwicked(const char *path, int tnum, int rnum, int opts, int omode){
807
+ iprintf("<Writing Test>\n seed=%u path=%s tnum=%d rnum=%d opts=%d omode=%d\n\n",
808
+ g_randseed, path, tnum, rnum, opts, omode);
809
+ bool err = false;
810
+ double stime = tctime();
811
+ TCTDB *tdb = tctdbnew();
812
+ if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd);
813
+ if(!tctdbsetmutex(tdb)){
814
+ eprint(tdb, __LINE__, "tctdbsetmutex");
815
+ err = true;
816
+ }
817
+ if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){
818
+ eprint(tdb, __LINE__, "tctdbsetcodecfunc");
819
+ err = true;
820
+ }
821
+ if(!tctdbtune(tdb, rnum / 50, 2, -1, opts)){
822
+ eprint(tdb, __LINE__, "tctdbtune");
823
+ err = true;
824
+ }
825
+ if(!tctdbsetcache(tdb, rnum / 10, 128, 256)){
826
+ eprint(tdb, __LINE__, "tctdbsetcache");
827
+ err = true;
828
+ }
829
+ if(!tctdbsetxmsiz(tdb, rnum * sizeof(int))){
830
+ eprint(tdb, __LINE__, "tctdbsetxmsiz");
831
+ err = true;
832
+ }
833
+ if(!tctdbsetdfunit(tdb, 8)){
834
+ eprint(tdb, __LINE__, "tctdbsetdfunit");
835
+ err = true;
836
+ }
837
+ if(!tctdbsetinvcache(tdb, -1, 0.5)){
838
+ eprint(tdb, __LINE__, "tctdbsetinvcache");
839
+ err = true;
840
+ }
841
+ if(!tctdbopen(tdb, path, TDBOWRITER | TDBOCREAT | TDBOTRUNC | omode)){
842
+ eprint(tdb, __LINE__, "tctdbopen");
843
+ err = true;
844
+ }
845
+ if(!tctdbsetindex(tdb, "", TDBITDECIMAL)){
846
+ eprint(tdb, __LINE__, "tctdbsetindex");
847
+ err = true;
848
+ }
849
+ if(!tctdbsetindex(tdb, "str", TDBITLEXICAL)){
850
+ eprint(tdb, __LINE__, "tctdbsetindex");
851
+ err = true;
852
+ }
853
+ if(!tctdbsetindex(tdb, "num", TDBITDECIMAL)){
854
+ eprint(tdb, __LINE__, "tctdbsetindex");
855
+ err = true;
856
+ }
857
+ if(!tctdbsetindex(tdb, "type", TDBITDECIMAL)){
858
+ eprint(tdb, __LINE__, "tctdbsetindex");
859
+ err = true;
860
+ }
861
+ if(!tctdbsetindex(tdb, "flag", TDBITTOKEN)){
862
+ eprint(tdb, __LINE__, "tctdbsetindex");
863
+ err = true;
864
+ }
865
+ if(!tctdbsetindex(tdb, "text", TDBITQGRAM)){
866
+ eprint(tdb, __LINE__, "tctdbsetindex");
867
+ err = true;
868
+ }
869
+ if(!tctdbiterinit(tdb)){
870
+ eprint(tdb, __LINE__, "tctdbiterinit");
871
+ err = true;
872
+ }
873
+ TARGWICKED targs[tnum];
874
+ pthread_t threads[tnum];
875
+ if(tnum == 1){
876
+ targs[0].tdb = tdb;
877
+ targs[0].rnum = rnum;
878
+ targs[0].id = 0;
879
+ if(threadwicked(targs) != NULL) err = true;
880
+ } else {
881
+ for(int i = 0; i < tnum; i++){
882
+ targs[i].tdb = tdb;
883
+ targs[i].rnum = rnum;
884
+ targs[i].id = i;
885
+ if(pthread_create(threads + i, NULL, threadwicked, targs + i) != 0){
886
+ eprint(tdb, __LINE__, "pthread_create");
887
+ targs[i].id = -1;
888
+ err = true;
889
+ }
890
+ }
891
+ for(int i = 0; i < tnum; i++){
892
+ if(targs[i].id == -1) continue;
893
+ void *rv;
894
+ if(pthread_join(threads[i], &rv) != 0){
895
+ eprint(tdb, __LINE__, "pthread_join");
896
+ err = true;
897
+ } else if(rv){
898
+ err = true;
899
+ }
900
+ }
901
+ }
902
+ iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb));
903
+ iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb));
904
+ sysprint();
905
+ if(!tctdbclose(tdb)){
906
+ eprint(tdb, __LINE__, "tctdbclose");
907
+ err = true;
908
+ }
909
+ tctdbdel(tdb);
910
+ iprintf("time: %.3f\n", tctime() - stime);
911
+ iprintf("%s\n\n", err ? "error" : "ok");
912
+ return err ? 1 : 0;
913
+ }
914
+
915
+
916
+ /* perform typical command */
917
+ static int proctypical(const char *path, int tnum, int rnum, int bnum, int apow, int fpow,
918
+ int opts, int rcnum, int lcnum, int ncnum, int xmsiz, int dfunit,
919
+ int omode, int rratio){
920
+ iprintf("<Typical Access Test>\n seed=%u path=%s tnum=%d rnum=%d bnum=%d apow=%d"
921
+ " fpow=%d opts=%d rcnum=%d lcnum=%d ncnum=%d xmsiz=%d dfunit=%d"
922
+ " omode=%d rratio=%d\n\n",
923
+ g_randseed, path, tnum, rnum, bnum, apow, fpow, opts, rcnum, lcnum, ncnum,
924
+ xmsiz, dfunit, omode, rratio);
925
+ bool err = false;
926
+ double stime = tctime();
927
+ TCTDB *tdb = tctdbnew();
928
+ if(g_dbgfd >= 0) tctdbsetdbgfd(tdb, g_dbgfd);
929
+ if(!tctdbsetmutex(tdb)){
930
+ eprint(tdb, __LINE__, "tctdbsetmutex");
931
+ err = true;
932
+ }
933
+ if(!tctdbsetcodecfunc(tdb, _tc_recencode, NULL, _tc_recdecode, NULL)){
934
+ eprint(tdb, __LINE__, "tctdbsetcodecfunc");
935
+ err = true;
936
+ }
937
+ if(!tctdbtune(tdb, bnum, apow, fpow, opts)){
938
+ eprint(tdb, __LINE__, "tctdbtune");
939
+ err = true;
940
+ }
941
+ if(!tctdbsetcache(tdb, rcnum, lcnum, ncnum)){
942
+ eprint(tdb, __LINE__, "tctdbsetcache");
943
+ err = true;
944
+ }
945
+ if(xmsiz >= 0 && !tctdbsetxmsiz(tdb, xmsiz)){
946
+ eprint(tdb, __LINE__, "tctdbsetxmsiz");
947
+ err = true;
948
+ }
949
+ if(dfunit >= 0 && !tctdbsetdfunit(tdb, dfunit)){
950
+ eprint(tdb, __LINE__, "tctdbsetdfunit");
951
+ err = true;
952
+ }
953
+ if(!tctdbopen(tdb, path, TDBOWRITER | TDBOCREAT | TDBOTRUNC | omode)){
954
+ eprint(tdb, __LINE__, "tctdbopen");
955
+ err = true;
956
+ }
957
+ if(!tctdbsetindex(tdb, "", TDBITDECIMAL)){
958
+ eprint(tdb, __LINE__, "tctdbsetindex");
959
+ err = true;
960
+ }
961
+ if(!tctdbsetindex(tdb, "str", TDBITLEXICAL)){
962
+ eprint(tdb, __LINE__, "tctdbsetindex");
963
+ err = true;
964
+ }
965
+ if(!tctdbsetindex(tdb, "num", TDBITDECIMAL)){
966
+ eprint(tdb, __LINE__, "tctdbsetindex");
967
+ err = true;
968
+ }
969
+ if(!tctdbsetindex(tdb, "type", TDBITDECIMAL)){
970
+ eprint(tdb, __LINE__, "tctdbsetindex");
971
+ err = true;
972
+ }
973
+ if(!tctdbsetindex(tdb, "flag", TDBITTOKEN)){
974
+ eprint(tdb, __LINE__, "tctdbsetindex");
975
+ err = true;
976
+ }
977
+ if(!tctdbsetindex(tdb, "text", TDBITQGRAM)){
978
+ eprint(tdb, __LINE__, "tctdbsetindex");
979
+ err = true;
980
+ }
981
+ TARGTYPICAL targs[tnum];
982
+ pthread_t threads[tnum];
983
+ if(tnum == 1){
984
+ targs[0].tdb = tdb;
985
+ targs[0].rnum = rnum;
986
+ targs[0].rratio = rratio;
987
+ targs[0].id = 0;
988
+ if(threadtypical(targs) != NULL) err = true;
989
+ } else {
990
+ for(int i = 0; i < tnum; i++){
991
+ targs[i].tdb = tdb;
992
+ targs[i].rnum = rnum;
993
+ targs[i].rratio= rratio;
994
+ targs[i].id = i;
995
+ if(pthread_create(threads + i, NULL, threadtypical, targs + i) != 0){
996
+ eprint(tdb, __LINE__, "pthread_create");
997
+ targs[i].id = -1;
998
+ err = true;
999
+ }
1000
+ }
1001
+ for(int i = 0; i < tnum; i++){
1002
+ if(targs[i].id == -1) continue;
1003
+ void *rv;
1004
+ if(pthread_join(threads[i], &rv) != 0){
1005
+ eprint(tdb, __LINE__, "pthread_join");
1006
+ err = true;
1007
+ } else if(rv){
1008
+ err = true;
1009
+ }
1010
+ }
1011
+ }
1012
+ iprintf("record number: %llu\n", (unsigned long long)tctdbrnum(tdb));
1013
+ iprintf("size: %llu\n", (unsigned long long)tctdbfsiz(tdb));
1014
+ sysprint();
1015
+ if(!tctdbclose(tdb)){
1016
+ eprint(tdb, __LINE__, "tctdbclose");
1017
+ err = true;
1018
+ }
1019
+ tctdbdel(tdb);
1020
+ iprintf("time: %.3f\n", tctime() - stime);
1021
+ iprintf("%s\n\n", err ? "error" : "ok");
1022
+ return err ? 1 : 0;
1023
+ }
1024
+
1025
+
1026
+ /* thread the write function */
1027
+ static void *threadwrite(void *targ){
1028
+ TCTDB *tdb = ((TARGWRITE *)targ)->tdb;
1029
+ int rnum = ((TARGWRITE *)targ)->rnum;
1030
+ bool rnd = ((TARGWRITE *)targ)->rnd;
1031
+ int id = ((TARGWRITE *)targ)->id;
1032
+ bool err = false;
1033
+ int base = id * rnum;
1034
+ for(int i = 1; i <= rnum; i++){
1035
+ int uid = rnd ? (base + myrand(i) + 1) : tctdbgenuid(tdb);
1036
+ char pkbuf[RECBUFSIZ];
1037
+ int pksiz = sprintf(pkbuf, "%d", uid);
1038
+ TCMAP *cols = tcmapnew2(7);
1039
+ char vbuf[RECBUFSIZ*5];
1040
+ int vsiz = sprintf(vbuf, "%d", uid);
1041
+ tcmapput(cols, "str", 3, vbuf, vsiz);
1042
+ if(myrand(3) == 0){
1043
+ vsiz = sprintf(vbuf, "%.2f", (myrand(i * 100) + 1) / 100.0);
1044
+ } else {
1045
+ vsiz = sprintf(vbuf, "%d", myrand(i) + 1);
1046
+ }
1047
+ tcmapput(cols, "num", 3, vbuf, vsiz);
1048
+ vsiz = sprintf(vbuf, "%d", myrand(32) + 1);
1049
+ tcmapput(cols, "type", 4, vbuf, vsiz);
1050
+ int num = myrand(5);
1051
+ int pt = 0;
1052
+ char *wp = vbuf;
1053
+ for(int j = 0; j < num; j++){
1054
+ pt += myrand(5) + 1;
1055
+ if(wp > vbuf) *(wp++) = ',';
1056
+ wp += sprintf(wp, "%d", pt);
1057
+ }
1058
+ *wp = '\0';
1059
+ if(*vbuf != '\0'){
1060
+ tcmapput(cols, "flag", 4, vbuf, wp - vbuf);
1061
+ tcmapput(cols, "text", 4, vbuf, wp - vbuf);
1062
+ }
1063
+ if(!tctdbput(tdb, pkbuf, pksiz, cols)){
1064
+ eprint(tdb, __LINE__, "tctdbput");
1065
+ err = true;
1066
+ break;
1067
+ }
1068
+ tcmapdel(cols);
1069
+ if(id == 0 && rnum > 250 && i % (rnum / 250) == 0){
1070
+ iputchar('.');
1071
+ if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);
1072
+ }
1073
+ }
1074
+ return err ? "error" : NULL;
1075
+ }
1076
+
1077
+
1078
+ /* thread the read function */
1079
+ static void *threadread(void *targ){
1080
+ TCTDB *tdb = ((TARGREAD *)targ)->tdb;
1081
+ int rnum = ((TARGREAD *)targ)->rnum;
1082
+ bool rnd = ((TARGREAD *)targ)->rnd;
1083
+ int id = ((TARGREAD *)targ)->id;
1084
+ bool err = false;
1085
+ int base = id * rnum;
1086
+ for(int i = 1; i <= rnum && !err; i++){
1087
+ char pkbuf[RECBUFSIZ];
1088
+ int pksiz = sprintf(pkbuf, "%d", base + (rnd ? myrandnd(i) : i));
1089
+ TCMAP *cols = tctdbget(tdb, pkbuf, pksiz);
1090
+ if(cols){
1091
+ tcmapdel(cols);
1092
+ } else if(!rnd || tctdbecode(tdb) != TCENOREC){
1093
+ eprint(tdb, __LINE__, "tctdbget");
1094
+ err = true;
1095
+ }
1096
+ if(id == 0 && rnum > 250 && i % (rnum / 250) == 0){
1097
+ iputchar('.');
1098
+ if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);
1099
+ }
1100
+ }
1101
+ return err ? "error" : NULL;
1102
+ }
1103
+
1104
+
1105
+ /* thread the remove function */
1106
+ static void *threadremove(void *targ){
1107
+ TCTDB *tdb = ((TARGREMOVE *)targ)->tdb;
1108
+ int rnum = ((TARGREMOVE *)targ)->rnum;
1109
+ bool rnd = ((TARGREMOVE *)targ)->rnd;
1110
+ int id = ((TARGREMOVE *)targ)->id;
1111
+ bool err = false;
1112
+ int base = id * rnum;
1113
+ for(int i = 1; i <= rnum; i++){
1114
+ char pkbuf[RECBUFSIZ];
1115
+ int pksiz = sprintf(pkbuf, "%d", base + (rnd ? myrand(i + 1) : i));
1116
+ if(!tctdbout(tdb, pkbuf, pksiz) && (!rnd || tctdbecode(tdb) != TCENOREC)){
1117
+ eprint(tdb, __LINE__, "tctdbout");
1118
+ err = true;
1119
+ break;
1120
+ }
1121
+ if(id == 0 && rnum > 250 && i % (rnum / 250) == 0){
1122
+ iputchar('.');
1123
+ if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);
1124
+ }
1125
+ }
1126
+ return err ? "error" : NULL;
1127
+ }
1128
+
1129
+
1130
+ /* thread the wicked function */
1131
+ static void *threadwicked(void *targ){
1132
+ TCTDB *tdb = ((TARGWICKED *)targ)->tdb;
1133
+ int rnum = ((TARGWICKED *)targ)->rnum;
1134
+ int id = ((TARGWICKED *)targ)->id;
1135
+ bool err = false;
1136
+ const char *names[] = { "", "str", "num", "type", "flag", "c1" };
1137
+ int ops[] = { TDBQCSTREQ, TDBQCSTRINC, TDBQCSTRBW, TDBQCSTREW, TDBQCSTRAND, TDBQCSTROR,
1138
+ TDBQCSTROREQ, TDBQCSTRRX, TDBQCNUMEQ, TDBQCNUMGT, TDBQCNUMGE, TDBQCNUMLT,
1139
+ TDBQCNUMLE, TDBQCNUMBT, TDBQCNUMOREQ };
1140
+ int ftsops[] = { TDBQCFTSPH, TDBQCFTSAND, TDBQCFTSOR, TDBQCFTSEX };
1141
+ int types[] = { TDBQOSTRASC, TDBQOSTRDESC, TDBQONUMASC, TDBQONUMDESC };
1142
+ for(int i = 1; i <= rnum && !err; i++){
1143
+ char pkbuf[RECBUFSIZ];
1144
+ int pksiz = sprintf(pkbuf, "%d", myrand(rnum * (id + 1)));
1145
+ TCMAP *cols = tcmapnew2(7);
1146
+ char vbuf[RECBUFSIZ*5];
1147
+ int vsiz = sprintf(vbuf, "%d", id);
1148
+ tcmapput(cols, "str", 3, vbuf, vsiz);
1149
+ if(myrand(3) == 0){
1150
+ vsiz = sprintf(vbuf, "%.2f", (myrand(i * 100) + 1) / 100.0);
1151
+ } else {
1152
+ vsiz = sprintf(vbuf, "%d", myrand(i) + 1);
1153
+ }
1154
+ tcmapput(cols, "num", 3, vbuf, vsiz);
1155
+ vsiz = sprintf(vbuf, "%d", myrand(32) + 1);
1156
+ tcmapput(cols, "type", 4, vbuf, vsiz);
1157
+ int num = myrand(5);
1158
+ int pt = 0;
1159
+ char *wp = vbuf;
1160
+ for(int j = 0; j < num; j++){
1161
+ pt += myrand(5) + 1;
1162
+ if(wp > vbuf) *(wp++) = ',';
1163
+ wp += sprintf(wp, "%d", pt);
1164
+ }
1165
+ *wp = '\0';
1166
+ if(*vbuf != '\0'){
1167
+ tcmapput(cols, "flag", 4, vbuf, wp - vbuf);
1168
+ tcmapput(cols, "text", 4, vbuf, wp - vbuf);
1169
+ }
1170
+ char nbuf[RECBUFSIZ];
1171
+ int nsiz = sprintf(nbuf, "c%d", myrand(i) + 1);
1172
+ vsiz = sprintf(vbuf, "%d", myrand(i) + 1);
1173
+ tcmapput(cols, nbuf, nsiz, vbuf, vsiz);
1174
+ char *cbuf;
1175
+ int csiz;
1176
+ TCMAP *ncols;
1177
+ TDBQRY *qry;
1178
+ switch(myrand(17)){
1179
+ case 0:
1180
+ if(id == 0) iputchar('0');
1181
+ if(!tctdbput(tdb, pkbuf, pksiz, cols)){
1182
+ eprint(tdb, __LINE__, "tctdbput");
1183
+ err = true;
1184
+ }
1185
+ break;
1186
+ case 1:
1187
+ if(id == 0) iputchar('1');
1188
+ cbuf = tcstrjoin4(cols, &csiz);
1189
+ if(!tctdbput2(tdb, pkbuf, pksiz, cbuf, csiz)){
1190
+ eprint(tdb, __LINE__, "tctdbput2");
1191
+ err = true;
1192
+ }
1193
+ tcfree(cbuf);
1194
+ break;
1195
+ case 2:
1196
+ if(id == 0) iputchar('2');
1197
+ cbuf = tcstrjoin3(cols, '\t');
1198
+ if(!tctdbput3(tdb, pkbuf, cbuf)){
1199
+ eprint(tdb, __LINE__, "tctdbput3");
1200
+ err = true;
1201
+ }
1202
+ tcfree(cbuf);
1203
+ break;
1204
+ case 3:
1205
+ if(id == 0) iputchar('3');
1206
+ if(!tctdbputkeep(tdb, pkbuf, pksiz, cols) && tctdbecode(tdb) != TCEKEEP){
1207
+ eprint(tdb, __LINE__, "tctdbputkeep");
1208
+ err = true;
1209
+ }
1210
+ break;
1211
+ case 4:
1212
+ if(id == 0) iputchar('4');
1213
+ cbuf = tcstrjoin4(cols, &csiz);
1214
+ if(!tctdbputkeep2(tdb, pkbuf, pksiz, cbuf, csiz) && tctdbecode(tdb) != TCEKEEP){
1215
+ eprint(tdb, __LINE__, "tctdbputkeep2");
1216
+ err = true;
1217
+ }
1218
+ tcfree(cbuf);
1219
+ break;
1220
+ case 5:
1221
+ if(id == 0) iputchar('5');
1222
+ cbuf = tcstrjoin3(cols, '\t');
1223
+ if(!tctdbputkeep3(tdb, pkbuf, cbuf) && tctdbecode(tdb) != TCEKEEP){
1224
+ eprint(tdb, __LINE__, "tctdbputkeep3");
1225
+ err = true;
1226
+ }
1227
+ tcfree(cbuf);
1228
+ break;
1229
+ case 6:
1230
+ if(id == 0) iputchar('6');
1231
+ if(!tctdbputcat(tdb, pkbuf, pksiz, cols)){
1232
+ eprint(tdb, __LINE__, "tctdbputcat");
1233
+ err = true;
1234
+ }
1235
+ break;
1236
+ case 7:
1237
+ if(id == 0) iputchar('7');
1238
+ cbuf = tcstrjoin4(cols, &csiz);
1239
+ if(!tctdbputcat2(tdb, pkbuf, pksiz, cbuf, csiz)){
1240
+ eprint(tdb, __LINE__, "tctdbputcat2");
1241
+ err = true;
1242
+ }
1243
+ tcfree(cbuf);
1244
+ break;
1245
+ case 8:
1246
+ if(id == 0) iputchar('8');
1247
+ cbuf = tcstrjoin3(cols, '\t');
1248
+ if(!tctdbputcat3(tdb, pkbuf, cbuf)){
1249
+ eprint(tdb, __LINE__, "tctdbputcat3");
1250
+ err = true;
1251
+ }
1252
+ tcfree(cbuf);
1253
+ break;
1254
+ case 9:
1255
+ if(id == 0) iputchar('9');
1256
+ if(myrand(2) == 0){
1257
+ if(!tctdbout(tdb, pkbuf, pksiz) && tctdbecode(tdb) != TCENOREC){
1258
+ eprint(tdb, __LINE__, "tctdbout");
1259
+ err = true;
1260
+ }
1261
+ }
1262
+ break;
1263
+ case 10:
1264
+ if(id == 0) iputchar('A');
1265
+ if(myrand(2) == 0){
1266
+ if(!tctdbout2(tdb, pkbuf) && tctdbecode(tdb) != TCENOREC){
1267
+ eprint(tdb, __LINE__, "tctdbout2");
1268
+ err = true;
1269
+ }
1270
+ }
1271
+ break;
1272
+ case 11:
1273
+ if(id == 0) iputchar('B');
1274
+ ncols = tctdbget(tdb, pkbuf, pksiz);
1275
+ if(ncols){
1276
+ tcmapdel(ncols);
1277
+ } else if(tctdbecode(tdb) != TCENOREC){
1278
+ eprint(tdb, __LINE__, "tctdbget");
1279
+ err = true;
1280
+ }
1281
+ break;
1282
+ case 12:
1283
+ if(id == 0) iputchar('C');
1284
+ cbuf = tctdbget2(tdb, pkbuf, pksiz, &csiz);
1285
+ if(cbuf){
1286
+ tcfree(cbuf);
1287
+ } else if(tctdbecode(tdb) != TCENOREC){
1288
+ eprint(tdb, __LINE__, "tctdbget2");
1289
+ err = true;
1290
+ }
1291
+ break;
1292
+ case 13:
1293
+ if(id == 0) iputchar('D');
1294
+ cbuf = tctdbget3(tdb, pkbuf);
1295
+ if(cbuf){
1296
+ tcfree(cbuf);
1297
+ } else if(tctdbecode(tdb) != TCENOREC){
1298
+ eprint(tdb, __LINE__, "tctdbget3");
1299
+ err = true;
1300
+ }
1301
+ break;
1302
+ case 14:
1303
+ if(id == 0) iputchar('E');
1304
+ if(myrand(rnum / 50) == 0){
1305
+ if(!tctdbiterinit(tdb)){
1306
+ eprint(tdb, __LINE__, "tctdbiterinit");
1307
+ err = true;
1308
+ }
1309
+ }
1310
+ for(int j = myrand(rnum) / 1000 + 1; j >= 0; j--){
1311
+ int iksiz;
1312
+ char *ikbuf = tctdbiternext(tdb, &iksiz);
1313
+ if(ikbuf){
1314
+ tcfree(ikbuf);
1315
+ } else {
1316
+ int ecode = tctdbecode(tdb);
1317
+ if(ecode != TCEINVALID && ecode != TCENOREC){
1318
+ eprint(tdb, __LINE__, "tctdbiternext");
1319
+ err = true;
1320
+ }
1321
+ }
1322
+ }
1323
+ break;
1324
+ case 15:
1325
+ if(id == 0) iputchar('F');
1326
+ qry = tctdbqrynew(tdb);
1327
+ if(myrand(10) != 0){
1328
+ char expr[RECBUFSIZ];
1329
+ sprintf(expr, "%d", myrand(i) + 1);
1330
+ switch(myrand(6)){
1331
+ default:
1332
+ tctdbqryaddcond(qry, "str", TDBQCSTREQ, expr);
1333
+ break;
1334
+ case 1:
1335
+ tctdbqryaddcond(qry, "str", TDBQCSTRBW, expr);
1336
+ break;
1337
+ case 2:
1338
+ tctdbqryaddcond(qry, "str", TDBQCSTROREQ, expr);
1339
+ break;
1340
+ case 3:
1341
+ tctdbqryaddcond(qry, "num", TDBQCNUMEQ, expr);
1342
+ break;
1343
+ case 4:
1344
+ tctdbqryaddcond(qry, "num", TDBQCNUMGT, expr);
1345
+ break;
1346
+ case 5:
1347
+ tctdbqryaddcond(qry, "num", TDBQCNUMLT, expr);
1348
+ break;
1349
+ }
1350
+ switch(myrand(5)){
1351
+ case 0:
1352
+ tctdbqrysetorder(qry, "str", TDBQOSTRASC);
1353
+ break;
1354
+ case 1:
1355
+ tctdbqrysetorder(qry, "str", TDBQOSTRDESC);
1356
+ break;
1357
+ case 2:
1358
+ tctdbqrysetorder(qry, "num", TDBQONUMASC);
1359
+ break;
1360
+ case 3:
1361
+ tctdbqrysetorder(qry, "num", TDBQONUMDESC);
1362
+ break;
1363
+ }
1364
+ tctdbqrysetlimit(qry, 10, myrand(10));
1365
+ } else {
1366
+ int cnum = myrand(4);
1367
+ if(cnum < 1 && myrand(5) != 0) cnum = 1;
1368
+ for(int j = 0; j < cnum; j++){
1369
+ const char *name = names[myrand(sizeof(names) / sizeof(*names))];
1370
+ int op = ops[myrand(sizeof(ops) / sizeof(*ops))];
1371
+ if(myrand(10) == 0) op = ftsops[myrand(sizeof(ftsops) / sizeof(*ftsops))];
1372
+ if(myrand(20) == 0) op |= TDBQCNEGATE;
1373
+ if(myrand(20) == 0) op |= TDBQCNOIDX;
1374
+ char expr[RECBUFSIZ*3];
1375
+ char *wp = expr;
1376
+ if(myrand(3) == 0){
1377
+ wp += sprintf(expr, "%f", myrand(i * 100) / 100.0);
1378
+ } else {
1379
+ wp += sprintf(expr, "%d", myrand(i));
1380
+ }
1381
+ if(myrand(10) == 0) wp += sprintf(wp, ",%d", myrand(i));
1382
+ if(myrand(10) == 0) wp += sprintf(wp, ",%d", myrand(i));
1383
+ tctdbqryaddcond(qry, name, op, expr);
1384
+ }
1385
+ if(myrand(3) != 0){
1386
+ const char *name = names[myrand(sizeof(names) / sizeof(*names))];
1387
+ int type = types[myrand(sizeof(types) / sizeof(*types))];
1388
+ tctdbqrysetorder(qry, name, type);
1389
+ }
1390
+ if(myrand(3) != 0) tctdbqrysetlimit(qry, myrand(i), myrand(10));
1391
+ }
1392
+ if(myrand(10) == 0){
1393
+ TCLIST *res = tctdbqrysearch(qry);
1394
+ tclistdel(res);
1395
+ }
1396
+ tctdbqrydel(qry);
1397
+ break;
1398
+ default:
1399
+ if(id == 0) iputchar('@');
1400
+ if(tctdbtranbegin(tdb)){
1401
+ if(myrand(2) == 0){
1402
+ if(!tctdbput(tdb, pkbuf, pksiz, cols)){
1403
+ eprint(tdb, __LINE__, "tctdbput");
1404
+ err = true;
1405
+ }
1406
+ } else {
1407
+ if(!tctdbout(tdb, pkbuf, pksiz) && tctdbecode(tdb) != TCENOREC){
1408
+ eprint(tdb, __LINE__, "tctdbout");
1409
+ err = true;
1410
+ }
1411
+ }
1412
+ if(myrand(2) == 0){
1413
+ if(!tctdbtranabort(tdb)){
1414
+ eprint(tdb, __LINE__, "tctdbtranabort");
1415
+ err = true;
1416
+ }
1417
+ } else {
1418
+ if(!tctdbtrancommit(tdb)){
1419
+ eprint(tdb, __LINE__, "tctdbtrancommit");
1420
+ err = true;
1421
+ }
1422
+ }
1423
+ } else {
1424
+ eprint(tdb, __LINE__, "tctdbtranbegin");
1425
+ err = true;
1426
+ }
1427
+ if(myrand(10000) == 0) srand((unsigned int)(tctime() * 1000) % UINT_MAX);
1428
+ break;
1429
+ }
1430
+ tcmapdel(cols);
1431
+ if(id == 0){
1432
+ if(i % 50 == 0) iprintf(" (%08d)\n", i);
1433
+ if(id == 0 && i == rnum / 4){
1434
+ if(!tctdboptimize(tdb, rnum / 50, -1, -1, -1) && tctdbecode(tdb) != TCEINVALID){
1435
+ eprint(tdb, __LINE__, "tctdboptimize");
1436
+ err = true;
1437
+ }
1438
+ if(!tctdbiterinit(tdb)){
1439
+ eprint(tdb, __LINE__, "tctdbiterinit");
1440
+ err = true;
1441
+ }
1442
+ }
1443
+ }
1444
+ }
1445
+ return err ? "error" : NULL;
1446
+ }
1447
+
1448
+
1449
+ /* thread the typical function */
1450
+ static void *threadtypical(void *targ){
1451
+ TCTDB *tdb = ((TARGTYPICAL *)targ)->tdb;
1452
+ int rnum = ((TARGTYPICAL *)targ)->rnum;
1453
+ int rratio = ((TARGTYPICAL *)targ)->rratio;
1454
+ int id = ((TARGTYPICAL *)targ)->id;
1455
+ bool err = false;
1456
+ int base = id * rnum;
1457
+ int mrange = tclmax(50 + rratio, 100);
1458
+ for(int i = 1; !err && i <= rnum; i++){
1459
+ char pkbuf[RECBUFSIZ];
1460
+ int pksiz = sprintf(pkbuf, "%08d", base + myrandnd(i));
1461
+ int rnd = myrand(mrange);
1462
+ if(rnd < 20){
1463
+ TCMAP *cols = tcmapnew2(7);
1464
+ char vbuf[RECBUFSIZ*5];
1465
+ int vsiz = sprintf(vbuf, "%d", id);
1466
+ tcmapput(cols, "str", 3, vbuf, vsiz);
1467
+ if(myrand(3) == 0){
1468
+ vsiz = sprintf(vbuf, "%.2f", (myrand(i * 100) + 1) / 100.0);
1469
+ } else {
1470
+ vsiz = sprintf(vbuf, "%d", myrand(i) + 1);
1471
+ }
1472
+ tcmapput(cols, "num", 3, vbuf, vsiz);
1473
+ vsiz = sprintf(vbuf, "%d", myrand(32) + 1);
1474
+ tcmapput(cols, "type", 4, vbuf, vsiz);
1475
+ int num = myrand(5);
1476
+ int pt = 0;
1477
+ char *wp = vbuf;
1478
+ for(int j = 0; j < num; j++){
1479
+ pt += myrand(5) + 1;
1480
+ if(wp > vbuf) *(wp++) = ',';
1481
+ wp += sprintf(wp, "%d", pt);
1482
+ }
1483
+ *wp = '\0';
1484
+ if(*vbuf != '\0'){
1485
+ tcmapput(cols, "flag", 4, vbuf, wp - vbuf);
1486
+ tcmapput(cols, "text", 4, vbuf, wp - vbuf);
1487
+ }
1488
+ char nbuf[RECBUFSIZ];
1489
+ int nsiz = sprintf(nbuf, "c%d", myrand(i) + 1);
1490
+ vsiz = sprintf(vbuf, "%d", myrand(i) + 1);
1491
+ tcmapput(cols, nbuf, nsiz, vbuf, vsiz);
1492
+ if(myrand(2) == 0){
1493
+ if(!tctdbput(tdb, pkbuf, pksiz, cols)){
1494
+ eprint(tdb, __LINE__, "tctdbput");
1495
+ err = true;
1496
+ }
1497
+ } else {
1498
+ if(!tctdbput(tdb, pkbuf, pksiz, cols) && tctdbecode(tdb) && tctdbecode(tdb) != TCEKEEP){
1499
+ eprint(tdb, __LINE__, "tctdbput");
1500
+ err = true;
1501
+ }
1502
+ }
1503
+ tcmapdel(cols);
1504
+ } else if(rnd < 30){
1505
+ if(!tctdbout(tdb, pkbuf, pksiz) && tctdbecode(tdb) && tctdbecode(tdb) != TCENOREC){
1506
+ eprint(tdb, __LINE__, "tctdbout");
1507
+ err = true;
1508
+ }
1509
+ } else if(rnd < 31){
1510
+ if(myrand(10) == 0 && !tctdbiterinit(tdb) && tctdbecode(tdb) != TCENOREC){
1511
+ eprint(tdb, __LINE__, "tctdbiterinit");
1512
+ err = true;
1513
+ }
1514
+ for(int j = 0; !err && j < 10; j++){
1515
+ int ksiz;
1516
+ char *kbuf = tctdbiternext(tdb, &ksiz);
1517
+ if(kbuf){
1518
+ tcfree(kbuf);
1519
+ } else if(tctdbecode(tdb) != TCEINVALID && tctdbecode(tdb) != TCENOREC){
1520
+ eprint(tdb, __LINE__, "tctdbiternext");
1521
+ err = true;
1522
+ }
1523
+ }
1524
+ } else {
1525
+ TDBQRY *qry = tctdbqrynew(tdb);
1526
+ char expr[RECBUFSIZ];
1527
+ sprintf(expr, "%d", myrand(i) + 1);
1528
+ switch(myrand(6) * 1){
1529
+ default:
1530
+ tctdbqryaddcond(qry, "str", TDBQCSTREQ, expr);
1531
+ break;
1532
+ case 1:
1533
+ tctdbqryaddcond(qry, "str", TDBQCSTRBW, expr);
1534
+ break;
1535
+ case 2:
1536
+ tctdbqryaddcond(qry, "str", TDBQCSTROREQ, expr);
1537
+ break;
1538
+ case 3:
1539
+ tctdbqryaddcond(qry, "num", TDBQCNUMEQ, expr);
1540
+ break;
1541
+ case 4:
1542
+ tctdbqryaddcond(qry, "num", TDBQCNUMGT, expr);
1543
+ break;
1544
+ case 5:
1545
+ tctdbqryaddcond(qry, "num", TDBQCNUMLT, expr);
1546
+ break;
1547
+ }
1548
+ tctdbqrysetlimit(qry, 10, myrand(5) * 10);
1549
+ TCLIST *res = tctdbqrysearch(qry);
1550
+ tclistdel(res);
1551
+ tctdbqrydel(qry);
1552
+ }
1553
+ if(id == 0 && rnum > 250 && i % (rnum / 250) == 0){
1554
+ iputchar('.');
1555
+ if(i == rnum || i % (rnum / 10) == 0) iprintf(" (%08d)\n", i);
1556
+ }
1557
+ }
1558
+ return err ? "error" : NULL;
1559
+ }
1560
+
1561
+
1562
+
1563
+ // END OF FILE