void IDBTransaction::deleteIndex(uint64_t objectStoreIdentifier, const String& indexName) { LOG(IndexedDB, "IDBTransaction::deleteIndex"); ASSERT(isVersionChange()); auto operation = createTransactionOperation(*this, &IDBTransaction::didDeleteIndexOnServer, &IDBTransaction::deleteIndexOnServer, objectStoreIdentifier, indexName); scheduleOperation(WTFMove(operation)); }
std::unique_ptr<IDBIndex> IDBTransaction::createIndex(IDBObjectStore& objectStore, const IDBIndexInfo& info) { LOG(IndexedDB, "IDBTransaction::createIndex"); ASSERT(isVersionChange()); auto operation = createTransactionOperation(*this, &IDBTransaction::didCreateIndexOnServer, &IDBTransaction::createIndexOnServer, info); scheduleOperation(WTFMove(operation)); return std::make_unique<IDBIndex>(info, objectStore); }
void IDBTransaction::iterateCursor(IDBCursor& cursor, const IDBKeyData& key, unsigned long count) { LOG(IndexedDB, "IDBTransaction::iterateCursor"); ASSERT(isActive()); ASSERT(cursor.request()); addRequest(*cursor.request()); auto operation = createTransactionOperation(*this, *cursor.request(), &IDBTransaction::didIterateCursorOnServer, &IDBTransaction::iterateCursorOnServer, key, count); scheduleOperation(WTFMove(operation)); }
void IDBTransaction::deleteObjectStore(const String& objectStoreName) { LOG(IndexedDB, "IDBTransaction::deleteObjectStore"); ASSERT(isVersionChange()); if (auto objectStore = m_referencedObjectStores.take(objectStoreName)) objectStore->markAsDeleted(); auto operation = createTransactionOperation(*this, &IDBTransaction::didDeleteObjectStoreOnServer, &IDBTransaction::deleteObjectStoreOnServer, objectStoreName); scheduleOperation(WTFMove(operation)); }
Ref<IDBRequest> IDBTransaction::requestDeleteRecord(ScriptExecutionContext& context, IDBObjectStore& objectStore, const IDBKeyRangeData& range) { LOG(IndexedDB, "IDBTransaction::requestDeleteRecord"); ASSERT(isActive()); ASSERT(!range.isNull); Ref<IDBRequest> request = IDBRequest::create(context, objectStore, *this); addRequest(request.get()); scheduleOperation(createTransactionOperation(*this, request.get(), &IDBTransaction::didDeleteRecordOnServer, &IDBTransaction::deleteRecordOnServer, range)); return request; }
Ref<IDBRequest> IDBTransaction::doRequestOpenCursor(ScriptExecutionContext& context, Ref<IDBCursor>&& cursor) { ASSERT(isActive()); Ref<IDBRequest> request = IDBRequest::create(context, cursor.get(), *this); addRequest(request.get()); auto operation = createTransactionOperation(*this, request.get(), &IDBTransaction::didOpenCursorOnServer, &IDBTransaction::openCursorOnServer, cursor->info()); scheduleOperation(WTFMove(operation)); return request; }
void IDBTransaction::commit() { LOG(IndexedDB, "IDBTransaction::commit"); ASSERT(!isFinishedOrFinishing()); transitionedToFinishing(IndexedDB::TransactionState::Committing); m_database->willCommitTransaction(*this); auto operation = createTransactionOperation(*this, nullptr, &IDBTransaction::commitOnServer); scheduleOperation(WTFMove(operation)); }
Ref<IDBIndex> IDBTransaction::createIndex(IDBObjectStore& objectStore, const IDBIndexInfo& info) { LOG(IndexedDB, "IDBTransaction::createIndex"); ASSERT(isVersionChange()); Ref<IDBIndex> index = IDBIndex::create(info, objectStore); auto operation = createTransactionOperation(*this, &IDBTransaction::didCreateIndexOnServer, &IDBTransaction::createIndexOnServer, info); scheduleOperation(WTF::move(operation)); return WTF::move(index); }
Ref<IDBRequest> IDBTransaction::requestCount(ScriptExecutionContext& context, IDBIndex& index, const IDBKeyRangeData& range) { LOG(IndexedDB, "IDBTransaction::requestCount (IDBIndex)"); ASSERT(isActive()); ASSERT(!range.isNull); Ref<IDBRequest> request = IDBRequest::createCount(context, index, *this); addRequest(request.get()); scheduleOperation(createTransactionOperation(*this, request.get(), &IDBTransaction::didGetCountOnServer, &IDBTransaction::getCountOnServer, range)); return request; }
Ref<IDBObjectStore> IDBTransaction::createObjectStore(const IDBObjectStoreInfo& info) { LOG(IndexedDB, "IDBTransaction::createObjectStore"); ASSERT(isVersionChange()); Ref<IDBObjectStore> objectStore = IDBObjectStore::create(info, *this); m_referencedObjectStores.set(info.name(), &objectStore.get()); auto operation = createTransactionOperation(*this, &IDBTransaction::didCreateObjectStoreOnServer, &IDBTransaction::createObjectStoreOnServer, info); scheduleOperation(WTFMove(operation)); return objectStore; }
Ref<IDBRequest> IDBTransaction::requestClearObjectStore(ScriptExecutionContext& context, IDBObjectStore& objectStore) { LOG(IndexedDB, "IDBTransaction::requestClearObjectStore"); ASSERT(isActive()); Ref<IDBRequest> request = IDBRequest::create(context, objectStore, *this); addRequest(request.get()); uint64_t objectStoreIdentifier = objectStore.info().identifier(); auto operation = createTransactionOperation(*this, request.get(), &IDBTransaction::didClearObjectStoreOnServer, &IDBTransaction::clearObjectStoreOnServer, objectStoreIdentifier); scheduleOperation(WTFMove(operation)); return request; }
Ref<IDBRequest> IDBTransaction::requestIndexRecord(ScriptExecutionContext& context, IDBIndex& index, IndexedDB::IndexRecordType type, const IDBKeyRangeData&range) { LOG(IndexedDB, "IDBTransaction::requestGetValue"); ASSERT(isActive()); ASSERT(!range.isNull); Ref<IDBRequest> request = IDBRequest::createGet(context, index, type, *this); addRequest(request.get()); auto operation = createTransactionOperation(*this, request.get(), &IDBTransaction::didGetRecordOnServer, &IDBTransaction::getRecordOnServer, range); scheduleOperation(WTFMove(operation)); return request; }
Ref<IDBRequest> IDBTransaction::requestGetRecord(ScriptExecutionContext& context, IDBObjectStore& objectStore, const IDBKeyRangeData& keyRangeData) { LOG(IndexedDB, "IDBTransaction::requestGetRecord"); ASSERT(isActive()); ASSERT(!keyRangeData.isNull); Ref<IDBRequest> request = IDBRequest::create(context, objectStore, *this); addRequest(request.get()); auto operation = createTransactionOperation(*this, request.get(), &IDBTransaction::didGetRecordOnServer, &IDBTransaction::getRecordOnServer, keyRangeData); scheduleOperation(WTFMove(operation)); return request; }
Ref<IDBRequest> IDBTransaction::requestPutOrAdd(ScriptExecutionContext& context, IDBObjectStore& objectStore, IDBKey* key, SerializedScriptValue& value, IndexedDB::ObjectStoreOverwriteMode overwriteMode) { LOG(IndexedDB, "IDBTransaction::requestPutOrAdd"); ASSERT(isActive()); ASSERT(!isReadOnly()); ASSERT(objectStore.info().autoIncrement() || key); Ref<IDBRequest> request = IDBRequest::create(context, objectStore, *this); addRequest(request.get()); auto operation = createTransactionOperation(*this, request.get(), &IDBTransaction::didPutOrAddOnServer, &IDBTransaction::putOrAddOnServer, key, &value, overwriteMode); scheduleOperation(WTFMove(operation)); return request; }
void IDBTransaction::abort(ExceptionCode& ec) { LOG(IndexedDB, "IDBTransaction::abort"); if (isFinishedOrFinishing()) { ec = INVALID_STATE_ERR; return; } m_state = IndexedDB::TransactionState::Aborting; m_database->willAbortTransaction(*this); auto operation = createTransactionOperation(*this, nullptr, &IDBTransaction::abortOnServer); scheduleOperation(WTF::move(operation)); }
void IDBTransaction::abort(ExceptionCodeWithMessage& ec) { LOG(IndexedDB, "IDBTransaction::abort"); if (isFinishedOrFinishing()) { ec.code = IDBDatabaseException::InvalidStateError; ec.message = ASCIILiteral("Failed to execute 'abort' on 'IDBTransaction': The transaction is inactive or finished."); return; } m_state = IndexedDB::TransactionState::Aborting; m_database->willAbortTransaction(*this); if (isVersionChange()) { for (auto& objectStore : m_referencedObjectStores.values()) objectStore->rollbackInfoForVersionChangeAbort(); } m_abortQueue.swap(m_transactionOperationQueue); auto operation = createTransactionOperation(*this, nullptr, &IDBTransaction::abortOnServerAndCancelRequests); scheduleOperation(WTFMove(operation)); }