Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Change zipfile to be a WITHOUT ROWID virtual table and table-valued function. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
931201f64e04247ed613a0301fcc86c3 |
User & Date: | dan 2018-01-11 17:33:48.340 |
Context
2018-01-11
| ||
18:15 | Add the sqlite3_vtab_nochange() interface. Test cases are in TH3. (check-in: a5d09dfaa3 user: drh tags: trunk) | |
17:33 | Change zipfile to be a WITHOUT ROWID virtual table and table-valued function. (check-in: 931201f64e user: dan tags: trunk) | |
16:16 | Add test cases for running multiple RBU operations within the same process concurrently. (check-in: 407b5ed35c user: dan tags: trunk) | |
Changes
Changes to ext/misc/zipfile.c.
︙ | ︙ | |||
53 54 55 56 57 58 59 | typedef unsigned short u16; typedef unsigned long u32; #define MIN(a,b) ((a)<(b) ? (a) : (b)) #endif static const char ZIPFILE_SCHEMA[] = "CREATE TABLE y(" | | | | 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | typedef unsigned short u16; typedef unsigned long u32; #define MIN(a,b) ((a)<(b) ? (a) : (b)) #endif static const char ZIPFILE_SCHEMA[] = "CREATE TABLE y(" "name PRIMARY KEY," /* 0: Name of file in zip archive */ "mode," /* 1: POSIX mode for file */ "mtime," /* 2: Last modification time (secs since 1970)*/ "sz," /* 3: Size of object */ "rawdata," /* 4: Raw data */ "data," /* 5: Uncompressed data */ "method," /* 6: Compression method (integer) */ "file HIDDEN" /* 7: Name of zip file */ ") WITHOUT ROWID;"; #define ZIPFILE_F_COLUMN_IDX 7 /* Index of column "file" in the above */ #define ZIPFILE_BUFFER_SIZE (64*1024) /* ** Magic numbers used to read and write zip files. |
︙ | ︙ | |||
219 220 221 222 223 224 225 | u16 nFile; u16 nExtra; }; typedef struct ZipfileEntry ZipfileEntry; struct ZipfileEntry { char *zPath; /* Path of zipfile entry */ | < | 219 220 221 222 223 224 225 226 227 228 229 230 231 232 | u16 nFile; u16 nExtra; }; typedef struct ZipfileEntry ZipfileEntry; struct ZipfileEntry { char *zPath; /* Path of zipfile entry */ u8 *aCdsEntry; /* Buffer containing entire CDS entry */ int nCdsEntry; /* Size of buffer aCdsEntry[] in bytes */ int bDeleted; /* True if entry has been deleted */ ZipfileEntry *pNext; /* Next element in in-memory CDS */ }; /* |
︙ | ︙ | |||
826 827 828 829 830 831 832 | return SQLITE_OK; } /* ** Return the rowid for the current row. */ static int zipfileRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ | < < < | < < | 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 | return SQLITE_OK; } /* ** Return the rowid for the current row. */ static int zipfileRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ assert( 0 ); return SQLITE_OK; } /* ** Return TRUE if the cursor has been moved off of the last ** row of output. */ |
︙ | ︙ | |||
995 996 997 998 999 1000 1001 | ** Add object pNew to the end of the linked list that begins at ** ZipfileTab.pFirstEntry and ends with pLastEntry. */ static void zipfileAddEntry(ZipfileTab *pTab, ZipfileEntry *pNew){ assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) ); assert( pNew->pNext==0 ); if( pTab->pFirstEntry==0 ){ | < < | 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 | ** Add object pNew to the end of the linked list that begins at ** ZipfileTab.pFirstEntry and ends with pLastEntry. */ static void zipfileAddEntry(ZipfileTab *pTab, ZipfileEntry *pNew){ assert( (pTab->pFirstEntry==0)==(pTab->pLastEntry==0) ); assert( pNew->pNext==0 ); if( pTab->pFirstEntry==0 ){ pTab->pFirstEntry = pTab->pLastEntry = pNew; }else{ assert( pTab->pLastEntry->pNext==0 ); pTab->pLastEntry->pNext = pNew; pTab->pLastEntry = pNew; } } static int zipfileLoadDirectory(ZipfileTab *pTab){ ZipfileEOCD eocd; |
︙ | ︙ | |||
1247 1248 1249 1250 1251 1252 1253 | assert( pTab->zFile ); assert( pTab->pWriteFd ); if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ if( nVal>1 ){ return SQLITE_CONSTRAINT; }else{ | > | | | 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 | assert( pTab->zFile ); assert( pTab->pWriteFd ); if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ if( nVal>1 ){ return SQLITE_CONSTRAINT; }else{ const char *zDelete = (const char*)sqlite3_value_text(apVal[0]); int nDelete = strlen(zDelete); ZipfileEntry *p; for(p=pTab->pFirstEntry; p; p=p->pNext){ if( zipfileComparePath(p->zPath, zDelete, nDelete)==0 ){ p->bDeleted = 1; break; } } return SQLITE_OK; } } |
︙ | ︙ |
Changes to test/zipfile.test.
︙ | ︙ | |||
23 24 25 26 27 28 29 | } forcedelete test.zip do_execsql_test 1.0 { CREATE VIRTUAL TABLE temp.zz USING zipfile('test.zip'); PRAGMA table_info(zz); } { | | | 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | } forcedelete test.zip do_execsql_test 1.0 { CREATE VIRTUAL TABLE temp.zz USING zipfile('test.zip'); PRAGMA table_info(zz); } { 0 name {} 1 {} 1 1 mode {} 0 {} 0 2 mtime {} 0 {} 0 3 sz {} 0 {} 0 4 rawdata {} 0 {} 0 5 data {} 0 {} 0 6 method {} 0 {} 0 } |
︙ | ︙ | |||
156 157 158 159 160 161 162 163 164 165 | INSERT INTO x1(name, data) VALUES($fname || '/', NULL); } {1 {constraint failed}} do_catchsql_test 3.1.$tn.2 { INSERT INTO x1(name, data) VALUES($fname, 'abcd'); } {1 {constraint failed}} } finish_test | > > > > | 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | INSERT INTO x1(name, data) VALUES($fname || '/', NULL); } {1 {constraint failed}} do_catchsql_test 3.1.$tn.2 { INSERT INTO x1(name, data) VALUES($fname, 'abcd'); } {1 {constraint failed}} } do_catchsql_test 3.2 { SELECT rowid FROM x1 } {1 {no such column: rowid}} finish_test |