IDB: Implement IDBCursor.delete()
authorbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 2 Feb 2014 01:58:16 +0000 (01:58 +0000)
committerbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 2 Feb 2014 01:58:16 +0000 (01:58 +0000)
<rdar://problem/15944203> and https://bugs.webkit.org/show_bug.cgi?id=127882

Reviewed by Sam Weinig.

IDBCursor.delete() actually relies on deleteRange(), which was implemented earlier.
So the only thing keeping it from working was a "Cursors iterate past their end" bug,
causing the delete transaction to be aborted.

* DatabaseProcess/IndexedDB/sqlite/SQLiteIDBCursor.cpp:
(WebKit::SQLiteIDBCursor::advanceOnce): When the cursor does the final iteration,
  clear the previous values to indicate completion.

* DatabaseProcess/IndexedDB/sqlite/SQLiteIDBTransaction.cpp:
(WebKit::SQLiteIDBTransaction::clearCursors): Noticed this opportunistic cleanup to
  iterate over unique_ptr<>s with an auto& instead of an auto.

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

Source/WebKit2/ChangeLog
Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/SQLiteIDBCursor.cpp
Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/SQLiteIDBTransaction.cpp

index 50ae649..8e53f9b 100644 (file)
@@ -1,3 +1,22 @@
+2014-02-01  Brady Eidson  <beidson@apple.com>
+
+        IDB: Implement IDBCursor.delete()
+        <rdar://problem/15944203> and https://bugs.webkit.org/show_bug.cgi?id=127882
+
+        Reviewed by Sam Weinig.
+
+        IDBCursor.delete() actually relies on deleteRange(), which was implemented earlier.
+        So the only thing keeping it from working was a "Cursors iterate past their end" bug,
+        causing the delete transaction to be aborted.
+
+        * DatabaseProcess/IndexedDB/sqlite/SQLiteIDBCursor.cpp:
+        (WebKit::SQLiteIDBCursor::advanceOnce): When the cursor does the final iteration,
+          clear the previous values to indicate completion.
+
+        * DatabaseProcess/IndexedDB/sqlite/SQLiteIDBTransaction.cpp:
+        (WebKit::SQLiteIDBTransaction::clearCursors): Noticed this opportunistic cleanup to
+          iterate over unique_ptr<>s with an auto& instead of an auto.
+
 2014-01-31  Enrica Casucci  <enrica@apple.com>
 
         Text interaction assistant is not deleted when dismissing the keyboard on iPad.
index 6494871..7e89a5e 100644 (file)
@@ -257,6 +257,13 @@ bool SQLiteIDBCursor::advanceOnce()
     int result = m_statement->step();
     if (result == SQLResultDone) {
         m_completed = true;
+
+        // When a cursor reaches its end, that is indicated by having undefined keys/values
+        m_currentKey = IDBKeyData();
+        m_currentPrimaryKey = IDBKeyData();
+        m_currentValueBuffer.clear();
+        m_currentValueKey = IDBKeyData();
+
         return true;
     }
 
index 13b84f3..22bcccc 100644 (file)
@@ -124,9 +124,8 @@ void SQLiteIDBTransaction::closeCursor(SQLiteIDBCursor& cursor)
 
 void SQLiteIDBTransaction::clearCursors()
 {
-    // Iterate over the keys instead of each key/value pair because std::unique_ptr<> can't be iterated over directly.
-    for (auto key : m_cursors.keys())
-        m_backingStore.unregisterCursor(m_cursors.get(key));
+    for (auto& cursor : m_cursors.values())
+        m_backingStore.unregisterCursor(cursor.get());
 
     m_cursors.clear();
 }