Imported Upstream version 5.3.21
[platform/upstream/libdb.git] / test / tcl / rsrc001.tcl
1 # See the file LICENSE for redistribution information.
2 #
3 # Copyright (c) 1996, 2012 Oracle and/or its affiliates.  All rights reserved.
4 #
5 # $Id$
6 #
7 # TEST  rsrc001
8 # TEST  Recno backing file test.  Try different patterns of adding
9 # TEST  records and making sure that the corresponding file matches.
10 proc rsrc001 { } {
11         source ./include.tcl
12
13         puts "Rsrc001: Basic recno backing file writeback tests"
14
15         # We run this test essentially twice, once with a db file
16         # and once without (an in-memory database).
17         set rec1 "This is record 1"
18         set rec2 "This is record 2 This is record 2"
19         set rec3 "This is record 3 This is record 3 This is record 3"
20         set rec4 [replicate "This is record 4 " 512]
21
22         foreach testfile { "$testdir/rsrc001.db" "" } {
23
24                 cleanup $testdir NULL
25
26                 if { $testfile == "" } {
27                         puts "Rsrc001: Testing with in-memory database."
28                 } else {
29                         puts "Rsrc001: Testing with disk-backed database."
30                 }
31
32                 # Create backing file for the empty-file test.
33                 set oid1 [open $testdir/rsrc.txt w]
34                 fconfigure $oid1 -translation binary
35                 close $oid1
36
37                 puts "\tRsrc001.a: Put to empty file."
38                 set db [eval {berkdb_open -create -mode 0644\
39                     -recno -source $testdir/rsrc.txt} $testfile]
40                 error_check_good dbopen [is_valid_db $db] TRUE
41                 set txn ""
42
43                 set ret [eval {$db put} $txn {1 $rec1}]
44                 error_check_good put_to_empty $ret 0
45                 error_check_good db_close [$db close] 0
46
47                 # Now fill out the backing file and create the check file.
48                 set oid1 [open $testdir/rsrc.txt a]
49                 set oid2 [open $testdir/check.txt w]
50                 fconfigure $oid1 -translation binary 
51                 fconfigure $oid2 -translation binary 
52
53                 # This one was already put into rsrc.txt.
54                 puts $oid2 $rec1
55
56                 # These weren't.
57                 puts $oid1 $rec2
58                 puts $oid2 $rec2
59                 puts $oid1 $rec3
60                 puts $oid2 $rec3
61                 puts $oid1 $rec4
62                 puts $oid2 $rec4
63                 close $oid1
64                 close $oid2
65
66                 puts -nonewline "\tRsrc001.b: Read file, rewrite last record;"
67                 puts " write it out and diff"
68                 set db [eval {berkdb_open -create -mode 0644\
69                     -recno -source $testdir/rsrc.txt} $testfile]
70                 error_check_good dbopen [is_valid_db $db] TRUE
71
72                 # Read the last record; replace it (but we won't change it).
73                 # Then close the file and diff the two files.
74                 set dbc [eval {$db cursor} $txn]
75                 error_check_good db_cursor [is_valid_cursor $dbc $db] TRUE
76
77                 set rec [$dbc get -last]
78                 error_check_good get_last [llength [lindex $rec 0]] 2
79                 set key [lindex [lindex $rec 0] 0]
80                 set data [lindex [lindex $rec 0] 1]
81
82                 # Get the last record from the text file
83                 set oid [open $testdir/rsrc.txt]
84                 fconfigure $oid -translation binary 
85                 set laststr ""
86                 while { [gets $oid str] != -1 } {
87                         set laststr $str
88                 }
89                 close $oid
90                 error_check_good getlast $data $laststr
91
92                 set ret [eval {$db put} $txn {$key $data}]
93                 error_check_good replace_last $ret 0
94
95                 error_check_good curs_close [$dbc close] 0
96                 error_check_good db_sync [$db sync] 0
97                 error_check_good db_sync [$db sync] 0
98                 error_check_good \
99                     Rsrc001:diff($testdir/rsrc.txt,$testdir/check.txt) \
100                     [filecmp $testdir/rsrc.txt $testdir/check.txt] 0
101
102                 puts -nonewline "\tRsrc001.c: "
103                 puts "Append some records in tree and verify in file."
104                 set oid [open $testdir/check.txt a]
105                 fconfigure $oid -translation binary
106                 for {set i 1} {$i < 10} {incr i} {
107                         set rec [replicate "New Record $i" $i]
108                         puts $oid $rec
109                         incr key
110                         set ret [eval {$db put} $txn {-append $rec}]
111                         error_check_good put_append $ret $key
112                 }
113                 error_check_good db_sync [$db sync] 0
114                 error_check_good db_sync [$db sync] 0
115                 close $oid
116                 set ret [filecmp $testdir/rsrc.txt $testdir/check.txt]
117                 error_check_good \
118                     Rsrc001:diff($testdir/{rsrc.txt,check.txt}) $ret 0
119
120                 puts "\tRsrc001.d: Append by record number"
121                 set oid [open $testdir/check.txt a]
122                 fconfigure $oid -translation binary
123                 for {set i 1} {$i < 10} {incr i} {
124                         set rec [replicate "New Record (set 2) $i" $i]
125                         puts $oid $rec
126                         incr key
127                         set ret [eval {$db put} $txn {$key $rec}]
128                         error_check_good put_byno $ret 0
129                 }
130
131                 error_check_good db_sync [$db sync] 0
132                 error_check_good db_sync [$db sync] 0
133                 close $oid
134                 set ret [filecmp $testdir/rsrc.txt $testdir/check.txt]
135                 error_check_good \
136                     Rsrc001:diff($testdir/{rsrc.txt,check.txt}) $ret 0
137
138                 puts "\tRsrc001.e: Put beyond end of file."
139                 set oid [open $testdir/check.txt a]
140                 fconfigure $oid -translation binary
141                 for {set i 1} {$i < 10} {incr i} {
142                         puts $oid ""
143                         incr key
144                 }
145                 set rec "Last Record"
146                 puts $oid $rec
147                 incr key
148
149                 set ret [eval {$db put} $txn {$key $rec}]
150                 error_check_good put_byno $ret 0
151
152                 puts "\tRsrc001.f: Put beyond end of file, after reopen."
153
154                 error_check_good db_close [$db close] 0
155                 set db [eval {berkdb_open -create -mode 0644\
156                     -recno -source $testdir/rsrc.txt} $testfile]
157                 error_check_good dbopen [is_valid_db $db] TRUE
158
159                 set rec "Last record with reopen"
160                 puts $oid $rec
161
162                 incr key
163                 set ret [eval {$db put} $txn {$key $rec}]
164                 error_check_good put_byno_with_reopen $ret 0
165
166                 puts "\tRsrc001.g:\
167                     Put several beyond end of file, after reopen with snapshot."
168                 error_check_good db_close [$db close] 0
169                 set db [eval {berkdb_open -create -mode 0644\
170                     -snapshot -recno -source $testdir/rsrc.txt} $testfile]
171                 error_check_good dbopen [is_valid_db $db] TRUE
172
173                 set rec "Really really last record with reopen"
174                 puts $oid ""
175                 puts $oid ""
176                 puts $oid ""
177                 puts $oid $rec
178
179                 incr key
180                 incr key
181                 incr key
182                 incr key
183
184                 set ret [eval {$db put} $txn {$key $rec}]
185                 error_check_good put_byno_with_reopen $ret 0
186
187                 error_check_good db_sync [$db sync] 0
188                 error_check_good db_sync [$db sync] 0
189
190                 close $oid
191                 set ret [filecmp $testdir/rsrc.txt $testdir/check.txt]
192                 error_check_good \
193                     Rsrc001:diff($testdir/{rsrc.txt,check.txt}) $ret 0
194
195                 puts "\tRsrc001.h: Verify proper syncing of changes on close."
196                 error_check_good Rsrc001:db_close [$db close] 0
197                 set db [eval {berkdb_open -create -mode 0644 -recno \
198                     -source $testdir/rsrc.txt} $testfile]
199                 set oid [open $testdir/check.txt a]
200                 fconfigure $oid -translation binary 
201                 for {set i 1} {$i < 10} {incr i} {
202                         set rec [replicate "New Record $i" $i]
203                         puts $oid $rec
204                         set ret [eval {$db put} $txn {-append $rec}]
205                         # Don't bother checking return;  we don't know what
206                         # the key number is, and we'll pick up a failure
207                         # when we compare.
208                 }
209                 error_check_good Rsrc001:db_close [$db close] 0
210                 close $oid
211                 set ret [filecmp $testdir/rsrc.txt $testdir/check.txt]
212                 error_check_good Rsrc001:diff($testdir/{rsrc,check}.txt) $ret 0
213         }
214 }
215