⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbscript.tcl

📁 File system using stacked.
💻 TCL
字号:
# See the file LICENSE for redistribution information.## Copyright (c) 1996-2002#	Sleepycat Software.  All rights reserved.## $Id: dbscript.tcl,v 1.1.1.1 2004/08/19 23:53:56 gopalan Exp $## Random db tester.# Usage: dbscript file numops min_del max_add key_avg data_avgdups# method: method (we pass this in so that fixed-length records work)# file: db file on which to operate# numops: number of operations to do# ncurs: number of cursors# min_del: minimum number of keys before you disable deletes.# max_add: maximum number of keys before you disable adds.# key_avg: average key size# data_avg: average data size# dups: 1 indicates dups allowed, 0 indicates no dups# errpct: What percent of operations should generate errors# seed: Random number generator seed (-1 means use pid)source ./include.tclsource $test_path/test.tclsource $test_path/testutils.tclset usage "dbscript file numops ncurs min_del max_add key_avg data_avg dups errpcnt"# Verify usageif { $argc != 10 } {	puts stderr "FAIL:[timestamp] Usage: $usage"	exit}# Initialize argumentsset method [lindex $argv 0]set file [lindex $argv 1]set numops [ lindex $argv 2 ]set ncurs [ lindex $argv 3 ]set min_del [ lindex $argv 4 ]set max_add [ lindex $argv 5 ]set key_avg [ lindex $argv 6 ]set data_avg [ lindex $argv 7 ]set dups [ lindex $argv 8 ]set errpct [ lindex $argv 9 ]berkdb srand $rand_initputs "Beginning execution for [pid]"puts "$file database"puts "$numops Operations"puts "$ncurs cursors"puts "$min_del keys before deletes allowed"puts "$max_add or fewer keys to add"puts "$key_avg average key length"puts "$data_avg average data length"if { $dups != 1 } {	puts "No dups"} else {	puts "Dups allowed"}puts "$errpct % Errors"flush stdoutset db [berkdb_open $file]set cerr [catch {error_check_good dbopen [is_substr $db db] 1} cret]if {$cerr != 0} {	puts $cret	return}# set method [$db get_type]set record_based [is_record_based $method]# Initialize globals including dataglobal nkeysglobal l_keysglobal a_keysset nkeys [db_init $db 1]puts "Initial number of keys: $nkeys"set pflags ""set gflags ""set txn ""# Open the cursorsset curslist {}for { set i 0 } { $i < $ncurs } { incr i } {	set dbc [$db cursor]	set cerr [catch {error_check_good dbopen [is_substr $dbc $db.c] 1} cret]	if {$cerr != 0} {		puts $cret		return	}	set cerr [catch {error_check_bad cursor_create $dbc NULL} cret]	if {$cerr != 0} {		puts $cret		return	}	lappend curslist $dbc}# On each iteration we're going to generate random keys and# data.  We'll select either a get/put/delete operation unless# we have fewer than min_del keys in which case, delete is not# an option or more than max_add in which case, add is not# an option.  The tcl global arrays a_keys and l_keys keep track# of key-data pairs indexed by key and a list of keys, accessed# by integer.set adds 0set puts 0set gets 0set dels 0set bad_adds 0set bad_puts 0set bad_gets 0set bad_dels 0for { set iter 0 } { $iter < $numops } { incr iter } {	set op [pick_op $min_del $max_add $nkeys]	set err [is_err $errpct]	# The op0's indicate that there aren't any duplicates, so we	# exercise regular operations.  If dups is 1, then we'll use	# cursor ops.	switch $op$dups$err {		add00 {			incr adds			set k [random_data $key_avg 1 a_keys $record_based]			set data [random_data $data_avg 0 0]			set data [chop_data $method $data]			set ret [eval {$db put} $txn $pflags \			    {-nooverwrite $k $data}]			set cerr [catch {error_check_good put $ret 0} cret]			if {$cerr != 0} {				puts $cret				return			}			newpair $k [pad_data $method $data]		}		add01 {			incr bad_adds			set k [random_key]			set data [random_data $data_avg 0 0]			set data [chop_data $method $data]			set ret [eval {$db put} $txn $pflags \			    {-nooverwrite $k $data}]			set cerr [catch {error_check_good put $ret 0} cret]			if {$cerr != 0} {				puts $cret				return			}			# Error case so no change to data state		}		add10 {			incr adds			set dbcinfo [random_cursor $curslist]			set dbc [lindex $dbcinfo 0]			if { [berkdb random_int 1 2] == 1 } {				# Add a new key				set k [random_data $key_avg 1 a_keys \				    $record_based]				set data [random_data $data_avg 0 0]				set data [chop_data $method $data]				set ret [eval {$dbc put} $txn \				    {-keyfirst $k $data}]				newpair $k [pad_data $method $data]			} else {				# Add a new duplicate				set dbc [lindex $dbcinfo 0]				set k [lindex $dbcinfo 1]				set data [random_data $data_avg 0 0]				set op [pick_cursput]				set data [chop_data $method $data]				set ret [eval {$dbc put} $txn {$op $k $data}]				adddup $k [lindex $dbcinfo 2] $data			}		}		add11 {			# TODO			incr bad_adds			set ret 1		}		put00 {			incr puts			set k [random_key]			set data [random_data $data_avg 0 0]			set data [chop_data $method $data]			set ret [eval {$db put} $txn {$k $data}]			changepair $k [pad_data $method $data]		}		put01 {			incr bad_puts			set k [random_key]			set data [random_data $data_avg 0 0]			set data [chop_data $method $data]			set ret [eval {$db put} $txn $pflags \			    {-nooverwrite $k $data}]			set cerr [catch {error_check_good put $ret 0} cret]			if {$cerr != 0} {				puts $cret				return			}			# Error case so no change to data state		}		put10 {			incr puts			set dbcinfo [random_cursor $curslist]			set dbc [lindex $dbcinfo 0]			set k [lindex $dbcinfo 1]			set data [random_data $data_avg 0 0]			set data [chop_data $method $data]			set ret [eval {$dbc put} $txn {-current $data}]			changedup $k [lindex $dbcinfo 2] $data		}		put11 {			incr bad_puts			set k [random_key]			set data [random_data $data_avg 0 0]			set data [chop_data $method $data]			set dbc [$db cursor]			set ret [eval {$dbc put} $txn {-current $data}]			set cerr [catch {error_check_good curs_close \			    [$dbc close] 0} cret]			if {$cerr != 0} {				puts $cret				return			}			# Error case so no change to data state		}		get00 {			incr gets			set k [random_key]			set val [eval {$db get} $txn {$k}]			set data [pad_data $method [lindex [lindex $val 0] 1]]			if { $data == $a_keys($k) } {				set ret 0			} else {				set ret "FAIL: Error got |$data| expected |$a_keys($k)|"			}			# Get command requires no state change		}		get01 {			incr bad_gets			set k [random_data $key_avg 1 a_keys $record_based]			set ret [eval {$db get} $txn {$k}]			# Error case so no change to data state		}		get10 {			incr gets			set dbcinfo [random_cursor $curslist]			if { [llength $dbcinfo] == 3 } {				set ret 0			else				set ret 0			}			# Get command requires no state change		}		get11 {			incr bad_gets			set k [random_key]			set dbc [$db cursor]			if { [berkdb random_int 1 2] == 1 } {				set dir -next			} else {				set dir -prev			}			set ret [eval {$dbc get} $txn {-next $k}]			set cerr [catch {error_check_good curs_close \			    [$dbc close] 0} cret]			if {$cerr != 0} {				puts $cret				return			}			# Error and get case so no change to data state		}		del00 {			incr dels			set k [random_key]			set ret [eval {$db del} $txn {$k}]			rempair $k		}		del01 {			incr bad_dels			set k [random_data $key_avg 1 a_keys $record_based]			set ret [eval {$db del} $txn {$k}]			# Error case so no change to data state		}		del10 {			incr dels			set dbcinfo [random_cursor $curslist]			set dbc [lindex $dbcinfo 0]			set ret [eval {$dbc del} $txn]			remdup [lindex dbcinfo 1] [lindex dbcinfo 2]		}		del11 {			incr bad_dels			set c [$db cursor]			set ret [eval {$c del} $txn]			set cerr [catch {error_check_good curs_close \			    [$c close] 0} cret]			if {$cerr != 0} {				puts $cret				return			}			# Error case so no change to data state		}	}	if { $err == 1 } {		# Verify failure.		set cerr [catch {error_check_good $op$dups$err:$k \		    [is_substr Error $ret] 1} cret]		if {$cerr != 0} {			puts $cret			return		}	} else {		# Verify success		set cerr [catch {error_check_good $op$dups$err:$k $ret 0} cret]		if {$cerr != 0} {			puts $cret			return		}	}	flush stdout}# Close cursors and fileforeach i $curslist {	set r [$i close]	set cerr [catch {error_check_good cursor_close:$i $r 0} cret]	if {$cerr != 0} {		puts $cret		return	}}set r [$db close]set cerr [catch {error_check_good db_close:$db $r 0} cret]if {$cerr != 0} {	puts $cret	return}puts "[timestamp] [pid] Complete"puts "Successful ops: $adds adds $gets gets $puts puts $dels dels"puts "Error ops: $bad_adds adds $bad_gets gets $bad_puts puts $bad_dels dels"flush stdoutfilecheck $file $txnexit

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -