tcbtest.rb

Path: tcbtest.rb
Last Update: Sun Oct 03 15:07:10 +0000 2010
dot/f_0.png

Required files

./tokyocabinet  

Methods

eprint   main   procmisc   procread   procremove   procwrite   runmisc   runread   runremove   runwrite   usage  

Included Modules

TokyoCabinet

Public Instance methods

print error message of B+ tree database

[Source]

    # File tcbtest.rb, line 58
58: def eprint(bdb, func)
59:   path = bdb.path
60:   STDERR.printf("%s: %s: %s: %s\n", $progname, path ? path : "-", func, bdb.errmsg)
61: end

main routine

[Source]

    # File tcbtest.rb, line 24
24: def main
25:   ARGV.length >= 1 || usage
26:   if ARGV[0] == "write"
27:     rv = runwrite
28:   elsif ARGV[0] == "read"
29:     rv = runread
30:   elsif ARGV[0] == "remove"
31:     rv = runremove
32:   elsif ARGV[0] == "misc"
33:     rv = runmisc
34:   else
35:     usage
36:   end
37:   GC.start
38:   return rv
39: end

perform misc command

[Source]

     # File tcbtest.rb, line 333
333: def procmisc(path, rnum, opts, omode)
334:   printf("<Miscellaneous Test>\n  path=%s  rnum=%d  opts=%d  omode=%d\n\n",
335:          path, rnum, opts, omode)
336:   err = false
337:   stime = Time.now
338:   bdb = BDB::new
339:   if !bdb.tune(10, 10, rnum / 50, 2, -1, opts)
340:     eprint(bdb, "tune")
341:     err = true
342:   end
343:   if !bdb.setcache(128, 256)
344:     eprint(bdb, "setcache")
345:     err = true
346:   end
347:   if !bdb.setxmsiz(rnum * 4)
348:     eprint(bdb, "setxmsiz")
349:     err = true
350:   end
351:   if !bdb.setdfunit(8)
352:     eprint(bdb, "setdfunit")
353:     err = true
354:   end
355:   if !bdb.open(path, BDB::OWRITER | BDB::OCREAT | BDB::OTRUNC | omode)
356:     eprint(bdb, "open")
357:     err = true
358:   end
359:   printf("writing:\n")
360:   for i in 1..rnum
361:     buf = sprintf("%08d", i)
362:     if !bdb.put(buf, buf)
363:       eprint(bdb, "put")
364:       err = true
365:       break
366:     end
367:     if rnum > 250 && i % (rnum / 250) == 0
368:       print('.')
369:       if i == rnum || i % (rnum / 10) == 0
370:         printf(" (%08d)\n", i)
371:       end
372:     end
373:   end
374:   printf("reading:\n")
375:   for i in 1..rnum
376:     buf = sprintf("%08d", i)
377:     if !bdb.get(buf)
378:       eprint(bdb, "get")
379:       err = true
380:       break
381:     end
382:     if rnum > 250 && i % (rnum / 250) == 0
383:       print('.')
384:       if i == rnum || i % (rnum / 10) == 0
385:         printf(" (%08d)\n", i)
386:       end
387:     end
388:   end
389:   printf("removing:\n")
390:   for i in 1..rnum
391:     buf = sprintf("%08d", i)
392:     if rand(2) == 0 && !bdb.out(buf)
393:       eprint(bdb, "out")
394:       err = true
395:       break
396:     end
397:     if rnum > 250 && i % (rnum / 250) == 0
398:       print('.')
399:       if i == rnum || i % (rnum / 10) == 0
400:         printf(" (%08d)\n", i)
401:       end
402:     end
403:   end
404:   printf("checking cursor:\n")
405:   cur = BDBCUR::new(bdb)
406:   if !cur.first && bdb.ecode != BDB::ENOREC
407:     eprint(bdb, "cur::first")
408:     err = true
409:   end
410:   inum = 0
411:   while key = cur.key
412:     value = cur.val
413:     if !value
414:       eprint(bdb, "cur::val")
415:       err = true
416:     end
417:     cur.next
418:     if inum > 0 && rnum > 250 && inum % (rnum / 250) == 0
419:       print('.')
420:       if inum == rnum || inum % (rnum / 10) == 0
421:         printf(" (%08d)\n", inum)
422:       end
423:     end
424:     inum += 1
425:   end
426:   printf(" (%08d)\n", inum) if rnum > 250
427:   if bdb.ecode != BDB::ENOREC || inum != bdb.rnum
428:     eprint(bdb, "(validation)")
429:     err = true
430:   end
431:   keys = bdb.fwmkeys("0", 10)
432:   if bdb.rnum >= 10 && keys.size != 10
433:     eprint(bdb, "fwmkeys")
434:     err = true
435:   end
436:   printf("checking counting:\n")
437:   for i in 1..rnum
438:     buf = sprintf("[%d]", rand(rnum))
439:     if rand(2) == 0
440:       if !bdb.addint(buf, 1) && bdb.ecode != BDB::EKEEP
441:         eprint(bdb, "addint")
442:         err = true
443:         break
444:       end
445:     else
446:       if !bdb.adddouble(buf, 1) && bdb.ecode != BDB::EKEEP
447:         eprint(bdb, "adddouble")
448:         err = true
449:         break
450:       end
451:     end
452:     if i > 0 && rnum > 250 && i % (rnum / 250) == 0
453:       print('.')
454:       if i == rnum || i % (rnum / 10) == 0
455:         printf(" (%08d)\n", i)
456:       end
457:     end
458:   end
459:   if !bdb.sync
460:     eprint(bdb, "sync")
461:     err = true
462:   end
463:   if !bdb.optimize
464:     eprint(bdb, "optimize")
465:     err = true
466:   end
467:   npath = path + "-tmp"
468:   if !bdb.copy(npath)
469:     eprint(bdb, "copy")
470:     err = true
471:   end
472:   File::unlink(npath)
473:   if !bdb.vanish
474:     eprint(bdb, "vanish")
475:     err = true
476:   end
477:   printf("random writing:\n")
478:   for i in 1..rnum
479:     buf = sprintf("%08d", rand(i))
480:     if !bdb.putdup(buf, buf)
481:       eprint(bdb, "putdup")
482:       err = true
483:       break
484:     end
485:     if rnum > 250 && i % (rnum / 250) == 0
486:       print('.')
487:       if i == rnum || i % (rnum / 10) == 0
488:         printf(" (%08d)\n", i)
489:       end
490:     end
491:   end
492:   printf("cursor updating:\n")
493:   for i in 1..rnum
494:     if rand(10) == 0
495:       buf = sprintf("%08d", rand(rnum))
496:       cur.jump(buf)
497:       for j in 1..10
498:         key = cur.key
499:         break if !key
500:         if rand(3) == 0
501:           cur.out
502:         else
503:           cpmode = BDBCUR::CPCURRENT + rand(3)
504:           cur.put(buf, cpmode)
505:         end
506:         cur.next
507:         j += 1
508:       end
509:     end
510:     if rnum > 250 && i % (rnum / 250) == 0
511:       print('.')
512:       if i == rnum || i % (rnum / 10) == 0
513:         printf(" (%08d)\n", i)
514:       end
515:     end
516:   end
517:   if !bdb.tranbegin
518:     eprint(bdb, "tranbegin")
519:     err = true
520:   end
521:   bdb.putdup("::1", "1")
522:   bdb.putdup("::2", "2a")
523:   bdb.putdup("::2", "2b")
524:   bdb.putdup("::3", "3")
525:   cur.jump("::2")
526:   cur.put("2A")
527:   cur.put("2-", BDBCUR::CPBEFORE)
528:   cur.put("2+")
529:   cur.next
530:   cur.next
531:   cur.put("mid", BDBCUR::CPBEFORE)
532:   cur.put("2C", BDBCUR::CPAFTER)
533:   cur.prev
534:   cur.out
535:   vals = bdb.getlist("::2")
536:   if !vals || vals.size != 4
537:     eprint(bdb, "getlist")
538:     err = true
539:   end
540:   pvals = [ "hop", "step", "jump" ]
541:   if !bdb.putlist("::1", pvals)
542:     eprint(bdb, "putlist")
543:     err = true
544:   end
545:   if !bdb.outlist("::1")
546:     eprint(bdb, "outlist")
547:     err = true
548:   end
549:   if !bdb.trancommit
550:     eprint(bdb, "trancommit")
551:     err = true
552:   end
553:   if !bdb.tranbegin || !bdb.tranabort
554:     eprint(bdb, "tranbegin")
555:     err = true
556:   end
557:   printf("checking hash-like updating:\n")
558:   for i in 1..rnum
559:     buf = sprintf("[%d]", rand(rnum))
560:     rnd = rand(4)
561:     if rnd == 0
562:       bdb[buf] = buf + "hoge"
563:     elsif rnd == 1
564:       value = bdb[buf]
565:     elsif rnd == 2
566:       res = bdb.key?(buf)
567:     elsif rnd == 3
568:       bdb.delete(buf)
569:     end
570:     if rnum > 250 && i % (rnum / 250) == 0
571:       print('.')
572:       if i == rnum || i % (rnum / 10) == 0
573:         printf(" (%08d)\n", i)
574:       end
575:     end
576:   end
577:   printf("checking hash-like iterator:\n")
578:   inum = 0
579:   bdb.each do |tkey, tvalue|
580:     if inum > 0 && rnum > 250 && inum % (rnum / 250) == 0
581:       print('.')
582:       if inum == rnum || inum % (rnum / 10) == 0
583:         printf(" (%08d)\n", inum)
584:       end
585:     end
586:     inum += 1
587:   end
588:   printf(" (%08d)\n", inum) if rnum > 250
589:   bdb.clear
590:   printf("record number: %d\n", bdb.rnum)
591:   printf("size: %d\n", bdb.fsiz)
592:   if !bdb.close
593:     eprint(bdb, "close")
594:     err = true
595:   end
596:   printf("time: %.3f\n", Time.now - stime)
597:   printf("%s\n\n", err ? "error" : "ok")
598:   return err ? 1 : 0
599: end

