void MemoryBackingStoreTransaction::addExistingObjectStore(MemoryObjectStore& objectStore) { LOG(IndexedDB, "MemoryBackingStoreTransaction::addExistingObjectStore"); ASSERT(isWriting()); ASSERT(!m_objectStores.contains(&objectStore)); m_objectStores.add(&objectStore); objectStore.writeTransactionStarted(*this); m_originalKeyGenerators.add(&objectStore, objectStore.currentKeyGeneratorValue()); }
IDBError MemoryIDBBackingStore::generateKeyNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t& keyNumber) { LOG(IndexedDB, "MemoryIDBBackingStore::generateKeyNumber"); ASSERT(objectStoreIdentifier); ASSERT_UNUSED(transactionIdentifier, m_transactions.contains(transactionIdentifier)); ASSERT_UNUSED(transactionIdentifier, m_transactions.get(transactionIdentifier)->isWriting()); MemoryObjectStore* objectStore = m_objectStoresByIdentifier.get(objectStoreIdentifier); RELEASE_ASSERT(objectStore); keyNumber = objectStore->currentKeyGeneratorValue(); objectStore->setKeyGeneratorValue(keyNumber + 1); return IDBError(); }
IDBError MemoryIDBBackingStore::generateKeyNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t& keyNumber) { LOG(IndexedDB, "MemoryIDBBackingStore::generateKeyNumber"); ASSERT(objectStoreIdentifier); ASSERT_UNUSED(transactionIdentifier, m_transactions.contains(transactionIdentifier)); ASSERT_UNUSED(transactionIdentifier, m_transactions.get(transactionIdentifier)->isWriting()); MemoryObjectStore* objectStore = m_objectStoresByIdentifier.get(objectStoreIdentifier); RELEASE_ASSERT(objectStore); keyNumber = objectStore->currentKeyGeneratorValue(); if (keyNumber > maxGeneratedKeyValue) return { IDBDatabaseException::ConstraintError, "Cannot generate new key value over 2^53 for object store operation" }; objectStore->setKeyGeneratorValue(keyNumber + 1); return { }; }
IDBError MemoryIDBBackingStore::maybeUpdateKeyGeneratorNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, double newKeyNumber) { LOG(IndexedDB, "MemoryIDBBackingStore::maybeUpdateKeyGeneratorNumber"); ASSERT(objectStoreIdentifier); ASSERT_UNUSED(transactionIdentifier, m_transactions.contains(transactionIdentifier)); ASSERT_UNUSED(transactionIdentifier, m_transactions.get(transactionIdentifier)->isWriting()); MemoryObjectStore* objectStore = m_objectStoresByIdentifier.get(objectStoreIdentifier); RELEASE_ASSERT(objectStore); if (newKeyNumber < objectStore->currentKeyGeneratorValue()) return { }; uint64_t newKeyInteger(newKeyNumber); if (newKeyInteger <= uint64_t(newKeyNumber)) ++newKeyInteger; ASSERT(newKeyInteger > uint64_t(newKeyNumber)); objectStore->setKeyGeneratorValue(newKeyInteger); return { }; }