3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
6 # May you do good and not evil.
7 # May you find forgiveness for yourself and forgive others.
8 # May you share freely, never taking more than you give.
10 #***********************************************************************
13 set testdir [file dirname $argv0]
14 source $testdir/tester.tcl
15 set testprefix zipfile
20 if {[catch {load_static_extension db zipfile} error]} {
21 puts "Skipping zipfile tests, hit load error: $error"
27 CREATE VIRTUAL TABLE temp.zz USING zipfile('test.zip');
28 PRAGMA table_info(zz);
39 do_catchsql_test 1.1.0.1 {
40 INSERT INTO zz(name, mode, mtime, sz, rawdata, method)
41 VALUES('f.txt', '-rw-r--r--', 1000000000, 5, 'abcde', 0);
42 } {1 {constraint failed}}
43 do_catchsql_test 1.1.0.1 {
44 INSERT INTO zz(name, mtime, sz, rawdata, method)
45 VALUES('g.txt', 1000000002, 5, '12345', 0);
46 } {1 {constraint failed}}
48 do_execsql_test 1.1.1 {
49 INSERT INTO zz(name, mode, mtime, data, method)
50 VALUES('f.txt', '-rw-r--r--', 1000000000, 'abcde', 0);
52 do_execsql_test 1.1.2 {
53 INSERT INTO zz(name, mode, mtime, data, method)
54 VALUES('g.txt', NULL, 1000000002, '12345', 0);
58 SELECT name, mtime, data FROM zipfile('test.zip')
60 f.txt 1000000000 abcde
61 g.txt 1000000002 12345
65 INSERT INTO zz(name, mode, mtime, data) VALUES('h.txt',
66 '-rw-r--r--', 1000000004, 'aaaaaaaaaabbbbbbbbbb'
71 SELECT name, mtime, data, method FROM zipfile('test.zip');
73 f.txt 1000000000 abcde 0
74 g.txt 1000000002 12345 0
75 h.txt 1000000004 aaaaaaaaaabbbbbbbbbb 8
79 do_execsql_test 1.4.1 {
80 SELECT name, json_extract( zipfile_cds(z) , '$.crc32')!=0
81 FROM zipfile('test.zip');
89 do_execsql_test 1.5.1 {
91 INSERT INTO zz(name, mode, mtime, data, method)
92 VALUES('i.txt', '-rw-r--r--', 1000000006, 'zxcvb', 0);
95 } {f.txt g.txt h.txt i.txt}
96 do_execsql_test 1.5.2 {
98 } {f.txt g.txt h.txt i.txt}
99 do_execsql_test 1.5.3 {
100 SELECT data FROM zz WHERE name='i.txt';
103 do_execsql_test 1.6.0 {
104 DELETE FROM zz WHERE name='g.txt';
106 } {f.txt h.txt i.txt}
108 do_execsql_test 1.6.1 {
109 SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
111 f.txt 33188 1000000000 abcde 0
112 h.txt 33188 1000000004 aaaaaaaaaabbbbbbbbbb 8
113 i.txt 33188 1000000006 zxcvb 0
116 do_execsql_test 1.6.2 {
117 UPDATE zz SET mtime=4 WHERE name='i.txt';
118 SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
120 f.txt 33188 1000000000 abcde 0
121 h.txt 33188 1000000004 aaaaaaaaaabbbbbbbbbb 8
122 i.txt 33188 4 zxcvb 0
125 do_execsql_test 1.6.3 {
126 UPDATE zz SET mode='-rw-r--r-x' WHERE name='h.txt';
127 SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
129 f.txt 33188 1000000000 abcde 0
130 h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
131 i.txt 33188 4 zxcvb 0
134 do_execsql_test 1.6.4 {
135 UPDATE zz SET name = 'blue.txt' WHERE name='f.txt';
136 SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
138 blue.txt 33188 1000000000 abcde 0
139 h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
140 i.txt 33188 4 zxcvb 0
143 do_execsql_test 1.6.5 {
144 UPDATE zz SET data = 'edcba' WHERE name='blue.txt';
145 SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
147 blue.txt 33188 1000000000 edcba 0
148 h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
149 i.txt 33188 4 zxcvb 0
152 do_execsql_test 1.6.6 {
153 UPDATE zz SET mode=NULL, data = NULL WHERE name='blue.txt';
154 SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
156 blue.txt/ 16877 1000000000 {} 0
157 h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
158 i.txt 33188 4 zxcvb 0
161 do_catchsql_test 1.6.7 {
162 UPDATE zz SET data=NULL WHERE name='i.txt'
163 } {1 {constraint failed}}
164 do_execsql_test 1.6.8 {
165 SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
167 blue.txt/ 16877 1000000000 {} 0
168 h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
169 i.txt 33188 4 zxcvb 0
172 #-------------------------------------------------------------------------
176 load_static_extension db zipfile
177 do_execsql_test 2.1 {
178 CREATE VIRTUAL TABLE zzz USING zipfile('test.zip');
179 INSERT INTO zzz(name, mode) VALUES('dirname', 'drwxr-xr-x');
180 SELECT name, mode, data FROM zzz;
181 } {dirname/ 16877 {}}
182 do_execsql_test 2.2 {
183 INSERT INTO zzz(name, data) VALUES('dirname2', NULL);
184 INSERT INTO zzz(name, data) VALUES('dirname2/file1.txt', 'abcdefghijklmnop');
185 SELECT name, mode, data FROM zzz;
189 dirname2/file1.txt 33188 abcdefghijklmnop
192 do_catchsql_test 2.3 {
193 UPDATE zzz SET name = 'dirname3' WHERE name = 'dirname/';
195 do_execsql_test 2.4 {
196 SELECT name, mode, data FROM zzz;
200 dirname2/file1.txt 33188 abcdefghijklmnop
203 # If on unix, check that the [unzip] utility can unpack our archive.
205 if {$::tcl_platform(platform)=="unix"} {
209 set rc [catch { exec unzip test.zip > /dev/null } msg]
212 do_test 2.5.2 { file isdir dirname3 } 1
213 do_test 2.5.3 { file isdir dirname2 } 1
214 do_test 2.5.4 { file isdir dirname2/file1.txt } 0
216 set fd [open dirname2/file1.txt]
223 #-------------------------------------------------------------------------
226 load_static_extension db zipfile
228 do_execsql_test 3.0 {
229 CREATE VIRTUAL TABLE temp.x1 USING zipfile('test.zip');
230 INSERT INTO x1(name, data) VALUES('dir1/', NULL);
231 INSERT INTO x1(name, data) VALUES('file1', '1234');
232 INSERT INTO x1(name, data) VALUES('dir1/file2', '5678');
239 do_catchsql_test 3.1.$tn.0 {
240 INSERT INTO x1(name, data) VALUES($fname, NULL);
241 } {1 {constraint failed}}
242 do_catchsql_test 3.1.$tn.1 {
243 INSERT INTO x1(name, data) VALUES($fname || '/', NULL);
244 } {1 {constraint failed}}
245 do_catchsql_test 3.1.$tn.2 {
246 INSERT INTO x1(name, data) VALUES($fname, 'abcd');
247 } {1 {constraint failed}}
250 do_catchsql_test 3.2 {
252 } {1 {no such column: rowid}}