OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 } | 163 } |
164 if (!BackendDB()) { | 164 if (!BackendDB()) { |
165 exception_state.ThrowDOMException(kInvalidStateError, | 165 exception_state.ThrowDOMException(kInvalidStateError, |
166 IDBDatabase::kDatabaseClosedErrorMessage); | 166 IDBDatabase::kDatabaseClosedErrorMessage); |
167 return nullptr; | 167 return nullptr; |
168 } | 168 } |
169 | 169 |
170 IDBRequest* request = IDBRequest::Create(script_state, IDBAny::Create(this), | 170 IDBRequest* request = IDBRequest::Create(script_state, IDBAny::Create(this), |
171 transaction_.Get()); | 171 transaction_.Get()); |
172 BackendDB()->Get(transaction_->Id(), Id(), IDBIndexMetadata::kInvalidId, | 172 BackendDB()->Get(transaction_->Id(), Id(), IDBIndexMetadata::kInvalidId, |
173 key_range, false /* keyOnly */, | 173 key_range, /*key_only=*/false, |
174 request->CreateWebCallbacks().release()); | 174 request->CreateWebCallbacks().release()); |
175 return request; | 175 return request; |
176 } | 176 } |
177 | 177 |
178 IDBRequest* IDBObjectStore::getKey(ScriptState* script_state, | 178 IDBRequest* IDBObjectStore::getKey(ScriptState* script_state, |
179 const ScriptValue& key, | 179 const ScriptValue& key, |
180 ExceptionState& exception_state) { | 180 ExceptionState& exception_state) { |
181 IDB_TRACE("IDBObjectStore::getKey"); | 181 IDB_TRACE("IDBObjectStore::getKey"); |
182 if (IsDeleted()) { | 182 if (IsDeleted()) { |
183 exception_state.ThrowDOMException( | 183 exception_state.ThrowDOMException( |
(...skipping 23 matching lines...) Expand all Loading... |
207 } | 207 } |
208 if (!BackendDB()) { | 208 if (!BackendDB()) { |
209 exception_state.ThrowDOMException(kInvalidStateError, | 209 exception_state.ThrowDOMException(kInvalidStateError, |
210 IDBDatabase::kDatabaseClosedErrorMessage); | 210 IDBDatabase::kDatabaseClosedErrorMessage); |
211 return nullptr; | 211 return nullptr; |
212 } | 212 } |
213 | 213 |
214 IDBRequest* request = IDBRequest::Create(script_state, IDBAny::Create(this), | 214 IDBRequest* request = IDBRequest::Create(script_state, IDBAny::Create(this), |
215 transaction_.Get()); | 215 transaction_.Get()); |
216 BackendDB()->Get(transaction_->Id(), Id(), IDBIndexMetadata::kInvalidId, | 216 BackendDB()->Get(transaction_->Id(), Id(), IDBIndexMetadata::kInvalidId, |
217 key_range, true /* keyOnly */, | 217 key_range, /*key_only=*/true, |
218 request->CreateWebCallbacks().release()); | 218 request->CreateWebCallbacks().release()); |
219 return request; | 219 return request; |
220 } | 220 } |
221 | 221 |
222 IDBRequest* IDBObjectStore::getAll(ScriptState* script_state, | 222 IDBRequest* IDBObjectStore::getAll(ScriptState* script_state, |
223 const ScriptValue& key_range, | 223 const ScriptValue& key_range, |
224 ExceptionState& exception_state) { | 224 ExceptionState& exception_state) { |
225 return getAll(script_state, key_range, std::numeric_limits<uint32_t>::max(), | 225 return getAll(script_state, key_range, std::numeric_limits<uint32_t>::max(), |
226 exception_state); | 226 exception_state); |
227 } | 227 } |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
638 IDBRequest* request = IDBRequest::Create(script_state, IDBAny::Create(this), | 638 IDBRequest* request = IDBRequest::Create(script_state, IDBAny::Create(this), |
639 transaction_.Get()); | 639 transaction_.Get()); |
640 BackendDB()->Clear(transaction_->Id(), Id(), | 640 BackendDB()->Clear(transaction_->Id(), Id(), |
641 request->CreateWebCallbacks().release()); | 641 request->CreateWebCallbacks().release()); |
642 return request; | 642 return request; |
643 } | 643 } |
644 | 644 |
645 namespace { | 645 namespace { |
646 // This class creates the index keys for a given index by extracting | 646 // This class creates the index keys for a given index by extracting |
647 // them from the SerializedScriptValue, for all the existing values in | 647 // them from the SerializedScriptValue, for all the existing values in |
648 // the objectStore. It only needs to be kept alive by virtue of being | 648 // the object store. It only needs to be kept alive by virtue of being |
649 // a listener on an IDBRequest object, in the same way that JavaScript | 649 // a listener on an IDBRequest object, in the same way that JavaScript |
650 // cursor success handlers are kept alive. | 650 // cursor success handlers are kept alive. |
651 class IndexPopulator final : public EventListener { | 651 class IndexPopulator final : public EventListener { |
652 public: | 652 public: |
653 static IndexPopulator* Create(ScriptState* script_state, | 653 static IndexPopulator* Create(ScriptState* script_state, |
654 IDBDatabase* database, | 654 IDBDatabase* database, |
655 int64_t transaction_id, | 655 int64_t transaction_id, |
656 int64_t object_store_id, | 656 int64_t object_store_id, |
657 RefPtr<const IDBIndexMetadata> index_metadata) { | 657 RefPtr<const IDBIndexMetadata> index_metadata) { |
658 return new IndexPopulator(script_state, database, transaction_id, | 658 return new IndexPopulator(script_state, database, transaction_id, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 ScriptState::Scope scope(script_state_.Get()); | 700 ScriptState::Scope scope(script_state_.Get()); |
701 | 701 |
702 IDBAny* cursor_any = request->ResultAsAny(); | 702 IDBAny* cursor_any = request->ResultAsAny(); |
703 IDBCursorWithValue* cursor = nullptr; | 703 IDBCursorWithValue* cursor = nullptr; |
704 if (cursor_any->GetType() == IDBAny::kIDBCursorWithValueType) | 704 if (cursor_any->GetType() == IDBAny::kIDBCursorWithValueType) |
705 cursor = cursor_any->IdbCursorWithValue(); | 705 cursor = cursor_any->IdbCursorWithValue(); |
706 | 706 |
707 Vector<int64_t> index_ids; | 707 Vector<int64_t> index_ids; |
708 index_ids.push_back(IndexMetadata().id); | 708 index_ids.push_back(IndexMetadata().id); |
709 if (cursor && !cursor->IsDeleted()) { | 709 if (cursor && !cursor->IsDeleted()) { |
710 cursor->continueFunction(nullptr, nullptr, ASSERT_NO_EXCEPTION); | 710 cursor->Continue(nullptr, nullptr, ASSERT_NO_EXCEPTION); |
711 | 711 |
712 IDBKey* primary_key = cursor->IdbPrimaryKey(); | 712 IDBKey* primary_key = cursor->IdbPrimaryKey(); |
713 ScriptValue value = cursor->value(script_state_.Get()); | 713 ScriptValue value = cursor->value(script_state_.Get()); |
714 | 714 |
715 IndexKeys index_keys; | 715 IndexKeys index_keys; |
716 GenerateIndexKeysForValue(script_state_->GetIsolate(), IndexMetadata(), | 716 GenerateIndexKeysForValue(script_state_->GetIsolate(), IndexMetadata(), |
717 value, &index_keys); | 717 value, &index_keys); |
718 | 718 |
719 HeapVector<IndexKeys> index_keys_list; | 719 HeapVector<IndexKeys> index_keys_list; |
720 index_keys_list.push_back(index_keys); | 720 index_keys_list.push_back(index_keys); |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1053 | 1053 |
1054 for (auto& it : index_map_) { | 1054 for (auto& it : index_map_) { |
1055 IDBIndex* index = it.value; | 1055 IDBIndex* index = it.value; |
1056 index->MarkDeleted(); | 1056 index->MarkDeleted(); |
1057 } | 1057 } |
1058 } | 1058 } |
1059 | 1059 |
1060 void IDBObjectStore::ClearIndexCache() { | 1060 void IDBObjectStore::ClearIndexCache() { |
1061 DCHECK(!transaction_->IsActive() || (IsDeleted() && IsNewlyCreated())); | 1061 DCHECK(!transaction_->IsActive() || (IsDeleted() && IsNewlyCreated())); |
1062 | 1062 |
1063 // There is no harm in having clearIndexCache() happen multiple times for | |
1064 // the same object. We assert that it is called once to uncover potential | |
1065 // object store accounting bugs. | |
1066 #if DCHECK_IS_ON() | 1063 #if DCHECK_IS_ON() |
| 1064 // There is no harm in having ClearIndexCache() happen multiple times for |
| 1065 // the same object. We assert that it is called once to uncover potential |
| 1066 // object store accounting bugs. |
1067 DCHECK(!clear_index_cache_called_); | 1067 DCHECK(!clear_index_cache_called_); |
1068 clear_index_cache_called_ = true; | 1068 clear_index_cache_called_ = true; |
1069 #endif // DCHECK_IS_ON() | 1069 #endif // DCHECK_IS_ON() |
1070 | 1070 |
1071 index_map_.Clear(); | 1071 index_map_.Clear(); |
1072 } | 1072 } |
1073 | 1073 |
1074 void IDBObjectStore::RevertMetadata( | 1074 void IDBObjectStore::RevertMetadata( |
1075 RefPtr<IDBObjectStoreMetadata> old_metadata) { | 1075 RefPtr<IDBObjectStoreMetadata> old_metadata) { |
1076 DCHECK(transaction_->IsVersionChange()); | 1076 DCHECK(transaction_->IsVersionChange()); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1117 deleted_index.RevertMetadata(std::move(old_index_metadata)); | 1117 deleted_index.RevertMetadata(std::move(old_index_metadata)); |
1118 } | 1118 } |
1119 | 1119 |
1120 void IDBObjectStore::RenameIndex(int64_t index_id, const String& new_name) { | 1120 void IDBObjectStore::RenameIndex(int64_t index_id, const String& new_name) { |
1121 DCHECK(transaction_->IsVersionChange()); | 1121 DCHECK(transaction_->IsVersionChange()); |
1122 DCHECK(transaction_->IsActive()); | 1122 DCHECK(transaction_->IsActive()); |
1123 | 1123 |
1124 BackendDB()->RenameIndex(transaction_->Id(), Id(), index_id, new_name); | 1124 BackendDB()->RenameIndex(transaction_->Id(), Id(), index_id, new_name); |
1125 | 1125 |
1126 auto metadata_iterator = metadata_->indexes.Find(index_id); | 1126 auto metadata_iterator = metadata_->indexes.Find(index_id); |
1127 DCHECK_NE(metadata_iterator, metadata_->indexes.end()) << "Invalid indexId"; | 1127 DCHECK_NE(metadata_iterator, metadata_->indexes.end()) << "Invalid index_id"; |
1128 const String& old_name = metadata_iterator->value->name; | 1128 const String& old_name = metadata_iterator->value->name; |
1129 | 1129 |
1130 DCHECK(index_map_.Contains(old_name)) | 1130 DCHECK(index_map_.Contains(old_name)) |
1131 << "The index had to be accessed in order to be renamed."; | 1131 << "The index had to be accessed in order to be renamed."; |
1132 DCHECK(!index_map_.Contains(new_name)); | 1132 DCHECK(!index_map_.Contains(new_name)); |
1133 index_map_.Set(new_name, index_map_.Take(old_name)); | 1133 index_map_.Set(new_name, index_map_.Take(old_name)); |
1134 | 1134 |
1135 metadata_iterator->value->name = new_name; | 1135 metadata_iterator->value->name = new_name; |
1136 } | 1136 } |
1137 | 1137 |
1138 int64_t IDBObjectStore::FindIndexId(const String& name) const { | 1138 int64_t IDBObjectStore::FindIndexId(const String& name) const { |
1139 for (const auto& it : Metadata().indexes) { | 1139 for (const auto& it : Metadata().indexes) { |
1140 if (it.value->name == name) { | 1140 if (it.value->name == name) { |
1141 DCHECK_NE(it.key, IDBIndexMetadata::kInvalidId); | 1141 DCHECK_NE(it.key, IDBIndexMetadata::kInvalidId); |
1142 return it.key; | 1142 return it.key; |
1143 } | 1143 } |
1144 } | 1144 } |
1145 return IDBIndexMetadata::kInvalidId; | 1145 return IDBIndexMetadata::kInvalidId; |
1146 } | 1146 } |
1147 | 1147 |
1148 WebIDBDatabase* IDBObjectStore::BackendDB() const { | 1148 WebIDBDatabase* IDBObjectStore::BackendDB() const { |
1149 return transaction_->BackendDB(); | 1149 return transaction_->BackendDB(); |
1150 } | 1150 } |
1151 | 1151 |
1152 } // namespace blink | 1152 } // namespace blink |
OLD | NEW |