More SQLiteIDBCursor refactoring.
authorbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 16 Dec 2016 23:03:26 +0000 (23:03 +0000)
committerbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 16 Dec 2016 23:03:26 +0000 (23:03 +0000)
https://bugs.webkit.org/show_bug.cgi?id=165956

Reviewed by Tim Horton.

No new tests (No behavior change).

This is a simple patch that encapsulates the current state of the cursor in one structure
which will allow for storing multiple-such states in the future (to support prefetching).

* Modules/indexeddb/server/SQLiteIDBCursor.cpp:
(WebCore::IDBServer::SQLiteIDBCursor::currentData):
(WebCore::IDBServer::SQLiteIDBCursor::resetAndRebindStatement):
(WebCore::IDBServer::SQLiteIDBCursor::advance):
(WebCore::IDBServer::SQLiteIDBCursor::advanceUnique):
(WebCore::IDBServer::SQLiteIDBCursor::markAsErrored):
(WebCore::IDBServer::SQLiteIDBCursor::internalAdvanceOnce):
(WebCore::IDBServer::SQLiteIDBCursor::iterate):

* Modules/indexeddb/server/SQLiteIDBCursor.h:
(WebCore::IDBServer::SQLiteIDBCursor::currentRecordRowID):
(WebCore::IDBServer::SQLiteIDBCursor::currentKey):
(WebCore::IDBServer::SQLiteIDBCursor::currentPrimaryKey):
(WebCore::IDBServer::SQLiteIDBCursor::currentValue):
(WebCore::IDBServer::SQLiteIDBCursor::didComplete):
(WebCore::IDBServer::SQLiteIDBCursor::didError):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@209942 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp
Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.h

index 4852ca7..b33f8a9 100644 (file)
@@ -1,3 +1,32 @@
+2016-12-16  Brady Eidson  <beidson@apple.com>
+
+        More SQLiteIDBCursor refactoring.
+        https://bugs.webkit.org/show_bug.cgi?id=165956
+
+        Reviewed by Tim Horton.
+
+        No new tests (No behavior change).
+        
+        This is a simple patch that encapsulates the current state of the cursor in one structure
+        which will allow for storing multiple-such states in the future (to support prefetching).
+
+        * Modules/indexeddb/server/SQLiteIDBCursor.cpp:
+        (WebCore::IDBServer::SQLiteIDBCursor::currentData):
+        (WebCore::IDBServer::SQLiteIDBCursor::resetAndRebindStatement):
+        (WebCore::IDBServer::SQLiteIDBCursor::advance):
+        (WebCore::IDBServer::SQLiteIDBCursor::advanceUnique):
+        (WebCore::IDBServer::SQLiteIDBCursor::markAsErrored):
+        (WebCore::IDBServer::SQLiteIDBCursor::internalAdvanceOnce):
+        (WebCore::IDBServer::SQLiteIDBCursor::iterate):
+        
+        * Modules/indexeddb/server/SQLiteIDBCursor.h:
+        (WebCore::IDBServer::SQLiteIDBCursor::currentRecordRowID):
+        (WebCore::IDBServer::SQLiteIDBCursor::currentKey):
+        (WebCore::IDBServer::SQLiteIDBCursor::currentPrimaryKey):
+        (WebCore::IDBServer::SQLiteIDBCursor::currentValue):
+        (WebCore::IDBServer::SQLiteIDBCursor::didComplete):
+        (WebCore::IDBServer::SQLiteIDBCursor::didError):
+
 2016-12-16  Jer Noble  <jer.noble@apple.com>
 
         Follow-up build fix after r209936; also rename MockCDM -> LegacyMockCDM in
