| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "webkit/database/database_tracker.h" | 5 #include "webkit/database/database_tracker.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "app/sql/connection.h" | 10 #include "app/sql/connection.h" |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 FILE_PATH_LITERAL("databases"); | 44 FILE_PATH_LITERAL("databases"); |
| 45 const FilePath::CharType kIncognitoDatabaseDirectoryName[] = | 45 const FilePath::CharType kIncognitoDatabaseDirectoryName[] = |
| 46 FILE_PATH_LITERAL("databases-incognito"); | 46 FILE_PATH_LITERAL("databases-incognito"); |
| 47 const FilePath::CharType kTrackerDatabaseFileName[] = | 47 const FilePath::CharType kTrackerDatabaseFileName[] = |
| 48 FILE_PATH_LITERAL("Databases.db"); | 48 FILE_PATH_LITERAL("Databases.db"); |
| 49 static const int kCurrentVersion = 2; | 49 static const int kCurrentVersion = 2; |
| 50 static const int kCompatibleVersion = 1; | 50 static const int kCompatibleVersion = 1; |
| 51 static const char* kExtensionOriginIdentifierPrefix = "chrome-extension_"; | 51 static const char* kExtensionOriginIdentifierPrefix = "chrome-extension_"; |
| 52 | 52 |
| 53 OriginInfo::OriginInfo() | 53 OriginInfo::OriginInfo() |
| 54 : total_size_(0), | 54 : total_size_(0) {} |
| 55 quota_(0) {} | |
| 56 | 55 |
| 57 OriginInfo::OriginInfo(const OriginInfo& origin_info) | 56 OriginInfo::OriginInfo(const OriginInfo& origin_info) |
| 58 : origin_(origin_info.origin_), | 57 : origin_(origin_info.origin_), |
| 59 total_size_(origin_info.total_size_), | 58 total_size_(origin_info.total_size_), |
| 60 quota_(origin_info.quota_), | |
| 61 database_info_(origin_info.database_info_) {} | 59 database_info_(origin_info.database_info_) {} |
| 62 | 60 |
| 63 OriginInfo::~OriginInfo() {} | 61 OriginInfo::~OriginInfo() {} |
| 64 | 62 |
| 65 void OriginInfo::GetAllDatabaseNames(std::vector<string16>* databases) const { | 63 void OriginInfo::GetAllDatabaseNames(std::vector<string16>* databases) const { |
| 66 for (DatabaseInfoMap::const_iterator it = database_info_.begin(); | 64 for (DatabaseInfoMap::const_iterator it = database_info_.begin(); |
| 67 it != database_info_.end(); it++) { | 65 it != database_info_.end(); it++) { |
| 68 databases->push_back(it->first); | 66 databases->push_back(it->first); |
| 69 } | 67 } |
| 70 } | 68 } |
| 71 | 69 |
| 72 int64 OriginInfo::GetDatabaseSize(const string16& database_name) const { | 70 int64 OriginInfo::GetDatabaseSize(const string16& database_name) const { |
| 73 DatabaseInfoMap::const_iterator it = database_info_.find(database_name); | 71 DatabaseInfoMap::const_iterator it = database_info_.find(database_name); |
| 74 if (it != database_info_.end()) | 72 if (it != database_info_.end()) |
| 75 return it->second.first; | 73 return it->second.first; |
| 76 return 0; | 74 return 0; |
| 77 } | 75 } |
| 78 | 76 |
| 79 string16 OriginInfo::GetDatabaseDescription( | 77 string16 OriginInfo::GetDatabaseDescription( |
| 80 const string16& database_name) const { | 78 const string16& database_name) const { |
| 81 DatabaseInfoMap::const_iterator it = database_info_.find(database_name); | 79 DatabaseInfoMap::const_iterator it = database_info_.find(database_name); |
| 82 if (it != database_info_.end()) | 80 if (it != database_info_.end()) |
| 83 return it->second.second; | 81 return it->second.second; |
| 84 return string16(); | 82 return string16(); |
| 85 } | 83 } |
| 86 | 84 |
| 87 OriginInfo::OriginInfo(const string16& origin, int64 total_size, int64 quota) | 85 OriginInfo::OriginInfo(const string16& origin, int64 total_size) |
| 88 : origin_(origin), total_size_(total_size), quota_(quota) {} | 86 : origin_(origin), total_size_(total_size) {} |
| 89 | 87 |
| 90 DatabaseTracker::DatabaseTracker( | 88 DatabaseTracker::DatabaseTracker( |
| 91 const FilePath& profile_path, | 89 const FilePath& profile_path, |
| 92 bool is_incognito, | 90 bool is_incognito, |
| 93 quota::SpecialStoragePolicy* special_storage_policy, | 91 quota::SpecialStoragePolicy* special_storage_policy, |
| 94 quota::QuotaManagerProxy* quota_manager_proxy, | 92 quota::QuotaManagerProxy* quota_manager_proxy, |
| 95 base::MessageLoopProxy* db_tracker_thread) | 93 base::MessageLoopProxy* db_tracker_thread) |
| 96 : is_initialized_(false), | 94 : is_initialized_(false), |
| 97 is_incognito_(is_incognito), | 95 is_incognito_(is_incognito), |
| 98 shutting_down_(false), | 96 shutting_down_(false), |
| 99 profile_path_(profile_path), | 97 profile_path_(profile_path), |
| 100 db_dir_(is_incognito_ ? | 98 db_dir_(is_incognito_ ? |
| 101 profile_path_.Append(kIncognitoDatabaseDirectoryName) : | 99 profile_path_.Append(kIncognitoDatabaseDirectoryName) : |
| 102 profile_path_.Append(kDatabaseDirectoryName)), | 100 profile_path_.Append(kDatabaseDirectoryName)), |
| 103 db_(new sql::Connection()), | 101 db_(new sql::Connection()), |
| 104 databases_table_(NULL), | 102 databases_table_(NULL), |
| 105 meta_table_(NULL), | 103 meta_table_(NULL), |
| 106 default_quota_(5 * 1024 * 1024), | |
| 107 special_storage_policy_(special_storage_policy), | 104 special_storage_policy_(special_storage_policy), |
| 108 quota_manager_proxy_(quota_manager_proxy), | 105 quota_manager_proxy_(quota_manager_proxy), |
| 109 incognito_origin_directories_generator_(0) { | 106 incognito_origin_directories_generator_(0) { |
| 110 if (quota_manager_proxy) { | 107 if (quota_manager_proxy) { |
| 111 quota_manager_proxy->RegisterClient( | 108 quota_manager_proxy->RegisterClient( |
| 112 new DatabaseQuotaClient(db_tracker_thread, this)); | 109 new DatabaseQuotaClient(db_tracker_thread, this)); |
| 113 } | 110 } |
| 114 } | 111 } |
| 115 | 112 |
| 116 DatabaseTracker::~DatabaseTracker() { | 113 DatabaseTracker::~DatabaseTracker() { |
| 117 DCHECK(dbs_to_be_deleted_.empty()); | 114 DCHECK(dbs_to_be_deleted_.empty()); |
| 118 DCHECK(deletion_callbacks_.empty()); | 115 DCHECK(deletion_callbacks_.empty()); |
| 119 } | 116 } |
| 120 | 117 |
| 121 void DatabaseTracker::SetDefaultQuota(int64 quota) { | |
| 122 default_quota_ = quota; | |
| 123 ClearAllCachedOriginInfo(); | |
| 124 } | |
| 125 | |
| 126 void DatabaseTracker::DatabaseOpened(const string16& origin_identifier, | 118 void DatabaseTracker::DatabaseOpened(const string16& origin_identifier, |
| 127 const string16& database_name, | 119 const string16& database_name, |
| 128 const string16& database_description, | 120 const string16& database_description, |
| 129 int64 estimated_size, | 121 int64 estimated_size, |
| 130 int64* database_size, | 122 int64* database_size, |
| 131 int64* space_available) { | 123 int64* space_available) { |
| 124 // TODO(michaeln): remove space_available from the interface |
| 125 *space_available = 0; |
| 126 |
| 132 if (!LazyInit()) { | 127 if (!LazyInit()) { |
| 133 *database_size = 0; | 128 *database_size = 0; |
| 134 *space_available = 0; | 129 *space_available = 0; |
| 135 return; | 130 return; |
| 136 } | 131 } |
| 137 | 132 |
| 138 InsertOrUpdateDatabaseDetails(origin_identifier, database_name, | 133 if (quota_manager_proxy_) |
| 139 database_description, estimated_size); | |
| 140 database_connections_.AddConnection(origin_identifier, database_name); | |
| 141 | |
| 142 CachedOriginInfo* info = GetCachedOriginInfo(origin_identifier); | |
| 143 *database_size = (info ? info->GetDatabaseSize(database_name) : 0); | |
| 144 *space_available = GetOriginSpaceAvailable(origin_identifier); | |
| 145 | |
| 146 if (quota_manager_proxy_) { | |
| 147 // So we can compute deltas as modifications are made. | |
| 148 database_connections_.SetOpenDatabaseSize( | |
| 149 origin_identifier, database_name, *database_size); | |
| 150 quota_manager_proxy_->NotifyStorageAccessed( | 134 quota_manager_proxy_->NotifyStorageAccessed( |
| 151 quota::QuotaClient::kDatabase, | 135 quota::QuotaClient::kDatabase, |
| 152 DatabaseUtil::GetOriginFromIdentifier(origin_identifier), | 136 DatabaseUtil::GetOriginFromIdentifier(origin_identifier), |
| 153 quota::kStorageTypeTemporary); | 137 quota::kStorageTypeTemporary); |
| 138 |
| 139 InsertOrUpdateDatabaseDetails(origin_identifier, database_name, |
| 140 database_description, estimated_size); |
| 141 if (database_connections_.AddConnection(origin_identifier, database_name)) { |
| 142 *database_size = SeedOpenDatabaseSize(origin_identifier, database_name); |
| 143 return; |
| 154 } | 144 } |
| 145 *database_size = UpdateOpenDatabaseSizeAndNotify(origin_identifier, |
| 146 database_name); |
| 155 } | 147 } |
| 156 | 148 |
| 157 void DatabaseTracker::DatabaseModified(const string16& origin_identifier, | 149 void DatabaseTracker::DatabaseModified(const string16& origin_identifier, |
| 158 const string16& database_name) { | 150 const string16& database_name) { |
| 159 if (!LazyInit()) | 151 if (!LazyInit()) |
| 160 return; | 152 return; |
| 161 | 153 UpdateOpenDatabaseSizeAndNotify(origin_identifier, database_name); |
| 162 int64 new_size = | |
| 163 UpdateCachedDatabaseFileSize(origin_identifier, database_name); | |
| 164 int64 space_available = GetOriginSpaceAvailable(origin_identifier); | |
| 165 FOR_EACH_OBSERVER(Observer, observers_, OnDatabaseSizeChanged( | |
| 166 origin_identifier, database_name, new_size, space_available)); | |
| 167 | |
| 168 if (quota_manager_proxy_) { | |
| 169 int64 old_size = database_connections_.GetOpenDatabaseSize( | |
| 170 origin_identifier, database_name); | |
| 171 if (old_size != new_size) { | |
| 172 database_connections_.SetOpenDatabaseSize( | |
| 173 origin_identifier, database_name, new_size); | |
| 174 quota_manager_proxy_->NotifyStorageModified( | |
| 175 quota::QuotaClient::kDatabase, | |
| 176 DatabaseUtil::GetOriginFromIdentifier(origin_identifier), | |
| 177 quota::kStorageTypeTemporary, | |
| 178 new_size - old_size); | |
| 179 } | |
| 180 } | |
| 181 } | 154 } |
| 182 | 155 |
| 183 void DatabaseTracker::DatabaseClosed(const string16& origin_identifier, | 156 void DatabaseTracker::DatabaseClosed(const string16& origin_identifier, |
| 184 const string16& database_name) { | 157 const string16& database_name) { |
| 185 if (database_connections_.IsEmpty()) { | 158 if (database_connections_.IsEmpty()) { |
| 186 DCHECK(!is_initialized_); | 159 DCHECK(!is_initialized_); |
| 187 return; | 160 return; |
| 188 } | 161 } |
| 189 database_connections_.RemoveConnection(origin_identifier, database_name); | 162 |
| 190 if (!database_connections_.IsDatabaseOpened(origin_identifier, database_name)) | 163 if (quota_manager_proxy_) |
| 164 quota_manager_proxy_->NotifyStorageAccessed( |
| 165 quota::QuotaClient::kDatabase, |
| 166 DatabaseUtil::GetOriginFromIdentifier(origin_identifier), |
| 167 quota::kStorageTypeTemporary); |
| 168 |
| 169 UpdateOpenDatabaseSizeAndNotify(origin_identifier, database_name); |
| 170 if (database_connections_.RemoveConnection(origin_identifier, database_name)) |
| 191 DeleteDatabaseIfNeeded(origin_identifier, database_name); | 171 DeleteDatabaseIfNeeded(origin_identifier, database_name); |
| 192 } | 172 } |
| 193 | 173 |
| 194 void DatabaseTracker::CloseDatabases(const DatabaseConnections& connections) { | 174 void DatabaseTracker::CloseDatabases(const DatabaseConnections& connections) { |
| 195 if (database_connections_.IsEmpty()) { | 175 if (database_connections_.IsEmpty()) { |
| 196 DCHECK(!is_initialized_ || connections.IsEmpty()); | 176 DCHECK(!is_initialized_ || connections.IsEmpty()); |
| 197 return; | 177 return; |
| 198 } | 178 } |
| 199 | 179 |
| 200 if (quota_manager_proxy_) { | 180 // When being closed by this route, there's a chance that |
| 201 // When being closed by this route, there's a chance that | 181 // the tracker missed some DatabseModified calls. This method is used |
| 202 // the tracker missed some DatabseModified calls. This method is used | 182 // when a renderer crashes to cleanup it's open resources. |
| 203 // when a renderer crashes to cleanup it's open resources. | 183 // We need to examine what we have in connections for the |
| 204 // We need to examine what we have in connections for the | 184 // size of each open databases and notify any differences between the |
| 205 // size of each open databases and notify any differences between the | 185 // actual file sizes now. |
| 206 // actual file sizes now. | 186 std::vector<std::pair<string16, string16> > open_dbs; |
| 207 std::vector<std::pair<string16, string16> > open_dbs; | 187 connections.ListConnections(&open_dbs); |
| 208 connections.ListConnections(&open_dbs); | 188 for (std::vector<std::pair<string16, string16> >::iterator it = |
| 209 for (std::vector<std::pair<string16, string16> >::iterator it = | 189 open_dbs.begin(); it != open_dbs.end(); ++it) |
| 210 open_dbs.begin(); it != open_dbs.end(); ++it) { | 190 UpdateOpenDatabaseSizeAndNotify(it->first, it->second); |
| 211 int64 old_size = database_connections_.GetOpenDatabaseSize( | |
| 212 it->first, it->second); | |
| 213 int64 new_size = GetDBFileSize(it->first, it->second); | |
| 214 if (new_size != old_size) { | |
| 215 database_connections_.SetOpenDatabaseSize( | |
| 216 it->first, it->second, new_size); | |
| 217 quota_manager_proxy_->NotifyStorageModified( | |
| 218 quota::QuotaClient::kDatabase, | |
| 219 DatabaseUtil::GetOriginFromIdentifier(it->first), | |
| 220 quota::kStorageTypeTemporary, | |
| 221 new_size - old_size); | |
| 222 } | |
| 223 } | |
| 224 } | |
| 225 | 191 |
| 226 std::vector<std::pair<string16, string16> > closed_dbs; | 192 std::vector<std::pair<string16, string16> > closed_dbs; |
| 227 database_connections_.RemoveConnections(connections, &closed_dbs); | 193 database_connections_.RemoveConnections(connections, &closed_dbs); |
| 228 for (std::vector<std::pair<string16, string16> >::iterator it = | 194 for (std::vector<std::pair<string16, string16> >::iterator it = |
| 229 closed_dbs.begin(); it != closed_dbs.end(); ++it) { | 195 closed_dbs.begin(); it != closed_dbs.end(); ++it) { |
| 230 DeleteDatabaseIfNeeded(it->first, it->second); | 196 DeleteDatabaseIfNeeded(it->first, it->second); |
| 231 } | 197 } |
| 232 } | 198 } |
| 233 | 199 |
| 234 void DatabaseTracker::DeleteDatabaseIfNeeded(const string16& origin_identifier, | 200 void DatabaseTracker::DeleteDatabaseIfNeeded(const string16& origin_identifier, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 observers_.RemoveObserver(observer); | 242 observers_.RemoveObserver(observer); |
| 277 ClearAllCachedOriginInfo(); | 243 ClearAllCachedOriginInfo(); |
| 278 } | 244 } |
| 279 | 245 |
| 280 void DatabaseTracker::CloseTrackerDatabaseAndClearCaches() { | 246 void DatabaseTracker::CloseTrackerDatabaseAndClearCaches() { |
| 281 ClearAllCachedOriginInfo(); | 247 ClearAllCachedOriginInfo(); |
| 282 | 248 |
| 283 if (!is_incognito_) { | 249 if (!is_incognito_) { |
| 284 meta_table_.reset(NULL); | 250 meta_table_.reset(NULL); |
| 285 databases_table_.reset(NULL); | 251 databases_table_.reset(NULL); |
| 286 quota_table_.reset(NULL); | |
| 287 db_->Close(); | 252 db_->Close(); |
| 288 is_initialized_ = false; | 253 is_initialized_ = false; |
| 289 } | 254 } |
| 290 } | 255 } |
| 291 | 256 |
| 292 string16 DatabaseTracker::GetOriginDirectory( | 257 string16 DatabaseTracker::GetOriginDirectory( |
| 293 const string16& origin_identifier) { | 258 const string16& origin_identifier) { |
| 294 if (!is_incognito_) | 259 if (!is_incognito_) |
| 295 return origin_identifier; | 260 return origin_identifier; |
| 296 | 261 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 // Restore 'origins_info' to its initial state. | 323 // Restore 'origins_info' to its initial state. |
| 359 origins_info->clear(); | 324 origins_info->clear(); |
| 360 return false; | 325 return false; |
| 361 } | 326 } |
| 362 origins_info->push_back(OriginInfo(*origin_info)); | 327 origins_info->push_back(OriginInfo(*origin_info)); |
| 363 } | 328 } |
| 364 | 329 |
| 365 return true; | 330 return true; |
| 366 } | 331 } |
| 367 | 332 |
| 368 void DatabaseTracker::SetOriginQuota(const string16& origin_identifier, | |
| 369 int64 new_quota) { | |
| 370 if (!LazyInit()) | |
| 371 return; | |
| 372 | |
| 373 if (quota_table_->SetOriginQuota(origin_identifier, new_quota) && | |
| 374 (origins_info_map_.find(origin_identifier) != origins_info_map_.end())) { | |
| 375 origins_info_map_[origin_identifier].SetQuota(new_quota); | |
| 376 } | |
| 377 } | |
| 378 | |
| 379 | |
| 380 bool DatabaseTracker::DeleteClosedDatabase(const string16& origin_identifier, | 333 bool DatabaseTracker::DeleteClosedDatabase(const string16& origin_identifier, |
| 381 const string16& database_name) { | 334 const string16& database_name) { |
| 382 if (!LazyInit()) | 335 if (!LazyInit()) |
| 383 return false; | 336 return false; |
| 384 | 337 |
| 385 // Check if the database is opened by any renderer. | 338 // Check if the database is opened by any renderer. |
| 386 if (database_connections_.IsDatabaseOpened(origin_identifier, database_name)) | 339 if (database_connections_.IsDatabaseOpened(origin_identifier, database_name)) |
| 387 return false; | 340 return false; |
| 388 | 341 |
| 389 int64 db_file_size = quota_manager_proxy_ ? | 342 int64 db_file_size = quota_manager_proxy_ ? |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 return false; | 417 return false; |
| 465 | 418 |
| 466 std::set<string16>& databases = it->second; | 419 std::set<string16>& databases = it->second; |
| 467 return (databases.find(database_name) != databases.end()); | 420 return (databases.find(database_name) != databases.end()); |
| 468 } | 421 } |
| 469 | 422 |
| 470 bool DatabaseTracker::LazyInit() { | 423 bool DatabaseTracker::LazyInit() { |
| 471 if (!is_initialized_ && !shutting_down_) { | 424 if (!is_initialized_ && !shutting_down_) { |
| 472 DCHECK(!db_->is_open()); | 425 DCHECK(!db_->is_open()); |
| 473 DCHECK(!databases_table_.get()); | 426 DCHECK(!databases_table_.get()); |
| 474 DCHECK(!quota_table_.get()); | |
| 475 DCHECK(!meta_table_.get()); | 427 DCHECK(!meta_table_.get()); |
| 476 | 428 |
| 477 // If the tracker database exists, but it's corrupt or doesn't | 429 // If the tracker database exists, but it's corrupt or doesn't |
| 478 // have a meta table, delete the database directory. | 430 // have a meta table, delete the database directory. |
| 479 const FilePath kTrackerDatabaseFullPath = | 431 const FilePath kTrackerDatabaseFullPath = |
| 480 db_dir_.Append(FilePath(kTrackerDatabaseFileName)); | 432 db_dir_.Append(FilePath(kTrackerDatabaseFileName)); |
| 481 if (file_util::DirectoryExists(db_dir_) && | 433 if (file_util::DirectoryExists(db_dir_) && |
| 482 file_util::PathExists(kTrackerDatabaseFullPath) && | 434 file_util::PathExists(kTrackerDatabaseFullPath) && |
| 483 (!db_->Open(kTrackerDatabaseFullPath) || | 435 (!db_->Open(kTrackerDatabaseFullPath) || |
| 484 !sql::MetaTable::DoesTableExist(db_.get()))) { | 436 !sql::MetaTable::DoesTableExist(db_.get()))) { |
| 485 db_->Close(); | 437 db_->Close(); |
| 486 if (!file_util::Delete(db_dir_, true)) | 438 if (!file_util::Delete(db_dir_, true)) |
| 487 return false; | 439 return false; |
| 488 } | 440 } |
| 489 | 441 |
| 490 db_->set_error_delegate(GetErrorHandlerForTrackerDb()); | 442 db_->set_error_delegate(GetErrorHandlerForTrackerDb()); |
| 491 | 443 |
| 492 databases_table_.reset(new DatabasesTable(db_.get())); | 444 databases_table_.reset(new DatabasesTable(db_.get())); |
| 493 quota_table_.reset(new QuotaTable(db_.get())); | |
| 494 meta_table_.reset(new sql::MetaTable()); | 445 meta_table_.reset(new sql::MetaTable()); |
| 495 | 446 |
| 496 is_initialized_ = | 447 is_initialized_ = |
| 497 file_util::CreateDirectory(db_dir_) && | 448 file_util::CreateDirectory(db_dir_) && |
| 498 (db_->is_open() || | 449 (db_->is_open() || |
| 499 (is_incognito_ ? db_->OpenInMemory() : | 450 (is_incognito_ ? db_->OpenInMemory() : |
| 500 db_->Open(kTrackerDatabaseFullPath))) && | 451 db_->Open(kTrackerDatabaseFullPath))) && |
| 501 UpgradeToCurrentVersion(); | 452 UpgradeToCurrentVersion(); |
| 502 if (!is_initialized_) { | 453 if (!is_initialized_) { |
| 503 databases_table_.reset(NULL); | 454 databases_table_.reset(NULL); |
| 504 quota_table_.reset(NULL); | |
| 505 meta_table_.reset(NULL); | 455 meta_table_.reset(NULL); |
| 506 db_->Close(); | 456 db_->Close(); |
| 507 } | 457 } |
| 508 } | 458 } |
| 509 return is_initialized_; | 459 return is_initialized_; |
| 510 } | 460 } |
| 511 | 461 |
| 512 bool DatabaseTracker::UpgradeToCurrentVersion() { | 462 bool DatabaseTracker::UpgradeToCurrentVersion() { |
| 513 sql::Transaction transaction(db_.get()); | 463 sql::Transaction transaction(db_.get()); |
| 514 if (!transaction.Begin() || | 464 if (!transaction.Begin() || |
| 515 !meta_table_->Init(db_.get(), kCurrentVersion, kCompatibleVersion) || | 465 !meta_table_->Init(db_.get(), kCurrentVersion, kCompatibleVersion) || |
| 516 (meta_table_->GetCompatibleVersionNumber() > kCurrentVersion) || | 466 (meta_table_->GetCompatibleVersionNumber() > kCurrentVersion) || |
| 517 !databases_table_->Init() || | 467 !databases_table_->Init()) |
| 518 !quota_table_->Init()) | |
| 519 return false; | 468 return false; |
| 520 | 469 |
| 521 if (meta_table_->GetVersionNumber() < kCurrentVersion) | 470 if (meta_table_->GetVersionNumber() < kCurrentVersion) |
| 522 meta_table_->SetVersionNumber(kCurrentVersion); | 471 meta_table_->SetVersionNumber(kCurrentVersion); |
| 523 | 472 |
| 524 return transaction.Commit(); | 473 return transaction.Commit(); |
| 525 } | 474 } |
| 526 | 475 |
| 527 void DatabaseTracker::InsertOrUpdateDatabaseDetails( | 476 void DatabaseTracker::InsertOrUpdateDatabaseDetails( |
| 528 const string16& origin_identifier, | 477 const string16& origin_identifier, |
| (...skipping 30 matching lines...) Expand all Loading... |
| 559 std::vector<DatabaseDetails> details; | 508 std::vector<DatabaseDetails> details; |
| 560 if (!databases_table_->GetAllDatabaseDetailsForOrigin( | 509 if (!databases_table_->GetAllDatabaseDetailsForOrigin( |
| 561 origin_identifier, &details)) { | 510 origin_identifier, &details)) { |
| 562 return NULL; | 511 return NULL; |
| 563 } | 512 } |
| 564 | 513 |
| 565 CachedOriginInfo& origin_info = origins_info_map_[origin_identifier]; | 514 CachedOriginInfo& origin_info = origins_info_map_[origin_identifier]; |
| 566 origin_info.SetOrigin(origin_identifier); | 515 origin_info.SetOrigin(origin_identifier); |
| 567 for (std::vector<DatabaseDetails>::const_iterator it = details.begin(); | 516 for (std::vector<DatabaseDetails>::const_iterator it = details.begin(); |
| 568 it != details.end(); it++) { | 517 it != details.end(); it++) { |
| 569 int64 db_file_size = | 518 int64 db_file_size; |
| 570 GetDBFileSize(origin_identifier, it->database_name); | 519 if (database_connections_.IsDatabaseOpened( |
| 520 origin_identifier, it->database_name)) { |
| 521 db_file_size = database_connections_.GetOpenDatabaseSize( |
| 522 origin_identifier, it->database_name); |
| 523 } else { |
| 524 db_file_size = GetDBFileSize(origin_identifier, it->database_name); |
| 525 } |
| 571 origin_info.SetDatabaseSize(it->database_name, db_file_size); | 526 origin_info.SetDatabaseSize(it->database_name, db_file_size); |
| 572 origin_info.SetDatabaseDescription(it->database_name, it->description); | 527 origin_info.SetDatabaseDescription(it->database_name, it->description); |
| 573 } | 528 } |
| 574 | |
| 575 if (special_storage_policy_.get() && | |
| 576 special_storage_policy_->IsStorageUnlimited( | |
| 577 DatabaseUtil::GetOriginFromIdentifier(origin_identifier))) { | |
| 578 // TODO(michaeln): handle the case where it changes status sometime after | |
| 579 // the cached origin_info has been established | |
| 580 origin_info.SetQuota(kint64max); | |
| 581 } else { | |
| 582 int64 origin_quota = quota_table_->GetOriginQuota(origin_identifier); | |
| 583 if (origin_quota > 0) | |
| 584 origin_info.SetQuota(origin_quota); | |
| 585 else | |
| 586 origin_info.SetQuota(default_quota_); | |
| 587 } | |
| 588 } | 529 } |
| 589 | 530 |
| 590 return &origins_info_map_[origin_identifier]; | 531 return &origins_info_map_[origin_identifier]; |
| 591 } | 532 } |
| 592 | 533 |
| 593 int64 DatabaseTracker::GetDBFileSize(const string16& origin_identifier, | 534 int64 DatabaseTracker::GetDBFileSize(const string16& origin_identifier, |
| 594 const string16& database_name) { | 535 const string16& database_name) { |
| 595 FilePath db_file_name = GetFullDBFilePath(origin_identifier, database_name); | 536 FilePath db_file_name = GetFullDBFilePath(origin_identifier, database_name); |
| 596 int64 db_file_size = 0; | 537 int64 db_file_size = 0; |
| 597 if (!file_util::GetFileSize(db_file_name, &db_file_size)) | 538 if (!file_util::GetFileSize(db_file_name, &db_file_size)) |
| 598 db_file_size = 0; | 539 db_file_size = 0; |
| 599 return db_file_size; | 540 return db_file_size; |
| 600 } | 541 } |
| 601 | 542 |
| 602 int64 DatabaseTracker::GetOriginSpaceAvailable( | 543 int64 DatabaseTracker::SeedOpenDatabaseSize( |
| 603 const string16& origin_identifier) { | 544 const string16& origin_id, const string16& name) { |
| 604 // TODO(michaeln): Come up with a value according to the the QuotaMgr. | 545 DCHECK(database_connections_.IsDatabaseOpened(origin_id, name)); |
| 605 CachedOriginInfo* origin_info = GetCachedOriginInfo(origin_identifier); | 546 int64 size = GetDBFileSize(origin_id, name); |
| 606 if (!origin_info) | 547 database_connections_.SetOpenDatabaseSize(origin_id, name, size); |
| 607 return 0; | 548 if (origins_info_map_.find(origin_id) != origins_info_map_.end()) |
| 608 int64 space_available = origin_info->Quota() - origin_info->TotalSize(); | 549 origins_info_map_[origin_id].SetDatabaseSize(name, size); |
| 609 return (space_available < 0 ? 0 : space_available); | 550 return size; |
| 610 } | 551 } |
| 611 | 552 |
| 612 int64 DatabaseTracker::UpdateCachedDatabaseFileSize( | 553 int64 DatabaseTracker::UpdateOpenDatabaseSizeAndNotify( |
| 613 const string16& origin_identifier, | 554 const string16& origin_id, const string16& name) { |
| 614 const string16& database_name) { | 555 DCHECK(database_connections_.IsDatabaseOpened(origin_id, name)); |
| 615 int64 new_size = GetDBFileSize(origin_identifier, database_name); | 556 int64 new_size = GetDBFileSize(origin_id, name); |
| 616 CachedOriginInfo* origin_info = GetCachedOriginInfo(origin_identifier); | 557 int64 old_size = database_connections_.GetOpenDatabaseSize(origin_id, name); |
| 617 if (origin_info) | 558 if (old_size != new_size) { |
| 618 origin_info->SetDatabaseSize(database_name, new_size); | 559 database_connections_.SetOpenDatabaseSize(origin_id, name, new_size); |
| 560 if (origins_info_map_.find(origin_id) != origins_info_map_.end()) |
| 561 origins_info_map_[origin_id].SetDatabaseSize(name, new_size); |
| 562 if (quota_manager_proxy_) |
| 563 quota_manager_proxy_->NotifyStorageModified( |
| 564 quota::QuotaClient::kDatabase, |
| 565 DatabaseUtil::GetOriginFromIdentifier(origin_id), |
| 566 quota::kStorageTypeTemporary, |
| 567 new_size - old_size); |
| 568 const int64 kNotUsed = 0; |
| 569 FOR_EACH_OBSERVER(Observer, observers_, OnDatabaseSizeChanged( |
| 570 origin_id, name, new_size, kNotUsed)); |
| 571 } |
| 619 return new_size; | 572 return new_size; |
| 620 } | 573 } |
| 621 | 574 |
| 622 void DatabaseTracker::ScheduleDatabaseForDeletion( | 575 void DatabaseTracker::ScheduleDatabaseForDeletion( |
| 623 const string16& origin_identifier, | 576 const string16& origin_identifier, |
| 624 const string16& database_name) { | 577 const string16& database_name) { |
| 625 DCHECK(database_connections_.IsDatabaseOpened(origin_identifier, | 578 DCHECK(database_connections_.IsDatabaseOpened(origin_identifier, |
| 626 database_name)); | 579 database_name)); |
| 627 dbs_to_be_deleted_[origin_identifier].insert(database_name); | 580 dbs_to_be_deleted_[origin_identifier].insert(database_name); |
| 628 FOR_EACH_OBSERVER(Observer, observers_, OnDatabaseScheduledForDeletion( | 581 FOR_EACH_OBSERVER(Observer, observers_, OnDatabaseScheduledForDeletion( |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 std::string basename = file_path.BaseName().MaybeAsASCII(); | 786 std::string basename = file_path.BaseName().MaybeAsASCII(); |
| 834 if (!basename.empty() && | 787 if (!basename.empty() && |
| 835 !StartsWithASCII(basename, kExtensionOriginIdentifierPrefix, true)) { | 788 !StartsWithASCII(basename, kExtensionOriginIdentifierPrefix, true)) { |
| 836 file_util::Delete(file_path, true); | 789 file_util::Delete(file_path, true); |
| 837 } | 790 } |
| 838 } | 791 } |
| 839 } | 792 } |
| 840 } | 793 } |
| 841 | 794 |
| 842 } // namespace webkit_database | 795 } // namespace webkit_database |
| OLD | NEW |