diff options
author | stuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-11 17:14:16 +0000 |
---|---|---|
committer | stuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-11 17:14:16 +0000 |
commit | 5eea116d26ede67503c4ac8565d047e0182ab049 (patch) | |
tree | 927c6a0809460178297e390c137abce556f031e6 | |
parent | c1c85d10998a544c8a938e3b5a025358b1c1b858 (diff) | |
download | chromium_src-5eea116d26ede67503c4ac8565d047e0182ab049.zip chromium_src-5eea116d26ede67503c4ac8565d047e0182ab049.tar.gz chromium_src-5eea116d26ede67503c4ac8565d047e0182ab049.tar.bz2 |
Get rid of MetaTableHelper class and make use of the app/sql API in the LoginDatabase.
BUG=None
TEST=compiles
Patch from Thiago Farina <thiago.farina@gmail.com>
Review URL: http://codereview.chromium.org/1700017
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@46929 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | app/sql/statement.cc | 31 | ||||
-rw-r--r-- | app/sql/statement.h | 6 | ||||
-rw-r--r-- | chrome/browser/history/starred_url_database.cc | 3 | ||||
-rw-r--r-- | chrome/browser/history/thumbnail_database.h | 3 | ||||
-rw-r--r-- | chrome/browser/meta_table_helper.cc | 167 | ||||
-rw-r--r-- | chrome/browser/meta_table_helper.h | 91 | ||||
-rw-r--r-- | chrome/browser/meta_table_helper_unittest.cc | 28 | ||||
-rw-r--r-- | chrome/browser/password_manager/login_database.cc | 308 | ||||
-rw-r--r-- | chrome/browser/password_manager/login_database.h | 14 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 1 |
11 files changed, 198 insertions, 456 deletions
diff --git a/app/sql/statement.cc b/app/sql/statement.cc index 9f1d85a..639b02d 100644 --- a/app/sql/statement.cc +++ b/app/sql/statement.cc @@ -1,10 +1,11 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "app/sql/statement.h" #include "base/logging.h" +#include "base/utf_string_conversions.h" #include "third_party/sqlite/preprocessed/sqlite3.h" namespace sql { @@ -117,6 +118,10 @@ bool Statement::BindString(int col, const std::string& val) { return false; } +bool Statement::BindString16(int col, const string16& value) { + return BindString(col, UTF16ToUTF8(value)); +} + bool Statement::BindBlob(int col, const void* val, int val_len) { if (is_valid()) { int err = CheckError(sqlite3_bind_blob(ref_->stmt(), col + 1, @@ -188,6 +193,15 @@ std::string Statement::ColumnString(int col) const { return result; } +string16 Statement::ColumnString16(int col) const { + if (!is_valid()) { + NOTREACHED(); + return string16(); + } + std::string s = ColumnString(col); + return !s.empty() ? UTF8ToUTF16(s) : string16(); +} + int Statement::ColumnByteLength(int col) const { if (!is_valid()) { NOTREACHED(); @@ -205,6 +219,21 @@ const void* Statement::ColumnBlob(int col) const { return sqlite3_column_blob(ref_->stmt(), col); } +bool Statement::ColumnBlobAsString(int col, std::string* blob) { + if (!is_valid()) { + NOTREACHED(); + return false; + } + const void* p = ColumnBlob(col); + size_t len = ColumnByteLength(col); + blob->resize(len); + if (blob->size() != len) { + return false; + } + blob->assign(reinterpret_cast<const char*>(p), len); + return true; +} + void Statement::ColumnBlobAsVector(int col, std::vector<char>* val) const { val->clear(); if (!is_valid()) { diff --git a/app/sql/statement.h b/app/sql/statement.h index 22682c8..0fbbfba 100644 --- a/app/sql/statement.h +++ b/app/sql/statement.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -11,6 +11,7 @@ #include "app/sql/connection.h" #include "base/basictypes.h" #include "base/ref_counted.h" +#include "base/string16.h" namespace sql { @@ -104,6 +105,7 @@ class Statement { bool BindDouble(int col, double val); bool BindCString(int col, const char* val); bool BindString(int col, const std::string& val); + bool BindString16(int col, const string16& value); bool BindBlob(int col, const void* value, int value_len); // Retrieving ---------------------------------------------------------------- @@ -125,12 +127,14 @@ class Statement { int64 ColumnInt64(int col) const; double ColumnDouble(int col) const; std::string ColumnString(int col) const; + string16 ColumnString16(int col) const; // When reading a blob, you can get a raw pointer to the underlying data, // along with the length, or you can just ask us to copy the blob into a // vector. Danger! ColumnBlob may return NULL if there is no data! int ColumnByteLength(int col) const; const void* ColumnBlob(int col) const; + bool ColumnBlobAsString(int col, std::string* blob); void ColumnBlobAsVector(int col, std::vector<char>* val) const; void ColumnBlobAsVector(int col, std::vector<unsigned char>* val) const; diff --git a/chrome/browser/history/starred_url_database.cc b/chrome/browser/history/starred_url_database.cc index 48da8c4..23692eb 100644 --- a/chrome/browser/history/starred_url_database.cc +++ b/chrome/browser/history/starred_url_database.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -17,7 +17,6 @@ #include "chrome/browser/bookmarks/bookmark_model.h" #include "chrome/browser/history/history.h" #include "chrome/browser/history/query_parser.h" -#include "chrome/browser/meta_table_helper.h" // The following table is used to store star (aka bookmark) information. This // class derives from URLDatabase, which has its own schema. diff --git a/chrome/browser/history/thumbnail_database.h b/chrome/browser/history/thumbnail_database.h index fb24357..547e930 100644 --- a/chrome/browser/history/thumbnail_database.h +++ b/chrome/browser/history/thumbnail_database.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -13,7 +13,6 @@ #include "base/ref_counted.h" #include "chrome/browser/history/history_types.h" #include "chrome/browser/history/url_database.h" // For DBCloseScoper. -#include "chrome/browser/meta_table_helper.h" class FilePath; class RefCountedMemory; diff --git a/chrome/browser/meta_table_helper.cc b/chrome/browser/meta_table_helper.cc deleted file mode 100644 index 169ba763..0000000 --- a/chrome/browser/meta_table_helper.cc +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/meta_table_helper.h" - -#include "base/logging.h" -#include "base/string_util.h" -#include "chrome/common/sqlite_utils.h" - -// Key used in our meta table for version numbers. -static const char kVersionKey[] = "version"; -static const char kCompatibleVersionKey[] = "last_compatible_version"; - -MetaTableHelper::MetaTableHelper() : db_(NULL) { -} - -MetaTableHelper::~MetaTableHelper() { -} - -bool MetaTableHelper::Init(const std::string& db_name, - int version, - int compatible_version, - sqlite3* db) { - DCHECK(!db_ && db); - db_ = db; - db_name_ = db_name; - if (!DoesSqliteTableExist(db_, db_name.c_str(), "meta")) { - // Build the sql. - std::string sql("CREATE TABLE "); - appendMetaTableName(db_name, &sql); - sql.append("(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY," - "value LONGVARCHAR)"); - - if (sqlite3_exec(db_, sql.c_str(), NULL, NULL, NULL) != SQLITE_OK) - return false; - - // Note: there is no index over the meta table. We currently only have a - // couple of keys, so it doesn't matter. If we start storing more stuff in - // there, we should create an index. - SetVersionNumber(version); - SetCompatibleVersionNumber(compatible_version); - } - return true; -} - -bool MetaTableHelper::SetValue(const std::string& key, - const std::wstring& value) { - SQLStatement s; - if (!PrepareSetStatement(&s, key)) - return false; - s.bind_wstring(1, value); - return s.step() == SQLITE_DONE; -} - -bool MetaTableHelper::GetValue(const std::string& key, - std::wstring* value) { - DCHECK(value); - SQLStatement s; - if (!PrepareGetStatement(&s, key)) - return false; - - s.column_wstring(0, value); - return true; -} - -bool MetaTableHelper::SetValue(const std::string& key, - int value) { - SQLStatement s; - if (!PrepareSetStatement(&s, key)) - return false; - s.bind_int(1, value); - return s.step() == SQLITE_DONE; -} - -bool MetaTableHelper::GetValue(const std::string& key, - int* value) { - DCHECK(value); - SQLStatement s; - if (!PrepareGetStatement(&s, key)) - return false; - - *value = s.column_int(0); - return true; -} - -bool MetaTableHelper::SetValue(const std::string& key, - int64 value) { - SQLStatement s; - if (!PrepareSetStatement(&s, key)) - return false; - s.bind_int64(1, value); - return s.step() == SQLITE_DONE; -} - -bool MetaTableHelper::GetValue(const std::string& key, - int64* value) { - DCHECK(value); - SQLStatement s; - if (!PrepareGetStatement(&s, key)) - return false; - - *value = s.column_int64(0); - return true; -} - -void MetaTableHelper::SetVersionNumber(int version) { - SetValue(kVersionKey, version); -} - -int MetaTableHelper::GetVersionNumber() { - int version = 0; - if (!GetValue(kVersionKey, &version)) - return 0; - return version; -} - -void MetaTableHelper::SetCompatibleVersionNumber(int version) { - SetValue(kCompatibleVersionKey, version); -} - -int MetaTableHelper::GetCompatibleVersionNumber() { - int version = 0; - if (!GetValue(kCompatibleVersionKey, &version)) - return 0; - return version; -} - -// static -void MetaTableHelper::appendMetaTableName(const std::string& db_name, - std::string* sql) { - if (!db_name.empty()) { - sql->append(db_name); - sql->push_back('.'); - } - sql->append("meta"); -} - -bool MetaTableHelper::PrepareSetStatement(SQLStatement* statement, - const std::string& key) { - DCHECK(db_ && statement); - std::string sql("INSERT OR REPLACE INTO "); - appendMetaTableName(db_name_, &sql); - sql.append("(key,value) VALUES(?,?)"); - if (statement->prepare(db_, sql.c_str()) != SQLITE_OK) { - NOTREACHED() << sqlite3_errmsg(db_); - return false; - } - statement->bind_text(0, key.c_str()); - return true; -} - -bool MetaTableHelper::PrepareGetStatement(SQLStatement* statement, - const std::string& key) { - DCHECK(db_ && statement); - std::string sql("SELECT value FROM "); - appendMetaTableName(db_name_, &sql); - sql.append(" WHERE key = ?"); - if (statement->prepare(db_, sql.c_str()) != SQLITE_OK) { - NOTREACHED() << sqlite3_errmsg(db_); - return false; - } - statement->bind_string(0, key); - if (statement->step() != SQLITE_ROW) - return false; - return true; -} diff --git a/chrome/browser/meta_table_helper.h b/chrome/browser/meta_table_helper.h deleted file mode 100644 index 55db34f..0000000 --- a/chrome/browser/meta_table_helper.h +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_META_TABLE_HELPER_H__ -#define CHROME_BROWSER_META_TABLE_HELPER_H__ - -#include <string> - -#include "base/basictypes.h" - -struct sqlite3; -class SQLStatement; - -// MetaTableHelper maintains arbitrary key/value pairs in a table, as well -// as version information. MetaTableHelper is used by both WebDatabase and -// HistoryDatabase to maintain version information. -// -// To use a MetalTableHelper you must invoke the init method specifying the -// database to use. -class MetaTableHelper { - public: - // Creates a new MetaTableHelper. After construction you must invoke - // Init with the appropriate database. - MetaTableHelper(); - ~MetaTableHelper(); - - // Initializes the MetaTableHelper, creating the meta table if necessary. For - // new tables, it will initialize the version number to |version| and the - // compatible version number to |compatible_version|. - // - // The name of the database in the sqlite connection (for tables named with - // the "db_name.table_name" scheme is given in |db_name|. If empty, it is - // assumed there is no database name. - bool Init(const std::string& db_name, - int version, - int compatible_version, - sqlite3* db); - - // Version number. This should be the version number of the creator of the - // file. GetVersionNumber will return 0 if there is no version number. - // See also *CompatibleVersionNumber. - void SetVersionNumber(int version); - int GetVersionNumber(); - - // The compatible version number is the lowest version that this file format - // is readable by. If an addition or other non-critical change is made to the - // file in such a way that it could be read or written non-catastrophically - // by an older version, this number tells us which version that is. - // - // Any version newer than this should be able to interpret the file. Any - // version older than this should not touch the file or else it might - // corrupt it. - // - // GetCompatibleVersionNumber will return 0 if there is none. - void SetCompatibleVersionNumber(int version); - int GetCompatibleVersionNumber(); - - // Arbitrary key/value pair with a wstring value. - bool SetValue(const std::string& key, const std::wstring& value); - bool GetValue(const std::string& key, std::wstring* value); - - // Arbitrary key/value pair with an int value. - bool SetValue(const std::string& key, int value); - bool GetValue(const std::string& key, int* value); - - // Arbitrary key/value pair with an int64 value. - bool SetValue(const std::string& key, int64 value); - bool GetValue(const std::string& key, int64* value); - - private: - friend class MetaTableHelperTest; - - // Appends the meta table name to the SQL statement. - static void appendMetaTableName(const std::string& db_name, std::string* sql); - - // Conveniences to prepare the two types of statements used by - // MetaTableHelper. - bool PrepareSetStatement(SQLStatement* statement, const std::string& key); - bool PrepareGetStatement(SQLStatement* statement, const std::string& key); - - sqlite3* db_; - - // Name of the database within the connection, if there is one. When empty, - // there is no special database name. - std::string db_name_; - - DISALLOW_EVIL_CONSTRUCTORS(MetaTableHelper); -}; - -#endif // CHROME_BROWSER_META_TABLE_HELPER_H__ diff --git a/chrome/browser/meta_table_helper_unittest.cc b/chrome/browser/meta_table_helper_unittest.cc deleted file mode 100644 index 0d8ae5b..0000000 --- a/chrome/browser/meta_table_helper_unittest.cc +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Tests for MetaTableHelper. - -#include "chrome/browser/meta_table_helper.h" -#include "testing/gtest/include/gtest/gtest.h" - -class MetaTableHelperTest : public testing::Test { - public: - static void appendMetaTableName(const std::string& db_name, - std::string* sql) { - MetaTableHelper::appendMetaTableName(db_name, sql); - } -}; - -TEST_F(MetaTableHelperTest, EmptyDbName) { - std::string sql("select * from "); - MetaTableHelperTest::appendMetaTableName(std::string(), &sql); - EXPECT_EQ("select * from meta", sql); -} - -TEST_F(MetaTableHelperTest, NonEmptyDbName) { - std::string sql("select * from "); - MetaTableHelperTest::appendMetaTableName(std::string("mydb"), &sql); - EXPECT_EQ("select * from mydb.meta", sql); -} diff --git a/chrome/browser/password_manager/login_database.cc b/chrome/browser/password_manager/login_database.cc index 02d2fb6..d66135a 100644 --- a/chrome/browser/password_manager/login_database.cc +++ b/chrome/browser/password_manager/login_database.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,6 +7,8 @@ #include <algorithm> #include <limits> +#include "app/sql/statement.h" +#include "app/sql/transaction.h" #include "base/file_path.h" #include "base/logging.h" #include "base/time.h" @@ -35,50 +37,53 @@ typedef enum { COLUMN_SCHEME } LoginTableColumns; -LoginDatabase::LoginDatabase() : db_(NULL) { +LoginDatabase::LoginDatabase() { } LoginDatabase::~LoginDatabase() { - if (db_) { - sqlite3_close(db_); - db_ = NULL; - } } bool LoginDatabase::Init(const FilePath& db_path) { - if (OpenSqliteDb(db_path, &db_) != SQLITE_OK) { + // Set pragmas for a small, private database (based on WebDatabase). + db_.set_page_size(2048); + db_.set_cache_size(32); + db_.set_exclusive_locking(); + + if (!db_.Open(db_path)) { LOG(WARNING) << "Unable to open the password store database."; return false; } - // Set pragmas for a small, private database (based on WebDatabase). - sqlite3_exec(db_, "PRAGMA page_size=2048", NULL, NULL, NULL); - sqlite3_exec(db_, "PRAGMA cache_size=32", NULL, NULL, NULL); - sqlite3_exec(db_, "PRAGMA locking_mode=EXCLUSIVE", NULL, NULL, NULL); - - SQLTransaction transaction(db_); + sql::Transaction transaction(&db_); transaction.Begin(); // Check the database version. - if (!meta_table_.Init(std::string(), kCurrentVersionNumber, - kCompatibleVersionNumber, db_)) { + if (!meta_table_.Init(&db_, kCurrentVersionNumber, + kCompatibleVersionNumber)) { + db_.Close(); return false; } if (meta_table_.GetCompatibleVersionNumber() > kCurrentVersionNumber) { LOG(WARNING) << "Password store database is too new."; + db_.Close(); return false; } // Initialize the tables. if (!InitLoginsTable()) { LOG(WARNING) << "Unable to initialize the password store database."; + db_.Close(); return false; } // If the file on disk is an older database version, bring it up to date. MigrateOldVersionsAsNeeded(); - return (transaction.Commit() == SQLITE_OK); + if (!transaction.Commit()) { + db_.Close(); + return false; + } + return true; } void LoginDatabase::MigrateOldVersionsAsNeeded() { @@ -90,8 +95,8 @@ void LoginDatabase::MigrateOldVersionsAsNeeded() { } bool LoginDatabase::InitLoginsTable() { - if (!DoesSqliteTableExist(db_, "logins")) { - if (sqlite3_exec(db_, "CREATE TABLE logins (" + if (!db_.DoesTableExist("logins")) { + if (!db_.Execute("CREATE TABLE logins (" "origin_url VARCHAR NOT NULL, " "action_url VARCHAR, " "username_element VARCHAR, " @@ -108,14 +113,12 @@ bool LoginDatabase::InitLoginsTable() { "UNIQUE " "(origin_url, username_element, " "username_value, password_element, " - "submit_element, signon_realm))", - NULL, NULL, NULL) != SQLITE_OK) { + "submit_element, signon_realm))")) { NOTREACHED(); return false; } - if (sqlite3_exec(db_, "CREATE INDEX logins_signon ON " - "logins (signon_realm)", - NULL, NULL, NULL) != SQLITE_OK) { + if (!db_.Execute("CREATE INDEX logins_signon ON " + "logins (signon_realm)")) { NOTREACHED(); return false; } @@ -125,36 +128,36 @@ bool LoginDatabase::InitLoginsTable() { bool LoginDatabase::AddLogin(const PasswordForm& form) { - SQLStatement s; // You *must* change LoginTableColumns if this query changes. - if (s.prepare(db_, - "INSERT OR REPLACE INTO logins " - "(origin_url, action_url, username_element, username_value, " - " password_element, password_value, submit_element, " - " signon_realm, ssl_valid, preferred, date_created, " - " blacklisted_by_user, scheme) " - "VALUES " - "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)") != SQLITE_OK) { + sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, + "INSERT OR REPLACE INTO logins " + "(origin_url, action_url, username_element, username_value, " + " password_element, password_value, submit_element, " + " signon_realm, ssl_valid, preferred, date_created, " + " blacklisted_by_user, scheme) " + "VALUES " + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")); + if (!s) { NOTREACHED() << "Statement prepare failed"; return false; } - s.bind_string(COLUMN_ORIGIN_URL, form.origin.spec()); - s.bind_string(COLUMN_ACTION_URL, form.action.spec()); - s.bind_string16(COLUMN_USERNAME_ELEMENT, form.username_element); - s.bind_string16(COLUMN_USERNAME_VALUE, form.username_value); - s.bind_string16(COLUMN_PASSWORD_ELEMENT, form.password_element); + s.BindString(COLUMN_ORIGIN_URL, form.origin.spec()); + s.BindString(COLUMN_ACTION_URL, form.action.spec()); + s.BindString16(COLUMN_USERNAME_ELEMENT, form.username_element); + s.BindString16(COLUMN_USERNAME_VALUE, form.username_value); + s.BindString16(COLUMN_PASSWORD_ELEMENT, form.password_element); std::string encrypted_password = EncryptedString(form.password_value); - s.bind_blob(COLUMN_PASSWORD_VALUE, encrypted_password.data(), + s.BindBlob(COLUMN_PASSWORD_VALUE, encrypted_password.data(), static_cast<int>(encrypted_password.length())); - s.bind_string16(COLUMN_SUBMIT_ELEMENT, form.submit_element); - s.bind_string(COLUMN_SIGNON_REALM, form.signon_realm); - s.bind_int(COLUMN_SSL_VALID, form.ssl_valid); - s.bind_int(COLUMN_PREFERRED, form.preferred); - s.bind_int64(COLUMN_DATE_CREATED, form.date_created.ToTimeT()); - s.bind_int(COLUMN_BLACKLISTED_BY_USER, form.blacklisted_by_user); - s.bind_int(COLUMN_SCHEME, form.scheme); - if (s.step() != SQLITE_DONE) { + s.BindString16(COLUMN_SUBMIT_ELEMENT, form.submit_element); + s.BindString(COLUMN_SIGNON_REALM, form.signon_realm); + s.BindInt(COLUMN_SSL_VALID, form.ssl_valid); + s.BindInt(COLUMN_PREFERRED, form.preferred); + s.BindInt64(COLUMN_DATE_CREATED, form.date_created.ToTimeT()); + s.BindInt(COLUMN_BLACKLISTED_BY_USER, form.blacklisted_by_user); + s.BindInt(COLUMN_SCHEME, form.scheme); + if (!s.Run()) { NOTREACHED(); return false; } @@ -162,66 +165,67 @@ bool LoginDatabase::AddLogin(const PasswordForm& form) { } bool LoginDatabase::UpdateLogin(const PasswordForm& form, int* items_changed) { - SQLStatement s; - if (s.prepare(db_, "UPDATE logins SET " - "action_url = ?, " - "password_value = ?, " - "ssl_valid = ?, " - "preferred = ? " - "WHERE origin_url = ? AND " - "username_element = ? AND " - "username_value = ? AND " - "password_element = ? AND " - "signon_realm = ?") != SQLITE_OK) { + sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, + "UPDATE logins SET " + "action_url = ?, " + "password_value = ?, " + "ssl_valid = ?, " + "preferred = ? " + "WHERE origin_url = ? AND " + "username_element = ? AND " + "username_value = ? AND " + "password_element = ? AND " + "signon_realm = ?")); + if (!s) { NOTREACHED() << "Statement prepare failed"; return false; } - s.bind_string(0, form.action.spec()); + s.BindString(0, form.action.spec()); std::string encrypted_password = EncryptedString(form.password_value); - s.bind_blob(1, encrypted_password.data(), - static_cast<int>(encrypted_password.length())); - s.bind_int(2, form.ssl_valid); - s.bind_int(3, form.preferred); - s.bind_string(4, form.origin.spec()); - s.bind_string16(5, form.username_element); - s.bind_string16(6, form.username_value); - s.bind_string16(7, form.password_element); - s.bind_string(8, form.signon_realm); - - if (s.step() != SQLITE_DONE) { + s.BindBlob(1, encrypted_password.data(), + static_cast<int>(encrypted_password.length())); + s.BindInt(2, form.ssl_valid); + s.BindInt(3, form.preferred); + s.BindString(4, form.origin.spec()); + s.BindString16(5, form.username_element); + s.BindString16(6, form.username_value); + s.BindString16(7, form.password_element); + s.BindString(8, form.signon_realm); + + if (!s.Run()) { NOTREACHED(); return false; } if (items_changed) { - *items_changed = s.changes(); + *items_changed = db_.GetLastChangeCount(); } return true; } bool LoginDatabase::RemoveLogin(const PasswordForm& form) { - SQLStatement s; // Remove a login by UNIQUE-constrained fields. - if (s.prepare(db_, - "DELETE FROM logins WHERE " - "origin_url = ? AND " - "username_element = ? AND " - "username_value = ? AND " - "password_element = ? AND " - "submit_element = ? AND " - "signon_realm = ? ") != SQLITE_OK) { + sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, + "DELETE FROM logins WHERE " + "origin_url = ? AND " + "username_element = ? AND " + "username_value = ? AND " + "password_element = ? AND " + "submit_element = ? AND " + "signon_realm = ? ")); + if (!s) { NOTREACHED() << "Statement prepare failed"; return false; } - s.bind_string(0, form.origin.spec()); - s.bind_string16(1, form.username_element); - s.bind_string16(2, form.username_value); - s.bind_string16(3, form.password_element); - s.bind_string16(4, form.submit_element); - s.bind_string(5, form.signon_realm); + s.BindString(0, form.origin.spec()); + s.BindString16(1, form.username_element); + s.BindString16(2, form.username_value); + s.BindString16(3, form.password_element); + s.BindString16(4, form.submit_element); + s.BindString(5, form.signon_realm); - if (s.step() != SQLITE_DONE) { + if (!s.Run()) { NOTREACHED(); return false; } @@ -230,42 +234,41 @@ bool LoginDatabase::RemoveLogin(const PasswordForm& form) { bool LoginDatabase::RemoveLoginsCreatedBetween(const base::Time delete_begin, const base::Time delete_end) { - SQLStatement s; - if (s.prepare(db_, - "DELETE FROM logins WHERE " - "date_created >= ? AND date_created < ?") != SQLITE_OK) { + sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, + "DELETE FROM logins WHERE " + "date_created >= ? AND date_created < ?")); + if (!s) { NOTREACHED() << "Statement prepare failed"; return false; } - s.bind_int64(0, delete_begin.ToTimeT()); - s.bind_int64(1, delete_end.is_null() ? std::numeric_limits<int64>::max() - : delete_end.ToTimeT()); + s.BindInt64(0, delete_begin.ToTimeT()); + s.BindInt64(1, delete_end.is_null() ? std::numeric_limits<int64>::max() + : delete_end.ToTimeT()); - return s.step() == SQLITE_DONE; + return s.Run(); } void LoginDatabase::InitPasswordFormFromStatement(PasswordForm* form, - SQLStatement* s) const { - std::string tmp; - s->column_string(COLUMN_ORIGIN_URL, &tmp); + sql::Statement& s) const { + std::string tmp = s.ColumnString(COLUMN_ORIGIN_URL); form->origin = GURL(tmp); - s->column_string(COLUMN_ACTION_URL, &tmp); + tmp = s.ColumnString(COLUMN_ACTION_URL); form->action = GURL(tmp); - s->column_string16(COLUMN_USERNAME_ELEMENT, &form->username_element); - s->column_string16(COLUMN_USERNAME_VALUE, &form->username_value); - s->column_string16(COLUMN_PASSWORD_ELEMENT, &form->password_element); + form->username_element = s.ColumnString16(COLUMN_USERNAME_ELEMENT); + form->username_value = s.ColumnString16(COLUMN_USERNAME_VALUE); + form->password_element = s.ColumnString16(COLUMN_PASSWORD_ELEMENT); std::string encrypted_password; - s->column_blob_as_string(COLUMN_PASSWORD_VALUE, &encrypted_password); + s.ColumnBlobAsString(COLUMN_PASSWORD_VALUE, &encrypted_password); form->password_value = DecryptedString(encrypted_password); - s->column_string16(COLUMN_SUBMIT_ELEMENT, &form->submit_element); - s->column_string(COLUMN_SIGNON_REALM, &tmp); + form->submit_element = s.ColumnString16(COLUMN_SUBMIT_ELEMENT); + tmp = s.ColumnString(COLUMN_SIGNON_REALM); form->signon_realm = tmp; - form->ssl_valid = (s->column_int(COLUMN_SSL_VALID) > 0); - form->preferred = (s->column_int(COLUMN_PREFERRED) > 0); + form->ssl_valid = (s.ColumnInt(COLUMN_SSL_VALID) > 0); + form->preferred = (s.ColumnInt(COLUMN_PREFERRED) > 0); form->date_created = base::Time::FromTimeT( - s->column_int64(COLUMN_DATE_CREATED)); - form->blacklisted_by_user = (s->column_int(COLUMN_BLACKLISTED_BY_USER) > 0); - int scheme_int = s->column_int(COLUMN_SCHEME); + s.ColumnInt64(COLUMN_DATE_CREATED)); + form->blacklisted_by_user = (s.ColumnInt(COLUMN_BLACKLISTED_BY_USER) > 0); + int scheme_int = s.ColumnInt(COLUMN_SCHEME); DCHECK((scheme_int >= 0) && (scheme_int <= PasswordForm::SCHEME_OTHER)); form->scheme = static_cast<PasswordForm::Scheme>(scheme_int); } @@ -273,29 +276,28 @@ void LoginDatabase::InitPasswordFormFromStatement(PasswordForm* form, bool LoginDatabase::GetLogins(const PasswordForm& form, std::vector<PasswordForm*>* forms) const { DCHECK(forms); - SQLStatement s; // You *must* change LoginTableColumns if this query changes. - if (s.prepare(db_, - "SELECT origin_url, action_url, " - "username_element, username_value, " - "password_element, password_value, " - "submit_element, signon_realm, ssl_valid, preferred, " - "date_created, blacklisted_by_user, scheme FROM logins " - "WHERE signon_realm == ? ") != SQLITE_OK) { + sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, + "SELECT origin_url, action_url, " + "username_element, username_value, " + "password_element, password_value, " + "submit_element, signon_realm, ssl_valid, preferred, " + "date_created, blacklisted_by_user, scheme FROM logins " + "WHERE signon_realm == ? ")); + if (!s) { NOTREACHED() << "Statement prepare failed"; return false; } - s.bind_string(0, form.signon_realm); + s.BindString(0, form.signon_realm); - int result; - while ((result = s.step()) == SQLITE_ROW) { + while (s.Step()) { PasswordForm* new_form = new PasswordForm(); - InitPasswordFormFromStatement(new_form, &s); + InitPasswordFormFromStatement(new_form, s); forms->push_back(new_form); } - return result == SQLITE_DONE; + return s.Succeeded(); } bool LoginDatabase::GetLoginsCreatedBetween( @@ -303,31 +305,30 @@ bool LoginDatabase::GetLoginsCreatedBetween( const base::Time end, std::vector<webkit_glue::PasswordForm*>* forms) const { DCHECK(forms); - SQLStatement s; - std::string stmt = "SELECT origin_url, action_url, " - "username_element, username_value, " - "password_element, password_value, " - "submit_element, signon_realm, ssl_valid, preferred, " - "date_created, blacklisted_by_user, scheme FROM logins " - "WHERE date_created >= ? AND date_created < ?" - "ORDER BY origin_url"; - - if (s.prepare(db_, stmt.c_str()) != SQLITE_OK) { + sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, + "SELECT origin_url, action_url, " + "username_element, username_value, " + "password_element, password_value, " + "submit_element, signon_realm, ssl_valid, preferred, " + "date_created, blacklisted_by_user, scheme FROM logins " + "WHERE date_created >= ? AND date_created < ?" + "ORDER BY origin_url")); + + if (!s) { NOTREACHED() << "Statement prepare failed"; return false; } - s.bind_int64(0, begin.ToTimeT()); - s.bind_int64(1, end.is_null() ? std::numeric_limits<int64>::max() - : end.ToTimeT()); + s.BindInt64(0, begin.ToTimeT()); + s.BindInt64(1, end.is_null() ? std::numeric_limits<int64>::max() + : end.ToTimeT()); - int result; - while ((result = s.step()) == SQLITE_ROW) { + while (s.Step()) { PasswordForm* new_form = new PasswordForm(); - InitPasswordFormFromStatement(new_form, &s); + InitPasswordFormFromStatement(new_form, s); forms->push_back(new_form); } - return result == SQLITE_DONE; + return s.Succeeded(); } bool LoginDatabase::GetAutofillableLogins( @@ -343,28 +344,27 @@ bool LoginDatabase::GetBlacklistLogins( bool LoginDatabase::GetAllLoginsWithBlacklistSetting( bool blacklisted, std::vector<PasswordForm*>* forms) const { DCHECK(forms); - SQLStatement s; // You *must* change LoginTableColumns if this query changes. - std::string stmt = "SELECT origin_url, action_url, " - "username_element, username_value, " - "password_element, password_value, " - "submit_element, signon_realm, ssl_valid, preferred, " - "date_created, blacklisted_by_user, scheme FROM logins " - "WHERE blacklisted_by_user == ? " - "ORDER BY origin_url"; - - if (s.prepare(db_, stmt.c_str()) != SQLITE_OK) { + sql::Statement s(db_.GetCachedStatement(SQL_FROM_HERE, + "SELECT origin_url, action_url, " + "username_element, username_value, " + "password_element, password_value, " + "submit_element, signon_realm, ssl_valid, preferred, " + "date_created, blacklisted_by_user, scheme FROM logins " + "WHERE blacklisted_by_user == ? " + "ORDER BY origin_url")); + + if (!s) { NOTREACHED() << "Statement prepare failed"; return false; } - s.bind_int(0, blacklisted ? 1 : 0); + s.BindInt(0, blacklisted ? 1 : 0); - int result; - while ((result = s.step()) == SQLITE_ROW) { + while (s.Step()) { PasswordForm* new_form = new PasswordForm(); - InitPasswordFormFromStatement(new_form, &s); + InitPasswordFormFromStatement(new_form, s); forms->push_back(new_form); } - return result == SQLITE_DONE; + return s.Succeeded(); } diff --git a/chrome/browser/password_manager/login_database.h b/chrome/browser/password_manager/login_database.h index 8fc9694..913fc17 100644 --- a/chrome/browser/password_manager/login_database.h +++ b/chrome/browser/password_manager/login_database.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -8,8 +8,9 @@ #include <string> #include <vector> +#include "app/sql/connection.h" +#include "app/sql/meta_table.h" #include "base/string16.h" -#include "chrome/browser/meta_table_helper.h" #include "webkit/glue/password_form.h" class FilePath; @@ -63,8 +64,7 @@ class LoginDatabase { std::vector<webkit_glue::PasswordForm*>* forms) const; // Loads the complete list of blacklist forms into |forms|. - bool GetBlacklistLogins( - std::vector<webkit_glue::PasswordForm*>* forms) const; + bool GetBlacklistLogins(std::vector<webkit_glue::PasswordForm*>* forms) const; private: // Returns an encrypted version of plain_text. @@ -79,15 +79,15 @@ class LoginDatabase { // Fills |form| from the values in the given statement (which is assumed to // be of the form used by the Get*Logins methods). void InitPasswordFormFromStatement(webkit_glue::PasswordForm* form, - SQLStatement* s) const; + sql::Statement& s) const; // Loads all logins whose blacklist setting matches |blacklisted| into // |forms|. bool GetAllLoginsWithBlacklistSetting( bool blacklisted, std::vector<webkit_glue::PasswordForm*>* forms) const; - sqlite3* db_; - MetaTableHelper meta_table_; + mutable sql::Connection db_; + sql::MetaTable meta_table_; DISALLOW_COPY_AND_ASSIGN(LoginDatabase); }; diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 312e349..6273d1a 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -1576,8 +1576,6 @@ 'browser/memory_purger.h', 'browser/message_box_handler.cc', 'browser/message_box_handler.h', - 'browser/meta_table_helper.cc', - 'browser/meta_table_helper.h', 'browser/metrics/histogram_synchronizer.cc', 'browser/metrics/histogram_synchronizer.h', 'browser/metrics/metric_event_duration_details.h', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index eaf0be3..439eff6 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -841,7 +841,6 @@ 'browser/keychain_mock_mac.h', 'browser/login_prompt_unittest.cc', 'browser/mach_broker_mac_unittest.cc', - 'browser/meta_table_helper_unittest.cc', 'browser/metrics/metrics_log_unittest.cc', 'browser/metrics/metrics_response_unittest.cc', 'browser/metrics/metrics_service_unittest.cc', |