Lazy-load IndexedDB

pull/165/head
Thibaut 10 years ago
parent 9b1402cb71
commit ccf9171ccc

@ -61,7 +61,7 @@
bootOne: ->
@doc = new app.models.Doc @DOC
@docs.reset [@doc]
@doc.load @bootDB.bind(@), @onBootError.bind(@), readCache: true
@doc.load @start.bind(@), @onBootError.bind(@), readCache: true
new app.views.Notice 'singleDoc', @doc
delete @DOC
return
@ -72,21 +72,17 @@
(if docs.indexOf(doc.slug) >= 0 then @docs else @disabledDocs).add(doc)
@docs.sort()
@disabledDocs.sort()
@docs.load @bootDB.bind(@), @onBootError.bind(@), readCache: true, writeCache: true
@docs.load @start.bind(@), @onBootError.bind(@), readCache: true, writeCache: true
delete @DOCS
return
bootDB: ->
start: ->
for doc in @docs.all()
@entries.add doc.toEntry()
@entries.add type.toEntry() for type in doc.types.all()
@entries.add doc.entries.all()
@db = new app.DB()
@db.init(@start.bind(@))
return
start: ->
@trigger 'ready'
@router.start()
@hideLoading()

@ -4,14 +4,23 @@ class app.DB
constructor: ->
@useIndexedDB = @useIndexedDB()
init: (@_callback) ->
if @useIndexedDB
@initIndexedDB()
else
@callback()
db: (fn) ->
return fn @_db unless @useIndexedDB and @_db is undefined
if @callback isnt undefined
_callback = @callback
@callback = =>
_callback()
fn @_db
return
return
@callback = =>
@_db ?= false
delete @callback
fn @_db
return
initIndexedDB: ->
try
req = indexedDB.open(NAME, @indexedDBVersion())
req.onerror = @callback
@ -21,20 +30,12 @@ class app.DB
@callback()
return
isEnabled: ->
!!@db
callback: =>
@_callback?()
@_callback = null
return
onOpenSuccess: (event) =>
try
@db = event.target.result
@db.transaction(['docs', app.docs.all()[0].slug], 'readwrite').abort() # https://bugs.webkit.org/show_bug.cgi?id=136937
@_db = event.target.result
@_db.transaction(['docs', app.docs.all()[0].slug], 'readwrite').abort() # https://bugs.webkit.org/show_bug.cgi?id=136937
catch
@db = null
@_db = false
@callback()
return
@ -53,7 +54,12 @@ class app.DB
return
store: (doc, data, onSuccess, onError) ->
txn = @db.transaction ['docs', doc.slug], 'readwrite'
@db (db) ->
unless db
onError()
return
txn = db.transaction ['docs', doc.slug], 'readwrite'
txn.oncomplete = -> if txn.error then onError() else onSuccess()
store = txn.objectStore(doc.slug)
@ -63,9 +69,15 @@ class app.DB
store = txn.objectStore('docs')
store.put(doc.mtime, doc.slug)
return
return
unstore: (doc, onSuccess, onError) ->
txn = @db.transaction ['docs', doc.slug], 'readwrite'
@db (db) ->
unless db
onError()
return
txn = db.transaction ['docs', doc.slug], 'readwrite'
txn.oncomplete = -> if txn.error then onError() else onSuccess()
store = txn.objectStore(doc.slug)
@ -74,22 +86,29 @@ class app.DB
store = txn.objectStore('docs')
store.delete(doc.slug)
return
return
version: (doc, callback) ->
txn = @db.transaction ['docs'], 'readonly'
version: (doc, fn) ->
@db (db) ->
unless db
fn(false)
return
txn = db.transaction ['docs'], 'readonly'
store = txn.objectStore('docs')
req = store.get(doc.slug)
req.onsuccess = -> callback(!!req.result)
req.onerror = -> callback(false)
req.onsuccess = -> fn(!!req.result)
req.onerror = -> fn(false)
return
return
load: (entry, onSuccess, onError) ->
if @isEnabled()
if @useIndexedDB and @_db isnt false
onError = @loadWithXHR.bind(@, entry, onSuccess, onError)
@loadWithIDB(entry, onSuccess, onError)
@loadWithIDB entry, onSuccess, onError
else
@loadWithXHR(entry, onSuccess, onError)
@loadWithXHR entry, onSuccess, onError
loadWithXHR: (entry, onSuccess, onError) ->
ajax
@ -99,7 +118,12 @@ class app.DB
error: onError
loadWithIDB: (entry, onSuccess, onError) ->
txn = @db.transaction [entry.doc.slug], 'readonly'
@db (db) ->
unless db
onError()
return
txn = db.transaction [entry.doc.slug], 'readonly'
store = txn.objectStore(entry.doc.slug)
req = store.get(entry.path)

Loading…
Cancel
Save