Commit 25a5dcb7 authored by yuzo@chromium.org's avatar yuzo@chromium.org

Refactor MetaTableHelper to remove redundant table name prefixing with database

name. Also, PrimeCache logic duplicated in HistoryBackend and
SQLitePersistentCookieStore is moved to this class.

BUG=none
TEST=n/a

Review URL: http://codereview.chromium.org/150094

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@19802 0039d316-1c4b-4281-b951-d872f2087c98
parent fc2eedbe
...@@ -12,6 +12,24 @@ ...@@ -12,6 +12,24 @@
static const char kVersionKey[] = "version"; static const char kVersionKey[] = "version";
static const char kCompatibleVersionKey[] = "last_compatible_version"; static const char kCompatibleVersionKey[] = "last_compatible_version";
// static
void MetaTableHelper::PrimeCache(const std::string& db_name, sqlite3* db) {
// A statement must be open for the preload command to work. If the meta
// table doesn't exist, it probably means this is a new database and there
// is nothing to preload (so it's OK we do nothing).
SQLStatement dummy;
if (!DoesSqliteTableExist(db, db_name.c_str(), "meta"))
return;
std::string sql("SELECT * from ");
appendMetaTableName(db_name, &sql);
if (dummy.prepare(db, sql.c_str()) != SQLITE_OK)
return;
if (dummy.step() != SQLITE_ROW)
return;
sqlite3Preload(db);
}
MetaTableHelper::MetaTableHelper() : db_(NULL) { MetaTableHelper::MetaTableHelper() : db_(NULL) {
} }
...@@ -28,13 +46,9 @@ bool MetaTableHelper::Init(const std::string& db_name, ...@@ -28,13 +46,9 @@ bool MetaTableHelper::Init(const std::string& db_name,
if (!DoesSqliteTableExist(db_, db_name.c_str(), "meta")) { if (!DoesSqliteTableExist(db_, db_name.c_str(), "meta")) {
// Build the sql. // Build the sql.
std::string sql("CREATE TABLE "); std::string sql("CREATE TABLE ");
if (!db_name.empty()) { appendMetaTableName(db_name, &sql);
// Want a table name of the form db_name.meta sql.append("(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,"
sql.append(db_name); "value LONGVARCHAR)");
sql.push_back('.');
}
sql.append("meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY,"
"value LONGVARCHAR)");
if (sqlite3_exec(db_, sql.c_str(), NULL, NULL, NULL) != SQLITE_OK) if (sqlite3_exec(db_, sql.c_str(), NULL, NULL, NULL) != SQLITE_OK)
return false; return false;
...@@ -130,15 +144,22 @@ int MetaTableHelper::GetCompatibleVersionNumber() { ...@@ -130,15 +144,22 @@ int MetaTableHelper::GetCompatibleVersionNumber() {
return version; 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, bool MetaTableHelper::PrepareSetStatement(SQLStatement* statement,
const std::string& key) { const std::string& key) {
DCHECK(db_ && statement); DCHECK(db_ && statement);
std::string sql("INSERT OR REPLACE INTO "); std::string sql("INSERT OR REPLACE INTO ");
if (db_name_.size() > 0) { appendMetaTableName(db_name_, &sql);
sql.append(db_name_); sql.append("(key,value) VALUES(?,?)");
sql.push_back('.');
}
sql.append("meta(key,value) VALUES(?,?)");
if (statement->prepare(db_, sql.c_str()) != SQLITE_OK) { if (statement->prepare(db_, sql.c_str()) != SQLITE_OK) {
NOTREACHED() << sqlite3_errmsg(db_); NOTREACHED() << sqlite3_errmsg(db_);
return false; return false;
...@@ -151,11 +172,8 @@ bool MetaTableHelper::PrepareGetStatement(SQLStatement* statement, ...@@ -151,11 +172,8 @@ bool MetaTableHelper::PrepareGetStatement(SQLStatement* statement,
const std::string& key) { const std::string& key) {
DCHECK(db_ && statement); DCHECK(db_ && statement);
std::string sql("SELECT value FROM "); std::string sql("SELECT value FROM ");
if (db_name_.size() > 0) { appendMetaTableName(db_name_, &sql);
sql.append(db_name_); sql.append(" WHERE key = ?");
sql.push_back('.');
}
sql.append("meta WHERE key = ?");
if (statement->prepare(db_, sql.c_str()) != SQLITE_OK) { if (statement->prepare(db_, sql.c_str()) != SQLITE_OK) {
NOTREACHED() << sqlite3_errmsg(db_); NOTREACHED() << sqlite3_errmsg(db_);
return false; return false;
......
...@@ -20,6 +20,12 @@ class SQLStatement; ...@@ -20,6 +20,12 @@ class SQLStatement;
// database to use. // database to use.
class MetaTableHelper { class MetaTableHelper {
public: public:
// Primes the sqlite cache by filling it with the file in sequence
// until there is no more data or the cache is full. Since this is one
// contiguous read operation, it is much faster than letting the pages come
// in on-demand (which causes lots of seeks).
static void PrimeCache(const std::string& db_name, sqlite3* db);
// Creates a new MetaTableHelper. After construction you must invoke // Creates a new MetaTableHelper. After construction you must invoke
// Init with the appropriate database. // Init with the appropriate database.
MetaTableHelper(); MetaTableHelper();
...@@ -69,6 +75,11 @@ class MetaTableHelper { ...@@ -69,6 +75,11 @@ class MetaTableHelper {
bool GetValue(const std::string& key, int64* value); bool GetValue(const std::string& key, int64* value);
private: 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 // Conveniences to prepare the two types of statements used by
// MetaTableHelper. // MetaTableHelper.
bool PrepareSetStatement(SQLStatement* statement, const std::string& key); bool PrepareSetStatement(SQLStatement* statement, const std::string& key);
......
// 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);
}
...@@ -3479,6 +3479,7 @@ ...@@ -3479,6 +3479,7 @@
'browser/keychain_mock_mac.cc', 'browser/keychain_mock_mac.cc',
'browser/keychain_mock_mac.h', 'browser/keychain_mock_mac.h',
'browser/login_prompt_unittest.cc', 'browser/login_prompt_unittest.cc',
'browser/meta_table_helper_unittest.cc',
'browser/metrics/metrics_log_unittest.cc', 'browser/metrics/metrics_log_unittest.cc',
'browser/metrics/metrics_response_unittest.cc', 'browser/metrics/metrics_response_unittest.cc',
'browser/net/chrome_url_request_context_unittest.cc', 'browser/net/chrome_url_request_context_unittest.cc',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment