- From: Miko Nieminen <miko.nieminen@iki.fi>
- Date: Sun, 17 Feb 2013 15:34:58 +0000
- To: public-webapps@w3.org
- Message-ID: <CAPp4HtBbyz2JFe4Gxd+ZJo5+mtKqSW=RLgbbs5EVKMF1Bbd_dA@mail.gmail.com>
Asking my previous question again. There has been some discussions in www-tag list about IndexedDB API as an addition to discussion happening here. At www-tag, I was instructed to return back to this list with my question. There seems to be worry over IDB that it is too low level API and too complicated or verbose to use by someone not having degree in computer science. I do understand this worry, but at the same time I haven't seen any proper suggestions for better API than what we have and to be honest I'm quite happy with the current API. I don't feel it is too verbose especially when I see that the verbosity improves readability in this case. Only part that I feel could possibly be simplified is the use of transactions. Though I don't see any other solution for this than auto transactions and that kind of mechanism would probably have its own issues and would complicate implementation of IDB and I definitely don't want to see transactions going away. Other than that, I don't really think that the API requires much more simplifications and if it does, I don't really know how to do that. I think slightly harder lower level API at this point is much better than over simplified higher level API that limits use of too much. On top of lower level API you can write generic abstraction layers in Javascript, but not other way around. In the future version of the API we can then go back and see what kind of issues different abstractions are trying to solve and then add needed parts in the standard. But to the actual topic. As I raised earlier, main true problem with IDB is that I cannot listen changes in a object store. This does not feel that important when coming from SQL world, but after using other NoSQL databases and especially when thinking about rest of the web APIs, it doesn't make much sense not to have these events. WebStorage API defines this kind of mechanism and I feel it is quite odd that IDB does not. I have three quite clear use cases for this one that could be much simplified with these events: 1) I want to create synchronization library that is generic component providing IDB client to server sync. For example I have REST API for data in my service and I want to keep my clients in sync with the sevice over web sockets. To create this I need to wrap local modification requests to notify my library about the changes. In other words, I need to make my other components to know about this sync components, instead just including the component and telling which object stores to keep in sync and then this component could listen for new objects, modifications and deleted objects and notify service about these changes or it could just modify database when service notifies of change and my application component would see modification through object store events. 2) I want to create search component for so that I can index all words found in my objects. For example I create notes app where I want to index all words found in all notes and map those to my note objects. Then I want to use key range search for searching all notes that have words starting with my search term. This is a bit naïve example and it can be implemented by adding the code into my modification places, but again I would like to have generic component that does the indexing by listening these changes and then just include this library in my app. 3) I want to keep multiple windows in sync with changes in my objects. There are lots of approaches to have this, by using local storage as communication channel or create postMessage channel, but this is all just additional code that should not be needed in the first place and I need to hook my code that makes modifications to make these notifications instead just listening changes in my object store and hooking my HTML updates to these change events. To simplify implementation of these example cases, I would like to listen change events through object store so that I know when object is added, modified or deleted. I think these events should be launched right after transaction is completed. This raises some questions that how about order of these events or should we provide some kind of change chunk mechanism like for example CouchDB has when listening change notifications. At the first version, I wouldn't solve these issues. It should not matter in which order these events come as long as mid transaction changes are not notified. Add + put should be notiified as add, put + delete should be notified as delete, and multiple puts should be notified as single put showing the last state. Should we have multiple objects in one change, is a good question. So far I haven't got other feedback than this is fairly good idea and probably should be included in the official API, but is it stillpossible to get this kind of changes included in the API or am I too late with this request? If it is possible to have this change, is there anything I can do to help it getting forward? I'm working on reference implementation in Mozilla's codebase and I feel I'm quite close getting the first version working, but I'm hacking it on my free time and I have no previous experience from Mozilla's code so the progress is somewhat slow. -- Miko Nieminen miko.nieminen@iki.fi miko.nieminen@gmail.com
Received on Sunday, 17 February 2013 15:35:29 UTC