| Index: chrome/browser/webdata/web_database.cc
|
| diff --git a/chrome/browser/webdata/web_database.cc b/chrome/browser/webdata/web_database.cc
|
| index d97698abfff7e9c01b54cdfe7e4ff0c6d53511d7..5fc9e8647af15b0279d22f879bec799bb8d05b2f 100644
|
| --- a/chrome/browser/webdata/web_database.cc
|
| +++ b/chrome/browser/webdata/web_database.cc
|
| @@ -16,6 +16,7 @@
|
| #include "base/string_util.h"
|
| #include "base/tuple.h"
|
| #include "base/utf_string_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/credit_card.h"
|
| @@ -123,7 +124,9 @@ using webkit_glue::PasswordForm;
|
| // city
|
| // state
|
| // zipcode
|
| -// country
|
| +// country The country name. Deprecated, should be removed once
|
| +// the stable channel reaches version 11.
|
| +// country_code
|
| // phone
|
| // fax
|
| // date_modified The date on which this profile was last modified.
|
| @@ -165,8 +168,8 @@ typedef std::vector<Tuple3<int64, string16, string16> > AutofillElementList;
|
| // Current version number. Note: when changing the current version number,
|
| // corresponding changes must happen in the unit tests, and new migration test
|
| // added. See |WebDatabaseMigrationTest::kCurrentTestedVersionNumber|.
|
| -const int kCurrentVersionNumber = 32;
|
| -const int kCompatibleVersionNumber = 32;
|
| +const int kCurrentVersionNumber = 33;
|
| +const int kCompatibleVersionNumber = 33;
|
|
|
| // ID of the url column in keywords.
|
| const int kUrlIdPosition = 16;
|
| @@ -281,11 +284,13 @@ void BindAutoFillProfileToStatement(const AutoFillProfile& profile,
|
| s->BindString16(11, LimitDataSize(text));
|
| text = profile.GetFieldText(AutoFillType(ADDRESS_HOME_COUNTRY));
|
| s->BindString16(12, LimitDataSize(text));
|
| + std::string country_code = profile.CountryCode();
|
| + s->BindString(13, country_code);
|
| text = profile.GetFieldText(AutoFillType(PHONE_HOME_WHOLE_NUMBER));
|
| - s->BindString16(13, LimitDataSize(text));
|
| - text = profile.GetFieldText(AutoFillType(PHONE_FAX_WHOLE_NUMBER));
|
| s->BindString16(14, LimitDataSize(text));
|
| - s->BindInt64(15, Time::Now().ToTimeT());
|
| + text = profile.GetFieldText(AutoFillType(PHONE_FAX_WHOLE_NUMBER));
|
| + s->BindString16(15, LimitDataSize(text));
|
| + s->BindInt64(16, Time::Now().ToTimeT());
|
| }
|
|
|
| AutoFillProfile* AutoFillProfileFromStatement(const sql::Statement& s) {
|
| @@ -315,13 +320,13 @@ AutoFillProfile* AutoFillProfileFromStatement(const sql::Statement& s) {
|
| s.ColumnString16(10));
|
| profile->SetInfo(AutoFillType(ADDRESS_HOME_ZIP),
|
| s.ColumnString16(11));
|
| - profile->SetInfo(AutoFillType(ADDRESS_HOME_COUNTRY),
|
| - s.ColumnString16(12));
|
| + // Intentionally skip column 12, which stores the localized country name.
|
| + profile->SetCountryCode(s.ColumnString(13));
|
| profile->SetInfo(AutoFillType(PHONE_HOME_WHOLE_NUMBER),
|
| - s.ColumnString16(13));
|
| - profile->SetInfo(AutoFillType(PHONE_FAX_WHOLE_NUMBER),
|
| s.ColumnString16(14));
|
| - // Intentionally skip column 15, which stores the profile's modification date.
|
| + profile->SetInfo(AutoFillType(PHONE_FAX_WHOLE_NUMBER),
|
| + s.ColumnString16(15));
|
| + // Intentionally skip column 16, which stores the profile's modification date.
|
|
|
| return profile;
|
| }
|
| @@ -734,6 +739,7 @@ bool WebDatabase::InitAutoFillProfilesTable() {
|
| "state VARCHAR, "
|
| "zipcode VARCHAR, "
|
| "country VARCHAR, "
|
| + "country_code VARCHAR, "
|
| "phone VARCHAR, "
|
| "fax VARCHAR, "
|
| "date_modified INTEGER NOT NULL DEFAULT 0)")) {
|
| @@ -1609,8 +1615,8 @@ bool WebDatabase::AddAutoFillProfile(const AutoFillProfile& profile) {
|
| "INSERT INTO autofill_profiles"
|
| "(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)"
|
| - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"));
|
| + " country, country_code, phone, fax, date_modified)"
|
| + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"));
|
| if (!s) {
|
| NOTREACHED() << "Statement prepare failed";
|
| return false;
|
| @@ -1633,7 +1639,7 @@ bool WebDatabase::GetAutoFillProfile(const std::string& guid,
|
| sql::Statement s(db_.GetUniqueStatement(
|
| "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 "
|
| + "country, country_code, phone, fax, date_modified "
|
| "FROM autofill_profiles "
|
| "WHERE guid = ?"));
|
| if (!s) {
|
| @@ -1658,7 +1664,7 @@ bool WebDatabase::GetAutoFillProfiles(
|
| sql::Statement s(db_.GetUniqueStatement(
|
| "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 "
|
| + "country, country_code, phone, fax, date_modified "
|
| "FROM autofill_profiles"));
|
| if (!s) {
|
| NOTREACHED() << "Statement prepare failed";
|
| @@ -1687,8 +1693,8 @@ bool WebDatabase::UpdateAutoFillProfile(const AutoFillProfile& profile) {
|
| "UPDATE autofill_profiles "
|
| "SET 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=? "
|
| + " city=?, state=?, zipcode=?, country=?, country_code=?, phone=?, "
|
| + " fax=?, date_modified=? "
|
| "WHERE guid=?"));
|
| if (!s) {
|
| NOTREACHED() << "Statement prepare failed";
|
| @@ -1696,7 +1702,7 @@ bool WebDatabase::UpdateAutoFillProfile(const AutoFillProfile& profile) {
|
| }
|
|
|
| BindAutoFillProfileToStatement(profile, &s);
|
| - s.BindString(16, profile.guid());
|
| + s.BindString(17, profile.guid());
|
| bool result = s.Run();
|
| DCHECK_GT(db_.GetLastChangeCount(), 0);
|
| return result;
|
| @@ -2533,6 +2539,60 @@ sql::InitStatus WebDatabase::MigrateOldVersionsAsNeeded(){
|
|
|
| // FALL THROUGH
|
|
|
| + case 32:
|
| + // Add |country_code| column to |autofill_profiles| table.
|
| + // Note that we need to check for the 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", "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;
|
| + }
|
| +
|
| + std::string app_locale = AutoFillCountry::ApplicationLocale();
|
| + 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);
|
| + 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(33);
|
| + meta_table_.SetCompatibleVersionNumber(
|
| + std::min(33, kCompatibleVersionNumber));
|
| +
|
| + // 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.
|
|
|