Index: sync/syncable/directory_backing_store.cc |
diff --git a/sync/syncable/directory_backing_store.cc b/sync/syncable/directory_backing_store.cc |
index e9ba0acc57c0bd945b1010f3f230a288f64999cb..5d160836c3d5ef13202d63940d4b3d1cabbdf467 100644 |
--- a/sync/syncable/directory_backing_store.cc |
+++ b/sync/syncable/directory_backing_store.cc |
@@ -40,7 +40,7 @@ static const string::size_type kUpdateStatementBufferSize = 2048; |
// Increment this version whenever updating DB tables. |
extern const int32 kCurrentDBVersion; // Global visibility for our unittest. |
-const int32 kCurrentDBVersion = 83; |
+const int32 kCurrentDBVersion = 84; |
// Iterate over the fields of |entry| and bind each to |statement| for |
// updating. Returns the number of args bound. |
@@ -197,8 +197,11 @@ bool DirectoryBackingStore::SaveChanges( |
// Back out early if there is nothing to write. |
bool save_info = |
(Directory::KERNEL_SHARE_INFO_DIRTY == snapshot.kernel_info_status); |
- if (snapshot.dirty_metas.size() < 1 && !save_info) |
+ if (snapshot.dirty_metas.empty() |
+ && snapshot.metahandles_to_purge.empty() |
+ && !save_info) { |
return true; |
+ } |
sql::Transaction transaction(db_.get()); |
if (!transaction.Begin()) |
@@ -236,9 +239,8 @@ bool DirectoryBackingStore::SaveChanges( |
sql::Statement s2(db_->GetCachedStatement( |
SQL_FROM_HERE, |
"INSERT OR REPLACE " |
- "INTO models (model_id, progress_marker, initial_sync_ended, " |
- " transaction_version) " |
- "VALUES (?, ?, ?, ?)")); |
+ "INTO models (model_id, progress_marker, transaction_version) " |
+ "VALUES (?, ?, ?)")); |
for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { |
// We persist not ModelType but rather a protobuf-derived ID. |
@@ -247,8 +249,7 @@ bool DirectoryBackingStore::SaveChanges( |
info.download_progress[i].SerializeToString(&progress_marker); |
s2.BindBlob(0, model_id.data(), model_id.length()); |
s2.BindBlob(1, progress_marker.data(), progress_marker.length()); |
- s2.BindBool(2, info.initial_sync_ended.Has(ModelTypeFromInt(i))); |
- s2.BindInt64(3, info.transaction_version[i]); |
+ s2.BindInt64(2, info.transaction_version[i]); |
if (!s2.Run()) |
return false; |
DCHECK_EQ(db_->GetLastChangeCount(), 1); |
@@ -364,6 +365,12 @@ bool DirectoryBackingStore::InitializeTables() { |
version_on_disk = 83; |
} |
+ // Version 84 migration removes the initial_sync_ended bits. |
+ if (version_on_disk == 83) { |
+ if (MigrateVersion83To84()) |
+ version_on_disk = 84; |
+ } |
+ |
// If one of the migrations requested it, drop columns that aren't current. |
// It's only safe to do this after migrating all the way to the current |
// version. |
@@ -502,7 +509,7 @@ bool DirectoryBackingStore::LoadInfo(Directory::KernelLoadInfo* info) { |
{ |
sql::Statement s( |
db_->GetUniqueStatement( |
- "SELECT model_id, progress_marker, initial_sync_ended, " |
+ "SELECT model_id, progress_marker, " |
"transaction_version FROM models")); |
while (s.Step()) { |
@@ -511,9 +518,7 @@ bool DirectoryBackingStore::LoadInfo(Directory::KernelLoadInfo* info) { |
if (type != UNSPECIFIED && type != TOP_LEVEL_FOLDER) { |
info->kernel_info.download_progress[type].ParseFromArray( |
s.ColumnBlob(1), s.ColumnByteLength(1)); |
- if (s.ColumnBool(2)) |
- info->kernel_info.initial_sync_ended.Put(type); |
- info->kernel_info.transaction_version[type] = s.ColumnInt64(3); |
+ info->kernel_info.transaction_version[type] = s.ColumnInt64(2); |
} |
} |
if (!s.Succeeded()) |
@@ -908,7 +913,7 @@ bool DirectoryBackingStore::MigrateVersion74To75() { |
// Move aside the old table and create a new empty one at the current schema. |
if (!db_->Execute("ALTER TABLE models RENAME TO temp_models")) |
return false; |
- if (!CreateModelsTable()) |
+ if (!CreateV75ModelsTable()) |
return false; |
sql::Statement query(db_->GetUniqueStatement( |
@@ -1091,6 +1096,23 @@ bool DirectoryBackingStore::MigrateVersion82To83() { |
return true; |
} |
+ |
+bool DirectoryBackingStore::MigrateVersion83To84() { |
+ // Version 84 removes the initial_sync_ended flag. |
+ if (!db_->Execute("ALTER TABLE models RENAME TO temp_models")) |
+ return false; |
+ if (!CreateModelsTable()) |
+ return false; |
+ if (!db_->Execute("INSERT INTO models SELECT " |
+ "model_id, progress_marker, transaction_version " |
+ "FROM temp_models")) { |
+ return false; |
+ } |
+ SafeDropTable("temp_models"); |
+ SetVersion(84); |
+ return true; |
+} |
+ |
bool DirectoryBackingStore::CreateTables() { |
DVLOG(1) << "First run, creating tables"; |
// Create two little tables share_version and share_info |
@@ -1188,10 +1210,23 @@ bool DirectoryBackingStore::CreateV71ModelsTable() { |
"initial_sync_ended BOOLEAN default 0)"); |
} |
+bool DirectoryBackingStore::CreateV75ModelsTable() { |
+ // This is an old schema for the Models table, used from versions 75 to 83. |
+ return db_->Execute( |
+ "CREATE TABLE models (" |
+ "model_id BLOB primary key, " |
+ "progress_marker BLOB, " |
+ // Gets set if the syncer ever gets updates from the |
+ // server and the server returns 0. Lets us detect the |
+ // end of the initial sync. |
+ "initial_sync_ended BOOLEAN default 0, " |
+ "transaction_version BIGINT default 0)"); |
+} |
+ |
bool DirectoryBackingStore::CreateModelsTable() { |
// This is the current schema for the Models table, from version 81 |
// onward. If you change the schema, you'll probably want to double-check |
- // the use of this function in the v74-v75 migration. |
+ // the use of this function in the v83-v84 migration. |
return db_->Execute( |
"CREATE TABLE models (" |
"model_id BLOB primary key, " |
@@ -1199,7 +1234,6 @@ bool DirectoryBackingStore::CreateModelsTable() { |
// Gets set if the syncer ever gets updates from the |
// server and the server returns 0. Lets us detect the |
// end of the initial sync. |
- "initial_sync_ended BOOLEAN default 0, " |
"transaction_version BIGINT default 0)"); |
} |