- From: Jonas Sicking <jonas@sicking.cc>
- Date: Fri, 20 Jan 2012 14:30:36 -0800
- To: ben turner <bent.mozilla@gmail.com>
- Cc: Israel Hilerio <israelh@microsoft.com>, Joshua Bell <jsbell@chromium.org>, Odin Hørthe Omdal <odinho@opera.com>, Adam Herchenroether <aherchen@microsoft.com>, David Sheldon <dsheldon@microsoft.com>, "public-webapps@w3.org" <public-webapps@w3.org>
On Fri, Jan 20, 2012 at 12:23 PM, ben turner <bent.mozilla@gmail.com> wrote: > Mozilla is fine with removing the special |keyPath:""| behavior. > Please note that this will also mean that step 1 of the algorithm here > > http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#dfn-steps-for-extracting-a-key-from-a-value-using-a-key-path > > will need to change. > > We do want to continue to allow set behavior without specifying the > key twice, though, so we would propose adding an additional option to > createObjectStore to accomplish this: > > // Old way: > var set = db.createObjectStore("mySet", { keyPath:"" }); > set.put(keyValue); > > // New way: > var set = db.createObjectStore("mySet", { isSet: true }); > set.put(keyValue); > > (We are not in love with "isSet", better names are highly encouraged!) > > What do you all think? This would allow us to continue to support nice > set behavior without making the empty string "magic". I actually think that the current behavior that we have is pretty consistent. Any time you give the keyPath property a string we create an objectStore with a keyPath. And any time you have an objectStore with a keyPath you are not allowed to pass an explicit key since the key is gotten from the keyPath. There's no special handling of empty strings happening. But I do agree that it can be somewhat confusing to tell ""/null/undefined apart since they are all falsy. In particular, an expression like if (myObjectStore.keyPath) { ... } doesn't work to test if an objectStore has a keyPath or not. You instead need to check if (myObjectStore.keyPath != null) { ... } or if (typeof myObjectStore.keyPath == "string") { ... } Hence the "isSet" suggestion. Though I also realized after talking to Ben that empty keyPaths show up in indexes too. Consider creating a objectStore which maps peoples names to email addresses. Then you can create an index when does the opposite mapping, or which ensures that email addresses are unique: var store = db.createObjectStore("people"); var index = store.createIndex("reverse", "", { unique: true }); store.add("john.doe@email.com", "John Doe"); store.add("mike@smith.org", "Mike Smith"); store.get("John Doe").onsuccess = function(e) { alert("John's email is " + e.target.result); } index.getKey("mike@smith.org").onsuccess = function(e) { alert("mike@smith.org is owned by " + e.target.result); } Are people proposing we remove empty keyPaths here too? / Jonas
Received on Friday, 20 January 2012 22:31:43 UTC