perform read command

[Source]

     # File tcbtest.rb, line 259
259: def procread(path, omode)
260:   printf("<Reading Test>\n  path=%s  omode=%d\n\n", path, omode)
261:   err = false
262:   stime = Time.now
263:   bdb = BDB::new
264:   if !bdb.open(path, BDB::OREADER | omode)
265:     eprint(bdb, "open")
266:     err = true
267:   end
268:   rnum = bdb.rnum
269:   for i in 1..rnum
270:     buf = sprintf("%08d", i)
271:     if !bdb.get(buf)
272:       eprint(bdb, "get")
273:       err = true
274:       break
275:     end
276:     if rnum > 250 && i % (rnum / 250) == 0
277:       print('.')
278:       if i == rnum || i % (rnum / 10) == 0
279:         printf(" (%08d)\n", i)
280:       end
281:     end
282:   end
283:   printf("record number: %d\n", bdb.rnum)
284:   printf("size: %d\n", bdb.fsiz)
285:   if !bdb.close
286:     eprint(bdb, "close")
287:     err = true
288:   end
289:   printf("time: %.3f\n", Time.now - stime)
290:   printf("%s\n\n", err ? "error" : "ok")
291:   return err ? 1 : 0
292: end

perform remove command

[Source]

     # File tcbtest.rb, line 296
