Re: [indexeddb] Effects of calling Cursor.Update() on an existing Index

On Tue, Jul 12, 2011 at 11:21 AM, Israel Hilerio <> wrote:
> Assuming you have the following records in an objectStore objStore:
> Record #1: {prop1: 1, prop2: "foo1"}
> Record #2: {prop1: 2, prop2: "foo2"}
> Record #3: {prop1: 3, prop2: "foo3"}
> Record #4: {prop1: 4, prop2: "foo4"}
> keyPath = "prop1"
> Now, we create an index on "prop2" called index1.
> Let's say get a cursor on index1 and we start iterating through it.
> When I get to Record #2, I decide to use the cursor index to call update and change prop2 to "foo5":
>          var rq = objStore.index("index1").openCursor();
>          rq.onsuccess = function (evt) {
>              var cursor =;
>                 if (cursor) {
>                     if (cursor.value.prop1 == "foo2") {

I assume you mean cursor.value.prop2 here, right?

>                         var rq2 = cursor.update({prop1: 2, prop2: "foo5"});
>                     }
>                    cursor.continue();
>                }
>          };
> My question is what is going to happen to the cursor position when the update takes place?
> Our expectation is that the cursor value will remain unchanged in the client code while the database object entry (i.e. record) will change.
> This will produce the following values for cursor.key and cursor.primaryKey "foo2" and "2", respectively.
> Thus, we expect the cursor position to remain unchanged and continue() should return Record #3.
> Additionally, we expect to see the new Record #2 entry after Record #4.
> Do you agree?

Yes, this should be fully defined by the specification using the
cursor's internal "position" and "object store position" state in the
"steps for iterating a cursor".

I definitely agree that it would be nice to have some more readable
informal text that explains this, preferably in the form of a <p
class=note> somewhere in the cursor description.

For what it's worth this scenario happens not just through
cursor.update. If you change the cursor.update line in the code
snippet above to

objStore.put({prop1: 2, prop2: "foo5"});


objStore.add({prop1: 2, prop2: "foo5"});

the exact same situation arises, and the exact same behavior is
expected. Similarly, if the code is




this has the exact same behavior, except that it obviously doesn't
make the Record #2 appear after Record #4 while iterating.

/ Jonas

Received on Tuesday, 12 July 2011 18:38:15 UTC