summaryrefslogtreecommitdiffstats
path: root/sql/connection.cc
diff options
context:
space:
mode:
authorshess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-24 05:55:08 +0000
committershess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-24 05:55:08 +0000
commit8d2e39e922347608d78c2260279c3072d03232db (patch)
treecadc844773d447080ace8201412961e665f6407b /sql/connection.cc
parent8b9211d4e1de4531f7b462625a0a5ceec1d4dcce (diff)
downloadchromium_src-8d2e39e922347608d78c2260279c3072d03232db.zip
chromium_src-8d2e39e922347608d78c2260279c3072d03232db.tar.gz
chromium_src-8d2e39e922347608d78c2260279c3072d03232db.tar.bz2
[sql] Static helper to delete database and all associated files.
Not all of the ad-hoc file_util::Delete() cases handle -journal, and if -wal was added all of them need to be tracked down. BUG=none Review URL: https://chromiumcodereview.appspot.com/17058004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@208140 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sql/connection.cc')
-rw-r--r--sql/connection.cc26
1 files changed, 26 insertions, 0 deletions
diff --git a/sql/connection.cc b/sql/connection.cc
index 67cdf08..e99b6bc 100644
--- a/sql/connection.cc
+++ b/sql/connection.cc
@@ -377,6 +377,32 @@ bool Connection::RazeAndClose() {
return result;
}
+// TODO(shess): To the extent possible, figure out the optimal
+// ordering for these deletes which will prevent other connections
+// from seeing odd behavior. For instance, it may be necessary to
+// manually lock the main database file in a SQLite-compatible fashion
+// (to prevent other processes from opening it), then delete the
+// journal files, then delete the main database file. Another option
+// might be to lock the main database file and poison the header with
+// junk to prevent other processes from opening it successfully (like
+// Gears "SQLite poison 3" trick).
+//
+// static
+bool Connection::Delete(const base::FilePath& path) {
+ base::ThreadRestrictions::AssertIOAllowed();
+
+ base::FilePath journal_path(path.value() + FILE_PATH_LITERAL("-journal"));
+ base::FilePath wal_path(path.value() + FILE_PATH_LITERAL("-wal"));
+
+ file_util::Delete(journal_path, false);
+ file_util::Delete(wal_path, false);
+ file_util::Delete(path, false);
+
+ return !file_util::PathExists(journal_path) &&
+ !file_util::PathExists(wal_path) &&
+ !file_util::PathExists(path);
+}
+
bool Connection::BeginTransaction() {
if (needs_rollback_) {
DCHECK_GT(transaction_nesting_, 0);