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

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

Issue 6677124: Move migration code out of WebDatabase and into table-specific classes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Nits from dhollowa Created 9 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
« no previous file with comments | « chrome/browser/webdata/keyword_table.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/webdata/web_database.cc
diff --git a/chrome/browser/webdata/web_database.cc b/chrome/browser/webdata/web_database.cc
index c3fe4d0e91beeabe24f7e206e50458440a28e6d4..6169be3ddfd2a5a31a4396308e4de56f76d44f31 100644
--- a/chrome/browser/webdata/web_database.cc
+++ b/chrome/browser/webdata/web_database.cc
@@ -5,24 +5,12 @@
#include "chrome/browser/webdata/web_database.h"
#include <algorithm>
-#include <limits>
-#include <set>
-#include <string>
#include "app/sql/statement.h"
#include "app/sql/transaction.h"
-#include "base/string_number_conversions.h"
-#include "chrome/browser/autofill/autofill_country.h"
-#include "chrome/browser/autofill/autofill_profile.h"
-#include "chrome/browser/autofill/autofill_type.h"
-#include "chrome/browser/autofill/personal_data_manager.h"
#include "chrome/browser/diagnostics/sqlite_diagnostics.h"
-#include "chrome/browser/webdata/autofill_util.h"
-#include "chrome/common/guid.h"
#include "content/common/notification_service.h"
-using base::Time;
-
namespace {
// Current version number. Note: when changing the current version number,
@@ -31,14 +19,28 @@ namespace {
const int kCurrentVersionNumber = 36;
const int kCompatibleVersionNumber = 36;
-// TODO(dhollowa): Find a common place for this. It is duplicated in
-// personal_data_manager.cc.
-template<typename T>
-T* address_of(T& v) {
- return &v;
+// Change the version number and possibly the compatibility version of
+// |meta_table_|.
+void ChangeVersion(sql::MetaTable* meta_table,
+ int version_num,
+ bool update_compatible_version_num) {
+ meta_table->SetVersionNumber(version_num);
+ if (update_compatible_version_num) {
+ meta_table->SetCompatibleVersionNumber(
+ std::min(version_num, kCompatibleVersionNumber));
+ }
+}
+
+// Outputs the failed version number as a warning and always returns
+// |sql::INIT_FAILURE|.
+sql::InitStatus FailedMigrationTo(int version_num) {
+ LOG(WARNING) << "Unable to update web database to version "
+ << version_num << ".";
+ NOTREACHED();
+ return sql::INIT_FAILURE;
}
-} // anonymous namespace
+} // namespace
WebDatabase::WebDatabase() {}
@@ -158,926 +160,115 @@ sql::InitStatus WebDatabase::MigrateOldVersionsAsNeeded() {
return sql::INIT_FAILURE;
case 20:
- // Add the autogenerate_keyword column.
- if (!db_.Execute("ALTER TABLE keywords ADD COLUMN autogenerate_keyword "
- "INTEGER DEFAULT 0")) {
- LOG(WARNING) << "Unable to update web database to version 21.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- meta_table_.SetVersionNumber(21);
- meta_table_.SetCompatibleVersionNumber(
- std::min(21, kCompatibleVersionNumber));
+ if (!keyword_table_->MigrateToVersion21AutoGenerateKeywordColumn())
+ return FailedMigrationTo(21);
+
+ ChangeVersion(&meta_table_, 21, true);
// FALL THROUGH
case 21:
- if (!autofill_table_->ClearAutofillEmptyValueElements()) {
- LOG(WARNING) << "Failed to clean-up autofill DB.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- meta_table_.SetVersionNumber(22);
- // No change in the compatibility version number.
+ if (!autofill_table_->ClearAutofillEmptyValueElements())
+ return FailedMigrationTo(22);
+ ChangeVersion(&meta_table_, 22, false);
// FALL THROUGH
case 22:
- // Add the card_number_encrypted column if credit card table was not
- // created in this build (otherwise the column already exists).
- // WARNING: Do not change the order of the execution of the SQL
- // statements in this case! Profile corruption and data migration
- // issues WILL OCCUR. (see http://crbug.com/10913)
- //
- // The problem is that if a user has a profile which was created before
- // r37036, when the credit_cards table was added, and then failed to
- // update this profile between the credit card addition and the addition
- // of the "encrypted" columns (44963), the next data migration will put
- // the user's profile in an incoherent state: The user will update from
- // a data profile set to be earlier than 22, and therefore pass through
- // this update case. But because the user did not have a credit_cards
- // table before starting Chrome, it will have just been initialized
- // above, and so already have these columns -- and thus this data
- // update step will have failed.
- //
- // The false assumption in this case is that at this step in the
- // migration, the user has a credit card table, and that this
- // table does not include encrypted columns!
- // Because this case does not roll back the complete set of SQL
- // transactions properly in case of failure (that is, it does not
- // roll back the table initialization done above), the incoherent
- // profile will now see itself as being at version 22 -- but include a
- // fully initialized credit_cards table. Every time Chrome runs, it
- // will try to update the web database and fail at this step, unless
- // we allow for the faulty assumption described above by checking for
- // the existence of the columns only AFTER we've executed the commands
- // to add them.
- if (!db_.DoesColumnExist("credit_cards", "card_number_encrypted")) {
- if (!db_.Execute("ALTER TABLE credit_cards ADD COLUMN "
- "card_number_encrypted BLOB DEFAULT NULL")) {
- LOG(WARNING) << "Could not add card_number_encrypted to "
- "credit_cards table.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
-
- if (!db_.DoesColumnExist("credit_cards", "verification_code_encrypted")) {
- if (!db_.Execute("ALTER TABLE credit_cards ADD COLUMN "
- "verification_code_encrypted BLOB DEFAULT NULL")) {
- LOG(WARNING) << "Could not add verification_code_encrypted to "
- "credit_cards table.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
- meta_table_.SetVersionNumber(23);
+ if (!autofill_table_->MigrateToVersion23AddCardNumberEncryptedColumn())
+ return FailedMigrationTo(23);
+
+ ChangeVersion(&meta_table_, 23, false);
// FALL THROUGH
- case 23: {
- // One-time cleanup for Chromium bug 38364. In the presence of
- // multi-byte UTF-8 characters, that bug could cause Autofill strings
- // to grow larger and more corrupt with each save. The cleanup removes
- // any row with a string field larger than a reasonable size. The string
- // fields examined here are precisely the ones that were subject to
- // corruption by the original bug.
- const std::string autofill_is_too_big =
- "max(length(name), length(value)) > 500";
-
- const std::string credit_cards_is_too_big =
- "max(length(label), length(name_on_card), length(type), "
- " length(expiration_month), length(expiration_year), "
- " length(billing_address), length(shipping_address) "
- ") > 500";
-
- const std::string autofill_profiles_is_too_big =
- "max(length(label), length(first_name), "
- " length(middle_name), length(last_name), length(email), "
- " length(company_name), length(address_line_1), "
- " length(address_line_2), length(city), length(state), "
- " length(zipcode), length(country), length(phone), "
- " length(fax)) > 500";
-
- std::string query = "DELETE FROM autofill_dates WHERE pair_id IN ("
- "SELECT pair_id FROM autofill WHERE " + autofill_is_too_big + ")";
- if (!db_.Execute(query.c_str())) {
- LOG(WARNING) << "Unable to update web database to version 24.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- query = "DELETE FROM autofill WHERE " + autofill_is_too_big;
- if (!db_.Execute(query.c_str())) {
- LOG(WARNING) << "Unable to update web database to version 24.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- // Only delete from legacy credit card tables where specific columns
- // exist.
- if (db_.DoesColumnExist("credit_cards", "label") &&
- db_.DoesColumnExist("credit_cards", "name_on_card") &&
- db_.DoesColumnExist("credit_cards", "type") &&
- db_.DoesColumnExist("credit_cards", "expiration_month") &&
- db_.DoesColumnExist("credit_cards", "expiration_year") &&
- db_.DoesColumnExist("credit_cards", "billing_address") &&
- db_.DoesColumnExist("credit_cards", "shipping_address") &&
- db_.DoesColumnExist("autofill_profiles", "label")) {
- query = "DELETE FROM credit_cards WHERE (" + credit_cards_is_too_big +
- ") OR label IN (SELECT label FROM autofill_profiles WHERE " +
- autofill_profiles_is_too_big + ")";
- if (!db_.Execute(query.c_str())) {
- LOG(WARNING) << "Unable to update web database to version 24.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
- if (db_.DoesColumnExist("autofill_profiles", "label")) {
- query = "DELETE FROM autofill_profiles WHERE " +
- autofill_profiles_is_too_big;
- if (!db_.Execute(query.c_str())) {
- LOG(WARNING) << "Unable to update web database to version 24.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
-
- meta_table_.SetVersionNumber(24);
+ case 23:
+ if (!autofill_table_->MigrateToVersion24CleanupOversizedStringFields())
+ return FailedMigrationTo(24);
+ ChangeVersion(&meta_table_, 24, false);
// FALL THROUGH
- }
case 24:
- // Add the logo_id column if keyword table was not created in this build.
- if (!db_.Execute("ALTER TABLE keywords ADD COLUMN logo_id "
- "INTEGER DEFAULT 0")) {
- LOG(WARNING) << "Unable to update web database to version 25.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- meta_table_.SetVersionNumber(25);
- meta_table_.SetCompatibleVersionNumber(
- std::min(25, kCompatibleVersionNumber));
+ if (!keyword_table_->MigrateToVersion25AddLogoIDColumn())
+ return FailedMigrationTo(25);
+
+ ChangeVersion(&meta_table_, 25, true);
// FALL THROUGH
case 25:
- // Add the created_by_policy column.
- if (!db_.Execute("ALTER TABLE keywords ADD COLUMN created_by_policy "
- "INTEGER DEFAULT 0")) {
- LOG(WARNING) << "Unable to update web database to version 26.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- meta_table_.SetVersionNumber(26);
- meta_table_.SetCompatibleVersionNumber(
- std::min(26, kCompatibleVersionNumber));
+ if (!keyword_table_->MigrateToVersion26AddCreatedByPolicyColumn())
+ return FailedMigrationTo(26);
+
+ ChangeVersion(&meta_table_, 26, true);
// FALL THROUGH
- case 26: {
- // Only migrate from legacy credit card tables where specific columns
- // exist.
- if (db_.DoesColumnExist("credit_cards", "unique_id") &&
- db_.DoesColumnExist("credit_cards", "billing_address") &&
- db_.DoesColumnExist("autofill_profiles", "unique_id")) {
- // Change the credit_cards.billing_address column from a string to an
- // int. The stored string is the label of an address, so we have to
- // select the unique ID of this address using the label as a foreign
- // key into the |autofill_profiles| table.
- std::string stmt =
- "SELECT credit_cards.unique_id, autofill_profiles.unique_id "
- "FROM autofill_profiles, credit_cards "
- "WHERE credit_cards.billing_address = autofill_profiles.label";
- sql::Statement s(db_.GetUniqueStatement(stmt.c_str()));
- if (!s) {
- LOG(WARNING) << "Statement prepare failed";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- std::map<int, int> cc_billing_map;
- while (s.Step())
- cc_billing_map[s.ColumnInt(0)] = s.ColumnInt(1);
-
- // Windows already stores the IDs as strings in |billing_address|. Try
- // to convert those.
- if (cc_billing_map.empty()) {
- std::string stmt =
- "SELECT unique_id,billing_address FROM credit_cards";
- sql::Statement s(db_.GetUniqueStatement(stmt.c_str()));
- if (!s) {
- LOG(WARNING) << "Statement prepare failed";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- while (s.Step()) {
- int id = 0;
- if (base::StringToInt(s.ColumnString(1), &id))
- cc_billing_map[s.ColumnInt(0)] = id;
- }
- }
-
- if (!db_.Execute("CREATE TABLE credit_cards_temp ( "
- "label VARCHAR, "
- "unique_id INTEGER PRIMARY KEY, "
- "name_on_card VARCHAR, "
- "type VARCHAR, "
- "card_number VARCHAR, "
- "expiration_month INTEGER, "
- "expiration_year INTEGER, "
- "verification_code VARCHAR, "
- "billing_address INTEGER, "
- "shipping_address VARCHAR, "
- "card_number_encrypted BLOB, "
- "verification_code_encrypted BLOB)")) {
- LOG(WARNING) << "Unable to update web database to version 27.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute(
- "INSERT INTO credit_cards_temp "
- "SELECT label,unique_id,name_on_card,type,card_number,"
- "expiration_month,expiration_year,verification_code,0,"
- "shipping_address,card_number_encrypted,"
- "verification_code_encrypted FROM credit_cards")) {
- LOG(WARNING) << "Unable to update web database to version 27.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute("DROP TABLE credit_cards")) {
- LOG(WARNING) << "Unable to update web database to version 27.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute(
- "ALTER TABLE credit_cards_temp RENAME TO credit_cards")) {
- LOG(WARNING) << "Unable to update web database to version 27.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- for (std::map<int, int>::const_iterator iter = cc_billing_map.begin();
- iter != cc_billing_map.end(); ++iter) {
- sql::Statement s(db_.GetCachedStatement(
- SQL_FROM_HERE,
- "UPDATE credit_cards SET billing_address=? WHERE unique_id=?"));
- if (!s) {
- LOG(WARNING) << "Statement prepare failed";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- s.BindInt(0, (*iter).second);
- s.BindInt(1, (*iter).first);
-
- if (!s.Run()) {
- LOG(WARNING) << "Unable to update web database to version 27.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
- }
-
- meta_table_.SetVersionNumber(27);
- meta_table_.SetCompatibleVersionNumber(
- std::min(27, kCompatibleVersionNumber));
+ case 26:
+ if (!autofill_table_->MigrateToVersion27UpdateLegacyCreditCards())
+ return FailedMigrationTo(27);
+ ChangeVersion(&meta_table_, 27, true);
// FALL THROUGH
- }
case 27:
- // Add supports_instant to keywords.
- if (!db_.Execute("ALTER TABLE keywords ADD COLUMN supports_instant "
- "INTEGER DEFAULT 0")) {
- LOG(WARNING) << "Unable to update web database to version 28.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- meta_table_.SetVersionNumber(28);
- meta_table_.SetCompatibleVersionNumber(
- std::min(28, kCompatibleVersionNumber));
+ if (!keyword_table_->MigrateToVersion28SupportsInstantColumn())
+ return FailedMigrationTo(28);
+ ChangeVersion(&meta_table_, 28, true);
// FALL THROUGH
case 28:
- // Keywords loses the column supports_instant and gets instant_url.
- if (!db_.Execute("ALTER TABLE keywords ADD COLUMN instant_url "
- "VARCHAR")) {
- LOG(WARNING) << "Unable to update web database to version 29.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- if (!db_.Execute("CREATE TABLE keywords_temp ("
- "id INTEGER PRIMARY KEY,"
- "short_name VARCHAR NOT NULL,"
- "keyword VARCHAR NOT NULL,"
- "favicon_url VARCHAR NOT NULL,"
- "url VARCHAR NOT NULL,"
- "show_in_default_list INTEGER,"
- "safe_for_autoreplace INTEGER,"
- "originating_url VARCHAR,"
- "date_created INTEGER DEFAULT 0,"
- "usage_count INTEGER DEFAULT 0,"
- "input_encodings VARCHAR,"
- "suggest_url VARCHAR,"
- "prepopulate_id INTEGER DEFAULT 0,"
- "autogenerate_keyword INTEGER DEFAULT 0,"
- "logo_id INTEGER DEFAULT 0,"
- "created_by_policy INTEGER DEFAULT 0,"
- "instant_url VARCHAR)")) {
- LOG(WARNING) << "Unable to update web database to version 29.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute(
- "INSERT INTO keywords_temp "
- "SELECT id, short_name, keyword, favicon_url, url, "
- "show_in_default_list, safe_for_autoreplace, originating_url, "
- "date_created, usage_count, input_encodings, suggest_url, "
- "prepopulate_id, autogenerate_keyword, logo_id, created_by_policy, "
- "instant_url FROM keywords")) {
- LOG(WARNING) << "Unable to update web database to version 29.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute("DROP TABLE keywords")) {
- LOG(WARNING) << "Unable to update web database to version 29.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute(
- "ALTER TABLE keywords_temp RENAME TO keywords")) {
- LOG(WARNING) << "Unable to update web database to version 29.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- meta_table_.SetVersionNumber(29);
- meta_table_.SetCompatibleVersionNumber(
- std::min(29, kCompatibleVersionNumber));
+ if (!keyword_table_->MigrateToVersion29InstantUrlToSupportsInstant())
+ return FailedMigrationTo(29);
+ ChangeVersion(&meta_table_, 29, true);
// FALL THROUGH
case 29:
- // Add date_modified to autofill_profiles.
- if (!db_.DoesColumnExist("autofill_profiles", "date_modified")) {
- if (!db_.Execute("ALTER TABLE autofill_profiles ADD COLUMN "
- "date_modified INTEGER NON NULL DEFAULT 0")) {
- LOG(WARNING) << "Unable to update web database to version 30";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- sql::Statement s(db_.GetUniqueStatement(
- "UPDATE autofill_profiles SET date_modified=?"));
- if (!s) {
- LOG(WARNING) << "Unable to update web database to version 30.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- s.BindInt64(0, Time::Now().ToTimeT());
-
- if (!s.Run()) {
- LOG(WARNING) << "Unable to update web database to version 30.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- }
-
- // Add date_modified to credit_cards.
- if (!db_.DoesColumnExist("credit_cards", "date_modified")) {
- if (!db_.Execute("ALTER TABLE credit_cards ADD COLUMN "
- "date_modified INTEGER NON NULL DEFAULT 0")) {
- LOG(WARNING) << "Unable to update web database to version 30";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- sql::Statement s(db_.GetUniqueStatement(
- "UPDATE credit_cards SET date_modified=?"));
- if (!s) {
- LOG(WARNING) << "Unable to update web database to version 30.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- s.BindInt64(0, Time::Now().ToTimeT());
-
- if (!s.Run()) {
- LOG(WARNING) << "Unable to update web database to version 30.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
-
- meta_table_.SetVersionNumber(30);
- meta_table_.SetCompatibleVersionNumber(
- std::min(30, kCompatibleVersionNumber));
+ if (!autofill_table_->MigrateToVersion30AddDateModifed())
+ return FailedMigrationTo(30);
+ ChangeVersion(&meta_table_, 30, true);
// FALL THROUGH
case 30:
- // Add |guid| column to |autofill_profiles| table.
- // Note that we need to check for the guid column's existence due to the
- // fact that for a version 22 database the |autofill_profiles| table
- // gets created fresh with |InitAutofillProfilesTable|.
- if (!db_.DoesColumnExist("autofill_profiles", "guid")) {
- if (!db_.Execute("ALTER TABLE autofill_profiles ADD COLUMN "
- "guid VARCHAR NOT NULL DEFAULT \"\"")) {
- LOG(WARNING) << "Unable to update web database to version 30.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- // Set all the |guid| fields to valid values.
- {
- sql::Statement s(db_.GetUniqueStatement("SELECT unique_id "
- "FROM autofill_profiles"));
-
- if (!s) {
- LOG(WARNING) << "Unable to update web database to version 30.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- while (s.Step()) {
- sql::Statement update_s(
- db_.GetUniqueStatement("UPDATE autofill_profiles "
- "SET guid=? WHERE unique_id=?"));
- if (!update_s) {
- LOG(WARNING) << "Unable to update web database to version 30.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- update_s.BindString(0, guid::GenerateGUID());
- update_s.BindInt(1, s.ColumnInt(0));
-
- if (!update_s.Run()) {
- LOG(WARNING) << "Unable to update web database to version 30.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
- }
- }
-
- // Add |guid| column to |credit_cards| table.
- // Note that we need to check for the guid column's existence due to the
- // fact that for a version 22 database the |autofill_profiles| table
- // gets created fresh with |InitAutofillProfilesTable|.
- if (!db_.DoesColumnExist("credit_cards", "guid")) {
- if (!db_.Execute("ALTER TABLE credit_cards ADD COLUMN "
- "guid VARCHAR NOT NULL DEFAULT \"\"")) {
- LOG(WARNING) << "Unable to update web database to version 30.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- // Set all the |guid| fields to valid values.
- {
- sql::Statement s(db_.GetUniqueStatement("SELECT unique_id "
- "FROM credit_cards"));
- if (!s) {
- LOG(WARNING) << "Unable to update web database to version 30.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- while (s.Step()) {
- sql::Statement update_s(
- db_.GetUniqueStatement("UPDATE credit_cards "
- "set guid=? WHERE unique_id=?"));
- if (!update_s) {
- LOG(WARNING) << "Unable to update web database to version 30.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- update_s.BindString(0, guid::GenerateGUID());
- update_s.BindInt(1, s.ColumnInt(0));
-
- if (!update_s.Run()) {
- LOG(WARNING) << "Unable to update web database to version 30.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
- }
- }
-
- meta_table_.SetVersionNumber(31);
- meta_table_.SetCompatibleVersionNumber(
- std::min(31, kCompatibleVersionNumber));
+ if (!autofill_table_->MigrateToVersion31AddGUIDToCreditCardsAndProfiles())
+ return FailedMigrationTo(31);
+ ChangeVersion(&meta_table_, 31, true);
// FALL THROUGH
case 31:
- if (db_.DoesColumnExist("autofill_profiles", "unique_id")) {
- if (!db_.Execute("CREATE TABLE autofill_profiles_temp ( "
- "guid VARCHAR PRIMARY KEY, "
- "label VARCHAR, "
- "first_name VARCHAR, "
- "middle_name VARCHAR, "
- "last_name VARCHAR, "
- "email VARCHAR, "
- "company_name VARCHAR, "
- "address_line_1 VARCHAR, "
- "address_line_2 VARCHAR, "
- "city VARCHAR, "
- "state VARCHAR, "
- "zipcode VARCHAR, "
- "country VARCHAR, "
- "phone VARCHAR, "
- "fax VARCHAR, "
- "date_modified INTEGER NOT NULL DEFAULT 0)")) {
- LOG(WARNING) << "Unable to update web database to version 32.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute(
- "INSERT INTO autofill_profiles_temp "
- "SELECT guid, label, first_name, middle_name, last_name, email, "
- "company_name, address_line_1, address_line_2, city, state, "
- "zipcode, country, phone, fax, date_modified "
- "FROM autofill_profiles")) {
- LOG(WARNING) << "Unable to update web database to version 32.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute("DROP TABLE autofill_profiles")) {
- LOG(WARNING) << "Unable to update web database to version 32.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute(
- "ALTER TABLE autofill_profiles_temp RENAME TO autofill_profiles")) {
- LOG(WARNING) << "Unable to update web database to version 32.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
-
- if (db_.DoesColumnExist("credit_cards", "unique_id")) {
- if (!db_.Execute("CREATE TABLE credit_cards_temp ( "
- "guid VARCHAR PRIMARY KEY, "
- "label VARCHAR, "
- "name_on_card VARCHAR, "
- "expiration_month INTEGER, "
- "expiration_year INTEGER, "
- "card_number_encrypted BLOB, "
- "date_modified INTEGER NOT NULL DEFAULT 0)")) {
- LOG(WARNING) << "Unable to update web database to version 32.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute(
- "INSERT INTO credit_cards_temp "
- "SELECT guid, label, name_on_card, expiration_month, "
- "expiration_year, card_number_encrypted, date_modified "
- "FROM credit_cards")) {
- LOG(WARNING) << "Unable to update web database to version 32.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute("DROP TABLE credit_cards")) {
- LOG(WARNING) << "Unable to update web database to version 32.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute(
- "ALTER TABLE credit_cards_temp RENAME TO credit_cards")) {
- LOG(WARNING) << "Unable to update web database to version 32.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
-
- meta_table_.SetVersionNumber(32);
- meta_table_.SetCompatibleVersionNumber(
- std::min(32, kCompatibleVersionNumber));
+ if (!autofill_table_->MigrateToVersion32UpdateProfilesAndCreditCards())
+ return FailedMigrationTo(32);
+ ChangeVersion(&meta_table_, 32, true);
// FALL THROUGH
case 32:
- // Test the existence of the |first_name| column as an indication that
- // we need a migration. It is possible that the new |autofill_profiles|
- // schema is in place because the table was newly created when migrating
- // from a pre-version-22 database.
- if (db_.DoesColumnExist("autofill_profiles", "first_name")) {
- // Create autofill_profiles_temp table that will receive the data.
- if (!db_.DoesTableExist("autofill_profiles_temp")) {
- if (!db_.Execute("CREATE TABLE autofill_profiles_temp ( "
- "guid VARCHAR PRIMARY KEY, "
- "company_name VARCHAR, "
- "address_line_1 VARCHAR, "
- "address_line_2 VARCHAR, "
- "city VARCHAR, "
- "state VARCHAR, "
- "zipcode VARCHAR, "
- "country VARCHAR, "
- "date_modified INTEGER NOT NULL DEFAULT 0)")) {
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
-
- {
- sql::Statement s(db_.GetUniqueStatement(
- "SELECT guid, first_name, middle_name, last_name, email, "
- "company_name, address_line_1, address_line_2, city, state, "
- "zipcode, country, phone, fax, date_modified "
- "FROM autofill_profiles"));
- while (s.Step()) {
- AutofillProfile profile;
- profile.set_guid(s.ColumnString(0));
- DCHECK(guid::IsValidGUID(profile.guid()));
-
- profile.SetInfo(NAME_FIRST, s.ColumnString16(1));
- profile.SetInfo(NAME_MIDDLE, s.ColumnString16(2));
- profile.SetInfo(NAME_LAST, s.ColumnString16(3));
- profile.SetInfo(EMAIL_ADDRESS, s.ColumnString16(4));
- profile.SetInfo(COMPANY_NAME, s.ColumnString16(5));
- profile.SetInfo(ADDRESS_HOME_LINE1, s.ColumnString16(6));
- profile.SetInfo(ADDRESS_HOME_LINE2, s.ColumnString16(7));
- profile.SetInfo(ADDRESS_HOME_CITY, s.ColumnString16(8));
- profile.SetInfo(ADDRESS_HOME_STATE, s.ColumnString16(9));
- profile.SetInfo(ADDRESS_HOME_ZIP, s.ColumnString16(10));
- profile.SetInfo(ADDRESS_HOME_COUNTRY, s.ColumnString16(11));
- profile.SetInfo(PHONE_HOME_WHOLE_NUMBER, s.ColumnString16(12));
- profile.SetInfo(PHONE_FAX_WHOLE_NUMBER, s.ColumnString16(13));
- int64 date_modified = s.ColumnInt64(14);
-
- sql::Statement s_insert(db_.GetUniqueStatement(
- "INSERT INTO autofill_profiles_temp"
- "(guid, company_name, address_line_1, address_line_2, city,"
- " state, zipcode, country, date_modified)"
- "VALUES (?,?,?,?,?,?,?,?,?)"));
- if (!s) {
- LOG(WARNING) << "Unable to update web database to version 33.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- s_insert.BindString(0, profile.guid());
- s_insert.BindString16(1, profile.GetInfo(COMPANY_NAME));
- s_insert.BindString16(2, profile.GetInfo(ADDRESS_HOME_LINE1));
- s_insert.BindString16(3, profile.GetInfo(ADDRESS_HOME_LINE2));
- s_insert.BindString16(4, profile.GetInfo(ADDRESS_HOME_CITY));
- s_insert.BindString16(5, profile.GetInfo(ADDRESS_HOME_STATE));
- s_insert.BindString16(6, profile.GetInfo(ADDRESS_HOME_ZIP));
- s_insert.BindString16(7, profile.GetInfo(ADDRESS_HOME_COUNTRY));
- s_insert.BindInt64(8, date_modified);
-
- if (!s_insert.Run()) {
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- // Add the other bits: names, emails, and phone/fax.
- if (!autofill_util::AddAutofillProfilePieces(profile, &db_)) {
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
- }
-
- if (!db_.Execute("DROP TABLE autofill_profiles")) {
- LOG(WARNING) << "Unable to update web database to version 33.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute(
- "ALTER TABLE autofill_profiles_temp RENAME TO autofill_profiles")) {
- LOG(WARNING) << "Unable to update web database to version 33.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
-
- // Remove the labels column from the credit_cards table.
- if (db_.DoesColumnExist("credit_cards", "label")) {
- if (!db_.Execute("CREATE TABLE credit_cards_temp ( "
- "guid VARCHAR PRIMARY KEY, "
- "name_on_card VARCHAR, "
- "expiration_month INTEGER, "
- "expiration_year INTEGER, "
- "card_number_encrypted BLOB, "
- "date_modified INTEGER NOT NULL DEFAULT 0)")) {
- LOG(WARNING) << "Unable to update web database to version 33.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute(
- "INSERT INTO credit_cards_temp "
- "SELECT guid, name_on_card, expiration_month, "
- "expiration_year, card_number_encrypted, date_modified "
- "FROM credit_cards")) {
- LOG(WARNING) << "Unable to update web database to version 33.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute("DROP TABLE credit_cards")) {
- LOG(WARNING) << "Unable to update web database to version 33.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- if (!db_.Execute(
- "ALTER TABLE credit_cards_temp RENAME TO credit_cards")) {
- LOG(WARNING) << "Unable to update web database to version 33.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
-
- meta_table_.SetVersionNumber(33);
- meta_table_.SetCompatibleVersionNumber(
- std::min(33, kCompatibleVersionNumber));
+ if (!autofill_table_->MigrateToVersion33ProfilesBasedOnFirstName())
+ return FailedMigrationTo(33);
+ ChangeVersion(&meta_table_, 33, true);
// FALL THROUGH
case 33:
- // Test the existence of the |country_code| column as an indication that
- // we need a migration. It is possible that the new |autofill_profiles|
- // schema is in place because the table was newly created when migrating
- // from a pre-version-22 database.
- if (!db_.DoesColumnExist("autofill_profiles", "country_code")) {
- if (!db_.Execute("ALTER TABLE autofill_profiles ADD COLUMN "
- "country_code VARCHAR")) {
- LOG(WARNING) << "Unable to update web database to version 33.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- // Set all the |country_code| fields to match existing |country| values.
- {
- sql::Statement s(db_.GetUniqueStatement("SELECT guid, country "
- "FROM autofill_profiles"));
-
- if (!s) {
- LOG(WARNING) << "Unable to update web database to version 33.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- while (s.Step()) {
- sql::Statement update_s(
- db_.GetUniqueStatement("UPDATE autofill_profiles "
- "SET country_code=? WHERE guid=?"));
- if (!update_s) {
- LOG(WARNING) << "Unable to update web database to version 33.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- string16 country = s.ColumnString16(1);
- std::string app_locale = AutofillCountry::ApplicationLocale();
- update_s.BindString(0, AutofillCountry::GetCountryCode(country,
- app_locale));
- update_s.BindString(1, s.ColumnString(0));
-
- if (!update_s.Run()) {
- LOG(WARNING) << "Unable to update web database to version 33.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
- }
- }
-
- meta_table_.SetVersionNumber(34);
- meta_table_.SetCompatibleVersionNumber(
- std::min(34, kCompatibleVersionNumber));
+ if (!autofill_table_->MigrateToVersion34ProfilesBasedOnCountryCode())
+ return FailedMigrationTo(34);
+ ChangeVersion(&meta_table_, 34, true);
// FALL THROUGH
case 34:
- // Correct all country codes with value "UK" to be "GB". This data
- // was mistakenly introduced in build 686.0. This migration is to clean
- // it up. See http://crbug.com/74511 for details.
- {
- sql::Statement s(db_.GetUniqueStatement(
- "UPDATE autofill_profiles SET country_code=\"GB\" "
- "WHERE country_code=\"UK\""));
-
- if (!s.Run()) {
- LOG(WARNING) << "Unable to update web database to version 35.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
-
- meta_table_.SetVersionNumber(35);
- meta_table_.SetCompatibleVersionNumber(
- std::min(35, kCompatibleVersionNumber));
+ if (!autofill_table_->MigrateToVersion35GreatBritainCountryCodes())
+ return FailedMigrationTo(35);
+ ChangeVersion(&meta_table_, 35, true);
// FALL THROUGH
case 35:
- // Merge and cull older profiles where possible.
- {
- sql::Statement s(db_.GetUniqueStatement(
- "SELECT guid, date_modified "
- "FROM autofill_profiles"));
- if (!s) {
- NOTREACHED() << "Statement prepare failed";
- return sql::INIT_FAILURE;
- }
-
- // Accumulate the good profiles.
- std::vector<AutofillProfile> accumulated_profiles;
- std::vector<AutofillProfile*> accumulated_profiles_p;
- std::map<std::string, int64> modification_map;
- while (s.Step()) {
- std::string guid = s.ColumnString(0);
- int64 date_modified = s.ColumnInt64(1);
- modification_map.insert(
- std::pair<std::string, int64>(guid, date_modified));
- AutofillProfile* profile = NULL;
- if (!autofill_table_->GetAutofillProfile(guid, &profile)) {
- NOTREACHED() << "Bad read of profile.";
- return sql::INIT_FAILURE;
- }
- scoped_ptr<AutofillProfile> p(profile);
-
- if (PersonalDataManager::IsValidLearnableProfile(*p)) {
- std::vector<AutofillProfile> merged_profiles;
- bool merged = PersonalDataManager::MergeProfile(
- *p, accumulated_profiles_p, &merged_profiles);
-
- std::swap(accumulated_profiles, merged_profiles);
-
- accumulated_profiles_p.clear();
- accumulated_profiles_p.resize(accumulated_profiles.size());
- std::transform(accumulated_profiles.begin(),
- accumulated_profiles.end(),
- accumulated_profiles_p.begin(),
- address_of<AutofillProfile>);
-
- // If the profile got merged trash the original.
- if (merged)
- autofill_table_->AddAutofillGUIDToTrash(p->guid());
- } else {
- // An invalid profile, so trash it.
- autofill_table_->AddAutofillGUIDToTrash(p->guid());
- }
- }
-
- // Drop the current profiles.
- if (!autofill_table_->ClearAutofillProfiles()) {
- LOG(WARNING) << "Unable to update web database to version 36.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- // Add the newly merged profiles back in.
- for (std::vector<AutofillProfile>::const_iterator
- iter = accumulated_profiles.begin();
- iter != accumulated_profiles.end();
- ++iter) {
- if (!autofill_table_->AddAutofillProfile(*iter)) {
- LOG(WARNING) << "Unable to update web database to version 36.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
-
- // Fix up the original modification date.
- std::map<std::string, int64>::const_iterator date_item =
- modification_map.find(iter->guid());
- if (date_item == modification_map.end()) {
- LOG(WARNING) << "Unable to update web database to version 36.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- sql::Statement s_date(db_.GetUniqueStatement(
- "UPDATE autofill_profiles SET date_modified=? "
- "WHERE guid=?"));
- s_date.BindInt64(0, date_item->second);
- s_date.BindString(1, iter->guid());
- if (!s_date.Run()) {
- LOG(WARNING) << "Unable to update web database to version 36.";
- NOTREACHED();
- return sql::INIT_FAILURE;
- }
- }
- }
-
- meta_table_.SetVersionNumber(36);
- meta_table_.SetCompatibleVersionNumber(
- std::min(36, kCompatibleVersionNumber));
+ if (!autofill_table_->MigrateToVersion36MergeAndCullOlderProfiles())
+ return FailedMigrationTo(36);
+ ChangeVersion(&meta_table_, 36, true);
// FALL THROUGH
// Add successive versions here. Each should set the version number and
« no previous file with comments | « chrome/browser/webdata/keyword_table.cc ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698