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

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: test046.tcl,v 11.26 2000/08/25 14:21:56 sue Exp $
  7. #
  8. # DB Test 46: Overwrite test of small/big key/data with cursor checks.
  9. proc test046 { method args } {
  10. global alphabet
  11. global errorInfo
  12. global errorCode
  13. source ./include.tcl
  14. set args [convert_args $method $args]
  15. set omethod [convert_method $method]
  16. puts "tTest046: Overwrite test with cursor and small/big key/data."
  17. puts "tTest046:t$method $args"
  18. if { [is_rrecno $method] == 1} {
  19. puts "tTest046: skipping for method $method."
  20. return
  21. }
  22. set key "key"
  23. set data "data"
  24. set txn ""
  25. set flags ""
  26. if { [is_record_based $method] == 1} {
  27. set key ""
  28. }
  29. puts "tTest046: Create $method database."
  30. set eindex [lsearch -exact $args "-env"]
  31. #
  32. # If we are using an env, then testfile should just be the db name.
  33. # Otherwise it is the test directory and the name.
  34. if { $eindex == -1 } {
  35. set testfile $testdir/test046.db
  36. set env NULL
  37. } else {
  38. set testfile test046.db
  39. incr eindex
  40. set env [lindex $args $eindex]
  41. }
  42. set t1 $testdir/t1
  43. cleanup $testdir $env
  44. set oflags "-create -mode 0644 $args $omethod"
  45. set db [eval {berkdb_open} $oflags $testfile.a]
  46. error_check_good dbopen [is_valid_db $db] TRUE
  47. # open curs to db
  48. set dbc [$db cursor]
  49. error_check_good db_cursor [is_substr $dbc $db] 1
  50. # keep nkeys even
  51. set nkeys 20
  52. # Fill page w/ small key/data pairs
  53. puts "tTest046: Fill page with $nkeys small key/data pairs."
  54. for { set i 1 } { $i <= $nkeys } { incr i } {
  55. if { [is_record_based $method] == 1} {
  56. set ret [$db put $i $data$i]
  57. } elseif { $i < 10 } {
  58. set ret [$db put [set key]00$i [set data]00$i]
  59. } elseif { $i < 100 } {
  60. set ret [$db put [set key]0$i [set data]0$i]
  61. } else {
  62. set ret [$db put $key$i $data$i]
  63. }
  64. error_check_good dbput $ret 0
  65. }
  66. # get db order of keys
  67. for {set i 1; set ret [$dbc get -first]} { [llength $ret] != 0} { 
  68.     set ret [$dbc get -next]} {
  69. set key_set($i) [lindex [lindex $ret 0] 0]
  70. set data_set($i) [lindex [lindex $ret 0] 1]
  71. incr i
  72. }
  73. puts "tTest046.a: Deletes by key."
  74. puts "ttTest046.a.1: Get data with SET, then delete before cursor."
  75. # get key in middle of page, call this the nth set curr to it
  76. set i [expr $nkeys/2]
  77. set ret [$dbc get -set $key_set($i)]
  78. error_check_bad dbc_get:set [llength $ret] 0
  79. set curr $ret
  80. # delete before cursor(n-1), make sure it is gone
  81. set i [expr $i - 1]
  82. error_check_good db_del [$db del $key_set($i)] 0
  83. # use set_range to get first key starting at n-1, should
  84. # give us nth--but only works for btree
  85. if { [is_btree $method] == 1 } {
  86. set ret [$dbc get -set_range $key_set($i)]
  87. } else {
  88. if { [is_record_based $method] == 1 } {
  89. set ret [$dbc get -set $key_set($i)]
  90. error_check_good 
  91.     dbc_get:deleted(recno) [llength [lindex $ret 1]] 0
  92. #error_check_good 
  93. #   catch:get [catch {$dbc get -set $key_set($i)} ret] 1
  94. #error_check_good 
  95. #   dbc_get:deleted(recno) [is_substr $ret "KEYEMPTY"] 1
  96. } else {
  97. set ret [$dbc get -set $key_set($i)]
  98. error_check_good dbc_get:deleted [llength $ret] 0
  99. }
  100. set ret [$dbc get -set $key_set([incr i])]
  101. incr i -1
  102. }
  103. error_check_bad dbc_get:set(R)(post-delete) [llength $ret] 0
  104. error_check_good dbc_get(match):set $ret $curr
  105. puts "ttTest046.a.2: Delete cursor item by key."
  106. # nth key, which cursor should be on now
  107. set i [incr i]
  108. set ret [$db del $key_set($i)]
  109. error_check_good db_del $ret 0
  110. # this should return n+1 key/data, curr has nth key/data
  111. if { [string compare $omethod "-btree"] == 0 } {
  112. set ret [$dbc get -set_range $key_set($i)]
  113. } else {
  114. if { [is_record_based $method] == 1 } {
  115. set ret [$dbc get -set $key_set($i)]
  116. error_check_good 
  117.     dbc_get:deleted(recno) [llength [lindex $ret 1]] 0
  118. #error_check_good 
  119. #   catch:get [catch {$dbc get -set $key_set($i)} ret] 1
  120. #error_check_good 
  121. #   dbc_get:deleted(recno) [is_substr $ret "KEYEMPTY"] 1
  122. } else {
  123. set ret [$dbc get -set $key_set($i)]
  124. error_check_good dbc_get:deleted [llength $ret] 0
  125. }
  126. set ret [$dbc get -set $key_set([expr $i+1])]
  127. }
  128. error_check_bad dbc_get(post-delete):set_range [llength $ret] 0
  129. error_check_bad dbc_get(no-match):set_range $ret $curr
  130. puts "ttTest046.a.3: Delete item after cursor."
  131. # we'll delete n+2, since we have deleted n-1 and n
  132. # i still equal to nth, cursor on n+1
  133. set i [incr i]
  134. set ret [$dbc get -set $key_set($i)]
  135. error_check_bad dbc_get:set [llength $ret] 0
  136. set curr [$dbc get -next]
  137. error_check_bad dbc_get:next [llength $curr] 0
  138. set ret [$dbc get -prev]
  139. error_check_bad dbc_get:prev [llength $curr] 0
  140. # delete *after* cursor pos.
  141. error_check_good db:del [$db del $key_set([incr i])] 0
  142. # make sure item is gone, try to get it
  143. if { [string compare $omethod "-btree"] == 0} {
  144. set ret [$dbc get -set_range $key_set($i)]
  145. } else {
  146. if { [is_record_based $method] == 1 } {
  147. set ret [$dbc get -set $key_set($i)]
  148. error_check_good 
  149.     dbc_get:deleted(recno) [llength [lindex $ret 1]] 0
  150. #error_check_good 
  151. #   catch:get [catch {$dbc get -set $key_set($i)} ret] 1
  152. #error_check_good 
  153. #   dbc_get:deleted(recno) [is_substr $ret "KEYEMPTY"] 1
  154. } else {
  155. set ret [$dbc get -set $key_set($i)]
  156. error_check_good dbc_get:deleted [llength $ret] 0
  157. }
  158. set ret [$dbc get -set $key_set([expr $i +1])]
  159. }
  160. error_check_bad dbc_get:set(_range) [llength $ret] 0
  161. error_check_bad dbc_get:set(_range) $ret $curr
  162. error_check_good dbc_get:set [lindex [lindex $ret 0] 0] 
  163. $key_set([expr $i+1])
  164. puts "tTest046.b: Deletes by cursor."
  165. puts "ttTest046.b.1: Delete, do DB_NEXT."
  166. error_check_good dbc:del [$dbc del] 0
  167. set ret [$dbc get -next]
  168. error_check_bad dbc_get:next [llength $ret] 0
  169. set i [expr $i+2]
  170. # i = n+4
  171. error_check_good dbc_get:next(match) 
  172. [lindex [lindex $ret 0] 0] $key_set($i)
  173. puts "ttTest046.b.2: Delete, do DB_PREV."
  174. error_check_good dbc:del [$dbc del] 0
  175. set ret [$dbc get -prev]
  176. error_check_bad dbc_get:prev [llength $ret] 0
  177. set i [expr $i-3]
  178. # i = n+1 (deleted all in between)
  179. error_check_good dbc_get:prev(match) 
  180. [lindex [lindex $ret 0] 0] $key_set($i)
  181. puts "ttTest046.b.3: Delete, do DB_CURRENT."
  182. error_check_good dbc:del [$dbc del] 0
  183. # we just deleted, so current item should be KEYEMPTY, throws err
  184. set ret [$dbc get -current]
  185. error_check_good dbc_get:curr:deleted [llength [lindex $ret 1]] 0
  186. #error_check_good catch:get:current [catch {$dbc get -current} ret] 1
  187. #error_check_good dbc_get:curr:deleted [is_substr $ret "DB_KEYEMPTY"] 1
  188. puts "tTest046.c: Inserts (before/after), by key then cursor."
  189. puts "ttTest046.c.1: Insert by key before the cursor."
  190. # i is at curs pos, i=n+1, we want to go BEFORE
  191. set i [incr i -1]
  192. set ret [$db put $key_set($i) $data_set($i)]
  193. error_check_good db_put:before $ret 0
  194. puts "ttTest046.c.2: Insert by key after the cursor."
  195. set i [incr i +2]
  196. set ret [$db put $key_set($i) $data_set($i)]
  197. error_check_good db_put:after $ret 0
  198. puts "ttTest046.c.3: Insert by curs with deleted curs (should fail)."
  199. # cursor is on n+1, we'll change i to match
  200. set i [incr i -1]
  201. error_check_good dbc:close [$dbc close] 0
  202. error_check_good db:close [$db close] 0
  203. if { [is_record_based $method] == 1} {
  204. puts "ttSkipping the rest of test for method $method."
  205. puts "tTest046 ($method) complete."
  206. return
  207. } else {
  208. # Reopen without printing __db_errs.
  209. set db [eval {berkdb_open_noerr} $oflags $testfile.a]
  210. error_check_good dbopen [is_valid_db $db] TRUE
  211. set dbc [$db cursor]
  212. error_check_good cursor [is_valid_cursor $dbc $db] TRUE
  213. # should fail with EINVAL (deleted cursor)
  214. set errorCode NONE
  215. error_check_good catch:put:before 1 
  216. [catch {$dbc put -before $data_set($i)} ret]
  217. error_check_good dbc_put:deleted:before 
  218. [is_substr $errorCode "EINVAL"] 1
  219. # should fail with EINVAL
  220. set errorCode NONE
  221. error_check_good catch:put:after 1 
  222. [catch {$dbc put -after $data_set($i)} ret]
  223. error_check_good dbc_put:deleted:after 
  224. [is_substr $errorCode "EINVAL"] 1
  225. puts "ttTest046.c.4:
  226.     Insert by cursor before/after existent cursor."
  227. # can't use before after w/o dup except renumber in recno
  228. # first, restore an item so they don't fail
  229. #set ret [$db put $key_set($i) $data_set($i)]
  230. #error_check_good db_put $ret 0
  231. #set ret [$dbc get -set $key_set($i)]
  232. #error_check_bad dbc_get:set [llength $ret] 0
  233. #set i [incr i -2]
  234. # i = n - 1
  235. #set ret [$dbc get -prev]
  236. #set ret [$dbc put -before $key_set($i) $data_set($i)]
  237. #error_check_good dbc_put:before $ret 0
  238. # cursor pos is adjusted to match prev, recently inserted
  239. #incr i
  240. # i = n
  241. #set ret [$dbc put -after $key_set($i) $data_set($i)]
  242. #error_check_good dbc_put:after $ret 0
  243. }
  244. # For the next part of the test, we need a db with no dups to test
  245. # overwrites
  246. puts "tTest046.d.0: Cleanup, close db, open new db with no dups."
  247. error_check_good dbc:close [$dbc close] 0
  248. error_check_good db:close [$db close] 0
  249. set db [eval {berkdb_open} $oflags $testfile.d]
  250. error_check_good dbopen [is_valid_db $db] TRUE
  251. set dbc [$db cursor]
  252. error_check_good db_cursor [is_substr $dbc $db] 1
  253. set nkeys 20
  254. # Fill page w/ small key/data pairs
  255. puts "tTest046.d.0: Fill page with $nkeys small key/data pairs."
  256. for { set i 1 } { $i < $nkeys } { incr i } {
  257. set ret [$db put $key$i $data$i]
  258. error_check_good dbput $ret 0
  259. }
  260. # Prepare cursor on item
  261. set ret [$dbc get -first]
  262. error_check_bad dbc_get:first [llength $ret] 0
  263. # Prepare unique big/small values for an initial
  264. # and an overwrite set of key/data
  265. foreach ptype {init over} {
  266. foreach size {big small} {
  267. if { [string compare $size big] == 0 } {
  268. set key_$ptype$size 
  269.     KEY_$size[repeat alphabet 250]
  270. set data_$ptype$size 
  271.     DATA_$size[repeat alphabet 250]
  272. } else {
  273. set key_$ptype$size 
  274.     KEY_$size[repeat alphabet 10]
  275. set data_$ptype$size 
  276.     DATA_$size[repeat alphabet 10]
  277. }
  278. }
  279. }
  280. set i 0
  281. # Do all overwrites for key and cursor
  282. foreach type {key_over curs_over} {
  283. # Overwrite (i=initial) four different kinds of pairs
  284. incr i
  285. puts "tTest046.d: Overwrites $type."
  286. foreach i_pair {
  287.     {small small} {big small} {small big} {big big} } {
  288. # Overwrite (w=write) with four different kinds of data
  289.    foreach w_pair {
  290.        {small small} {big small} {small big} {big big} } {
  291. # we can only overwrite if key size matches
  292. if { [string compare [lindex 
  293.     $i_pair 0] [lindex $w_pair 0]] != 0} {
  294. continue
  295. }
  296. # first write the initial key/data
  297. set ret [$dbc put -keyfirst 
  298.     key_init[lindex $i_pair 0] 
  299.     data_init[lindex $i_pair 1]]
  300. error_check_good 
  301.     dbc_put:curr:init:$i_pair $ret 0
  302. set ret [$dbc get -current]
  303. error_check_bad dbc_get:curr [llength $ret] 0
  304. error_check_good dbc_get:curr:data 
  305.     [lindex [lindex $ret 0] 1] 
  306.     data_init[lindex $i_pair 1]
  307. # Now, try to overwrite: dups not supported in
  308. # this db
  309. if { [string compare $type key_over] == 0 } {
  310. puts "ttTest046.d.$i: Key
  311.     Overwrite:($i_pair) by ($w_pair)."
  312. set ret [$db put 
  313.     $"key_init[lindex $i_pair 0]" 
  314.     $"data_over[lindex $w_pair 1]"]
  315. error_check_good 
  316. dbput:over:i($i_pair):o($w_pair) $ret 0
  317. # check value
  318. set ret [$db 
  319.     get $"key_init[lindex $i_pair 0]"]
  320. error_check_bad 
  321.     db:get:check [llength $ret] 0
  322. error_check_good db:get:compare_data 
  323.     [lindex [lindex $ret 0] 1] 
  324.     $"data_over[lindex $w_pair 1]"
  325. } else {
  326. # This is a cursor overwrite
  327. puts 
  328. "ttTest046.d.$i:Curs Overwrite:($i_pair) by ($w_pair)."
  329. set ret [$dbc put -current 
  330.     $"data_over[lindex $w_pair 1]"]
  331. error_check_good 
  332.     dbcput:over:i($i_pair):o($w_pair) $ret 0
  333. # check value
  334. set ret [$dbc get -current]
  335. error_check_bad 
  336.     dbc_get:curr [llength $ret] 0
  337. error_check_good dbc_get:curr:data 
  338.     [lindex [lindex $ret 0] 1] 
  339.     $"data_over[lindex $w_pair 1]"
  340. }
  341. } ;# foreach write pair
  342. } ;# foreach initial pair
  343. } ;# foreach type big/small
  344. puts "tTest046.d.3: Cleanup for next part of test."
  345. error_check_good dbc_close [$dbc close] 0
  346. error_check_good db_close [$db close] 0
  347. if { [is_rbtree $method] == 1} {
  348. puts "tSkipping the rest of Test046 for method $method."
  349. puts "tTest046 complete."
  350. return
  351. }
  352. puts "tTest046.e.1: Open db with sorted dups."
  353. set db [eval {berkdb_open_noerr} $oflags -dup -dupsort $testfile.e]
  354. error_check_good dbopen [is_valid_db $db] TRUE
  355. # open curs to db
  356. set dbc [$db cursor]
  357. error_check_good db_cursor [is_substr $dbc $db] 1
  358. # keep nkeys even
  359. set nkeys 20
  360. set ndups 20
  361. # Fill page w/ small key/data pairs
  362. puts "tTest046.e.2:
  363.     Put $nkeys small key/data pairs and $ndups sorted dups."
  364. for { set i 0 } { $i < $nkeys } { incr i } {
  365. if { $i < 10 } {
  366. set ret [$db put [set key]0$i [set data]0$i]
  367. } else {
  368. set ret [$db put $key$i $data$i]
  369. }
  370. error_check_good dbput $ret 0
  371. }
  372. # get db order of keys
  373. for {set i 0; set ret [$dbc get -first]} { [llength $ret] != 0} { 
  374. set ret [$dbc get -next]} {
  375. set key_set($i) [lindex [lindex $ret 0] 0]
  376. set data_set($i) [lindex [lindex $ret 0] 1]
  377. incr i
  378. }
  379. # put 20 sorted duplicates on key in middle of page
  380. set i [expr $nkeys/2]
  381. set ret [$dbc get -set $key_set($i)]
  382. error_check_bad dbc_get:set [llength $ret] 0
  383. set keym $key_set($i)
  384. for { set i 0 } { $i < $ndups } { incr i } {
  385. if { $i < 10 } {
  386. set ret [$db put $keym DUPLICATE_0$i]
  387. } else {
  388. set ret [$db put $keym DUPLICATE_$i]
  389. }
  390. error_check_good db_put:DUP($i) $ret 0
  391. }
  392. puts "tTest046.e.3: Check duplicate duplicates"
  393. set ret [$db put $keym DUPLICATE_00]
  394. error_check_good dbput:dupdup [is_substr $ret "DB_KEYEXIST"] 1
  395. # get dup ordering
  396. for {set i 0; set ret [$dbc get -set $keym]} { [llength $ret] != 0} {
  397. set ret [$dbc get -nextdup] } {
  398. set dup_set($i) [lindex [lindex $ret 0] 1]
  399. incr i
  400. }
  401. # put cursor on item in middle of dups
  402. set i [expr $ndups/2]
  403. set ret [$dbc get -get_both $keym $dup_set($i)]
  404. error_check_bad dbc_get:get_both [llength $ret] 0
  405. puts "tTest046.f: Deletes by cursor."
  406. puts "ttTest046.f.1: Delete by cursor, do a DB_NEXT, check cursor."
  407. set ret [$dbc get -current]
  408. error_check_bad dbc_get:current [llength $ret] 0
  409. error_check_good dbc:del [$dbc del] 0
  410. set ret [$dbc get -next]
  411. error_check_bad dbc_get:next [llength $ret] 0
  412. error_check_good 
  413.     dbc_get:nextdup [lindex [lindex $ret 0] 1] $dup_set([incr i])
  414. puts "ttTest046.f.2: Delete by cursor, do DB_PREV, check cursor."
  415. error_check_good dbc:del [$dbc del] 0
  416. set ret [$dbc get -prev]
  417. error_check_bad dbc_get:prev [llength $ret] 0
  418. set i [incr i -2]
  419. error_check_good dbc_get:prev [lindex [lindex $ret 0] 1] $dup_set($i)
  420. puts "ttTest046.f.3: Delete by cursor, do DB_CURRENT, check cursor."
  421. error_check_good dbc:del [$dbc del] 0
  422. set ret [$dbc get -current]
  423. error_check_good dbc_get:current:deleted [llength [lindex $ret 1]] 0
  424. #error_check_good catch:dbc_get:curr [catch {$dbc get -current} ret] 1
  425. #error_check_good 
  426. #   dbc_get:current:deleted [is_substr $ret "DB_KEYEMPTY"] 1
  427. error_check_good dbc_close [$dbc close] 0
  428. # restore deleted keys
  429. error_check_good db_put:1 [$db put $keym $dup_set($i)] 0
  430. error_check_good db_put:2 [$db put $keym $dup_set([incr i])] 0
  431. error_check_good db_put:3 [$db put $keym $dup_set([incr i])] 0
  432. # tested above
  433. # Reopen database without __db_err, reset cursor
  434. error_check_good dbclose [$db close] 0
  435. set db [eval {berkdb_open_noerr} $oflags -dup -dupsort $testfile.e]
  436. error_check_good dbopen [is_valid_db $db] TRUE
  437. error_check_good db_cursor [is_substr [set dbc [$db cursor]] $db] 1
  438. set ret [$dbc get -set $keym]
  439. error_check_bad dbc_get:set [llength $ret] 0
  440. set ret2 [$dbc get -current]
  441. error_check_bad dbc_get:current [llength $ret2] 0
  442. # match
  443. error_check_good dbc_get:current/set(match) $ret $ret2
  444. # right one?
  445. error_check_good 
  446.     dbc_get:curr/set(matchdup) [lindex [lindex $ret 0] 1] $dup_set(0)
  447. # cursor is on first dup
  448. set ret [$dbc get -next]
  449. error_check_bad dbc_get:next [llength $ret] 0
  450. # now on second dup
  451. error_check_good dbc_get:next [lindex [lindex $ret 0] 1] $dup_set(1)
  452. # check cursor
  453. set ret [$dbc get -current]
  454. error_check_bad dbc_get:curr [llength $ret] 0
  455. error_check_good 
  456.     dbcget:curr(compare) [lindex [lindex $ret 0] 1] $dup_set(1)
  457. puts "tTest046.g: Inserts."
  458. puts "ttTest046.g.1: Insert by key before cursor."
  459. set i 0
  460. # use "spam" to prevent a duplicate duplicate.
  461. set ret [$db put $keym $dup_set($i)spam]
  462. error_check_good db_put:before $ret 0
  463. # make sure cursor was maintained
  464. set ret [$dbc get -current]
  465. error_check_bad dbc_get:curr [llength $ret] 0
  466. error_check_good 
  467.     dbc_get:current(post-put) [lindex [lindex $ret 0] 1] $dup_set(1)
  468. puts "ttTest046.g.2: Insert by key after cursor."
  469. set i [expr $i + 2]
  470. # use "eggs" to prevent a duplicate duplicate
  471. set ret [$db put $keym $dup_set($i)eggs]
  472. error_check_good db_put:after $ret 0
  473. # make sure cursor was maintained
  474. set ret [$dbc get -current]
  475. error_check_bad dbc_get:curr [llength $ret] 0
  476. error_check_good 
  477.     dbc_get:curr(post-put,after) [lindex [lindex $ret 0] 1] $dup_set(1)
  478. puts "ttTest046.g.3: Insert by curs before/after curs (should fail)."
  479. # should return EINVAL (dupsort specified)
  480. error_check_good dbc_put:before:catch 
  481.     [catch {$dbc put -before $dup_set([expr $i -1])} ret] 1
  482. error_check_good 
  483.     dbc_put:before:deleted [is_substr $errorCode "EINVAL"] 1
  484. error_check_good dbc_put:after:catch 
  485.     [catch {$dbc put -after $dup_set([expr $i +2])} ret] 1
  486. error_check_good 
  487.     dbc_put:after:deleted [is_substr $errorCode "EINVAL"] 1
  488. puts "tTest046.h: Cursor overwrites."
  489. puts "ttTest046.h.1: Test that dupsort disallows current overwrite."
  490. set ret [$dbc get -set $keym]
  491. error_check_bad dbc_get:set [llength $ret] 0
  492. error_check_good 
  493.     catch:dbc_put:curr [catch {$dbc put -current DATA_OVERWRITE} ret] 1
  494. error_check_good dbc_put:curr:dupsort [is_substr $errorCode EINVAL] 1
  495. puts "ttTest046.h.2: New db (no dupsort)."
  496. error_check_good dbc_close [$dbc close] 0
  497. error_check_good db_close [$db close] 0
  498. set db [berkdb_open 
  499.     -create -dup $omethod -mode 0644 -truncate $testfile.h]
  500. error_check_good db_open [is_valid_db $db] TRUE
  501. set dbc [$db cursor]
  502. error_check_good db_cursor [is_substr $dbc $db] 1
  503. for {set i 0} {$i < $nkeys} {incr i} {
  504. if { $i < 10 } {
  505. error_check_good db_put [$db put key0$i datum0$i] 0
  506. } else {
  507. error_check_good db_put [$db put key$i datum$i] 0
  508. }
  509. if { $i == 0 } {
  510. for {set j 0} {$j < $ndups} {incr j} {
  511. if { $i < 10 } {
  512. set keyput key0$i
  513. } else {
  514. set keyput key$i
  515. }
  516. if { $j < 10 } {
  517. set ret [$db put $keyput DUP_datum0$j]
  518. } else {
  519. set ret [$db put $keyput DUP_datum$j]
  520. }
  521. error_check_good dbput:dup $ret 0
  522. }
  523. }
  524. }
  525. for {set i 0; set ret [$dbc get -first]} { [llength $ret] != 0} { 
  526.     set ret [$dbc get -next]} {
  527. set key_set($i) [lindex [lindex $ret 0] 0]
  528. set data_set($i) [lindex [lindex $ret 0] 1]
  529. incr i
  530. }
  531. for {set i 0; set ret [$dbc get -set key00]} {
  532.     [llength $ret] != 0} {set ret [$dbc get -nextdup]} {
  533. set dup_set($i) [lindex [lindex $ret 0] 1]
  534. incr i
  535. }
  536. set i 0
  537. set keym key0$i
  538. set ret [$dbc get -set $keym]
  539. error_check_bad dbc_get:set [llength $ret] 0
  540. error_check_good 
  541.     dbc_get:set(match) [lindex [lindex $ret 0] 1] $dup_set($i)
  542. set ret [$dbc get -nextdup]
  543. error_check_bad dbc_get:nextdup [llength $ret] 0
  544. error_check_good dbc_get:nextdup(match) 
  545.     [lindex [lindex $ret 0] 1] $dup_set([expr $i + 1])
  546. puts "ttTest046.h.3: Insert by cursor before cursor (DB_BEFORE)."
  547. set ret [$dbc put -before BEFOREPUT]
  548. error_check_good dbc_put:before $ret 0
  549. set ret [$dbc get -current]
  550. error_check_bad dbc_get:curr [llength $ret] 0
  551. error_check_good 
  552.     dbc_get:curr:match [lindex [lindex $ret 0] 1] BEFOREPUT
  553. # make sure that this is actually a dup w/ dup before
  554. set ret [$dbc get -prev]
  555. error_check_bad dbc_get:prev [llength $ret] 0
  556. error_check_good dbc_get:prev:match 
  557. [lindex [lindex $ret 0] 1] $dup_set($i)
  558. set ret [$dbc get -prev]
  559. # should not be a dup
  560. error_check_bad dbc_get:prev(no_dup) 
  561. [lindex [lindex $ret 0] 0] $keym
  562. puts "ttTest046.h.4: Insert by cursor after cursor (DB_AFTER)."
  563. set ret [$dbc get -set $keym]
  564. # delete next 3 when fix
  565. #puts "[$dbc get -current]
  566. #   [$dbc get -next] [$dbc get -next] [$dbc get -next] [$dbc get -next]"
  567. #set ret [$dbc get -set $keym]
  568. error_check_bad dbc_get:set [llength $ret] 0
  569. set ret [$dbc put -after AFTERPUT]
  570. error_check_good dbc_put:after $ret 0
  571. #puts [$dbc get -current]
  572. # delete next 3 when fix
  573. #set ret [$dbc get -set $keym]
  574. #puts "[$dbc get -current] next: [$dbc get -next] [$dbc get -next]"
  575. #set ret [$dbc get -set AFTERPUT]
  576. #set ret [$dbc get -set $keym]
  577. #set ret [$dbc get -next]
  578. #puts $ret
  579. set ret [$dbc get -current]
  580. error_check_bad dbc_get:curr [llength $ret] 0
  581. error_check_good dbc_get:curr:match [lindex [lindex $ret 0] 1] AFTERPUT
  582. set ret [$dbc get -prev]
  583. # now should be on first item (non-dup) of keym
  584. error_check_bad dbc_get:prev1 [llength $ret] 0
  585. error_check_good 
  586.     dbc_get:match [lindex [lindex $ret 0] 1] $dup_set($i)
  587. set ret [$dbc get -next]
  588. error_check_bad dbc_get:next [llength $ret] 0
  589. error_check_good 
  590.     dbc_get:match2 [lindex [lindex $ret 0] 1] AFTERPUT
  591. set ret [$dbc get -next]
  592. error_check_bad dbc_get:next [llength $ret] 0
  593. # this is the dup we added previously
  594. error_check_good 
  595.     dbc_get:match3 [lindex [lindex $ret 0] 1] BEFOREPUT
  596. # now get rid of the dups we added
  597. error_check_good dbc_del [$dbc del] 0
  598. set ret [$dbc get -prev]
  599. error_check_bad dbc_get:prev2 [llength $ret] 0
  600. error_check_good dbc_del2 [$dbc del] 0
  601. # put cursor on first dup item for the rest of test
  602. set ret [$dbc get -set $keym]
  603. error_check_bad dbc_get:first [llength $ret] 0
  604. error_check_good 
  605.     dbc_get:first:check [lindex [lindex $ret 0] 1] $dup_set($i)
  606. puts "ttTest046.h.5: Overwrite small by small."
  607. set ret [$dbc put -current DATA_OVERWRITE]
  608. error_check_good dbc_put:current:overwrite $ret 0
  609. set ret [$dbc get -current]
  610. error_check_good dbc_get:current(put,small/small) 
  611.     [lindex [lindex $ret 0] 1] DATA_OVERWRITE
  612. puts "ttTest046.h.6: Overwrite small with big."
  613. set ret [$dbc put -current DATA_BIG_OVERWRITE[repeat $alphabet 200]]
  614. error_check_good dbc_put:current:overwrite:big $ret 0
  615. set ret [$dbc get -current]
  616. error_check_good dbc_get:current(put,small/big) 
  617.     [is_substr [lindex [lindex $ret 0] 1] DATA_BIG_OVERWRITE] 1
  618. puts "ttTest046.h.7: Overwrite big with big."
  619. set ret [$dbc put -current DATA_BIG_OVERWRITE2[repeat $alphabet 200]]
  620. error_check_good dbc_put:current:overwrite(2):big $ret 0
  621. set ret [$dbc get -current]
  622. error_check_good dbc_get:current(put,big/big) 
  623.     [is_substr [lindex [lindex $ret 0] 1] DATA_BIG_OVERWRITE2] 1
  624. puts "ttTest046.h.8: Overwrite big with small."
  625. set ret [$dbc put -current DATA_OVERWRITE2]
  626. error_check_good dbc_put:current:overwrite:small $ret 0
  627. set ret [$dbc get -current]
  628. error_check_good dbc_get:current(put,big/small) 
  629.     [is_substr [lindex [lindex $ret 0] 1] DATA_OVERWRITE2] 1
  630. puts "tTest046.i: Cleaning up from test."
  631. error_check_good dbc_close [$dbc close] 0
  632. error_check_good db_close [$db close] 0
  633. puts "tTest046 complete."
  634. }