SQLiteIDBTransaction.cpp [plain text]
#include "config.h"
#include "SQLiteIDBTransaction.h"
#if ENABLE(INDEXED_DATABASE) && ENABLE(DATABASE_PROCESS)
#include "SQLiteIDBCursor.h"
#include "UniqueIDBDatabaseBackingStoreSQLite.h"
#include <WebCore/IndexedDB.h>
#include <WebCore/SQLiteTransaction.h>
using namespace WebCore;
static int64_t nextCursorID = 1;
namespace WebKit {
SQLiteIDBTransaction::SQLiteIDBTransaction(UniqueIDBDatabaseBackingStoreSQLite& backingStore, const IDBIdentifier& transactionIdentifier, IndexedDB::TransactionMode mode)
: m_identifier(transactionIdentifier)
, m_mode(mode)
, m_backingStore(backingStore)
{
}
SQLiteIDBTransaction::~SQLiteIDBTransaction()
{
if (inProgress())
m_sqliteTransaction->rollback();
clearCursors();
}
bool SQLiteIDBTransaction::begin(SQLiteDatabase& database)
{
ASSERT(!m_sqliteTransaction);
m_sqliteTransaction = std::make_unique<SQLiteTransaction>(database, m_mode == IndexedDB::TransactionMode::ReadOnly);
m_sqliteTransaction->begin();
return m_sqliteTransaction->inProgress();
}
bool SQLiteIDBTransaction::commit()
{
if (!m_sqliteTransaction || !m_sqliteTransaction->inProgress())
return false;
m_sqliteTransaction->commit();
return !m_sqliteTransaction->inProgress();
}
bool SQLiteIDBTransaction::reset()
{
m_sqliteTransaction = nullptr;
clearCursors();
return true;
}
bool SQLiteIDBTransaction::rollback()
{
ASSERT(m_sqliteTransaction);
if (m_sqliteTransaction->inProgress())
m_sqliteTransaction->rollback();
return true;
}
SQLiteIDBCursor* SQLiteIDBTransaction::openCursor(int64_t objectStoreID, int64_t indexID, IndexedDB::CursorDirection cursorDirection, IndexedDB::CursorType cursorType, IDBDatabaseBackend::TaskType taskType, const IDBKeyRangeData& keyRange)
{
ASSERT(m_sqliteTransaction);
if (!m_sqliteTransaction->inProgress())
return nullptr;
IDBIdentifier cursorIdentifier(m_identifier.connection(), nextCursorID++);
auto addResult = m_cursors.add(cursorIdentifier, SQLiteIDBCursor::maybeCreate(this, cursorIdentifier, objectStoreID, indexID, cursorDirection, cursorType, taskType, keyRange));
ASSERT(addResult.isNewEntry);
if (!addResult.iterator->value) {
m_cursors.remove(addResult.iterator);
return nullptr;
}
return addResult.iterator->value.get();
}
void SQLiteIDBTransaction::closeCursor(SQLiteIDBCursor& cursor)
{
ASSERT(m_cursors.contains(cursor.identifier()));
m_backingStore.unregisterCursor(&cursor);
m_cursors.remove(cursor.identifier());
}
void SQLiteIDBTransaction::notifyCursorsOfChanges(int64_t objectStoreID)
{
for (auto& i : m_cursors) {
if (i.value->objectStoreID() == objectStoreID)
i.value->objectStoreRecordsChanged();
}
}
void SQLiteIDBTransaction::clearCursors()
{
for (auto& cursor : m_cursors.values())
m_backingStore.unregisterCursor(cursor.get());
m_cursors.clear();
}
bool SQLiteIDBTransaction::inProgress() const
{
return m_sqliteTransaction && m_sqliteTransaction->inProgress();
}
}
#endif // ENABLE(INDEXED_DATABASE) && ENABLE(DATABASE_PROCESS)