std::unique_ptr<SQLiteIDBCursor> SQLiteIDBCursor::maybeCreate(SQLiteIDBTransaction* transaction, const IDBIdentifier& cursorIdentifier, int64_t objectStoreID, int64_t indexID, IndexedDB::CursorDirection cursorDirection, IndexedDB::CursorType cursorType, IDBDatabaseBackend::TaskType taskType, const IDBKeyRangeData& keyRange) { auto cursor = std::unique_ptr<SQLiteIDBCursor>(new SQLiteIDBCursor(transaction, cursorIdentifier, objectStoreID, indexID, cursorDirection, cursorType, taskType, keyRange)); if (!cursor->establishStatement()) return nullptr; if (!cursor->advance(1)) return nullptr; return cursor; }
std::unique_ptr<SQLiteIDBCursor> SQLiteIDBCursor::maybeCreate(SQLiteIDBTransaction& transaction, const IDBCursorInfo& info) { auto cursor = std::make_unique<SQLiteIDBCursor>(transaction, info); if (!cursor->establishStatement()) return nullptr; if (!cursor->advance(1)) return nullptr; return cursor; }
std::unique_ptr<SQLiteIDBCursor> SQLiteIDBCursor::maybeCreateBackingStoreCursor(SQLiteIDBTransaction& transaction, const uint64_t objectStoreID, const uint64_t indexID, const IDBKeyRangeData& range) { auto cursor = std::make_unique<SQLiteIDBCursor>(transaction, objectStoreID, indexID, range); if (!cursor->establishStatement()) return nullptr; if (!cursor->advance(1)) return nullptr; return cursor; }
void SQLiteIDBCursor::resetAndRebindStatement() { ASSERT(!m_currentLowerKey.isNull()); ASSERT(!m_currentUpperKey.isNull()); ASSERT(m_transaction->sqliteTransaction()); ASSERT(m_statement); ASSERT(m_statementNeedsReset); m_statementNeedsReset = false; // If this cursor never fetched any records, we don't need to reset the statement. if (m_currentKey.isNull()) return; // Otherwise update the lower key or upper key used for the cursor range. // This is so the cursor can pick up where we left off. // We might also have to change the statement from closed to open so we don't refetch the current key a second time. if (m_cursorDirection == IndexedDB::CursorDirection::Next || m_cursorDirection == IndexedDB::CursorDirection::NextNoDuplicate) { m_currentLowerKey = m_currentKey; if (!m_keyRange.lowerOpen) { m_keyRange.lowerOpen = true; m_keyRange.lowerKey = m_currentLowerKey; m_statement = nullptr; } } else { m_currentUpperKey = m_currentKey; if (!m_keyRange.upperOpen) { m_keyRange.upperOpen = true; m_keyRange.upperKey = m_currentUpperKey; m_statement = nullptr; } } if (!m_statement && !establishStatement()) { LOG_ERROR("Unable to establish new statement for cursor iteration"); return; } if (m_statement->reset() != SQLITE_OK) { LOG_ERROR("Could not reset cursor statement to respond to object store changes"); return; } bindArguments(); }