Unified · Split
| @@ -60,13 +60,14 @@ class app.DB · 59 unmodified lines | |||
| 60 | return | 60 | return |
| 61 | 61 | ||
| 62 | store: (doc, data, onSuccess, onError) -> | 62 | store: (doc, data, onSuccess, onError) -> |
| 63 | @db (db) -> | 63 | @db (db) => |
| 64 | unless db | 64 | unless db |
| 65 | onError() | 65 | onError() |
| 66 | return | 66 | 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 | return | 72 | return |
| 72 | 73 | ||
| @@ -80,13 +81,14 @@ class app.DB · 7 unmodified lines | |||
| 80 | return | 81 | return |
| 81 | 82 | ||
| 82 | unstore: (doc, onSuccess, onError) -> | 83 | unstore: (doc, onSuccess, onError) -> |
| 83 | @db (db) -> | 84 | @db (db) => |
| 84 | unless db | 85 | unless db |
| 85 | onError() | 86 | onError() |
| 86 | return | 87 | 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 | return | 93 | return |
| 92 | 94 | ||
| @@ -99,6 +101,10 @@ class app.DB · 6 unmodified lines | |||
| 99 | return | 101 | 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 db | 109 | unless db |
| 104 | fn(false) | 110 | fn(false) |
| @@ -113,7 +119,15 @@ class app.DB · 8 unmodified lines | |||
| 113 | return | 119 | return |
| 114 | return | 120 | 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 db | 132 | unless db |
| 119 | fn(false) | 133 | fn(false) |
| @@ -131,8 +145,14 @@ class app.DB · 11 unmodified lines | |||
| 131 | return | 145 | return |
| 132 | return | 146 | 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 @useIndexedDB | 155 | if @shouldLoadWithIDB(entry) |
| 136 | onError = @loadWithXHR.bind(@, entry, onSuccess, onError) | 156 | onError = @loadWithXHR.bind(@, entry, onSuccess, onError) |
| 137 | @loadWithIDB entry, onSuccess, onError | 157 | @loadWithIDB entry, onSuccess, onError |
| 138 | else | 158 | else |
| @@ -146,7 +166,7 @@ class app.DB · 7 unmodified lines | |||
| 146 | error: onError | 166 | error: onError |
| 147 | 167 | ||
| 148 | loadWithIDB: (entry, onSuccess, onError) -> | 168 | loadWithIDB: (entry, onSuccess, onError) -> |
| 149 | @db (db) -> | 169 | @db (db) => |
| 150 | unless db | 170 | unless db |
| 151 | onError() | 171 | onError() |
| 152 | return | 172 | 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 = onError | 179 | 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 | txn | 197 | shouldLoadWithIDB: (entry) -> |
| 198 | @useIndexedDB and (not @cachedDocs or @cachedDocs[entry.doc.slug]) | ||
| 162 | 199 | ||
| 163 | reset: -> | 200 | reset: -> |
| 164 | try indexedDB?.deleteDatabase(NAME) catch | 201 | try indexedDB?.deleteDatabase(NAME) catch |