1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/webdata/autofill_table.h" 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <algorithm> 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <limits> 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <map> 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <set> 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <string> 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <vector> 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "app/sql/statement.h" 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/logging.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/string_number_conversions.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/time.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/tuple.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/autofill_country.h" 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/autofill_profile.h" 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/autofill_type.h" 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/credit_card.h" 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/autofill/personal_data_manager.h" 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/password_manager/encryptor.h" 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/webdata/autofill_change.h" 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/guid.h" 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/l10n/l10n_util.h" 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "webkit/glue/form_field.h" 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing base::Time; 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenusing webkit_glue::FormField; 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace { 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Constants for the |autofill_profile_phones| |type| column. 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenenum AutofillPhoneType { 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen kAutofillPhoneNumber = 0, 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen kAutofillFaxNumber = 1 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsentypedef std::vector<Tuple3<int64, string16, string16> > AutofillElementList; 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// TODO(dhollowa): Find a common place for this. It is duplicated in 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// personal_data_manager.cc. 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsentemplate<typename T> 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenT* address_of(T& v) { 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return &v; 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The maximum length allowed for form data. 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst size_t kMaxDataLength = 1024; 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstring16 LimitDataSize(const string16& data) { 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (data.size() > kMaxDataLength) 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return data.substr(0, kMaxDataLength); 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return data; 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid BindAutofillProfileToStatement(const AutofillProfile& profile, 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement* s) { 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(guid::IsValidGUID(profile.guid())); 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindString(0, profile.guid()); 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 text = profile.GetInfo(COMPANY_NAME); 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindString16(1, LimitDataSize(text)); 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen text = profile.GetInfo(ADDRESS_HOME_LINE1); 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindString16(2, LimitDataSize(text)); 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen text = profile.GetInfo(ADDRESS_HOME_LINE2); 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindString16(3, LimitDataSize(text)); 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen text = profile.GetInfo(ADDRESS_HOME_CITY); 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindString16(4, LimitDataSize(text)); 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen text = profile.GetInfo(ADDRESS_HOME_STATE); 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindString16(5, LimitDataSize(text)); 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen text = profile.GetInfo(ADDRESS_HOME_ZIP); 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindString16(6, LimitDataSize(text)); 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen text = profile.GetInfo(ADDRESS_HOME_COUNTRY); 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindString16(7, LimitDataSize(text)); 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string country_code = profile.CountryCode(); 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindString(8, country_code); 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindInt64(9, Time::Now().ToTimeT()); 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenAutofillProfile* AutofillProfileFromStatement(const sql::Statement& s) { 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* profile = new AutofillProfile; 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->set_guid(s.ColumnString(0)); 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(guid::IsValidGUID(profile->guid())); 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetInfo(COMPANY_NAME, s.ColumnString16(1)); 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetInfo(ADDRESS_HOME_LINE1, s.ColumnString16(2)); 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetInfo(ADDRESS_HOME_LINE2, s.ColumnString16(3)); 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetInfo(ADDRESS_HOME_CITY, s.ColumnString16(4)); 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetInfo(ADDRESS_HOME_STATE, s.ColumnString16(5)); 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetInfo(ADDRESS_HOME_ZIP, s.ColumnString16(6)); 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Intentionally skip column 7, which stores the localized country name. 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetCountryCode(s.ColumnString(8)); 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Intentionally skip column 9, which stores the profile's modification date. 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return profile; 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid BindCreditCardToStatement(const CreditCard& credit_card, 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement* s) { 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(guid::IsValidGUID(credit_card.guid())); 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindString(0, credit_card.guid()); 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 text = credit_card.GetInfo(CREDIT_CARD_NAME); 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindString16(1, LimitDataSize(text)); 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen text = credit_card.GetInfo(CREDIT_CARD_EXP_MONTH); 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindString16(2, LimitDataSize(text)); 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen text = credit_card.GetInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR); 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindString16(3, LimitDataSize(text)); 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen text = credit_card.GetInfo(CREDIT_CARD_NUMBER); 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string encrypted_data; 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Encryptor::EncryptString16(text, &encrypted_data); 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindBlob(4, encrypted_data.data(), 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<int>(encrypted_data.length())); 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s->BindInt64(5, Time::Now().ToTimeT()); 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenCreditCard* CreditCardFromStatement(const sql::Statement& s) { 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreditCard* credit_card = new CreditCard; 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen credit_card->set_guid(s.ColumnString(0)); 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(guid::IsValidGUID(credit_card->guid())); 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen credit_card->SetInfo(CREDIT_CARD_NAME, s.ColumnString16(1)); 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen credit_card->SetInfo(CREDIT_CARD_EXP_MONTH, 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.ColumnString16(2)); 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen credit_card->SetInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.ColumnString16(3)); 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int encrypted_number_len = s.ColumnByteLength(4); 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 credit_card_number; 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (encrypted_number_len) { 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string encrypted_number; 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen encrypted_number.resize(encrypted_number_len); 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen memcpy(&encrypted_number[0], s.ColumnBlob(4), encrypted_number_len); 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Encryptor::DecryptString16(encrypted_number, &credit_card_number); 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen credit_card->SetInfo(CREDIT_CARD_NUMBER, credit_card_number); 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Intentionally skip column 5, which stores the modification date. 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return credit_card; 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AddAutofillProfileNamesToProfile(sql::Connection* db, 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* profile) { 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db->GetUniqueStatement( 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid, first_name, middle_name, last_name " 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profile_names " 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE guid=?")); 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, profile->guid()); 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16> first_names; 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16> middle_names; 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16> last_names; 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK_EQ(profile->guid(), s.ColumnString(0)); 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen first_names.push_back(s.ColumnString16(1)); 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen middle_names.push_back(s.ColumnString16(2)); 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen last_names.push_back(s.ColumnString16(3)); 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetMultiInfo(NAME_FIRST, first_names); 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetMultiInfo(NAME_MIDDLE, middle_names); 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetMultiInfo(NAME_LAST, last_names); 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AddAutofillProfileEmailsToProfile(sql::Connection* db, 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* profile) { 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db->GetUniqueStatement( 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid, email " 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profile_emails " 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE guid=?")); 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, profile->guid()); 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16> emails; 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK_EQ(profile->guid(), s.ColumnString(0)); 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen emails.push_back(s.ColumnString16(1)); 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetMultiInfo(EMAIL_ADDRESS, emails); 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AddAutofillProfilePhonesToProfile(sql::Connection* db, 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* profile) { 196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db->GetUniqueStatement( 197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid, type, number " 198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profile_phones " 199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE guid=? AND type=?")); 200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, profile->guid()); 205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt(1, kAutofillPhoneNumber); 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16> numbers; 208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK_EQ(profile->guid(), s.ColumnString(0)); 210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen numbers.push_back(s.ColumnString16(2)); 211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetMultiInfo(PHONE_HOME_WHOLE_NUMBER, numbers); 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AddAutofillProfileFaxesToProfile(sql::Connection* db, 217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* profile) { 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db->GetUniqueStatement( 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid, type, number " 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profile_phones " 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE guid=? AND type=?")); 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, profile->guid()); 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt(1, kAutofillFaxNumber); 228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16> numbers; 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK_EQ(profile->guid(), s.ColumnString(0)); 232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen numbers.push_back(s.ColumnString16(2)); 233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile->SetMultiInfo(PHONE_FAX_WHOLE_NUMBER, numbers); 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AddAutofillProfileNames(const AutofillProfile& profile, 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Connection* db) { 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16> first_names; 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.GetMultiInfo(NAME_FIRST, &first_names); 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16> middle_names; 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.GetMultiInfo(NAME_MIDDLE, &middle_names); 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16> last_names; 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.GetMultiInfo(NAME_LAST, &last_names); 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK_EQ(first_names.size(), middle_names.size()); 248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK_EQ(middle_names.size(), last_names.size()); 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < first_names.size(); ++i) { 251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add the new name. 252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db->GetUniqueStatement( 253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT INTO autofill_profile_names" 254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " (guid, first_name, middle_name, last_name) " 255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "VALUES (?,?,?,?)")); 256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, profile.guid()); 261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(1, first_names[i]); 262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(2, middle_names[i]); 263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(3, last_names[i]); 264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) { 266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AddAutofillProfileEmails(const AutofillProfile& profile, 274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Connection* db) { 275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16> emails; 276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.GetMultiInfo(EMAIL_ADDRESS, &emails); 277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < emails.size(); ++i) { 279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add the new email. 280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db->GetUniqueStatement( 281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT INTO autofill_profile_emails" 282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " (guid, email) " 283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "VALUES (?,?)")); 284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, profile.guid()); 289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(1, emails[i]); 290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) { 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AddAutofillProfilePhones(const AutofillProfile& profile, 300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillPhoneType phone_type, 301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Connection* db) { 302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillFieldType field_type; 303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (phone_type == kAutofillPhoneNumber) { 304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen field_type = PHONE_HOME_WHOLE_NUMBER; 305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else if (phone_type == kAutofillFaxNumber) { 306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen field_type = PHONE_FAX_WHOLE_NUMBER; 307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16> numbers; 313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.GetMultiInfo(field_type, &numbers); 314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < numbers.size(); ++i) { 316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add the new number. 317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db->GetUniqueStatement( 318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT INTO autofill_profile_phones" 319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " (guid, type, number) " 320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "VALUES (?,?,?)")); 321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, profile.guid()); 326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt(1, phone_type); 327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(2, numbers[i]); 328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) { 330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AddAutofillProfilePieces(const AutofillProfile& profile, 338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Connection* db) { 339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!AddAutofillProfileNames(profile, db)) 340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!AddAutofillProfileEmails(profile, db)) 343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!AddAutofillProfilePhones(profile, kAutofillPhoneNumber, db)) 346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!AddAutofillProfilePhones(profile, kAutofillFaxNumber, db)) 349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool RemoveAutofillProfilePieces(const std::string& guid, sql::Connection* db) { 355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s1(db->GetUniqueStatement( 356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM autofill_profile_names WHERE guid = ?")); 357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s1) { 358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s1.BindString(0, guid); 363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s1.Run()) 364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s2(db->GetUniqueStatement( 367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM autofill_profile_emails WHERE guid = ?")); 368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s2) { 369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s2.BindString(0, guid); 374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s2.Run()) 375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s3(db->GetUniqueStatement( 378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM autofill_profile_phones WHERE guid = ?")); 379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s3) { 380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s3.BindString(0, guid); 385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s3.Run(); 386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace 389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::Init() { 391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return (InitMainTable() && InitCreditCardsTable() && InitDatesTable() && 392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen InitProfilesTable() && InitProfileNamesTable() && 393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen InitProfileEmailsTable() && InitProfilePhonesTable() && 394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen InitProfileTrashTable()); 395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::IsSyncable() { 398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::AddFormFieldValues(const std::vector<FormField>& elements, 402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillChange>* changes) { 403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return AddFormFieldValuesTime(elements, changes, Time::Now()); 404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::AddFormFieldValue(const FormField& element, 407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillChange>* changes) { 408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return AddFormFieldValueTime(element, changes, base::Time::Now()); 409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::GetFormValuesForElementName(const string16& name, 412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const string16& prefix, 413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16>* values, 414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int limit) { 415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(values); 416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s; 417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (prefix.empty()) { 419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.Assign(db_->GetUniqueStatement( 420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT value FROM autofill " 421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE name = ? " 422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "ORDER BY count DESC " 423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "LIMIT ?")); 424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(0, name); 430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt(1, limit); 431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 prefix_lower = l10n_util::ToLower(prefix); 433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 next_prefix = prefix_lower; 434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen next_prefix[next_prefix.length() - 1]++; 435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.Assign(db_->GetUniqueStatement( 437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT value FROM autofill " 438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE name = ? AND " 439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "value_lower >= ? AND " 440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "value_lower < ? " 441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "ORDER BY count DESC " 442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "LIMIT ?")); 443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(0, name); 449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(1, prefix_lower); 450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(2, next_prefix); 451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt(3, limit); 452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen values->clear(); 455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) 456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen values->push_back(s.ColumnString16(0)); 457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Succeeded(); 458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::RemoveFormElementsAddedBetween( 461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time delete_begin, 462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time delete_end, 463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillChange>* changes) { 464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(changes); 465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Query for the pair_id, name, and value of all form elements that 466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // were used between the given times. 467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT DISTINCT a.pair_id, a.name, a.value " 469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_dates ad JOIN autofill a ON ad.pair_id = a.pair_id " 470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE ad.date_created >= ? AND ad.date_created < ?")); 471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement 1 prepare failed"; 473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt64(0, delete_begin.ToTimeT()); 476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt64(1, 477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete_end.is_null() ? 478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::numeric_limits<int64>::max() : 479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete_end.ToTimeT()); 480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillElementList elements; 482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen elements.push_back(MakeTuple(s.ColumnInt64(0), 484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.ColumnString16(1), 485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.ColumnString16(2))); 486ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Succeeded()) { 489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 490ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 492ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 493ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (AutofillElementList::iterator itr = elements.begin(); 494ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen itr != elements.end(); itr++) { 495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int how_many = 0; 496ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!RemoveFormElementForTimeRange(itr->a, delete_begin, delete_end, 497ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &how_many)) { 498ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 499ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool was_removed = false; 501ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!AddToCountOfFormElement(itr->a, -how_many, &was_removed)) 502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillChange::Type change_type = 504ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen was_removed ? AutofillChange::REMOVE : AutofillChange::UPDATE; 505ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen changes->push_back(AutofillChange(change_type, 506ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillKey(itr->b, itr->c))); 507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 508ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 510ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 511ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::RemoveFormElementForTimeRange(int64 pair_id, 513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Time delete_begin, 514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Time delete_end, 515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int* how_many) { 516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM autofill_dates WHERE pair_id = ? AND " 518ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "date_created >= ? AND date_created < ?")); 519ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 520ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement 1 prepare failed"; 521ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 522ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 523ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt64(0, pair_id); 524ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt64(1, delete_begin.is_null() ? 0 : delete_begin.ToTimeT()); 525ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt64(2, delete_end.is_null() ? std::numeric_limits<int64>::max() : 526ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete_end.ToTimeT()); 527ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 528ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool result = s.Run(); 529ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (how_many) 530ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *how_many = db_->GetLastChangeCount(); 531ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 532ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return result; 533ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 534ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 535ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::AddToCountOfFormElement(int64 pair_id, 536ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int delta, 537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool* was_removed) { 538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(was_removed); 539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int count = 0; 540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *was_removed = false; 541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!GetCountOfFormElement(pair_id, &count)) 543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 544ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (count + delta == 0) { 546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!RemoveFormElementForID(pair_id)) 547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *was_removed = true; 549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 550ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!SetCountOfFormElement(pair_id, count + delta)) 551ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 552ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 553ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 554ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 555ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 556ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::GetIDAndCountOfFormElement( 557ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const FormField& element, 558ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int64* pair_id, 559ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int* count) { 560ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 561ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT pair_id, count FROM autofill " 562ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE name = ? AND value = ?")); 563ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 564ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 565ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 566ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 567ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 568ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(0, element.name); 569ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(1, element.value); 570ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *pair_id = 0; 572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *count = 0; 573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (s.Step()) { 575ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *pair_id = s.ColumnInt64(0); 576ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *count = s.ColumnInt(1); 577ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 578ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 579ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 580ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 581ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 582ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::GetCountOfFormElement(int64 pair_id, int* count) { 583ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 584ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT count FROM autofill WHERE pair_id = ?")); 585ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 586ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 587ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 588ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 589ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 590ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt64(0, pair_id); 591ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 592ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (s.Step()) { 593ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *count = s.ColumnInt(0); 594ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 595ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 596ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 597ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 598ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 599ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::SetCountOfFormElement(int64 pair_id, int count) { 600ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 601ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "UPDATE autofill SET count = ? WHERE pair_id = ?")); 602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 604ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 605ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 606ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 607ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt(0, count); 608ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt64(1, pair_id); 609ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) { 610ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 611ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 612ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 613ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 614ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 615ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 616ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 617ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::InsertFormElement(const FormField& element, 618ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int64* pair_id) { 619ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 620ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT INTO autofill (name, value, value_lower) VALUES (?,?,?)")); 621ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 622ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 623ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 624ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 626ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(0, element.name); 627ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(1, element.value); 628ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(2, l10n_util::ToLower(element.value)); 629ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 630ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) { 631ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 632ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 633ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 634ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 635ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *pair_id = db_->GetLastInsertRowId(); 636ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 638ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 639ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::InsertPairIDAndDate(int64 pair_id, 640ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time date_created) { 641ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 642ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT INTO autofill_dates " 643ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "(pair_id, date_created) VALUES (?, ?)")); 644ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 645ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 646ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 647ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 648ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 649ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt64(0, pair_id); 650ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt64(1, date_created.ToTimeT()); 651ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 652ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) { 653ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 654ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 655ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 656ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 657ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 658ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 659ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 660ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::AddFormFieldValuesTime( 661ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<FormField>& elements, 662ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillChange>* changes, 663ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time time) { 664ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Only add one new entry for each unique element name. Use |seen_names| to 665ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // track this. Add up to |kMaximumUniqueNames| unique entries per form. 666ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const size_t kMaximumUniqueNames = 256; 667ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::set<string16> seen_names; 668ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool result = true; 669ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (std::vector<FormField>::const_iterator 670ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen itr = elements.begin(); 671ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen itr != elements.end(); 672ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen itr++) { 673ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (seen_names.size() >= kMaximumUniqueNames) 674ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen break; 675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (seen_names.find(itr->name) != seen_names.end()) 676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen continue; 677ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen result = result && AddFormFieldValueTime(*itr, changes, time); 678ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen seen_names.insert(itr->name); 679ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 680ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return result; 681ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 682ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 683ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::ClearAutofillEmptyValueElements() { 684ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 685ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT pair_id FROM autofill WHERE TRIM(value)= \"\"")); 686ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 687ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 688ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 689ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 690ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 691ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::set<int64> ids; 692ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) 693ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ids.insert(s.ColumnInt64(0)); 694ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 695ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool success = true; 696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (std::set<int64>::const_iterator iter = ids.begin(); iter != ids.end(); 697ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ++iter) { 698ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!RemoveFormElementForID(*iter)) 699ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen success = false; 700ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 701ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 702ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return success; 703ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 704ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 705ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::GetAllAutofillEntries(std::vector<AutofillEntry>* entries) { 706ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(entries); 707ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 708ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT name, value, date_created FROM autofill a JOIN " 709ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "autofill_dates ad ON a.pair_id=ad.pair_id")); 710ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 711ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 712ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 713ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 714ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 715ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 716ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool first_entry = true; 717ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillKey* current_key_ptr = NULL; 718ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<base::Time>* timestamps_ptr = NULL; 719ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 name, value; 720ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time time; 721ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 722ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen name = s.ColumnString16(0); 723ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen value = s.ColumnString16(1); 724ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen time = Time::FromTimeT(s.ColumnInt64(2)); 725ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 726ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (first_entry) { 727ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen current_key_ptr = new AutofillKey(name, value); 728ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 729ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen timestamps_ptr = new std::vector<base::Time>; 730ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen timestamps_ptr->push_back(time); 731ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 732ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen first_entry = false; 733ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 734ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // we've encountered the next entry 735ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (current_key_ptr->name().compare(name) != 0 || 736ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen current_key_ptr->value().compare(value) != 0) { 737ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillEntry entry(*current_key_ptr, *timestamps_ptr); 738ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entries->push_back(entry); 739ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 740ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete current_key_ptr; 741ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete timestamps_ptr; 742ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 743ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen current_key_ptr = new AutofillKey(name, value); 744ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen timestamps_ptr = new std::vector<base::Time>; 745ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 746ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen timestamps_ptr->push_back(time); 747ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 748ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 749ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If there is at least one result returned, first_entry will be false. 750ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // For this case we need to do a final cleanup step. 751ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!first_entry) { 752ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillEntry entry(*current_key_ptr, *timestamps_ptr); 753ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entries->push_back(entry); 754ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete current_key_ptr; 755ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete timestamps_ptr; 756ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 757ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 758ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Succeeded(); 759ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 760ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 761ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::GetAutofillTimestamps(const string16& name, 762ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const string16& value, 763ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<base::Time>* timestamps) { 764ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(timestamps); 765ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 766ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT date_created FROM autofill a JOIN " 767ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "autofill_dates ad ON a.pair_id=ad.pair_id " 768ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE a.name = ? AND a.value = ?")); 769ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 770ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 771ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 772ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 773ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 774ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 775ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(0, name); 776ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(1, value); 777ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 778ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen timestamps->push_back(Time::FromTimeT(s.ColumnInt64(0))); 779ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 780ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 781ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Succeeded(); 782ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 783ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 784ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::UpdateAutofillEntries( 785ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<AutofillEntry>& entries) { 786ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!entries.size()) 787ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 788ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 789ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Remove all existing entries. 790ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < entries.size(); i++) { 791ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string sql = "SELECT pair_id FROM autofill " 792ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE name = ? AND value = ?"; 793ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement(sql.c_str())); 794ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.is_valid()) { 795ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 796ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 797ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 798ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 799ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(0, entries[i].key().name()); 800ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(1, entries[i].key().value()); 801ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (s.Step()) { 802ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!RemoveFormElementForID(s.ColumnInt64(0))) 803ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 804ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 805ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 806ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 807ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Insert all the supplied autofill entries. 808ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < entries.size(); i++) { 809ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!InsertAutofillEntry(entries[i])) 810ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 811ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 812ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 813ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 814ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 815ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 816ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::InsertAutofillEntry(const AutofillEntry& entry) { 817ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string sql = "INSERT INTO autofill (name, value, value_lower, count) " 818ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "VALUES (?, ?, ?, ?)"; 819ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement(sql.c_str())); 820ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.is_valid()) { 821ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 822ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 823ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 824ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 825ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(0, entry.key().name()); 826ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(1, entry.key().value()); 827ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(2, l10n_util::ToLower(entry.key().value())); 828ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt(3, entry.timestamps().size()); 829ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 830ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) { 831ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 832ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 833ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int64 pair_id = db_->GetLastInsertRowId(); 836ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (size_t i = 0; i < entry.timestamps().size(); i++) { 837ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!InsertPairIDAndDate(pair_id, entry.timestamps()[i])) 838ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 839ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 840ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 841ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 842ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 843ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 844ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::AddFormFieldValueTime(const FormField& element, 845ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillChange>* changes, 846ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time time) { 847ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int count = 0; 848ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int64 pair_id; 849ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 850ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!GetIDAndCountOfFormElement(element, &pair_id, &count)) 851ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 852ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 853ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (count == 0 && !InsertFormElement(element, &pair_id)) 854ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 855ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 856ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!SetCountOfFormElement(pair_id, count + 1)) 857ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 858ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 859ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!InsertPairIDAndDate(pair_id, time)) 860ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 861ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 862ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillChange::Type change_type = 863ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen count == 0 ? AutofillChange::ADD : AutofillChange::UPDATE; 864ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen changes->push_back( 865ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillChange(change_type, 866ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillKey(element.name, element.value))); 867ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 868ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 869ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 870ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 871ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::RemoveFormElement(const string16& name, 872ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const string16& value) { 873ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Find the id for that pair. 874ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 875ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT pair_id FROM autofill WHERE name = ? AND value= ?")); 876ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 877ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement 1 prepare failed"; 878ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 879ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 880ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(0, name); 881ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString16(1, value); 882ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 883ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (s.Step()) 884ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return RemoveFormElementForID(s.ColumnInt64(0)); 885ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 886ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 887ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 888ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::AddAutofillProfile(const AutofillProfile& profile) { 889ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (IsAutofillGUIDInTrash(profile.guid())) 890ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 891ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 892ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 893ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT INTO autofill_profiles" 894ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "(guid, company_name, address_line_1, address_line_2, city, state," 895ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " zipcode, country, country_code, date_modified)" 896ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "VALUES (?,?,?,?,?,?,?,?,?,?)")); 897ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 898ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 899ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 900ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 901ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 902ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BindAutofillProfileToStatement(profile, &s); 903ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 904ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) { 905ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 906ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 907ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 908ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 909ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Succeeded()) 910ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 911ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 912ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return AddAutofillProfilePieces(profile, db_); 913ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 914ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 915ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::GetAutofillProfile(const std::string& guid, 916ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile** profile) { 917ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(guid::IsValidGUID(guid)); 918ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(profile); 919ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 920ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid, company_name, address_line_1, address_line_2, city, state," 921ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " zipcode, country, country_code, date_modified " 922ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profiles " 923ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE guid=?")); 924ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 925ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 926ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 927ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 928ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 929ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, guid); 930ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Step()) 931ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 932ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 933ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Succeeded()) 934ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 935ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 936ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<AutofillProfile> p(AutofillProfileFromStatement(s)); 937ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 938ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Get associated name info. 939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddAutofillProfileNamesToProfile(db_, p.get()); 940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Get associated email info. 942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddAutofillProfileEmailsToProfile(db_, p.get()); 943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Get associated phone info. 945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddAutofillProfilePhonesToProfile(db_, p.get()); 946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Get associated fax info. 948ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddAutofillProfileFaxesToProfile(db_, p.get()); 949ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 950ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *profile = p.release(); 951ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 952ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 953ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 954ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::GetAutofillProfiles( 955ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillProfile*>* profiles) { 956ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(profiles); 957ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profiles->clear(); 958ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 959ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 960ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid " 961ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profiles")); 962ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 963ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 964ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 965ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 966ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 967ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 968ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string guid = s.ColumnString(0); 969ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* profile = NULL; 970ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!GetAutofillProfile(guid, &profile)) 971ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 972ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profiles->push_back(profile); 973ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 974ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 975ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Succeeded(); 976ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 977ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 978ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::UpdateAutofillProfile(const AutofillProfile& profile) { 979ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(guid::IsValidGUID(profile.guid())); 980ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 981ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Don't update anything until the trash has been emptied. There may be 982ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // pending modifications to process. 983ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!IsAutofillProfilesTrashEmpty()) 984ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 985ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 986ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* tmp_profile = NULL; 987ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!GetAutofillProfile(profile.guid(), &tmp_profile)) 988ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 989ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 990ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Preserve appropriate modification dates by not updating unchanged profiles. 991ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<AutofillProfile> old_profile(tmp_profile); 992ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (old_profile->Compare(profile) == 0) 993ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 994ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 995ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile new_profile(profile); 996ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<string16> values; 997ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 998ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen old_profile->GetMultiInfo(NAME_FULL, &values); 999ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen values[0] = new_profile.GetInfo(NAME_FULL); 1000ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new_profile.SetMultiInfo(NAME_FULL, values); 1001ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1002ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen old_profile->GetMultiInfo(EMAIL_ADDRESS, &values); 1003ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen values[0] = new_profile.GetInfo(EMAIL_ADDRESS); 1004ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new_profile.SetMultiInfo(EMAIL_ADDRESS, values); 1005ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1006ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen old_profile->GetMultiInfo(PHONE_HOME_WHOLE_NUMBER, &values); 1007ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen values[0] = new_profile.GetInfo(PHONE_HOME_WHOLE_NUMBER); 1008ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new_profile.SetMultiInfo(PHONE_HOME_WHOLE_NUMBER, values); 1009ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1010ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen old_profile->GetMultiInfo(PHONE_FAX_WHOLE_NUMBER, &values); 1011ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen values[0] = new_profile.GetInfo(PHONE_FAX_WHOLE_NUMBER); 1012ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new_profile.SetMultiInfo(PHONE_FAX_WHOLE_NUMBER, values); 1013ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1014ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return UpdateAutofillProfileMulti(new_profile); 1015ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1016ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1017ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::UpdateAutofillProfileMulti(const AutofillProfile& profile) { 1018ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(guid::IsValidGUID(profile.guid())); 1019ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1020ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Don't update anything until the trash has been emptied. There may be 1021ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // pending modifications to process. 1022ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!IsAutofillProfilesTrashEmpty()) 1023ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1024ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1025ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* tmp_profile = NULL; 1026ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!GetAutofillProfile(profile.guid(), &tmp_profile)) 1027ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1028ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1029ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Preserve appropriate modification dates by not updating unchanged profiles. 1030ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<AutofillProfile> old_profile(tmp_profile); 1031ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (old_profile->CompareMulti(profile) == 0) 1032ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1033ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1034ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1035ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "UPDATE autofill_profiles " 1036ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SET guid=?, company_name=?, address_line_1=?, address_line_2=?, " 1037ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " city=?, state=?, zipcode=?, country=?, country_code=?, " 1038ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " date_modified=? " 1039ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE guid=?")); 1040ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 1041ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1042ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1043ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1044ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1045ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BindAutofillProfileToStatement(profile, &s); 1046ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(10, profile.guid()); 1047ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool result = s.Run(); 1048ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK_GT(db_->GetLastChangeCount(), 0); 1049ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!result) 1050ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return result; 1051ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1052ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Remove the old names, emails, and phone/fax numbers. 1053ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!RemoveAutofillProfilePieces(profile.guid(), db_)) 1054ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1055ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1056ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return AddAutofillProfilePieces(profile, db_); 1057ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1058ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1059ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::RemoveAutofillProfile(const std::string& guid) { 1060ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(guid::IsValidGUID(guid)); 1061ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1062ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (IsAutofillGUIDInTrash(guid)) { 1063ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s_trash(db_->GetUniqueStatement( 1064ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM autofill_profiles_trash WHERE guid = ?")); 1065ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s_trash) { 1066ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1067ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1068ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1069ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_trash.BindString(0, guid); 1070ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s_trash.Run()) { 1071ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Expected item in trash."; 1072ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1073ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1074ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1075ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1076ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1077ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1078ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1079ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM autofill_profiles WHERE guid = ?")); 1080ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 1081ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1082ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1083ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1084ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1085ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, guid); 1086ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) 1087ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1088ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1089ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return RemoveAutofillProfilePieces(guid, db_); 1090ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1091ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1092ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::ClearAutofillProfiles() { 1093ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s1(db_->GetUniqueStatement( 1094ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM autofill_profiles")); 1095ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s1) { 1096ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1097ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1098ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1099ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s1.Run()) 1101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s2(db_->GetUniqueStatement( 1104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM autofill_profile_names")); 1105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s2) { 1106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s2.Run()) 1111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s3(db_->GetUniqueStatement( 1114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM autofill_profile_emails")); 1115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s3) { 1116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s3.Run()) 1121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s4(db_->GetUniqueStatement( 1124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM autofill_profile_phones")); 1125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s4) { 1126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s4.Run()) 1131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::AddCreditCard(const CreditCard& credit_card) { 1137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT INTO credit_cards" 1139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "(guid, name_on_card, expiration_month, expiration_year, " 1140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "card_number_encrypted, date_modified)" 1141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "VALUES (?,?,?,?,?,?)")); 1142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 1143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BindCreditCardToStatement(credit_card, &s); 1148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) { 1150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK_GT(db_->GetLastChangeCount(), 0); 1155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Succeeded(); 1156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::GetCreditCard(const std::string& guid, 1159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreditCard** credit_card) { 1160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(guid::IsValidGUID(guid)); 1161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid, name_on_card, expiration_month, expiration_year, " 1163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "card_number_encrypted, date_modified " 1164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM credit_cards " 1165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE guid = ?")); 1166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 1167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, guid); 1172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Step()) 1173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *credit_card = CreditCardFromStatement(s); 1176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Succeeded(); 1178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::GetCreditCards( 1181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<CreditCard*>* credit_cards) { 1182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(credit_cards); 1183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen credit_cards->clear(); 1184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid " 1187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM credit_cards")); 1188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 1189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 1194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string guid = s.ColumnString(0); 1195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreditCard* credit_card = NULL; 1196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!GetCreditCard(guid, &credit_card)) 1197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen credit_cards->push_back(credit_card); 1199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Succeeded(); 1202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::UpdateCreditCard(const CreditCard& credit_card) { 1205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(guid::IsValidGUID(credit_card.guid())); 1206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CreditCard* tmp_credit_card = NULL; 1208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!GetCreditCard(credit_card.guid(), &tmp_credit_card)) 1209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Preserve appropriate modification dates by not updating unchanged cards. 1212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<CreditCard> old_credit_card(tmp_credit_card); 1213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (*old_credit_card == credit_card) 1214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "UPDATE credit_cards " 1218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SET guid=?, name_on_card=?, expiration_month=?, " 1219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " expiration_year=?, card_number_encrypted=?, date_modified=? " 1220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE guid=?")); 1221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 1222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BindCreditCardToStatement(credit_card, &s); 1227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(6, credit_card.guid()); 1228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool result = s.Run(); 1229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK_GT(db_->GetLastChangeCount(), 0); 1230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return result; 1231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::RemoveCreditCard(const std::string& guid) { 1234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(guid::IsValidGUID(guid)); 1235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM credit_cards WHERE guid = ?")); 1237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 1238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, guid); 1243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Run(); 1244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::RemoveAutofillProfilesAndCreditCardsModifiedBetween( 1247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time delete_begin, 1248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen base::Time delete_end, 1249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<std::string>* profile_guids, 1250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<std::string>* credit_card_guids) { 1251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(delete_end.is_null() || delete_begin < delete_end); 1252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen time_t delete_begin_t = delete_begin.ToTimeT(); 1254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen time_t delete_end_t = delete_end.is_null() ? 1255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::numeric_limits<time_t>::max() : 1256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen delete_end.ToTimeT(); 1257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Remember Autofill profiles in the time range. 1259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s_profiles_get(db_->GetUniqueStatement( 1260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid FROM autofill_profiles " 1261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE date_modified >= ? AND date_modified < ?")); 1262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s_profiles_get) { 1263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Autofill profiles statement prepare failed"; 1264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_profiles_get.BindInt64(0, delete_begin_t); 1268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_profiles_get.BindInt64(1, delete_end_t); 1269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_guids->clear(); 1270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s_profiles_get.Step()) { 1271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string guid = s_profiles_get.ColumnString(0); 1272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile_guids->push_back(guid); 1273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Remove Autofill profiles in the time range. 1276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s_profiles(db_->GetUniqueStatement( 1277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM autofill_profiles " 1278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE date_modified >= ? AND date_modified < ?")); 1279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s_profiles) { 1280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Autofill profiles statement prepare failed"; 1281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_profiles.BindInt64(0, delete_begin_t); 1285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_profiles.BindInt64(1, delete_end_t); 1286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_profiles.Run(); 1287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s_profiles.Succeeded()) { 1289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Remember Autofill credit cards in the time range. 1294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s_credit_cards_get(db_->GetUniqueStatement( 1295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid FROM credit_cards " 1296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE date_modified >= ? AND date_modified < ?")); 1297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s_credit_cards_get) { 1298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Autofill profiles statement prepare failed"; 1299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_credit_cards_get.BindInt64(0, delete_begin_t); 1303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_credit_cards_get.BindInt64(1, delete_end_t); 1304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen credit_card_guids->clear(); 1305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s_credit_cards_get.Step()) { 1306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string guid = s_credit_cards_get.ColumnString(0); 1307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen credit_card_guids->push_back(guid); 1308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Remove Autofill credit cards in the time range. 1311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s_credit_cards(db_->GetUniqueStatement( 1312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM credit_cards " 1313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE date_modified >= ? AND date_modified < ?")); 1314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s_credit_cards) { 1315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Autofill credit cards statement prepare failed"; 1316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_credit_cards.BindInt64(0, delete_begin_t); 1320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_credit_cards.BindInt64(1, delete_end_t); 1321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_credit_cards.Run(); 1322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s_credit_cards.Succeeded()) { 1324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::GetAutofillProfilesInTrash( 1332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<std::string>* guids) { 1333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen guids->clear(); 1334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid " 1337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profiles_trash")); 1338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 1339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 1344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string guid = s.ColumnString(0); 1345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen guids->push_back(guid); 1346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Succeeded(); 1349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::EmptyAutofillProfilesTrash() { 1352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM autofill_profiles_trash")); 1354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 1355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Run(); 1360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::RemoveFormElementForID(int64 pair_id) { 1364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "DELETE FROM autofill WHERE pair_id = ?")); 1366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 1367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt64(0, pair_id); 1371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (s.Run()) { 1372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return RemoveFormElementForTimeRange(pair_id, base::Time(), base::Time(), 1373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NULL); 1374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::AddAutofillGUIDToTrash(const std::string& guid) { 1379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT INTO autofill_profiles_trash" 1381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " (guid) " 1382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "VALUES (?)")); 1383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 1384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return sql::INIT_FAILURE; 1386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, guid); 1389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) { 1390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::IsAutofillProfilesTrashEmpty() { 1397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid " 1399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profiles_trash")); 1400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 1401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return !s.Step(); 1406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::IsAutofillGUIDInTrash(const std::string& guid) { 1409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid " 1411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profiles_trash " 1412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE guid = ?")); 1413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) { 1414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED() << "Statement prepare failed"; 1415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindString(0, guid); 1419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Step(); 1420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::InitMainTable() { 1423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesTableExist("autofill")) { 1424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE autofill (" 1425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "name VARCHAR, " 1426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "value VARCHAR, " 1427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "value_lower VARCHAR, " 1428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "pair_id INTEGER PRIMARY KEY, " 1429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "count INTEGER DEFAULT 1)")) { 1430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE INDEX autofill_name ON autofill (name)")) { 1434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE INDEX autofill_name_value_lower ON " 1438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "autofill (name, value_lower)")) { 1439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::InitCreditCardsTable() { 1447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesTableExist("credit_cards")) { 1448ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE credit_cards ( " 1449ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "guid VARCHAR PRIMARY KEY, " 1450ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "name_on_card VARCHAR, " 1451ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "expiration_month INTEGER, " 1452ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "expiration_year INTEGER, " 1453ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "card_number_encrypted BLOB, " 1454ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "date_modified INTEGER NOT NULL DEFAULT 0)")) { 1455ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1456ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1457ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1458ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1459ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1460ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1461ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1462ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::InitDatesTable() { 1464ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesTableExist("autofill_dates")) { 1465ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE autofill_dates ( " 1466ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "pair_id INTEGER DEFAULT 0, " 1467ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "date_created INTEGER DEFAULT 0)")) { 1468ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1469ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1470ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1471ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE INDEX autofill_dates_pair_id ON " 1472ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "autofill_dates (pair_id)")) { 1473ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1475ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1476ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1477ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1478ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1479ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1480ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::InitProfilesTable() { 1481ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesTableExist("autofill_profiles")) { 1482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE autofill_profiles ( " 1483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "guid VARCHAR PRIMARY KEY, " 1484ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "company_name VARCHAR, " 1485ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "address_line_1 VARCHAR, " 1486ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "address_line_2 VARCHAR, " 1487ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "city VARCHAR, " 1488ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "state VARCHAR, " 1489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "zipcode VARCHAR, " 1490ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "country VARCHAR, " 1491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "country_code VARCHAR, " 1492ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "date_modified INTEGER NOT NULL DEFAULT 0)")) { 1493ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1494ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1496ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1497ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1498ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1499ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1500ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::InitProfileNamesTable() { 1501ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesTableExist("autofill_profile_names")) { 1502ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE autofill_profile_names ( " 1503ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "guid VARCHAR, " 1504ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "first_name VARCHAR, " 1505ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "middle_name VARCHAR, " 1506ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "last_name VARCHAR)")) { 1507ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1508ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1509ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1510ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1511ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1514ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::InitProfileEmailsTable() { 1515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesTableExist("autofill_profile_emails")) { 1516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE autofill_profile_emails ( " 1517ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "guid VARCHAR, " 1518ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "email VARCHAR)")) { 1519ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1520ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1521ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1522ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1523ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1524ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1525ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1526ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::InitProfilePhonesTable() { 1527ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesTableExist("autofill_profile_phones")) { 1528ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE autofill_profile_phones ( " 1529ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "guid VARCHAR, " 1530ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "type INTEGER DEFAULT 0, " 1531ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "number VARCHAR)")) { 1532ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1533ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1534ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1535ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1536ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1537ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1538ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1539ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::InitProfileTrashTable() { 1540ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesTableExist("autofill_profiles_trash")) { 1541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE autofill_profiles_trash ( " 1542ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "guid VARCHAR)")) { 1543ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NOTREACHED(); 1544ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1545ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1546ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1548ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1549ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1550ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Add the card_number_encrypted column if credit card table was not 1551ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// created in this build (otherwise the column already exists). 1552ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// WARNING: Do not change the order of the execution of the SQL 1553ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// statements in this case! Profile corruption and data migration 1554ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// issues WILL OCCUR. See http://crbug.com/10913 1555ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// 1556ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The problem is that if a user has a profile which was created before 1557ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// r37036, when the credit_cards table was added, and then failed to 1558ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// update this profile between the credit card addition and the addition 1559ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// of the "encrypted" columns (44963), the next data migration will put 1560ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// the user's profile in an incoherent state: The user will update from 1561ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// a data profile set to be earlier than 22, and therefore pass through 1562ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// this update case. But because the user did not have a credit_cards 1563ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// table before starting Chrome, it will have just been initialized 1564ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// above, and so already have these columns -- and thus this data 1565ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// update step will have failed. 1566ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// 1567ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// The false assumption in this case is that at this step in the 1568ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// migration, the user has a credit card table, and that this 1569ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// table does not include encrypted columns! 1570ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Because this case does not roll back the complete set of SQL 1571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// transactions properly in case of failure (that is, it does not 1572ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// roll back the table initialization done above), the incoherent 1573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// profile will now see itself as being at version 22 -- but include a 1574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// fully initialized credit_cards table. Every time Chrome runs, it 1575ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// will try to update the web database and fail at this step, unless 1576ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// we allow for the faulty assumption described above by checking for 1577ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// the existence of the columns only AFTER we've executed the commands 1578ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// to add them. 1579ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::MigrateToVersion23AddCardNumberEncryptedColumn() { 1580ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesColumnExist("credit_cards", "card_number_encrypted")) { 1581ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("ALTER TABLE credit_cards ADD COLUMN " 1582ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "card_number_encrypted BLOB DEFAULT NULL")) { 1583ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(WARNING) << "Could not add card_number_encrypted to " 1584ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "credit_cards table."; 1585ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1586ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1587ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1588ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1589ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesColumnExist("credit_cards", "verification_code_encrypted")) { 1590ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("ALTER TABLE credit_cards ADD COLUMN " 1591ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "verification_code_encrypted BLOB DEFAULT NULL")) { 1592ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen LOG(WARNING) << "Could not add verification_code_encrypted to " 1593ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "credit_cards table."; 1594ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1595ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1596ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1597ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1598ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1599ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1600ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1601ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// One-time cleanup for http://crbug.com/38364 - In the presence of 1602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// multi-byte UTF-8 characters, that bug could cause Autofill strings 1603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// to grow larger and more corrupt with each save. The cleanup removes 1604ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// any row with a string field larger than a reasonable size. The string 1605ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// fields examined here are precisely the ones that were subject to 1606ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// corruption by the original bug. 1607ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::MigrateToVersion24CleanupOversizedStringFields() { 1608ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string autofill_is_too_big = 1609ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "max(length(name), length(value)) > 500"; 1610ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1611ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string credit_cards_is_too_big = 1612ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "max(length(label), length(name_on_card), length(type), " 1613ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " length(expiration_month), length(expiration_year), " 1614ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " length(billing_address), length(shipping_address) " 1615ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ") > 500"; 1616ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1617ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string autofill_profiles_is_too_big = 1618ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "max(length(label), length(first_name), " 1619ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " length(middle_name), length(last_name), length(email), " 1620ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " length(company_name), length(address_line_1), " 1621ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " length(address_line_2), length(city), length(state), " 1622ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " length(zipcode), length(country), length(phone), " 1623ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " length(fax)) > 500"; 1624ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string query = "DELETE FROM autofill_dates WHERE pair_id IN (" 1626ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT pair_id FROM autofill WHERE " + autofill_is_too_big + ")"; 1627ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1628ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute(query.c_str())) 1629ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1630ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1631ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen query = "DELETE FROM autofill WHERE " + autofill_is_too_big; 1632ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1633ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute(query.c_str())) 1634ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1635ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1636ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Only delete from legacy credit card tables where specific columns exist. 1637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->DoesColumnExist("credit_cards", "label") && 1638ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->DoesColumnExist("credit_cards", "name_on_card") && 1639ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->DoesColumnExist("credit_cards", "type") && 1640ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->DoesColumnExist("credit_cards", "expiration_month") && 1641ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->DoesColumnExist("credit_cards", "expiration_year") && 1642ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->DoesColumnExist("credit_cards", "billing_address") && 1643ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->DoesColumnExist("credit_cards", "shipping_address") && 1644ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->DoesColumnExist("autofill_profiles", "label")) { 1645ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen query = "DELETE FROM credit_cards WHERE (" + credit_cards_is_too_big + 1646ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ") OR label IN (SELECT label FROM autofill_profiles WHERE " + 1647ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen autofill_profiles_is_too_big + ")"; 1648ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1649ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute(query.c_str())) 1650ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1651ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1652ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1653ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->DoesColumnExist("autofill_profiles", "label")) { 1654ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen query = "DELETE FROM autofill_profiles WHERE " + 1655ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen autofill_profiles_is_too_big; 1656ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1657ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute(query.c_str())) 1658ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1659ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1660ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1661ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1662ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1663ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1664ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Change the credit_cards.billing_address column from a string to an 1665ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// int. The stored string is the label of an address, so we have to 1666ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// select the unique ID of this address using the label as a foreign 1667ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// key into the |autofill_profiles| table. 1668ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::MigrateToVersion27UpdateLegacyCreditCards() { 1669ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Only migrate from legacy credit card tables where specific columns 1670ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // exist. 1671ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!(db_->DoesColumnExist("credit_cards", "unique_id") && 1672ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->DoesColumnExist("credit_cards", "billing_address") && 1673ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->DoesColumnExist("autofill_profiles", "unique_id"))) { 1674ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1676ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1677ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string stmt = 1678ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT credit_cards.unique_id, autofill_profiles.unique_id " 1679ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profiles, credit_cards " 1680ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE credit_cards.billing_address = autofill_profiles.label"; 1681ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement(stmt.c_str())); 1682ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 1683ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1684ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1685ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::map<int, int> cc_billing_map; 1686ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) 1687ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cc_billing_map[s.ColumnInt(0)] = s.ColumnInt(1); 1688ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1689ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Windows already stores the IDs as strings in |billing_address|. Try 1690ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // to convert those. 1691ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (cc_billing_map.empty()) { 1692ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string stmt = "SELECT unique_id,billing_address FROM credit_cards"; 1693ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement(stmt.c_str())); 1694ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 1695ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1696ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1697ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 1698ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int id = 0; 1699ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (base::StringToInt(s.ColumnString(1), &id)) 1700ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cc_billing_map[s.ColumnInt(0)] = id; 1701ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1702ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1703ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1704ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE credit_cards_temp ( " 1705ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "label VARCHAR, " 1706ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "unique_id INTEGER PRIMARY KEY, " 1707ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "name_on_card VARCHAR, " 1708ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "type VARCHAR, " 1709ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "card_number VARCHAR, " 1710ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "expiration_month INTEGER, " 1711ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "expiration_year INTEGER, " 1712ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "verification_code VARCHAR, " 1713ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "billing_address INTEGER, " 1714ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "shipping_address VARCHAR, " 1715ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "card_number_encrypted BLOB, " 1716ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "verification_code_encrypted BLOB)")) { 1717ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1718ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1719ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1720ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute( 1721ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT INTO credit_cards_temp " 1722ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT label,unique_id,name_on_card,type,card_number," 1723ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "expiration_month,expiration_year,verification_code,0," 1724ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "shipping_address,card_number_encrypted," 1725ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "verification_code_encrypted FROM credit_cards")) { 1726ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1727ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1728ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1729ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("DROP TABLE credit_cards")) 1730ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1731ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1732ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("ALTER TABLE credit_cards_temp RENAME TO credit_cards")) 1733ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1734ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1735ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (std::map<int, int>::const_iterator iter = cc_billing_map.begin(); 1736ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen iter != cc_billing_map.end(); ++iter) { 1737ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetCachedStatement( 1738ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen SQL_FROM_HERE, 1739ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "UPDATE credit_cards SET billing_address=? WHERE unique_id=?")); 1740ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 1741ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1742ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1743ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt(0, (*iter).second); 1744ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt(1, (*iter).first); 1745ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1746ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) 1747ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1748ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1749ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1750ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1751ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1752ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1753ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::MigrateToVersion30AddDateModifed() { 1754ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add date_modified to autofill_profiles. 1755ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesColumnExist("autofill_profiles", "date_modified")) { 1756ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("ALTER TABLE autofill_profiles ADD COLUMN " 1757ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "date_modified INTEGER NON NULL DEFAULT 0")) { 1758ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1759ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1760ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1761ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1762ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "UPDATE autofill_profiles SET date_modified=?")); 1763ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 1764ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1765ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1766ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt64(0, Time::Now().ToTimeT()); 1767ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1768ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) 1769ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1770ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1771ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1772ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add date_modified to credit_cards. 1773ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesColumnExist("credit_cards", "date_modified")) { 1774ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("ALTER TABLE credit_cards ADD COLUMN " 1775ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "date_modified INTEGER NON NULL DEFAULT 0")) { 1776ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1777ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1778ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1779ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1780ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "UPDATE credit_cards SET date_modified=?")); 1781ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 1782ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1783ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1784ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s.BindInt64(0, Time::Now().ToTimeT()); 1785ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1786ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s.Run()) 1787ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1788ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1789ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1790ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1791ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1792ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1793ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::MigrateToVersion31AddGUIDToCreditCardsAndProfiles() { 1794ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Note that we need to check for the guid column's existence due to the 1795ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // fact that for a version 22 database the |autofill_profiles| table 1796ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // gets created fresh with |InitAutofillProfilesTable|. 1797ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesColumnExist("autofill_profiles", "guid")) { 1798ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("ALTER TABLE autofill_profiles ADD COLUMN " 1799ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "guid VARCHAR NOT NULL DEFAULT \"\"")) { 1800ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1801ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1802ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1803ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Set all the |guid| fields to valid values. 1804ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1805ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement("SELECT unique_id " 1806ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profiles")); 1807ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 1808ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1809ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1810ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 1811ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement update_s( 1812ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetUniqueStatement("UPDATE autofill_profiles " 1813ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SET guid=? WHERE unique_id=?")); 1814ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!update_s) 1815ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1816ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen update_s.BindString(0, guid::GenerateGUID()); 1817ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen update_s.BindInt(1, s.ColumnInt(0)); 1818ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1819ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!update_s.Run()) 1820ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1821ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1822ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1823ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1824ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Note that we need to check for the guid column's existence due to the 1825ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // fact that for a version 22 database the |autofill_profiles| table 1826ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // gets created fresh with |InitAutofillProfilesTable|. 1827ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesColumnExist("credit_cards", "guid")) { 1828ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("ALTER TABLE credit_cards ADD COLUMN " 1829ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "guid VARCHAR NOT NULL DEFAULT \"\"")) { 1830ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1831ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1832ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1833ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Set all the |guid| fields to valid values. 1834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement("SELECT unique_id " 1836ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM credit_cards")); 1837ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 1838ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1839ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1840ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 1841ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement update_s( 1842ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetUniqueStatement("UPDATE credit_cards " 1843ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "set guid=? WHERE unique_id=?")); 1844ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!update_s) 1845ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1846ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen update_s.BindString(0, guid::GenerateGUID()); 1847ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen update_s.BindInt(1, s.ColumnInt(0)); 1848ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1849ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!update_s.Run()) 1850ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1851ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1852ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1853ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1854ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1855ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1856ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1857ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::MigrateToVersion32UpdateProfilesAndCreditCards() { 1858ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->DoesColumnExist("autofill_profiles", "unique_id")) { 1859ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE autofill_profiles_temp ( " 1860ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "guid VARCHAR PRIMARY KEY, " 1861ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "label VARCHAR, " 1862ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "first_name VARCHAR, " 1863ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "middle_name VARCHAR, " 1864ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "last_name VARCHAR, " 1865ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "email VARCHAR, " 1866ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "company_name VARCHAR, " 1867ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "address_line_1 VARCHAR, " 1868ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "address_line_2 VARCHAR, " 1869ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "city VARCHAR, " 1870ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "state VARCHAR, " 1871ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "zipcode VARCHAR, " 1872ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "country VARCHAR, " 1873ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "phone VARCHAR, " 1874ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "fax VARCHAR, " 1875ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "date_modified INTEGER NOT NULL DEFAULT 0)")) { 1876ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1877ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1878ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1879ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute( 1880ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT INTO autofill_profiles_temp " 1881ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid, label, first_name, middle_name, last_name, email, " 1882ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "company_name, address_line_1, address_line_2, city, state, " 1883ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "zipcode, country, phone, fax, date_modified " 1884ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profiles")) { 1885ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1886ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1887ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1888ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("DROP TABLE autofill_profiles")) 1889ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1890ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1891ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute( 1892ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "ALTER TABLE autofill_profiles_temp RENAME TO autofill_profiles")) { 1893ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1894ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1895ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1896ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1897ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->DoesColumnExist("credit_cards", "unique_id")) { 1898ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE credit_cards_temp ( " 1899ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "guid VARCHAR PRIMARY KEY, " 1900ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "label VARCHAR, " 1901ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "name_on_card VARCHAR, " 1902ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "expiration_month INTEGER, " 1903ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "expiration_year INTEGER, " 1904ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "card_number_encrypted BLOB, " 1905ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "date_modified INTEGER NOT NULL DEFAULT 0)")) { 1906ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1907ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1908ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1909ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute( 1910ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT INTO credit_cards_temp " 1911ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid, label, name_on_card, expiration_month, " 1912ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "expiration_year, card_number_encrypted, date_modified " 1913ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM credit_cards")) { 1914ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1915ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1916ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1917ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("DROP TABLE credit_cards")) 1918ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1919ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1920ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("ALTER TABLE credit_cards_temp RENAME TO credit_cards")) 1921ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1922ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1923ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1924ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 1925ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 1926ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1927ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Test the existence of the |first_name| column as an indication that 1928ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// we need a migration. It is possible that the new |autofill_profiles| 1929ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// schema is in place because the table was newly created when migrating 1930ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// from a pre-version-22 database. 1931ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::MigrateToVersion33ProfilesBasedOnFirstName() { 1932ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->DoesColumnExist("autofill_profiles", "first_name")) { 1933ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Create autofill_profiles_temp table that will receive the data. 1934ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesTableExist("autofill_profiles_temp")) { 1935ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE autofill_profiles_temp ( " 1936ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "guid VARCHAR PRIMARY KEY, " 1937ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "company_name VARCHAR, " 1938ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "address_line_1 VARCHAR, " 1939ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "address_line_2 VARCHAR, " 1940ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "city VARCHAR, " 1941ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "state VARCHAR, " 1942ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "zipcode VARCHAR, " 1943ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "country VARCHAR, " 1944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "date_modified INTEGER NOT NULL DEFAULT 0)")) { 1945ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1946ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1947ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1948ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1949ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 1950ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid, first_name, middle_name, last_name, email, " 1951ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "company_name, address_line_1, address_line_2, city, state, " 1952ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "zipcode, country, phone, fax, date_modified " 1953ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profiles")); 1954ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 1955ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile profile; 1956ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.set_guid(s.ColumnString(0)); 1957ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(guid::IsValidGUID(profile.guid())); 1958ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1959ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(NAME_FIRST, s.ColumnString16(1)); 1960ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(NAME_MIDDLE, s.ColumnString16(2)); 1961ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(NAME_LAST, s.ColumnString16(3)); 1962ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(EMAIL_ADDRESS, s.ColumnString16(4)); 1963ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(COMPANY_NAME, s.ColumnString16(5)); 1964ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(ADDRESS_HOME_LINE1, s.ColumnString16(6)); 1965ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(ADDRESS_HOME_LINE2, s.ColumnString16(7)); 1966ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(ADDRESS_HOME_CITY, s.ColumnString16(8)); 1967ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(ADDRESS_HOME_STATE, s.ColumnString16(9)); 1968ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(ADDRESS_HOME_ZIP, s.ColumnString16(10)); 1969ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(ADDRESS_HOME_COUNTRY, s.ColumnString16(11)); 1970ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(PHONE_HOME_WHOLE_NUMBER, s.ColumnString16(12)); 1971ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile.SetInfo(PHONE_FAX_WHOLE_NUMBER, s.ColumnString16(13)); 1972ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int64 date_modified = s.ColumnInt64(14); 1973ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1974ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s_insert(db_->GetUniqueStatement( 1975ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT INTO autofill_profiles_temp" 1976ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "(guid, company_name, address_line_1, address_line_2, city," 1977ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen " state, zipcode, country, date_modified)" 1978ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "VALUES (?,?,?,?,?,?,?,?,?)")); 1979ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 1980ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1981ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1982ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_insert.BindString(0, profile.guid()); 1983ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_insert.BindString16(1, profile.GetInfo(COMPANY_NAME)); 1984ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_insert.BindString16(2, profile.GetInfo(ADDRESS_HOME_LINE1)); 1985ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_insert.BindString16(3, profile.GetInfo(ADDRESS_HOME_LINE2)); 1986ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_insert.BindString16(4, profile.GetInfo(ADDRESS_HOME_CITY)); 1987ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_insert.BindString16(5, profile.GetInfo(ADDRESS_HOME_STATE)); 1988ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_insert.BindString16(6, profile.GetInfo(ADDRESS_HOME_ZIP)); 1989ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_insert.BindString16(7, profile.GetInfo(ADDRESS_HOME_COUNTRY)); 1990ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_insert.BindInt64(8, date_modified); 1991ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1992ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s_insert.Run()) 1993ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1994ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1995ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add the other bits: names, emails, and phone/fax. 1996ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!AddAutofillProfilePieces(profile, db_)) 1997ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 1998ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 1999ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2000ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("DROP TABLE autofill_profiles")) 2001ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2002ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2003ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute( 2004ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "ALTER TABLE autofill_profiles_temp RENAME TO autofill_profiles")) { 2005ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2006ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 2007ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 2008ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2009ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Remove the labels column from the credit_cards table. 2010ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (db_->DoesColumnExist("credit_cards", "label")) { 2011ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("CREATE TABLE credit_cards_temp ( " 2012ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "guid VARCHAR PRIMARY KEY, " 2013ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "name_on_card VARCHAR, " 2014ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "expiration_month INTEGER, " 2015ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "expiration_year INTEGER, " 2016ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "card_number_encrypted BLOB, " 2017ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "date_modified INTEGER NOT NULL DEFAULT 0)")) { 2018ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2019ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 2020ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2021ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute( 2022ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "INSERT INTO credit_cards_temp " 2023ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid, name_on_card, expiration_month, " 2024ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "expiration_year, card_number_encrypted, date_modified " 2025ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM credit_cards")) { 2026ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2027ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 2028ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2029ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("DROP TABLE credit_cards")) 2030ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2031ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2032ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("ALTER TABLE credit_cards_temp RENAME TO credit_cards")) 2033ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2034ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 2035ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2036ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 2037ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 2038ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2039ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Test the existence of the |country_code| column as an indication that 2040ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// we need a migration. It is possible that the new |autofill_profiles| 2041ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// schema is in place because the table was newly created when migrating 2042ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// from a pre-version-22 database. 2043ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::MigrateToVersion34ProfilesBasedOnCountryCode() { 2044ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->DoesColumnExist("autofill_profiles", "country_code")) { 2045ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!db_->Execute("ALTER TABLE autofill_profiles ADD COLUMN " 2046ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "country_code VARCHAR")) { 2047ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2048ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 2049ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2050ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Set all the |country_code| fields to match existing |country| values. 2051ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement("SELECT guid, country " 2052ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "FROM autofill_profiles")); 2053ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2054ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 2055ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2056ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2057ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 2058ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement update_s( 2059ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_->GetUniqueStatement("UPDATE autofill_profiles " 2060ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SET country_code=? WHERE guid=?")); 2061ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!update_s) 2062ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2063ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2064ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen string16 country = s.ColumnString16(1); 2065ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string app_locale = AutofillCountry::ApplicationLocale(); 2066ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen update_s.BindString(0, AutofillCountry::GetCountryCode(country, 2067ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen app_locale)); 2068ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen update_s.BindString(1, s.ColumnString(0)); 2069ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2070ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!update_s.Run()) 2071ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2072ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 2073ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 2074ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2075ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 2076ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 2077ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2078ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Correct all country codes with value "UK" to be "GB". This data 2079ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// was mistakenly introduced in build 686.0. This migration is to clean 2080ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// it up. See http://crbug.com/74511 for details. 2081ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::MigrateToVersion35GreatBritainCountryCodes() { 2082ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 2083ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "UPDATE autofill_profiles SET country_code=\"GB\" " 2084ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE country_code=\"UK\"")); 2085ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2086ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return s.Run(); 2087ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 2088ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2089ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Merge and cull older profiles where possible. 2090ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool AutofillTable::MigrateToVersion37MergeAndCullOlderProfiles() { 2091ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s(db_->GetUniqueStatement( 2092ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "SELECT guid, date_modified FROM autofill_profiles")); 2093ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s) 2094ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2095ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2096ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Accumulate the good profiles. 2097ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillProfile> accumulated_profiles; 2098ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillProfile*> accumulated_profiles_p; 2099ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::map<std::string, int64> modification_map; 2100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen while (s.Step()) { 2101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::string guid = s.ColumnString(0); 2102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int64 date_modified = s.ColumnInt64(1); 2103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen modification_map.insert( 2104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::pair<std::string, int64>(guid, date_modified)); 2105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AutofillProfile* profile = NULL; 2106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!GetAutofillProfile(guid, &profile)) 2107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<AutofillProfile> p(profile); 2110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (PersonalDataManager::IsValidLearnableProfile(*p)) { 2112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::vector<AutofillProfile> merged_profiles; 2113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool merged = PersonalDataManager::MergeProfile( 2114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *p, accumulated_profiles_p, &merged_profiles); 2115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::swap(accumulated_profiles, merged_profiles); 2117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen accumulated_profiles_p.clear(); 2119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen accumulated_profiles_p.resize(accumulated_profiles.size()); 2120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::transform(accumulated_profiles.begin(), 2121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen accumulated_profiles.end(), 2122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen accumulated_profiles_p.begin(), 2123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen address_of<AutofillProfile>); 2124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // If the profile got merged trash the original. 2126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (merged) 2127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddAutofillGUIDToTrash(p->guid()); 2128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 2130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // An invalid profile, so trash it. 2131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddAutofillGUIDToTrash(p->guid()); 2132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 2133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 2134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Drop the current profiles. 2136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!ClearAutofillProfiles()) 2137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Add the newly merged profiles back in. 2140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (std::vector<AutofillProfile>::const_iterator 2141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen iter = accumulated_profiles.begin(); 2142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen iter != accumulated_profiles.end(); 2143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ++iter) { 2144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!AddAutofillProfile(*iter)) 2145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Fix up the original modification date. 2148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen std::map<std::string, int64>::const_iterator date_item = 2149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen modification_map.find(iter->guid()); 2150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (date_item == modification_map.end()) 2151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement s_date(db_->GetUniqueStatement( 2154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "UPDATE autofill_profiles SET date_modified=? " 2155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "WHERE guid=?")); 2156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_date.BindInt64(0, date_item->second); 2157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen s_date.BindString(1, iter->guid()); 2158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!s_date.Run()) 2159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return false; 2160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 2161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 2162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return true; 2163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 2164