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

Side by Side Diff: webkit/support/simple_database_system.cc

Issue 7037018: DB quota (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/support/simple_database_system.h" 5 #include "webkit/support/simple_database_system.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "base/message_loop_proxy.h" 10 #include "base/message_loop_proxy.h"
11 #include "base/synchronization/waitable_event.h" 11 #include "base/synchronization/waitable_event.h"
12 #include "base/threading/platform_thread.h" 12 #include "base/threading/platform_thread.h"
13 #include "base/utf_string_conversions.h" 13 #include "base/utf_string_conversions.h"
14 #include "third_party/sqlite/sqlite3.h" 14 #include "third_party/sqlite/sqlite3.h"
15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDatabase.h" 15 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDatabase.h"
16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" 16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
17 #include "webkit/database/database_util.h" 17 #include "webkit/database/database_util.h"
18 #include "webkit/database/vfs_backend.h" 18 #include "webkit/database/vfs_backend.h"
19 19
20 using webkit_database::DatabaseTracker; 20 using webkit_database::DatabaseTracker;
21 using webkit_database::DatabaseUtil; 21 using webkit_database::DatabaseUtil;
22 using webkit_database::OriginInfo;
22 using webkit_database::VfsBackend; 23 using webkit_database::VfsBackend;
23 24
24 SimpleDatabaseSystem* SimpleDatabaseSystem::instance_ = NULL; 25 SimpleDatabaseSystem* SimpleDatabaseSystem::instance_ = NULL;
25 26
26 SimpleDatabaseSystem* SimpleDatabaseSystem::GetInstance() { 27 SimpleDatabaseSystem* SimpleDatabaseSystem::GetInstance() {
27 DCHECK(instance_); 28 DCHECK(instance_);
28 return instance_; 29 return instance_;
29 } 30 }
30 31
31 SimpleDatabaseSystem::SimpleDatabaseSystem() 32 SimpleDatabaseSystem::SimpleDatabaseSystem()
32 : db_thread_("SimpleDBThread"), 33 : db_thread_("SimpleDBThread"),
34 quota_per_origin_(5 * 1024 * 1024),
33 open_connections_(new webkit_database::DatabaseConnectionsWrapper) { 35 open_connections_(new webkit_database::DatabaseConnectionsWrapper) {
34 DCHECK(!instance_); 36 DCHECK(!instance_);
35 instance_ = this; 37 instance_ = this;
36 CHECK(temp_dir_.CreateUniqueTempDir()); 38 CHECK(temp_dir_.CreateUniqueTempDir());
37 db_tracker_ = new DatabaseTracker(temp_dir_.path(), false, NULL, NULL, NULL); 39 db_tracker_ = new DatabaseTracker(temp_dir_.path(), false, NULL, NULL, NULL);
38 db_tracker_->AddObserver(this); 40 db_tracker_->AddObserver(this);
39 db_thread_.Start(); 41 db_thread_.Start();
40 db_thread_proxy_ = db_thread_.message_loop_proxy(); 42 db_thread_proxy_ = db_thread_.message_loop_proxy();
41 } 43 }
42 44
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 int64 SimpleDatabaseSystem::GetFileSize(const string16& vfs_file_name) { 115 int64 SimpleDatabaseSystem::GetFileSize(const string16& vfs_file_name) {
114 int64 result = 0; 116 int64 result = 0;
115 base::WaitableEvent done_event(false, false); 117 base::WaitableEvent done_event(false, false);
116 db_thread_proxy_->PostTask(FROM_HERE, 118 db_thread_proxy_->PostTask(FROM_HERE,
117 NewRunnableMethod(this, &SimpleDatabaseSystem::VfsGetFileSize, 119 NewRunnableMethod(this, &SimpleDatabaseSystem::VfsGetFileSize,
118 vfs_file_name, &result, &done_event)); 120 vfs_file_name, &result, &done_event));
119 done_event.Wait(); 121 done_event.Wait();
120 return result; 122 return result;
121 } 123 }
122 124
125 int64 SimpleDatabaseSystem::GetSpaceAvailable(
126 const string16& origin_identifier) {
127 int64 result = 0;
128 base::WaitableEvent done_event(false, false);
129 db_thread_proxy_->PostTask(FROM_HERE,
130 NewRunnableMethod(this, &SimpleDatabaseSystem::VfsGetSpaceAvailable,
131 origin_identifier, &result, &done_event));
132 done_event.Wait();
133 return result;
134 }
135
123 void SimpleDatabaseSystem::ClearAllDatabases() { 136 void SimpleDatabaseSystem::ClearAllDatabases() {
124 open_connections_->WaitForAllDatabasesToClose(); 137 open_connections_->WaitForAllDatabasesToClose();
125 db_thread_proxy_->PostTask(FROM_HERE, 138 db_thread_proxy_->PostTask(FROM_HERE,
126 NewRunnableMethod(this, &SimpleDatabaseSystem::ResetTracker)); 139 NewRunnableMethod(this, &SimpleDatabaseSystem::ResetTracker));
127 } 140 }
128 141
129 void SimpleDatabaseSystem::SetDatabaseQuota(int64 quota) { 142 void SimpleDatabaseSystem::SetDatabaseQuota(int64 quota) {
130 if (!db_thread_proxy_->BelongsToCurrentThread()) { 143 if (!db_thread_proxy_->BelongsToCurrentThread()) {
131 db_thread_proxy_->PostTask(FROM_HERE, 144 db_thread_proxy_->PostTask(FROM_HERE,
132 NewRunnableMethod(this, &SimpleDatabaseSystem::SetDatabaseQuota, 145 NewRunnableMethod(this, &SimpleDatabaseSystem::SetDatabaseQuota,
133 quota)); 146 quota));
134 return; 147 return;
135 } 148 }
136 db_tracker_->SetDefaultQuota(quota); 149 quota_per_origin_ = quota;
137 } 150 }
138 151
139 void SimpleDatabaseSystem::DatabaseOpened(const string16& origin_identifier, 152 void SimpleDatabaseSystem::DatabaseOpened(const string16& origin_identifier,
140 const string16& database_name, 153 const string16& database_name,
141 const string16& description, 154 const string16& description,
142 int64 estimated_size) { 155 int64 estimated_size) {
143 DCHECK(db_thread_proxy_->BelongsToCurrentThread()); 156 DCHECK(db_thread_proxy_->BelongsToCurrentThread());
144 int64 database_size = 0; 157 int64 database_size = 0;
145 int64 space_available = 0; 158 int64 space_available_not_used = 0;
146 db_tracker_->DatabaseOpened( 159 db_tracker_->DatabaseOpened(
147 origin_identifier, database_name, description, 160 origin_identifier, database_name, description,
148 estimated_size, &database_size, &space_available); 161 estimated_size, &database_size, &space_available_not_used);
149 OnDatabaseSizeChanged(origin_identifier, database_name, 162 OnDatabaseSizeChanged(origin_identifier, database_name,
150 database_size, space_available); 163 database_size, 0);
151 } 164 }
152 165
153 void SimpleDatabaseSystem::DatabaseModified(const string16& origin_identifier, 166 void SimpleDatabaseSystem::DatabaseModified(const string16& origin_identifier,
154 const string16& database_name) { 167 const string16& database_name) {
155 DCHECK(db_thread_proxy_->BelongsToCurrentThread()); 168 DCHECK(db_thread_proxy_->BelongsToCurrentThread());
156 db_tracker_->DatabaseModified(origin_identifier, database_name); 169 db_tracker_->DatabaseModified(origin_identifier, database_name);
157 } 170 }
158 171
159 void SimpleDatabaseSystem::DatabaseClosed(const string16& origin_identifier, 172 void SimpleDatabaseSystem::DatabaseClosed(const string16& origin_identifier,
160 const string16& database_name) { 173 const string16& database_name) {
161 DCHECK(db_thread_proxy_->BelongsToCurrentThread()); 174 DCHECK(db_thread_proxy_->BelongsToCurrentThread());
162 db_tracker_->DatabaseClosed(origin_identifier, database_name); 175 db_tracker_->DatabaseClosed(origin_identifier, database_name);
163 open_connections_->RemoveOpenConnection(origin_identifier, database_name); 176 open_connections_->RemoveOpenConnection(origin_identifier, database_name);
164 } 177 }
165 178
166 void SimpleDatabaseSystem::OnDatabaseSizeChanged( 179 void SimpleDatabaseSystem::OnDatabaseSizeChanged(
167 const string16& origin_identifier, 180 const string16& origin_identifier,
168 const string16& database_name, 181 const string16& database_name,
169 int64 database_size, 182 int64 database_size,
170 int64 space_available) { 183 int64 space_available_not_used) {
171 DCHECK(db_thread_proxy_->BelongsToCurrentThread()); 184 DCHECK(db_thread_proxy_->BelongsToCurrentThread());
172 // We intentionally call into webkit on our background db_thread_ 185 // We intentionally call into webkit on our background db_thread_
173 // to better emulate what happens in chrome where this method is 186 // to better emulate what happens in chrome where this method is
174 // invoked on the background ipc thread. 187 // invoked on the background ipc thread.
175 WebKit::WebDatabase::updateDatabaseSize( 188 WebKit::WebDatabase::updateDatabaseSize(
176 origin_identifier, database_name, database_size, space_available); 189 origin_identifier, database_name, database_size);
177 } 190 }
178 191
179 void SimpleDatabaseSystem::OnDatabaseScheduledForDeletion( 192 void SimpleDatabaseSystem::OnDatabaseScheduledForDeletion(
180 const string16& origin_identifier, 193 const string16& origin_identifier,
181 const string16& database_name) { 194 const string16& database_name) {
182 DCHECK(db_thread_proxy_->BelongsToCurrentThread()); 195 DCHECK(db_thread_proxy_->BelongsToCurrentThread());
183 // We intentionally call into webkit on our background db_thread_ 196 // We intentionally call into webkit on our background db_thread_
184 // to better emulate what happens in chrome where this method is 197 // to better emulate what happens in chrome where this method is
185 // invoked on the background ipc thread. 198 // invoked on the background ipc thread.
186 WebKit::WebDatabase::closeDatabaseImmediately( 199 WebKit::WebDatabase::closeDatabaseImmediately(
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 } 244 }
232 245
233 void SimpleDatabaseSystem::VfsGetFileSize( 246 void SimpleDatabaseSystem::VfsGetFileSize(
234 const string16& vfs_file_name, 247 const string16& vfs_file_name,
235 int64* result, base::WaitableEvent* done_event) { 248 int64* result, base::WaitableEvent* done_event) {
236 DCHECK(db_thread_proxy_->BelongsToCurrentThread()); 249 DCHECK(db_thread_proxy_->BelongsToCurrentThread());
237 *result = VfsBackend::GetFileSize(GetFullFilePathForVfsFile(vfs_file_name)); 250 *result = VfsBackend::GetFileSize(GetFullFilePathForVfsFile(vfs_file_name));
238 done_event->Signal(); 251 done_event->Signal();
239 } 252 }
240 253
254 void SimpleDatabaseSystem::VfsGetSpaceAvailable(
255 const string16& origin_identifier,
256 int64* result, base::WaitableEvent* done_event) {
257 DCHECK(db_thread_proxy_->BelongsToCurrentThread());
258 // This method isn't actually part of the "vfs" interface, but it is
259 // used from within webcore and handled here in the same fashion.
260 OriginInfo info;
261 if (db_tracker_->GetOriginInfo(origin_identifier, &info)) {
262 int64 space_available = quota_per_origin_ - info.TotalSize();
263 *result = space_available < 0 ? 0 : space_available;
264 } else {
265 NOTREACHED();
266 *result = 0;
267 }
268 done_event->Signal();
darin (slow to review) 2011/05/24 04:56:11 are you sure it is safe to delete done_event befor
michaeln 2011/05/24 05:10:54 right... i remember that too... i'll check, the ot
269 }
270
241 FilePath SimpleDatabaseSystem::GetFullFilePathForVfsFile( 271 FilePath SimpleDatabaseSystem::GetFullFilePathForVfsFile(
242 const string16& vfs_file_name) { 272 const string16& vfs_file_name) {
243 DCHECK(db_thread_proxy_->BelongsToCurrentThread()); 273 DCHECK(db_thread_proxy_->BelongsToCurrentThread());
244 if (vfs_file_name.empty()) // temp file, used for vacuuming 274 if (vfs_file_name.empty()) // temp file, used for vacuuming
245 return FilePath(); 275 return FilePath();
246 return DatabaseUtil::GetFullFilePathForVfsFile( 276 return DatabaseUtil::GetFullFilePathForVfsFile(
247 db_tracker_.get(), vfs_file_name); 277 db_tracker_.get(), vfs_file_name);
248 } 278 }
249 279
250 void SimpleDatabaseSystem::ResetTracker() { 280 void SimpleDatabaseSystem::ResetTracker() {
251 DCHECK(db_thread_proxy_->BelongsToCurrentThread()); 281 DCHECK(db_thread_proxy_->BelongsToCurrentThread());
252 db_tracker_->CloseTrackerDatabaseAndClearCaches(); 282 db_tracker_->CloseTrackerDatabaseAndClearCaches();
253 file_util::Delete(db_tracker_->DatabaseDirectory(), true); 283 file_util::Delete(db_tracker_->DatabaseDirectory(), true);
254 } 284 }
255 285
256 void SimpleDatabaseSystem::ThreadCleanup(base::WaitableEvent* done_event) { 286 void SimpleDatabaseSystem::ThreadCleanup(base::WaitableEvent* done_event) {
257 ResetTracker(); 287 ResetTracker();
258 db_tracker_->RemoveObserver(this); 288 db_tracker_->RemoveObserver(this);
259 db_tracker_ = NULL; 289 db_tracker_ = NULL;
260 done_event->Signal(); 290 done_event->Signal();
261 } 291 }
262 292
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698