void IDBObjectStore::deleteIndex(const String& name, ExceptionCode& ec) { LOG(StorageAPI, "IDBObjectStore::deleteIndex"); if (!m_transaction->isVersionChange() || m_deleted) { ec = IDBDatabaseException::InvalidStateError; return; } if (!m_transaction->isActive()) { ec = IDBDatabaseException::TransactionInactiveError; return; } int64_t indexId = findIndexId(name); if (indexId == IDBIndexMetadata::InvalidId) { ec = IDBDatabaseException::NotFoundError; return; } backendDB()->deleteIndex(m_transaction->id(), id(), indexId); m_metadata.indexes.remove(indexId); IDBIndexMap::iterator it = m_indexMap.find(name); if (it != m_indexMap.end()) { it->value->markDeleted(); m_indexMap.remove(name); } }
void IDBObjectStore::deleteIndex(const String& name, ExceptionState& exceptionState) { IDB_TRACE("IDBObjectStore::deleteIndex"); if (!m_transaction->isVersionChange()) { exceptionState.throwDOMException(InvalidStateError, IDBDatabase::notVersionChangeTransactionErrorMessage); return; } if (isDeleted()) { exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectStoreDeletedErrorMessage); return; } if (m_transaction->isFinished() || m_transaction->isFinishing()) { exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionFinishedErrorMessage); return; } if (!m_transaction->isActive()) { exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionInactiveErrorMessage); return; } int64_t indexId = findIndexId(name); if (indexId == IDBIndexMetadata::InvalidId) { exceptionState.throwDOMException(NotFoundError, IDBDatabase::noSuchIndexErrorMessage); return; } if (!backendDB()) { exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databaseClosedErrorMessage); return; } backendDB()->deleteIndex(m_transaction->id(), id(), indexId); m_metadata.indexes.remove(indexId); m_transaction->db()->indexDeleted(id(), indexId); IDBIndexMap::iterator it = m_indexMap.find(name); if (it != m_indexMap.end()) { it->value->markDeleted(); m_indexMap.remove(name); } }
IDBIndex* IDBObjectStore::index(const String& name, ExceptionState& exceptionState) { IDB_TRACE("IDBObjectStore::index"); if (isDeleted()) { exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectStoreDeletedErrorMessage); return nullptr; } if (m_transaction->isFinished() || m_transaction->isFinishing()) { exceptionState.throwDOMException(InvalidStateError, IDBDatabase::transactionFinishedErrorMessage); return nullptr; } IDBIndexMap::iterator it = m_indexMap.find(name); if (it != m_indexMap.end()) return it->value; int64_t indexId = findIndexId(name); if (indexId == IDBIndexMetadata::InvalidId) { exceptionState.throwDOMException(NotFoundError, IDBDatabase::noSuchIndexErrorMessage); return nullptr; } const IDBIndexMetadata* indexMetadata(nullptr); for (const auto& it : m_metadata.indexes) { if (it.value.name == name) { indexMetadata = &it.value; break; } } ASSERT(indexMetadata); ASSERT(indexMetadata->id != IDBIndexMetadata::InvalidId); IDBIndex* index = IDBIndex::create(*indexMetadata, this, m_transaction.get()); m_indexMap.set(name, index); return index; }
PassRefPtr<IDBIndex> IDBObjectStore::index(const String& name, ExceptionCode& ec) { LOG(StorageAPI, "IDBObjectStore::index"); if (m_deleted) { ec = IDBDatabaseException::InvalidStateError; return 0; } if (m_transaction->isFinished()) { ec = IDBDatabaseException::InvalidStateError; return 0; } IDBIndexMap::iterator it = m_indexMap.find(name); if (it != m_indexMap.end()) return it->value; int64_t indexId = findIndexId(name); if (indexId == IDBIndexMetadata::InvalidId) { ec = IDBDatabaseException::NotFoundError; return 0; } const IDBIndexMetadata* indexMetadata(0); for (IDBObjectStoreMetadata::IndexMap::const_iterator it = m_metadata.indexes.begin(); it != m_metadata.indexes.end(); ++it) { if (it->value.name == name) { indexMetadata = &it->value; break; } } ASSERT(indexMetadata); ASSERT(indexMetadata->id != IDBIndexMetadata::InvalidId); RefPtr<IDBIndex> index = IDBIndex::create(*indexMetadata, this, m_transaction.get()); m_indexMap.set(name, index); return index.release(); }