Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8919)

Unified Diff: chrome/browser/webdata/web_database.cc

Issue 12518017: Generalize migration code in WebDatabase. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge to parent. Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/webdata/web_database.cc
diff --git a/chrome/browser/webdata/web_database.cc b/chrome/browser/webdata/web_database.cc
index c0111edf9966eb7325043e406e55f29c049d9984..9cb7f23f3724ba86456a057a59d86d177b8fa740 100644
--- a/chrome/browser/webdata/web_database.cc
+++ b/chrome/browser/webdata/web_database.cc
@@ -62,23 +62,23 @@ void WebDatabase::CommitTransaction() {
}
AutofillTable* WebDatabase::GetAutofillTable() {
- return autofill_table_.get();
+ return autofill_table_;
}
KeywordTable* WebDatabase::GetKeywordTable() {
- return keyword_table_.get();
+ return keyword_table_;
}
LoginsTable* WebDatabase::GetLoginsTable() {
- return logins_table_.get();
+ return logins_table_;
}
TokenServiceTable* WebDatabase::GetTokenServiceTable() {
- return token_service_table_.get();
+ return token_service_table_;
}
WebAppsTable* WebDatabase::GetWebAppsTable() {
- return web_apps_table_.get();
+ return web_apps_table_;
}
sql::Connection* WebDatabase::GetSQLConnection() {
@@ -123,23 +123,39 @@ sql::InitStatus WebDatabase::Init(const base::FilePath& db_name,
return sql::INIT_TOO_NEW;
}
+ // TODO(joi): Table creation should move out of this class; switch
+ // to a two-phase init to accomplish this.
+
// Create the tables.
- autofill_table_.reset(new AutofillTable(&db_, &meta_table_));
- keyword_table_.reset(new KeywordTable(&db_, &meta_table_));
+ autofill_table_ = new AutofillTable(&db_, &meta_table_);
+ tables_.push_back(autofill_table_);
+
+ keyword_table_ = new KeywordTable(&db_, &meta_table_);
+ tables_.push_back(keyword_table_);
+
// TODO(mdm): We only really need the LoginsTable on Windows for IE7 password
// access, but for now, we still create it on all platforms since it deletes
// the old logins table. We can remove this after a while, e.g. in M22 or so.
- logins_table_.reset(new LoginsTable(&db_, &meta_table_));
- token_service_table_.reset(new TokenServiceTable(&db_, &meta_table_));
- web_apps_table_.reset(new WebAppsTable(&db_, &meta_table_));
- web_intents_table_.reset(new WebIntentsTable(&db_, &meta_table_));
+ logins_table_ = new LoginsTable(&db_, &meta_table_);
+ tables_.push_back(logins_table_);
+
+ token_service_table_ = new TokenServiceTable(&db_, &meta_table_);
+ tables_.push_back(token_service_table_);
+
+ web_apps_table_ = new WebAppsTable(&db_, &meta_table_);
+ tables_.push_back(web_apps_table_);
+
+ web_intents_table_ = new WebIntentsTable(&db_, &meta_table_);
+ tables_.push_back(web_intents_table_);
// Initialize the tables.
- if (!keyword_table_->Init() || !autofill_table_->Init() ||
- !logins_table_->Init() || !web_apps_table_->Init() ||
- !token_service_table_->Init() || !web_intents_table_->Init()) {
- LOG(WARNING) << "Unable to initialize the web database.";
- return sql::INIT_FAILURE;
+ for (ScopedVector<WebDatabaseTable>::iterator it = tables_.begin();
+ it != tables_.end();
+ ++it) {
+ if (!(*it)->Init()) {
+ LOG(WARNING) << "Unable to initialize the web database.";
+ return sql::INIT_FAILURE;
+ }
}
// If the file on disk is an older database version, bring it up to date.
@@ -162,212 +178,40 @@ sql::InitStatus WebDatabase::MigrateOldVersionsAsNeeded(
if (current_version > meta_table_.GetVersionNumber())
ChangeVersion(&meta_table_, current_version, false);
- // Migrate if necessary.
- switch (current_version) {
+ if (current_version < 20) {
// Versions 1 - 19 are unhandled. Version numbers greater than
// kCurrentVersionNumber should have already been weeded out by the caller.
- default:
- // When the version is too old, we return failure error code. The schema
- // is too out of date to migrate.
- // There should not be a released product that makes a database too old to
- // migrate. If we do encounter such a legacy database, we will need a
- // better solution to handle it (i.e., pop up a dialog to tell the user,
- // erase all their prefs and start over, etc.).
- LOG(WARNING) << "Web database version " << current_version <<
- " is too old to handle.";
- NOTREACHED();
- return sql::INIT_FAILURE;
-
- case 20:
- if (!keyword_table_->MigrateToVersion21AutoGenerateKeywordColumn())
- return FailedMigrationTo(21);
-
- ChangeVersion(&meta_table_, 21, true);
- // FALL THROUGH
-
- case 21:
- if (!autofill_table_->ClearAutofillEmptyValueElements())
- return FailedMigrationTo(22);
-
- ChangeVersion(&meta_table_, 22, false);
- // FALL THROUGH
-
- case 22:
- if (!autofill_table_->MigrateToVersion23AddCardNumberEncryptedColumn())
- return FailedMigrationTo(23);
-
- ChangeVersion(&meta_table_, 23, false);
- // FALL THROUGH
-
- case 23:
- if (!autofill_table_->MigrateToVersion24CleanupOversizedStringFields())
- return FailedMigrationTo(24);
-
- ChangeVersion(&meta_table_, 24, false);
- // FALL THROUGH
-
- case 24:
- if (!keyword_table_->MigrateToVersion25AddLogoIDColumn())
- return FailedMigrationTo(25);
-
- ChangeVersion(&meta_table_, 25, true);
- // FALL THROUGH
-
- case 25:
- if (!keyword_table_->MigrateToVersion26AddCreatedByPolicyColumn())
- return FailedMigrationTo(26);
-
- ChangeVersion(&meta_table_, 26, true);
- // FALL THROUGH
-
- case 26:
- if (!autofill_table_->MigrateToVersion27UpdateLegacyCreditCards())
- return FailedMigrationTo(27);
-
- ChangeVersion(&meta_table_, 27, true);
- // FALL THROUGH
-
- case 27:
- if (!keyword_table_->MigrateToVersion28SupportsInstantColumn())
- return FailedMigrationTo(28);
-
- ChangeVersion(&meta_table_, 28, true);
- // FALL THROUGH
-
- case 28:
- if (!keyword_table_->MigrateToVersion29InstantURLToSupportsInstant())
- return FailedMigrationTo(29);
-
- ChangeVersion(&meta_table_, 29, true);
- // FALL THROUGH
-
- case 29:
- if (!autofill_table_->MigrateToVersion30AddDateModifed())
- return FailedMigrationTo(30);
-
- ChangeVersion(&meta_table_, 30, true);
- // FALL THROUGH
-
- case 30:
- if (!autofill_table_->MigrateToVersion31AddGUIDToCreditCardsAndProfiles())
- return FailedMigrationTo(31);
-
- ChangeVersion(&meta_table_, 31, true);
- // FALL THROUGH
-
- case 31:
- if (!autofill_table_->MigrateToVersion32UpdateProfilesAndCreditCards())
- return FailedMigrationTo(32);
-
- ChangeVersion(&meta_table_, 32, true);
- // FALL THROUGH
-
- case 32:
- if (!autofill_table_->MigrateToVersion33ProfilesBasedOnFirstName())
- return FailedMigrationTo(33);
-
- ChangeVersion(&meta_table_, 33, true);
- // FALL THROUGH
-
- case 33:
- if (!autofill_table_->MigrateToVersion34ProfilesBasedOnCountryCode(
- app_locale))
- return FailedMigrationTo(34);
-
- ChangeVersion(&meta_table_, 34, true);
- // FALL THROUGH
-
- case 34:
- if (!autofill_table_->MigrateToVersion35GreatBritainCountryCodes())
- return FailedMigrationTo(35);
-
- ChangeVersion(&meta_table_, 35, true);
- // FALL THROUGH
-
- // Combine migrations 35 and 36. This is due to enhancements to the merge
- // step when migrating profiles. The original migration from 35 to 36 did
- // not merge profiles with identical addresses, but the migration from 36 to
- // 37 does. The step from 35 to 36 should only happen on the Chrome 12 dev
- // channel. Chrome 12 beta and release users will jump from 35 to 37
- // directly getting the full benefits of the multi-valued merge as well as
- // the culling of bad data.
- case 35:
- case 36:
- if (!autofill_table_->MigrateToVersion37MergeAndCullOlderProfiles())
- return FailedMigrationTo(37);
-
- ChangeVersion(&meta_table_, 37, true);
- // FALL THROUGH
-
- case 37:
- if (!keyword_table_->MigrateToVersion38AddLastModifiedColumn())
- return FailedMigrationTo(38);
-
- ChangeVersion(&meta_table_, 38, true);
- // FALL THROUGH
-
- case 38:
- if (!keyword_table_->MigrateToVersion39AddSyncGUIDColumn())
- return FailedMigrationTo(39);
-
- ChangeVersion(&meta_table_, 39, true);
- // FALL THROUGH
-
- // Subsequent search engine backup migrations are merged into a single one.
- case 39:
- case 40:
- case 41:
- case 42:
- case 43:
- if (!keyword_table_->MigrateToVersion44AddDefaultSearchProviderBackup())
- return FailedMigrationTo(44);
-
- ChangeVersion(&meta_table_, 44, true);
- // FALL THROUGH
-
- case 44:
- if (!keyword_table_->
- MigrateToVersion45RemoveLogoIDAndAutogenerateColumns())
- return FailedMigrationTo(45);
-
- ChangeVersion(&meta_table_, 45, true);
- // FALL THROUGH
-
- case 45:
- if (!web_intents_table_->MigrateToVersion46AddSchemeColumn())
- return FailedMigrationTo(46);
-
- ChangeVersion(&meta_table_, 46, true);
- // FALL THROUGH
-
- case 46:
- if (!keyword_table_->MigrateToVersion47AddAlternateURLsColumn())
- return FailedMigrationTo(47);
-
- ChangeVersion(&meta_table_, 47, true);
- // FALL THROUGH
-
- case 47:
- if (!keyword_table_->MigrateToVersion48RemoveKeywordsBackup())
- return FailedMigrationTo(48);
-
- ChangeVersion(&meta_table_, 48, true);
- // FALL THROUGH
-
- case 48:
- if (!keyword_table_->
- MigrateToVersion49AddSearchTermsReplacementKeyColumn())
- return FailedMigrationTo(49);
+ //
+ // When the version is too old, we return failure error code. The schema
+ // is too out of date to migrate.
+ //
+ // There should not be a released product that makes a database too old to
+ // migrate. If we do encounter such a legacy database, we will need a
+ // better solution to handle it (i.e., pop up a dialog to tell the user,
+ // erase all their prefs and start over, etc.).
+ LOG(WARNING) << "Web database version " << current_version <<
+ " is too old to handle.";
+ NOTREACHED();
+ return sql::INIT_FAILURE;
+ }
- ChangeVersion(&meta_table_, 49, true);
- // FALL THROUGH
-
- // Add successive versions here. Each should set the version number and
- // compatible version number as appropriate, then fall through to the next
- // case.
-
- case kCurrentVersionNumber:
- // No migration needed.
- return sql::INIT_OK;
+ for (int next_version = current_version + 1;
+ next_version <= kCurrentVersionNumber;
+ ++next_version) {
+ // Give each table a chance to migrate to this version.
+ for (ScopedVector<WebDatabaseTable>::iterator it = tables_.begin();
+ it != tables_.end();
+ ++it) {
+ // Any of the tables may set this to true, but by default it is false.
+ bool update_compatible_version = false;
+ if (!(*it)->MigrateToVersion(next_version,
+ app_locale,
+ &update_compatible_version)) {
+ return FailedMigrationTo(next_version);
+ }
+
+ ChangeVersion(&meta_table_, next_version, update_compatible_version);
+ }
}
+ return sql::INIT_OK;
}

Powered by Google App Engine
This is Rietveld 408576698