diff options
Diffstat (limited to 'chrome/browser/history/visitsegment_database.cc')
-rw-r--r-- | chrome/browser/history/visitsegment_database.cc | 271 |
1 files changed, 129 insertions, 142 deletions
diff --git a/chrome/browser/history/visitsegment_database.cc b/chrome/browser/history/visitsegment_database.cc index cf2cd3c..b18712b 100644 --- a/chrome/browser/history/visitsegment_database.cc +++ b/chrome/browser/history/visitsegment_database.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// 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. @@ -6,14 +6,12 @@ #include <math.h> +#include "app/sql/connection.h" +#include "app/sql/statement.h" #include "base/logging.h" #include "base/stl_util-inl.h" #include "base/string_util.h" #include "chrome/browser/history/page_usage_data.h" -#include "chrome/common/sqlite_compiled_statement.h" -#include "chrome/common/sqlite_utils.h" - -using base::Time; // The following tables are used to store url segment information. // @@ -40,19 +38,17 @@ VisitSegmentDatabase::~VisitSegmentDatabase() { bool VisitSegmentDatabase::InitSegmentTables() { // Segments table. - if (!DoesSqliteTableExist(GetDB(), "segments")) { - if (sqlite3_exec(GetDB(), "CREATE TABLE segments (" - "id INTEGER PRIMARY KEY," - "name VARCHAR," - "url_id INTEGER NON NULL," - "pres_index INTEGER DEFAULT -1 NOT NULL)", - NULL, NULL, NULL) != SQLITE_OK) { + if (!GetDB().DoesTableExist("segments")) { + if (!GetDB().Execute("CREATE TABLE segments (" + "id INTEGER PRIMARY KEY," + "name VARCHAR," + "url_id INTEGER NON NULL," + "pres_index INTEGER DEFAULT -1 NOT NULL)")) { NOTREACHED(); return false; } - if (sqlite3_exec(GetDB(), "CREATE INDEX segments_name ON segments(name)", - NULL, NULL, NULL) != SQLITE_OK) { + if (!GetDB().Execute("CREATE INDEX segments_name ON segments(name)")) { NOTREACHED(); return false; } @@ -60,33 +56,29 @@ bool VisitSegmentDatabase::InitSegmentTables() { // This was added later, so we need to try to create it even if the table // already exists. - sqlite3_exec(GetDB(), "CREATE INDEX segments_url_id ON segments(url_id)", - NULL, NULL, NULL); + GetDB().Execute("CREATE INDEX segments_url_id ON segments(url_id)"); // Segment usage table. - if (!DoesSqliteTableExist(GetDB(), "segment_usage")) { - if (sqlite3_exec(GetDB(), "CREATE TABLE segment_usage (" - "id INTEGER PRIMARY KEY," - "segment_id INTEGER NOT NULL," - "time_slot INTEGER NOT NULL," - "visit_count INTEGER DEFAULT 0 NOT NULL)", - NULL, NULL, NULL) != SQLITE_OK) { + if (!GetDB().DoesTableExist("segment_usage")) { + if (!GetDB().Execute("CREATE TABLE segment_usage (" + "id INTEGER PRIMARY KEY," + "segment_id INTEGER NOT NULL," + "time_slot INTEGER NOT NULL," + "visit_count INTEGER DEFAULT 0 NOT NULL)")) { NOTREACHED(); return false; } - if (sqlite3_exec(GetDB(), - "CREATE INDEX segment_usage_time_slot_segment_id ON " - "segment_usage(time_slot, segment_id)", - NULL, NULL, NULL) != SQLITE_OK) { + if (!GetDB().Execute( + "CREATE INDEX segment_usage_time_slot_segment_id ON " + "segment_usage(time_slot, segment_id)")) { NOTREACHED(); return false; } } // Added in a later version, so we always need to try to creat this index. - sqlite3_exec(GetDB(), "CREATE INDEX segments_usage_seg_id " - "ON segment_usage(segment_id)", - NULL, NULL, NULL); + GetDB().Execute("CREATE INDEX segments_usage_seg_id " + "ON segment_usage(segment_id)"); // Presentation index table. // @@ -95,11 +87,10 @@ bool VisitSegmentDatabase::InitSegmentTables() { // If you need to add more columns, keep in mind that rows are currently // deleted when the presentation index is changed to -1. // See SetPagePresentationIndex() in this file - if (!DoesSqliteTableExist(GetDB(), "presentation")) { - if (sqlite3_exec(GetDB(), "CREATE TABLE presentation(" - "url_id INTEGER PRIMARY KEY," - "pres_index INTEGER NOT NULL)", - NULL, NULL, NULL) != SQLITE_OK) + if (!GetDB().DoesTableExist("presentation")) { + if (!GetDB().Execute("CREATE TABLE presentation(" + "url_id INTEGER PRIMARY KEY," + "pres_index INTEGER NOT NULL)")) return false; } return true; @@ -107,11 +98,8 @@ bool VisitSegmentDatabase::InitSegmentTables() { bool VisitSegmentDatabase::DropSegmentTables() { // Dropping the tables will implicitly delete the indices. - return - sqlite3_exec(GetDB(), "DROP TABLE segments", NULL, NULL, NULL) == - SQLITE_OK && - sqlite3_exec(GetDB(), "DROP TABLE segment_usage", NULL, NULL, NULL) == - SQLITE_OK; + return GetDB().Execute("DROP TABLE segments") && + GetDB().Execute("DROP TABLE segment_usage"); } // Note: the segment name is derived from the URL but is not a URL. It is @@ -147,94 +135,94 @@ std::string VisitSegmentDatabase::ComputeSegmentName(const GURL& url) { SegmentID VisitSegmentDatabase::GetSegmentNamed( const std::string& segment_name) { - SQLITE_UNIQUE_STATEMENT(statement, GetStatementCache(), - "SELECT id FROM segments WHERE name = ?"); - if (!statement.is_valid()) + sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, + "SELECT id FROM segments WHERE name = ?")); + if (!statement) return 0; - statement->bind_string(0, segment_name); - if (statement->step() == SQLITE_ROW) - return statement->column_int64(0); + statement.BindString(0, segment_name); + if (statement.Step()) + return statement.ColumnInt64(0); return 0; } bool VisitSegmentDatabase::UpdateSegmentRepresentationURL(SegmentID segment_id, URLID url_id) { - SQLITE_UNIQUE_STATEMENT(statement, GetStatementCache(), - "UPDATE segments SET url_id = ? WHERE id = ?"); - if (!statement.is_valid()) + sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, + "UPDATE segments SET url_id = ? WHERE id = ?")); + if (!statement) return false; - statement->bind_int64(0, url_id); - statement->bind_int64(1, segment_id); - return statement->step() == SQLITE_DONE; + statement.BindInt64(0, url_id); + statement.BindInt64(1, segment_id); + return statement.Run(); } URLID VisitSegmentDatabase::GetSegmentRepresentationURL(SegmentID segment_id) { - SQLITE_UNIQUE_STATEMENT(statement, GetStatementCache(), - "SELECT url_id FROM segments WHERE id = ?"); - if (!statement.is_valid()) + sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, + "SELECT url_id FROM segments WHERE id = ?")); + if (!statement) return 0; - statement->bind_int64(0, segment_id); - if (statement->step() == SQLITE_ROW) - return statement->column_int64(0); + statement.BindInt64(0, segment_id); + if (statement.Step()) + return statement.ColumnInt64(0); return 0; } SegmentID VisitSegmentDatabase::CreateSegment(URLID url_id, const std::string& segment_name) { - SQLITE_UNIQUE_STATEMENT(statement, GetStatementCache(), - "INSERT INTO segments (name, url_id) VALUES (?,?)"); - if (!statement.is_valid()) + sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, + "INSERT INTO segments (name, url_id) VALUES (?,?)")); + if (!statement) return false; - statement->bind_string(0, segment_name); - statement->bind_int64(1, url_id); - if (statement->step() == SQLITE_DONE) - return sqlite3_last_insert_rowid(GetDB()); + statement.BindString(0, segment_name); + statement.BindInt64(1, url_id); + if (statement.Run()) + return GetDB().GetLastInsertRowId(); return false; } bool VisitSegmentDatabase::IncreaseSegmentVisitCount(SegmentID segment_id, - const Time& ts, + base::Time ts, int amount) { - Time t = ts.LocalMidnight(); + base::Time t = ts.LocalMidnight(); - SQLITE_UNIQUE_STATEMENT(select, GetStatementCache(), + sql::Statement select(GetDB().GetCachedStatement(SQL_FROM_HERE, "SELECT id, visit_count FROM segment_usage " - "WHERE time_slot = ? AND segment_id = ?"); - if (!select.is_valid()) + "WHERE time_slot = ? AND segment_id = ?")); + if (!select) return false; - select->bind_int64(0, t.ToInternalValue()); - select->bind_int64(1, segment_id); - if (select->step() == SQLITE_ROW) { - SQLITE_UNIQUE_STATEMENT(update, GetStatementCache(), - "UPDATE segment_usage SET visit_count = ? WHERE id = ?"); - if (!update.is_valid()) + select.BindInt64(0, t.ToInternalValue()); + select.BindInt64(1, segment_id); + if (select.Step()) { + sql::Statement update(GetDB().GetCachedStatement(SQL_FROM_HERE, + "UPDATE segment_usage SET visit_count = ? WHERE id = ?")); + if (!update) return false; - update->bind_int64(0, select->column_int64(1) + static_cast<int64>(amount)); - update->bind_int64(1, select->column_int64(0)); - return update->step() == SQLITE_DONE; + update.BindInt64(0, select.ColumnInt64(1) + static_cast<int64>(amount)); + update.BindInt64(1, select.ColumnInt64(0)); + return update.Run(); } else { - SQLITE_UNIQUE_STATEMENT(insert, GetStatementCache(), + sql::Statement insert(GetDB().GetCachedStatement(SQL_FROM_HERE, "INSERT INTO segment_usage " - "(segment_id, time_slot, visit_count) VALUES (?, ?, ?)"); - if (!insert.is_valid()) + "(segment_id, time_slot, visit_count) VALUES (?, ?, ?)")); + if (!insert) return false; - insert->bind_int64(0, segment_id); - insert->bind_int64(1, t.ToInternalValue()); - insert->bind_int64(2, static_cast<int64>(amount)); - return insert->step() == SQLITE_DONE; + insert.BindInt64(0, segment_id); + insert.BindInt64(1, t.ToInternalValue()); + insert.BindInt64(2, static_cast<int64>(amount)); + return insert.Run(); } } void VisitSegmentDatabase::QuerySegmentUsage( - const Time& from_time, + base::Time from_time, int max_result_count, std::vector<PageUsageData*>* results) { // This function gathers the highest-ranked segments in two queries. @@ -245,25 +233,25 @@ void VisitSegmentDatabase::QuerySegmentUsage( // used to lock results into position. But the rest of our code currently // does as well. - // Gather all the segment scores: - SQLITE_UNIQUE_STATEMENT(statement, GetStatementCache(), + // Gather all the segment scores. + sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, "SELECT segment_id, time_slot, visit_count " "FROM segment_usage WHERE time_slot >= ? " - "ORDER BY segment_id"); - if (!statement.is_valid()) { - NOTREACHED(); + "ORDER BY segment_id")); + if (!statement) { + NOTREACHED() << GetDB().GetErrorMessage(); return; } - Time ts = from_time.LocalMidnight(); - statement->bind_int64(0, ts.ToInternalValue()); + base::Time ts = from_time.LocalMidnight(); + statement.BindInt64(0, ts.ToInternalValue()); - const Time now = Time::Now(); + base::Time now = base::Time::Now(); SegmentID last_segment_id = 0; PageUsageData* pud = NULL; float score = 0; - while (statement->step() == SQLITE_ROW) { - SegmentID segment_id = statement->column_int64(0); + while (statement.Step()) { + SegmentID segment_id = statement.ColumnInt64(0); if (segment_id != last_segment_id) { if (last_segment_id != 0) { pud->SetScore(score); @@ -275,8 +263,9 @@ void VisitSegmentDatabase::QuerySegmentUsage( last_segment_id = segment_id; } - const Time timeslot = Time::FromInternalValue(statement->column_int64(1)); - const int visit_count = statement->column_int(2); + base::Time timeslot = + base::Time::FromInternalValue(statement.ColumnInt64(1)); + int visit_count = statement.ColumnInt(2); int days_ago = (now - timeslot).InDays(); // Score for this day in isolation. @@ -304,89 +293,87 @@ void VisitSegmentDatabase::QuerySegmentUsage( } // Now fetch the details about the entries we care about. - SQLITE_UNIQUE_STATEMENT(statement2, GetStatementCache(), + sql::Statement statement2(GetDB().GetCachedStatement(SQL_FROM_HERE, "SELECT urls.url, urls.title FROM urls " "JOIN segments ON segments.url_id = urls.id " - "WHERE segments.id = ?"); - if (!statement2.is_valid()) { - NOTREACHED(); + "WHERE segments.id = ?")); + if (!statement2) { + NOTREACHED() << GetDB().GetErrorMessage(); return; } for (size_t i = 0; i < results->size(); ++i) { PageUsageData* pud = (*results)[i]; - statement2->bind_int64(0, pud->GetID()); - if (statement2->step() == SQLITE_ROW) { - std::string url; - std::wstring title; - statement2->column_string(0, &url); - statement2->column_wstring(1, &title); - pud->SetURL(GURL(url)); - pud->SetTitle(WideToUTF16(title)); + statement2.BindInt64(0, pud->GetID()); + if (statement2.Step()) { + pud->SetURL(GURL(statement2.ColumnString(0))); + pud->SetTitle(UTF8ToUTF16(statement2.ColumnString(1))); } - statement2->reset(); + statement2.Reset(); } } -void VisitSegmentDatabase::DeleteSegmentData(const Time& older_than) { - SQLITE_UNIQUE_STATEMENT(statement, GetStatementCache(), - "DELETE FROM segment_usage WHERE time_slot < ?"); - if (!statement.is_valid()) +void VisitSegmentDatabase::DeleteSegmentData(base::Time older_than) { + sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, + "DELETE FROM segment_usage WHERE time_slot < ?")); + if (!statement) return; - statement->bind_int64(0, older_than.LocalMidnight().ToInternalValue()); - if (statement->step() != SQLITE_DONE) + statement.BindInt64(0, older_than.LocalMidnight().ToInternalValue()); + if (!statement.Run()) NOTREACHED(); } void VisitSegmentDatabase::SetSegmentPresentationIndex(SegmentID segment_id, int index) { - SQLITE_UNIQUE_STATEMENT(statement, GetStatementCache(), - "UPDATE segments SET pres_index = ? WHERE id = ?"); - if (!statement.is_valid()) + sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, + "UPDATE segments SET pres_index = ? WHERE id = ?")); + if (!statement) return; - statement->bind_int(0, index); - statement->bind_int64(1, segment_id); - if (statement->step() != SQLITE_DONE) + statement.BindInt(0, index); + statement.BindInt64(1, segment_id); + if (!statement.Run()) NOTREACHED(); + else + DCHECK(GetDB().GetLastChangeCount() == 1); } bool VisitSegmentDatabase::DeleteSegmentForURL(URLID url_id) { - SQLITE_UNIQUE_STATEMENT(select, GetStatementCache(), - "SELECT id FROM segments WHERE url_id = ?"); - if (!select.is_valid()) + sql::Statement select(GetDB().GetCachedStatement(SQL_FROM_HERE, + "SELECT id FROM segments WHERE url_id = ?")); + if (!select) return false; - SQLITE_UNIQUE_STATEMENT(delete_seg, GetStatementCache(), - "DELETE FROM segments WHERE id = ?"); - if (!delete_seg.is_valid()) + sql::Statement delete_seg(GetDB().GetCachedStatement(SQL_FROM_HERE, + "DELETE FROM segments WHERE id = ?")); + if (!delete_seg) return false; - SQLITE_UNIQUE_STATEMENT(delete_usage, GetStatementCache(), - "DELETE FROM segment_usage WHERE segment_id = ?"); - if (!delete_usage.is_valid()) + sql::Statement delete_usage(GetDB().GetCachedStatement(SQL_FROM_HERE, + "DELETE FROM segment_usage WHERE segment_id = ?")); + if (!delete_usage) return false; bool r = true; - select->bind_int64(0, url_id); + select.BindInt64(0, url_id); // In theory there could not be more than one segment using that URL but we // loop anyway to cleanup any inconsistency. - while (select->step() == SQLITE_ROW) { - SegmentID segment_id = select->column_int64(0); + while (select.Step()) { + SegmentID segment_id = select.ColumnInt64(0); - delete_usage->bind_int64(0, segment_id); - if (delete_usage->step() != SQLITE_DONE) { + delete_usage.BindInt64(0, segment_id); + if (!delete_usage.Run()) { NOTREACHED(); r = false; } - delete_seg->bind_int64(0, segment_id); - if (delete_seg->step() != SQLITE_DONE) { + delete_seg.BindInt64(0, segment_id); + if (!delete_seg.Run()) { NOTREACHED(); r = false; } - delete_usage->reset(); - delete_seg->reset(); + delete_usage.Reset(); + delete_seg.Reset(); } return r; } |