| Index: content/browser/notifications/notification_database.cc
|
| diff --git a/content/browser/notifications/notification_database.cc b/content/browser/notifications/notification_database.cc
|
| index e7ac09b3f0ac78d7acb13e237c4a2ed43616317a..6e5d0a238e99865a3748516688fea39f2cbde5ec 100644
|
| --- a/content/browser/notifications/notification_database.cc
|
| +++ b/content/browser/notifications/notification_database.cc
|
| @@ -29,6 +29,10 @@
|
| // value: String containing the NotificationDatabaseDataProto protocol buffer
|
| // in serialized form.
|
| //
|
| +// key: "ASSOC:" <notification id>
|
| +// value: String containing the associated persistent notification id as an
|
| +// int64_t in textual representation.
|
| +//
|
| // key: "NEXT_NOTIFICATION_ID"
|
| // value: Decimal string which fits into an int64_t.
|
|
|
| @@ -38,6 +42,7 @@ namespace {
|
| // Keys of the fields defined in the database.
|
| const char kNextNotificationIdKey[] = "NEXT_NOTIFICATION_ID";
|
| const char kDataKeyPrefix[] = "DATA:";
|
| +const char kAssociatedKeyPrefix[] = "ASSOC:";
|
|
|
| // Separates the components of compound keys.
|
| const char kKeySeparator = '\x00';
|
| @@ -75,9 +80,18 @@ std::string CreateDataPrefix(const GURL& origin) {
|
| }
|
|
|
| // Creates the compound data key in which notification data is stored.
|
| -std::string CreateDataKey(const GURL& origin, int64_t notification_id) {
|
| +std::string CreateDataKey(const GURL& origin,
|
| + int64_t persistent_notification_id) {
|
| DCHECK(origin.is_valid());
|
| - return CreateDataPrefix(origin) + base::Int64ToString(notification_id);
|
| + return CreateDataPrefix(origin) +
|
| + base::Int64ToString(persistent_notification_id);
|
| +}
|
| +
|
| +// Creates the compound key for mapping the given |notification_id| to the
|
| +// latest persistent notification id in the database.
|
| +std::string CreateAssociatedKey(const std::string& notification_id) {
|
| + return base::StringPrintf("%s%s", kAssociatedKeyPrefix,
|
| + notification_id.c_str());
|
| }
|
|
|
| // Deserializes data in |serialized_data| to |notification_database_data|.
|
| @@ -141,16 +155,16 @@ NotificationDatabase::Status NotificationDatabase::Open(
|
| }
|
|
|
| NotificationDatabase::Status NotificationDatabase::ReadNotificationData(
|
| - int64_t notification_id,
|
| + int64_t persistent_notification_id,
|
| const GURL& origin,
|
| NotificationDatabaseData* notification_database_data) const {
|
| DCHECK(sequence_checker_.CalledOnValidSequence());
|
| DCHECK_EQ(STATE_INITIALIZED, state_);
|
| - DCHECK_GE(notification_id, kFirstNotificationId);
|
| + DCHECK_GE(persistent_notification_id, kFirstNotificationId);
|
| DCHECK(origin.is_valid());
|
| DCHECK(notification_database_data);
|
|
|
| - std::string key = CreateDataKey(origin, notification_id);
|
| + std::string key = CreateDataKey(origin, persistent_notification_id);
|
| std::string serialized_data;
|
|
|
| Status status = LevelDBStatusToStatus(
|
| @@ -189,10 +203,10 @@ NotificationDatabase::ReadAllNotificationDataForServiceWorkerRegistration(
|
| NotificationDatabase::Status NotificationDatabase::WriteNotificationData(
|
| const GURL& origin,
|
| const NotificationDatabaseData& notification_database_data,
|
| - int64_t* notification_id) {
|
| + int64_t* persistent_notification_id) {
|
| DCHECK(sequence_checker_.CalledOnValidSequence());
|
| DCHECK_EQ(STATE_INITIALIZED, state_);
|
| - DCHECK(notification_id);
|
| + DCHECK(persistent_notification_id);
|
| DCHECK(origin.is_valid());
|
|
|
| DCHECK_GE(next_notification_id_, kFirstNotificationId);
|
| @@ -217,19 +231,19 @@ NotificationDatabase::Status NotificationDatabase::WriteNotificationData(
|
| if (status != STATUS_OK)
|
| return status;
|
|
|
| - *notification_id = next_notification_id_++;
|
| + *persistent_notification_id = next_notification_id_++;
|
| return STATUS_OK;
|
| }
|
|
|
| NotificationDatabase::Status NotificationDatabase::DeleteNotificationData(
|
| - int64_t notification_id,
|
| + int64_t persistent_notification_id,
|
| const GURL& origin) {
|
| DCHECK(sequence_checker_.CalledOnValidSequence());
|
| DCHECK_EQ(STATE_INITIALIZED, state_);
|
| - DCHECK_GE(notification_id, kFirstNotificationId);
|
| + DCHECK_GE(persistent_notification_id, kFirstNotificationId);
|
| DCHECK(origin.is_valid());
|
|
|
| - std::string key = CreateDataKey(origin, notification_id);
|
| + std::string key = CreateDataKey(origin, persistent_notification_id);
|
| return LevelDBStatusToStatus(db_->Delete(leveldb::WriteOptions(), key));
|
| }
|
|
|
| @@ -253,6 +267,52 @@ NotificationDatabase::DeleteAllNotificationDataForServiceWorkerRegistration(
|
| deleted_notification_set);
|
| }
|
|
|
| +NotificationDatabase::Status NotificationDatabase::StoreIdAssociation(
|
| + const std::string& notification_id,
|
| + int64_t persistent_notification_id) {
|
| + DCHECK(sequence_checker_.CalledOnValidSequence());
|
| +
|
| + std::string key = CreateAssociatedKey(notification_id);
|
| + std::string serialized_persistent_notification_id =
|
| + base::Int64ToString(persistent_notification_id);
|
| +
|
| + Status status = LevelDBStatusToStatus(db_->Put(
|
| + leveldb::WriteOptions(), key, serialized_persistent_notification_id));
|
| +
|
| + return status;
|
| +}
|
| +
|
| +NotificationDatabase::Status NotificationDatabase::ReadIdAssociation(
|
| + const std::string& notification_id,
|
| + int64_t* persistent_notification_id) {
|
| + DCHECK(sequence_checker_.CalledOnValidSequence());
|
| +
|
| + std::string key = CreateAssociatedKey(notification_id);
|
| + std::string serialized_persistent_notification_id;
|
| +
|
| + Status status = LevelDBStatusToStatus(db_->Get(
|
| + leveldb::ReadOptions(), key, &serialized_persistent_notification_id));
|
| +
|
| + if (status != STATUS_OK)
|
| + return status;
|
| +
|
| + if (!base::StringToInt64(serialized_persistent_notification_id,
|
| + persistent_notification_id)) {
|
| + return STATUS_ERROR_CORRUPTED;
|
| + }
|
| +
|
| + return status;
|
| +}
|
| +
|
| +NotificationDatabase::Status NotificationDatabase::DeleteIdAssociation(
|
| + const std::string& notification_id) {
|
| + DCHECK(sequence_checker_.CalledOnValidSequence());
|
| +
|
| + std::string key = CreateAssociatedKey(notification_id);
|
| +
|
| + return LevelDBStatusToStatus(db_->Delete(leveldb::WriteOptions(), key));
|
| +}
|
| +
|
| NotificationDatabase::Status NotificationDatabase::Destroy() {
|
| DCHECK(sequence_checker_.CalledOnValidSequence());
|
|
|
| @@ -375,13 +435,13 @@ NotificationDatabase::DeleteAllNotificationDataInternal(
|
| leveldb::Slice notification_id_slice = iter->key();
|
| notification_id_slice.remove_prefix(prefix_slice.size());
|
|
|
| - int64_t notification_id = 0;
|
| + int64_t persistent_notification_id = 0;
|
| if (!base::StringToInt64(notification_id_slice.ToString(),
|
| - ¬ification_id)) {
|
| + &persistent_notification_id)) {
|
| return STATUS_ERROR_CORRUPTED;
|
| }
|
|
|
| - deleted_notification_set->insert(notification_id);
|
| + deleted_notification_set->insert(persistent_notification_id);
|
| batch.Delete(iter->key());
|
| }
|
|
|
|
|