summaryrefslogtreecommitdiffstats
path: root/chrome/browser/history/archived_database.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/history/archived_database.cc')
-rw-r--r--chrome/browser/history/archived_database.cc123
1 files changed, 123 insertions, 0 deletions
diff --git a/chrome/browser/history/archived_database.cc b/chrome/browser/history/archived_database.cc
new file mode 100644
index 0000000..1b9e010
--- /dev/null
+++ b/chrome/browser/history/archived_database.cc
@@ -0,0 +1,123 @@
+// 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.
+
+#include <algorithm>
+#include <string>
+
+#include "app/sql/statement.h"
+#include "app/sql/transaction.h"
+#include "base/string_util.h"
+#include "chrome/browser/history/archived_database.h"
+
+namespace history {
+
+namespace {
+
+static const int kCurrentVersionNumber = 2;
+static const int kCompatibleVersionNumber = 2;
+
+} // namespace
+
+ArchivedDatabase::ArchivedDatabase() {
+}
+
+ArchivedDatabase::~ArchivedDatabase() {
+}
+
+bool ArchivedDatabase::Init(const FilePath& file_name) {
+ // Set the database page size to something a little larger to give us
+ // better performance (we're typically seek rather than bandwidth limited).
+ // This only has an effect before any tables have been created, otherwise
+ // this is a NOP. Must be a power of 2 and a max of 8192.
+ db_.set_page_size(4096);
+
+ // Don't use very much memory caching this database. We seldom use it for
+ // anything important.
+ db_.set_cache_size(64);
+
+ // Run the database in exclusive mode. Nobody else should be accessing the
+ // database while we're running, and this will give somewhat improved perf.
+ db_.set_exclusive_locking();
+
+ if (!db_.Open(file_name))
+ return false;
+
+ sql::Transaction transaction(&db_);
+ if (!transaction.Begin()) {
+ db_.Close();
+ return false;
+ }
+
+ // Version check.
+ if (!meta_table_.Init(&db_, kCurrentVersionNumber,
+ kCompatibleVersionNumber)) {
+ db_.Close();
+ return false;
+ }
+
+ // Create the tables.
+ if (!CreateURLTable(false) || !InitVisitTable() ||
+ !InitKeywordSearchTermsTable()) {
+ db_.Close();
+ return false;
+ }
+ CreateMainURLIndex();
+
+ if (EnsureCurrentVersion() != sql::INIT_OK) {
+ db_.Close();
+ return false;
+ }
+
+ return transaction.Commit();
+}
+
+void ArchivedDatabase::BeginTransaction() {
+ db_.BeginTransaction();
+}
+
+void ArchivedDatabase::CommitTransaction() {
+ db_.CommitTransaction();
+}
+
+sql::Connection& ArchivedDatabase::GetDB() {
+ return db_;
+}
+
+// Migration -------------------------------------------------------------------
+
+sql::InitStatus ArchivedDatabase::EnsureCurrentVersion() {
+ // We can't read databases newer than we were designed for.
+ if (meta_table_.GetCompatibleVersionNumber() > kCurrentVersionNumber) {
+ LOG(WARNING) << "Archived database is too new.";
+ return sql::INIT_TOO_NEW;
+ }
+
+ // NOTICE: If you are changing structures for things shared with the archived
+ // history file like URLs, visits, or downloads, that will need migration as
+ // well. Instead of putting such migration code in this class, it should be
+ // in the corresponding file (url_database.cc, etc.) and called from here and
+ // from the archived_database.cc.
+
+ int cur_version = meta_table_.GetVersionNumber();
+ if (cur_version == 1) {
+ if (!DropStarredIDFromURLs()) {
+ LOG(WARNING) << "Unable to update archived database to version 2.";
+ return sql::INIT_FAILURE;
+ }
+ ++cur_version;
+ meta_table_.SetVersionNumber(cur_version);
+ meta_table_.SetCompatibleVersionNumber(
+ std::min(cur_version, kCompatibleVersionNumber));
+ }
+
+ // Put future migration cases here.
+
+ // When the version is too old, we just try to continue anyway, there should
+ // not be a released product that makes a database too old for us to handle.
+ LOG_IF(WARNING, cur_version < kCurrentVersionNumber) <<
+ "Archived database version " << cur_version << " is too old to handle.";
+
+ return sql::INIT_OK;
+}
+} // namespace history