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; |
} |