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

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: dbscript.tcl,v 11.10 2000/04/21 18:36:21 krinsky Exp $
  7. #
  8. # Random db tester.
  9. # Usage: dbscript file numops min_del max_add key_avg data_avgdups
  10. # file: db file on which to operate
  11. # numops: number of operations to do
  12. # ncurs: number of cursors
  13. # min_del: minimum number of keys before you disable deletes.
  14. # max_add: maximum number of keys before you disable adds.
  15. # key_avg: average key size
  16. # data_avg: average data size
  17. # dups: 1 indicates dups allowed, 0 indicates no dups
  18. # errpct: What percent of operations should generate errors
  19. # seed: Random number generator seed (-1 means use pid)
  20. source ./include.tcl
  21. source $test_path/test.tcl
  22. source $test_path/testutils.tcl
  23. set alphabet "abcdefghijklmnopqrstuvwxyz"
  24. set usage "dbscript file numops ncurs min_del max_add key_avg data_avg dups errpcnt"
  25. # Verify usage
  26. if { $argc != 9 } {
  27. puts stderr "FAIL:[timestamp] Usage: $usage"
  28. exit
  29. }
  30. # Initialize arguments
  31. set file [lindex $argv 0]
  32. set numops [ lindex $argv 1 ]
  33. set ncurs [ lindex $argv 2 ]
  34. set min_del [ lindex $argv 3 ]
  35. set max_add [ lindex $argv 4 ]
  36. set key_avg [ lindex $argv 5 ]
  37. set data_avg [ lindex $argv 6 ]
  38. set dups [ lindex $argv 7 ]
  39. set errpct [ lindex $argv 8 ]
  40. berkdb srand $rand_init
  41. puts "Beginning execution for [pid]"
  42. puts "$file database"
  43. puts "$numops Operations"
  44. puts "$ncurs cursors"
  45. puts "$min_del keys before deletes allowed"
  46. puts "$max_add or fewer keys to add"
  47. puts "$key_avg average key length"
  48. puts "$data_avg average data length"
  49. if { $dups != 1 } {
  50. puts "No dups"
  51. } else {
  52. puts "Dups allowed"
  53. }
  54. puts "$errpct % Errors"
  55. flush stdout
  56. set db [berkdb_open $file]
  57. set cerr [catch {error_check_good dbopen [is_substr $db db] 1} cret]
  58. if {$cerr != 0} {
  59. puts $cret
  60. return
  61. }
  62. set method [$db get_type]
  63. set record_based [is_record_based $method]
  64. # Initialize globals including data
  65. global nkeys
  66. global l_keys
  67. global a_keys
  68. set nkeys [db_init $db 1]
  69. puts "Initial number of keys: $nkeys"
  70. set pflags ""
  71. set gflags ""
  72. set txn ""
  73. # Open the cursors
  74. set curslist {}
  75. for { set i 0 } { $i < $ncurs } { incr i } {
  76. set dbc [$db cursor]
  77. set cerr [catch {error_check_good dbopen [is_substr $dbc $db.c] 1} cret]
  78. if {$cerr != 0} {
  79. puts $cret
  80. return
  81. }
  82. set cerr [catch {error_check_bad cursor_create $dbc NULL} cret]
  83. if {$cerr != 0} {
  84. puts $cret
  85. return
  86. }
  87. lappend curslist $dbc
  88. }
  89. # On each iteration we're going to generate random keys and
  90. # data.  We'll select either a get/put/delete operation unless
  91. # we have fewer than min_del keys in which case, delete is not
  92. # an option or more than max_add in which case, add is not
  93. # an option.  The tcl global arrays a_keys and l_keys keep track
  94. # of key-data pairs indexed by key and a list of keys, accessed
  95. # by integer.
  96. set adds 0
  97. set puts 0
  98. set gets 0
  99. set dels 0
  100. set bad_adds 0
  101. set bad_puts 0
  102. set bad_gets 0
  103. set bad_dels 0
  104. for { set iter 0 } { $iter < $numops } { incr iter } {
  105. set op [pick_op $min_del $max_add $nkeys]
  106. set err [is_err $errpct]
  107. # The op0's indicate that there aren't any duplicates, so we
  108. # exercise regular operations.  If dups is 1, then we'll use
  109. # cursor ops.
  110. switch $op$dups$err {
  111. add00 {
  112. incr adds
  113. set k [random_data $key_avg 1 a_keys $record_based]
  114. set data [random_data $data_avg 0 0]
  115. set data [chop_data $method $data]
  116. set ret [eval {$db put} $txn $pflags 
  117.     {-nooverwrite $k $data}]
  118. set cerr [catch {error_check_good put $ret 0} cret]
  119. if {$cerr != 0} {
  120. puts $cret
  121. return
  122. }
  123. newpair $k [pad_data $method $data]
  124. }
  125. add01 {
  126. incr bad_adds
  127. set k [random_key]
  128. set data [random_data $data_avg 0 0]
  129. set data [chop_data $method $data]
  130. set ret [eval {$db put} $txn $pflags 
  131.     {-nooverwrite $k $data}]
  132. set cerr [catch {error_check_good put $ret 0} cret]
  133. if {$cerr != 0} {
  134. puts $cret
  135. return
  136. }
  137. # Error case so no change to data state
  138. }
  139. add10 {
  140. incr adds
  141. set dbcinfo [random_cursor $curslist]
  142. set dbc [lindex $dbcinfo 0]
  143. if { [berkdb random_int 1 2] == 1 } {
  144. # Add a new key
  145. set k [random_data $key_avg 1 a_keys 
  146.     $record_based]
  147. set data [random_data $data_avg 0 0]
  148. set data [chop_data $method $data]
  149. set ret [eval {$dbc put} $txn 
  150.     {-keyfirst $k $data}]
  151. newpair $k [pad_data $method $data]
  152. } else {
  153. # Add a new duplicate
  154. set dbc [lindex $dbcinfo 0]
  155. set k [lindex $dbcinfo 1]
  156. set data [random_data $data_avg 0 0]
  157. set op [pick_cursput]
  158. set data [chop_data $method $data]
  159. set ret [eval {$dbc put} $txn {$op $k $data}]
  160. adddup $k [lindex $dbcinfo 2] $data
  161. }
  162. }
  163. add11 {
  164. # TODO
  165. incr bad_adds
  166. set ret 1
  167. }
  168. put00 {
  169. incr puts
  170. set k [random_key]
  171. set data [random_data $data_avg 0 0]
  172. set data [chop_data $method $data]
  173. set ret [eval {$db put} $txn {$k $data}]
  174. changepair $k [pad_data $method $data]
  175. }
  176. put01 {
  177. incr bad_puts
  178. set k [random_key]
  179. set data [random_data $data_avg 0 0]
  180. set data [chop_data $method $data]
  181. set ret [eval {$db put} $txn $pflags 
  182.     {-nooverwrite $k $data}]
  183. set cerr [catch {error_check_good put $ret 0} cret]
  184. if {$cerr != 0} {
  185. puts $cret
  186. return
  187. }
  188. # Error case so no change to data state
  189. }
  190. put10 {
  191. incr puts
  192. set dbcinfo [random_cursor $curslist]
  193. set dbc [lindex $dbcinfo 0]
  194. set k [lindex $dbcinfo 1]
  195. set data [random_data $data_avg 0 0]
  196. set data [chop_data $method $data]
  197. set ret [eval {$dbc put} $txn {-current $data}]
  198. changedup $k [lindex $dbcinfo 2] $data
  199. }
  200. put11 {
  201. incr bad_puts
  202. set k [random_key]
  203. set data [random_data $data_avg 0 0]
  204. set data [chop_data $method $data]
  205. set dbc [$db cursor]
  206. set ret [eval {$dbc put} $txn {-current $data}]
  207. set cerr [catch {error_check_good curs_close 
  208.     [$dbc close] 0} cret]
  209. if {$cerr != 0} {
  210. puts $cret
  211. return
  212. }
  213. # Error case so no change to data state
  214. }
  215. get00 {
  216. incr gets
  217. set k [random_key]
  218. set val [eval {$db get} $txn {$k}]
  219. set data [pad_data $method [lindex [lindex $val 0] 1]]
  220. if { $data == $a_keys($k) } {
  221. set ret 0
  222. } else {
  223. set ret "FAIL: Error got |$data| expected |$a_keys($k)|"
  224. }
  225. # Get command requires no state change
  226. }
  227. get01 {
  228. incr bad_gets
  229. set k [random_data $key_avg 1 a_keys $record_based]
  230. set ret [eval {$db get} $txn {$k}]
  231. # Error case so no change to data state
  232. }
  233. get10 {
  234. incr gets
  235. set dbcinfo [random_cursor $curslist]
  236. if { [llength $dbcinfo] == 3 } {
  237. set ret 0
  238. else
  239. set ret 0
  240. }
  241. # Get command requires no state change
  242. }
  243. get11 {
  244. incr bad_gets
  245. set k [random_key]
  246. set dbc [$db cursor]
  247. if { [berkdb random_int 1 2] == 1 } {
  248. set dir -next
  249. } else {
  250. set dir -prev
  251. }
  252. set ret [eval {$dbc get} $txn {-next $k}]
  253. set cerr [catch {error_check_good curs_close 
  254.     [$dbc close] 0} cret]
  255. if {$cerr != 0} {
  256. puts $cret
  257. return
  258. }
  259. # Error and get case so no change to data state
  260. }
  261. del00 {
  262. incr dels
  263. set k [random_key]
  264. set ret [eval {$db del} $txn {$k}]
  265. rempair $k
  266. }
  267. del01 {
  268. incr bad_dels
  269. set k [random_data $key_avg 1 a_keys $record_based]
  270. set ret [eval {$db del} $txn {$k}]
  271. # Error case so no change to data state
  272. }
  273. del10 {
  274. incr dels
  275. set dbcinfo [random_cursor $curslist]
  276. set dbc [lindex $dbcinfo 0]
  277. set ret [eval {$dbc del} $txn]
  278. remdup [lindex dbcinfo 1] [lindex dbcinfo 2]
  279. }
  280. del11 {
  281. incr bad_dels
  282. set c [$db cursor]
  283. set ret [eval {$c del} $txn]
  284. set cerr [catch {error_check_good curs_close 
  285.     [$c close] 0} cret]
  286. if {$cerr != 0} {
  287. puts $cret
  288. return
  289. }
  290. # Error case so no change to data state
  291. }
  292. }
  293. if { $err == 1 } {
  294. # Verify failure.
  295. set cerr [catch {error_check_good $op$dups$err:$k 
  296.     [is_substr Error $ret] 1} cret]
  297. if {$cerr != 0} {
  298. puts $cret
  299. return
  300. }
  301. } else {
  302. # Verify success
  303. set cerr [catch {error_check_good $op$dups$err:$k $ret 0} cret]
  304. if {$cerr != 0} {
  305. puts $cret
  306. return
  307. }
  308. }
  309. flush stdout
  310. }
  311. # Close cursors and file
  312. foreach i $curslist {
  313. set r [$i close]
  314. set cerr [catch {error_check_good cursor_close:$i $r 0} cret]
  315. if {$cerr != 0} {
  316. puts $cret
  317. return
  318. }
  319. }
  320. set r [$db close]
  321. set cerr [catch {error_check_good db_close:$db $r 0} cret]
  322. if {$cerr != 0} {
  323. puts $cret
  324. return
  325. }
  326. puts "[timestamp] [pid] Complete"
  327. puts "Successful ops: $adds adds $gets gets $puts puts $dels dels"
  328. puts "Error ops: $bad_adds adds $bad_gets gets $bad_puts puts $bad_dels dels"
  329. flush stdout
  330. filecheck $file $txn
  331. exit