Add the experimental sqlite3_value_nochange() interface usable by xUpdate
[sqlite.git] / test / zipfile.test
blobfe1ad89c5574d22f36f5d0ff24bbbabe51a9c4cb
1 # 2017 December 9
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
17 ifcapable !vtab {
18   finish_test; return
20 if {[catch {load_static_extension db zipfile} error]} {
21   puts "Skipping zipfile tests, hit load error: $error"
22   finish_test; return
25 forcedelete test.zip
26 do_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
39 do_execsql_test 1.1.1 {
40   INSERT INTO zz(name, mode, mtime, sz, rawdata, method) 
41   VALUES('f.txt', '-rw-r--r--', 1000000000, 5, 'abcde', 0);
43 do_execsql_test 1.1.2 {
44   INSERT INTO zz(name, mtime, sz, rawdata, method) 
45   VALUES('g.txt', 1000000002, 5, '12345', 0);
48 do_execsql_test 1.2 {
49   SELECT name, mtime, data FROM zipfile('test.zip')
50 } {
51   f.txt 1000000000 abcde 
52   g.txt 1000000002 12345
55 do_execsql_test 1.3 {
56   INSERT INTO zz(name, mode, mtime, data) VALUES('h.txt', 
57     '-rw-r--r--', 1000000004, 'aaaaaaaaaabbbbbbbbbb'
58   );
61 do_execsql_test 1.4 {
62   SELECT name, mtime, data, method FROM zipfile('test.zip');
63 } {
64   f.txt 1000000000 abcde 0
65   g.txt 1000000002 12345 0
66   h.txt 1000000004 aaaaaaaaaabbbbbbbbbb 8
69 do_execsql_test 1.5.1 {
70   BEGIN;
71     INSERT INTO zz(name, mode, mtime, data, method)
72     VALUES('i.txt', '-rw-r--r--', 1000000006, 'zxcvb', 0);
73     SELECT name FROM zz;
74   COMMIT;
75 } {f.txt g.txt h.txt i.txt}
76 do_execsql_test 1.5.2 {
77   SELECT name FROM zz;
78 } {f.txt g.txt h.txt i.txt}
80 do_execsql_test 1.6.0 {
81   DELETE FROM zz WHERE name='g.txt';
82   SELECT name FROM zz;
83 } {f.txt h.txt i.txt}
85 #-------------------------------------------------------------------------
86 db close
87 forcedelete test.zip
88 reset_db
89 load_static_extension db zipfile
90 do_execsql_test 2.1 {
91   CREATE VIRTUAL TABLE zzz USING zipfile('test.zip');
92   INSERT INTO zzz(name, mode) VALUES('dirname', 'drwxr-xr-x');
93   SELECT name, mode, data FROM zzz;
94 } {dirname/ 16877 {}}
95 do_execsql_test 2.2 {
96   INSERT INTO zzz(name, data) VALUES('dirname2', NULL);
97   INSERT INTO zzz(name, data) VALUES('dirname2/file1.txt', 'abcdefghijklmnop');
98   SELECT name, mode, data FROM zzz;
99 } {
100   dirname/ 16877 {}
101   dirname2/ 16877 {}
102   dirname2/file1.txt 33188 abcdefghijklmnop
105 do_catchsql_test 2.3 {
106   UPDATE zzz SET name = 'dirname3' WHERE name = 'dirname/';
107 } {1 {constraint failed}}
108 do_execsql_test 2.4 {
109   SELECT name, mode, data FROM zzz;
110 } {
111   dirname/ 16877 {}
112   dirname2/ 16877 {}
113   dirname2/file1.txt 33188 abcdefghijklmnop
116 # If on unix, check that the [unzip] utility can unpack our archive.
118 if {$::tcl_platform(platform)=="unix"} {
119   do_test 2.5.1 {
120     forcedelete dirname
121       forcedelete dirname2
122       set rc [catch { exec unzip test.zip > /dev/null } msg]
123       list $rc $msg
124   } {0 {}}
125   do_test 2.5.2 { file isdir dirname } 1
126   do_test 2.5.3 { file isdir dirname2 } 1
127   do_test 2.5.4 { file isdir dirname2/file1.txt } 0
128   do_test 2.5.5 { 
129     set fd [open dirname2/file1.txt]
130     set data [read $fd]
131     close $fd
132     set data
133   } {abcdefghijklmnop}
136 #-------------------------------------------------------------------------
137 reset_db
138 forcedelete test.zip
139 load_static_extension db zipfile
141 do_execsql_test 3.0 {
142   CREATE VIRTUAL TABLE temp.x1 USING zipfile('test.zip');
143   INSERT INTO x1(name, data) VALUES('dir1/', NULL);
144   INSERT INTO x1(name, data) VALUES('file1', '1234');
145   INSERT INTO x1(name, data) VALUES('dir1/file2', '5678');
147 foreach {tn fname} {
148   1 dir1
149   2 file1
150   3 dir1/file2
151 } {
152   do_catchsql_test 3.1.$tn.0 {
153     INSERT INTO x1(name, data) VALUES($fname, NULL);
154   } {1 {constraint failed}}
155   do_catchsql_test 3.1.$tn.1 {
156     INSERT INTO x1(name, data) VALUES($fname || '/', NULL);
157   } {1 {constraint failed}}
158   do_catchsql_test 3.1.$tn.2 {
159     INSERT INTO x1(name, data) VALUES($fname, 'abcd');
160   } {1 {constraint failed}}
163 do_catchsql_test 3.2 {
164   SELECT rowid FROM x1
165 } {1 {no such column: rowid}}
168 finish_test