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

MySQL数据库

开发平台:

Visual C++

  1. # See the file LICENSE for redistribution information.
  2. #
  3. # Copyright (c) 1996, 1997, 1998, 1999, 2000
  4. # Sleepycat Software.  All rights reserved.
  5. #
  6. # $Id: test037.tcl,v 11.11 2000/08/25 14:21:55 sue Exp $
  7. #
  8. # Test037: RMW functionality.
  9. proc test037 { method {nentries 100} args } {
  10. source ./include.tcl
  11. set eindex [lsearch -exact $args "-env"]
  12. #
  13. # If we are using an env, then skip this test.  It needs its own.
  14. if { $eindex != -1 } {
  15. incr eindex
  16. set env [lindex $args $eindex]
  17. puts "Test037 skipping for env $env"
  18. return
  19. }
  20. puts "Test037: RMW $method"
  21. set args [convert_args $method $args]
  22. set omethod [convert_method $method]
  23. # Create the database
  24. env_cleanup $testdir
  25. set testfile test037.db
  26. set local_env 
  27.     [berkdb env -create -mode 0644 -txn -home $testdir]
  28. error_check_good dbenv [is_valid_env $local_env] TRUE
  29. set db [eval {berkdb_open 
  30.      -env $local_env -create -mode 0644 $omethod} $args {$testfile}]
  31. error_check_good dbopen [is_valid_db $db] TRUE
  32. set did [open $dict]
  33. set count 0
  34. set pflags ""
  35. set gflags ""
  36. set txn ""
  37. if { [is_record_based $method] == 1 } {
  38. append gflags " -recno"
  39. }
  40. puts "tTest037.a: Creating database"
  41. # Here is the loop where we put and get each key/data pair
  42. while { [gets $did str] != -1 && $count < $nentries } {
  43. if { [is_record_based $method] == 1 } {
  44. global kvals
  45. set key [expr $count + 1]
  46. set kvals($key) [pad_data $method $str]
  47. } else {
  48. set key $str
  49. }
  50. set ret [eval {$db put} 
  51.     $txn $pflags {$key [chop_data $method $str]}]
  52. error_check_good put $ret 0
  53. set ret [eval {$db get} $txn $gflags {$key}]
  54. error_check_good get 
  55.     [lindex [lindex $ret 0] 1] [pad_data $method $str]
  56. incr count
  57. }
  58. close $did
  59. error_check_good dbclose [$db close] 0
  60. error_check_good envclode [$local_env close] 0
  61. puts "tTest037.b: Setting up environments"
  62. # Open local environment
  63. set env_cmd [concat berkdb env -create -txn -home $testdir]
  64. set local_env [eval $env_cmd]
  65. error_check_good dbenv [is_valid_widget $local_env env] TRUE
  66. # Open local transaction
  67. set local_txn [$local_env txn]
  68. error_check_good txn_open [is_valid_txn $local_txn $local_env] TRUE
  69. # Open remote environment
  70. set f1 [open |$tclsh_path r+]
  71. puts $f1 "source $test_path/test.tcl"
  72. set remote_env [send_cmd $f1 $env_cmd]
  73. error_check_good remote:env_open [is_valid_env $remote_env] TRUE
  74. # Open remote transaction
  75. set remote_txn [send_cmd $f1 "$remote_env txn"]
  76. error_check_good 
  77.     remote:txn_open [is_valid_txn $remote_txn $remote_env] TRUE
  78. # Now try put test without RMW.  Gets on one site should not
  79. # lock out gets on another.
  80. # Open databases and dictionary
  81. puts "tTest037.c: Opening databases"
  82. set did [open $dict]
  83. set rkey 0
  84. set db [berkdb_open -env $local_env $testfile]
  85. error_check_good dbopen [is_valid_db $db] TRUE
  86. set rdb [send_cmd $f1 
  87.     "berkdb_open -env $remote_env -mode 0644 $testfile"]
  88. error_check_good remote:dbopen [is_valid_widget $rdb db] TRUE
  89. puts "tTest037.d: Testing without RMW"
  90. # Now, get a key and try to "get" it from both DBs.
  91. error_check_bad "gets on new open" [gets $did str] -1
  92. incr rkey
  93. if { [is_record_based $method] == 1 } {
  94. set key $rkey
  95. } else {
  96. set key $str
  97. }
  98. set rec [eval {$db get -txn $local_txn} $gflags {$key}]
  99. error_check_good local_get [lindex [lindex $rec 0] 1] 
  100.     [pad_data $method $str]
  101. set r [send_timed_cmd $f1 0 "$rdb get -txn $remote_txn $gflags $key"]
  102. error_check_good remote_send $r 0
  103. # Now sleep before releasing local record lock
  104. tclsleep 5
  105. error_check_good local_commit [$local_txn commit] 0
  106. # Now get the remote result
  107. set remote_time [rcv_result $f1]
  108. error_check_good no_rmw_get:remote_time [expr $remote_time <= 1] 1
  109. # Commit the remote
  110. set r [send_cmd $f1 "$remote_txn commit"]
  111. error_check_good remote_commit $r 0
  112. puts "tTest037.e: Testing with RMW"
  113. # Open local transaction
  114. set local_txn [$local_env txn]
  115. error_check_good 
  116.     txn_open [is_valid_widget $local_txn $local_env.txn] TRUE
  117. # Open remote transaction
  118. set remote_txn [send_cmd $f1 "$remote_env txn"]
  119. error_check_good remote:txn_open 
  120.     [is_valid_widget $remote_txn $remote_env.txn] TRUE
  121. # Now, get a key and try to "get" it from both DBs.
  122. error_check_bad "gets on new open" [gets $did str] -1
  123. incr rkey
  124. if { [is_record_based $method] == 1 } {
  125. set key $rkey
  126. } else {
  127. set key $str
  128. }
  129. set rec [eval {$db get -txn $local_txn -rmw} $gflags {$key}]
  130. error_check_good 
  131.     local_get [lindex [lindex $rec 0] 1] [pad_data $method $str]
  132. set r [send_timed_cmd $f1 0 "$rdb get -txn $remote_txn $gflags $key"]
  133. error_check_good remote_send $r 0
  134. # Now sleep before releasing local record lock
  135. tclsleep 5
  136. error_check_good local_commit [$local_txn commit] 0
  137. # Now get the remote result
  138. set remote_time [rcv_result $f1]
  139. error_check_good rmw_get:remote_time [expr $remote_time > 4] 1
  140. # Commit the remote
  141. set r [send_cmd $f1 "$remote_txn commit"]
  142. error_check_good remote_commit $r 0
  143. # Close everything up: remote first
  144. set r [send_cmd $f1 "$rdb close"]
  145. error_check_good remote_db_close $r 0
  146. set r [send_cmd $f1 "$remote_env close"]
  147. # Close locally
  148. error_check_good db_close [$db close] 0
  149. $local_env close
  150. close $did
  151. close $f1
  152. }