On Tue, Jun 28, 2011 at 10:53 AM, Israel Hilerio <isra...@microsoft.com> wrote:
> On Monday, June 27, 2011 8:21 PM, Jonas Sicking wrote:
>> On Mon, Jun 27, 2011 at 11:42 AM, Israel Hilerio <isra...@microsoft.com>
>> wrote:
>> > The IDBObjectStore.openCursor method is defined to have two optional
>> parameters:
>> > * IDBRequest openCursor (in optional any range, in optional unsigned
>> > short direction) raises (IDBDatabaseException);
>> >
>> > Based on the examples in the spec, it seems we're envisioning the method
>> to be used in the following ways:
>> > * objStore.openCursor();
>> > * objStore.openCursor(keyRange);
>> > * objStore.openCursor(keyRange, IDBCursor.PREV);
>> > * objStore.openCursor(IDBCursor.PREV);
>>
>> No, that's not how optional parameters work in WebIDL. In order to specify an
>> optional parameter, you always have to specify all preceding optional
>> parameters. So only the following syntaxes are
>> valid:
>>
>> * objStore.openCursor();
>> * objStore.openCursor(keyRange);
>> * objStore.openCursor(keyRange, IDBCursor.PREV);
>>
>> > Having "any" for the keyRange type makes it difficult to detect the correct
>> overloaded parameter for openCursor.
>>
>> The reason the first parameter is of type 'any' is so that you can pass 
>> either a
>> IDBKeyRange or a value. So for example:
>>
>> req = objStore.openCursor("hello");
>> req = index.openCursor(4);
>>
>> are valid. When called with a simple value on an object store the cursor will
>> obviously always return 0 or 1 rows. For indexes it could return any number
>> of rows though.
>>
>> This is actually already specified if you look at the steps for opening a 
>> cursor.
>> The same holds true for many other functions, such as .get and .delete.
>>
>> However it's a very subtle feature that's easy to miss. If you have 
>> suggestions
>> for how to make this more clear in the spec I'd love to hear them. I've been
>> thinking that we should add non-normative, easy-to-understand text to
>> explain each function, similar to what the
>> HTML5 spec does when defining APIs.
>>
>> / Jonas
>
> What you're saying makes a lot of sense.  That was what I originally thought 
> but what confused me was some of the examples in the current spec which 
> suggest we want to do the following (Section 3.3.5):
> * objStore.openCursor(IDBCursor.PREV);

I don't think we should allow this. The benefit of saving the author
from writing
objStore.openCursor(nulll, IDBCursor.PREV)
isn't worth the complexity that is introduced. IMHO. We should just
fix the example instead.

> Independent of how up to date the examples are, the issue with the way it is 
> currently spec'ed is that there is an implied dependency between keyRange and 
> Cursor direction.  In other words, you can't open a cursor without any 
> keyRange and just a direction.  One possible way to resolve this is to allow 
> the keyRange to be nullable.  This will allow us to define a cursor without a 
> keyRange and with a direction:
> * objStore.openCursor(null, IDBCursor.PREV);
>
> Without something like this, it is not easy to get a list of all the records 
> on the store going in the opposite direction from IDBCursor.NEXT.

Indeed, it was the intent that this should be allowed. I suspect we
simply haven't kept up to date with WebIDL changing under us. But I do
think that the text in the algorithm does say to do the right thing
when no keyrange (or key value) is supplied.

/ Jonas

Reply via email to