History

Lazy-load IndexedDB

Thibaut committed 11 years ago

Commit ccf91711 parent 9b1402c2 files · +73 −53Browse files

Unified · Split

2 files
  1. assets/javascripts/app/app.coffee +3 −7
  2. assets/javascripts/app/db.coffee +70 −46
assets/javascripts/app/app.coffee+3−7
@@ -61,7 +61,7 @@ · 60 unmodified lines
6161 bootOne: ->
6262 @doc = new app.models.Doc @DOC
6363 @docs.reset [@doc]
64− @doc.load @bootDB.bind(@), @onBootError.bind(@), readCache: true
64+ @doc.load @start.bind(@), @onBootError.bind(@), readCache: true
6565 new app.views.Notice 'singleDoc', @doc
6666 delete @DOC
6767 return
@@ -72,21 +72,17 @@ · 4 unmodified lines
7272 (if docs.indexOf(doc.slug) >= 0 then @docs else @disabledDocs).add(doc)
7373 @docs.sort()
7474 @disabledDocs.sort()
75− @docs.load @bootDB.bind(@), @onBootError.bind(@), readCache: true, writeCache: true
75+ @docs.load @start.bind(@), @onBootError.bind(@), readCache: true, writeCache: true
7676 delete @DOCS
7777 return
7878
79− bootDB: ->
79+ start: ->
8080 for doc in @docs.all()
8181 @entries.add doc.toEntry()
8282 @entries.add type.toEntry() for type in doc.types.all()
8383 @entries.add doc.entries.all()
8484
8585 @db = new app.DB()
86− @db.init(@start.bind(@))
87− return
88−
89− start: ->
9086 @trigger 'ready'
9187 @router.start()
9288 @hideLoading()
assets/javascripts/app/db.coffee+70−46
@@ -4,14 +4,23 @@ class app.DB · 3 unmodified lines
44 constructor: ->
55 @useIndexedDB = @useIndexedDB()
66
7− init: (@_callback) ->
8− if @useIndexedDB
9− @initIndexedDB()
10− else
11− @callback()
12− return
7+ db: (fn) ->
8+ return fn @_db unless @useIndexedDB and @_db is undefined
9+
10+ if @callback isnt undefined
11+ _callback = @callback
12+ @callback = =>
13+ _callback()
14+ fn @_db
15+ return
16+ return
17+
18+ @callback = =>
19+ @_db ?= false
20+ delete @callback
21+ fn @_db
22+ return
1323
14− initIndexedDB: ->
1524 try
1625 req = indexedDB.open(NAME, @indexedDBVersion())
1726 req.onerror = @callback
@@ -21,20 +30,12 @@ class app.DB · 3 unmodified lines
2130 @callback()
2231 return
2332
24− isEnabled: ->
25− !!@db
26−
27− callback: =>
28− @_callback?()
29− @_callback = null
30− return
31−
3233 onOpenSuccess: (event) =>
3334 try
34− @db = event.target.result
35− @db.transaction(['docs', app.docs.all()[0].slug], 'readwrite').abort() # https://bugs.webkit.org/show_bug.cgi?id=136937
35+ @_db = event.target.result
36+ @_db.transaction(['docs', app.docs.all()[0].slug], 'readwrite').abort() # https://bugs.webkit.org/show_bug.cgi?id=136937
3637 catch
37− @db = null
38+ @_db = false
3839
3940 @callback()
4041 return
@@ -53,43 +54,61 @@ class app.DB · 12 unmodified lines
5354 return
5455
5556 store: (doc, data, onSuccess, onError) ->
56− txn = @db.transaction ['docs', doc.slug], 'readwrite'
57− txn.oncomplete = -> if txn.error then onError() else onSuccess()
57+ @db (db) ->
58+ unless db
59+ onError()
60+ return
61+
62+ txn = db.transaction ['docs', doc.slug], 'readwrite'
63+ txn.oncomplete = -> if txn.error then onError() else onSuccess()
5864
59− store = txn.objectStore(doc.slug)
60− store.clear()
61− store.add(content, path) for path, content of data
65+ store = txn.objectStore(doc.slug)
66+ store.clear()
67+ store.add(content, path) for path, content of data
6268
63− store = txn.objectStore('docs')
64− store.put(doc.mtime, doc.slug)
69+ store = txn.objectStore('docs')
70+ store.put(doc.mtime, doc.slug)
71+ return
6572 return
6673
6774 unstore: (doc, onSuccess, onError) ->
68− txn = @db.transaction ['docs', doc.slug], 'readwrite'
69− txn.oncomplete = -> if txn.error then onError() else onSuccess()
75+ @db (db) ->
76+ unless db
77+ onError()
78+ return
79+
80+ txn = db.transaction ['docs', doc.slug], 'readwrite'
81+ txn.oncomplete = -> if txn.error then onError() else onSuccess()
7082
71− store = txn.objectStore(doc.slug)
72− store.clear()
83+ store = txn.objectStore(doc.slug)
84+ store.clear()
7385
74− store = txn.objectStore('docs')
75− store.delete(doc.slug)
86+ store = txn.objectStore('docs')
87+ store.delete(doc.slug)
88+ return
7689 return
7790
78− version: (doc, callback) ->
79− txn = @db.transaction ['docs'], 'readonly'
80− store = txn.objectStore('docs')
91+ version: (doc, fn) ->
92+ @db (db) ->
93+ unless db
94+ fn(false)
95+ return
8196
82− req = store.get(doc.slug)
83− req.onsuccess = -> callback(!!req.result)
84− req.onerror = -> callback(false)
97+ txn = db.transaction ['docs'], 'readonly'
98+ store = txn.objectStore('docs')
99+
100+ req = store.get(doc.slug)
101+ req.onsuccess = -> fn(!!req.result)
102+ req.onerror = -> fn(false)
103+ return
85104 return
86105
87106 load: (entry, onSuccess, onError) ->
88− if @isEnabled()
107+ if @useIndexedDB and @_db isnt false
89108 onError = @loadWithXHR.bind(@, entry, onSuccess, onError)
90− @loadWithIDB(entry, onSuccess, onError)
109+ @loadWithIDB entry, onSuccess, onError
91110 else
92− @loadWithXHR(entry, onSuccess, onError)
111+ @loadWithXHR entry, onSuccess, onError
93112
94113 loadWithXHR: (entry, onSuccess, onError) ->
95114 ajax
@@ -99,14 +118,19 @@ class app.DB · 3 unmodified lines
99118 error: onError
100119
101120 loadWithIDB: (entry, onSuccess, onError) ->
102− txn = @db.transaction [entry.doc.slug], 'readonly'
103− store = txn.objectStore(entry.doc.slug)
121+ @db (db) ->
122+ unless db
123+ onError()
124+ return
125+
126+ txn = db.transaction [entry.doc.slug], 'readonly'
127+ store = txn.objectStore(entry.doc.slug)
104128
105− req = store.get(entry.path)
106− req.onsuccess = -> if req.result then onSuccess(req.result) else onError()
107− req.onerror = onError
129+ req = store.get(entry.path)
130+ req.onsuccess = -> if req.result then onSuccess(req.result) else onError()
131+ req.onerror = onError
108132
109− txn
133+ txn
110134
111135 reset: ->
112136 try indexedDB?.deleteDatabase(NAME) catch