| Index: webkit/database/database_tracker.cc
|
| ===================================================================
|
| --- webkit/database/database_tracker.cc (revision 0)
|
| +++ webkit/database/database_tracker.cc (revision 0)
|
| @@ -0,0 +1,211 @@
|
| +// 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 "webkit/database/database_tracker.h"
|
| +
|
| +#include <vector>
|
| +
|
| +#include "app/sql/connection.h"
|
| +#include "app/sql/meta_table.h"
|
| +#include "app/sql/statement.h"
|
| +#include "base/basictypes.h"
|
| +#include "base/file_path.h"
|
| +#include "base/file_util.h"
|
| +#include "base/string_util.h"
|
| +#include "webkit/database/databases_table.h"
|
| +
|
| +namespace webkit_database {
|
| +
|
| +const FilePath::CharType kDatabaseDirectoryName[] =
|
| + FILE_PATH_LITERAL("databases");
|
| +const FilePath::CharType kTrackerDatabaseFileName[] =
|
| + FILE_PATH_LITERAL("Databases.db");
|
| +const int kCurrentVersion = 1;
|
| +const int kCompatibleVersion = 1;
|
| +const int64 kDefaultQuota = 5 * 1024 * 1024;
|
| +
|
| +DatabaseTracker::DatabaseTracker(const FilePath& profile_path)
|
| + : initialized_(false),
|
| + db_dir_(profile_path.Append(FilePath(kDatabaseDirectoryName))),
|
| + db_(new sql::Connection()),
|
| + databases_table_(NULL),
|
| + meta_table_(NULL) {
|
| +}
|
| +
|
| +DatabaseTracker::~DatabaseTracker() {
|
| + DCHECK(observers_.size() == 0);
|
| +}
|
| +
|
| +void DatabaseTracker::DatabaseOpened(const string16& origin_identifier,
|
| + const string16& database_name,
|
| + const string16& database_description,
|
| + int64 estimated_size,
|
| + int64* database_size,
|
| + int64* space_available) {
|
| + if (!LazyInit()) {
|
| + *database_size = 0;
|
| + *space_available = 0;
|
| + return;
|
| + }
|
| +
|
| + InsertOrUpdateDatabaseDetails(origin_identifier, database_name,
|
| + database_description, estimated_size);
|
| +
|
| + *database_size = GetCachedDatabaseFileSize(origin_identifier, database_name);
|
| + *space_available = GetOriginSpaceAvailable(origin_identifier);
|
| +}
|
| +
|
| +void DatabaseTracker::DatabaseModified(const string16& origin_identifier,
|
| + const string16& database_name) {
|
| + if (!LazyInit())
|
| + return;
|
| +
|
| + int64 updated_db_size =
|
| + UpdateCachedDatabaseFileSize(origin_identifier, database_name);
|
| + int64 space_available = GetOriginSpaceAvailable(origin_identifier);
|
| + FOR_EACH_OBSERVER(Observer, observers_, OnDatabaseSizeChanged(
|
| + origin_identifier, database_name, updated_db_size, space_available));
|
| +}
|
| +
|
| +void DatabaseTracker::DatabaseClosed(const string16& origin_identifier,
|
| + const string16& database_name) {
|
| + // TODO(dumi): figure out how to use this information at a later time
|
| +}
|
| +
|
| +void DatabaseTracker::AddObserver(Observer* observer) {
|
| + observers_.AddObserver(observer);
|
| +}
|
| +
|
| +void DatabaseTracker::RemoveObserver(Observer* observer) {
|
| + // When we remove a listener, we do not know which cached information
|
| + // is still needed and which information can be discarded. So we just
|
| + // clear all caches and re-populate them as needed.
|
| + observers_.RemoveObserver(observer);
|
| + ClearAllCachedOriginInfo();
|
| +}
|
| +
|
| +void DatabaseTracker::CloseTrackerDatabaseAndClearCaches() {
|
| + ClearAllCachedOriginInfo();
|
| + meta_table_.reset(NULL);
|
| + databases_table_.reset(NULL);
|
| + db_->Close();
|
| + initialized_ = false;
|
| +}
|
| +
|
| +FilePath DatabaseTracker::GetFullDBFilePath(
|
| + const string16& origin_identifier,
|
| + const string16& database_name) const {
|
| + return db_dir_.Append(FilePath::FromWStringHack(UTF16ToWide(
|
| + origin_identifier + ASCIIToUTF16("_") + database_name)));
|
| +}
|
| +
|
| +bool DatabaseTracker::LazyInit() {
|
| + if (!initialized_) {
|
| + databases_table_.reset(new DatabasesTable(db_.get()));
|
| + meta_table_.reset(new sql::MetaTable());
|
| + initialized_ =
|
| + file_util::CreateDirectory(db_dir_) &&
|
| + db_->Open(db_dir_.Append(FilePath(kTrackerDatabaseFileName))) &&
|
| + meta_table_->Init(db_.get(), kCurrentVersion, kCompatibleVersion) &&
|
| + (meta_table_->GetCompatibleVersionNumber() <= kCurrentVersion) &&
|
| + databases_table_->Init();
|
| + }
|
| + return initialized_;
|
| +}
|
| +
|
| +void DatabaseTracker::InsertOrUpdateDatabaseDetails(
|
| + const string16& origin_identifier,
|
| + const string16& database_name,
|
| + const string16& database_description,
|
| + int64 estimated_size) {
|
| + DatabaseDetails details;
|
| + if (!databases_table_->GetDatabaseDetails(
|
| + origin_identifier, database_name, &details)) {
|
| + details.origin_identifier = origin_identifier;
|
| + details.database_name = database_name;
|
| + details.description = database_description;
|
| + details.estimated_size = estimated_size;
|
| + databases_table_->InsertDatabaseDetails(details);
|
| + } else if ((details.description != database_description) ||
|
| + (details.estimated_size != estimated_size)) {
|
| + details.description = database_description;
|
| + details.estimated_size = estimated_size;
|
| + databases_table_->UpdateDatabaseDetails(details);
|
| + }
|
| +}
|
| +
|
| +int64 DatabaseTracker::GetDBFileSize(const string16& origin_identifier,
|
| + const string16& database_name) const {
|
| + FilePath db_file_name = GetFullDBFilePath(origin_identifier, database_name);
|
| + int64 db_file_size = 0;
|
| + if (!file_util::GetFileSize(db_file_name, &db_file_size))
|
| + db_file_size = 0;
|
| + return db_file_size;
|
| +}
|
| +
|
| +void DatabaseTracker::ClearAllCachedOriginInfo() {
|
| + origins_info_map_.clear();
|
| +}
|
| +
|
| +DatabaseTracker::CachedOriginInfo* DatabaseTracker::GetCachedOriginInfo(
|
| + const string16& origin_identifier) {
|
| + // Populate the cache with data for this origin if needed.
|
| + if (origins_info_map_.find(origin_identifier) == origins_info_map_.end()) {
|
| + std::vector<DatabaseDetails> details;
|
| + if (!databases_table_->GetAllDatabaseDetailsForOrigin(
|
| + origin_identifier, &details)) {
|
| + return NULL;
|
| + }
|
| +
|
| + CachedOriginInfo& origin_info = origins_info_map_[origin_identifier];
|
| + for (std::vector<DatabaseDetails>::const_iterator it = details.begin();
|
| + it != details.end(); it++) {
|
| + int64 db_file_size =
|
| + GetDBFileSize(it->origin_identifier, it->database_name);
|
| + origin_info.SetCachedDatabaseSize(it->database_name, db_file_size);
|
| + }
|
| + }
|
| +
|
| + return &origins_info_map_[origin_identifier];
|
| +}
|
| +
|
| +int64 DatabaseTracker::GetCachedDatabaseFileSize(
|
| + const string16& origin_identifier,
|
| + const string16& database_name) {
|
| + CachedOriginInfo* origin_info = GetCachedOriginInfo(origin_identifier);
|
| + if (!origin_info)
|
| + return 0;
|
| + return origin_info->GetCachedDatabaseSize(database_name);
|
| +}
|
| +
|
| +int64 DatabaseTracker::UpdateCachedDatabaseFileSize(
|
| + const string16& origin_identifier,
|
| + const string16& database_name) {
|
| + int64 new_size = GetDBFileSize(origin_identifier, database_name);
|
| + CachedOriginInfo* origin_info = GetCachedOriginInfo(origin_identifier);
|
| + if (origin_info)
|
| + origin_info->SetCachedDatabaseSize(database_name, new_size);
|
| + return new_size;
|
| +}
|
| +
|
| +int64 DatabaseTracker::GetOriginUsage(const string16& origin_identifier) {
|
| + CachedOriginInfo* origin_info = GetCachedOriginInfo(origin_identifier);
|
| + if (!origin_info)
|
| + return kint64max;
|
| + return origin_info->TotalSize();
|
| +}
|
| +
|
| +int64 DatabaseTracker::GetOriginQuota(
|
| + const string16& /*origin_identifier*/) const {
|
| + return kDefaultQuota;
|
| +}
|
| +
|
| +int64 DatabaseTracker::GetOriginSpaceAvailable(
|
| + const string16& origin_identifier) {
|
| + int64 space_available = GetOriginQuota(origin_identifier) -
|
| + GetOriginUsage(origin_identifier);
|
| + return (space_available < 0 ? 0 : space_available);
|
| +}
|
| +
|
| +} // namespace webkit_database
|
|
|
| Property changes on: webkit\database\database_tracker.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|