AmigaOS patches to 5.003_28
[p5sagit/p5-mst-13.2.git] / t / lib / db-recno.t
1 #!./perl -w
2
3 BEGIN {
4     @INC = '../lib' if -d '../lib' ;
5     require Config; import Config;
6     if ($Config{'extensions'} !~ /\bDB_File\b/) {
7         print "1..0\n";
8         exit 0;
9     }
10 }
11
12 use DB_File; 
13 use Fcntl;
14 use strict ;
15 use vars qw($dbh $Dfile $bad_ones) ;
16
17 sub ok
18 {
19     my $no = shift ;
20     my $result = shift ;
21
22     print "not " unless $result ;
23     print "ok $no\n" ;
24
25     return $result ;
26 }
27
28 sub bad_one
29 {
30     print STDERR <<EOM unless $bad_ones++ ;
31 #
32 # Some older versions of Berkeley DB will fail tests 51, 53 and 55.
33 #
34 # You can safely ignore the errors if you're never going to use the
35 # broken functionality (recno databases with a modified bval). 
36 # Otherwise you'll have to upgrade your DB library.
37 #
38 # If you want to upgrade Berkeley DB, the most recent version is 1.85.
39 # Check out http://www.bostic.com/db for more details.
40 #
41 EOM
42 }
43
44 print "1..55\n";
45
46 my $Dfile = "recno.tmp";
47 unlink $Dfile ;
48
49 umask(0);
50
51 # Check the interface to RECNOINFO
52
53 my $dbh = new DB_File::RECNOINFO ;
54 ok(1, $dbh->{bval} == 0 ) ;
55 ok(2, $dbh->{cachesize} == 0) ;
56 ok(3, $dbh->{psize} == 0) ;
57 ok(4, $dbh->{flags} == 0) ;
58 ok(5, $dbh->{lorder} == 0);
59 ok(6, $dbh->{reclen} == 0);
60 ok(7, $dbh->{bfname} eq "");
61
62 $dbh->{bval} = 3000 ;
63 ok(8, $dbh->{bval} == 3000 );
64
65 $dbh->{cachesize} = 9000 ;
66 ok(9, $dbh->{cachesize} == 9000 );
67
68 $dbh->{psize} = 400 ;
69 ok(10, $dbh->{psize} == 400 );
70
71 $dbh->{flags} = 65 ;
72 ok(11, $dbh->{flags} == 65 );
73
74 $dbh->{lorder} = 123 ;
75 ok(12, $dbh->{lorder} == 123 );
76
77 $dbh->{reclen} = 1234 ;
78 ok(13, $dbh->{reclen} == 1234 );
79
80 $dbh->{bfname} = 1234 ;
81 ok(14, $dbh->{bfname} == 1234 );
82
83
84 # Check that an invalid entry is caught both for store & fetch
85 eval '$dbh->{fred} = 1234' ;
86 ok(15, $@ =~ /^DB_File::RECNOINFO::STORE - Unknown element 'fred' at/ );
87 eval 'my $q = $dbh->{fred}' ;
88 ok(16, $@ =~ /^DB_File::RECNOINFO::FETCH - Unknown element 'fred' at/ );
89
90 # Now check the interface to RECNOINFO
91
92 my $X  ;
93 my @h ;
94 ok(17, $X = tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $DB_RECNO ) ;
95
96 ok(18, ( (stat($Dfile))[2] & 0777) == ($^O eq 'os2' ? 0666 : 0640) || $^O eq 'amigaos') ;
97
98 #my $l = @h ;
99 my $l = $X->length ;
100 ok(19, !$l );
101
102 my @data = qw( a b c d ever f g h  i j k longername m n o p) ;
103
104 $h[0] = shift @data ;
105 ok(20, $h[0] eq 'a' );
106
107 my $ i;
108 foreach (@data)
109   { $h[++$i] = $_ }
110
111 unshift (@data, 'a') ;
112
113 ok(21, defined $h[1] );
114 ok(22, ! defined $h[16] );
115 ok(23, $X->length == @data );
116
117
118 # Overwrite an entry & check fetch it
119 $h[3] = 'replaced' ;
120 $data[3] = 'replaced' ;
121 ok(24, $h[3] eq 'replaced' );
122
123 #PUSH
124 my @push_data = qw(added to the end) ;
125 #my push (@h, @push_data) ;
126 $X->push(@push_data) ;
127 push (@data, @push_data) ;
128 ok(25, $h[++$i] eq 'added' );
129 ok(26, $h[++$i] eq 'to' );
130 ok(27, $h[++$i] eq 'the' );
131 ok(28, $h[++$i] eq 'end' );
132
133 # POP
134 my $popped = pop (@data) ;
135 #my $value = pop(@h) ;
136 my $value = $X->pop ;
137 ok(29, $value eq $popped) ;
138
139 # SHIFT
140 #$value = shift @h
141 $value = $X->shift ;
142 my $shifted = shift @data ;
143 ok(30, $value eq $shifted );
144
145 # UNSHIFT
146
147 # empty list
148 $X->unshift ;
149 ok(31, $X->length == @data );
150
151 my @new_data = qw(add this to the start of the array) ;
152 #unshift @h, @new_data ;
153 $X->unshift (@new_data) ;
154 unshift (@data, @new_data) ;
155 ok(32, $X->length == @data );
156 ok(33, $h[0] eq "add") ;
157 ok(34, $h[1] eq "this") ;
158 ok(35, $h[2] eq "to") ;
159 ok(36, $h[3] eq "the") ;
160 ok(37, $h[4] eq "start") ;
161 ok(38, $h[5] eq "of") ;
162 ok(39, $h[6] eq "the") ;
163 ok(40, $h[7] eq "array") ;
164 ok(41, $h[8] eq $data[8]) ;
165
166 # SPLICE
167
168 # Now both arrays should be identical
169
170 my $ok = 1 ;
171 my $j = 0 ;
172 foreach (@data)
173 {
174    $ok = 0, last if $_ ne $h[$j ++] ; 
175 }
176 ok(42, $ok );
177
178 # Neagtive subscripts
179
180 # get the last element of the array
181 ok(43, $h[-1] eq $data[-1] );
182 ok(44, $h[-1] eq $h[$X->length -1] );
183
184 # get the first element using a negative subscript
185 eval '$h[ - ( $X->length)] = "abcd"' ;
186 ok(45, $@ eq "" );
187 ok(46, $h[0] eq "abcd" );
188
189 # now try to read before the start of the array
190 eval '$h[ - (1 + $X->length)] = 1234' ;
191 ok(47, $@ =~ '^Modification of non-creatable array value attempted' );
192
193 # IMPORTANT - $X must be undefined before the untie otherwise the
194 #             underlying DB close routine will not get called.
195 undef $X ;
196 untie(@h);
197
198 unlink $Dfile;
199
200 {
201     # Check bval defaults to \n
202
203     my @h = () ;
204     my $dbh = new DB_File::RECNOINFO ;
205     ok(48, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ;
206     $h[0] = "abc" ;
207     $h[1] = "def" ;
208     $h[3] = "ghi" ;
209     untie @h ;
210     my $x = `cat $Dfile` ;
211     unlink $Dfile;
212     ok(49, $x eq "abc\ndef\n\nghi\n") ;
213 }
214
215 {
216     # Change bval
217
218     my @h = () ;
219     my $dbh = new DB_File::RECNOINFO ;
220     $dbh->{bval} = "-" ;
221     ok(50, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ;
222     $h[0] = "abc" ;
223     $h[1] = "def" ;
224     $h[3] = "ghi" ;
225     untie @h ;
226     my $x = `cat $Dfile` ;
227     unlink $Dfile;
228     my $ok = ($x eq "abc-def--ghi-") ;
229     bad_one() unless $ok ;
230     ok(51, $ok) ;
231 }
232
233 {
234     # Check R_FIXEDLEN with default bval (space)
235
236     my @h = () ;
237     my $dbh = new DB_File::RECNOINFO ;
238     $dbh->{flags} = R_FIXEDLEN ;
239     $dbh->{reclen} = 5 ;
240     ok(52, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ;
241     $h[0] = "abc" ;
242     $h[1] = "def" ;
243     $h[3] = "ghi" ;
244     untie @h ;
245     my $x = `cat $Dfile` ;
246     unlink $Dfile;
247     my $ok = ($x eq "abc  def       ghi  ") ;
248     bad_one() unless $ok ;
249     ok(53, $ok) ;
250 }
251
252 {
253     # Check R_FIXEDLEN with user-defined bval
254
255     my @h = () ;
256     my $dbh = new DB_File::RECNOINFO ;
257     $dbh->{flags} = R_FIXEDLEN ;
258     $dbh->{bval} = "-" ;
259     $dbh->{reclen} = 5 ;
260     ok(54, tie @h, 'DB_File', $Dfile, O_RDWR|O_CREAT, 0640, $dbh ) ;
261     $h[0] = "abc" ;
262     $h[1] = "def" ;
263     $h[3] = "ghi" ;
264     untie @h ;
265     my $x = `cat $Dfile` ;
266     unlink $Dfile;
267     my $ok = ($x eq "abc--def-------ghi--") ;
268     bad_one() unless $ok ;
269     ok(55, $ok) ;
270 }
271
272 exit ;