296: def procremove(path, omode)
297:   printf("<Removing Test>\n  path=%s  omode=%d\n\n", path, omode)
298:   err = false
299:   stime = Time.now
300:   bdb = BDB::new
301:   if !bdb.open(path, BDB::OWRITER | omode)
302:     eprint(bdb, "open")
303:     err = true
304:   end
305:   rnum = bdb.rnum
306:   for i in 1..rnum
307:     buf = sprintf("%08d", i)
308:     if !bdb.out(buf)
309:       eprint(bdb, "out")
310:       err = true
311:       break
312:     end
313:     if rnum > 250 && i % (rnum / 250) == 0
314:       print('.')
315:       if i == rnum || i % (rnum / 10) == 0
316:         printf(" (%08d)\n", i)
317:       end
318:     end
319:   end
320:   printf("record number: %d\n", bdb.rnum)
321:   printf("size: %d\n", bdb.fsiz)
322:   if !bdb.close
323:     eprint(bdb, "close")
324:     err = true
325:   end
326:   printf("time: %.3f\n", Time.now - stime)
327:   printf("%s\n\n", err ? "error" : "ok")
328:   return err ? 1 : 0
329: end

perform write command

[Source]

     # File tcbtest.rb, line 217
217: def procwrite(path, rnum, lmemb, nmemb, bnum, apow, fpow, opts, omode)
218:   printf("<Writing Test>\n  path=%s  rnum=%d  lmemb=%d  nmemb=%d  bnum=%d  apow=%d  fpow=%d" +
219:          "  opts=%d  omode=%d\n\n",
220:          path, rnum, lmemb, nmemb, bnum, apow, fpow, opts, omode)
221:   err = false
222:   stime = Time.now
223:   bdb = BDB::new
224:   if !bdb.tune(lmemb, nmemb, bnum, apow, fpow, opts)
225:     eprint(bdb, "tune")
226:     err = true
227:   end
228:   if !bdb.open(path, BDB::OWRITER | BDB::OCREAT | BDB::OTRUNC | omode)
229:     eprint(bdb, "open")
230:     err = true
231:   end
232:   for i in 1..rnum
233:     buf = sprintf("%08d", i)
234:     if !bdb.put(buf, buf)
235:       eprint(bdb, "put")
236:       err = true
237:       break
238:     end
239:     if rnum > 250 && i % (rnum / 250) == 0
240:       print('.')
241:       if i == rnum || i % (rnum / 10) == 0
242:         printf(" (%08d)\n", i)
243:       end
244:     end
245:   end
246:   printf("record number: %d\n", bdb.rnum)
247:   printf("size: %d\n", bdb.fsiz)
248:   if !bdb.close
249:     eprint(bdb, "close")
250:     err = true
251:   end
252:   printf("time: %.3f\n", Time.now - stime)
253:   printf("%s\n\n", err ? "error" : "ok")
254:   return err ? 1 : 0
255: end

