diff options
author | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-17 04:45:13 +0000 |
---|---|---|
committer | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-17 04:45:13 +0000 |
commit | fed734a145c6defbf1063b3b9a497aee88db720d (patch) | |
tree | 3f8fe3a0e49f57a42c1bb514e4f7c145c6c5195c /sql/connection.cc | |
parent | 5b7355bcdf73ef995001d0cf8fbf2385012a7a52 (diff) | |
download | chromium_src-fed734a145c6defbf1063b3b9a497aee88db720d.zip chromium_src-fed734a145c6defbf1063b3b9a497aee88db720d.tar.gz chromium_src-fed734a145c6defbf1063b3b9a497aee88db720d.tar.bz2 |
[sql] Retry Open() if error handler fixed things.
Since the caller cannot have existing database-derived state before
the database is opened, Open() can be safely retried after the error
handler has razed the database.
BUG=109482
Review URL: https://chromiumcodereview.appspot.com/18641004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@211936 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sql/connection.cc')
-rw-r--r-- | sql/connection.cc | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/sql/connection.cc b/sql/connection.cc index 5f76a7f..95d09c2 100644 --- a/sql/connection.cc +++ b/sql/connection.cc @@ -194,15 +194,15 @@ bool Connection::Open(const base::FilePath& path) { } #if defined(OS_WIN) - return OpenInternal(WideToUTF8(path.value())); + return OpenInternal(WideToUTF8(path.value()), RETRY_ON_POISON); #elif defined(OS_POSIX) - return OpenInternal(path.value()); + return OpenInternal(path.value(), RETRY_ON_POISON); #endif } bool Connection::OpenInMemory() { in_memory_ = true; - return OpenInternal(":memory:"); + return OpenInternal(":memory:", NO_RETRY); } void Connection::CloseInternal(bool forced) { @@ -238,8 +238,8 @@ void Connection::CloseInternal(bool forced) { AssertIOAllowed(); // TODO(shess): Histogram for failure. sqlite3_close(db_); - db_ = NULL; } + db_ = NULL; } void Connection::Close() { @@ -699,7 +699,8 @@ const char* Connection::GetErrorMessage() const { return sqlite3_errmsg(db_); } -bool Connection::OpenInternal(const std::string& file_name) { +bool Connection::OpenInternal(const std::string& file_name, + Connection::Retry retry_flag) { AssertIOAllowed(); if (db_) { @@ -723,8 +724,11 @@ bool Connection::OpenInternal(const std::string& file_name) { UMA_HISTOGRAM_ENUMERATION("Sqlite.OpenFailure", err & 0xff, 50); OnSqliteError(err, NULL); + bool was_poisoned = poisoned_; Close(); - db_ = NULL; + + if (was_poisoned && retry_flag == RETRY_ON_POISON) + return OpenInternal(file_name, NO_RETRY); return false; } @@ -806,7 +810,10 @@ bool Connection::OpenInternal(const std::string& file_name) { } if (!ExecuteWithTimeout("PRAGMA secure_delete=ON", kBusyTimeout)) { + bool was_poisoned = poisoned_; Close(); + if (was_poisoned && retry_flag == RETRY_ON_POISON) + return OpenInternal(file_name, NO_RETRY); return false; } |