|
4 | 4 | /* global Browser */ |
5 | 5 | /* global Awesomescreen */ |
6 | 6 | /* global IDBDatabaseException */ |
| 7 | +/* global IDBKeyRange */ |
7 | 8 |
|
8 | 9 | const DBOS_PLACES = 'sync_places'; |
9 | 10 | const DBOS_VISITS = 'sync_visits'; |
@@ -52,6 +53,15 @@ var SyncBrowserDB = { |
52 | 53 | }).bind(this)); |
53 | 54 | }, |
54 | 55 |
|
| 56 | + /** |
| 57 | + * Add a raw history entry to DBOS_PLACES store. |
| 58 | + * @param {String} history The history to be added |
| 59 | + * @param {Function} callback Runs when it finishs |
| 60 | + */ |
| 61 | + updateRawHistory: function browserDB_updateRawPlace(history, callback) { |
| 62 | + this.db.createRawHistory(history, callback); |
| 63 | + }, |
| 64 | + |
55 | 65 | /** |
56 | 66 | * Get a place by URI from DBOS_PLACES object store. |
57 | 67 | * @param {String} uri URI query parameter |
@@ -212,6 +222,14 @@ var SyncBrowserDB = { |
212 | 222 | }).bind(this)); |
213 | 223 | }, |
214 | 224 |
|
| 225 | + /** |
| 226 | + * Get history by timestamp range at (start < record.timestamp <= end) |
| 227 | + * @param {Function} callback Runs on success with an array of history |
| 228 | + */ |
| 229 | + getHistoryByTime: function browserDB_getHistoryByTime(start, end, callback) { |
| 230 | + this.db.getHistoryByTime(start, end, callback); |
| 231 | + }, |
| 232 | + |
215 | 233 | /** |
216 | 234 | * Delete a history by URI |
217 | 235 | * @param {String} uri URI |
@@ -532,6 +550,43 @@ SyncBrowserDB.db = { |
532 | 550 | }; |
533 | 551 | }, |
534 | 552 |
|
| 553 | + /** |
| 554 | + * Create a new raw entry of the history if there's none. |
| 555 | + * @param {String} history The history to be inserted |
| 556 | + * @param {Function} callback Runs when the entry exists or a new entry |
| 557 | + * created |
| 558 | + */ |
| 559 | + createRawHistory: function db_createRawHistory(history, callback) { |
| 560 | + var transaction = this._db.transaction([DBOS_VISITS], 'readwrite'); |
| 561 | + var objectStore = transaction.objectStore(DBOS_VISITS); |
| 562 | + var readRequest = objectStore.get(history.uri); |
| 563 | + readRequest.onsuccess = function onReadSuccess(event) { |
| 564 | + var existingPlace = event.target.result; |
| 565 | + var writeRequest; |
| 566 | + if (existingPlace) { |
| 567 | + existingPlace.title = history.title; |
| 568 | + existingPlace.timestamp = history.timestamp; |
| 569 | + writeRequest = objectStore.put(history); |
| 570 | + } else { |
| 571 | + writeRequest = objectStore.add(history); |
| 572 | + } |
| 573 | + |
| 574 | + writeRequest.onsuccess = function onWriteSuccess(event) { |
| 575 | + if (callback) { |
| 576 | + callback(); |
| 577 | + } |
| 578 | + }; |
| 579 | + |
| 580 | + writeRequest.onerror = function onError(event) { |
| 581 | + console.error('error writing history'); |
| 582 | + }; |
| 583 | + }; |
| 584 | + |
| 585 | + transaction.onerror = function dbTransactionError(e) { |
| 586 | + console.error('Transaction error while trying to save history ', history); |
| 587 | + }; |
| 588 | + }, |
| 589 | + |
535 | 590 | /** |
536 | 591 | * Save an places object store entry in database |
537 | 592 | * @param {Object} places A visits entry |
@@ -1277,6 +1332,48 @@ SyncBrowserDB.db = { |
1277 | 1332 | }; |
1278 | 1333 | }, |
1279 | 1334 |
|
| 1335 | + /** |
| 1336 | + * Get history by timestamp range at (start < record.timestamp <= end) |
| 1337 | + * @param {Number} start Start timestamp |
| 1338 | + * @param {Number} end End timestamp |
| 1339 | + * @param {Function} callback Runs on complete with an array of history |
| 1340 | + */ |
| 1341 | + getHistoryByTime: function db_getHistoryByTime(start, end, callback) { |
| 1342 | + var history = []; |
| 1343 | + var db = this._db; |
| 1344 | + |
| 1345 | + function makeVisitProcessor(visit) { |
| 1346 | + return function(e) { |
| 1347 | + var object = e.target.result; |
| 1348 | + if(object){ |
| 1349 | + visit.iconUri = object.iconUri; |
| 1350 | + }else{ |
| 1351 | + visit.iconUri = Awesomescreen.DEFAULT_FAVICON; |
| 1352 | + } |
| 1353 | + history.push(visit); |
| 1354 | + }; |
| 1355 | + } |
| 1356 | + |
| 1357 | + var transaction = db.transaction([DBOS_VISITS, DBOS_ICONS]); |
| 1358 | + var visitsStore = transaction.objectStore(DBOS_VISITS); |
| 1359 | + var objectStore = transaction.objectStore(DBOS_ICONS); |
| 1360 | + var visitsIndex = visitsStore.index('timestamp'); |
| 1361 | + var keyRange = IDBKeyRange.bound(start, end, true, false); |
| 1362 | + |
| 1363 | + visitsIndex.openCursor(keyRange, 'prev').onsuccess = |
| 1364 | + function onSuccess(e) { |
| 1365 | + var cursor = e.target.result; |
| 1366 | + if (cursor) { |
| 1367 | + var visit = cursor.value; |
| 1368 | + objectStore.get(visit.uri).onsuccess = makeVisitProcessor(visit); |
| 1369 | + cursor.continue(); |
| 1370 | + } |
| 1371 | + }; |
| 1372 | + transaction.oncomplete = function db_historyTransactionComplete() { |
| 1373 | + callback(history); |
| 1374 | + }; |
| 1375 | + }, |
| 1376 | + |
1280 | 1377 | /** |
1281 | 1378 | * Init the frequency(view count) of the specified URI, |
1282 | 1379 | * if the URI is in DBOS_PLACES. |
|
0 commit comments