mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Add support for INSERT OR REPLACE and INSERT OR IGNORE on the zipfile
extension. FossilOrigin-Name: 8ad35d483e4293d5571eeacc20fd26cdc4064fbee7b63d974879d507a0ee5792
This commit is contained in:
@@ -268,6 +268,7 @@ typedef struct ZipfileTab ZipfileTab;
|
||||
struct ZipfileTab {
|
||||
sqlite3_vtab base; /* Base class - must be first */
|
||||
char *zFile; /* Zip file this table accesses (may be NULL) */
|
||||
sqlite3 *db; /* Host database connection */
|
||||
u8 *aBuffer; /* Temporary buffer used for various tasks */
|
||||
|
||||
ZipfileCsr *pCsrList; /* List of cursors */
|
||||
@@ -360,6 +361,7 @@ static int zipfileConnect(
|
||||
pNew = (ZipfileTab*)sqlite3_malloc(nByte+nFile);
|
||||
if( pNew==0 ) return SQLITE_NOMEM;
|
||||
memset(pNew, 0, nByte+nFile);
|
||||
pNew->db = db;
|
||||
pNew->aBuffer = (u8*)&pNew[1];
|
||||
if( zFile ){
|
||||
pNew->zFile = (char*)&pNew->aBuffer[ZIPFILE_BUFFER_SIZE];
|
||||
@@ -1616,8 +1618,20 @@ static int zipfileUpdate(
|
||||
ZipfileEntry *p;
|
||||
for(p=pTab->pFirstEntry; p; p=p->pNext){
|
||||
if( zipfileComparePath(p->cds.zFile, zPath, nPath)==0 ){
|
||||
zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath);
|
||||
rc = SQLITE_CONSTRAINT;
|
||||
switch( sqlite3_vtab_on_conflict(pTab->db) ){
|
||||
case SQLITE_IGNORE: {
|
||||
goto zipfile_update_done;
|
||||
}
|
||||
case SQLITE_REPLACE: {
|
||||
pOld = p;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
zipfileTableErr(pTab, "duplicate name: \"%s\"", zPath);
|
||||
rc = SQLITE_CONSTRAINT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1661,6 +1675,7 @@ static int zipfileUpdate(
|
||||
zipfileEntryFree(pOld);
|
||||
}
|
||||
|
||||
zipfile_update_done:
|
||||
sqlite3_free(pFree);
|
||||
sqlite3_free(zFree);
|
||||
return rc;
|
||||
|
14
manifest
14
manifest
@@ -1,5 +1,5 @@
|
||||
C Improved\serror\smessages\sfrom\sthe\szipfile\sextension.
|
||||
D 2018-03-10T13:21:41.393
|
||||
C Add\ssupport\sfor\sINSERT\sOR\sREPLACE\sand\sINSERT\sOR\sIGNORE\son\sthe\szipfile\nextension.
|
||||
D 2018-03-10T14:17:01.651
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F Makefile.in 7016fc56c6b9bfe5daac4f34be8be38d8c0b5fab79ccbfb764d3b23bf1c6fff3
|
||||
@@ -304,7 +304,7 @@ F ext/misc/vfsstat.c bf10ef0bc51e1ad6756629e1edb142f7a8db1178
|
||||
F ext/misc/vtablog.c 31d0d8f4406795679dcd3a67917c213d3a2a5fb3ea5de35f6e773491ed7e13c9
|
||||
F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd
|
||||
F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212
|
||||
F ext/misc/zipfile.c 1e5a27b6cf84171af95a763f21db990f690dc13eed42b84bc2e5b90eca2e9e1c
|
||||
F ext/misc/zipfile.c e4e4f8289a8dee7e4f78547dacfb6548bcd83a02b52c0bc9205d8fbfb7f4b8a1
|
||||
F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64
|
||||
F ext/rbu/rbu.c ea7d1b7eb44c123a2a619332e19fe5313500705c4a58aaa1887905c0d83ffc2e
|
||||
F ext/rbu/rbu1.test 43836fac8c7179a358eaf38a8a1ef3d6e6285842
|
||||
@@ -1611,7 +1611,7 @@ F test/wordcount.c cb589cec469a1d90add05b1f8cee75c7210338d87a5afd65260ed5c0f4bbf
|
||||
F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc
|
||||
F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa
|
||||
F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc
|
||||
F test/zipfile.test d4efc5547c2105fdc54b61d6b167ddd5a1a4b9b70993b402d7f20836b1eceef2
|
||||
F test/zipfile.test a9806a86e5a153d897f320de624a83a9e9774515eb79ad2419496187b1acc7d7
|
||||
F test/zipfile2.test 67d5f08a202796d4b7a71dfa4b8dcb74aa7a9d1f42c5f17bedff9855c1ba7aa5
|
||||
F test/zipfilefault.test 44d4d7a7f7cca7521d569d7f71026b241d65a6b1757aa409c1a168827edbbc2c
|
||||
F tool/GetFile.cs a15e08acb5dd7539b75ba23501581d7c2b462cb5
|
||||
@@ -1712,7 +1712,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P 16bba8650cc24a0fd606944422bb31f2b8bdbe0a5a483678989e400b751eab4d
|
||||
R b511ebdd2c624217586a293149d65f0f
|
||||
P f634a7e386918b829389f20c330d312315fdd61125cd2c5f66cf17a5d74bce49
|
||||
R 7cc91e86ee07cd0fc984888021d66796
|
||||
U drh
|
||||
Z 5119f4749bf9fb79b4a57766ed83d519
|
||||
Z 9fc20201e1cf7d0b9deeae9a18f08a6b
|
||||
|
@@ -1 +1 @@
|
||||
f634a7e386918b829389f20c330d312315fdd61125cd2c5f66cf17a5d74bce49
|
||||
8ad35d483e4293d5571eeacc20fd26cdc4064fbee7b63d974879d507a0ee5792
|
@@ -636,4 +636,35 @@ do_execsql_test 9.0 {
|
||||
)
|
||||
SELECT name FROM zipfile((SELECT zipfile(nm, NULL) FROM src))
|
||||
} {dir1/ dir2/ dir3/ dir4/ /}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# INSERT OR REPLACE and INSERT OR IGNORE
|
||||
#
|
||||
catch {db close}
|
||||
forcedelete test.zip test.db
|
||||
sqlite3 db :memory:
|
||||
load_static_extension db zipfile
|
||||
do_execsql_test 10.0 {
|
||||
CREATE VIRTUAL TABLE z USING zipfile('test.zip');
|
||||
} {}
|
||||
do_catchsql_test 10.1 {
|
||||
INSERT INTO z(name,data) VALUES('a0','one'),('a0','two');
|
||||
} {1 {duplicate name: "a0"}}
|
||||
do_execsql_test 10.2 {
|
||||
SELECT name, data FROM z;
|
||||
} {a0 one}
|
||||
do_execsql_test 10.3 {
|
||||
REPLACE INTO z(name,data) VALUES('a0','three'),('a0','four');
|
||||
} {}
|
||||
do_execsql_test 10.4 {
|
||||
SELECT name, data FROM z;
|
||||
} {a0 four}
|
||||
do_execsql_test 10.5 {
|
||||
INSERT OR IGNORE INTO z(name,data) VALUES('a0','five'),('a0','six');
|
||||
} {}
|
||||
do_execsql_test 10.6 {
|
||||
SELECT name, data FROM z;
|
||||
} {a0 four}
|
||||
|
||||
|
||||
finish_test
|
||||
|
Reference in New Issue
Block a user