| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/autofill/core/browser/webdata/autofill_table.h" | 5 #include "components/autofill/core/browser/webdata/autofill_table.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <cmath> | 10 #include <cmath> |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 #include "components/autofill/core/common/form_field_data.h" | 38 #include "components/autofill/core/common/form_field_data.h" |
| 39 #include "components/sync/base/model_type.h" | 39 #include "components/sync/base/model_type.h" |
| 40 #include "components/sync/protocol/entity_metadata.pb.h" | 40 #include "components/sync/protocol/entity_metadata.pb.h" |
| 41 #include "components/sync/protocol/model_type_state.pb.h" | 41 #include "components/sync/protocol/model_type_state.pb.h" |
| 42 #include "components/webdata/common/web_database.h" | 42 #include "components/webdata/common/web_database.h" |
| 43 #include "sql/statement.h" | 43 #include "sql/statement.h" |
| 44 #include "sql/transaction.h" | 44 #include "sql/transaction.h" |
| 45 #include "ui/base/l10n/l10n_util.h" | 45 #include "ui/base/l10n/l10n_util.h" |
| 46 #include "url/gurl.h" | 46 #include "url/gurl.h" |
| 47 | 47 |
| 48 using base::ASCIIToUTF16; | |
| 49 using base::Time; | |
| 50 using base::TimeDelta; | |
| 51 | |
| 52 namespace autofill { | 48 namespace autofill { |
| 53 namespace { | 49 namespace { |
| 54 | 50 |
| 55 // The period after which autocomplete entries should expire in days. | 51 // The period after which autocomplete entries should expire in days. |
| 56 const int64_t kExpirationPeriodInDays = 60; | 52 const int64_t kExpirationPeriodInDays = 60; |
| 57 | 53 |
| 58 // Helper struct for AutofillTable::RemoveFormElementsAddedBetween(). | 54 // Helper struct for AutofillTable::RemoveFormElementsAddedBetween(). |
| 59 // Contains all the necessary fields to update a row in the 'autofill' table. | 55 // Contains all the necessary fields to update a row in the 'autofill' table. |
| 60 struct AutofillUpdate { | 56 struct AutofillUpdate { |
| 61 base::string16 name; | 57 base::string16 name; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 76 base::string16 GetInfo(const AutofillDataModel& data_model, | 72 base::string16 GetInfo(const AutofillDataModel& data_model, |
| 77 ServerFieldType type) { | 73 ServerFieldType type) { |
| 78 base::string16 data = data_model.GetRawInfo(type); | 74 base::string16 data = data_model.GetRawInfo(type); |
| 79 if (data.size() > AutofillTable::kMaxDataLength) | 75 if (data.size() > AutofillTable::kMaxDataLength) |
| 80 return data.substr(0, AutofillTable::kMaxDataLength); | 76 return data.substr(0, AutofillTable::kMaxDataLength); |
| 81 | 77 |
| 82 return data; | 78 return data; |
| 83 } | 79 } |
| 84 | 80 |
| 85 void BindAutofillProfileToStatement(const AutofillProfile& profile, | 81 void BindAutofillProfileToStatement(const AutofillProfile& profile, |
| 86 const Time& modification_date, | 82 const base::Time& modification_date, |
| 87 sql::Statement* s) { | 83 sql::Statement* s) { |
| 88 DCHECK(base::IsValidGUID(profile.guid())); | 84 DCHECK(base::IsValidGUID(profile.guid())); |
| 89 int index = 0; | 85 int index = 0; |
| 90 s->BindString(index++, profile.guid()); | 86 s->BindString(index++, profile.guid()); |
| 91 | 87 |
| 92 s->BindString16(index++, GetInfo(profile, COMPANY_NAME)); | 88 s->BindString16(index++, GetInfo(profile, COMPANY_NAME)); |
| 93 s->BindString16(index++, GetInfo(profile, ADDRESS_HOME_STREET_ADDRESS)); | 89 s->BindString16(index++, GetInfo(profile, ADDRESS_HOME_STREET_ADDRESS)); |
| 94 s->BindString16(index++, GetInfo(profile, ADDRESS_HOME_DEPENDENT_LOCALITY)); | 90 s->BindString16(index++, GetInfo(profile, ADDRESS_HOME_DEPENDENT_LOCALITY)); |
| 95 s->BindString16(index++, GetInfo(profile, ADDRESS_HOME_CITY)); | 91 s->BindString16(index++, GetInfo(profile, ADDRESS_HOME_CITY)); |
| 96 s->BindString16(index++, GetInfo(profile, ADDRESS_HOME_STATE)); | 92 s->BindString16(index++, GetInfo(profile, ADDRESS_HOME_STATE)); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 114 profile->SetRawInfo(COMPANY_NAME, s.ColumnString16(index++)); | 110 profile->SetRawInfo(COMPANY_NAME, s.ColumnString16(index++)); |
| 115 profile->SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, s.ColumnString16(index++)); | 111 profile->SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, s.ColumnString16(index++)); |
| 116 profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, | 112 profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, |
| 117 s.ColumnString16(index++)); | 113 s.ColumnString16(index++)); |
| 118 profile->SetRawInfo(ADDRESS_HOME_CITY, s.ColumnString16(index++)); | 114 profile->SetRawInfo(ADDRESS_HOME_CITY, s.ColumnString16(index++)); |
| 119 profile->SetRawInfo(ADDRESS_HOME_STATE, s.ColumnString16(index++)); | 115 profile->SetRawInfo(ADDRESS_HOME_STATE, s.ColumnString16(index++)); |
| 120 profile->SetRawInfo(ADDRESS_HOME_ZIP, s.ColumnString16(index++)); | 116 profile->SetRawInfo(ADDRESS_HOME_ZIP, s.ColumnString16(index++)); |
| 121 profile->SetRawInfo(ADDRESS_HOME_SORTING_CODE, s.ColumnString16(index++)); | 117 profile->SetRawInfo(ADDRESS_HOME_SORTING_CODE, s.ColumnString16(index++)); |
| 122 profile->SetRawInfo(ADDRESS_HOME_COUNTRY, s.ColumnString16(index++)); | 118 profile->SetRawInfo(ADDRESS_HOME_COUNTRY, s.ColumnString16(index++)); |
| 123 profile->set_use_count(s.ColumnInt64(index++)); | 119 profile->set_use_count(s.ColumnInt64(index++)); |
| 124 profile->set_use_date(Time::FromTimeT(s.ColumnInt64(index++))); | 120 profile->set_use_date(base::Time::FromTimeT(s.ColumnInt64(index++))); |
| 125 profile->set_modification_date(Time::FromTimeT(s.ColumnInt64(index++))); | 121 profile->set_modification_date(base::Time::FromTimeT(s.ColumnInt64(index++))); |
| 126 profile->set_origin(s.ColumnString(index++)); | 122 profile->set_origin(s.ColumnString(index++)); |
| 127 profile->set_language_code(s.ColumnString(index++)); | 123 profile->set_language_code(s.ColumnString(index++)); |
| 128 | 124 |
| 129 return profile; | 125 return profile; |
| 130 } | 126 } |
| 131 | 127 |
| 132 void BindEncryptedCardToColumn(sql::Statement* s, | 128 void BindEncryptedCardToColumn(sql::Statement* s, |
| 133 int column_index, | 129 int column_index, |
| 134 const base::string16& number, | 130 const base::string16& number, |
| 135 const AutofillTableEncryptor& encryptor) { | 131 const AutofillTableEncryptor& encryptor) { |
| 136 std::string encrypted_data; | 132 std::string encrypted_data; |
| 137 encryptor.EncryptString16(number, &encrypted_data); | 133 encryptor.EncryptString16(number, &encrypted_data); |
| 138 s->BindBlob(column_index, encrypted_data.data(), | 134 s->BindBlob(column_index, encrypted_data.data(), |
| 139 static_cast<int>(encrypted_data.length())); | 135 static_cast<int>(encrypted_data.length())); |
| 140 } | 136 } |
| 141 | 137 |
| 142 void BindCreditCardToStatement(const CreditCard& credit_card, | 138 void BindCreditCardToStatement(const CreditCard& credit_card, |
| 143 const Time& modification_date, | 139 const base::Time& modification_date, |
| 144 sql::Statement* s, | 140 sql::Statement* s, |
| 145 const AutofillTableEncryptor& encryptor) { | 141 const AutofillTableEncryptor& encryptor) { |
| 146 DCHECK(base::IsValidGUID(credit_card.guid())); | 142 DCHECK(base::IsValidGUID(credit_card.guid())); |
| 147 int index = 0; | 143 int index = 0; |
| 148 s->BindString(index++, credit_card.guid()); | 144 s->BindString(index++, credit_card.guid()); |
| 149 | 145 |
| 150 s->BindString16(index++, GetInfo(credit_card, CREDIT_CARD_NAME_FULL)); | 146 s->BindString16(index++, GetInfo(credit_card, CREDIT_CARD_NAME_FULL)); |
| 151 s->BindString16(index++, GetInfo(credit_card, CREDIT_CARD_EXP_MONTH)); | 147 s->BindString16(index++, GetInfo(credit_card, CREDIT_CARD_EXP_MONTH)); |
| 152 s->BindString16(index++, GetInfo(credit_card, CREDIT_CARD_EXP_4_DIGIT_YEAR)); | 148 s->BindString16(index++, GetInfo(credit_card, CREDIT_CARD_EXP_4_DIGIT_YEAR)); |
| 153 BindEncryptedCardToColumn( | 149 BindEncryptedCardToColumn( |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 credit_card->set_guid(s.ColumnString(index++)); | 181 credit_card->set_guid(s.ColumnString(index++)); |
| 186 DCHECK(base::IsValidGUID(credit_card->guid())); | 182 DCHECK(base::IsValidGUID(credit_card->guid())); |
| 187 | 183 |
| 188 credit_card->SetRawInfo(CREDIT_CARD_NAME_FULL, s.ColumnString16(index++)); | 184 credit_card->SetRawInfo(CREDIT_CARD_NAME_FULL, s.ColumnString16(index++)); |
| 189 credit_card->SetRawInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(index++)); | 185 credit_card->SetRawInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(index++)); |
| 190 credit_card->SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, | 186 credit_card->SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, |
| 191 s.ColumnString16(index++)); | 187 s.ColumnString16(index++)); |
| 192 credit_card->SetRawInfo(CREDIT_CARD_NUMBER, | 188 credit_card->SetRawInfo(CREDIT_CARD_NUMBER, |
| 193 UnencryptedCardFromColumn(s, index++, encryptor)); | 189 UnencryptedCardFromColumn(s, index++, encryptor)); |
| 194 credit_card->set_use_count(s.ColumnInt64(index++)); | 190 credit_card->set_use_count(s.ColumnInt64(index++)); |
| 195 credit_card->set_use_date(Time::FromTimeT(s.ColumnInt64(index++))); | 191 credit_card->set_use_date(base::Time::FromTimeT(s.ColumnInt64(index++))); |
| 196 credit_card->set_modification_date(Time::FromTimeT(s.ColumnInt64(index++))); | 192 credit_card->set_modification_date( |
| 193 base::Time::FromTimeT(s.ColumnInt64(index++))); |
| 197 credit_card->set_origin(s.ColumnString(index++)); | 194 credit_card->set_origin(s.ColumnString(index++)); |
| 198 credit_card->set_billing_address_id(s.ColumnString(index++)); | 195 credit_card->set_billing_address_id(s.ColumnString(index++)); |
| 199 | 196 |
| 200 return credit_card; | 197 return credit_card; |
| 201 } | 198 } |
| 202 | 199 |
| 203 bool AddAutofillProfileNamesToProfile(sql::Connection* db, | 200 bool AddAutofillProfileNamesToProfile(sql::Connection* db, |
| 204 AutofillProfile* profile) { | 201 AutofillProfile* profile) { |
| 205 // TODO(estade): update schema so that multiple names are not associated per | 202 // TODO(estade): update schema so that multiple names are not associated per |
| 206 // unique profile guid. Please refer https://crbug.com/497934. | 203 // unique profile guid. Please refer https://crbug.com/497934. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 222 profile->SetRawInfo(NAME_FULL, s.ColumnString16(4)); | 219 profile->SetRawInfo(NAME_FULL, s.ColumnString16(4)); |
| 223 } | 220 } |
| 224 return s.Succeeded(); | 221 return s.Succeeded(); |
| 225 } | 222 } |
| 226 | 223 |
| 227 bool AddAutofillProfileEmailsToProfile(sql::Connection* db, | 224 bool AddAutofillProfileEmailsToProfile(sql::Connection* db, |
| 228 AutofillProfile* profile) { | 225 AutofillProfile* profile) { |
| 229 // TODO(estade): update schema so that multiple emails are not associated per | 226 // TODO(estade): update schema so that multiple emails are not associated per |
| 230 // unique profile guid. Please refer https://crbug.com/497934. | 227 // unique profile guid. Please refer https://crbug.com/497934. |
| 231 sql::Statement s(db->GetUniqueStatement( | 228 sql::Statement s(db->GetUniqueStatement( |
| 232 "SELECT guid, email " | 229 "SELECT guid, email FROM autofill_profile_emails WHERE guid=? LIMIT 1")); |
| 233 "FROM autofill_profile_emails " | |
| 234 "WHERE guid=?" | |
| 235 "LIMIT 1")); | |
| 236 s.BindString(0, profile->guid()); | 230 s.BindString(0, profile->guid()); |
| 237 | 231 |
| 238 if (!s.is_valid()) | 232 if (!s.is_valid()) |
| 239 return false; | 233 return false; |
| 240 | 234 |
| 241 if (s.Step()) { | 235 if (s.Step()) { |
| 242 DCHECK_EQ(profile->guid(), s.ColumnString(0)); | 236 DCHECK_EQ(profile->guid(), s.ColumnString(0)); |
| 243 profile->SetRawInfo(EMAIL_ADDRESS, s.ColumnString16(1)); | 237 profile->SetRawInfo(EMAIL_ADDRESS, s.ColumnString16(1)); |
| 244 } | 238 } |
| 245 return s.Succeeded(); | 239 return s.Succeeded(); |
| 246 } | 240 } |
| 247 | 241 |
| 248 bool AddAutofillProfilePhonesToProfile(sql::Connection* db, | 242 bool AddAutofillProfilePhonesToProfile(sql::Connection* db, |
| 249 AutofillProfile* profile) { | 243 AutofillProfile* profile) { |
| 250 // TODO(estade): update schema so that multiple phone numbers are not | 244 // TODO(estade): update schema so that multiple phone numbers are not |
| 251 // associated per unique profile guid. Please refer https://crbug.com/497934. | 245 // associated per unique profile guid. Please refer https://crbug.com/497934. |
| 252 sql::Statement s(db->GetUniqueStatement( | 246 sql::Statement s(db->GetUniqueStatement( |
| 253 "SELECT guid, number " | 247 "SELECT guid, number FROM autofill_profile_phones WHERE guid=? LIMIT 1")); |
| 254 "FROM autofill_profile_phones " | |
| 255 "WHERE guid=?" | |
| 256 "LIMIT 1")); | |
| 257 s.BindString(0, profile->guid()); | 248 s.BindString(0, profile->guid()); |
| 258 | 249 |
| 259 if (!s.is_valid()) | 250 if (!s.is_valid()) |
| 260 return false; | 251 return false; |
| 261 | 252 |
| 262 if (s.Step()) { | 253 if (s.Step()) { |
| 263 DCHECK_EQ(profile->guid(), s.ColumnString(0)); | 254 DCHECK_EQ(profile->guid(), s.ColumnString(0)); |
| 264 profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER, s.ColumnString16(1)); | 255 profile->SetRawInfo(PHONE_HOME_WHOLE_NUMBER, s.ColumnString16(1)); |
| 265 } | 256 } |
| 266 return s.Succeeded(); | 257 return s.Succeeded(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 279 s.BindString16(3, profile.GetRawInfo(NAME_LAST)); | 270 s.BindString16(3, profile.GetRawInfo(NAME_LAST)); |
| 280 s.BindString16(4, profile.GetRawInfo(NAME_FULL)); | 271 s.BindString16(4, profile.GetRawInfo(NAME_FULL)); |
| 281 | 272 |
| 282 return s.Run(); | 273 return s.Run(); |
| 283 } | 274 } |
| 284 | 275 |
| 285 bool AddAutofillProfileEmails(const AutofillProfile& profile, | 276 bool AddAutofillProfileEmails(const AutofillProfile& profile, |
| 286 sql::Connection* db) { | 277 sql::Connection* db) { |
| 287 // Add the new email. | 278 // Add the new email. |
| 288 sql::Statement s(db->GetUniqueStatement( | 279 sql::Statement s(db->GetUniqueStatement( |
| 289 "INSERT INTO autofill_profile_emails" | 280 "INSERT INTO autofill_profile_emails (guid, email) VALUES (?,?)")); |
| 290 " (guid, email) " | |
| 291 "VALUES (?,?)")); | |
| 292 s.BindString(0, profile.guid()); | 281 s.BindString(0, profile.guid()); |
| 293 s.BindString16(1, profile.GetRawInfo(EMAIL_ADDRESS)); | 282 s.BindString16(1, profile.GetRawInfo(EMAIL_ADDRESS)); |
| 294 | 283 |
| 295 return s.Run(); | 284 return s.Run(); |
| 296 } | 285 } |
| 297 | 286 |
| 298 bool AddAutofillProfilePhones(const AutofillProfile& profile, | 287 bool AddAutofillProfilePhones(const AutofillProfile& profile, |
| 299 sql::Connection* db) { | 288 sql::Connection* db) { |
| 300 // Add the new number. | 289 // Add the new number. |
| 301 sql::Statement s(db->GetUniqueStatement( | 290 sql::Statement s(db->GetUniqueStatement( |
| 302 "INSERT INTO autofill_profile_phones" | 291 "INSERT INTO autofill_profile_phones (guid, number) VALUES (?,?)")); |
| 303 " (guid, number) " | |
| 304 "VALUES (?,?)")); | |
| 305 s.BindString(0, profile.guid()); | 292 s.BindString(0, profile.guid()); |
| 306 s.BindString16(1, profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)); | 293 s.BindString16(1, profile.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)); |
| 307 | 294 |
| 308 return s.Run(); | 295 return s.Run(); |
| 309 } | 296 } |
| 310 | 297 |
| 311 bool AddAutofillProfilePieces(const AutofillProfile& profile, | 298 bool AddAutofillProfilePieces(const AutofillProfile& profile, |
| 312 sql::Connection* db) { | 299 sql::Connection* db) { |
| 313 if (!AddAutofillProfileNames(profile, db)) | 300 if (!AddAutofillProfileNames(profile, db)) |
| 314 return false; | 301 return false; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 344 return s3.Run(); | 331 return s3.Run(); |
| 345 } | 332 } |
| 346 | 333 |
| 347 WebDatabaseTable::TypeKey GetKey() { | 334 WebDatabaseTable::TypeKey GetKey() { |
| 348 // We just need a unique constant. Use the address of a static that | 335 // We just need a unique constant. Use the address of a static that |
| 349 // COMDAT folding won't touch in an optimizing linker. | 336 // COMDAT folding won't touch in an optimizing linker. |
| 350 static int table_key = 0; | 337 static int table_key = 0; |
| 351 return reinterpret_cast<void*>(&table_key); | 338 return reinterpret_cast<void*>(&table_key); |
| 352 } | 339 } |
| 353 | 340 |
| 354 time_t GetEndTime(const Time& end) { | 341 time_t GetEndTime(const base::Time& end) { |
| 355 if (end.is_null() || end == Time::Max()) | 342 if (end.is_null() || end == base::Time::Max()) |
| 356 return std::numeric_limits<time_t>::max(); | 343 return std::numeric_limits<time_t>::max(); |
| 357 | 344 |
| 358 return end.ToTimeT(); | 345 return end.ToTimeT(); |
| 359 } | 346 } |
| 360 | 347 |
| 361 std::string ServerStatusEnumToString(CreditCard::ServerStatus status) { | 348 std::string ServerStatusEnumToString(CreditCard::ServerStatus status) { |
| 362 switch (status) { | 349 switch (status) { |
| 363 case CreditCard::EXPIRED: | 350 case CreditCard::EXPIRED: |
| 364 return "EXPIRED"; | 351 return "EXPIRED"; |
| 365 | 352 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 | 392 |
| 406 // static | 393 // static |
| 407 const size_t AutofillTable::kMaxDataLength = 1024; | 394 const size_t AutofillTable::kMaxDataLength = 1024; |
| 408 | 395 |
| 409 AutofillTable::AutofillTable() | 396 AutofillTable::AutofillTable() |
| 410 : autofill_table_encryptor_( | 397 : autofill_table_encryptor_( |
| 411 AutofillTableEncryptorFactory::GetInstance()->Create()) { | 398 AutofillTableEncryptorFactory::GetInstance()->Create()) { |
| 412 DCHECK(autofill_table_encryptor_); | 399 DCHECK(autofill_table_encryptor_); |
| 413 } | 400 } |
| 414 | 401 |
| 415 AutofillTable::~AutofillTable() { | 402 AutofillTable::~AutofillTable() {} |
| 416 } | |
| 417 | 403 |
| 418 AutofillTable* AutofillTable::FromWebDatabase(WebDatabase* db) { | 404 AutofillTable* AutofillTable::FromWebDatabase(WebDatabase* db) { |
| 419 return static_cast<AutofillTable*>(db->GetTable(GetKey())); | 405 return static_cast<AutofillTable*>(db->GetTable(GetKey())); |
| 420 } | 406 } |
| 421 | 407 |
| 422 WebDatabaseTable::TypeKey AutofillTable::GetTypeKey() const { | 408 WebDatabaseTable::TypeKey AutofillTable::GetTypeKey() const { |
| 423 return GetKey(); | 409 return GetKey(); |
| 424 } | 410 } |
| 425 | 411 |
| 426 bool AutofillTable::CreateTablesIfNecessary() { | 412 bool AutofillTable::CreateTablesIfNecessary() { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 return MigrateToVersion66AddCardBillingAddress(); | 462 return MigrateToVersion66AddCardBillingAddress(); |
| 477 case 67: | 463 case 67: |
| 478 *update_compatible_version = false; | 464 *update_compatible_version = false; |
| 479 return MigrateToVersion67AddMaskedCardBillingAddress(); | 465 return MigrateToVersion67AddMaskedCardBillingAddress(); |
| 480 case 70: | 466 case 70: |
| 481 *update_compatible_version = false; | 467 *update_compatible_version = false; |
| 482 return MigrateToVersion70AddSyncMetadata(); | 468 return MigrateToVersion70AddSyncMetadata(); |
| 483 case 71: | 469 case 71: |
| 484 *update_compatible_version = true; | 470 *update_compatible_version = true; |
| 485 return MigrateToVersion71AddHasConvertedAndBillingAddressIdMetadata(); | 471 return MigrateToVersion71AddHasConvertedAndBillingAddressIdMetadata(); |
| 472 case 72: |
| 473 *update_compatible_version = true; |
| 474 return MigrateToVersion72RenameCardTypeToIssuerNetwork(); |
| 486 } | 475 } |
| 487 return true; | 476 return true; |
| 488 } | 477 } |
| 489 | 478 |
| 490 bool AutofillTable::AddFormFieldValues( | 479 bool AutofillTable::AddFormFieldValues( |
| 491 const std::vector<FormFieldData>& elements, | 480 const std::vector<FormFieldData>& elements, |
| 492 std::vector<AutofillChange>* changes) { | 481 std::vector<AutofillChange>* changes) { |
| 493 return AddFormFieldValuesTime(elements, changes, AutofillClock::Now()); | 482 return AddFormFieldValuesTime(elements, changes, AutofillClock::Now()); |
| 494 } | 483 } |
| 495 | 484 |
| 496 bool AutofillTable::AddFormFieldValue(const FormFieldData& element, | 485 bool AutofillTable::AddFormFieldValue(const FormFieldData& element, |
| 497 std::vector<AutofillChange>* changes) { | 486 std::vector<AutofillChange>* changes) { |
| 498 return AddFormFieldValueTime(element, changes, AutofillClock::Now()); | 487 return AddFormFieldValueTime(element, changes, AutofillClock::Now()); |
| 499 } | 488 } |
| 500 | 489 |
| 501 bool AutofillTable::GetFormValuesForElementName( | 490 bool AutofillTable::GetFormValuesForElementName( |
| 502 const base::string16& name, | 491 const base::string16& name, |
| 503 const base::string16& prefix, | 492 const base::string16& prefix, |
| 504 std::vector<base::string16>* values, | 493 std::vector<base::string16>* values, |
| 505 int limit) { | 494 int limit) { |
| 506 DCHECK(values); | 495 DCHECK(values); |
| 507 bool succeeded = false; | 496 bool succeeded = false; |
| 508 | 497 |
| 509 if (prefix.empty()) { | 498 if (prefix.empty()) { |
| 510 sql::Statement s; | 499 sql::Statement s; |
| 511 s.Assign(db_->GetUniqueStatement( | 500 s.Assign( |
| 512 "SELECT value FROM autofill " | 501 db_->GetUniqueStatement("SELECT value FROM autofill WHERE name = ? " |
| 513 "WHERE name = ? " | 502 "ORDER BY count DESC LIMIT ?")); |
| 514 "ORDER BY count DESC " | |
| 515 "LIMIT ?")); | |
| 516 s.BindString16(0, name); | 503 s.BindString16(0, name); |
| 517 s.BindInt(1, limit); | 504 s.BindInt(1, limit); |
| 518 | 505 |
| 519 values->clear(); | 506 values->clear(); |
| 520 while (s.Step()) | 507 while (s.Step()) |
| 521 values->push_back(s.ColumnString16(0)); | 508 values->push_back(s.ColumnString16(0)); |
| 522 | 509 |
| 523 succeeded = s.Succeeded(); | 510 succeeded = s.Succeeded(); |
| 524 } else { | 511 } else { |
| 525 base::string16 prefix_lower = base::i18n::ToLower(prefix); | 512 base::string16 prefix_lower = base::i18n::ToLower(prefix); |
| 526 base::string16 next_prefix = prefix_lower; | 513 base::string16 next_prefix = prefix_lower; |
| 527 next_prefix.back()++; | 514 next_prefix.back()++; |
| 528 | 515 |
| 529 sql::Statement s1; | 516 sql::Statement s1; |
| 530 s1.Assign(db_->GetUniqueStatement( | 517 s1.Assign( |
| 531 "SELECT value FROM autofill " | 518 db_->GetUniqueStatement("SELECT value FROM autofill " |
| 532 "WHERE name = ? AND " | 519 "WHERE name = ? AND " |
| 533 "value_lower >= ? AND " | 520 "value_lower >= ? AND " |
| 534 "value_lower < ? " | 521 "value_lower < ? " |
| 535 "ORDER BY count DESC " | 522 "ORDER BY count DESC " |
| 536 "LIMIT ?")); | 523 "LIMIT ?")); |
| 537 s1.BindString16(0, name); | 524 s1.BindString16(0, name); |
| 538 s1.BindString16(1, prefix_lower); | 525 s1.BindString16(1, prefix_lower); |
| 539 s1.BindString16(2, next_prefix); | 526 s1.BindString16(2, next_prefix); |
| 540 s1.BindInt(3, limit); | 527 s1.BindInt(3, limit); |
| 541 | 528 |
| 542 values->clear(); | 529 values->clear(); |
| 543 while (s1.Step()) | 530 while (s1.Step()) |
| 544 values->push_back(s1.ColumnString16(0)); | 531 values->push_back(s1.ColumnString16(0)); |
| 545 | 532 |
| 546 succeeded = s1.Succeeded(); | 533 succeeded = s1.Succeeded(); |
| 547 | 534 |
| 548 if (IsFeatureSubstringMatchEnabled()) { | 535 if (IsFeatureSubstringMatchEnabled()) { |
| 549 sql::Statement s2; | 536 sql::Statement s2; |
| 550 s2.Assign(db_->GetUniqueStatement( | 537 s2.Assign(db_->GetUniqueStatement( |
| 551 "SELECT value FROM autofill " | 538 "SELECT value FROM autofill " |
| 552 "WHERE name = ? AND (" | 539 "WHERE name = ? AND (" |
| 553 " value LIKE '% ' || :prefix || '%' ESCAPE '!' OR " | 540 " value LIKE '% ' || :prefix || '%' ESCAPE '!' OR " |
| 554 " value LIKE '%.' || :prefix || '%' ESCAPE '!' OR " | 541 " value LIKE '%.' || :prefix || '%' ESCAPE '!' OR " |
| 555 " value LIKE '%,' || :prefix || '%' ESCAPE '!' OR " | 542 " value LIKE '%,' || :prefix || '%' ESCAPE '!' OR " |
| 556 " value LIKE '%-' || :prefix || '%' ESCAPE '!' OR " | 543 " value LIKE '%-' || :prefix || '%' ESCAPE '!' OR " |
| 557 " value LIKE '%@' || :prefix || '%' ESCAPE '!' OR " | 544 " value LIKE '%@' || :prefix || '%' ESCAPE '!' OR " |
| 558 " value LIKE '%!_' || :prefix || '%' ESCAPE '!' ) " | 545 " value LIKE '%!_' || :prefix || '%' ESCAPE '!' ) " |
| 559 "ORDER BY count DESC " | 546 "ORDER BY count DESC " |
| 560 "LIMIT ?")); | 547 "LIMIT ?")); |
| 561 | 548 |
| 562 s2.BindString16(0, name); | 549 s2.BindString16(0, name); |
| 563 // escaper as L'!' -> 0x21. | 550 // escaper as L'!' -> 0x21. |
| 564 s2.BindString16(1, Substitute(prefix_lower, ASCIIToUTF16("_%"), 0x21)); | 551 s2.BindString16(1, |
| 552 Substitute(prefix_lower, base::ASCIIToUTF16("_%"), 0x21)); |
| 565 s2.BindInt(2, limit); | 553 s2.BindInt(2, limit); |
| 566 while (s2.Step()) | 554 while (s2.Step()) |
| 567 values->push_back(s2.ColumnString16(0)); | 555 values->push_back(s2.ColumnString16(0)); |
| 568 | 556 |
| 569 succeeded &= s2.Succeeded(); | 557 succeeded &= s2.Succeeded(); |
| 570 } | 558 } |
| 571 } | 559 } |
| 572 | 560 |
| 573 return succeeded; | 561 return succeeded; |
| 574 } | 562 } |
| 575 | 563 |
| 576 bool AutofillTable::RemoveFormElementsAddedBetween( | 564 bool AutofillTable::RemoveFormElementsAddedBetween( |
| 577 const Time& delete_begin, | 565 const base::Time& delete_begin, |
| 578 const Time& delete_end, | 566 const base::Time& delete_end, |
| 579 std::vector<AutofillChange>* changes) { | 567 std::vector<AutofillChange>* changes) { |
| 580 const time_t delete_begin_time_t = delete_begin.ToTimeT(); | 568 const time_t delete_begin_time_t = delete_begin.ToTimeT(); |
| 581 const time_t delete_end_time_t = GetEndTime(delete_end); | 569 const time_t delete_end_time_t = GetEndTime(delete_end); |
| 582 | 570 |
| 583 // Query for the name, value, count, and access dates of all form elements | 571 // Query for the name, value, count, and access dates of all form elements |
| 584 // that were used between the given times. | 572 // that were used between the given times. |
| 585 sql::Statement s(db_->GetUniqueStatement( | 573 sql::Statement s(db_->GetUniqueStatement( |
| 586 "SELECT name, value, count, date_created, date_last_used FROM autofill " | 574 "SELECT name, value, count, date_created, date_last_used FROM autofill " |
| 587 "WHERE (date_created >= ? AND date_created < ?) OR " | 575 "WHERE (date_created >= ? AND date_created < ?) OR " |
| 588 " (date_last_used >= ? AND date_last_used < ?)")); | 576 " (date_last_used >= ? AND date_last_used < ?)")); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 622 // count_new = 1 + (date_last_used_new - date_created_new) / avg_delta | 610 // count_new = 1 + (date_last_used_new - date_created_new) / avg_delta |
| 623 // = 1 + ((count - 1) * | 611 // = 1 + ((count - 1) * |
| 624 // (date_last_used_new - date_created_new) / | 612 // (date_last_used_new - date_created_new) / |
| 625 // (date_last_used_orig - date_created_orig)) | 613 // (date_last_used_orig - date_created_orig)) |
| 626 // Interpolating might not give a result that completely accurately | 614 // Interpolating might not give a result that completely accurately |
| 627 // reflects the user's history, but it's the best that can be done given | 615 // reflects the user's history, but it's the best that can be done given |
| 628 // the information in the database. | 616 // the information in the database. |
| 629 AutofillUpdate updated_entry; | 617 AutofillUpdate updated_entry; |
| 630 updated_entry.name = name; | 618 updated_entry.name = name; |
| 631 updated_entry.value = value; | 619 updated_entry.value = value; |
| 632 updated_entry.date_created = | 620 updated_entry.date_created = date_created_time_t < delete_begin_time_t |
| 633 date_created_time_t < delete_begin_time_t ? | 621 ? date_created_time_t |
| 634 date_created_time_t : | 622 : delete_end_time_t; |
| 635 delete_end_time_t; | 623 updated_entry.date_last_used = date_last_used_time_t >= delete_end_time_t |
| 636 updated_entry.date_last_used = | 624 ? date_last_used_time_t |
| 637 date_last_used_time_t >= delete_end_time_t ? | 625 : delete_begin_time_t - 1; |
| 638 date_last_used_time_t : | |
| 639 delete_begin_time_t - 1; | |
| 640 updated_entry.count = | 626 updated_entry.count = |
| 641 1 + | 627 1 + |
| 642 Round(1.0 * (count - 1) * | 628 Round(1.0 * (count - 1) * |
| 643 (updated_entry.date_last_used - updated_entry.date_created) / | 629 (updated_entry.date_last_used - updated_entry.date_created) / |
| 644 (date_last_used_time_t - date_created_time_t)); | 630 (date_last_used_time_t - date_created_time_t)); |
| 645 updates.push_back(updated_entry); | 631 updates.push_back(updated_entry); |
| 646 } | 632 } |
| 647 | 633 |
| 648 tentative_changes.push_back( | 634 tentative_changes.push_back( |
| 649 AutofillChange(change_type, AutofillKey(name, value))); | 635 AutofillChange(change_type, AutofillKey(name, value))); |
| 650 } | 636 } |
| 651 if (!s.Succeeded()) | 637 if (!s.Succeeded()) |
| 652 return false; | 638 return false; |
| 653 | 639 |
| 654 // As a single transaction, remove or update the elements appropriately. | 640 // As a single transaction, remove or update the elements appropriately. |
| 655 sql::Statement s_delete(db_->GetUniqueStatement( | 641 sql::Statement s_delete(db_->GetUniqueStatement( |
| 656 "DELETE FROM autofill WHERE date_created >= ? AND date_last_used < ?")); | 642 "DELETE FROM autofill WHERE date_created >= ? AND date_last_used < ?")); |
| 657 s_delete.BindInt64(0, delete_begin_time_t); | 643 s_delete.BindInt64(0, delete_begin_time_t); |
| 658 s_delete.BindInt64(1, delete_end_time_t); | 644 s_delete.BindInt64(1, delete_end_time_t); |
| 659 sql::Transaction transaction(db_); | 645 sql::Transaction transaction(db_); |
| 660 if (!transaction.Begin()) | 646 if (!transaction.Begin()) |
| 661 return false; | 647 return false; |
| 662 if (!s_delete.Run()) | 648 if (!s_delete.Run()) |
| 663 return false; | 649 return false; |
| 664 for (size_t i = 0; i < updates.size(); ++i) { | 650 for (size_t i = 0; i < updates.size(); ++i) { |
| 665 sql::Statement s_update(db_->GetUniqueStatement( | 651 sql::Statement s_update(db_->GetUniqueStatement( |
| 666 "UPDATE autofill SET date_created = ?, date_last_used = ?, count = ?" | 652 "UPDATE autofill SET date_created = ?, date_last_used = ?, count = ?" |
| 667 "WHERE name = ? AND value = ?")); | 653 "WHERE name = ? AND value = ?")); |
| 668 s_update.BindInt64(0, updates[i].date_created); | 654 s_update.BindInt64(0, updates[i].date_created); |
| 669 s_update.BindInt64(1, updates[i].date_last_used); | 655 s_update.BindInt64(1, updates[i].date_last_used); |
| 670 s_update.BindInt(2, updates[i].count); | 656 s_update.BindInt(2, updates[i].count); |
| 671 s_update.BindString16(3, updates[i].name); | 657 s_update.BindString16(3, updates[i].name); |
| 672 s_update.BindString16(4, updates[i].value); | 658 s_update.BindString16(4, updates[i].value); |
| 673 if (!s_update.Run()) | 659 if (!s_update.Run()) |
| 674 return false; | 660 return false; |
| 675 } | 661 } |
| 676 if (!transaction.Commit()) | 662 if (!transaction.Commit()) |
| 677 return false; | 663 return false; |
| 678 | 664 |
| 679 *changes = tentative_changes; | 665 *changes = tentative_changes; |
| 680 return true; | 666 return true; |
| 681 } | 667 } |
| 682 | 668 |
| 683 bool AutofillTable::RemoveExpiredFormElements( | 669 bool AutofillTable::RemoveExpiredFormElements( |
| 684 std::vector<AutofillChange>* changes) { | 670 std::vector<AutofillChange>* changes) { |
| 685 Time expiration_time = | 671 base::Time expiration_time = |
| 686 AutofillClock::Now() - TimeDelta::FromDays(kExpirationPeriodInDays); | 672 AutofillClock::Now() - base::TimeDelta::FromDays(kExpirationPeriodInDays); |
| 687 | 673 |
| 688 // Query for the name and value of all form elements that were last used | 674 // Query for the name and value of all form elements that were last used |
| 689 // before the |expiration_time|. | 675 // before the |expiration_time|. |
| 690 sql::Statement select_for_delete(db_->GetUniqueStatement( | 676 sql::Statement select_for_delete(db_->GetUniqueStatement( |
| 691 "SELECT name, value FROM autofill WHERE date_last_used < ?")); | 677 "SELECT name, value FROM autofill WHERE date_last_used < ?")); |
| 692 select_for_delete.BindInt64(0, expiration_time.ToTimeT()); | 678 select_for_delete.BindInt64(0, expiration_time.ToTimeT()); |
| 693 std::vector<AutofillChange> tentative_changes; | 679 std::vector<AutofillChange> tentative_changes; |
| 694 while (select_for_delete.Step()) { | 680 while (select_for_delete.Step()) { |
| 695 base::string16 name = select_for_delete.ColumnString16(0); | 681 base::string16 name = select_for_delete.ColumnString16(0); |
| 696 base::string16 value = select_for_delete.ColumnString16(1); | 682 base::string16 value = select_for_delete.ColumnString16(1); |
| 697 tentative_changes.push_back( | 683 tentative_changes.push_back( |
| 698 AutofillChange(AutofillChange::REMOVE, AutofillKey(name, value))); | 684 AutofillChange(AutofillChange::REMOVE, AutofillKey(name, value))); |
| 699 } | 685 } |
| 700 | 686 |
| 701 if (!select_for_delete.Succeeded()) | 687 if (!select_for_delete.Succeeded()) |
| 702 return false; | 688 return false; |
| 703 | 689 |
| 704 sql::Statement delete_data_statement(db_->GetUniqueStatement( | 690 sql::Statement delete_data_statement( |
| 705 "DELETE FROM autofill WHERE date_last_used < ?")); | 691 db_->GetUniqueStatement("DELETE FROM autofill WHERE date_last_used < ?")); |
| 706 delete_data_statement.BindInt64(0, expiration_time.ToTimeT()); | 692 delete_data_statement.BindInt64(0, expiration_time.ToTimeT()); |
| 707 if (!delete_data_statement.Run()) | 693 if (!delete_data_statement.Run()) |
| 708 return false; | 694 return false; |
| 709 | 695 |
| 710 *changes = tentative_changes; | 696 *changes = tentative_changes; |
| 711 return true; | 697 return true; |
| 712 } | 698 } |
| 713 | 699 |
| 714 bool AutofillTable::AddFormFieldValuesTime( | 700 bool AutofillTable::AddFormFieldValuesTime( |
| 715 const std::vector<FormFieldData>& elements, | 701 const std::vector<FormFieldData>& elements, |
| 716 std::vector<AutofillChange>* changes, | 702 std::vector<AutofillChange>* changes, |
| 717 Time time) { | 703 base::Time time) { |
| 718 // Only add one new entry for each unique element name. Use |seen_names| to | 704 // Only add one new entry for each unique element name. Use |seen_names| to |
| 719 // track this. Add up to |kMaximumUniqueNames| unique entries per form. | 705 // track this. Add up to |kMaximumUniqueNames| unique entries per form. |
| 720 const size_t kMaximumUniqueNames = 256; | 706 const size_t kMaximumUniqueNames = 256; |
| 721 std::set<base::string16> seen_names; | 707 std::set<base::string16> seen_names; |
| 722 bool result = true; | 708 bool result = true; |
| 723 for (const FormFieldData& element : elements) { | 709 for (const FormFieldData& element : elements) { |
| 724 if (seen_names.size() >= kMaximumUniqueNames) | 710 if (seen_names.size() >= kMaximumUniqueNames) |
| 725 break; | 711 break; |
| 726 if (base::ContainsKey(seen_names, element.name)) | 712 if (base::ContainsKey(seen_names, element.name)) |
| 727 continue; | 713 continue; |
| 728 result = result && AddFormFieldValueTime(element, changes, time); | 714 result = result && AddFormFieldValueTime(element, changes, time); |
| 729 seen_names.insert(element.name); | 715 seen_names.insert(element.name); |
| 730 } | 716 } |
| 731 return result; | 717 return result; |
| 732 } | 718 } |
| 733 | 719 |
| 734 int AutofillTable::GetCountOfValuesContainedBetween( | 720 int AutofillTable::GetCountOfValuesContainedBetween(const base::Time& begin, |
| 735 const Time& begin, | 721 const base::Time& end) { |
| 736 const Time& end) { | |
| 737 const time_t begin_time_t = begin.ToTimeT(); | 722 const time_t begin_time_t = begin.ToTimeT(); |
| 738 const time_t end_time_t = GetEndTime(end); | 723 const time_t end_time_t = GetEndTime(end); |
| 739 | 724 |
| 740 sql::Statement s(db_->GetUniqueStatement( | 725 sql::Statement s(db_->GetUniqueStatement( |
| 741 "SELECT COUNT(DISTINCT(value1)) FROM ( " | 726 "SELECT COUNT(DISTINCT(value1)) FROM ( " |
| 742 " SELECT value AS value1 FROM autofill " | 727 " SELECT value AS value1 FROM autofill " |
| 743 " WHERE NOT EXISTS ( " | 728 " WHERE NOT EXISTS ( " |
| 744 " SELECT value AS value2, date_created, date_last_used FROM autofill " | 729 " SELECT value AS value2, date_created, date_last_used FROM autofill " |
| 745 " WHERE value1 = value2 AND " | 730 " WHERE value1 = value2 AND " |
| 746 " (date_created < ? OR date_last_used >= ?)))")); | 731 " (date_created < ? OR date_last_used >= ?)))")); |
| 747 s.BindInt64(0, begin_time_t); | 732 s.BindInt64(0, begin_time_t); |
| 748 s.BindInt64(1, end_time_t); | 733 s.BindInt64(1, end_time_t); |
| 749 | 734 |
| 750 if (!s.Step()) { | 735 if (!s.Step()) { |
| 751 NOTREACHED(); | 736 NOTREACHED(); |
| 752 return false; | 737 return false; |
| 753 } | 738 } |
| 754 return s.ColumnInt(0); | 739 return s.ColumnInt(0); |
| 755 } | 740 } |
| 756 | 741 |
| 757 bool AutofillTable::GetAllAutofillEntries(std::vector<AutofillEntry>* entries) { | 742 bool AutofillTable::GetAllAutofillEntries(std::vector<AutofillEntry>* entries) { |
| 758 sql::Statement s(db_->GetUniqueStatement( | 743 sql::Statement s(db_->GetUniqueStatement( |
| 759 "SELECT name, value, date_created, date_last_used FROM autofill")); | 744 "SELECT name, value, date_created, date_last_used FROM autofill")); |
| 760 | 745 |
| 761 while (s.Step()) { | 746 while (s.Step()) { |
| 762 base::string16 name = s.ColumnString16(0); | 747 base::string16 name = s.ColumnString16(0); |
| 763 base::string16 value = s.ColumnString16(1); | 748 base::string16 value = s.ColumnString16(1); |
| 764 Time date_created = Time::FromTimeT(s.ColumnInt64(2)); | 749 base::Time date_created = base::Time::FromTimeT(s.ColumnInt64(2)); |
| 765 Time date_last_used = Time::FromTimeT(s.ColumnInt64(3)); | 750 base::Time date_last_used = base::Time::FromTimeT(s.ColumnInt64(3)); |
| 766 entries->push_back( | 751 entries->push_back( |
| 767 AutofillEntry(AutofillKey(name, value), date_created, date_last_used)); | 752 AutofillEntry(AutofillKey(name, value), date_created, date_last_used)); |
| 768 } | 753 } |
| 769 | 754 |
| 770 return s.Succeeded(); | 755 return s.Succeeded(); |
| 771 } | 756 } |
| 772 | 757 |
| 773 bool AutofillTable::GetAutofillTimestamps(const base::string16& name, | 758 bool AutofillTable::GetAutofillTimestamps(const base::string16& name, |
| 774 const base::string16& value, | 759 const base::string16& value, |
| 775 Time* date_created, | 760 base::Time* date_created, |
| 776 Time* date_last_used) { | 761 base::Time* date_last_used) { |
| 777 sql::Statement s(db_->GetUniqueStatement( | 762 sql::Statement s(db_->GetUniqueStatement( |
| 778 "SELECT date_created, date_last_used FROM autofill " | 763 "SELECT date_created, date_last_used FROM autofill " |
| 779 "WHERE name = ? AND value = ?")); | 764 "WHERE name = ? AND value = ?")); |
| 780 s.BindString16(0, name); | 765 s.BindString16(0, name); |
| 781 s.BindString16(1, value); | 766 s.BindString16(1, value); |
| 782 if (!s.Step()) | 767 if (!s.Step()) |
| 783 return false; | 768 return false; |
| 784 | 769 |
| 785 *date_created = Time::FromTimeT(s.ColumnInt64(0)); | 770 *date_created = base::Time::FromTimeT(s.ColumnInt64(0)); |
| 786 *date_last_used = Time::FromTimeT(s.ColumnInt64(1)); | 771 *date_last_used = base::Time::FromTimeT(s.ColumnInt64(1)); |
| 787 | 772 |
| 788 DCHECK(!s.Step()); | 773 DCHECK(!s.Step()); |
| 789 return true; | 774 return true; |
| 790 } | 775 } |
| 791 | 776 |
| 792 bool AutofillTable::UpdateAutofillEntries( | 777 bool AutofillTable::UpdateAutofillEntries( |
| 793 const std::vector<AutofillEntry>& entries) { | 778 const std::vector<AutofillEntry>& entries) { |
| 794 if (entries.empty()) | 779 if (entries.empty()) |
| 795 return true; | 780 return true; |
| 796 | 781 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 827 // TODO(isherman): The counts column is currently synced implicitly as the | 812 // TODO(isherman): The counts column is currently synced implicitly as the |
| 828 // number of timestamps. Sync the value explicitly instead, since the DB now | 813 // number of timestamps. Sync the value explicitly instead, since the DB now |
| 829 // only saves the first and last timestamp, which makes counting timestamps | 814 // only saves the first and last timestamp, which makes counting timestamps |
| 830 // completely meaningless as a way to track frequency of usage. | 815 // completely meaningless as a way to track frequency of usage. |
| 831 s.BindInt(5, entry.date_last_used() == entry.date_created() ? 1 : 2); | 816 s.BindInt(5, entry.date_last_used() == entry.date_created() ? 1 : 2); |
| 832 return s.Run(); | 817 return s.Run(); |
| 833 } | 818 } |
| 834 | 819 |
| 835 bool AutofillTable::AddFormFieldValueTime(const FormFieldData& element, | 820 bool AutofillTable::AddFormFieldValueTime(const FormFieldData& element, |
| 836 std::vector<AutofillChange>* changes, | 821 std::vector<AutofillChange>* changes, |
| 837 Time time) { | 822 base::Time time) { |
| 838 sql::Statement s_exists(db_->GetUniqueStatement( | 823 sql::Statement s_exists(db_->GetUniqueStatement( |
| 839 "SELECT COUNT(*) FROM autofill WHERE name = ? AND value = ?")); | 824 "SELECT COUNT(*) FROM autofill WHERE name = ? AND value = ?")); |
| 840 s_exists.BindString16(0, element.name); | 825 s_exists.BindString16(0, element.name); |
| 841 s_exists.BindString16(1, element.value); | 826 s_exists.BindString16(1, element.value); |
| 842 if (!s_exists.Step()) | 827 if (!s_exists.Step()) |
| 843 return false; | 828 return false; |
| 844 | 829 |
| 845 bool already_exists = s_exists.ColumnInt(0) > 0; | 830 bool already_exists = s_exists.ColumnInt(0) > 0; |
| 846 if (already_exists) { | 831 if (already_exists) { |
| 847 sql::Statement s(db_->GetUniqueStatement( | 832 sql::Statement s(db_->GetUniqueStatement( |
| (...skipping 20 matching lines...) Expand all Loading... |
| 868 return false; | 853 return false; |
| 869 } | 854 } |
| 870 | 855 |
| 871 AutofillChange::Type change_type = | 856 AutofillChange::Type change_type = |
| 872 already_exists ? AutofillChange::UPDATE : AutofillChange::ADD; | 857 already_exists ? AutofillChange::UPDATE : AutofillChange::ADD; |
| 873 changes->push_back( | 858 changes->push_back( |
| 874 AutofillChange(change_type, AutofillKey(element.name, element.value))); | 859 AutofillChange(change_type, AutofillKey(element.name, element.value))); |
| 875 return true; | 860 return true; |
| 876 } | 861 } |
| 877 | 862 |
| 878 | |
| 879 bool AutofillTable::RemoveFormElement(const base::string16& name, | 863 bool AutofillTable::RemoveFormElement(const base::string16& name, |
| 880 const base::string16& value) { | 864 const base::string16& value) { |
| 881 sql::Statement s(db_->GetUniqueStatement( | 865 sql::Statement s(db_->GetUniqueStatement( |
| 882 "DELETE FROM autofill WHERE name = ? AND value= ?")); | 866 "DELETE FROM autofill WHERE name = ? AND value= ?")); |
| 883 s.BindString16(0, name); | 867 s.BindString16(0, name); |
| 884 s.BindString16(1, value); | 868 s.BindString16(1, value); |
| 885 return s.Run(); | 869 return s.Run(); |
| 886 } | 870 } |
| 887 | 871 |
| 888 bool AutofillTable::AddAutofillProfile(const AutofillProfile& profile) { | 872 bool AutofillTable::AddAutofillProfile(const AutofillProfile& profile) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 931 | 915 |
| 932 return p; | 916 return p; |
| 933 } | 917 } |
| 934 | 918 |
| 935 bool AutofillTable::GetAutofillProfiles( | 919 bool AutofillTable::GetAutofillProfiles( |
| 936 std::vector<std::unique_ptr<AutofillProfile>>* profiles) { | 920 std::vector<std::unique_ptr<AutofillProfile>>* profiles) { |
| 937 DCHECK(profiles); | 921 DCHECK(profiles); |
| 938 profiles->clear(); | 922 profiles->clear(); |
| 939 | 923 |
| 940 sql::Statement s(db_->GetUniqueStatement( | 924 sql::Statement s(db_->GetUniqueStatement( |
| 941 "SELECT guid " | 925 "SELECT guid FROM autofill_profiles ORDER BY date_modified DESC, guid")); |
| 942 "FROM autofill_profiles " | |
| 943 "ORDER BY date_modified DESC, guid")); | |
| 944 | 926 |
| 945 while (s.Step()) { | 927 while (s.Step()) { |
| 946 std::string guid = s.ColumnString(0); | 928 std::string guid = s.ColumnString(0); |
| 947 std::unique_ptr<AutofillProfile> profile = GetAutofillProfile(guid); | 929 std::unique_ptr<AutofillProfile> profile = GetAutofillProfile(guid); |
| 948 if (!profile) | 930 if (!profile) |
| 949 return false; | 931 return false; |
| 950 profiles->push_back(std::move(profile)); | 932 profiles->push_back(std::move(profile)); |
| 951 } | 933 } |
| 952 | 934 |
| 953 return s.Succeeded(); | 935 return s.Succeeded(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 977 "has_converted " | 959 "has_converted " |
| 978 "FROM server_addresses addresses " | 960 "FROM server_addresses addresses " |
| 979 "LEFT OUTER JOIN server_address_metadata USING (id)")); | 961 "LEFT OUTER JOIN server_address_metadata USING (id)")); |
| 980 | 962 |
| 981 while (s.Step()) { | 963 while (s.Step()) { |
| 982 int index = 0; | 964 int index = 0; |
| 983 std::unique_ptr<AutofillProfile> profile = | 965 std::unique_ptr<AutofillProfile> profile = |
| 984 base::MakeUnique<AutofillProfile>(AutofillProfile::SERVER_PROFILE, | 966 base::MakeUnique<AutofillProfile>(AutofillProfile::SERVER_PROFILE, |
| 985 s.ColumnString(index++)); | 967 s.ColumnString(index++)); |
| 986 profile->set_use_count(s.ColumnInt64(index++)); | 968 profile->set_use_count(s.ColumnInt64(index++)); |
| 987 profile->set_use_date(Time::FromInternalValue(s.ColumnInt64(index++))); | 969 profile->set_use_date( |
| 970 base::Time::FromInternalValue(s.ColumnInt64(index++))); |
| 988 // Modification date is not tracked for server profiles. Explicitly set it | 971 // Modification date is not tracked for server profiles. Explicitly set it |
| 989 // here to override the default value of AutofillClock::Now(). | 972 // here to override the default value of AutofillClock::Now(). |
| 990 profile->set_modification_date(Time()); | 973 profile->set_modification_date(base::Time()); |
| 991 | 974 |
| 992 base::string16 recipient_name = s.ColumnString16(index++); | 975 base::string16 recipient_name = s.ColumnString16(index++); |
| 993 profile->SetRawInfo(COMPANY_NAME, s.ColumnString16(index++)); | 976 profile->SetRawInfo(COMPANY_NAME, s.ColumnString16(index++)); |
| 994 profile->SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, s.ColumnString16(index++)); | 977 profile->SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, s.ColumnString16(index++)); |
| 995 profile->SetRawInfo(ADDRESS_HOME_STATE, s.ColumnString16(index++)); | 978 profile->SetRawInfo(ADDRESS_HOME_STATE, s.ColumnString16(index++)); |
| 996 profile->SetRawInfo(ADDRESS_HOME_CITY, s.ColumnString16(index++)); | 979 profile->SetRawInfo(ADDRESS_HOME_CITY, s.ColumnString16(index++)); |
| 997 profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, | 980 profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, |
| 998 s.ColumnString16(index++)); | 981 s.ColumnString16(index++)); |
| 999 index++; // Skip address_4 which we haven't added to AutofillProfile yet. | 982 index++; // Skip address_4 which we haven't added to AutofillProfile yet. |
| 1000 profile->SetRawInfo(ADDRESS_HOME_ZIP, s.ColumnString16(index++)); | 983 profile->SetRawInfo(ADDRESS_HOME_ZIP, s.ColumnString16(index++)); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1017 return s.Succeeded(); | 1000 return s.Succeeded(); |
| 1018 } | 1001 } |
| 1019 | 1002 |
| 1020 void AutofillTable::SetServerProfiles( | 1003 void AutofillTable::SetServerProfiles( |
| 1021 const std::vector<AutofillProfile>& profiles) { | 1004 const std::vector<AutofillProfile>& profiles) { |
| 1022 sql::Transaction transaction(db_); | 1005 sql::Transaction transaction(db_); |
| 1023 if (!transaction.Begin()) | 1006 if (!transaction.Begin()) |
| 1024 return; | 1007 return; |
| 1025 | 1008 |
| 1026 // Delete all old ones first. | 1009 // Delete all old ones first. |
| 1027 sql::Statement delete_old(db_->GetUniqueStatement( | 1010 sql::Statement delete_old( |
| 1028 "DELETE FROM server_addresses")); | 1011 db_->GetUniqueStatement("DELETE FROM server_addresses")); |
| 1029 delete_old.Run(); | 1012 delete_old.Run(); |
| 1030 | 1013 |
| 1031 sql::Statement insert(db_->GetUniqueStatement( | 1014 sql::Statement insert(db_->GetUniqueStatement( |
| 1032 "INSERT INTO server_addresses(" | 1015 "INSERT INTO server_addresses(" |
| 1033 "id," | 1016 "id," |
| 1034 "recipient_name," | 1017 "recipient_name," |
| 1035 "company_name," | 1018 "company_name," |
| 1036 "street_address," | 1019 "street_address," |
| 1037 "address_1," // ADDRESS_HOME_STATE | 1020 "address_1," // ADDRESS_HOME_STATE |
| 1038 "address_2," // ADDRESS_HOME_CITY | 1021 "address_2," // ADDRESS_HOME_CITY |
| 1039 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY | 1022 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY |
| 1040 "address_4," // Not supported in AutofillProfile yet. | 1023 "address_4," // Not supported in AutofillProfile yet. |
| 1041 "postal_code," // ADDRESS_HOME_ZIP | 1024 "postal_code," // ADDRESS_HOME_ZIP |
| 1042 "sorting_code," // ADDRESS_HOME_SORTING_CODE | 1025 "sorting_code," // ADDRESS_HOME_SORTING_CODE |
| 1043 "country_code," // ADDRESS_HOME_COUNTRY | 1026 "country_code," // ADDRESS_HOME_COUNTRY |
| 1044 "phone_number," // PHONE_HOME_WHOLE_NUMBER | 1027 "phone_number," // PHONE_HOME_WHOLE_NUMBER |
| 1045 "language_code) " | 1028 "language_code) " |
| 1046 "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)")); | 1029 "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)")); |
| 1047 for (const auto& profile : profiles) { | 1030 for (const auto& profile : profiles) { |
| 1048 DCHECK(profile.record_type() == AutofillProfile::SERVER_PROFILE); | 1031 DCHECK(profile.record_type() == AutofillProfile::SERVER_PROFILE); |
| 1049 | 1032 |
| 1050 int index = 0; | 1033 int index = 0; |
| 1051 insert.BindString(index++, profile.server_id()); | 1034 insert.BindString(index++, profile.server_id()); |
| 1052 insert.BindString16(index++, profile.GetRawInfo(NAME_FULL)); | 1035 insert.BindString16(index++, profile.GetRawInfo(NAME_FULL)); |
| 1053 insert.BindString16(index++, profile.GetRawInfo(COMPANY_NAME)); | 1036 insert.BindString16(index++, profile.GetRawInfo(COMPANY_NAME)); |
| 1054 insert.BindString16(index++, | 1037 insert.BindString16(index++, |
| 1055 profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); | 1038 profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1067 insert.Run(); | 1050 insert.Run(); |
| 1068 insert.Reset(true); | 1051 insert.Reset(true); |
| 1069 | 1052 |
| 1070 // Save the use count and use date of the profile. | 1053 // Save the use count and use date of the profile. |
| 1071 UpdateServerAddressMetadata(profile); | 1054 UpdateServerAddressMetadata(profile); |
| 1072 } | 1055 } |
| 1073 | 1056 |
| 1074 // Delete metadata that's no longer relevant. | 1057 // Delete metadata that's no longer relevant. |
| 1075 sql::Statement metadata_delete(db_->GetUniqueStatement( | 1058 sql::Statement metadata_delete(db_->GetUniqueStatement( |
| 1076 "DELETE FROM server_address_metadata WHERE id NOT IN " | 1059 "DELETE FROM server_address_metadata WHERE id NOT IN " |
| 1077 "(SELECT id FROM server_addresses)")); | 1060 "(SELECT id FROM server_addresses)")); |
| 1078 metadata_delete.Run(); | 1061 metadata_delete.Run(); |
| 1079 | 1062 |
| 1080 transaction.Commit(); | 1063 transaction.Commit(); |
| 1081 } | 1064 } |
| 1082 | 1065 |
| 1083 bool AutofillTable::UpdateAutofillProfile(const AutofillProfile& profile) { | 1066 bool AutofillTable::UpdateAutofillProfile(const AutofillProfile& profile) { |
| 1084 DCHECK(base::IsValidGUID(profile.guid())); | 1067 DCHECK(base::IsValidGUID(profile.guid())); |
| 1085 | 1068 |
| 1086 // Don't update anything until the trash has been emptied. There may be | 1069 // Don't update anything until the trash has been emptied. There may be |
| 1087 // pending modifications to process. | 1070 // pending modifications to process. |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1126 if (IsAutofillGUIDInTrash(guid)) { | 1109 if (IsAutofillGUIDInTrash(guid)) { |
| 1127 sql::Statement s_trash(db_->GetUniqueStatement( | 1110 sql::Statement s_trash(db_->GetUniqueStatement( |
| 1128 "DELETE FROM autofill_profiles_trash WHERE guid = ?")); | 1111 "DELETE FROM autofill_profiles_trash WHERE guid = ?")); |
| 1129 s_trash.BindString(0, guid); | 1112 s_trash.BindString(0, guid); |
| 1130 | 1113 |
| 1131 bool success = s_trash.Run(); | 1114 bool success = s_trash.Run(); |
| 1132 DCHECK_GT(db_->GetLastChangeCount(), 0) << "Expected item in trash"; | 1115 DCHECK_GT(db_->GetLastChangeCount(), 0) << "Expected item in trash"; |
| 1133 return success; | 1116 return success; |
| 1134 } | 1117 } |
| 1135 | 1118 |
| 1136 sql::Statement s(db_->GetUniqueStatement( | 1119 sql::Statement s( |
| 1137 "DELETE FROM autofill_profiles WHERE guid = ?")); | 1120 db_->GetUniqueStatement("DELETE FROM autofill_profiles WHERE guid = ?")); |
| 1138 s.BindString(0, guid); | 1121 s.BindString(0, guid); |
| 1139 | 1122 |
| 1140 if (!s.Run()) | 1123 if (!s.Run()) |
| 1141 return false; | 1124 return false; |
| 1142 | 1125 |
| 1143 return RemoveAutofillProfilePieces(guid, db_); | 1126 return RemoveAutofillProfilePieces(guid, db_); |
| 1144 } | 1127 } |
| 1145 | 1128 |
| 1146 bool AutofillTable::ClearAutofillProfiles() { | 1129 bool AutofillTable::ClearAutofillProfiles() { |
| 1147 sql::Statement s1(db_->GetUniqueStatement( | 1130 sql::Statement s1(db_->GetUniqueStatement("DELETE FROM autofill_profiles")); |
| 1148 "DELETE FROM autofill_profiles")); | |
| 1149 | 1131 |
| 1150 if (!s1.Run()) | 1132 if (!s1.Run()) |
| 1151 return false; | 1133 return false; |
| 1152 | 1134 |
| 1153 sql::Statement s2(db_->GetUniqueStatement( | 1135 sql::Statement s2( |
| 1154 "DELETE FROM autofill_profile_names")); | 1136 db_->GetUniqueStatement("DELETE FROM autofill_profile_names")); |
| 1155 | 1137 |
| 1156 if (!s2.Run()) | 1138 if (!s2.Run()) |
| 1157 return false; | 1139 return false; |
| 1158 | 1140 |
| 1159 sql::Statement s3(db_->GetUniqueStatement( | 1141 sql::Statement s3( |
| 1160 "DELETE FROM autofill_profile_emails")); | 1142 db_->GetUniqueStatement("DELETE FROM autofill_profile_emails")); |
| 1161 | 1143 |
| 1162 if (!s3.Run()) | 1144 if (!s3.Run()) |
| 1163 return false; | 1145 return false; |
| 1164 | 1146 |
| 1165 sql::Statement s4(db_->GetUniqueStatement( | 1147 sql::Statement s4( |
| 1166 "DELETE FROM autofill_profile_phones")); | 1148 db_->GetUniqueStatement("DELETE FROM autofill_profile_phones")); |
| 1167 | 1149 |
| 1168 return s4.Run(); | 1150 return s4.Run(); |
| 1169 } | 1151 } |
| 1170 | 1152 |
| 1171 bool AutofillTable::AddCreditCard(const CreditCard& credit_card) { | 1153 bool AutofillTable::AddCreditCard(const CreditCard& credit_card) { |
| 1172 sql::Statement s(db_->GetUniqueStatement( | 1154 sql::Statement s(db_->GetUniqueStatement( |
| 1173 "INSERT INTO credit_cards" | 1155 "INSERT INTO credit_cards" |
| 1174 "(guid, name_on_card, expiration_month, expiration_year, " | 1156 "(guid, name_on_card, expiration_month, expiration_year, " |
| 1175 " card_number_encrypted, use_count, use_date, date_modified, origin," | 1157 " card_number_encrypted, use_count, use_date, date_modified, origin," |
| 1176 " billing_address_id)" | 1158 " billing_address_id)" |
| 1177 "VALUES (?,?,?,?,?,?,?,?,?,?)")); | 1159 "VALUES (?,?,?,?,?,?,?,?,?,?)")); |
| 1178 BindCreditCardToStatement(credit_card, AutofillClock::Now(), &s, | 1160 BindCreditCardToStatement(credit_card, AutofillClock::Now(), &s, |
| 1179 *autofill_table_encryptor_); | 1161 *autofill_table_encryptor_); |
| 1180 | 1162 |
| 1181 if (!s.Run()) | 1163 if (!s.Run()) |
| 1182 return false; | 1164 return false; |
| 1183 | 1165 |
| 1184 DCHECK_GT(db_->GetLastChangeCount(), 0); | 1166 DCHECK_GT(db_->GetLastChangeCount(), 0); |
| 1185 return true; | 1167 return true; |
| 1186 } | 1168 } |
| 1187 | 1169 |
| 1188 std::unique_ptr<CreditCard> AutofillTable::GetCreditCard( | 1170 std::unique_ptr<CreditCard> AutofillTable::GetCreditCard( |
| 1189 const std::string& guid) { | 1171 const std::string& guid) { |
| 1190 DCHECK(base::IsValidGUID(guid)); | 1172 DCHECK(base::IsValidGUID(guid)); |
| 1191 sql::Statement s(db_->GetUniqueStatement( | 1173 sql::Statement s(db_->GetUniqueStatement( |
| 1192 "SELECT guid, name_on_card, expiration_month, expiration_year, " | 1174 "SELECT guid, name_on_card, expiration_month, expiration_year, " |
| 1193 "card_number_encrypted, use_count, use_date, date_modified, " | 1175 "card_number_encrypted, use_count, use_date, date_modified, " |
| 1194 "origin, billing_address_id " | 1176 "origin, billing_address_id " |
| 1195 "FROM credit_cards " | 1177 "FROM credit_cards " |
| 1196 "WHERE guid = ?")); | 1178 "WHERE guid = ?")); |
| 1197 s.BindString(0, guid); | 1179 s.BindString(0, guid); |
| 1198 | 1180 |
| 1199 if (!s.Step()) | 1181 if (!s.Step()) |
| 1200 return std::unique_ptr<CreditCard>(); | 1182 return std::unique_ptr<CreditCard>(); |
| 1201 | 1183 |
| 1202 return CreditCardFromStatement(s, *autofill_table_encryptor_); | 1184 return CreditCardFromStatement(s, *autofill_table_encryptor_); |
| 1203 } | 1185 } |
| 1204 | 1186 |
| 1205 bool AutofillTable::GetCreditCards( | 1187 bool AutofillTable::GetCreditCards( |
| 1206 std::vector<std::unique_ptr<CreditCard>>* credit_cards) { | 1188 std::vector<std::unique_ptr<CreditCard>>* credit_cards) { |
| 1207 DCHECK(credit_cards); | 1189 DCHECK(credit_cards); |
| 1208 credit_cards->clear(); | 1190 credit_cards->clear(); |
| 1209 | 1191 |
| 1210 sql::Statement s(db_->GetUniqueStatement( | 1192 sql::Statement s(db_->GetUniqueStatement( |
| 1211 "SELECT guid " | 1193 "SELECT guid FROM credit_cards ORDER BY date_modified DESC, guid")); |
| 1212 "FROM credit_cards " | |
| 1213 "ORDER BY date_modified DESC, guid")); | |
| 1214 | 1194 |
| 1215 while (s.Step()) { | 1195 while (s.Step()) { |
| 1216 std::string guid = s.ColumnString(0); | 1196 std::string guid = s.ColumnString(0); |
| 1217 std::unique_ptr<CreditCard> credit_card = GetCreditCard(guid); | 1197 std::unique_ptr<CreditCard> credit_card = GetCreditCard(guid); |
| 1218 if (!credit_card) | 1198 if (!credit_card) |
| 1219 return false; | 1199 return false; |
| 1220 credit_cards->push_back(std::move(credit_card)); | 1200 credit_cards->push_back(std::move(credit_card)); |
| 1221 } | 1201 } |
| 1222 | 1202 |
| 1223 return s.Succeeded(); | 1203 return s.Succeeded(); |
| 1224 } | 1204 } |
| 1225 | 1205 |
| 1226 bool AutofillTable::GetServerCreditCards( | 1206 bool AutofillTable::GetServerCreditCards( |
| 1227 std::vector<std::unique_ptr<CreditCard>>* credit_cards) const { | 1207 std::vector<std::unique_ptr<CreditCard>>* credit_cards) const { |
| 1228 credit_cards->clear(); | 1208 credit_cards->clear(); |
| 1229 | 1209 |
| 1230 sql::Statement s(db_->GetUniqueStatement( | 1210 sql::Statement s(db_->GetUniqueStatement( |
| 1231 "SELECT " | 1211 "SELECT " |
| 1232 "card_number_encrypted, " // 0 | 1212 "card_number_encrypted, " // 0 |
| 1233 "last_four," // 1 | 1213 "last_four," // 1 |
| 1234 "masked.id," // 2 | 1214 "masked.id," // 2 |
| 1235 "metadata.use_count," // 3 | 1215 "metadata.use_count," // 3 |
| 1236 "metadata.use_date," // 4 | 1216 "metadata.use_date," // 4 |
| 1237 "type," // 5 | 1217 "network," // 5 |
| 1238 "status," // 6 | 1218 "status," // 6 |
| 1239 "name_on_card," // 7 | 1219 "name_on_card," // 7 |
| 1240 "exp_month," // 8 | 1220 "exp_month," // 8 |
| 1241 "exp_year," // 9 | 1221 "exp_year," // 9 |
| 1242 "metadata.billing_address_id " // 10 | 1222 "metadata.billing_address_id " // 10 |
| 1243 "FROM masked_credit_cards masked " | 1223 "FROM masked_credit_cards masked " |
| 1244 "LEFT OUTER JOIN unmasked_credit_cards USING (id) " | 1224 "LEFT OUTER JOIN unmasked_credit_cards USING (id) " |
| 1245 "LEFT OUTER JOIN server_card_metadata metadata USING (id)")); | 1225 "LEFT OUTER JOIN server_card_metadata metadata USING (id)")); |
| 1246 while (s.Step()) { | 1226 while (s.Step()) { |
| 1247 int index = 0; | 1227 int index = 0; |
| 1248 | 1228 |
| 1249 // If the card_number_encrypted field is nonempty, we can assume this card | 1229 // If the card_number_encrypted field is nonempty, we can assume this card |
| 1250 // is a full card, otherwise it's masked. | 1230 // is a full card, otherwise it's masked. |
| 1251 base::string16 full_card_number = | 1231 base::string16 full_card_number = |
| 1252 UnencryptedCardFromColumn(s, index++, *autofill_table_encryptor_); | 1232 UnencryptedCardFromColumn(s, index++, *autofill_table_encryptor_); |
| 1253 base::string16 last_four = s.ColumnString16(index++); | 1233 base::string16 last_four = s.ColumnString16(index++); |
| 1254 CreditCard::RecordType record_type = full_card_number.empty() ? | 1234 CreditCard::RecordType record_type = full_card_number.empty() |
| 1255 CreditCard::MASKED_SERVER_CARD : | 1235 ? CreditCard::MASKED_SERVER_CARD |
| 1256 CreditCard::FULL_SERVER_CARD; | 1236 : CreditCard::FULL_SERVER_CARD; |
| 1257 std::string server_id = s.ColumnString(index++); | 1237 std::string server_id = s.ColumnString(index++); |
| 1258 std::unique_ptr<CreditCard> card = | 1238 std::unique_ptr<CreditCard> card = |
| 1259 base::MakeUnique<CreditCard>(record_type, server_id); | 1239 base::MakeUnique<CreditCard>(record_type, server_id); |
| 1260 card->SetRawInfo( | 1240 card->SetRawInfo(CREDIT_CARD_NUMBER, |
| 1261 CREDIT_CARD_NUMBER, | 1241 record_type == CreditCard::MASKED_SERVER_CARD |
| 1262 record_type == CreditCard::MASKED_SERVER_CARD ? last_four | 1242 ? last_four |
| 1263 : full_card_number); | 1243 : full_card_number); |
| 1264 card->set_use_count(s.ColumnInt64(index++)); | 1244 card->set_use_count(s.ColumnInt64(index++)); |
| 1265 card->set_use_date(Time::FromInternalValue(s.ColumnInt64(index++))); | 1245 card->set_use_date(base::Time::FromInternalValue(s.ColumnInt64(index++))); |
| 1266 // Modification date is not tracked for server cards. Explicitly set it here | 1246 // Modification date is not tracked for server cards. Explicitly set it here |
| 1267 // to override the default value of AutofillClock::Now(). | 1247 // to override the default value of AutofillClock::Now(). |
| 1268 card->set_modification_date(Time()); | 1248 card->set_modification_date(base::Time()); |
| 1269 | 1249 |
| 1270 std::string card_type = s.ColumnString(index++); | 1250 std::string card_network = s.ColumnString(index++); |
| 1271 if (record_type == CreditCard::MASKED_SERVER_CARD) { | 1251 if (record_type == CreditCard::MASKED_SERVER_CARD) { |
| 1272 // The type must be set after setting the number to override the | 1252 // The issuer network must be set after setting the number to override the |
| 1273 // autodetected type. | 1253 // autodetected issuer network. |
| 1274 card->SetTypeForMaskedCard(card_type.c_str()); | 1254 card->SetNetworkForMaskedCard(card_network.c_str()); |
| 1275 } else { | 1255 } else { |
| 1276 DCHECK_EQ(CreditCard::GetCreditCardType(full_card_number), card_type); | 1256 DCHECK_EQ(CreditCard::GetCardNetwork(full_card_number), card_network); |
| 1277 } | 1257 } |
| 1278 | 1258 |
| 1279 card->SetServerStatus(ServerStatusStringToEnum(s.ColumnString(index++))); | 1259 card->SetServerStatus(ServerStatusStringToEnum(s.ColumnString(index++))); |
| 1280 card->SetRawInfo(CREDIT_CARD_NAME_FULL, s.ColumnString16(index++)); | 1260 card->SetRawInfo(CREDIT_CARD_NAME_FULL, s.ColumnString16(index++)); |
| 1281 card->SetRawInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(index++)); | 1261 card->SetRawInfo(CREDIT_CARD_EXP_MONTH, s.ColumnString16(index++)); |
| 1282 card->SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(index++)); | 1262 card->SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, s.ColumnString16(index++)); |
| 1283 card->set_billing_address_id(s.ColumnString(index++)); | 1263 card->set_billing_address_id(s.ColumnString(index++)); |
| 1284 credit_cards->push_back(std::move(card)); | 1264 credit_cards->push_back(std::move(card)); |
| 1285 } | 1265 } |
| 1286 return s.Succeeded(); | 1266 return s.Succeeded(); |
| 1287 } | 1267 } |
| 1288 | 1268 |
| 1289 void AutofillTable::AddMaskedCreditCards( | 1269 void AutofillTable::AddMaskedCreditCards( |
| 1290 const std::vector<CreditCard>& credit_cards) { | 1270 const std::vector<CreditCard>& credit_cards) { |
| 1291 DCHECK_GT(db_->transaction_nesting(), 0); | 1271 DCHECK_GT(db_->transaction_nesting(), 0); |
| 1292 sql::Statement masked_insert( | 1272 sql::Statement masked_insert( |
| 1293 db_->GetUniqueStatement("INSERT INTO masked_credit_cards(" | 1273 db_->GetUniqueStatement("INSERT INTO masked_credit_cards(" |
| 1294 "id," // 0 | 1274 "id," // 0 |
| 1295 "type," // 1 | 1275 "network," // 1 |
| 1296 "status," // 2 | 1276 "status," // 2 |
| 1297 "name_on_card," // 3 | 1277 "name_on_card," // 3 |
| 1298 "last_four," // 4 | 1278 "last_four," // 4 |
| 1299 "exp_month," // 5 | 1279 "exp_month," // 5 |
| 1300 "exp_year)" // 6 | 1280 "exp_year)" // 6 |
| 1301 "VALUES (?,?,?,?,?,?,?)")); | 1281 "VALUES (?,?,?,?,?,?,?)")); |
| 1302 for (const CreditCard& card : credit_cards) { | 1282 for (const CreditCard& card : credit_cards) { |
| 1303 DCHECK_EQ(CreditCard::MASKED_SERVER_CARD, card.record_type()); | 1283 DCHECK_EQ(CreditCard::MASKED_SERVER_CARD, card.record_type()); |
| 1304 masked_insert.BindString(0, card.server_id()); | 1284 masked_insert.BindString(0, card.server_id()); |
| 1305 masked_insert.BindString(1, card.type()); | 1285 masked_insert.BindString(1, card.network()); |
| 1306 masked_insert.BindString(2, | 1286 masked_insert.BindString(2, |
| 1307 ServerStatusEnumToString(card.GetServerStatus())); | 1287 ServerStatusEnumToString(card.GetServerStatus())); |
| 1308 masked_insert.BindString16(3, card.GetRawInfo(CREDIT_CARD_NAME_FULL)); | 1288 masked_insert.BindString16(3, card.GetRawInfo(CREDIT_CARD_NAME_FULL)); |
| 1309 masked_insert.BindString16(4, card.LastFourDigits()); | 1289 masked_insert.BindString16(4, card.LastFourDigits()); |
| 1310 masked_insert.BindString16(5, card.GetRawInfo(CREDIT_CARD_EXP_MONTH)); | 1290 masked_insert.BindString16(5, card.GetRawInfo(CREDIT_CARD_EXP_MONTH)); |
| 1311 masked_insert.BindString16(6, | 1291 masked_insert.BindString16(6, |
| 1312 card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)); | 1292 card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)); |
| 1313 | 1293 |
| 1314 masked_insert.Run(); | 1294 masked_insert.Run(); |
| 1315 masked_insert.Reset(true); | 1295 masked_insert.Reset(true); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1328 // Delete all old values. | 1308 // Delete all old values. |
| 1329 sql::Statement masked_delete( | 1309 sql::Statement masked_delete( |
| 1330 db_->GetUniqueStatement("DELETE FROM masked_credit_cards")); | 1310 db_->GetUniqueStatement("DELETE FROM masked_credit_cards")); |
| 1331 masked_delete.Run(); | 1311 masked_delete.Run(); |
| 1332 | 1312 |
| 1333 AddMaskedCreditCards(credit_cards); | 1313 AddMaskedCreditCards(credit_cards); |
| 1334 | 1314 |
| 1335 // Delete all items in the unmasked table that aren't in the new set. | 1315 // Delete all items in the unmasked table that aren't in the new set. |
| 1336 sql::Statement unmasked_delete(db_->GetUniqueStatement( | 1316 sql::Statement unmasked_delete(db_->GetUniqueStatement( |
| 1337 "DELETE FROM unmasked_credit_cards WHERE id NOT IN " | 1317 "DELETE FROM unmasked_credit_cards WHERE id NOT IN " |
| 1338 "(SELECT id FROM masked_credit_cards)")); | 1318 "(SELECT id FROM masked_credit_cards)")); |
| 1339 unmasked_delete.Run(); | 1319 unmasked_delete.Run(); |
| 1340 // Do the same for metadata. | 1320 // Do the same for metadata. |
| 1341 sql::Statement metadata_delete(db_->GetUniqueStatement( | 1321 sql::Statement metadata_delete(db_->GetUniqueStatement( |
| 1342 "DELETE FROM server_card_metadata WHERE id NOT IN " | 1322 "DELETE FROM server_card_metadata WHERE id NOT IN " |
| 1343 "(SELECT id FROM masked_credit_cards)")); | 1323 "(SELECT id FROM masked_credit_cards)")); |
| 1344 metadata_delete.Run(); | 1324 metadata_delete.Run(); |
| 1345 | 1325 |
| 1346 transaction.Commit(); | 1326 transaction.Commit(); |
| 1347 } | 1327 } |
| 1348 | 1328 |
| 1349 bool AutofillTable::AddFullServerCreditCard(const CreditCard& credit_card) { | 1329 bool AutofillTable::AddFullServerCreditCard(const CreditCard& credit_card) { |
| 1350 DCHECK_EQ(CreditCard::FULL_SERVER_CARD, credit_card.record_type()); | 1330 DCHECK_EQ(CreditCard::FULL_SERVER_CARD, credit_card.record_type()); |
| 1351 DCHECK(!credit_card.number().empty()); | 1331 DCHECK(!credit_card.number().empty()); |
| 1352 DCHECK(!credit_card.server_id().empty()); | 1332 DCHECK(!credit_card.server_id().empty()); |
| 1353 | 1333 |
| 1354 sql::Transaction transaction(db_); | 1334 sql::Transaction transaction(db_); |
| 1355 if (!transaction.Begin()) | 1335 if (!transaction.Begin()) |
| 1356 return false; | 1336 return false; |
| 1357 | 1337 |
| 1358 // Make sure there aren't duplicates for this card. | 1338 // Make sure there aren't duplicates for this card. |
| 1359 DeleteFromUnmaskedCreditCards(credit_card.server_id()); | 1339 DeleteFromUnmaskedCreditCards(credit_card.server_id()); |
| 1360 DeleteFromMaskedCreditCards(credit_card.server_id()); | 1340 DeleteFromMaskedCreditCards(credit_card.server_id()); |
| 1361 | 1341 |
| 1362 CreditCard masked(credit_card); | 1342 CreditCard masked(credit_card); |
| 1363 masked.set_record_type(CreditCard::MASKED_SERVER_CARD); | 1343 masked.set_record_type(CreditCard::MASKED_SERVER_CARD); |
| 1364 masked.SetNumber(credit_card.LastFourDigits()); | 1344 masked.SetNumber(credit_card.LastFourDigits()); |
| 1365 masked.RecordAndLogUse(); | 1345 masked.RecordAndLogUse(); |
| 1366 DCHECK(!masked.type().empty()); | 1346 DCHECK(!masked.network().empty()); |
| 1367 AddMaskedCreditCards({masked}); | 1347 AddMaskedCreditCards({masked}); |
| 1368 | 1348 |
| 1369 AddUnmaskedCreditCard(credit_card.server_id(), credit_card.number()); | 1349 AddUnmaskedCreditCard(credit_card.server_id(), credit_card.number()); |
| 1370 | 1350 |
| 1371 transaction.Commit(); | 1351 transaction.Commit(); |
| 1372 | 1352 |
| 1373 return db_->GetLastChangeCount() > 0; | 1353 return db_->GetLastChangeCount() > 0; |
| 1374 } | 1354 } |
| 1375 | 1355 |
| 1376 void AutofillTable::AddUnmaskedCreditCard(const std::string& id, | 1356 void AutofillTable::AddUnmaskedCreditCard(const std::string& id, |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1430 return db_->GetLastChangeCount() > 0; | 1410 return db_->GetLastChangeCount() > 0; |
| 1431 } | 1411 } |
| 1432 | 1412 |
| 1433 bool AutofillTable::MaskServerCreditCard(const std::string& id) { | 1413 bool AutofillTable::MaskServerCreditCard(const std::string& id) { |
| 1434 return DeleteFromUnmaskedCreditCards(id); | 1414 return DeleteFromUnmaskedCreditCards(id); |
| 1435 } | 1415 } |
| 1436 | 1416 |
| 1437 bool AutofillTable::UpdateServerCardMetadata(const CreditCard& credit_card) { | 1417 bool AutofillTable::UpdateServerCardMetadata(const CreditCard& credit_card) { |
| 1438 DCHECK_NE(CreditCard::LOCAL_CARD, credit_card.record_type()); | 1418 DCHECK_NE(CreditCard::LOCAL_CARD, credit_card.record_type()); |
| 1439 | 1419 |
| 1440 sql::Statement remove(db_->GetUniqueStatement( | 1420 sql::Statement remove( |
| 1441 "DELETE FROM server_card_metadata WHERE id = ?")); | 1421 db_->GetUniqueStatement("DELETE FROM server_card_metadata WHERE id = ?")); |
| 1442 remove.BindString(0, credit_card.server_id()); | 1422 remove.BindString(0, credit_card.server_id()); |
| 1443 remove.Run(); | 1423 remove.Run(); |
| 1444 | 1424 |
| 1445 sql::Statement s( | 1425 sql::Statement s( |
| 1446 db_->GetUniqueStatement("INSERT INTO server_card_metadata(use_count, " | 1426 db_->GetUniqueStatement("INSERT INTO server_card_metadata(use_count, " |
| 1447 "use_date, billing_address_id, id)" | 1427 "use_date, billing_address_id, id)" |
| 1448 "VALUES (?,?,?,?)")); | 1428 "VALUES (?,?,?,?)")); |
| 1449 s.BindInt64(0, credit_card.use_count()); | 1429 s.BindInt64(0, credit_card.use_count()); |
| 1450 s.BindInt64(1, credit_card.use_date().ToInternalValue()); | 1430 s.BindInt64(1, credit_card.use_date().ToInternalValue()); |
| 1451 s.BindString(2, credit_card.billing_address_id()); | 1431 s.BindString(2, credit_card.billing_address_id()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1483 transaction.Commit(); | 1463 transaction.Commit(); |
| 1484 | 1464 |
| 1485 return db_->GetLastChangeCount() > 0; | 1465 return db_->GetLastChangeCount() > 0; |
| 1486 } | 1466 } |
| 1487 | 1467 |
| 1488 bool AutofillTable::ClearAllServerData() { | 1468 bool AutofillTable::ClearAllServerData() { |
| 1489 sql::Transaction transaction(db_); | 1469 sql::Transaction transaction(db_); |
| 1490 if (!transaction.Begin()) | 1470 if (!transaction.Begin()) |
| 1491 return false; // Some error, nothing was changed. | 1471 return false; // Some error, nothing was changed. |
| 1492 | 1472 |
| 1493 sql::Statement masked(db_->GetUniqueStatement( | 1473 sql::Statement masked( |
| 1494 "DELETE FROM masked_credit_cards")); | 1474 db_->GetUniqueStatement("DELETE FROM masked_credit_cards")); |
| 1495 masked.Run(); | 1475 masked.Run(); |
| 1496 bool changed = db_->GetLastChangeCount() > 0; | 1476 bool changed = db_->GetLastChangeCount() > 0; |
| 1497 | 1477 |
| 1498 sql::Statement unmasked(db_->GetUniqueStatement( | 1478 sql::Statement unmasked( |
| 1499 "DELETE FROM unmasked_credit_cards")); | 1479 db_->GetUniqueStatement("DELETE FROM unmasked_credit_cards")); |
| 1500 unmasked.Run(); | 1480 unmasked.Run(); |
| 1501 changed |= db_->GetLastChangeCount() > 0; | 1481 changed |= db_->GetLastChangeCount() > 0; |
| 1502 | 1482 |
| 1503 sql::Statement addresses(db_->GetUniqueStatement( | 1483 sql::Statement addresses( |
| 1504 "DELETE FROM server_addresses")); | 1484 db_->GetUniqueStatement("DELETE FROM server_addresses")); |
| 1505 addresses.Run(); | 1485 addresses.Run(); |
| 1506 changed |= db_->GetLastChangeCount() > 0; | 1486 changed |= db_->GetLastChangeCount() > 0; |
| 1507 | 1487 |
| 1508 sql::Statement card_metadata(db_->GetUniqueStatement( | 1488 sql::Statement card_metadata( |
| 1509 "DELETE FROM server_card_metadata")); | 1489 db_->GetUniqueStatement("DELETE FROM server_card_metadata")); |
| 1510 card_metadata.Run(); | 1490 card_metadata.Run(); |
| 1511 changed |= db_->GetLastChangeCount() > 0; | 1491 changed |= db_->GetLastChangeCount() > 0; |
| 1512 | 1492 |
| 1513 sql::Statement address_metadata(db_->GetUniqueStatement( | 1493 sql::Statement address_metadata( |
| 1514 "DELETE FROM server_address_metadata")); | 1494 db_->GetUniqueStatement("DELETE FROM server_address_metadata")); |
| 1515 address_metadata.Run(); | 1495 address_metadata.Run(); |
| 1516 changed |= db_->GetLastChangeCount() > 0; | 1496 changed |= db_->GetLastChangeCount() > 0; |
| 1517 | 1497 |
| 1518 transaction.Commit(); | 1498 transaction.Commit(); |
| 1519 return changed; | 1499 return changed; |
| 1520 } | 1500 } |
| 1521 | 1501 |
| 1522 bool AutofillTable::UpdateCreditCard(const CreditCard& credit_card) { | 1502 bool AutofillTable::UpdateCreditCard(const CreditCard& credit_card) { |
| 1523 DCHECK(base::IsValidGUID(credit_card.guid())); | 1503 DCHECK(base::IsValidGUID(credit_card.guid())); |
| 1524 | 1504 |
| 1525 std::unique_ptr<CreditCard> old_credit_card = | 1505 std::unique_ptr<CreditCard> old_credit_card = |
| 1526 GetCreditCard(credit_card.guid()); | 1506 GetCreditCard(credit_card.guid()); |
| 1527 if (!old_credit_card) | 1507 if (!old_credit_card) |
| 1528 return false; | 1508 return false; |
| 1529 | 1509 |
| 1530 bool update_modification_date = *old_credit_card != credit_card; | 1510 bool update_modification_date = *old_credit_card != credit_card; |
| 1531 | 1511 |
| 1532 sql::Statement s(db_->GetUniqueStatement( | 1512 sql::Statement s(db_->GetUniqueStatement( |
| 1533 "UPDATE credit_cards " | 1513 "UPDATE credit_cards " |
| 1534 "SET guid=?, name_on_card=?, expiration_month=?," | 1514 "SET guid=?, name_on_card=?, expiration_month=?," |
| 1535 "expiration_year=?, card_number_encrypted=?, use_count=?, use_date=?," | 1515 "expiration_year=?, card_number_encrypted=?, use_count=?, use_date=?," |
| 1536 "date_modified=?, origin=?, billing_address_id=?" | 1516 "date_modified=?, origin=?, billing_address_id=?" |
| 1537 "WHERE guid=?1")); | 1517 "WHERE guid=?1")); |
| 1538 BindCreditCardToStatement(credit_card, | 1518 BindCreditCardToStatement(credit_card, |
| 1539 update_modification_date | 1519 update_modification_date |
| 1540 ? AutofillClock::Now() | 1520 ? AutofillClock::Now() |
| 1541 : old_credit_card->modification_date(), | 1521 : old_credit_card->modification_date(), |
| 1542 &s, *autofill_table_encryptor_); | 1522 &s, *autofill_table_encryptor_); |
| 1543 | 1523 |
| 1544 bool result = s.Run(); | 1524 bool result = s.Run(); |
| 1545 DCHECK_GT(db_->GetLastChangeCount(), 0); | 1525 DCHECK_GT(db_->GetLastChangeCount(), 0); |
| 1546 return result; | 1526 return result; |
| 1547 } | 1527 } |
| 1548 | 1528 |
| 1549 bool AutofillTable::RemoveCreditCard(const std::string& guid) { | 1529 bool AutofillTable::RemoveCreditCard(const std::string& guid) { |
| 1550 DCHECK(base::IsValidGUID(guid)); | 1530 DCHECK(base::IsValidGUID(guid)); |
| 1551 sql::Statement s(db_->GetUniqueStatement( | 1531 sql::Statement s( |
| 1552 "DELETE FROM credit_cards WHERE guid = ?")); | 1532 db_->GetUniqueStatement("DELETE FROM credit_cards WHERE guid = ?")); |
| 1553 s.BindString(0, guid); | 1533 s.BindString(0, guid); |
| 1554 | 1534 |
| 1555 return s.Run(); | 1535 return s.Run(); |
| 1556 } | 1536 } |
| 1557 | 1537 |
| 1558 bool AutofillTable::RemoveAutofillDataModifiedBetween( | 1538 bool AutofillTable::RemoveAutofillDataModifiedBetween( |
| 1559 const Time& delete_begin, | 1539 const base::Time& delete_begin, |
| 1560 const Time& delete_end, | 1540 const base::Time& delete_end, |
| 1561 std::vector<std::string>* profile_guids, | 1541 std::vector<std::string>* profile_guids, |
| 1562 std::vector<std::string>* credit_card_guids) { | 1542 std::vector<std::string>* credit_card_guids) { |
| 1563 DCHECK(delete_end.is_null() || delete_begin < delete_end); | 1543 DCHECK(delete_end.is_null() || delete_begin < delete_end); |
| 1564 | 1544 |
| 1565 time_t delete_begin_t = delete_begin.ToTimeT(); | 1545 time_t delete_begin_t = delete_begin.ToTimeT(); |
| 1566 time_t delete_end_t = GetEndTime(delete_end); | 1546 time_t delete_end_t = GetEndTime(delete_end); |
| 1567 | 1547 |
| 1568 // Remember Autofill profiles in the time range. | 1548 // Remember Autofill profiles in the time range. |
| 1569 sql::Statement s_profiles_get(db_->GetUniqueStatement( | 1549 sql::Statement s_profiles_get(db_->GetUniqueStatement( |
| 1570 "SELECT guid FROM autofill_profiles " | 1550 "SELECT guid FROM autofill_profiles " |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1608 // Remove Autofill credit cards in the time range. | 1588 // Remove Autofill credit cards in the time range. |
| 1609 sql::Statement s_credit_cards(db_->GetUniqueStatement( | 1589 sql::Statement s_credit_cards(db_->GetUniqueStatement( |
| 1610 "DELETE FROM credit_cards " | 1590 "DELETE FROM credit_cards " |
| 1611 "WHERE date_modified >= ? AND date_modified < ?")); | 1591 "WHERE date_modified >= ? AND date_modified < ?")); |
| 1612 s_credit_cards.BindInt64(0, delete_begin_t); | 1592 s_credit_cards.BindInt64(0, delete_begin_t); |
| 1613 s_credit_cards.BindInt64(1, delete_end_t); | 1593 s_credit_cards.BindInt64(1, delete_end_t); |
| 1614 if (!s_credit_cards.Run()) | 1594 if (!s_credit_cards.Run()) |
| 1615 return false; | 1595 return false; |
| 1616 | 1596 |
| 1617 // Remove unmasked credit cards in the time range. | 1597 // Remove unmasked credit cards in the time range. |
| 1618 sql::Statement s_unmasked_cards(db_->GetUniqueStatement( | 1598 sql::Statement s_unmasked_cards( |
| 1619 "DELETE FROM unmasked_credit_cards " | 1599 db_->GetUniqueStatement("DELETE FROM unmasked_credit_cards " |
| 1620 "WHERE unmask_date >= ? AND unmask_date < ?")); | 1600 "WHERE unmask_date >= ? AND unmask_date < ?")); |
| 1621 s_unmasked_cards.BindInt64(0, delete_begin.ToInternalValue()); | 1601 s_unmasked_cards.BindInt64(0, delete_begin.ToInternalValue()); |
| 1622 s_unmasked_cards.BindInt64(1, delete_end.ToInternalValue()); | 1602 s_unmasked_cards.BindInt64(1, delete_end.ToInternalValue()); |
| 1623 return s_unmasked_cards.Run(); | 1603 return s_unmasked_cards.Run(); |
| 1624 } | 1604 } |
| 1625 | 1605 |
| 1626 bool AutofillTable::RemoveOriginURLsModifiedBetween( | 1606 bool AutofillTable::RemoveOriginURLsModifiedBetween( |
| 1627 const Time& delete_begin, | 1607 const base::Time& delete_begin, |
| 1628 const Time& delete_end, | 1608 const base::Time& delete_end, |
| 1629 std::vector<std::unique_ptr<AutofillProfile>>* profiles) { | 1609 std::vector<std::unique_ptr<AutofillProfile>>* profiles) { |
| 1630 DCHECK(delete_end.is_null() || delete_begin < delete_end); | 1610 DCHECK(delete_end.is_null() || delete_begin < delete_end); |
| 1631 | 1611 |
| 1632 time_t delete_begin_t = delete_begin.ToTimeT(); | 1612 time_t delete_begin_t = delete_begin.ToTimeT(); |
| 1633 time_t delete_end_t = GetEndTime(delete_end); | 1613 time_t delete_end_t = GetEndTime(delete_end); |
| 1634 | 1614 |
| 1635 // Remember Autofill profiles with URL origins in the time range. | 1615 // Remember Autofill profiles with URL origins in the time range. |
| 1636 sql::Statement s_profiles_get(db_->GetUniqueStatement( | 1616 sql::Statement s_profiles_get(db_->GetUniqueStatement( |
| 1637 "SELECT guid, origin FROM autofill_profiles " | 1617 "SELECT guid, origin FROM autofill_profiles " |
| 1638 "WHERE date_modified >= ? AND date_modified < ?")); | 1618 "WHERE date_modified >= ? AND date_modified < ?")); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1690 return false; | 1670 return false; |
| 1691 } | 1671 } |
| 1692 | 1672 |
| 1693 return true; | 1673 return true; |
| 1694 } | 1674 } |
| 1695 | 1675 |
| 1696 bool AutofillTable::GetAutofillProfilesInTrash( | 1676 bool AutofillTable::GetAutofillProfilesInTrash( |
| 1697 std::vector<std::string>* guids) { | 1677 std::vector<std::string>* guids) { |
| 1698 guids->clear(); | 1678 guids->clear(); |
| 1699 | 1679 |
| 1700 sql::Statement s(db_->GetUniqueStatement( | 1680 sql::Statement s( |
| 1701 "SELECT guid " | 1681 db_->GetUniqueStatement("SELECT guid FROM autofill_profiles_trash")); |
| 1702 "FROM autofill_profiles_trash")); | |
| 1703 | 1682 |
| 1704 while (s.Step()) { | 1683 while (s.Step()) { |
| 1705 std::string guid = s.ColumnString(0); | 1684 std::string guid = s.ColumnString(0); |
| 1706 guids->push_back(guid); | 1685 guids->push_back(guid); |
| 1707 } | 1686 } |
| 1708 | 1687 |
| 1709 return s.Succeeded(); | 1688 return s.Succeeded(); |
| 1710 } | 1689 } |
| 1711 | 1690 |
| 1712 bool AutofillTable::EmptyAutofillProfilesTrash() { | 1691 bool AutofillTable::EmptyAutofillProfilesTrash() { |
| 1713 sql::Statement s(db_->GetUniqueStatement( | 1692 sql::Statement s( |
| 1714 "DELETE FROM autofill_profiles_trash")); | 1693 db_->GetUniqueStatement("DELETE FROM autofill_profiles_trash")); |
| 1715 | 1694 |
| 1716 return s.Run(); | 1695 return s.Run(); |
| 1717 } | 1696 } |
| 1718 | 1697 |
| 1719 | |
| 1720 bool AutofillTable::AddAutofillGUIDToTrash(const std::string& guid) { | 1698 bool AutofillTable::AddAutofillGUIDToTrash(const std::string& guid) { |
| 1721 sql::Statement s(db_->GetUniqueStatement( | 1699 sql::Statement s(db_->GetUniqueStatement( |
| 1722 "INSERT INTO autofill_profiles_trash" | 1700 "INSERT INTO autofill_profiles_trash (guid) VALUES (?)")); |
| 1723 " (guid) " | |
| 1724 "VALUES (?)")); | |
| 1725 s.BindString(0, guid); | 1701 s.BindString(0, guid); |
| 1726 | 1702 |
| 1727 return s.Run(); | 1703 return s.Run(); |
| 1728 } | 1704 } |
| 1729 | 1705 |
| 1730 bool AutofillTable::IsAutofillProfilesTrashEmpty() { | 1706 bool AutofillTable::IsAutofillProfilesTrashEmpty() { |
| 1731 sql::Statement s(db_->GetUniqueStatement( | 1707 sql::Statement s( |
| 1732 "SELECT guid " | 1708 db_->GetUniqueStatement("SELECT guid FROM autofill_profiles_trash")); |
| 1733 "FROM autofill_profiles_trash")); | |
| 1734 | 1709 |
| 1735 return !s.Step(); | 1710 return !s.Step(); |
| 1736 } | 1711 } |
| 1737 | 1712 |
| 1738 bool AutofillTable::IsAutofillGUIDInTrash(const std::string& guid) { | 1713 bool AutofillTable::IsAutofillGUIDInTrash(const std::string& guid) { |
| 1739 sql::Statement s(db_->GetUniqueStatement( | 1714 sql::Statement s(db_->GetUniqueStatement( |
| 1740 "SELECT guid " | 1715 "SELECT guid FROM autofill_profiles_trash WHERE guid = ?")); |
| 1741 "FROM autofill_profiles_trash " | |
| 1742 "WHERE guid = ?")); | |
| 1743 s.BindString(0, guid); | 1716 s.BindString(0, guid); |
| 1744 | 1717 |
| 1745 return s.Step(); | 1718 return s.Step(); |
| 1746 } | 1719 } |
| 1747 | 1720 |
| 1748 bool AutofillTable::GetAllSyncMetadata(syncer::ModelType model_type, | 1721 bool AutofillTable::GetAllSyncMetadata(syncer::ModelType model_type, |
| 1749 syncer::MetadataBatch* metadata_batch) { | 1722 syncer::MetadataBatch* metadata_batch) { |
| 1750 DCHECK_EQ(model_type, syncer::AUTOFILL) | 1723 DCHECK_EQ(model_type, syncer::AUTOFILL) |
| 1751 << "Only the AUTOFILL model type is supported"; | 1724 << "Only the AUTOFILL model type is supported"; |
| 1752 DCHECK(metadata_batch); | 1725 DCHECK(metadata_batch); |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1865 "name VARCHAR, " | 1838 "name VARCHAR, " |
| 1866 "value VARCHAR, " | 1839 "value VARCHAR, " |
| 1867 "value_lower VARCHAR, " | 1840 "value_lower VARCHAR, " |
| 1868 "date_created INTEGER DEFAULT 0, " | 1841 "date_created INTEGER DEFAULT 0, " |
| 1869 "date_last_used INTEGER DEFAULT 0, " | 1842 "date_last_used INTEGER DEFAULT 0, " |
| 1870 "count INTEGER DEFAULT 1, " | 1843 "count INTEGER DEFAULT 1, " |
| 1871 "PRIMARY KEY (name, value))") || | 1844 "PRIMARY KEY (name, value))") || |
| 1872 !db_->Execute("CREATE INDEX autofill_name ON autofill (name)") || | 1845 !db_->Execute("CREATE INDEX autofill_name ON autofill (name)") || |
| 1873 !db_->Execute("CREATE INDEX autofill_name_value_lower ON " | 1846 !db_->Execute("CREATE INDEX autofill_name_value_lower ON " |
| 1874 "autofill (name, value_lower)")) { | 1847 "autofill (name, value_lower)")) { |
| 1875 NOTREACHED(); | 1848 NOTREACHED(); |
| 1876 return false; | 1849 return false; |
| 1877 } | 1850 } |
| 1878 } | 1851 } |
| 1879 return true; | 1852 return true; |
| 1880 } | 1853 } |
| 1881 | 1854 |
| 1882 bool AutofillTable::InitCreditCardsTable() { | 1855 bool AutofillTable::InitCreditCardsTable() { |
| 1883 if (!db_->DoesTableExist("credit_cards")) { | 1856 if (!db_->DoesTableExist("credit_cards")) { |
| 1884 if (!db_->Execute("CREATE TABLE credit_cards ( " | 1857 if (!db_->Execute("CREATE TABLE credit_cards ( " |
| 1885 "guid VARCHAR PRIMARY KEY, " | 1858 "guid VARCHAR PRIMARY KEY, " |
| 1886 "name_on_card VARCHAR, " | 1859 "name_on_card VARCHAR, " |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1973 } | 1946 } |
| 1974 return true; | 1947 return true; |
| 1975 } | 1948 } |
| 1976 | 1949 |
| 1977 bool AutofillTable::InitMaskedCreditCardsTable() { | 1950 bool AutofillTable::InitMaskedCreditCardsTable() { |
| 1978 if (!db_->DoesTableExist("masked_credit_cards")) { | 1951 if (!db_->DoesTableExist("masked_credit_cards")) { |
| 1979 if (!db_->Execute("CREATE TABLE masked_credit_cards (" | 1952 if (!db_->Execute("CREATE TABLE masked_credit_cards (" |
| 1980 "id VARCHAR," | 1953 "id VARCHAR," |
| 1981 "status VARCHAR," | 1954 "status VARCHAR," |
| 1982 "name_on_card VARCHAR," | 1955 "name_on_card VARCHAR," |
| 1983 "type VARCHAR," | 1956 "network VARCHAR," |
| 1984 "last_four VARCHAR," | 1957 "last_four VARCHAR," |
| 1985 "exp_month INTEGER DEFAULT 0," | 1958 "exp_month INTEGER DEFAULT 0," |
| 1986 "exp_year INTEGER DEFAULT 0)")) { | 1959 "exp_year INTEGER DEFAULT 0)")) { |
| 1987 NOTREACHED(); | 1960 NOTREACHED(); |
| 1988 return false; | 1961 return false; |
| 1989 } | 1962 } |
| 1990 } | 1963 } |
| 1991 return true; | 1964 return true; |
| 1992 } | 1965 } |
| 1993 | 1966 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2028 "id VARCHAR," | 2001 "id VARCHAR," |
| 2029 "company_name VARCHAR," | 2002 "company_name VARCHAR," |
| 2030 "street_address VARCHAR," | 2003 "street_address VARCHAR," |
| 2031 "address_1 VARCHAR," | 2004 "address_1 VARCHAR," |
| 2032 "address_2 VARCHAR," | 2005 "address_2 VARCHAR," |
| 2033 "address_3 VARCHAR," | 2006 "address_3 VARCHAR," |
| 2034 "address_4 VARCHAR," | 2007 "address_4 VARCHAR," |
| 2035 "postal_code VARCHAR," | 2008 "postal_code VARCHAR," |
| 2036 "sorting_code VARCHAR," | 2009 "sorting_code VARCHAR," |
| 2037 "country_code VARCHAR," | 2010 "country_code VARCHAR," |
| 2038 "language_code VARCHAR, " // Space required. | 2011 "language_code VARCHAR, " // Space required. |
| 2039 "recipient_name VARCHAR, " // Ditto. | 2012 "recipient_name VARCHAR, " // Ditto. |
| 2040 "phone_number VARCHAR)")) { | 2013 "phone_number VARCHAR)")) { |
| 2041 NOTREACHED(); | 2014 NOTREACHED(); |
| 2042 return false; | 2015 return false; |
| 2043 } | 2016 } |
| 2044 } | 2017 } |
| 2045 return true; | 2018 return true; |
| 2046 } | 2019 } |
| 2047 | 2020 |
| 2048 bool AutofillTable::InitServerAddressMetadataTable() { | 2021 bool AutofillTable::InitServerAddressMetadataTable() { |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2236 return false; | 2209 return false; |
| 2237 } | 2210 } |
| 2238 | 2211 |
| 2239 // Create indices on the new table, for fast lookups. | 2212 // Create indices on the new table, for fast lookups. |
| 2240 if (!db_->Execute("CREATE INDEX autofill_name ON autofill (name)") || | 2213 if (!db_->Execute("CREATE INDEX autofill_name ON autofill (name)") || |
| 2241 !db_->Execute("CREATE INDEX autofill_name_value_lower ON " | 2214 !db_->Execute("CREATE INDEX autofill_name_value_lower ON " |
| 2242 "autofill (name, value_lower)")) { | 2215 "autofill (name, value_lower)")) { |
| 2243 return false; | 2216 return false; |
| 2244 } | 2217 } |
| 2245 | 2218 |
| 2246 | |
| 2247 return transaction.Commit(); | 2219 return transaction.Commit(); |
| 2248 } | 2220 } |
| 2249 | 2221 |
| 2250 bool AutofillTable::MigrateToVersion56AddProfileLanguageCodeForFormatting() { | 2222 bool AutofillTable::MigrateToVersion56AddProfileLanguageCodeForFormatting() { |
| 2251 return db_->Execute("ALTER TABLE autofill_profiles " | 2223 return db_->Execute( |
| 2252 "ADD COLUMN language_code VARCHAR"); | 2224 "ALTER TABLE autofill_profiles ADD COLUMN language_code VARCHAR"); |
| 2253 } | 2225 } |
| 2254 | 2226 |
| 2255 bool AutofillTable::MigrateToVersion57AddFullNameField() { | 2227 bool AutofillTable::MigrateToVersion57AddFullNameField() { |
| 2256 return db_->Execute("ALTER TABLE autofill_profile_names " | 2228 return db_->Execute( |
| 2257 "ADD COLUMN full_name VARCHAR"); | 2229 "ALTER TABLE autofill_profile_names ADD COLUMN full_name VARCHAR"); |
| 2258 } | 2230 } |
| 2259 | 2231 |
| 2260 bool AutofillTable::MigrateToVersion60AddServerCards() { | 2232 bool AutofillTable::MigrateToVersion60AddServerCards() { |
| 2261 sql::Transaction transaction(db_); | 2233 sql::Transaction transaction(db_); |
| 2262 if (!transaction.Begin()) | 2234 if (!transaction.Begin()) |
| 2263 return false; | 2235 return false; |
| 2264 | 2236 |
| 2265 if (!db_->DoesTableExist("masked_credit_cards") && | 2237 if (!db_->DoesTableExist("masked_credit_cards") && |
| 2266 !db_->Execute("CREATE TABLE masked_credit_cards (" | 2238 !db_->Execute("CREATE TABLE masked_credit_cards (" |
| 2267 "id VARCHAR," | 2239 "id VARCHAR," |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2411 !db_->Execute("CREATE TABLE server_address_metadata (" | 2383 !db_->Execute("CREATE TABLE server_address_metadata (" |
| 2412 "id VARCHAR NOT NULL," | 2384 "id VARCHAR NOT NULL," |
| 2413 "use_count INTEGER NOT NULL DEFAULT 0, " | 2385 "use_count INTEGER NOT NULL DEFAULT 0, " |
| 2414 "use_date INTEGER NOT NULL DEFAULT 0)")) { | 2386 "use_date INTEGER NOT NULL DEFAULT 0)")) { |
| 2415 return false; | 2387 return false; |
| 2416 } | 2388 } |
| 2417 | 2389 |
| 2418 // Get existing server addresses and generate IDs for them. | 2390 // Get existing server addresses and generate IDs for them. |
| 2419 sql::Statement s(db_->GetUniqueStatement( | 2391 sql::Statement s(db_->GetUniqueStatement( |
| 2420 "SELECT " | 2392 "SELECT " |
| 2421 "id," | 2393 "id," |
| 2422 "recipient_name," | 2394 "recipient_name," |
| 2423 "company_name," | 2395 "company_name," |
| 2424 "street_address," | 2396 "street_address," |
| 2425 "address_1," // ADDRESS_HOME_STATE | 2397 "address_1," // ADDRESS_HOME_STATE |
| 2426 "address_2," // ADDRESS_HOME_CITY | 2398 "address_2," // ADDRESS_HOME_CITY |
| 2427 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY | 2399 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY |
| 2428 "address_4," // Not supported in AutofillProfile yet. | 2400 "address_4," // Not supported in AutofillProfile yet. |
| 2429 "postal_code," // ADDRESS_HOME_ZIP | 2401 "postal_code," // ADDRESS_HOME_ZIP |
| 2430 "sorting_code," // ADDRESS_HOME_SORTING_CODE | 2402 "sorting_code," // ADDRESS_HOME_SORTING_CODE |
| 2431 "country_code," // ADDRESS_HOME_COUNTRY | 2403 "country_code," // ADDRESS_HOME_COUNTRY |
| 2432 "phone_number," // PHONE_HOME_WHOLE_NUMBER | 2404 "phone_number," // PHONE_HOME_WHOLE_NUMBER |
| 2433 "language_code " | 2405 "language_code " |
| 2434 "FROM server_addresses addresses")); | 2406 "FROM server_addresses addresses")); |
| 2435 std::vector<AutofillProfile> profiles; | 2407 std::vector<AutofillProfile> profiles; |
| 2436 while (s.Step()) { | 2408 while (s.Step()) { |
| 2437 int index = 0; | 2409 int index = 0; |
| 2438 AutofillProfile profile( | 2410 AutofillProfile profile(AutofillProfile::SERVER_PROFILE, |
| 2439 AutofillProfile::SERVER_PROFILE, s.ColumnString(index++)); | 2411 s.ColumnString(index++)); |
| 2440 | 2412 |
| 2441 base::string16 recipient_name = s.ColumnString16(index++); | 2413 base::string16 recipient_name = s.ColumnString16(index++); |
| 2442 profile.SetRawInfo(COMPANY_NAME, s.ColumnString16(index++)); | 2414 profile.SetRawInfo(COMPANY_NAME, s.ColumnString16(index++)); |
| 2443 profile.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, s.ColumnString16(index++)); | 2415 profile.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, s.ColumnString16(index++)); |
| 2444 profile.SetRawInfo(ADDRESS_HOME_STATE, s.ColumnString16(index++)); | 2416 profile.SetRawInfo(ADDRESS_HOME_STATE, s.ColumnString16(index++)); |
| 2445 profile.SetRawInfo(ADDRESS_HOME_CITY, s.ColumnString16(index++)); | 2417 profile.SetRawInfo(ADDRESS_HOME_CITY, s.ColumnString16(index++)); |
| 2446 profile.SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, | 2418 profile.SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY, |
| 2447 s.ColumnString16(index++)); | 2419 s.ColumnString16(index++)); |
| 2448 index++; // Skip address_4 which we haven't added to AutofillProfile yet. | 2420 index++; // Skip address_4 which we haven't added to AutofillProfile yet. |
| 2449 profile.SetRawInfo(ADDRESS_HOME_ZIP, s.ColumnString16(index++)); | 2421 profile.SetRawInfo(ADDRESS_HOME_ZIP, s.ColumnString16(index++)); |
| 2450 profile.SetRawInfo(ADDRESS_HOME_SORTING_CODE, s.ColumnString16(index++)); | 2422 profile.SetRawInfo(ADDRESS_HOME_SORTING_CODE, s.ColumnString16(index++)); |
| 2451 profile.SetRawInfo(ADDRESS_HOME_COUNTRY, s.ColumnString16(index++)); | 2423 profile.SetRawInfo(ADDRESS_HOME_COUNTRY, s.ColumnString16(index++)); |
| 2452 base::string16 phone_number = s.ColumnString16(index++); | 2424 base::string16 phone_number = s.ColumnString16(index++); |
| 2453 profile.set_language_code(s.ColumnString(index++)); | 2425 profile.set_language_code(s.ColumnString(index++)); |
| 2454 profile.SetInfo(AutofillType(NAME_FULL), recipient_name, | 2426 profile.SetInfo(AutofillType(NAME_FULL), recipient_name, |
| 2455 profile.language_code()); | 2427 profile.language_code()); |
| 2456 profile.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER), phone_number, | 2428 profile.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER), phone_number, |
| 2457 profile.language_code()); | 2429 profile.language_code()); |
| 2458 profile.GenerateServerProfileIdentifier(); | 2430 profile.GenerateServerProfileIdentifier(); |
| 2459 profiles.push_back(profile); | 2431 profiles.push_back(profile); |
| 2460 } | 2432 } |
| 2461 | 2433 |
| 2462 // Reinsert with the generated IDs. | 2434 // Reinsert with the generated IDs. |
| 2463 sql::Statement delete_old(db_->GetUniqueStatement( | 2435 sql::Statement delete_old( |
| 2464 "DELETE FROM server_addresses")); | 2436 db_->GetUniqueStatement("DELETE FROM server_addresses")); |
| 2465 delete_old.Run(); | 2437 delete_old.Run(); |
| 2466 | 2438 |
| 2467 sql::Statement insert(db_->GetUniqueStatement( | 2439 sql::Statement insert(db_->GetUniqueStatement( |
| 2468 "INSERT INTO server_addresses(" | 2440 "INSERT INTO server_addresses(" |
| 2469 "id," | 2441 "id," |
| 2470 "recipient_name," | 2442 "recipient_name," |
| 2471 "company_name," | 2443 "company_name," |
| 2472 "street_address," | 2444 "street_address," |
| 2473 "address_1," // ADDRESS_HOME_STATE | 2445 "address_1," // ADDRESS_HOME_STATE |
| 2474 "address_2," // ADDRESS_HOME_CITY | 2446 "address_2," // ADDRESS_HOME_CITY |
| 2475 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY | 2447 "address_3," // ADDRESS_HOME_DEPENDENT_LOCALITY |
| 2476 "address_4," // Not supported in AutofillProfile yet. | 2448 "address_4," // Not supported in AutofillProfile yet. |
| 2477 "postal_code," // ADDRESS_HOME_ZIP | 2449 "postal_code," // ADDRESS_HOME_ZIP |
| 2478 "sorting_code," // ADDRESS_HOME_SORTING_CODE | 2450 "sorting_code," // ADDRESS_HOME_SORTING_CODE |
| 2479 "country_code," // ADDRESS_HOME_COUNTRY | 2451 "country_code," // ADDRESS_HOME_COUNTRY |
| 2480 "phone_number," // PHONE_HOME_WHOLE_NUMBER | 2452 "phone_number," // PHONE_HOME_WHOLE_NUMBER |
| 2481 "language_code) " | 2453 "language_code) " |
| 2482 "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)")); | 2454 "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)")); |
| 2483 for (const AutofillProfile& profile : profiles) { | 2455 for (const AutofillProfile& profile : profiles) { |
| 2484 int index = 0; | 2456 int index = 0; |
| 2485 insert.BindString(index++, profile.server_id()); | 2457 insert.BindString(index++, profile.server_id()); |
| 2486 insert.BindString16(index++, profile.GetRawInfo(NAME_FULL)); | 2458 insert.BindString16(index++, profile.GetRawInfo(NAME_FULL)); |
| 2487 insert.BindString16(index++, profile.GetRawInfo(COMPANY_NAME)); | 2459 insert.BindString16(index++, profile.GetRawInfo(COMPANY_NAME)); |
| 2488 insert.BindString16(index++, | 2460 insert.BindString16(index++, |
| 2489 profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); | 2461 profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); |
| 2490 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_STATE)); | 2462 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_STATE)); |
| 2491 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_CITY)); | 2463 insert.BindString16(index++, profile.GetRawInfo(ADDRESS_HOME_CITY)); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2552 // Copy over the billing_address_id from the masked_server_cards to | 2524 // Copy over the billing_address_id from the masked_server_cards to |
| 2553 // server_card_metadata. | 2525 // server_card_metadata. |
| 2554 if (!db_->Execute("UPDATE server_card_metadata " | 2526 if (!db_->Execute("UPDATE server_card_metadata " |
| 2555 "SET billing_address_id = " | 2527 "SET billing_address_id = " |
| 2556 "(SELECT billing_address_id " | 2528 "(SELECT billing_address_id " |
| 2557 "FROM masked_credit_cards " | 2529 "FROM masked_credit_cards " |
| 2558 "WHERE id = server_card_metadata.id)")) { | 2530 "WHERE id = server_card_metadata.id)")) { |
| 2559 return false; | 2531 return false; |
| 2560 } | 2532 } |
| 2561 | 2533 |
| 2534 if (db_->DoesTableExist("masked_credit_cards_temp") && |
| 2535 !db_->Execute("DROP TABLE masked_credit_cards_temp")) { |
| 2536 return false; |
| 2537 } |
| 2538 |
| 2562 // Remove the billing_address_id column from the masked_credit_cards table. | 2539 // Remove the billing_address_id column from the masked_credit_cards table. |
| 2563 // Create a temporary table that is a copy of masked_credit_cards but without | 2540 // Create a temporary table that is a copy of masked_credit_cards but without |
| 2564 // the billing_address_id column. | 2541 // the billing_address_id column. |
| 2565 if (db_->DoesTableExist("masked_credit_cards_temp") || | 2542 if (!db_->Execute("CREATE TABLE masked_credit_cards_temp (" |
| 2566 !db_->Execute("CREATE TABLE masked_credit_cards_temp (" | |
| 2567 "id VARCHAR," | 2543 "id VARCHAR," |
| 2568 "status VARCHAR," | 2544 "status VARCHAR," |
| 2569 "name_on_card VARCHAR," | 2545 "name_on_card VARCHAR," |
| 2570 "type VARCHAR," | 2546 "type VARCHAR," |
| 2571 "last_four VARCHAR," | 2547 "last_four VARCHAR," |
| 2572 "exp_month INTEGER DEFAULT 0," | 2548 "exp_month INTEGER DEFAULT 0," |
| 2573 "exp_year INTEGER DEFAULT 0)")) { | 2549 "exp_year INTEGER DEFAULT 0)")) { |
| 2574 return false; | 2550 return false; |
| 2575 } | 2551 } |
| 2576 // Copy over the data from the original masked_credit_cards table. | 2552 // Copy over the data from the original masked_credit_cards table. |
| 2577 if (!db_->Execute("INSERT INTO masked_credit_cards_temp " | 2553 if (!db_->Execute("INSERT INTO masked_credit_cards_temp " |
| 2578 "SELECT id, status, name_on_card, type, last_four, " | 2554 "SELECT id, status, name_on_card, type, last_four, " |
| 2579 "exp_month, exp_year " | 2555 "exp_month, exp_year " |
| 2580 "FROM masked_credit_cards")) { | 2556 "FROM masked_credit_cards")) { |
| 2581 return false; | 2557 return false; |
| 2582 } | 2558 } |
| 2583 // Delete the existing table and replace it with the contents of the | 2559 // Delete the existing table and replace it with the contents of the |
| 2584 // temporary table. | 2560 // temporary table. |
| 2585 if (!db_->Execute("DROP TABLE masked_credit_cards") || | 2561 if (!db_->Execute("DROP TABLE masked_credit_cards") || |
| 2586 !db_->Execute("ALTER TABLE masked_credit_cards_temp " | 2562 !db_->Execute("ALTER TABLE masked_credit_cards_temp " |
| 2587 "RENAME TO masked_credit_cards")) { | 2563 "RENAME TO masked_credit_cards")) { |
| 2588 return false; | 2564 return false; |
| 2589 } | 2565 } |
| 2590 | 2566 |
| 2591 return transaction.Commit(); | 2567 return transaction.Commit(); |
| 2592 } | 2568 } |
| 2593 | 2569 |
| 2570 bool AutofillTable::MigrateToVersion72RenameCardTypeToIssuerNetwork() { |
| 2571 sql::Transaction transaction(db_); |
| 2572 if (!transaction.Begin()) |
| 2573 return false; |
| 2574 |
| 2575 if (db_->DoesTableExist("masked_credit_cards_temp") && |
| 2576 !db_->Execute("DROP TABLE masked_credit_cards_temp")) { |
| 2577 return false; |
| 2578 } |
| 2579 |
| 2580 return db_->Execute( |
| 2581 "CREATE TABLE masked_credit_cards_temp (" |
| 2582 "id VARCHAR," |
| 2583 "status VARCHAR," |
| 2584 "name_on_card VARCHAR," |
| 2585 "network VARCHAR," |
| 2586 "last_four VARCHAR," |
| 2587 "exp_month INTEGER DEFAULT 0," |
| 2588 "exp_year INTEGER DEFAULT 0)") && |
| 2589 db_->Execute( |
| 2590 "INSERT INTO masked_credit_cards_temp (" |
| 2591 "id, status, name_on_card, network, last_four, exp_month, exp_year" |
| 2592 ") SELECT " |
| 2593 "id, status, name_on_card, type, last_four, exp_month, exp_year" |
| 2594 " FROM masked_credit_cards") && |
| 2595 db_->Execute("DROP TABLE masked_credit_cards") && |
| 2596 db_->Execute( |
| 2597 "ALTER TABLE masked_credit_cards_temp " |
| 2598 "RENAME TO masked_credit_cards") && |
| 2599 transaction.Commit(); |
| 2600 } |
| 2601 |
| 2594 } // namespace autofill | 2602 } // namespace autofill |
| OLD | NEW |