parse arguments of misc command

[Source]

     # File tcbtest.rb, line 178
178: def runmisc
179:   path = nil
180:   rnum = nil
181:   opts = 0
182:   omode = 0
183:   i = 1
184:   while i < ARGV.length
185:     if !path && ARGV[i] =~ /^-/
186:       if ARGV[i] == "-tl"
187:         opts |= BDB::TLARGE
188:       elsif ARGV[i] == "-td"
189:         opts |= BDB::TDEFLATE
190:       elsif ARGV[i] == "-tb"
191:         opts |= BDB::TBZIP
192:       elsif ARGV[i] == "-tt"
193:         opts |= BDB::TTCBS
194:       elsif ARGV[i] == "-nl"
195:         omode |= BDB::ONOLCK
196:       elsif ARGV[i] == "-nb"
197:         omode |= BDB::OLCKNB
198:       else
199:         usage
200:       end
201:     elsif !path
202:       path = ARGV[i]
203:     elsif !rnum
204:       rnum = ARGV[i].to_i
205:     else
206:       usage
207:     end
208:     i += 1
209:   end
210:   usage if !path || !rnum || rnum < 1
211:   rv = procmisc(path, rnum, opts, omode)
212:   return rv
213: end

parse arguments of read command

[Source]

     # File tcbtest.rb, line 124
