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. if (m_cursorDirection == IndexedDB::CursorDirection::Next || m_cursorDirection == IndexedDB::CursorDirection::NextNoDuplicate) m_currentLowerKey = m_currentKey; else m_currentUpperKey = m_currentKey; if (m_statement->reset() != SQLITE_OK) { LOG_ERROR("Could not reset cursor statement to respond to object store changes"); return; } bindArguments(); }
bool SQLiteIDBCursor::createSQLiteStatement(const String& sql) { LOG(IDB, "Creating cursor with SQL query: \"%s\"", sql.utf8().data()); ASSERT(!m_currentLowerKey.isNull()); ASSERT(!m_currentUpperKey.isNull()); ASSERT(m_transaction->sqliteTransaction()); m_statement = std::make_unique<SQLiteStatement>(m_transaction->sqliteTransaction()->database(), sql); if (m_statement->prepare() != SQLITE_OK) { LOG_ERROR("Could not create cursor statement (prepare/id) - '%s'", m_transaction->sqliteTransaction()->database().lastErrorMsg()); return false; } return bindArguments(); }
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(); }