History

Improve IndexedDB error handling

Thibaut committed 11 years ago

Commit 58a463d1 parent eecbade1 file · +34 −12Browse files

Unified · Split

assets/javascripts/app/db.coffee+34−12
@@ -25,7 +25,7 @@ class app.DB · 24 unmodified lines
2525 try
2626 db = event.target.result
2727 unless @checkedBuggyIDB
28− db.transaction(['docs', app.docs.all()[0].slug], 'readwrite').abort() # https://bugs.webkit.org/show_bug.cgi?id=136937
28+ @idbTransaction(db, stores: ['docs', app.docs.all()[0].slug], mode: 'readwrite').abort() # https://bugs.webkit.org/show_bug.cgi?id=136937
2929 @checkedBuggyIDB = true
3030 catch
3131 try db.close()
@@ -66,10 +66,14 @@ class app.DB · 34 unmodified lines
6666 onError()
6767 return
6868
69− txn = db.transaction ['docs', doc.slug], 'readwrite'
69+ txn = @idbTransaction db, stores: ['docs', doc.slug], mode: 'readwrite', ignoreError: false
7070 txn.oncomplete = =>
7171 @cachedDocs?[doc.slug] = doc.mtime
72− if txn.error then onError() else onSuccess()
72+ onSuccess()
73+ return
74+ txn.onerror = (event) ->
75+ event.preventDefault()
76+ onError(event)
7377 return
7478
7579 store = txn.objectStore(doc.slug)
@@ -87,10 +91,14 @@ class app.DB · 11 unmodified lines
8791 onError()
8892 return
8993
90− txn = db.transaction ['docs', doc.slug], 'readwrite'
94+ txn = @idbTransaction db, stores: ['docs', doc.slug], mode: 'readwrite', ignoreError: false
9195 txn.oncomplete = =>
9296 delete @cachedDocs?[doc.slug]
93− if txn.error then onError() else onSuccess()
97+ onSuccess()
98+ return
99+ txn.onerror = (event) ->
100+ event.preventDefault()
101+ onError(event)
94102 return
95103
96104 store = txn.objectStore(doc.slug)
@@ -106,12 +114,12 @@ class app.DB · 9 unmodified lines
106114 fn(version)
107115 return
108116
109− @db (db) ->
117+ @db (db) =>
110118 unless db
111119 fn(false)
112120 return
113121
114− txn = db.transaction ['docs'], 'readonly'
122+ txn = @idbTransaction db, stores: ['docs'], mode: 'readonly'
115123 store = txn.objectStore('docs')
116124
117125 req = store.get(doc.slug)
@@ -134,13 +142,15 @@ class app.DB · 16 unmodified lines
134142 fn(versions)
135143 return
136144
137− @db (db) ->
145+ @db (db) =>
138146 unless db
139147 fn(false)
140148 return
141149
142− txn = db.transaction ['docs'], 'readonly'
143− txn.oncomplete = -> fn(result)
150+ txn = @idbTransaction db, stores: ['docs'], mode: 'readonly'
151+ txn.oncomplete = ->
152+ fn(result)
153+ return
144154 store = txn.objectStore('docs')
145155 result = {}
146156
@@ -182,7 +192,7 @@ class app.DB · 35 unmodified lines
182192 onError()
183193 return
184194
185− txn = db.transaction [entry.doc.slug], 'readonly'
195+ txn = @idbTransaction db, stores: [entry.doc.slug], mode: 'readonly'
186196 store = txn.objectStore(entry.doc.slug)
187197
188198 req = store.get(entry.dbPath())
@@ -199,7 +209,7 @@ class app.DB · 10 unmodified lines
199209 loadDocsCache: (db) ->
200210 @cachedDocs = {}
201211
202− txn = db.transaction ['docs'], 'readonly'
212+ txn = @idbTransaction db, stores: ['docs'], mode: 'readonly'
203213 store = txn.objectStore('docs')
204214
205215 req = store.openCursor()
@@ -216,6 +226,18 @@ class app.DB · 10 unmodified lines
216226 shouldLoadWithIDB: (entry) ->
217227 @useIndexedDB and (not @cachedDocs or @cachedDocs[entry.doc.slug])
218228
229+ idbTransaction: (db, options) ->
230+ txn = db.transaction(options.stores, options.mode)
231+ unless options.ignoreError is false
232+ txn.onerror = (event) ->
233+ event.preventDefault()
234+ return
235+ unless options.ignoreAbort is false
236+ txn.onabort = (event) ->
237+ event.preventDefault()
238+ return
239+ txn
240+
219241 reset: ->
220242 try indexedDB?.deleteDatabase(NAME) catch
221243 return