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

Side by Side Diff: webkit/database/database_tracker.cc

Issue 7056025: More WebSQLDatabase and QuotaManager integration. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698