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