final void write(JavaScriptObject transaction, URI uri, long tick, Buff[] buffs, long[] removals, boolean callback) {
IndexedDBView view = (IndexedDBView) uri.getOrCreate(_location);
ArrayBuffer buffer;
if (buffs.length == 1) {
GWTBuff buff = (GWTBuff) buffs[0];
buffer = buff.slice();
} else {
int capacity = 0;
for (int i = 0; i < buffs.length; i++)
capacity += buffs[i].remaining();
Uint8ArrayNative array = Uint8ArrayNative.create(capacity);
int position = 0;
for (int i = 0; i < buffs.length; i++) {
GWTBuff buff = (GWTBuff) buffs[i];
array.set(buff.typed().subarray(buff.position(), buff.limit()), position);
position += buff.remaining();
}
buffer = array.buffer();
}
JavaScriptObject request = write(transaction, IndexedDB.BLOCKS, view.getKey(tick), buffer);
if (callback)
callback(request, view, uri, new long[] { tick }, buffs, removals);
if (removals != null)
for (int i = 0; i < removals.length; i++)
if (!Tick.isNull(removals[i]))
delete(_location.db(), IndexedDB.BLOCKS, view.getKey(removals[i]));
_ongoing++;
}