1# 2017 December 9 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 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. 9# 10#*********************************************************************** 11# 12 13set testdir [file dirname $argv0] 14source $testdir/tester.tcl 15set testprefix zipfile 16 17ifcapable !vtab { 18 finish_test; return 19} 20if {[catch {load_static_extension db zipfile} error]} { 21 puts "Skipping zipfile tests, hit load error: $error" 22 finish_test; return 23} 24 25forcedelete test.zip 26do_execsql_test 1.0 { 27 CREATE VIRTUAL TABLE temp.zz USING zipfile('test.zip'); 28 PRAGMA table_info(zz); 29} { 30 0 name {} 1 {} 1 31 1 mode {} 0 {} 0 32 2 mtime {} 0 {} 0 33 3 sz {} 0 {} 0 34 4 rawdata {} 0 {} 0 35 5 data {} 0 {} 0 36 6 method {} 0 {} 0 37} 38 39do_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}} 43do_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}} 47 48do_execsql_test 1.1.1 { 49 INSERT INTO zz(name, mode, mtime, data, method) 50 VALUES('f.txt', '-rw-r--r--', 1000000000, 'abcde', 0); 51} 52do_execsql_test 1.1.2 { 53 INSERT INTO zz(name, mode, mtime, data, method) 54 VALUES('g.txt', NULL, 1000000002, '12345', 0); 55} 56 57do_execsql_test 1.2 { 58 SELECT name, mtime, data FROM zipfile('test.zip') 59} { 60 f.txt 1000000000 abcde 61 g.txt 1000000002 12345 62} 63 64do_execsql_test 1.3 { 65 INSERT INTO zz(name, mode, mtime, data) VALUES('h.txt', 66 '-rw-r--r--', 1000000004, 'aaaaaaaaaabbbbbbbbbb' 67 ); 68} 69 70do_execsql_test 1.4 { 71 SELECT name, mtime, data, method FROM zipfile('test.zip'); 72} { 73 f.txt 1000000000 abcde 0 74 g.txt 1000000002 12345 0 75 h.txt 1000000004 aaaaaaaaaabbbbbbbbbb 8 76} 77 78do_execsql_test 1.4.1 { 79 SELECT name, json_extract( zipfile_cds(z) , '$.crc32')!=0 80 FROM zipfile('test.zip'); 81} { 82 f.txt 1 83 g.txt 1 84 h.txt 1 85} 86 87do_execsql_test 1.5.1 { 88 BEGIN; 89 INSERT INTO zz(name, mode, mtime, data, method) 90 VALUES('i.txt', '-rw-r--r--', 1000000006, 'zxcvb', 0); 91 SELECT name FROM zz; 92 COMMIT; 93} {f.txt g.txt h.txt i.txt} 94do_execsql_test 1.5.2 { 95 SELECT name FROM zz; 96} {f.txt g.txt h.txt i.txt} 97do_execsql_test 1.5.3 { 98 SELECT data FROM zz WHERE name='i.txt'; 99} {zxcvb} 100 101do_execsql_test 1.6.0 { 102 DELETE FROM zz WHERE name='g.txt'; 103 SELECT name FROM zz; 104} {f.txt h.txt i.txt} 105 106do_execsql_test 1.6.1 { 107 SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); 108} { 109 f.txt 33188 1000000000 abcde 0 110 h.txt 33188 1000000004 aaaaaaaaaabbbbbbbbbb 8 111 i.txt 33188 1000000006 zxcvb 0 112} 113 114do_execsql_test 1.6.2 { 115 UPDATE zz SET mtime=4 WHERE name='i.txt'; 116 SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); 117} { 118 f.txt 33188 1000000000 abcde 0 119 h.txt 33188 1000000004 aaaaaaaaaabbbbbbbbbb 8 120 i.txt 33188 4 zxcvb 0 121} 122 123do_execsql_test 1.6.3 { 124 UPDATE zz SET mode='-rw-r--r-x' WHERE name='h.txt'; 125 SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); 126} { 127 f.txt 33188 1000000000 abcde 0 128 h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8 129 i.txt 33188 4 zxcvb 0 130} 131 132do_execsql_test 1.6.4 { 133 UPDATE zz SET name = 'blue.txt' WHERE name='f.txt'; 134 SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); 135} { 136 blue.txt 33188 1000000000 abcde 0 137 h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8 138 i.txt 33188 4 zxcvb 0 139} 140 141do_execsql_test 1.6.5 { 142 UPDATE zz SET data = 'edcba' WHERE name='blue.txt'; 143 SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); 144} { 145 blue.txt 33188 1000000000 edcba 0 146 h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8 147 i.txt 33188 4 zxcvb 0 148} 149 150do_execsql_test 1.6.6 { 151 UPDATE zz SET mode=NULL, data = NULL WHERE name='blue.txt'; 152 SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); 153} { 154 blue.txt/ 16877 1000000000 {} 0 155 h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8 156 i.txt 33188 4 zxcvb 0 157} 158 159do_catchsql_test 1.6.7 { 160 UPDATE zz SET data=NULL WHERE name='i.txt' 161} {1 {constraint failed}} 162do_execsql_test 1.6.8 { 163 SELECT name, mode, mtime, data, method FROM zipfile('test.zip'); 164} { 165 blue.txt/ 16877 1000000000 {} 0 166 h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8 167 i.txt 33188 4 zxcvb 0 168} 169 170#------------------------------------------------------------------------- 171db close 172forcedelete test.zip 173reset_db 174load_static_extension db zipfile 175do_execsql_test 2.1 { 176 CREATE VIRTUAL TABLE zzz USING zipfile('test.zip'); 177 INSERT INTO zzz(name, mode) VALUES('dirname', 'drwxr-xr-x'); 178 SELECT name, mode, data FROM zzz; 179} {dirname/ 16877 {}} 180do_execsql_test 2.2 { 181 INSERT INTO zzz(name, data) VALUES('dirname2', NULL); 182 INSERT INTO zzz(name, data) VALUES('dirname2/file1.txt', 'abcdefghijklmnop'); 183 SELECT name, mode, data FROM zzz; 184} { 185 dirname/ 16877 {} 186 dirname2/ 16877 {} 187 dirname2/file1.txt 33188 abcdefghijklmnop 188} 189 190do_catchsql_test 2.3 { 191 UPDATE zzz SET name = 'dirname3' WHERE name = 'dirname/'; 192} {0 {}} 193do_execsql_test 2.4 { 194 SELECT name, mode, data FROM zzz; 195} { 196 dirname3/ 16877 {} 197 dirname2/ 16877 {} 198 dirname2/file1.txt 33188 abcdefghijklmnop 199} 200 201# If on unix, check that the [unzip] utility can unpack our archive. 202# 203if {$::tcl_platform(platform)=="unix"} { 204 do_test 2.5.1 { 205 forcedelete dirname 206 forcedelete dirname2 207 set rc [catch { exec unzip test.zip > /dev/null } msg] 208 list $rc $msg 209 } {0 {}} 210 do_test 2.5.2 { file isdir dirname3 } 1 211 do_test 2.5.3 { file isdir dirname2 } 1 212 do_test 2.5.4 { file isdir dirname2/file1.txt } 0 213 do_test 2.5.5 { 214 set fd [open dirname2/file1.txt] 215 set data [read $fd] 216 close $fd 217 set data 218 } {abcdefghijklmnop} 219} 220 221#------------------------------------------------------------------------- 222reset_db 223forcedelete test.zip 224load_static_extension db zipfile 225 226do_execsql_test 3.0 { 227 CREATE VIRTUAL TABLE temp.x1 USING zipfile('test.zip'); 228 INSERT INTO x1(name, data) VALUES('dir1/', NULL); 229 INSERT INTO x1(name, data) VALUES('file1', '1234'); 230 INSERT INTO x1(name, data) VALUES('dir1/file2', '5678'); 231} 232foreach {tn fname} { 233 1 dir1 234 2 file1 235 3 dir1/file2 236} { 237 do_catchsql_test 3.1.$tn.0 { 238 INSERT INTO x1(name, data) VALUES($fname, NULL); 239 } {1 {constraint failed}} 240 do_catchsql_test 3.1.$tn.1 { 241 INSERT INTO x1(name, data) VALUES($fname || '/', NULL); 242 } {1 {constraint failed}} 243 do_catchsql_test 3.1.$tn.2 { 244 INSERT INTO x1(name, data) VALUES($fname, 'abcd'); 245 } {1 {constraint failed}} 246} 247 248do_catchsql_test 3.2 { 249 SELECT rowid FROM x1 250} {1 {no such column: rowid}} 251 252 253finish_test 254 255