diff options
Diffstat (limited to 'sync/syncable/directory_backing_store.cc')
-rw-r--r-- | sync/syncable/directory_backing_store.cc | 52 |
1 files changed, 30 insertions, 22 deletions
diff --git a/sync/syncable/directory_backing_store.cc b/sync/syncable/directory_backing_store.cc index c5f1fd5..9d7f4fc 100644 --- a/sync/syncable/directory_backing_store.cc +++ b/sync/syncable/directory_backing_store.cc @@ -40,6 +40,9 @@ namespace syncable { // Increment this version whenever updating DB tables. const int32_t kCurrentDBVersion = 90; +// The current database page size in Kilobytes. +const int32_t kCurrentPageSizeKB = 32768; + // Iterate over the fields of |entry| and bind each to |statement| for // updating. Returns the number of args bound. void BindFields(const EntryKernel& entry, @@ -260,7 +263,7 @@ void UploadModelTypeEntryCount(const int total_specifics_copies, DirectoryBackingStore::DirectoryBackingStore(const string& dir_name) : dir_name_(dir_name), - database_page_size_(32768), + database_page_size_(kCurrentPageSizeKB), needs_metas_column_refresh_(false), needs_share_info_column_refresh_(false) { DCHECK(base::ThreadTaskRunnerHandle::IsSet()); @@ -270,7 +273,7 @@ DirectoryBackingStore::DirectoryBackingStore(const string& dir_name) DirectoryBackingStore::DirectoryBackingStore(const string& dir_name, sql::Connection* db) : dir_name_(dir_name), - database_page_size_(32768), + database_page_size_(kCurrentPageSizeKB), db_(db), needs_metas_column_refresh_(false), needs_share_info_column_refresh_(false) { @@ -413,14 +416,20 @@ bool DirectoryBackingStore::OpenInMemory() { } bool DirectoryBackingStore::InitializeTables() { - int page_size = 0; - if (GetDatabasePageSize(&page_size) && page_size == 4096) { - IncreasePageSizeTo32K(); - } + if (!UpdatePageSizeIfNecessary()) + return false; + sql::Transaction transaction(db_.get()); if (!transaction.Begin()) return false; + if (!db_->DoesTableExist("share_version")) { + // Delete the existing database (if any), and create a fresh one. + DropAllTables(); + if (!CreateTables()) + return false; + } + int version_on_disk = GetVersion(); // Upgrade from version 67. Version 67 was widely distributed as the original @@ -569,22 +578,14 @@ bool DirectoryBackingStore::InitializeTables() { // version. if (version_on_disk == kCurrentDBVersion && needs_column_refresh()) { if (!RefreshColumns()) - version_on_disk = 0; - } - - // A final, alternative catch-all migration to simply re-sync everything. - if (version_on_disk != kCurrentDBVersion) { - if (version_on_disk > kCurrentDBVersion) - return false; - - // Fallback (re-sync everything) migration path. - DVLOG(1) << "Old/null sync database, version " << version_on_disk; - // Delete the existing database (if any), and create a fresh one. - DropAllTables(); - if (!CreateTables()) return false; } + // In case of error, let the caller decide whether to re-sync from scratch + // with a new database. + if (version_on_disk != kCurrentDBVersion) + return false; + return transaction.Commit(); } @@ -1472,6 +1473,7 @@ bool DirectoryBackingStore::MigrateVersion89To90() { bool DirectoryBackingStore::CreateTables() { DVLOG(1) << "First run, creating tables"; + // Create two little tables share_version and share_info if (!db_->Execute( "CREATE TABLE share_version (" @@ -1711,10 +1713,16 @@ bool DirectoryBackingStore::GetDatabasePageSize(int* page_size) { return true; } -bool DirectoryBackingStore::IncreasePageSizeTo32K() { - if (!db_->Execute("PRAGMA page_size=32768;") || !Vacuum()) { +bool DirectoryBackingStore::UpdatePageSizeIfNecessary() { + int page_size; + if (!GetDatabasePageSize(&page_size)) + return false; + if (page_size == kCurrentPageSizeKB) + return true; + std::string update_page_size = base::StringPrintf( + "PRAGMA page_size=%i;", kCurrentPageSizeKB); + if (!db_->Execute(update_page_size.c_str()) || !Vacuum()) return false; - } return true; } |