History

Cache the 'docs' IDB store in memory

Thibaut committed 11 years ago

Commit 6e54d921 parent d5e69451 file · +44 −7Browse files

Unified · Split

assets/javascripts/app/db.coffee+44−7
@@ -60,13 +60,14 @@ class app.DB · 59 unmodified lines
6060 return
6161
6262 store: (doc, data, onSuccess, onError) ->
63− @db (db) ->
63+ @db (db) =>
6464 unless db
6565 onError()
6666 return
6767
6868 txn = db.transaction ['docs', doc.slug], 'readwrite'
69− txn.oncomplete = ->
69+ txn.oncomplete = =>
70+ @cachedDocs?[doc.slug] = doc.mtime
7071 if txn.error then onError() else onSuccess()
7172 return
7273
@@ -80,13 +81,14 @@ class app.DB · 7 unmodified lines
8081 return
8182
8283 unstore: (doc, onSuccess, onError) ->
83− @db (db) ->
84+ @db (db) =>
8485 unless db
8586 onError()
8687 return
8788
8889 txn = db.transaction ['docs', doc.slug], 'readwrite'
89− txn.oncomplete = ->
90+ txn.oncomplete = =>
91+ delete @cachedDocs?[doc.slug]
9092 if txn.error then onError() else onSuccess()
9193 return
9294
@@ -99,6 +101,10 @@ class app.DB · 6 unmodified lines
99101 return
100102
101103 version: (doc, fn) ->
104+ if (version = @cachedVersion(doc))?
105+ fn(version)
106+ return
107+
102108 @db (db) ->
103109 unless db
104110 fn(false)
@@ -113,7 +119,15 @@ class app.DB · 8 unmodified lines
113119 return
114120 return
115121
122+ cachedVersion: (doc) ->
123+ return unless @cachedDocs
124+ @cachedDocs[doc.slug] or false
125+
116126 versions: (docs, fn) ->
127+ if versions = @cachedVersions(docs)
128+ fn(versions)
129+ return
130+
117131 @db (db) ->
118132 unless db
119133 fn(false)
@@ -131,8 +145,14 @@ class app.DB · 11 unmodified lines
131145 return
132146 return
133147
148+ cachedVersions: (docs) ->
149+ return unless @cachedDocs
150+ result = {}
151+ result[doc.slug] = @cachedVersion(doc) for doc in docs
152+ result
153+
134154 load: (entry, onSuccess, onError) ->
135− if @useIndexedDB
155+ if @shouldLoadWithIDB(entry)
136156 onError = @loadWithXHR.bind(@, entry, onSuccess, onError)
137157 @loadWithIDB entry, onSuccess, onError
138158 else
@@ -146,7 +166,7 @@ class app.DB · 7 unmodified lines
146166 error: onError
147167
148168 loadWithIDB: (entry, onSuccess, onError) ->
149− @db (db) ->
169+ @db (db) =>
150170 unless db
151171 onError()
152172 return
@@ -157,8 +177,25 @@ class app.DB · 4 unmodified lines
157177 req = store.get(entry.path)
158178 req.onsuccess = -> if req.result then onSuccess(req.result) else onError()
159179 req.onerror = onError
180+ @loadDocsCache(db) unless @cachedDocs
181+ return
182+
183+ loadDocsCache: (db) ->
184+ @cachedDocs = {}
185+
186+ txn = db.transaction ['docs'], 'readonly'
187+ store = txn.objectStore('docs')
188+
189+ req = store.openCursor()
190+ req.onsuccess = (event) =>
191+ return unless cursor = event.target.result
192+ @cachedDocs[cursor.key] = cursor.value
193+ cursor.continue()
194+ return
195+ return
160196
161− txn
197+ shouldLoadWithIDB: (entry) ->
198+ @useIndexedDB and (not @cachedDocs or @cachedDocs[entry.doc.slug])
162199
163200 reset: ->
164201 try indexedDB?.deleteDatabase(NAME) catch