summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-11 17:14:16 +0000
committerstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-05-11 17:14:16 +0000
commit5eea116d26ede67503c4ac8565d047e0182ab049 (patch)
tree927c6a0809460178297e390c137abce556f031e6
parentc1c85d10998a544c8a938e3b5a025358b1c1b858 (diff)
downloadchromium_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.cc31
-rw-r--r--app/sql/statement.h6
-rw-r--r--chrome/browser/history/starred_url_database.cc3
-rw-r--r--chrome/browser/history/thumbnail_database.h3
-rw-r--r--chrome/browser/meta_table_helper.cc167
-rw-r--r--chrome/browser/meta_table_helper.h91
-rw-r--r--chrome/browser/meta_table_helper_unittest.cc28
-rw-r--r--chrome/browser/password_manager/login_database.cc308
-rw-r--r--chrome/browser/password_manager/login_database.h14
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/chrome_tests.gypi1
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',