void IDBIndexBackendImpl::openCursorInternal(ScriptExecutionContext*, PassRefPtr<IDBIndexBackendImpl> index, PassRefPtr<IDBKeyRange> range, unsigned short untypedDirection, IDBCursorBackendInterface::CursorType cursorType, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBTransactionBackendInterface> transaction) { IDB_TRACE("IDBIndexBackendImpl::openCursorInternal"); IDBCursor::Direction direction = static_cast<IDBCursor::Direction>(untypedDirection); RefPtr<IDBBackingStore::Cursor> backingStoreCursor; switch (cursorType) { case IDBCursorBackendInterface::IndexKeyCursor: backingStoreCursor = index->backingStore()->openIndexKeyCursor(index->databaseId(), index->m_objectStoreBackend->id(), index->id(), range.get(), direction); break; case IDBCursorBackendInterface::IndexCursor: backingStoreCursor = index->backingStore()->openIndexCursor(index->databaseId(), index->m_objectStoreBackend->id(), index->id(), range.get(), direction); break; case IDBCursorBackendInterface::ObjectStoreCursor: case IDBCursorBackendInterface::InvalidCursorType: ASSERT_NOT_REACHED(); break; } if (!backingStoreCursor) { callbacks->onSuccess(SerializedScriptValue::nullValue()); return; } RefPtr<IDBCursorBackendInterface> cursor = IDBCursorBackendImpl::create(backingStoreCursor.get(), direction, cursorType, transaction.get(), index->m_objectStoreBackend); callbacks->onSuccess(cursor.release()); }
void IDBIndexBackendImpl::getInternal(ScriptExecutionContext*, PassRefPtr<IDBIndexBackendImpl> index, PassRefPtr<IDBKeyRange> keyRange, PassRefPtr<IDBCallbacks> callbacks) { IDB_TRACE("IDBIndexBackendImpl::getInternal"); RefPtr<IDBKey> key; if (keyRange->isOnlyKey()) key = keyRange->lower(); else { RefPtr<IDBBackingStore::Cursor> backingStoreCursor = index->backingStore()->openIndexCursor(index->databaseId(), index->m_objectStoreBackend->id(), index->id(), keyRange.get(), IDBCursor::NEXT); if (!backingStoreCursor) { callbacks->onSuccess(SerializedScriptValue::undefinedValue()); return; } key = backingStoreCursor->key(); backingStoreCursor->close(); } String value = index->backingStore()->getObjectViaIndex(index->databaseId(), index->m_objectStoreBackend->id(), index->id(), *key); if (value.isNull()) { callbacks->onSuccess(SerializedScriptValue::undefinedValue()); return; } callbacks->onSuccess(SerializedScriptValue::createFromWire(value)); }
void IDBIndexBackendImpl::getInternal(ScriptExecutionContext*, PassRefPtr<IDBIndexBackendImpl> index, PassRefPtr<IDBKeyRange> keyRange, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBTransactionBackendImpl> transaction) { IDB_TRACE("IDBIndexBackendImpl::getInternal"); RefPtr<IDBKey> key; if (keyRange->isOnlyKey()) key = keyRange->lower(); else { RefPtr<IDBBackingStore::Cursor> backingStoreCursor = index->backingStore()->openIndexCursor(transaction->backingStoreTransaction(), index->databaseId(), index->m_objectStoreBackend->id(), index->id(), keyRange.get(), IDBCursor::NEXT); if (!backingStoreCursor) { callbacks->onSuccess(); return; } key = backingStoreCursor->key(); } RefPtr<IDBKey> primaryKey = index->backingStore()->getPrimaryKeyViaIndex(transaction->backingStoreTransaction(), index->databaseId(), index->m_objectStoreBackend->id(), index->id(), *key); String value = index->backingStore()->getRecord(transaction->backingStoreTransaction(), index->databaseId(), index->m_objectStoreBackend->id(), *primaryKey); if (value.isNull()) { callbacks->onSuccess(); return; } if (index->m_objectStoreBackend->autoIncrement() && !index->m_objectStoreBackend->keyPath().isNull()) { callbacks->onSuccess(SerializedScriptValue::createFromWire(value), primaryKey, index->m_objectStoreBackend->keyPath()); return; } callbacks->onSuccess(SerializedScriptValue::createFromWire(value)); }
void IDBIndexBackendImpl::getKeyInternal(ScriptExecutionContext* context, PassRefPtr<IDBIndexBackendImpl> index, PassRefPtr<IDBKeyRange> keyRange, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBTransactionBackendImpl> transaction) { IDB_TRACE("IDBIndexBackendImpl::getInternal"); RefPtr<IDBBackingStore::Cursor> backingStoreCursor = index->backingStore()->openIndexKeyCursor(transaction->backingStoreTransaction(), index->databaseId(), index->m_objectStoreBackend->id(), index->id(), keyRange.get(), IDBCursor::NEXT); if (!backingStoreCursor) { callbacks->onSuccess(static_cast<IDBKey*>(0)); return; } RefPtr<IDBKey> keyResult = index->backingStore()->getPrimaryKeyViaIndex(transaction->backingStoreTransaction(), index->databaseId(), index->m_objectStoreBackend->id(), index->id(), *backingStoreCursor->key()); if (!keyResult) { callbacks->onSuccess(static_cast<IDBKey*>(0)); return; } callbacks->onSuccess(keyResult.get()); }
void IDBIndexBackendImpl::countInternal(ScriptExecutionContext*, PassRefPtr<IDBIndexBackendImpl> index, PassRefPtr<IDBKeyRange> range, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBTransactionBackendInterface>) { IDB_TRACE("IDBIndexBackendImpl::countInternal"); uint32_t count = 0; RefPtr<IDBBackingStore::Cursor> backingStoreCursor = index->backingStore()->openIndexKeyCursor(index->databaseId(), index->m_objectStoreBackend->id(), index->id(), range.get(), IDBCursor::NEXT); if (!backingStoreCursor) { callbacks->onSuccess(SerializedScriptValue::numberValue(count)); return; } do { ++count; } while (backingStoreCursor->continueFunction(0)); backingStoreCursor->close(); callbacks->onSuccess(SerializedScriptValue::numberValue(count)); }