OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "content/browser/notifications/notification_database.h" | 5 #include "content/browser/notifications/notification_database.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 DLOG(ERROR) << "Unable to deserialize a notification's data."; | 94 DLOG(ERROR) << "Unable to deserialize a notification's data."; |
95 return NotificationDatabase::STATUS_ERROR_CORRUPTED; | 95 return NotificationDatabase::STATUS_ERROR_CORRUPTED; |
96 } | 96 } |
97 | 97 |
98 } // namespace | 98 } // namespace |
99 | 99 |
100 NotificationDatabase::NotificationDatabase(const base::FilePath& path) | 100 NotificationDatabase::NotificationDatabase(const base::FilePath& path) |
101 : path_(path) {} | 101 : path_(path) {} |
102 | 102 |
103 NotificationDatabase::~NotificationDatabase() { | 103 NotificationDatabase::~NotificationDatabase() { |
104 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 104 DCHECK(sequence_checker_.CalledOnValidSequence()); |
105 } | 105 } |
106 | 106 |
107 NotificationDatabase::Status NotificationDatabase::Open( | 107 NotificationDatabase::Status NotificationDatabase::Open( |
108 bool create_if_missing) { | 108 bool create_if_missing) { |
109 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 109 DCHECK(sequence_checker_.CalledOnValidSequence()); |
110 DCHECK_EQ(STATE_UNINITIALIZED, state_); | 110 DCHECK_EQ(STATE_UNINITIALIZED, state_); |
111 | 111 |
112 if (!create_if_missing) { | 112 if (!create_if_missing) { |
113 if (IsInMemoryDatabase() || !base::PathExists(path_) || | 113 if (IsInMemoryDatabase() || !base::PathExists(path_) || |
114 base::IsDirectoryEmpty(path_)) { | 114 base::IsDirectoryEmpty(path_)) { |
115 return NotificationDatabase::STATUS_ERROR_NOT_FOUND; | 115 return NotificationDatabase::STATUS_ERROR_NOT_FOUND; |
116 } | 116 } |
117 } | 117 } |
118 | 118 |
119 filter_policy_.reset(leveldb::NewBloomFilterPolicy(10)); | 119 filter_policy_.reset(leveldb::NewBloomFilterPolicy(10)); |
(...skipping 17 matching lines...) Expand all Loading... |
137 state_ = STATE_INITIALIZED; | 137 state_ = STATE_INITIALIZED; |
138 db_.reset(db); | 138 db_.reset(db); |
139 | 139 |
140 return ReadNextNotificationId(); | 140 return ReadNextNotificationId(); |
141 } | 141 } |
142 | 142 |
143 NotificationDatabase::Status NotificationDatabase::ReadNotificationData( | 143 NotificationDatabase::Status NotificationDatabase::ReadNotificationData( |
144 int64_t notification_id, | 144 int64_t notification_id, |
145 const GURL& origin, | 145 const GURL& origin, |
146 NotificationDatabaseData* notification_database_data) const { | 146 NotificationDatabaseData* notification_database_data) const { |
147 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 147 DCHECK(sequence_checker_.CalledOnValidSequence()); |
148 DCHECK_EQ(STATE_INITIALIZED, state_); | 148 DCHECK_EQ(STATE_INITIALIZED, state_); |
149 DCHECK_GE(notification_id, kFirstNotificationId); | 149 DCHECK_GE(notification_id, kFirstNotificationId); |
150 DCHECK(origin.is_valid()); | 150 DCHECK(origin.is_valid()); |
151 DCHECK(notification_database_data); | 151 DCHECK(notification_database_data); |
152 | 152 |
153 std::string key = CreateDataKey(origin, notification_id); | 153 std::string key = CreateDataKey(origin, notification_id); |
154 std::string serialized_data; | 154 std::string serialized_data; |
155 | 155 |
156 Status status = LevelDBStatusToStatus( | 156 Status status = LevelDBStatusToStatus( |
157 db_->Get(leveldb::ReadOptions(), key, &serialized_data)); | 157 db_->Get(leveldb::ReadOptions(), key, &serialized_data)); |
(...skipping 25 matching lines...) Expand all Loading... |
183 int64_t service_worker_registration_id, | 183 int64_t service_worker_registration_id, |
184 std::vector<NotificationDatabaseData>* notification_data_vector) const { | 184 std::vector<NotificationDatabaseData>* notification_data_vector) const { |
185 return ReadAllNotificationDataInternal(origin, service_worker_registration_id, | 185 return ReadAllNotificationDataInternal(origin, service_worker_registration_id, |
186 notification_data_vector); | 186 notification_data_vector); |
187 } | 187 } |
188 | 188 |
189 NotificationDatabase::Status NotificationDatabase::WriteNotificationData( | 189 NotificationDatabase::Status NotificationDatabase::WriteNotificationData( |
190 const GURL& origin, | 190 const GURL& origin, |
191 const NotificationDatabaseData& notification_database_data, | 191 const NotificationDatabaseData& notification_database_data, |
192 int64_t* notification_id) { | 192 int64_t* notification_id) { |
193 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 193 DCHECK(sequence_checker_.CalledOnValidSequence()); |
194 DCHECK_EQ(STATE_INITIALIZED, state_); | 194 DCHECK_EQ(STATE_INITIALIZED, state_); |
195 DCHECK(notification_id); | 195 DCHECK(notification_id); |
196 DCHECK(origin.is_valid()); | 196 DCHECK(origin.is_valid()); |
197 | 197 |
198 DCHECK_GE(next_notification_id_, kFirstNotificationId); | 198 DCHECK_GE(next_notification_id_, kFirstNotificationId); |
199 | 199 |
200 NotificationDatabaseData storage_data = notification_database_data; | 200 NotificationDatabaseData storage_data = notification_database_data; |
201 storage_data.notification_id = next_notification_id_; | 201 storage_data.notification_id = next_notification_id_; |
202 | 202 |
203 std::string serialized_data; | 203 std::string serialized_data; |
(...skipping 13 matching lines...) Expand all Loading... |
217 if (status != STATUS_OK) | 217 if (status != STATUS_OK) |
218 return status; | 218 return status; |
219 | 219 |
220 *notification_id = next_notification_id_++; | 220 *notification_id = next_notification_id_++; |
221 return STATUS_OK; | 221 return STATUS_OK; |
222 } | 222 } |
223 | 223 |
224 NotificationDatabase::Status NotificationDatabase::DeleteNotificationData( | 224 NotificationDatabase::Status NotificationDatabase::DeleteNotificationData( |
225 int64_t notification_id, | 225 int64_t notification_id, |
226 const GURL& origin) { | 226 const GURL& origin) { |
227 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 227 DCHECK(sequence_checker_.CalledOnValidSequence()); |
228 DCHECK_EQ(STATE_INITIALIZED, state_); | 228 DCHECK_EQ(STATE_INITIALIZED, state_); |
229 DCHECK_GE(notification_id, kFirstNotificationId); | 229 DCHECK_GE(notification_id, kFirstNotificationId); |
230 DCHECK(origin.is_valid()); | 230 DCHECK(origin.is_valid()); |
231 | 231 |
232 std::string key = CreateDataKey(origin, notification_id); | 232 std::string key = CreateDataKey(origin, notification_id); |
233 return LevelDBStatusToStatus(db_->Delete(leveldb::WriteOptions(), key)); | 233 return LevelDBStatusToStatus(db_->Delete(leveldb::WriteOptions(), key)); |
234 } | 234 } |
235 | 235 |
236 NotificationDatabase::Status | 236 NotificationDatabase::Status |
237 NotificationDatabase::DeleteAllNotificationDataForOrigin( | 237 NotificationDatabase::DeleteAllNotificationDataForOrigin( |
238 const GURL& origin, | 238 const GURL& origin, |
239 std::set<int64_t>* deleted_notification_set) { | 239 std::set<int64_t>* deleted_notification_set) { |
240 return DeleteAllNotificationDataInternal( | 240 return DeleteAllNotificationDataInternal( |
241 origin, kInvalidServiceWorkerRegistrationId, deleted_notification_set); | 241 origin, kInvalidServiceWorkerRegistrationId, deleted_notification_set); |
242 } | 242 } |
243 | 243 |
244 NotificationDatabase::Status | 244 NotificationDatabase::Status |
245 NotificationDatabase::DeleteAllNotificationDataForServiceWorkerRegistration( | 245 NotificationDatabase::DeleteAllNotificationDataForServiceWorkerRegistration( |
246 const GURL& origin, | 246 const GURL& origin, |
247 int64_t service_worker_registration_id, | 247 int64_t service_worker_registration_id, |
248 std::set<int64_t>* deleted_notification_set) { | 248 std::set<int64_t>* deleted_notification_set) { |
249 return DeleteAllNotificationDataInternal( | 249 return DeleteAllNotificationDataInternal( |
250 origin, service_worker_registration_id, deleted_notification_set); | 250 origin, service_worker_registration_id, deleted_notification_set); |
251 } | 251 } |
252 | 252 |
253 NotificationDatabase::Status NotificationDatabase::Destroy() { | 253 NotificationDatabase::Status NotificationDatabase::Destroy() { |
254 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 254 DCHECK(sequence_checker_.CalledOnValidSequence()); |
255 | 255 |
256 leveldb::Options options; | 256 leveldb::Options options; |
257 if (IsInMemoryDatabase()) { | 257 if (IsInMemoryDatabase()) { |
258 if (!env_) | 258 if (!env_) |
259 return STATUS_OK; // The database has not been initialized. | 259 return STATUS_OK; // The database has not been initialized. |
260 | 260 |
261 options.env = env_.get(); | 261 options.env = env_.get(); |
262 } | 262 } |
263 | 263 |
264 state_ = STATE_DISABLED; | 264 state_ = STATE_DISABLED; |
(...skipping 22 matching lines...) Expand all Loading... |
287 } | 287 } |
288 | 288 |
289 return STATUS_OK; | 289 return STATUS_OK; |
290 } | 290 } |
291 | 291 |
292 NotificationDatabase::Status | 292 NotificationDatabase::Status |
293 NotificationDatabase::ReadAllNotificationDataInternal( | 293 NotificationDatabase::ReadAllNotificationDataInternal( |
294 const GURL& origin, | 294 const GURL& origin, |
295 int64_t service_worker_registration_id, | 295 int64_t service_worker_registration_id, |
296 std::vector<NotificationDatabaseData>* notification_data_vector) const { | 296 std::vector<NotificationDatabaseData>* notification_data_vector) const { |
297 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 297 DCHECK(sequence_checker_.CalledOnValidSequence()); |
298 DCHECK(notification_data_vector); | 298 DCHECK(notification_data_vector); |
299 | 299 |
300 const std::string prefix = CreateDataPrefix(origin); | 300 const std::string prefix = CreateDataPrefix(origin); |
301 | 301 |
302 leveldb::Slice prefix_slice(prefix); | 302 leveldb::Slice prefix_slice(prefix); |
303 | 303 |
304 NotificationDatabaseData notification_database_data; | 304 NotificationDatabaseData notification_database_data; |
305 std::unique_ptr<leveldb::Iterator> iter( | 305 std::unique_ptr<leveldb::Iterator> iter( |
306 db_->NewIterator(leveldb::ReadOptions())); | 306 db_->NewIterator(leveldb::ReadOptions())); |
307 for (iter->Seek(prefix_slice); iter->Valid(); iter->Next()) { | 307 for (iter->Seek(prefix_slice); iter->Valid(); iter->Next()) { |
(...skipping 15 matching lines...) Expand all Loading... |
323 } | 323 } |
324 | 324 |
325 return LevelDBStatusToStatus(iter->status()); | 325 return LevelDBStatusToStatus(iter->status()); |
326 } | 326 } |
327 | 327 |
328 NotificationDatabase::Status | 328 NotificationDatabase::Status |
329 NotificationDatabase::DeleteAllNotificationDataInternal( | 329 NotificationDatabase::DeleteAllNotificationDataInternal( |
330 const GURL& origin, | 330 const GURL& origin, |
331 int64_t service_worker_registration_id, | 331 int64_t service_worker_registration_id, |
332 std::set<int64_t>* deleted_notification_set) { | 332 std::set<int64_t>* deleted_notification_set) { |
333 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 333 DCHECK(sequence_checker_.CalledOnValidSequence()); |
334 DCHECK(deleted_notification_set); | 334 DCHECK(deleted_notification_set); |
335 DCHECK(origin.is_valid()); | 335 DCHECK(origin.is_valid()); |
336 | 336 |
337 const std::string prefix = CreateDataPrefix(origin); | 337 const std::string prefix = CreateDataPrefix(origin); |
338 | 338 |
339 leveldb::Slice prefix_slice(prefix); | 339 leveldb::Slice prefix_slice(prefix); |
340 leveldb::WriteBatch batch; | 340 leveldb::WriteBatch batch; |
341 | 341 |
342 NotificationDatabaseData notification_database_data; | 342 NotificationDatabaseData notification_database_data; |
343 std::unique_ptr<leveldb::Iterator> iter( | 343 std::unique_ptr<leveldb::Iterator> iter( |
(...skipping 27 matching lines...) Expand all Loading... |
371 batch.Delete(iter->key()); | 371 batch.Delete(iter->key()); |
372 } | 372 } |
373 | 373 |
374 if (deleted_notification_set->empty()) | 374 if (deleted_notification_set->empty()) |
375 return STATUS_OK; | 375 return STATUS_OK; |
376 | 376 |
377 return LevelDBStatusToStatus(db_->Write(leveldb::WriteOptions(), &batch)); | 377 return LevelDBStatusToStatus(db_->Write(leveldb::WriteOptions(), &batch)); |
378 } | 378 } |
379 | 379 |
380 } // namespace content | 380 } // namespace content |
OLD | NEW |