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

Side by Side Diff: chrome/browser/password_manager/login_database.cc

Issue 1700017: Get rid of MetaTableHelper class and make use of the app/sql API in the LoginDatabase. (Closed) Base URL: git://git.chromium.org/chromium.git
Patch Set: fix rebase that removed the chrome_tests.gypi Created 10 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/password_manager/login_database.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/password_manager/login_database.h" 5 #include "chrome/browser/password_manager/login_database.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "app/sql/statement.h"
11 #include "app/sql/transaction.h"
10 #include "base/file_path.h" 12 #include "base/file_path.h"
11 #include "base/logging.h" 13 #include "base/logging.h"
12 #include "base/time.h" 14 #include "base/time.h"
13 #include "base/utf_string_conversions.h" 15 #include "base/utf_string_conversions.h"
14 #include "chrome/common/sqlite_utils.h" 16 #include "chrome/common/sqlite_utils.h"
15 17
16 using webkit_glue::PasswordForm; 18 using webkit_glue::PasswordForm;
17 19
18 static const int kCurrentVersionNumber = 1; 20 static const int kCurrentVersionNumber = 1;
19 static const int kCompatibleVersionNumber = 1; 21 static const int kCompatibleVersionNumber = 1;
20 22
21 // Convenience enum for interacting with SQL queries that use all the columns. 23 // Convenience enum for interacting with SQL queries that use all the columns.
22 typedef enum { 24 typedef enum {
23 COLUMN_ORIGIN_URL = 0, 25 COLUMN_ORIGIN_URL = 0,
24 COLUMN_ACTION_URL, 26 COLUMN_ACTION_URL,
25 COLUMN_USERNAME_ELEMENT, 27 COLUMN_USERNAME_ELEMENT,
26 COLUMN_USERNAME_VALUE, 28 COLUMN_USERNAME_VALUE,
27 COLUMN_PASSWORD_ELEMENT, 29 COLUMN_PASSWORD_ELEMENT,
28 COLUMN_PASSWORD_VALUE, 30 COLUMN_PASSWORD_VALUE,
29 COLUMN_SUBMIT_ELEMENT, 31 COLUMN_SUBMIT_ELEMENT,
30 COLUMN_SIGNON_REALM, 32 COLUMN_SIGNON_REALM,
31 COLUMN_SSL_VALID, 33 COLUMN_SSL_VALID,
32 COLUMN_PREFERRED, 34 COLUMN_PREFERRED,
33 COLUMN_DATE_CREATED, 35 COLUMN_DATE_CREATED,
34 COLUMN_BLACKLISTED_BY_USER, 36 COLUMN_BLACKLISTED_BY_USER,
35 COLUMN_SCHEME 37 COLUMN_SCHEME
36 } LoginTableColumns; 38 } LoginTableColumns;
37 39
38 LoginDatabase::LoginDatabase() : db_(NULL) { 40 LoginDatabase::LoginDatabase() {
39 } 41 }
40 42
41 LoginDatabase::~LoginDatabase() { 43 LoginDatabase::~LoginDatabase() {
42 if (db_) {
43 sqlite3_close(db_);
44 db_ = NULL;
45 }
46 } 44 }
47 45
48 bool LoginDatabase::Init(const FilePath& db_path) { 46 bool LoginDatabase::Init(const FilePath& db_path) {
49 if (OpenSqliteDb(db_path, &db_) != SQLITE_OK) { 47 // Set pragmas for a small, private database (based on WebDatabase).
48 db_.set_page_size(2048);
49 db_.set_cache_size(32);
50 db_.set_exclusive_locking();
51
52 if (!db_.Open(db_path)) {
50 LOG(WARNING) << "Unable to open the password store database."; 53 LOG(WARNING) << "Unable to open the password store database.";
51 return false; 54 return false;
52 } 55 }
53 56
54 // Set pragmas for a small, private database (based on WebDatabase). 57 sql::Transaction transaction(&db_);
55 sqlite3_exec(db_, "PRAGMA page_size=2048", NULL, NULL, NULL);
56 sqlite3_exec(db_, "PRAGMA cache_size=32", NULL, NULL, NULL);
57 sqlite3_exec(db_, "PRAGMA locking_mode=EXCLUSIVE", NULL, NULL, NULL);
58
59 SQLTransaction transaction(db_);
60 transaction.Begin(); 58 transaction.Begin();
61 59
62 // Check the database version. 60 // Check the database version.
63 if (!meta_table_.Init(std::string(), kCurrentVersionNumber, 61 if (!meta_table_.Init(&db_, kCurrentVersionNumber,
64 kCompatibleVersionNumber, db_)) { 62 kCompatibleVersionNumber)) {
63 db_.Close();
65 return false; 64 return false;
66 } 65 }
67 if (meta_table_.GetCompatibleVersionNumber() > kCurrentVersionNumber) { 66 if (meta_table_.GetCompatibleVersionNumber() > kCurrentVersionNumber) {
68 LOG(WARNING) << "Password store database is too new."; 67 LOG(WARNING) << "Password store database is too new.";
68 db_.Close();
69 return false; 69 return false;
70 } 70 }
71 71
72 // Initialize the tables. 72 // Initialize the tables.
73 if (!InitLoginsTable()) { 73 if (!InitLoginsTable()) {
74 LOG(WARNING) << "Unable to initialize the password store database."; 74 LOG(WARNING) << "Unable to initialize the password store database.";
75 db_.Close();
75 return false; 76 return false;
76 } 77 }
77 78
78 // If the file on disk is an older database version, bring it up to date. 79 // If the file on disk is an older database version, bring it up to date.
79 MigrateOldVersionsAsNeeded(); 80 MigrateOldVersionsAsNeeded();
80 81
81 return (transaction.Commit() == SQLITE_OK); 82 if (!transaction.Commit()) {
83 db_.Close();
84 return false;
85 }
86 return true;
82 } 87 }
83 88
84 void LoginDatabase::MigrateOldVersionsAsNeeded() { 89 void LoginDatabase::MigrateOldVersionsAsNeeded() {
85 switch (meta_table_.GetVersionNumber()) { 90 switch (meta_table_.GetVersionNumber()) {
86 case kCurrentVersionNumber: 91 case kCurrentVersionNumber:
87 // No migration needed. 92 // No migration needed.
88 return; 93 return;
89 } 94 }
90 } 95 }
91 96
92 bool LoginDatabase::InitLoginsTable() { 97 bool LoginDatabase::InitLoginsTable() {
93 if (!DoesSqliteTableExist(db_, "logins")) { 98 if (!db_.DoesTableExist("logins")) {
94 if (sqlite3_exec(db_, "CREATE TABLE logins (" 99 if (!db_.Execute("CREATE TABLE logins ("
95 "origin_url VARCHAR NOT NULL, " 100 "origin_url VARCHAR NOT NULL, "
96 "action_url VARCHAR, " 101 "action_url VARCHAR, "
97 "username_element VARCHAR, " 102 "username_element VARCHAR, "
98 "username_value VARCHAR, " 103 "username_value VARCHAR, "
99 "password_element VARCHAR, " 104 "password_element VARCHAR, "
100 "password_value BLOB, " 105 "password_value BLOB, "
101 "submit_element VARCHAR, " 106 "submit_element VARCHAR, "
102 "signon_realm VARCHAR NOT NULL," 107 "signon_realm VARCHAR NOT NULL,"
103 "ssl_valid INTEGER NOT NULL," 108 "ssl_valid INTEGER NOT NULL,"
104 "preferred INTEGER NOT NULL," 109 "preferred INTEGER NOT NULL,"
105 "date_created INTEGER NOT NULL," 110 "date_created INTEGER NOT NULL,"
106 "blacklisted_by_user INTEGER NOT NULL," 111 "blacklisted_by_user INTEGER NOT NULL,"
107 "scheme INTEGER NOT NULL," 112 "scheme INTEGER NOT NULL,"
108 "UNIQUE " 113 "UNIQUE "
109 "(origin_url, username_element, " 114 "(origin_url, username_element, "
110 "username_value, password_element, " 115 "username_value, password_element, "
111 "submit_element, signon_realm))", 116 "submit_element, signon_realm))")) {
112 NULL, NULL, NULL) != SQLITE_OK) {
113 NOTREACHED(); 117 NOTREACHED();
114 return false; 118 return false;
115 } 119 }
116 if (sqlite3_exec(db_, "CREATE INDEX logins_signon ON " 120 if (!db_.Execute("CREATE INDEX logins_signon ON "
117 "logins (signon_realm)", 121 "logins (signon_realm)")) {
118 NULL, NULL, NULL) != SQLITE_OK) {
119 NOTREACHED(); 122 NOTREACHED();
120 return false; 123 return false;
121 } 124 }
122 } 125 }
123 return true; 126 return true;
124 } 127 }
125 128
126 129
127 bool LoginDatabase::AddLogin(const PasswordForm& form) { 130 bool LoginDatabase::AddLogin(const PasswordForm& form) {
128 SQLStatement s;
129 // You *must* change LoginTableColumns if this query changes. 131 // You *must* change LoginTableColumns if this query changes.
130 if (s.prepare(db_, 132 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
131 "INSERT OR REPLACE INTO logins " 133 "INSERT OR REPLACE INTO logins "
132 "(origin_url, action_url, username_element, username_value, " 134 "(origin_url, action_url, username_element, username_value, "
133 " password_element, password_value, submit_element, " 135 " password_element, password_value, submit_element, "
134 " signon_realm, ssl_valid, preferred, date_created, " 136 " signon_realm, ssl_valid, preferred, date_created, "
135 " blacklisted_by_user, scheme) " 137 " blacklisted_by_user, scheme) "
136 "VALUES " 138 "VALUES "
137 "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") != SQLITE_OK) { 139 "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"));
140 if (!s) {
138 NOTREACHED() << "Statement prepare failed"; 141 NOTREACHED() << "Statement prepare failed";
139 return false; 142 return false;
140 } 143 }
141 144
142 s.bind_string(COLUMN_ORIGIN_URL, form.origin.spec()); 145 s.BindString(COLUMN_ORIGIN_URL, form.origin.spec());
143 s.bind_string(COLUMN_ACTION_URL, form.action.spec()); 146 s.BindString(COLUMN_ACTION_URL, form.action.spec());
144 s.bind_string16(COLUMN_USERNAME_ELEMENT, form.username_element); 147 s.BindString16(COLUMN_USERNAME_ELEMENT, form.username_element);
145 s.bind_string16(COLUMN_USERNAME_VALUE, form.username_value); 148 s.BindString16(COLUMN_USERNAME_VALUE, form.username_value);
146 s.bind_string16(COLUMN_PASSWORD_ELEMENT, form.password_element); 149 s.BindString16(COLUMN_PASSWORD_ELEMENT, form.password_element);
147 std::string encrypted_password = EncryptedString(form.password_value); 150 std::string encrypted_password = EncryptedString(form.password_value);
148 s.bind_blob(COLUMN_PASSWORD_VALUE, encrypted_password.data(), 151 s.BindBlob(COLUMN_PASSWORD_VALUE, encrypted_password.data(),
149 static_cast<int>(encrypted_password.length())); 152 static_cast<int>(encrypted_password.length()));
150 s.bind_string16(COLUMN_SUBMIT_ELEMENT, form.submit_element); 153 s.BindString16(COLUMN_SUBMIT_ELEMENT, form.submit_element);
151 s.bind_string(COLUMN_SIGNON_REALM, form.signon_realm); 154 s.BindString(COLUMN_SIGNON_REALM, form.signon_realm);
152 s.bind_int(COLUMN_SSL_VALID, form.ssl_valid); 155 s.BindInt(COLUMN_SSL_VALID, form.ssl_valid);
153 s.bind_int(COLUMN_PREFERRED, form.preferred); 156 s.BindInt(COLUMN_PREFERRED, form.preferred);
154 s.bind_int64(COLUMN_DATE_CREATED, form.date_created.ToTimeT()); 157 s.BindInt64(COLUMN_DATE_CREATED, form.date_created.ToTimeT());
155 s.bind_int(COLUMN_BLACKLISTED_BY_USER, form.blacklisted_by_user); 158 s.BindInt(COLUMN_BLACKLISTED_BY_USER, form.blacklisted_by_user);
156 s.bind_int(COLUMN_SCHEME, form.scheme); 159 s.BindInt(COLUMN_SCHEME, form.scheme);
157 if (s.step() != SQLITE_DONE) { 160 if (!s.Run()) {
158 NOTREACHED(); 161 NOTREACHED();
159 return false; 162 return false;
160 } 163 }
161 return true; 164 return true;
162 } 165 }
163 166
164 bool LoginDatabase::UpdateLogin(const PasswordForm& form, int* items_changed) { 167 bool LoginDatabase::UpdateLogin(const PasswordForm& form, int* items_changed) {
165 SQLStatement s; 168 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
166 if (s.prepare(db_, "UPDATE logins SET " 169 "UPDATE logins SET "
167 "action_url = ?, " 170 "action_url = ?, "
168 "password_value = ?, " 171 "password_value = ?, "
169 "ssl_valid = ?, " 172 "ssl_valid = ?, "
170 "preferred = ? " 173 "preferred = ? "
171 "WHERE origin_url = ? AND " 174 "WHERE origin_url = ? AND "
172 "username_element = ? AND " 175 "username_element = ? AND "
173 "username_value = ? AND " 176 "username_value = ? AND "
174 "password_element = ? AND " 177 "password_element = ? AND "
175 "signon_realm = ?") != SQLITE_OK) { 178 "signon_realm = ?"));
179 if (!s) {
176 NOTREACHED() << "Statement prepare failed"; 180 NOTREACHED() << "Statement prepare failed";
177 return false; 181 return false;
178 } 182 }
179 183
180 s.bind_string(0, form.action.spec()); 184 s.BindString(0, form.action.spec());
181 std::string encrypted_password = EncryptedString(form.password_value); 185 std::string encrypted_password = EncryptedString(form.password_value);
182 s.bind_blob(1, encrypted_password.data(), 186 s.BindBlob(1, encrypted_password.data(),
183 static_cast<int>(encrypted_password.length())); 187 static_cast<int>(encrypted_password.length()));
184 s.bind_int(2, form.ssl_valid); 188 s.BindInt(2, form.ssl_valid);
185 s.bind_int(3, form.preferred); 189 s.BindInt(3, form.preferred);
186 s.bind_string(4, form.origin.spec()); 190 s.BindString(4, form.origin.spec());
187 s.bind_string16(5, form.username_element); 191 s.BindString16(5, form.username_element);
188 s.bind_string16(6, form.username_value); 192 s.BindString16(6, form.username_value);
189 s.bind_string16(7, form.password_element); 193 s.BindString16(7, form.password_element);
190 s.bind_string(8, form.signon_realm); 194 s.BindString(8, form.signon_realm);
191 195
192 if (s.step() != SQLITE_DONE) { 196 if (!s.Run()) {
193 NOTREACHED(); 197 NOTREACHED();
194 return false; 198 return false;
195 } 199 }
196 if (items_changed) { 200 if (items_changed) {
197 *items_changed = s.changes(); 201 *items_changed = db_.GetLastChangeCount();
198 } 202 }
199 return true; 203 return true;
200 } 204 }
201 205
202 bool LoginDatabase::RemoveLogin(const PasswordForm& form) { 206 bool LoginDatabase::RemoveLogin(const PasswordForm& form) {
203 SQLStatement s;
204 // Remove a login by UNIQUE-constrained fields. 207 // Remove a login by UNIQUE-constrained fields.
205 if (s.prepare(db_, 208 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
206 "DELETE FROM logins WHERE " 209 "DELETE FROM logins WHERE "
207 "origin_url = ? AND " 210 "origin_url = ? AND "
208 "username_element = ? AND " 211 "username_element = ? AND "
209 "username_value = ? AND " 212 "username_value = ? AND "
210 "password_element = ? AND " 213 "password_element = ? AND "
211 "submit_element = ? AND " 214 "submit_element = ? AND "
212 "signon_realm = ? ") != SQLITE_OK) { 215 "signon_realm = ? "));
216 if (!s) {
213 NOTREACHED() << "Statement prepare failed"; 217 NOTREACHED() << "Statement prepare failed";
214 return false; 218 return false;
215 } 219 }
216 220
217 s.bind_string(0, form.origin.spec()); 221 s.BindString(0, form.origin.spec());
218 s.bind_string16(1, form.username_element); 222 s.BindString16(1, form.username_element);
219 s.bind_string16(2, form.username_value); 223 s.BindString16(2, form.username_value);
220 s.bind_string16(3, form.password_element); 224 s.BindString16(3, form.password_element);
221 s.bind_string16(4, form.submit_element); 225 s.BindString16(4, form.submit_element);
222 s.bind_string(5, form.signon_realm); 226 s.BindString(5, form.signon_realm);
223 227
224 if (s.step() != SQLITE_DONE) { 228 if (!s.Run()) {
225 NOTREACHED(); 229 NOTREACHED();
226 return false; 230 return false;
227 } 231 }
228 return true; 232 return true;
229 } 233 }
230 234
231 bool LoginDatabase::RemoveLoginsCreatedBetween(const base::Time delete_begin, 235 bool LoginDatabase::RemoveLoginsCreatedBetween(const base::Time delete_begin,
232 const base::Time delete_end) { 236 const base::Time delete_end) {
233 SQLStatement s; 237 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
234 if (s.prepare(db_, 238 "DELETE FROM logins WHERE "
235 "DELETE FROM logins WHERE " 239 "date_created >= ? AND date_created < ?"));
236 "date_created >= ? AND date_created < ?") != SQLITE_OK) { 240 if (!s) {
237 NOTREACHED() << "Statement prepare failed"; 241 NOTREACHED() << "Statement prepare failed";
238 return false; 242 return false;
239 } 243 }
240 s.bind_int64(0, delete_begin.ToTimeT()); 244 s.BindInt64(0, delete_begin.ToTimeT());
241 s.bind_int64(1, delete_end.is_null() ? std::numeric_limits<int64>::max() 245 s.BindInt64(1, delete_end.is_null() ? std::numeric_limits<int64>::max()
242 : delete_end.ToTimeT()); 246 : delete_end.ToTimeT());
243 247
244 return s.step() == SQLITE_DONE; 248 return s.Run();
245 } 249 }
246 250
247 void LoginDatabase::InitPasswordFormFromStatement(PasswordForm* form, 251 void LoginDatabase::InitPasswordFormFromStatement(PasswordForm* form,
248 SQLStatement* s) const { 252 sql::Statement& s) const {
249 std::string tmp; 253 std::string tmp = s.ColumnString(COLUMN_ORIGIN_URL);
250 s->column_string(COLUMN_ORIGIN_URL, &tmp);
251 form->origin = GURL(tmp); 254 form->origin = GURL(tmp);
252 s->column_string(COLUMN_ACTION_URL, &tmp); 255 tmp = s.ColumnString(COLUMN_ACTION_URL);
253 form->action = GURL(tmp); 256 form->action = GURL(tmp);
254 s->column_string16(COLUMN_USERNAME_ELEMENT, &form->username_element); 257 form->username_element = s.ColumnString16(COLUMN_USERNAME_ELEMENT);
255 s->column_string16(COLUMN_USERNAME_VALUE, &form->username_value); 258 form->username_value = s.ColumnString16(COLUMN_USERNAME_VALUE);
256 s->column_string16(COLUMN_PASSWORD_ELEMENT, &form->password_element); 259 form->password_element = s.ColumnString16(COLUMN_PASSWORD_ELEMENT);
257 std::string encrypted_password; 260 std::string encrypted_password;
258 s->column_blob_as_string(COLUMN_PASSWORD_VALUE, &encrypted_password); 261 s.ColumnBlobAsString(COLUMN_PASSWORD_VALUE, &encrypted_password);
259 form->password_value = DecryptedString(encrypted_password); 262 form->password_value = DecryptedString(encrypted_password);
260 s->column_string16(COLUMN_SUBMIT_ELEMENT, &form->submit_element); 263 form->submit_element = s.ColumnString16(COLUMN_SUBMIT_ELEMENT);
261 s->column_string(COLUMN_SIGNON_REALM, &tmp); 264 tmp = s.ColumnString(COLUMN_SIGNON_REALM);
262 form->signon_realm = tmp; 265 form->signon_realm = tmp;
263 form->ssl_valid = (s->column_int(COLUMN_SSL_VALID) > 0); 266 form->ssl_valid = (s.ColumnInt(COLUMN_SSL_VALID) > 0);
264 form->preferred = (s->column_int(COLUMN_PREFERRED) > 0); 267 form->preferred = (s.ColumnInt(COLUMN_PREFERRED) > 0);
265 form->date_created = base::Time::FromTimeT( 268 form->date_created = base::Time::FromTimeT(
266 s->column_int64(COLUMN_DATE_CREATED)); 269 s.ColumnInt64(COLUMN_DATE_CREATED));
267 form->blacklisted_by_user = (s->column_int(COLUMN_BLACKLISTED_BY_USER) > 0); 270 form->blacklisted_by_user = (s.ColumnInt(COLUMN_BLACKLISTED_BY_USER) > 0);
268 int scheme_int = s->column_int(COLUMN_SCHEME); 271 int scheme_int = s.ColumnInt(COLUMN_SCHEME);
269 DCHECK((scheme_int >= 0) && (scheme_int <= PasswordForm::SCHEME_OTHER)); 272 DCHECK((scheme_int >= 0) && (scheme_int <= PasswordForm::SCHEME_OTHER));
270 form->scheme = static_cast<PasswordForm::Scheme>(scheme_int); 273 form->scheme = static_cast<PasswordForm::Scheme>(scheme_int);
271 } 274 }
272 275
273 bool LoginDatabase::GetLogins(const PasswordForm& form, 276 bool LoginDatabase::GetLogins(const PasswordForm& form,
274 std::vector<PasswordForm*>* forms) const { 277 std::vector<PasswordForm*>* forms) const {
275 DCHECK(forms); 278 DCHECK(forms);
276 SQLStatement s;
277 // You *must* change LoginTableColumns if this query changes. 279 // You *must* change LoginTableColumns if this query changes.
278 if (s.prepare(db_, 280 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
279 "SELECT origin_url, action_url, " 281 "SELECT origin_url, action_url, "
280 "username_element, username_value, " 282 "username_element, username_value, "
281 "password_element, password_value, " 283 "password_element, password_value, "
282 "submit_element, signon_realm, ssl_valid, preferred, " 284 "submit_element, signon_realm, ssl_valid, preferred, "
283 "date_created, blacklisted_by_user, scheme FROM logins " 285 "date_created, blacklisted_by_user, scheme FROM logins "
284 "WHERE signon_realm == ? ") != SQLITE_OK) { 286 "WHERE signon_realm == ? "));
287 if (!s) {
285 NOTREACHED() << "Statement prepare failed"; 288 NOTREACHED() << "Statement prepare failed";
286 return false; 289 return false;
287 } 290 }
288 291
289 s.bind_string(0, form.signon_realm); 292 s.BindString(0, form.signon_realm);
290 293
291 int result; 294 while (s.Step()) {
292 while ((result = s.step()) == SQLITE_ROW) {
293 PasswordForm* new_form = new PasswordForm(); 295 PasswordForm* new_form = new PasswordForm();
294 InitPasswordFormFromStatement(new_form, &s); 296 InitPasswordFormFromStatement(new_form, s);
295 297
296 forms->push_back(new_form); 298 forms->push_back(new_form);
297 } 299 }
298 return result == SQLITE_DONE; 300 return s.Succeeded();
299 } 301 }
300 302
301 bool LoginDatabase::GetLoginsCreatedBetween( 303 bool LoginDatabase::GetLoginsCreatedBetween(
302 const base::Time begin, 304 const base::Time begin,
303 const base::Time end, 305 const base::Time end,
304 std::vector<webkit_glue::PasswordForm*>* forms) const { 306 std::vector<webkit_glue::PasswordForm*>* forms) const {
305 DCHECK(forms); 307 DCHECK(forms);
306 SQLStatement s; 308 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
307 std::string stmt = "SELECT origin_url, action_url, " 309 "SELECT origin_url, action_url, "
308 "username_element, username_value, " 310 "username_element, username_value, "
309 "password_element, password_value, " 311 "password_element, password_value, "
310 "submit_element, signon_realm, ssl_valid, preferred, " 312 "submit_element, signon_realm, ssl_valid, preferred, "
311 "date_created, blacklisted_by_user, scheme FROM logins " 313 "date_created, blacklisted_by_user, scheme FROM logins "
312 "WHERE date_created >= ? AND date_created < ?" 314 "WHERE date_created >= ? AND date_created < ?"
313 "ORDER BY origin_url"; 315 "ORDER BY origin_url"));
314 316
315 if (s.prepare(db_, stmt.c_str()) != SQLITE_OK) { 317 if (!s) {
316 NOTREACHED() << "Statement prepare failed"; 318 NOTREACHED() << "Statement prepare failed";
317 return false; 319 return false;
318 } 320 }
319 s.bind_int64(0, begin.ToTimeT()); 321 s.BindInt64(0, begin.ToTimeT());
320 s.bind_int64(1, end.is_null() ? std::numeric_limits<int64>::max() 322 s.BindInt64(1, end.is_null() ? std::numeric_limits<int64>::max()
321 : end.ToTimeT()); 323 : end.ToTimeT());
322 324
323 int result; 325 while (s.Step()) {
324 while ((result = s.step()) == SQLITE_ROW) {
325 PasswordForm* new_form = new PasswordForm(); 326 PasswordForm* new_form = new PasswordForm();
326 InitPasswordFormFromStatement(new_form, &s); 327 InitPasswordFormFromStatement(new_form, s);
327 328
328 forms->push_back(new_form); 329 forms->push_back(new_form);
329 } 330 }
330 return result == SQLITE_DONE; 331 return s.Succeeded();
331 } 332 }
332 333
333 bool LoginDatabase::GetAutofillableLogins( 334 bool LoginDatabase::GetAutofillableLogins(
334 std::vector<PasswordForm*>* forms) const { 335 std::vector<PasswordForm*>* forms) const {
335 return GetAllLoginsWithBlacklistSetting(false, forms); 336 return GetAllLoginsWithBlacklistSetting(false, forms);
336 } 337 }
337 338
338 bool LoginDatabase::GetBlacklistLogins( 339 bool LoginDatabase::GetBlacklistLogins(
339 std::vector<PasswordForm*>* forms) const { 340 std::vector<PasswordForm*>* forms) const {
340 return GetAllLoginsWithBlacklistSetting(true, forms); 341 return GetAllLoginsWithBlacklistSetting(true, forms);
341 } 342 }
342 343
343 bool LoginDatabase::GetAllLoginsWithBlacklistSetting( 344 bool LoginDatabase::GetAllLoginsWithBlacklistSetting(
344 bool blacklisted, std::vector<PasswordForm*>* forms) const { 345 bool blacklisted, std::vector<PasswordForm*>* forms) const {
345 DCHECK(forms); 346 DCHECK(forms);
346 SQLStatement s;
347 // You *must* change LoginTableColumns if this query changes. 347 // You *must* change LoginTableColumns if this query changes.
348 std::string stmt = "SELECT origin_url, action_url, " 348 sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE,
349 "username_element, username_value, " 349 "SELECT origin_url, action_url, "
350 "password_element, password_value, " 350 "username_element, username_value, "
351 "submit_element, signon_realm, ssl_valid, preferred, " 351 "password_element, password_value, "
352 "date_created, blacklisted_by_user, scheme FROM logins " 352 "submit_element, signon_realm, ssl_valid, preferred, "
353 "WHERE blacklisted_by_user == ? " 353 "date_created, blacklisted_by_user, scheme FROM logins "
354 "ORDER BY origin_url"; 354 "WHERE blacklisted_by_user == ? "
355 "ORDER BY origin_url"));
355 356
356 if (s.prepare(db_, stmt.c_str()) != SQLITE_OK) { 357 if (!s) {
357 NOTREACHED() << "Statement prepare failed"; 358 NOTREACHED() << "Statement prepare failed";
358 return false; 359 return false;
359 } 360 }
360 s.bind_int(0, blacklisted ? 1 : 0); 361 s.BindInt(0, blacklisted ? 1 : 0);
361 362
362 int result; 363 while (s.Step()) {
363 while ((result = s.step()) == SQLITE_ROW) {
364 PasswordForm* new_form = new PasswordForm(); 364 PasswordForm* new_form = new PasswordForm();
365 InitPasswordFormFromStatement(new_form, &s); 365 InitPasswordFormFromStatement(new_form, s);
366 366
367 forms->push_back(new_form); 367 forms->push_back(new_form);
368 } 368 }
369 return result == SQLITE_DONE; 369 return s.Succeeded();
370 } 370 }
OLDNEW
« no previous file with comments | « chrome/browser/password_manager/login_database.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698