Chromium Code Reviews| Index: chrome/browser/sync/syncable/directory_backing_store.cc |
| diff --git a/chrome/browser/sync/syncable/directory_backing_store.cc b/chrome/browser/sync/syncable/directory_backing_store.cc |
| index 2635defce745fb839b8acd5af7bd4e7cd7e7cd9e..9c86ea76a5b6350fb90192ff8226d396826e72fb 100644 |
| --- a/chrome/browser/sync/syncable/directory_backing_store.cc |
| +++ b/chrome/browser/sync/syncable/directory_backing_store.cc |
| @@ -1,4 +1,4 @@ |
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| @@ -12,6 +12,7 @@ |
| #include <limits> |
| +#include "base/file_util.h" |
| #include "base/hash_tables.h" |
| #include "base/logging.h" |
| #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" |
| @@ -179,19 +180,22 @@ DirectoryBackingStore::~DirectoryBackingStore() { |
| bool DirectoryBackingStore::OpenAndConfigureHandleHelper( |
| sqlite3** handle) const { |
| if (SQLITE_OK == OpenSqliteDb(backing_filepath_, handle)) { |
| + sqlite_utils::scoped_sqlite_db_ptr scoped_handle(*handle); |
| sqlite3_busy_timeout(*handle, std::numeric_limits<int>::max()); |
| { |
| SQLStatement statement; |
| statement.prepare(*handle, "PRAGMA fullfsync = 1"); |
| if (SQLITE_DONE != statement.step()) { |
| - LOG(FATAL) << sqlite3_errmsg(*handle); |
| + LOG(ERROR) << sqlite3_errmsg(*handle); |
| + return false; |
| } |
| } |
| { |
| SQLStatement statement; |
| statement.prepare(*handle, "PRAGMA synchronous = 2"); |
| if (SQLITE_DONE != statement.step()) { |
| - LOG(FATAL) << sqlite3_errmsg(*handle); |
| + LOG(ERROR) << sqlite3_errmsg(*handle); |
| + return false; |
| } |
| } |
| sqlite3_busy_timeout(*handle, kDirectoryBackingStoreBusyTimeoutMs); |
| @@ -204,6 +208,7 @@ bool DirectoryBackingStore::OpenAndConfigureHandleHelper( |
| attrs | FILE_ATTRIBUTE_NOT_CONTENT_INDEXED); |
| #endif |
| + scoped_handle.release(); |
|
tim (not reviewing)
2010/04/27 14:25:03
this is necessary?
albertb
2010/04/27 15:05:41
Yes. If the scoped ptr holds a valid db handle, it
|
| return true; |
| } |
| return false; |
| @@ -230,6 +235,13 @@ DirOpenResult DirectoryBackingStore::Load(MetahandlesIndex* entry_bucket, |
| bool DirectoryBackingStore::BeginLoad() { |
| DCHECK(load_dbhandle_ == NULL); |
| + bool ret = OpenAndConfigureHandleHelper(&load_dbhandle_); |
| + if (ret) |
| + return ret; |
| + // Something's gone wrong. Nuke the database and try again. |
| + LOG(ERROR) << "Sync database " << backing_filepath_.value() |
| + << " corrupt. Deleting and recreating."; |
| + file_util::Delete(backing_filepath_, false); |
| return OpenAndConfigureHandleHelper(&load_dbhandle_); |
| } |