test067.tcl
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. # See the file LICENSE for redistribution information.
  2. #
  3. # Copyright (c) 1999, 2000
  4. # Sleepycat Software.  All rights reserved.
  5. #
  6. # $Id: test067.tcl,v 11.12 2000/08/25 14:21:58 sue Exp $
  7. #
  8. # DB Test 67: Test of DB_CURRENT partial puts on almost-empty duplicate pages.
  9. # This test was written to address the following issue, #2 in the list of
  10. # issues relating to bug #0820:
  11. #   2. DBcursor->put, DB_CURRENT flag, off-page duplicates, hash and btree:
  12. # In Btree, the DB_CURRENT overwrite of off-page duplicate records
  13. # first deletes the record and then puts the new one -- this could
  14. # be a problem if the removal of the record causes a reverse split.
  15. # Suggested solution is to acquire a cursor to lock down the current
  16. # record, put a new record after that record, and then delete using
  17. # the held cursor.
  18. # It also tests the following, #5 in the same list of issues:
  19. #  5. DBcursor->put, DB_AFTER/DB_BEFORE/DB_CURRENT flags, DB_DBT_PARTIAL set,
  20. #     duplicate comparison routine specified.
  21. # The partial change does not change how data items sort, but the
  22. # record to be put isn't built yet, and that record supplied is the
  23. # one that's checked for ordering compatibility.
  24. proc test067 { method {ndups 1000} {tnum 67} args } {
  25. source ./include.tcl
  26. global alphabet
  27. global errorCode
  28. set args [convert_args $method $args]
  29. set omethod [convert_method $method]
  30. set eindex [lsearch -exact $args "-env"]
  31. # If we are using an env, then testfile should just be the db name.
  32. # Otherwise it is the test directory and the name.
  33. if { $eindex == -1 } {
  34. set testfile $testdir/test0$tnum.db
  35. set env NULL
  36. } else {
  37. set testfile test0$tnum.db
  38. incr eindex
  39. set env [lindex $args $eindex]
  40. }
  41. puts "Test0$tnum:
  42.     $method ($args) Partial puts on near-empty duplicate pages."
  43. if { [is_record_based $method] == 1 || [is_rbtree $method] == 1 } {
  44.     puts "tTest0$tnum: skipping for method $method."
  45.     return
  46. }
  47. foreach dupopt { "-dup" "-dup -dupsort" } {
  48. cleanup $testdir $env
  49. set db [eval {berkdb_open -create -truncate -mode 0644 
  50.     $omethod} $args $dupopt {$testfile}]
  51. error_check_good db_open [is_valid_db $db] TRUE
  52. puts "tTest0$tnum.a ($dupopt): Put $ndups duplicates."
  53. set key "key_test$tnum"
  54. for { set ndx 0 } { $ndx < $ndups } { incr ndx } {
  55. set data $alphabet$ndx
  56. # No need for pad_data since we're skipping recno.
  57. set ret [eval {$db put} $key $data]
  58. error_check_good put($key,$data) $ret 0
  59. }
  60. # Sync so we can inspect database if the next section bombs.
  61. error_check_good db_sync [$db sync] 0
  62. puts "tTest0$tnum.b ($dupopt):
  63.     Deleting dups (last first), overwriting each."
  64. set dbc [$db cursor]
  65. error_check_good cursor_create [is_valid_cursor $dbc $db] TRUE
  66. set count 0
  67. while { $count < $ndups - 1 } {
  68. # set cursor to last item in db
  69. set ret [$dbc get -last]
  70. error_check_good 
  71.     verify_key [lindex [lindex $ret 0] 0] $key
  72. # for error reporting
  73. set currdatum [lindex [lindex $ret 0] 1]
  74. # partial-overwrite it
  75. # (overwrite offsets 1-4 with "bcde"--which they
  76. # already are)
  77. # Even though we expect success, we catch this
  78. # since it might return EINVAL, and we want that
  79. # to FAIL.
  80. set errorCode NONE
  81. set ret [catch {eval $dbc put -current 
  82. {-partial [list 1 4]} "bcde"} 
  83. res]
  84. error_check_good 
  85. partial_put_valid($currdatum) $errorCode NONE
  86. error_check_good partial_put($currdatum) $res 0
  87. # delete it
  88. error_check_good dbc_del [$dbc del] 0
  89. #puts $currdatum
  90. incr count
  91. }
  92. error_check_good dbc_close [$dbc close] 0
  93. error_check_good db_close [$db close] 0
  94. }
  95. }