Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync/syncable/directory_backing_store.h" | 5 #include "chrome/browser/sync/syncable/directory_backing_store.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
| 8 | 8 |
| 9 #if defined(OS_MACOSX) | 9 #if defined(OS_MACOSX) |
| 10 #include <CoreFoundation/CoreFoundation.h> | 10 #include <CoreFoundation/CoreFoundation.h> |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 37 using std::string; | 37 using std::string; |
| 38 | 38 |
| 39 namespace syncable { | 39 namespace syncable { |
| 40 | 40 |
| 41 // This just has to be big enough to hold an UPDATE or INSERT statement that | 41 // This just has to be big enough to hold an UPDATE or INSERT statement that |
| 42 // modifies all the columns in the entry table. | 42 // modifies all the columns in the entry table. |
| 43 static const string::size_type kUpdateStatementBufferSize = 2048; | 43 static const string::size_type kUpdateStatementBufferSize = 2048; |
| 44 | 44 |
| 45 // Increment this version whenever updating DB tables. | 45 // Increment this version whenever updating DB tables. |
| 46 extern const int32 kCurrentDBVersion; // Global visibility for our unittest. | 46 extern const int32 kCurrentDBVersion; // Global visibility for our unittest. |
| 47 const int32 kCurrentDBVersion = 73; | 47 const int32 kCurrentDBVersion = 74; |
| 48 | 48 |
| 49 namespace { | 49 namespace { |
| 50 | 50 |
| 51 int ExecQuery(sqlite3* dbhandle, const char* query) { | 51 int ExecQuery(sqlite3* dbhandle, const char* query) { |
| 52 SQLStatement statement; | 52 SQLStatement statement; |
| 53 int result = statement.prepare(dbhandle, query); | 53 int result = statement.prepare(dbhandle, query); |
| 54 if (SQLITE_OK != result) | 54 if (SQLITE_OK != result) |
| 55 return result; | 55 return result; |
| 56 do { | 56 do { |
| 57 result = statement.step(); | 57 result = statement.step(); |
| (...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 372 | 372 |
| 373 if (!DeleteEntries(snapshot.metahandles_to_purge)) | 373 if (!DeleteEntries(snapshot.metahandles_to_purge)) |
| 374 return false; | 374 return false; |
| 375 | 375 |
| 376 if (save_info) { | 376 if (save_info) { |
| 377 const Directory::PersistedKernelInfo& info = snapshot.kernel_info; | 377 const Directory::PersistedKernelInfo& info = snapshot.kernel_info; |
| 378 SQLStatement update; | 378 SQLStatement update; |
| 379 update.prepare(dbhandle, "UPDATE share_info " | 379 update.prepare(dbhandle, "UPDATE share_info " |
| 380 "SET store_birthday = ?, " | 380 "SET store_birthday = ?, " |
| 381 "next_id = ?, " | 381 "next_id = ?, " |
| 382 "notification_state = ?"); | 382 "notification_state = ?, " |
| 383 "autofill_migration_state = ?, " | |
| 384 "bookmarks_added_during_autofill_migration = ?, " | |
| 385 "autofill_migration_time = ?, " | |
| 386 "autofill_entries_added_during_migration = ?, " | |
| 387 "autofill_profiles_added_during_migration = ? "); | |
| 388 | |
| 389 syncable::AutofillMigrationDebugInfo& debug_info = | |
| 390 info.autofill_migration_debug_info; | |
|
tim (not reviewing)
2010/12/13 19:24:33
indent 4 spaces
lipalani
2010/12/14 21:05:57
Done.
| |
| 383 update.bind_string(0, info.store_birthday); | 391 update.bind_string(0, info.store_birthday); |
| 384 update.bind_int64(1, info.next_id); | 392 update.bind_int64(1, info.next_id); |
| 385 update.bind_blob(2, info.notification_state.data(), | 393 update.bind_blob(2, info.notification_state.data(), |
| 386 info.notification_state.size()); | 394 info.notification_state.size()); |
| 395 update.bind_int(3, info.autofill_migration_state); | |
| 396 update.bind_int(4, | |
| 397 debug_info.bookmarks_added_during_migration); | |
| 398 update.bind_int64(5, | |
| 399 debug_info.autofill_migration_time); | |
| 400 update.bind_int(6, | |
| 401 debug_info.autofill_entries_added_during_migration); | |
| 402 update.bind_int(7, | |
| 403 debug_info.autofill_profile_added_during_migration); | |
| 387 | 404 |
| 388 if (!(SQLITE_DONE == update.step() && | 405 if (!(SQLITE_DONE == update.step() && |
| 389 SQLITE_OK == update.reset() && | 406 SQLITE_OK == update.reset() && |
| 390 1 == update.changes())) { | 407 1 == update.changes())) { |
| 391 return false; | 408 return false; |
| 392 } | 409 } |
| 393 | 410 |
| 394 for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { | 411 for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { |
| 395 SQLStatement op; | 412 SQLStatement op; |
| 396 op.prepare(dbhandle, "INSERT OR REPLACE INTO models (model_id, " | 413 op.prepare(dbhandle, "INSERT OR REPLACE INTO models (model_id, " |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 449 if (MigrateVersion71To72()) | 466 if (MigrateVersion71To72()) |
| 450 version_on_disk = 72; | 467 version_on_disk = 72; |
| 451 } | 468 } |
| 452 | 469 |
| 453 // Version 73 added a field for notification state. | 470 // Version 73 added a field for notification state. |
| 454 if (version_on_disk == 72) { | 471 if (version_on_disk == 72) { |
| 455 if (MigrateVersion72To73()) | 472 if (MigrateVersion72To73()) |
| 456 version_on_disk = 73; | 473 version_on_disk = 73; |
| 457 } | 474 } |
| 458 | 475 |
| 476 if (version_on_disk == 73) { | |
| 477 if (MigrateVersion73To74()) | |
| 478 version_on_disk = 74; | |
| 479 } | |
| 480 | |
| 459 // If one of the migrations requested it, drop columns that aren't current. | 481 // If one of the migrations requested it, drop columns that aren't current. |
| 460 // It's only safe to do this after migrating all the way to the current | 482 // It's only safe to do this after migrating all the way to the current |
| 461 // version. | 483 // version. |
| 462 if (version_on_disk == kCurrentDBVersion && needs_column_refresh_) { | 484 if (version_on_disk == kCurrentDBVersion && needs_column_refresh_) { |
| 463 if (!RefreshColumns()) | 485 if (!RefreshColumns()) |
| 464 version_on_disk = 0; | 486 version_on_disk = 0; |
| 465 } | 487 } |
| 466 | 488 |
| 467 // A final, alternative catch-all migration to simply re-sync everything. | 489 // A final, alternative catch-all migration to simply re-sync everything. |
| 468 if (version_on_disk != kCurrentDBVersion) { | 490 if (version_on_disk != kCurrentDBVersion) { |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 549 entry_bucket->insert(kernel); | 571 entry_bucket->insert(kernel); |
| 550 } | 572 } |
| 551 return SQLITE_DONE == query_result; | 573 return SQLITE_DONE == query_result; |
| 552 } | 574 } |
| 553 | 575 |
| 554 bool DirectoryBackingStore::LoadInfo(Directory::KernelLoadInfo* info) { | 576 bool DirectoryBackingStore::LoadInfo(Directory::KernelLoadInfo* info) { |
| 555 { | 577 { |
| 556 SQLStatement query; | 578 SQLStatement query; |
| 557 query.prepare(load_dbhandle_, | 579 query.prepare(load_dbhandle_, |
| 558 "SELECT store_birthday, next_id, cache_guid, " | 580 "SELECT store_birthday, next_id, cache_guid, " |
| 559 "notification_state FROM share_info"); | 581 "notification_state, autofill_migration_state, " |
| 582 "bookmarks_added_during_autofill_migration, " | |
| 583 "autofill_migration_time, " | |
| 584 "autofill_entries_added_during_migration, " | |
| 585 "autofill_profiles_added_during_migration " | |
| 586 "FROM share_info"); | |
| 560 if (SQLITE_ROW != query.step()) | 587 if (SQLITE_ROW != query.step()) |
| 561 return false; | 588 return false; |
| 562 info->kernel_info.store_birthday = query.column_string(0); | 589 info->kernel_info.store_birthday = query.column_string(0); |
| 563 info->kernel_info.next_id = query.column_int64(1); | 590 info->kernel_info.next_id = query.column_int64(1); |
| 564 info->cache_guid = query.column_string(2); | 591 info->cache_guid = query.column_string(2); |
| 565 query.column_blob_as_string(3, &info->kernel_info.notification_state); | 592 query.column_blob_as_string(3, &info->kernel_info.notification_state); |
| 593 info->kernel_info.autofill_migration_state = | |
| 594 static_cast<AutofillMigrationState> (query.column_int(4)); | |
|
tim (not reviewing)
2010/12/13 19:24:33
indent 4 spaces. would be nice to have dchecks on
lipalani
2010/12/15 09:08:33
Not sure how dchecks can be added. fixed the inden
| |
| 595 syncable::AutofillMigrationDebugInfo& debug_info = | |
| 596 info->kernel_info.autofill_migration_debug_info; | |
| 597 debug_info.bookmarks_added_during_migration = | |
| 598 query.column_int(5); | |
| 599 debug_info.autofill_migration_time = | |
| 600 query.column_int64(6); | |
| 601 debug_info.autofill_entries_added_during_migration = | |
| 602 query.column_int(7); | |
| 603 debug_info.autofill_profile_added_during_migration = | |
| 604 query.column_int(8); | |
| 566 } | 605 } |
| 567 { | 606 { |
| 568 SQLStatement query; | 607 SQLStatement query; |
| 569 query.prepare(load_dbhandle_, | 608 query.prepare(load_dbhandle_, |
| 570 "SELECT model_id, last_download_timestamp, initial_sync_ended " | 609 "SELECT model_id, last_download_timestamp, initial_sync_ended " |
| 571 "FROM models"); | 610 "FROM models"); |
| 572 while (SQLITE_ROW == query.step()) { | 611 while (SQLITE_ROW == query.step()) { |
| 573 string model_id; | 612 string model_id; |
| 574 query.column_blob_as_string(0, &model_id); | 613 query.column_blob_as_string(0, &model_id); |
| 575 ModelType type = ModelIdToModelTypeEnum(model_id); | 614 ModelType type = ModelIdToModelTypeEnum(model_id); |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 919 bool DirectoryBackingStore::MigrateVersion72To73() { | 958 bool DirectoryBackingStore::MigrateVersion72To73() { |
| 920 int result = | 959 int result = |
| 921 ExecQuery(load_dbhandle_, | 960 ExecQuery(load_dbhandle_, |
| 922 "ALTER TABLE share_info ADD COLUMN notification_state BLOB"); | 961 "ALTER TABLE share_info ADD COLUMN notification_state BLOB"); |
| 923 if (result != SQLITE_DONE) | 962 if (result != SQLITE_DONE) |
| 924 return false; | 963 return false; |
| 925 SetVersion(73); | 964 SetVersion(73); |
| 926 return true; | 965 return true; |
| 927 } | 966 } |
| 928 | 967 |
| 968 bool DirectoryBackingStore::MigrateVersion73To74() { | |
| 969 int result = | |
| 970 ExecQuery(load_dbhandle_, | |
| 971 "ALTER TABLE share_info ADD COLUMN autofill_migration_state " | |
| 972 "INT default 0"); | |
| 973 if (result != SQLITE_DONE) | |
| 974 return false; | |
| 975 | |
| 976 result = | |
| 977 ExecQuery(load_dbhandle_, | |
|
tim (not reviewing)
2010/12/13 19:24:33
prev line
lipalani
2010/12/14 21:05:57
Done.
| |
| 978 "ALTER TABLE share_info ADD COLUMN " | |
| 979 "bookmarks_added_during_autofill_migration " | |
| 980 "INT default 0"); | |
| 981 | |
| 982 if (result != SQLITE_DONE) | |
| 983 return false; | |
| 984 | |
| 985 result = | |
| 986 ExecQuery(load_dbhandle_, | |
|
tim (not reviewing)
2010/12/13 19:24:33
prev line
lipalani
2010/12/14 21:05:57
Done.
| |
| 987 "ALTER TABLE share_info ADD COLUMN autofill_migration_time " | |
| 988 "INT default 0"); | |
| 989 | |
| 990 if (result != SQLITE_DONE) | |
| 991 return false; | |
| 992 | |
| 993 result = | |
| 994 ExecQuery(load_dbhandle_, | |
|
tim (not reviewing)
2010/12/13 19:24:33
prev line
lipalani
2010/12/14 21:05:57
Done.
| |
| 995 "ALTER TABLE share_info ADD COLUMN " | |
| 996 "autofill_entries_added_during_migration " | |
| 997 "INT default 0"); | |
| 998 | |
| 999 if (result != SQLITE_DONE) | |
| 1000 return false; | |
| 1001 | |
| 1002 result = | |
| 1003 ExecQuery(load_dbhandle_, | |
|
tim (not reviewing)
2010/12/13 19:24:33
prev line
lipalani
2010/12/14 21:05:57
Done.
| |
| 1004 "ALTER TABLE share_info ADD COLUMN " | |
| 1005 "autofill_profiles_added_during_migration " | |
| 1006 "INT default 0"); | |
| 1007 | |
| 1008 if (result != SQLITE_DONE) | |
| 1009 return false; | |
| 1010 | |
| 1011 SetVersion(74); | |
| 1012 return true; | |
| 1013 } | |
| 1014 | |
| 1015 | |
| 929 int DirectoryBackingStore::CreateTables() { | 1016 int DirectoryBackingStore::CreateTables() { |
| 930 VLOG(1) << "First run, creating tables"; | 1017 VLOG(1) << "First run, creating tables"; |
| 931 // Create two little tables share_version and share_info | 1018 // Create two little tables share_version and share_info |
| 932 int result = ExecQuery(load_dbhandle_, | 1019 int result = ExecQuery(load_dbhandle_, |
| 933 "CREATE TABLE share_version (" | 1020 "CREATE TABLE share_version (" |
| 934 "id VARCHAR(128) primary key, data INT)"); | 1021 "id VARCHAR(128) primary key, data INT)"); |
| 935 if (result != SQLITE_DONE) | 1022 if (result != SQLITE_DONE) |
| 936 return result; | 1023 return result; |
| 937 { | 1024 { |
| 938 SQLStatement statement; | 1025 SQLStatement statement; |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 953 { | 1040 { |
| 954 SQLStatement statement; | 1041 SQLStatement statement; |
| 955 statement.prepare(load_dbhandle_, "INSERT INTO share_info VALUES" | 1042 statement.prepare(load_dbhandle_, "INSERT INTO share_info VALUES" |
| 956 "(?, " // id | 1043 "(?, " // id |
| 957 "?, " // name | 1044 "?, " // name |
| 958 "?, " // store_birthday | 1045 "?, " // store_birthday |
| 959 "?, " // db_create_version | 1046 "?, " // db_create_version |
| 960 "?, " // db_create_time | 1047 "?, " // db_create_time |
| 961 "-2, " // next_id | 1048 "-2, " // next_id |
| 962 "?, " // cache_guid | 1049 "?, " // cache_guid |
| 1050 "?, " // autofill_migration_state | |
| 1051 "?, " // bookmarks_added | |
| 1052 // _during_autofill_migration | |
| 1053 "?, " // autofill_migration_time | |
| 1054 "?, " // autofill_entries | |
| 1055 // _added_during_migration | |
| 1056 "?, " // autofill_profiles_added | |
| 1057 // _during_migration | |
| 963 "?);"); // notification_state | 1058 "?);"); // notification_state |
| 964 statement.bind_string(0, dir_name_); // id | 1059 statement.bind_string(0, dir_name_); // id |
| 965 statement.bind_string(1, dir_name_); // name | 1060 statement.bind_string(1, dir_name_); // name |
| 966 statement.bind_string(2, ""); // store_birthday | 1061 statement.bind_string(2, ""); // store_birthday |
| 967 statement.bind_string(3, SYNC_ENGINE_VERSION_STRING); // db_create_version | 1062 statement.bind_string(3, SYNC_ENGINE_VERSION_STRING); // db_create_version |
| 968 statement.bind_int(4, static_cast<int32>(time(0))); // db_create_time | 1063 statement.bind_int(4, static_cast<int32>(time(0))); // db_create_time |
| 969 statement.bind_string(5, GenerateCacheGUID()); // cache_guid | 1064 statement.bind_string(5, GenerateCacheGUID()); // cache_guid |
| 970 statement.bind_blob(6, NULL, 0); // notification_state | 1065 statement.bind_int(6, 0); // autofill_migration_state |
| 1066 statement.bind_int(7, 0); // autofill_migration_time | |
| 1067 statement.bind_int(8, 0); // bookmarks_added_during_autofill_migration | |
| 1068 statement.bind_int(9, 0); // autofill_entries_added_during_migration | |
| 1069 statement.bind_int(10, 0); // autofill_profiles_added_during_migration | |
| 1070 statement.bind_blob(11, NULL, 0); // notification_state | |
| 971 result = statement.step(); | 1071 result = statement.step(); |
| 972 } | 1072 } |
| 973 if (result != SQLITE_DONE) | 1073 if (result != SQLITE_DONE) |
| 974 return result; | 1074 return result; |
| 975 | 1075 |
| 976 result = CreateModelsTable(); | 1076 result = CreateModelsTable(); |
| 977 if (result != SQLITE_DONE) | 1077 if (result != SQLITE_DONE) |
| 978 return result; | 1078 return result; |
| 979 // Create the big metas table. | 1079 // Create the big metas table. |
| 980 result = CreateMetasTable(false); | 1080 result = CreateMetasTable(false); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1033 // This is the current schema for the ShareInfo table, from version 71 | 1133 // This is the current schema for the ShareInfo table, from version 71 |
| 1034 // onward. If you change the schema, you'll probably want to double-check | 1134 // onward. If you change the schema, you'll probably want to double-check |
| 1035 // the use of this function in the v70-v71 migration. | 1135 // the use of this function in the v70-v71 migration. |
| 1036 query.append(" (" | 1136 query.append(" (" |
| 1037 "id TEXT primary key, " | 1137 "id TEXT primary key, " |
| 1038 "name TEXT, " | 1138 "name TEXT, " |
| 1039 "store_birthday TEXT, " | 1139 "store_birthday TEXT, " |
| 1040 "db_create_version TEXT, " | 1140 "db_create_version TEXT, " |
| 1041 "db_create_time INT, " | 1141 "db_create_time INT, " |
| 1042 "next_id INT default -2, " | 1142 "next_id INT default -2, " |
| 1043 "cache_guid TEXT"); | 1143 "cache_guid TEXT, " |
| 1144 "autofill_migration_state INT default 0, " | |
| 1145 "bookmarks_added_during_autofill_migration INT default 0, " | |
| 1146 "autofill_migration_time INT default 0, " | |
| 1147 "autofill_entries_added_during_migration INT default 0, " | |
| 1148 "autofill_profiles_added_during_migration INT default 0 "); | |
| 1044 if (with_notification_state) { | 1149 if (with_notification_state) { |
| 1045 query.append(", notification_state BLOB"); | 1150 query.append(", notification_state BLOB"); |
| 1046 } | 1151 } |
| 1047 query.append(")"); | 1152 query.append(")"); |
| 1048 return ExecQuery(load_dbhandle_, query.c_str()); | 1153 return ExecQuery(load_dbhandle_, query.c_str()); |
| 1049 } | 1154 } |
| 1050 | 1155 |
| 1051 } // namespace syncable | 1156 } // namespace syncable |
| OLD | NEW |