index 140e61d..77e6599 100644 (file)
@@ -101,13 +101,13 @@ SQLiteIDBCursor::~SQLiteIDBCursor()
 
 void SQLiteIDBCursor::currentData(IDBGetResult& result)
 {
-    if (m_completed) {
-        ASSERT(!m_errored);
+    if (m_currentRecord.completed) {
+        ASSERT(!m_currentRecord.errored);
         result = { };
         return;
     }
 
-    result = { m_currentRecord.key, m_currentRecord.primaryKey, m_currentRecord.value ? *m_currentRecord.value : IDBValue() };
+    result = { m_currentRecord.record.key, m_currentRecord.record.primaryKey, m_currentRecord.record.value ? *m_currentRecord.record.value : IDBValue() };
 }
 
 static String buildIndexStatement(const IDBKeyRangeData& keyRange, IndexedDB::CursorDirection cursorDirection)
@@ -223,21 +223,21 @@ void SQLiteIDBCursor::resetAndRebindStatement()
     m_statementNeedsReset = false;
 
     // If this cursor never fetched any records, we don't need to reset the statement.
-    if (m_currentRecord.key.isNull())
+    if (m_currentRecord.record.key.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_currentRecord.key;
+        m_currentLowerKey = m_currentRecord.record.key;
         if (!m_keyRange.lowerOpen) {
             m_keyRange.lowerOpen = true;
             m_keyRange.lowerKey = m_currentLowerKey;
             m_statement = nullptr;
         }
     } else {
-        m_currentUpperKey = m_currentRecord.key;
+        m_currentUpperKey = m_currentRecord.record.key;
         if (!m_keyRange.upperOpen) {
             m_keyRange.upperOpen = true;
             m_keyRange.upperKey = m_currentUpperKey;
@@ -293,7 +293,7 @@ bool SQLiteIDBCursor::advance(uint64_t count)
 {
     bool isUnique = m_cursorDirection == IndexedDB::CursorDirection::NextNoDuplicate || m_cursorDirection == IndexedDB::CursorDirection::PrevNoDuplicate;
 
-    if (m_completed) {
+    if (m_currentRecord.completed) {
         LOG_ERROR("Attempt to advance a completed cursor");
         return false;
     }
@@ -307,7 +307,7 @@ bool SQLiteIDBCursor::advance(uint64_t count)
                 return false;
         }
 
-        if (m_completed)
+        if (m_currentRecord.completed)
             break;
     }
 
@@ -316,14 +316,14 @@ bool SQLiteIDBCursor::advance(uint64_t count)
 
 bool SQLiteIDBCursor::advanceUnique()
 {
-    IDBKeyData currentKey = m_currentRecord.key;
+    IDBKeyData currentKey = m_currentRecord.record.key;
 
-    while (!m_completed) {
+    while (!m_currentRecord.completed) {
         if (!advanceOnce())
             return false;
 
         // If the new current key is different from the old current key, we're done.
-        if (currentKey.compare(m_currentRecord.key))
+        if (currentKey.compare(m_currentRecord.record.key))
             return true;
     }
 
@@ -345,26 +345,25 @@ bool SQLiteIDBCursor::advanceOnce()
 
 void SQLiteIDBCursor::markAsErrored()
 {
-    m_completed = true;
-    m_errored = true;
-    m_currentRecordRowID = 0;
+    m_currentRecord.completed = true;
+    m_currentRecord.errored = true;
+    m_currentRecord.rowID = 0;
 }
 
 SQLiteIDBCursor::AdvanceResult SQLiteIDBCursor::internalAdvanceOnce()
 {
     ASSERT(m_transaction->sqliteTransaction());
     ASSERT(m_statement);
-    ASSERT(!m_completed);
+    ASSERT(!m_currentRecord.completed);
 
-    m_currentRecord.value = nullptr;
+    m_currentRecord.record.value = nullptr;
 
     int result = m_statement->step();
     if (result == SQLITE_DONE) {
-        m_completed = true;
-
         // When a cursor reaches its end, that is indicated by having undefined keys/values
         m_currentRecord = { };
-        m_currentRecordRowID = 0;
+        m_currentRecord.completed = true;
+        m_currentRecord.rowID = 0;
 
         return AdvanceResult::Success;
     }
@@ -375,13 +374,13 @@ SQLiteIDBCursor::AdvanceResult SQLiteIDBCursor::internalAdvanceOnce()
         return AdvanceResult::Failure;
     }
 
-    m_currentRecordRowID = m_statement->getColumnInt64(0);
-    ASSERT(m_currentRecordRowID);
+    m_currentRecord.rowID = m_statement->getColumnInt64(0);
+    ASSERT(m_currentRecord.rowID);
 
     Vector<uint8_t> keyData;
     m_statement->getColumnBlobAsVector(1, keyData);
 
-    if (!deserializeIDBKeyData(keyData.data(), keyData.size(), m_currentRecord.key)) {
+    if (!deserializeIDBKeyData(keyData.data(), keyData.size(), m_currentRecord.record.key)) {
         LOG_ERROR("Unable to deserialize key data from database while advancing cursor");
         markAsErrored();
         return AdvanceResult::Failure;
@@ -391,10 +390,10 @@ SQLiteIDBCursor::AdvanceResult SQLiteIDBCursor::internalAdvanceOnce()
 
     // The primaryKey of an ObjectStore cursor is the same as its key.
     if (m_indexID == IDBIndexInfo::InvalidId) {
-        m_currentRecord.primaryKey = m_currentRecord.key;
+        m_currentRecord.record.primaryKey = m_currentRecord.record.key;
 
         Vector<String> blobURLs, blobFilePaths;
-        auto error = m_transaction->backingStore().getBlobRecordsForObjectStoreRecord(m_currentRecordRowID, blobURLs, blobFilePaths);
+        auto error = m_transaction->backingStore().getBlobRecordsForObjectStoreRecord(m_currentRecord.rowID, blobURLs, blobFilePaths);
         if (!error.isNull()) {
             LOG_ERROR("Unable to fetch blob records from database while advancing cursor");
             markAsErrored();
@@ -402,9 +401,9 @@ SQLiteIDBCursor::AdvanceResult SQLiteIDBCursor::internalAdvanceOnce()
         }
 
         if (m_cursorType == IndexedDB::CursorType::KeyAndValue)
-            m_currentRecord.value = std::make_unique<IDBValue>(ThreadSafeDataBuffer::adoptVector(keyData), blobURLs, blobFilePaths);
+            m_currentRecord.record.value = std::make_unique<IDBValue>(ThreadSafeDataBuffer::adoptVector(keyData), blobURLs, blobFilePaths);
     } else {
-        if (!deserializeIDBKeyData(keyData.data(), keyData.size(), m_currentRecord.primaryKey)) {
+        if (!deserializeIDBKeyData(keyData.data(), keyData.size(), m_currentRecord.record.primaryKey)) {
             LOG_ERROR("Unable to deserialize value data from database while advancing index cursor");
             markAsErrored();
             return AdvanceResult::Failure;
@@ -424,7 +423,7 @@ SQLiteIDBCursor::AdvanceResult SQLiteIDBCursor::internalAdvanceOnce()
 
         if (result == SQLITE_ROW) {
             objectStoreStatement.getColumnBlobAsVector(0, keyData);
-            m_currentRecord.value = std::make_unique<IDBValue>(ThreadSafeDataBuffer::adoptVector(keyData));
+            m_currentRecord.record.value = std::make_unique<IDBValue>(ThreadSafeDataBuffer::adoptVector(keyData));
         } else if (result == SQLITE_DONE) {
             // This indicates that the record we're trying to retrieve has been removed from the object store.
             // Skip over it.
@@ -451,30 +450,30 @@ bool SQLiteIDBCursor::iterate(const IDBKeyData& targetKey, const IDBKeyData& tar
     if (targetKey.isNull() || !result)
         return result;
 
-    while (!m_completed) {
+    while (!m_currentRecord.completed) {
         if (!result)
             return false;
 
         // Search for the next key >= the target if the cursor is a Next cursor, or the next key <= if the cursor is a Previous cursor.
         if (m_cursorDirection == IndexedDB::CursorDirection::Next || m_cursorDirection == IndexedDB::CursorDirection::NextNoDuplicate) {
-            if (m_currentRecord.key.compare(targetKey) >= 0)
+            if (m_currentRecord.record.key.compare(targetKey) >= 0)
                 break;
-        } else if (m_currentRecord.key.compare(targetKey) <= 0)
+        } else if (m_currentRecord.record.key.compare(targetKey) <= 0)
             break;
 
         result = advance(1);
     }
 
     if (targetPrimaryKey.isValid()) {
-        while (!m_completed && !m_currentRecord.key.compare(targetKey)) {
+        while (!m_currentRecord.completed && !m_currentRecord.record.key.compare(targetKey)) {
             if (!result)
                 return false;
 
             // Search for the next primary key >= the primary target if the cursor is a Next cursor, or the next key <= if the cursor is a Previous cursor.
             if (m_cursorDirection == IndexedDB::CursorDirection::Next || m_cursorDirection == IndexedDB::CursorDirection::NextNoDuplicate) {
-                if (m_currentRecord.primaryKey.compare(targetPrimaryKey) >= 0)
+                if (m_currentRecord.record.primaryKey.compare(targetPrimaryKey) >= 0)
                     break;
-            } else if (m_currentRecord.primaryKey.compare(targetPrimaryKey) <= 0)
+            } else if (m_currentRecord.record.primaryKey.compare(targetPrimaryKey) <= 0)
                 break;
 
             result = advance(1);
index 0c5e2bc..9d05278 100644 (file)
@@ -60,17 +60,17 @@ public:
     SQLiteIDBTransaction* transaction() const { return m_transaction; }
 
     int64_t objectStoreID() const { return m_objectStoreID; }
-    int64_t currentRecordRowID() const { return m_currentRecordRowID; }
+    int64_t currentRecordRowID() const { return m_currentRecord.rowID; }
 
-    const IDBKeyData& currentKey() const { return m_currentRecord.key; }
-    const IDBKeyData& currentPrimaryKey() const { return m_currentRecord.primaryKey; }
-    IDBValue* currentValue() const { return m_currentRecord.value.get(); }
+    const IDBKeyData& currentKey() const { return m_currentRecord.record.key; }
+    const IDBKeyData& currentPrimaryKey() const { return m_currentRecord.record.primaryKey; }
+    IDBValue* currentValue() const { return m_currentRecord.record.value.get(); }
 
     bool advance(uint64_t count);
     bool iterate(const IDBKeyData& targetKey, const IDBKeyData& targetPrimaryKey);
 
-    bool didComplete() const { return m_completed; }
-    bool didError() const { return m_errored; }
+    bool didComplete() const { return m_currentRecord.completed; }
+    bool didError() const { return m_currentRecord.errored; }
 
     void objectStoreRecordsChanged();
 
@@ -106,17 +106,20 @@ private:
     IDBKeyData m_currentLowerKey;
     IDBKeyData m_currentUpperKey;
 
-    IDBCursorRecord m_currentRecord;
+    struct SQLiteCursorRecord {
+        IDBCursorRecord record;
+        bool completed { false };
+        bool errored { false };
+        int64_t rowID { 0 };
+    };
+
+    SQLiteCursorRecord m_currentRecord;
 
     std::unique_ptr<SQLiteStatement> m_statement;
     bool m_statementNeedsReset { false };
     int64_t m_boundID { 0 };
 
-    bool m_completed { false };
-    bool m_errored { false };
-
     bool m_backingStoreCursor { false };
-    int64_t m_currentRecordRowID { 0 };
 };
 
 } // namespace IDBServer