124: def runread
125:   path = nil
126:   omode = 0
127:   i = 1
128:   while i < ARGV.length
129:     if !path && ARGV[i] =~ /^-/
130:       if ARGV[i] == "-nl"
131:         omode |= BDB::ONOLCK
132:       elsif ARGV[i] == "-nb"
133:         omode |= BDB::OLCKNB
134:       else
135:         usage
136:       end
137:     elsif !path
138:       path = ARGV[i]
139:     else
140:       usage
141:     end
142:     i += 1
143:   end
144:   usage if !path
145:   rv = procread(path, omode)
146:   return rv
147: end

parse arguments of remove command

[Source]

     # File tcbtest.rb, line 151
151: def runremove
152:   path = nil
153:   omode = 0
154:   i = 1
155:   while i < ARGV.length
156:     if !path && ARGV[i] =~ /^-/
157:       if ARGV[i] == "-nl"
158:         omode |= BDB::ONOLCK
159:       elsif ARGV[i] == "-nb"
160:         omode |= BDB::OLCKNB
161:       else
162:         usage
163:       end
164:     elsif !path
165:       path = ARGV[i]
166:     else
167:       usage
168:     end
169:     i += 1
170:   end
171:   usage if !path
172:   rv = procremove(path, omode)
173:   return rv
174: end

parse arguments of write command

[Source]

     # File tcbtest.rb, line 65
 65: def runwrite
 66:   path = nil
 67:   rnum = nil
 68:   lmemb = nil
 69:   nmemb = nil
 70:   bnum = nil
 71:   apow = nil
 72:   fpow = nil
 73:   opts = 0
 74:   omode = 0
 75:   i = 1
 76:   while i < ARGV.length
 77:     if !path && ARGV[i] =~ /^-/
 78:       if ARGV[i] == "-tl"
 79:         opts |= BDB::TLARGE
 80:       elsif ARGV[i] == "-td"
 81:         opts |= BDB::TDEFLATE
 82:       elsif ARGV[i] == "-tb"
 83:         opts |= BDB::TBZIP
 84:       elsif ARGV[i] == "-tt"
 85:         opts |= BDB::TTCBS
 86:       elsif ARGV[i] == "-nl"
 87:         omode |= BDB::ONOLCK
 88:       elsif ARGV[i] == "-nb"
 89:         omode |= BDB::OLCKNB
 90:       else
 91:         usage
 92:       end
 93:     elsif !path
 94:       path = ARGV[i]
 95:     elsif !rnum
 96:       rnum = ARGV[i].to_i
 97:     elsif !lmemb
 98:       lmemb = ARGV[i].to_i
 99:     elsif !nmemb
100:       nmemb = ARGV[i].to_i
101:     elsif !bnum
102:       bnum = ARGV[i].to_i
103:     elsif !apow
104:       apow = ARGV[i].to_i
105:     elsif !fpow
106:       fpow = ARGV[i].to_i
107:     else
108:       usage
109:     end
110:     i += 1
111:   end
112:   usage if !path || !rnum || rnum < 1
113:   lmemb = lmemb ? lmemb : -1
114:   nmemb = nmemb ? nmemb : -1
115:   bnum = bnum ? bnum : -1
116:   apow = apow ? apow : -1
117:   fpow = fpow ? fpow : -1
118:   rv = procwrite(path, rnum, lmemb, nmemb, bnum, apow, fpow, opts, omode)
119:   return rv
120: end

print the usage and exit

[Source]

    # File tcbtest.rb, line 43
43: def usage
44:   STDERR.printf("%s: test cases of the B+ tree database API\n", $progname)
45:   STDERR.printf("\n")
46:   STDERR.printf("usage:\n")
47:   STDERR.printf("  %s write [-tl] [-td|-tb|-tt] [-nl|-nb] path rnum" +
48:                 " [lmemb [nmemb [bnum [apow [fpow]]]]]\n", $progname)
49:   STDERR.printf("  %s read [-nl|-nb] path\n", $progname)
50:   STDERR.printf("  %s remove [-nl|-nb] path\n", $progname)
51:   STDERR.printf("  %s misc [-tl] [-td|-tb|-tt] [-nl|-nb] path rnum\n", $progname)
52:   STDERR.printf("\n")
53:   exit(1)
54: end

[Validate]