W3C home > Mailing lists > Public > public-webapps@w3.org > January to March 2010

Re: [WebSQLDatabase] Adding a vacuum() call

From: Dumitru Daniliuc <dumi@chromium.org>
Date: Thu, 11 Mar 2010 17:02:34 -0800
Message-ID: <e753f47f1003111702i10270f45v9cce8dce3886648b@mail.gmail.com>
To: Michael Nordman <michaeln@google.com>
Cc: Jeremy Orlow <jorlow@google.com>, Joćo Eiras <joaoe@opera.com>, public-webapps <public-webapps@w3.org>
sounds good to me:

interface Database {
 // the methods and properties currently in the spec
 void vacuum(in optional SQLVoidCallback completionCallback);
};

"... upon completion, queue up a task to invoke the completionCallback, if
one was provided."

dumi


On Thu, Mar 11, 2010 at 4:20 PM, Michael Nordman <michaeln@google.com>wrote:

> Instead of calling back on success only, maybe call back on completion
> regardless of success or failure. This way the caller would know when the
> potentially lengthy operation was done, regardless of the outcome.
>
> 2010/3/11 Dumitru Daniliuc <dumi@chromium.org>
>
> joao,
>>
>> it looks like we mostly agree on this feature, so i was wondering if we
>> could formally agree on a spec. here's what i propose:
>>
>> 1. name: vacuum. to the best of my knowledge, all current WebSQLDatabases
>> implementations use SQLite, and in SQLite the command is called VACUUM. so
>> it seems to me that we might as well call the new function vacuum(). what do
>> you think?
>>
>> 2. spec: no need for an error callback.
>>
>>
>> interface Database {
>>   // the methods and properties currently in the spec
>>   void vacuum(in optional SQLVoidCallback successCallback);
>> };
>>
>> 3. what the call should do: the purpose of this call is to allow apps to
>> vacuum/compact/defragment/clean up their databases whenever they see fit. a
>> call to vacuum() could take a considerable amount of time (especially on
>> larger or highly fragmented databases); therefore, it is not recommended for
>> web apps to call this method during periods of high activity.
>>
>> how to process a vacuum() call:
>>
>>    1. if the UA does not support this call (mobile browsers?), jump to
>>    step 3.
>>    2. queue up a task to vacuum/compact/defragment/clean up the database.
>>    3. if the task succeeds, and a success callback is provided, queue up
>>    a task to invoke the success callback; in all other cases (the task failed,
>>    or no success callback was provided), do nothing: proceed to the next task
>>    in the queue.
>>
>> does this seem acceptable? we (google engineers interested in this) feel
>> that UAs should either not implement the vacuum() call, or they should
>> respect it (rather than taking it as a hint). it is ok for UAs to keep track
>> of things like system idleness or databases closing to do more vacuuming
>> that the apps asked for, if they want to. however, we feel that a vacuum()
>> request by an app should not be postponed, simply because sometimes apps
>> know better than UAs when the best time to vacuum is (it might be nice to
>> give apps more information on how fragmented their databases are, but that's
>> a separate discussion).
>>
>> thanks,
>> dumi
>>
>>
>> 2010/3/9 Jeremy Orlow <jorlow@google.com>
>>
>> On Mon, Mar 8, 2010 at 8:47 PM, Dumitru Daniliuc <dumi@google.com> wrote:
>>>
>>>>
>>>>
>>>> On Mon, Mar 8, 2010 at 3:39 AM, Joćo Eiras <joaoe@opera.com> wrote:
>>>>
>>>>>
>>>>>  I don't see how the callbacks are useful though. Vacuum works
>>>>>>> transparently, its effects are not visible, and what should the page
>>>>>>> do in
>>>>>>> case of error ?
>>>>>>>
>>>>>>>
>>>>>> i was thinking of something like:
>>>>>>
>>>>>> db.defragment(errorCallback, successCallback);
>>>>>> showAPrettyImageAndAskTheUserToWait();
>>>>>>
>>>>>> function errorCallback(error) {}
>>>>>> function successCallback() {
>>>>>>  getRidOfThePrettyImageAndRestartTheApp();
>>>>>> }
>>>>>>
>>>>>> just like you, i'm not sure if the error callback is useful at all,
>>>>>> but i
>>>>>> thought i'd add it to make the defragment() call look more like a
>>>>>> transaction. maybe we don't need it.
>>>>>>
>>>>>>
>>>>> True, but this is a kind of operation that could very well just run on
>>>>> the background, with a single optional callback when it's done (the webpage
>>>>> can't do anything if an error is detected anyway).
>>>>
>>>>
>>>> ok, so let's drop the errorCallback: vacuum([optional] successCallback);
>>>>
>>>>
>>>>> The user agent would need to queue any subsequent transactions if a
>>>>> vacuum is running. I would consider it as an hint, and after all webpages
>>>>> that own references to the underlying data files are closed, would do a
>>>>> vacuum. So, if you have many tabs on gmail, and that a single gmail instance
>>>>> tries to do multiple vacuums, it would equiv to one single vacuum operation.
>>>>
>>>>
>>>> what do we do if some databases are opened for the entire life of the
>>>> browser? for example, i open my browser which has myfavoriteapp.com set
>>>> as its homepage. myfavoriteapp.com immediately opens a DB, and i only
>>>> close that app when i close the browser. when would the browser vacuum
>>>> myfavoriteapp's DBs in this case?
>>>>
>>>> i think it's ok for the UA to vacuum some DBs automatically when it
>>>> thinks it's a good time to do so; however, if a platform supports the
>>>> vacuum/defrag call (i.e. if it doesn't treat it is a no-op), then i think a
>>>> vacuum call coming from the app should be immediately scheduled (yes, the
>>>> subsequent transactions would have to wait for the vacuuming to finish
>>>> running). in some cases, the apps know better than the UA when to vacuum
>>>> their DBs.
>>>>
>>>> by the way, we should probably agree on a name for this call. which one
>>>> do you prefer? vacuum, defragment, defrag, something else? i don't have a
>>>> strong opinion.
>>>>
>>>
>>> I think vacuum is fine since the spec is already tied to the SQLite SQL
>>> dialect.
>>>
>>> collectGarbage() is another possibility
>>>
>>> Go with whatever you think is most clear and accurate though.
>>>
>>> J
>>>
>>
>>
>
Received on Friday, 12 March 2010 01:03:06 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 18:49:37 GMT