Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Unified Diff: third_party/sqlite/src/src/test_delete.c

Issue 2751253002: [sql] Import SQLite 3.17.0. (Closed)
Patch Set: also clang on Linux i386 Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/sqlite/src/src/test_config.c ('k') | third_party/sqlite/src/src/test_demovfs.c » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/sqlite/src/src/test_delete.c
diff --git a/third_party/sqlite/src/src/test_delete.c b/third_party/sqlite/src/src/test_delete.c
new file mode 100644
index 0000000000000000000000000000000000000000..ca61965b27b6cddeb309d73119f5b6167c5aaf8d
--- /dev/null
+++ b/third_party/sqlite/src/src/test_delete.c
@@ -0,0 +1,138 @@
+/*
+** 2016 September 10
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file contains test code to delete an SQLite database and all
+** of its associated files. Associated files include:
+**
+** * The journal file.
+** * The wal file.
+** * The SQLITE_ENABLE_8_3_NAMES version of the db, journal or wal files.
+** * Files created by the test_multiplex.c module to extend any of the
+** above.
+*/
+
+#if SQLITE_OS_WIN
+# include <io.h>
+# define F_OK 0
+#else
+# include <unistd.h>
+#endif
+#include <string.h>
+#include <errno.h>
+#include "sqlite3.h"
+
+/* The following #defines are copied from test_multiplex.c */
+#ifndef MX_CHUNK_NUMBER
+# define MX_CHUNK_NUMBER 299
+#endif
+#ifndef SQLITE_MULTIPLEX_JOURNAL_8_3_OFFSET
+# define SQLITE_MULTIPLEX_JOURNAL_8_3_OFFSET 400
+#endif
+#ifndef SQLITE_MULTIPLEX_WAL_8_3_OFFSET
+# define SQLITE_MULTIPLEX_WAL_8_3_OFFSET 700
+#endif
+
+/*
+** This routine is a copy of (most of) the code from SQLite function
+** sqlite3FileSuffix3(). It modifies the filename in buffer z in the
+** same way as SQLite does when in 8.3 filenames mode.
+*/
+static void sqlite3Delete83Name(char *z){
+ int i, sz;
+ sz = (int)strlen(z);
+ for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){}
+ if( z[i]=='.' && (sz>i+4) ) memmove(&z[i+1], &z[sz-3], 4);
+}
+
+/*
+** zFile is a filename. Assuming no error occurs, if this file exists,
+** set *pbExists to true and unlink it. Or, if the file does not exist,
+** set *pbExists to false before returning.
+**
+** If an error occurs, the value of errno is returned. Or, if no error
+** occurs, zero is returned.
+*/
+static int sqlite3DeleteUnlinkIfExists(const char *zFile, int *pbExists){
+ int rc;
+ rc = access(zFile, F_OK);
+ if( rc ){
+ if( errno==ENOENT ){
+ if( pbExists ) *pbExists = 0;
+ return 0;
+ }
+ return errno;
+ }
+ if( pbExists ) *pbExists = 1;
+ rc = unlink(zFile);
+ if( rc ) return errno;
+ return 0;
+}
+
+/*
+** Delete the database file identified by the string argument passed to this
+** function. The string must contain a filename, not an SQLite URI.
+*/
+SQLITE_API int sqlite3_delete_database(
+ const char *zFile /* File to delete */
+){
+ char *zBuf; /* Buffer to sprintf() filenames to */
+ int nBuf; /* Size of buffer in bytes */
+ int rc = 0; /* System error code */
+ int i; /* Iterate through azFmt[] and aMFile[] */
+
+ const char *azFmt[] = { "%s", "%s-journal", "%s-wal", "%s-shm" };
+
+ struct MFile {
+ const char *zFmt;
+ int iOffset;
+ int b83;
+ } aMFile[] = {
+ { "%s%03d", 0, 0 },
+ { "%s-journal%03d", 0, 0 },
+ { "%s-wal%03d", 0, 0 },
+ { "%s%03d", 0, 1 },
+ { "%s-journal%03d", SQLITE_MULTIPLEX_JOURNAL_8_3_OFFSET, 1 },
+ { "%s-wal%03d", SQLITE_MULTIPLEX_WAL_8_3_OFFSET, 1 },
+ };
+
+ /* Allocate a buffer large enough for any of the files that need to be
+ ** deleted. */
+ nBuf = (int)strlen(zFile) + 100;
+ zBuf = (char*)sqlite3_malloc(nBuf);
+ if( zBuf==0 ) return SQLITE_NOMEM;
+
+ /* Delete both the regular and 8.3 filenames versions of the database,
+ ** journal, wal and shm files. */
+ for(i=0; rc==0 && i<sizeof(azFmt)/sizeof(azFmt[0]); i++){
+ sqlite3_snprintf(nBuf, zBuf, azFmt[i], zFile);
+ rc = sqlite3DeleteUnlinkIfExists(zBuf, 0);
+ if( rc==0 && i!=0 ){
+ sqlite3Delete83Name(zBuf);
+ rc = sqlite3DeleteUnlinkIfExists(zBuf, 0);
+ }
+ }
+
+ /* Delete any multiplexor files */
+ for(i=0; rc==0 && i<sizeof(aMFile)/sizeof(aMFile[0]); i++){
+ struct MFile *p = &aMFile[i];
+ int iChunk;
+ for(iChunk=1; iChunk<=MX_CHUNK_NUMBER; iChunk++){
+ int bExists;
+ sqlite3_snprintf(nBuf, zBuf, p->zFmt, zFile, iChunk+p->iOffset);
+ if( p->b83 ) sqlite3Delete83Name(zBuf);
+ rc = sqlite3DeleteUnlinkIfExists(zBuf, &bExists);
+ if( bExists==0 || rc!=0 ) break;
+ }
+ }
+
+ sqlite3_free(zBuf);
+ return (rc ? SQLITE_ERROR : SQLITE_OK);
+}
« no previous file with comments | « third_party/sqlite/src/src/test_config.c ('k') | third_party/sqlite/src/src/test_demovfs.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698