Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(506)

Unified Diff: webkit/browser/quota/quota_database.cc

Issue 539143002: Migrate webkit/browser/ to storage/browser/ (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix android build Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/browser/quota/quota_database.h ('k') | webkit/browser/quota/quota_manager.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/browser/quota/quota_database.cc
diff --git a/webkit/browser/quota/quota_database.cc b/webkit/browser/quota/quota_database.cc
deleted file mode 100644
index f4552724eea714622bc2733a271198644d33dc9b..0000000000000000000000000000000000000000
--- a/webkit/browser/quota/quota_database.cc
+++ /dev/null
@@ -1,657 +0,0 @@
-// Copyright 2013 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 "webkit/browser/quota/quota_database.h"
-
-#include <string>
-#include <vector>
-
-#include "base/auto_reset.h"
-#include "base/bind.h"
-#include "base/files/file_util.h"
-#include "base/time/time.h"
-#include "sql/connection.h"
-#include "sql/meta_table.h"
-#include "sql/statement.h"
-#include "sql/transaction.h"
-#include "url/gurl.h"
-#include "webkit/browser/quota/special_storage_policy.h"
-
-namespace storage {
-namespace {
-
-// Definitions for database schema.
-
-const int kCurrentVersion = 4;
-const int kCompatibleVersion = 2;
-
-const char kHostQuotaTable[] = "HostQuotaTable";
-const char kOriginInfoTable[] = "OriginInfoTable";
-const char kIsOriginTableBootstrapped[] = "IsOriginTableBootstrapped";
-
-bool VerifyValidQuotaConfig(const char* key) {
- return (key != NULL &&
- (!strcmp(key, QuotaDatabase::kDesiredAvailableSpaceKey) ||
- !strcmp(key, QuotaDatabase::kTemporaryQuotaOverrideKey)));
-}
-
-const int kCommitIntervalMs = 30000;
-
-} // anonymous namespace
-
-// static
-const char QuotaDatabase::kDesiredAvailableSpaceKey[] = "DesiredAvailableSpace";
-const char QuotaDatabase::kTemporaryQuotaOverrideKey[] =
- "TemporaryQuotaOverride";
-
-const QuotaDatabase::TableSchema QuotaDatabase::kTables[] = {
- { kHostQuotaTable,
- "(host TEXT NOT NULL,"
- " type INTEGER NOT NULL,"
- " quota INTEGER DEFAULT 0,"
- " UNIQUE(host, type))" },
- { kOriginInfoTable,
- "(origin TEXT NOT NULL,"
- " type INTEGER NOT NULL,"
- " used_count INTEGER DEFAULT 0,"
- " last_access_time INTEGER DEFAULT 0,"
- " last_modified_time INTEGER DEFAULT 0,"
- " UNIQUE(origin, type))" },
-};
-
-// static
-const QuotaDatabase::IndexSchema QuotaDatabase::kIndexes[] = {
- { "HostIndex",
- kHostQuotaTable,
- "(host)",
- false },
- { "OriginInfoIndex",
- kOriginInfoTable,
- "(origin)",
- false },
- { "OriginLastAccessTimeIndex",
- kOriginInfoTable,
- "(last_access_time)",
- false },
- { "OriginLastModifiedTimeIndex",
- kOriginInfoTable,
- "(last_modified_time)",
- false },
-};
-
-struct QuotaDatabase::QuotaTableImporter {
- bool Append(const QuotaTableEntry& entry) {
- entries.push_back(entry);
- return true;
- }
- std::vector<QuotaTableEntry> entries;
-};
-
-// Clang requires explicit out-of-line constructors for them.
-QuotaDatabase::QuotaTableEntry::QuotaTableEntry()
- : type(kStorageTypeUnknown),
- quota(0) {
-}
-
-QuotaDatabase::QuotaTableEntry::QuotaTableEntry(
- const std::string& host,
- StorageType type,
- int64 quota)
- : host(host),
- type(type),
- quota(quota) {
-}
-
-QuotaDatabase::OriginInfoTableEntry::OriginInfoTableEntry()
- : type(kStorageTypeUnknown),
- used_count(0) {
-}
-
-QuotaDatabase::OriginInfoTableEntry::OriginInfoTableEntry(
- const GURL& origin,
- StorageType type,
- int used_count,
- const base::Time& last_access_time,
- const base::Time& last_modified_time)
- : origin(origin),
- type(type),
- used_count(used_count),
- last_access_time(last_access_time),
- last_modified_time(last_modified_time) {
-}
-
-// QuotaDatabase ------------------------------------------------------------
-QuotaDatabase::QuotaDatabase(const base::FilePath& path)
- : db_file_path_(path),
- is_recreating_(false),
- is_disabled_(false) {
-}
-
-QuotaDatabase::~QuotaDatabase() {
- if (db_) {
- db_->CommitTransaction();
- }
-}
-
-void QuotaDatabase::CloseConnection() {
- meta_table_.reset();
- db_.reset();
-}
-
-bool QuotaDatabase::GetHostQuota(
- const std::string& host, StorageType type, int64* quota) {
- DCHECK(quota);
- if (!LazyOpen(false))
- return false;
-
- const char* kSql =
- "SELECT quota"
- " FROM HostQuotaTable"
- " WHERE host = ? AND type = ?";
-
- sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
- statement.BindString(0, host);
- statement.BindInt(1, static_cast<int>(type));
-
- if (!statement.Step())
- return false;
-
- *quota = statement.ColumnInt64(0);
- return true;
-}
-
-bool QuotaDatabase::SetHostQuota(
- const std::string& host, StorageType type, int64 quota) {
- DCHECK_GE(quota, 0);
- if (!LazyOpen(true))
- return false;
-
- const char* kSql =
- "INSERT OR REPLACE INTO HostQuotaTable"
- " (quota, host, type)"
- " VALUES (?, ?, ?)";
- sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
- statement.BindInt64(0, quota);
- statement.BindString(1, host);
- statement.BindInt(2, static_cast<int>(type));
-
- if (!statement.Run())
- return false;
-
- ScheduleCommit();
- return true;
-}
-
-bool QuotaDatabase::SetOriginLastAccessTime(
- const GURL& origin, StorageType type, base::Time last_access_time) {
- if (!LazyOpen(true))
- return false;
-
- sql::Statement statement;
-
- int used_count = 1;
- if (FindOriginUsedCount(origin, type, &used_count)) {
- ++used_count;
- const char* kSql =
- "UPDATE OriginInfoTable"
- " SET used_count = ?, last_access_time = ?"
- " WHERE origin = ? AND type = ?";
- statement.Assign(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
- } else {
- const char* kSql =
- "INSERT INTO OriginInfoTable"
- " (used_count, last_access_time, origin, type)"
- " VALUES (?, ?, ?, ?)";
- statement.Assign(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
- }
- statement.BindInt(0, used_count);
- statement.BindInt64(1, last_access_time.ToInternalValue());
- statement.BindString(2, origin.spec());
- statement.BindInt(3, static_cast<int>(type));
-
- if (!statement.Run())
- return false;
-
- ScheduleCommit();
- return true;
-}
-
-bool QuotaDatabase::SetOriginLastModifiedTime(
- const GURL& origin, StorageType type, base::Time last_modified_time) {
- if (!LazyOpen(true))
- return false;
-
- sql::Statement statement;
-
- int dummy;
- if (FindOriginUsedCount(origin, type, &dummy)) {
- const char* kSql =
- "UPDATE OriginInfoTable"
- " SET last_modified_time = ?"
- " WHERE origin = ? AND type = ?";
- statement.Assign(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
- } else {
- const char* kSql =
- "INSERT INTO OriginInfoTable"
- " (last_modified_time, origin, type) VALUES (?, ?, ?)";
- statement.Assign(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
- }
- statement.BindInt64(0, last_modified_time.ToInternalValue());
- statement.BindString(1, origin.spec());
- statement.BindInt(2, static_cast<int>(type));
-
- if (!statement.Run())
- return false;
-
- ScheduleCommit();
- return true;
-}
-
-bool QuotaDatabase::RegisterInitialOriginInfo(
- const std::set<GURL>& origins, StorageType type) {
- if (!LazyOpen(true))
- return false;
-
- typedef std::set<GURL>::const_iterator itr_type;
- for (itr_type itr = origins.begin(), end = origins.end();
- itr != end; ++itr) {
- const char* kSql =
- "INSERT OR IGNORE INTO OriginInfoTable"
- " (origin, type) VALUES (?, ?)";
- sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
- statement.BindString(0, itr->spec());
- statement.BindInt(1, static_cast<int>(type));
-
- if (!statement.Run())
- return false;
- }
-
- ScheduleCommit();
- return true;
-}
-
-bool QuotaDatabase::DeleteHostQuota(
- const std::string& host, StorageType type) {
- if (!LazyOpen(false))
- return false;
-
- const char* kSql =
- "DELETE FROM HostQuotaTable"
- " WHERE host = ? AND type = ?";
-
- sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
- statement.BindString(0, host);
- statement.BindInt(1, static_cast<int>(type));
-
- if (!statement.Run())
- return false;
-
- ScheduleCommit();
- return true;
-}
-
-bool QuotaDatabase::DeleteOriginInfo(
- const GURL& origin, StorageType type) {
- if (!LazyOpen(false))
- return false;
-
- const char* kSql =
- "DELETE FROM OriginInfoTable"
- " WHERE origin = ? AND type = ?";
-
- sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
- statement.BindString(0, origin.spec());
- statement.BindInt(1, static_cast<int>(type));
-
- if (!statement.Run())
- return false;
-
- ScheduleCommit();
- return true;
-}
-
-bool QuotaDatabase::GetQuotaConfigValue(const char* key, int64* value) {
- if (!LazyOpen(false))
- return false;
- DCHECK(VerifyValidQuotaConfig(key));
- return meta_table_->GetValue(key, value);
-}
-
-bool QuotaDatabase::SetQuotaConfigValue(const char* key, int64 value) {
- if (!LazyOpen(true))
- return false;
- DCHECK(VerifyValidQuotaConfig(key));
- return meta_table_->SetValue(key, value);
-}
-
-bool QuotaDatabase::GetLRUOrigin(
- StorageType type,
- const std::set<GURL>& exceptions,
- SpecialStoragePolicy* special_storage_policy,
- GURL* origin) {
- DCHECK(origin);
- if (!LazyOpen(false))
- return false;
-
- const char* kSql = "SELECT origin FROM OriginInfoTable"
- " WHERE type = ?"
- " ORDER BY last_access_time ASC";
-
- sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
- statement.BindInt(0, static_cast<int>(type));
-
- while (statement.Step()) {
- GURL url(statement.ColumnString(0));
- if (exceptions.find(url) != exceptions.end())
- continue;
- if (special_storage_policy &&
- special_storage_policy->IsStorageUnlimited(url))
- continue;
- *origin = url;
- return true;
- }
-
- *origin = GURL();
- return statement.Succeeded();
-}
-
-bool QuotaDatabase::GetOriginsModifiedSince(
- StorageType type, std::set<GURL>* origins, base::Time modified_since) {
- DCHECK(origins);
- if (!LazyOpen(false))
- return false;
-
- const char* kSql = "SELECT origin FROM OriginInfoTable"
- " WHERE type = ? AND last_modified_time >= ?";
-
- sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
- statement.BindInt(0, static_cast<int>(type));
- statement.BindInt64(1, modified_since.ToInternalValue());
-
- origins->clear();
- while (statement.Step())
- origins->insert(GURL(statement.ColumnString(0)));
-
- return statement.Succeeded();
-}
-
-bool QuotaDatabase::IsOriginDatabaseBootstrapped() {
- if (!LazyOpen(true))
- return false;
-
- int flag = 0;
- return meta_table_->GetValue(kIsOriginTableBootstrapped, &flag) && flag;
-}
-
-bool QuotaDatabase::SetOriginDatabaseBootstrapped(bool bootstrap_flag) {
- if (!LazyOpen(true))
- return false;
-
- return meta_table_->SetValue(kIsOriginTableBootstrapped, bootstrap_flag);
-}
-
-void QuotaDatabase::Commit() {
- if (!db_)
- return;
-
- if (timer_.IsRunning())
- timer_.Stop();
-
- db_->CommitTransaction();
- db_->BeginTransaction();
-}
-
-void QuotaDatabase::ScheduleCommit() {
- if (timer_.IsRunning())
- return;
- timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kCommitIntervalMs),
- this, &QuotaDatabase::Commit);
-}
-
-bool QuotaDatabase::FindOriginUsedCount(
- const GURL& origin, StorageType type, int* used_count) {
- DCHECK(used_count);
- if (!LazyOpen(false))
- return false;
-
- const char* kSql =
- "SELECT used_count FROM OriginInfoTable"
- " WHERE origin = ? AND type = ?";
-
- sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
- statement.BindString(0, origin.spec());
- statement.BindInt(1, static_cast<int>(type));
-
- if (!statement.Step())
- return false;
-
- *used_count = statement.ColumnInt(0);
- return true;
-}
-
-bool QuotaDatabase::LazyOpen(bool create_if_needed) {
- if (db_)
- return true;
-
- // If we tried and failed once, don't try again in the same session
- // to avoid creating an incoherent mess on disk.
- if (is_disabled_)
- return false;
-
- bool in_memory_only = db_file_path_.empty();
- if (!create_if_needed &&
- (in_memory_only || !base::PathExists(db_file_path_))) {
- return false;
- }
-
- db_.reset(new sql::Connection);
- meta_table_.reset(new sql::MetaTable);
-
- db_->set_histogram_tag("Quota");
-
- bool opened = false;
- if (in_memory_only) {
- opened = db_->OpenInMemory();
- } else if (!base::CreateDirectory(db_file_path_.DirName())) {
- LOG(ERROR) << "Failed to create quota database directory.";
- } else {
- opened = db_->Open(db_file_path_);
- if (opened)
- db_->Preload();
- }
-
- if (!opened || !EnsureDatabaseVersion()) {
- LOG(ERROR) << "Failed to open the quota database.";
- is_disabled_ = true;
- db_.reset();
- meta_table_.reset();
- return false;
- }
-
- // Start a long-running transaction.
- db_->BeginTransaction();
-
- return true;
-}
-
-bool QuotaDatabase::EnsureDatabaseVersion() {
- static const size_t kTableCount = ARRAYSIZE_UNSAFE(kTables);
- static const size_t kIndexCount = ARRAYSIZE_UNSAFE(kIndexes);
- if (!sql::MetaTable::DoesTableExist(db_.get()))
- return CreateSchema(db_.get(), meta_table_.get(),
- kCurrentVersion, kCompatibleVersion,
- kTables, kTableCount,
- kIndexes, kIndexCount);
-
- if (!meta_table_->Init(db_.get(), kCurrentVersion, kCompatibleVersion))
- return false;
-
- if (meta_table_->GetCompatibleVersionNumber() > kCurrentVersion) {
- LOG(WARNING) << "Quota database is too new.";
- return false;
- }
-
- if (meta_table_->GetVersionNumber() < kCurrentVersion) {
- if (!UpgradeSchema(meta_table_->GetVersionNumber()))
- return ResetSchema();
- }
-
-#ifndef NDEBUG
- DCHECK(sql::MetaTable::DoesTableExist(db_.get()));
- for (size_t i = 0; i < kTableCount; ++i) {
- DCHECK(db_->DoesTableExist(kTables[i].table_name));
- }
-#endif
-
- return true;
-}
-
-// static
-bool QuotaDatabase::CreateSchema(
- sql::Connection* database,
- sql::MetaTable* meta_table,
- int schema_version, int compatible_version,
- const TableSchema* tables, size_t tables_size,
- const IndexSchema* indexes, size_t indexes_size) {
- // TODO(kinuko): Factor out the common code to create databases.
- sql::Transaction transaction(database);
- if (!transaction.Begin())
- return false;
-
- if (!meta_table->Init(database, schema_version, compatible_version))
- return false;
-
- for (size_t i = 0; i < tables_size; ++i) {
- std::string sql("CREATE TABLE ");
- sql += tables[i].table_name;
- sql += tables[i].columns;
- if (!database->Execute(sql.c_str())) {
- VLOG(1) << "Failed to execute " << sql;
- return false;
- }
- }
-
- for (size_t i = 0; i < indexes_size; ++i) {
- std::string sql;
- if (indexes[i].unique)
- sql += "CREATE UNIQUE INDEX ";
- else
- sql += "CREATE INDEX ";
- sql += indexes[i].index_name;
- sql += " ON ";
- sql += indexes[i].table_name;
- sql += indexes[i].columns;
- if (!database->Execute(sql.c_str())) {
- VLOG(1) << "Failed to execute " << sql;
- return false;
- }
- }
-
- return transaction.Commit();
-}
-
-bool QuotaDatabase::ResetSchema() {
- DCHECK(!db_file_path_.empty());
- DCHECK(base::PathExists(db_file_path_));
- VLOG(1) << "Deleting existing quota data and starting over.";
-
- db_.reset();
- meta_table_.reset();
-
- if (!sql::Connection::Delete(db_file_path_))
- return false;
-
- // So we can't go recursive.
- if (is_recreating_)
- return false;
-
- base::AutoReset<bool> auto_reset(&is_recreating_, true);
- return LazyOpen(true);
-}
-
-bool QuotaDatabase::UpgradeSchema(int current_version) {
- if (current_version == 2) {
- QuotaTableImporter importer;
- typedef std::vector<QuotaTableEntry> QuotaTableEntries;
- if (!DumpQuotaTable(base::Bind(&QuotaTableImporter::Append,
- base::Unretained(&importer)))) {
- return false;
- }
- ResetSchema();
- for (QuotaTableEntries::const_iterator iter = importer.entries.begin();
- iter != importer.entries.end(); ++iter) {
- if (!SetHostQuota(iter->host, iter->type, iter->quota))
- return false;
- }
- Commit();
- return true;
- }
- return false;
-}
-
-bool QuotaDatabase::DumpQuotaTable(const QuotaTableCallback& callback) {
- if (!LazyOpen(true))
- return false;
-
- const char* kSql = "SELECT * FROM HostQuotaTable";
- sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
-
- while (statement.Step()) {
- QuotaTableEntry entry = QuotaTableEntry(
- statement.ColumnString(0),
- static_cast<StorageType>(statement.ColumnInt(1)),
- statement.ColumnInt64(2));
-
- if (!callback.Run(entry))
- return true;
- }
-
- return statement.Succeeded();
-}
-
-bool QuotaDatabase::DumpOriginInfoTable(
- const OriginInfoTableCallback& callback) {
-
- if (!LazyOpen(true))
- return false;
-
- const char* kSql = "SELECT * FROM OriginInfoTable";
- sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSql));
-
- while (statement.Step()) {
- OriginInfoTableEntry entry(
- GURL(statement.ColumnString(0)),
- static_cast<StorageType>(statement.ColumnInt(1)),
- statement.ColumnInt(2),
- base::Time::FromInternalValue(statement.ColumnInt64(3)),
- base::Time::FromInternalValue(statement.ColumnInt64(4)));
-
- if (!callback.Run(entry))
- return true;
- }
-
- return statement.Succeeded();
-}
-
-bool operator<(const QuotaDatabase::QuotaTableEntry& lhs,
- const QuotaDatabase::QuotaTableEntry& rhs) {
- if (lhs.host < rhs.host) return true;
- if (rhs.host < lhs.host) return false;
- if (lhs.type < rhs.type) return true;
- if (rhs.type < lhs.type) return false;
- return lhs.quota < rhs.quota;
-}
-
-bool operator<(const QuotaDatabase::OriginInfoTableEntry& lhs,
- const QuotaDatabase::OriginInfoTableEntry& rhs) {
- if (lhs.origin < rhs.origin) return true;
- if (rhs.origin < lhs.origin) return false;
- if (lhs.type < rhs.type) return true;
- if (rhs.type < lhs.type) return false;
- if (lhs.used_count < rhs.used_count) return true;
- if (rhs.used_count < lhs.used_count) return false;
- return lhs.last_access_time < rhs.last_access_time;
-}
-
-} // namespace storage
« no previous file with comments | « webkit/browser/quota/quota_database.h ('k') | webkit/browser/quota/quota_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698