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
60 return60 return
61 61
62 store: (doc, data, onSuccess, onError) ->62 store: (doc, data, onSuccess, onError) ->
63 @db (db) ->63 @db (db) =>
64 unless db64 unless db
65 onError()65 onError()
66 return66 return
67 67
68 txn = db.transaction ['docs', doc.slug], 'readwrite'68 txn = db.transaction ['docs', doc.slug], 'readwrite'
69 txn.oncomplete = ->69 txn.oncomplete = =>
70 @cachedDocs?[doc.slug] = doc.mtime
70 if txn.error then onError() else onSuccess()71 if txn.error then onError() else onSuccess()
71 return72 return
72 73
@@ -80,13 +81,14 @@ class app.DB · 7 unmodified lines
80 return81 return
81 82
82 unstore: (doc, onSuccess, onError) ->83 unstore: (doc, onSuccess, onError) ->
83 @db (db) ->84 @db (db) =>
84 unless db85 unless db
85 onError()86 onError()
86 return87 return
87 88
88 txn = db.transaction ['docs', doc.slug], 'readwrite'89 txn = db.transaction ['docs', doc.slug], 'readwrite'
89 txn.oncomplete = ->90 txn.oncomplete = =>
91 delete @cachedDocs?[doc.slug]
90 if txn.error then onError() else onSuccess()92 if txn.error then onError() else onSuccess()
91 return93 return
92 94
@@ -99,6 +101,10 @@ class app.DB · 6 unmodified lines
99 return101 return
100 102
101 version: (doc, fn) ->103 version: (doc, fn) ->
104 if (version = @cachedVersion(doc))?
105 fn(version)
106 return
107
102 @db (db) ->108 @db (db) ->
103 unless db109 unless db
104 fn(false)110 fn(false)
@@ -113,7 +119,15 @@ class app.DB · 8 unmodified lines
113 return119 return
114 return120 return
115 121
122 cachedVersion: (doc) ->
123 return unless @cachedDocs
124 @cachedDocs[doc.slug] or false
125
116 versions: (docs, fn) ->126 versions: (docs, fn) ->
127 if versions = @cachedVersions(docs)
128 fn(versions)
129 return
130
117 @db (db) ->131 @db (db) ->
118 unless db132 unless db
119 fn(false)133 fn(false)
@@ -131,8 +145,14 @@ class app.DB · 11 unmodified lines
131 return145 return
132 return146 return
133 147
148 cachedVersions: (docs) ->
149 return unless @cachedDocs
150 result = {}
151 result[doc.slug] = @cachedVersion(doc) for doc in docs
152 result
153
134 load: (entry, onSuccess, onError) ->154 load: (entry, onSuccess, onError) ->
135 if @useIndexedDB155 if @shouldLoadWithIDB(entry)
136 onError = @loadWithXHR.bind(@, entry, onSuccess, onError)156 onError = @loadWithXHR.bind(@, entry, onSuccess, onError)
137 @loadWithIDB entry, onSuccess, onError157 @loadWithIDB entry, onSuccess, onError
138 else158 else
@@ -146,7 +166,7 @@ class app.DB · 7 unmodified lines
146 error: onError166 error: onError
147 167
148 loadWithIDB: (entry, onSuccess, onError) ->168 loadWithIDB: (entry, onSuccess, onError) ->
149 @db (db) ->169 @db (db) =>
150 unless db170 unless db
151 onError()171 onError()
152 return172 return
@@ -157,8 +177,25 @@ class app.DB · 4 unmodified lines
157 req = store.get(entry.path)177 req = store.get(entry.path)
158 req.onsuccess = -> if req.result then onSuccess(req.result) else onError()178 req.onsuccess = -> if req.result then onSuccess(req.result) else onError()
159 req.onerror = onError179 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
160 196
161 txn197 shouldLoadWithIDB: (entry) ->
198 @useIndexedDB and (not @cachedDocs or @cachedDocs[entry.doc.slug])
162 199
163 reset: ->200 reset: ->
164 try indexedDB?.deleteDatabase(NAME) catch201 try indexedDB?.deleteDatabase(NAME) catch