144 строки
4.2 KiB
JavaScript
144 строки
4.2 KiB
JavaScript
const INVALID_HISTORY_ID = -1;
|
|
|
|
function addHistoryItem(item, callback) {
|
|
queryDB((db) => {
|
|
let transaction = db.transaction(['history'], 'readwrite');
|
|
let historyStore = transaction.objectStore('history');
|
|
|
|
// Check if an item for this URI exists on this day
|
|
let currentDate = new Date();
|
|
let year = currentDate.getFullYear();
|
|
let month = currentDate.getMonth();
|
|
let date = currentDate.getDate();
|
|
let todayDate = new Date(year, month, date);
|
|
|
|
let existingItemsIndex = historyStore.index('stampedURI');
|
|
let lowerBound = [item.uri, todayDate];
|
|
let upperBound = [item.uri, currentDate];
|
|
let range = IDBKeyRange.bound(lowerBound, upperBound);
|
|
let request = existingItemsIndex.openCursor(range);
|
|
|
|
request.onsuccess = function(event) {
|
|
let cursor = event.target.result;
|
|
if (cursor) {
|
|
// There's an entry for this URI, update the item
|
|
cursor.value.timestamp = item.timestamp;
|
|
let updateRequest = cursor.update(cursor.value);
|
|
|
|
updateRequest.onsuccess = function(event) {
|
|
if (callback) {
|
|
callback(event.target.result.primaryKey);
|
|
}
|
|
};
|
|
} else {
|
|
// No entry for this URI, add item
|
|
let addItemRequest = historyStore.add(item);
|
|
|
|
addItemRequest.onsuccess = function(event) {
|
|
if (callback) {
|
|
callback(event.target.result);
|
|
}
|
|
};
|
|
}
|
|
};
|
|
|
|
});
|
|
}
|
|
|
|
function updateHistoryItem(id, item, callback) {
|
|
if (!id) {
|
|
return;
|
|
}
|
|
|
|
queryDB((db) => {
|
|
let transaction = db.transaction(['history'], 'readwrite');
|
|
let historyStore = transaction.objectStore('history');
|
|
let storedItemRequest = historyStore.get(id);
|
|
storedItemRequest.onsuccess = function(event) {
|
|
let storedItem = event.target.result;
|
|
item.timestamp = storedItem.timestamp;
|
|
|
|
let updateRequest = historyStore.put(item, id);
|
|
|
|
updateRequest.onsuccess = function(event) {
|
|
if (callback) {
|
|
callback();
|
|
}
|
|
};
|
|
};
|
|
|
|
});
|
|
}
|
|
|
|
function getHistoryItems(from, n, callback) {
|
|
if (n <= 0 || from < 0) {
|
|
if (callback) {
|
|
callback([]);
|
|
}
|
|
}
|
|
|
|
queryDB((db) => {
|
|
let transaction = db.transaction(['history']);
|
|
let historyStore = transaction.objectStore('history');
|
|
let timestampIndex = historyStore.index('timestamp');
|
|
let cursorRequest = timestampIndex.openCursor(null, 'prev');
|
|
|
|
let current = 0;
|
|
let items = [];
|
|
cursorRequest.onsuccess = function(event) {
|
|
let cursor = event.target.result;
|
|
|
|
if (!cursor || current >= from + n) {
|
|
if (callback) {
|
|
callback(items);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if (current >= from) {
|
|
items.push({
|
|
id: cursor.primaryKey,
|
|
item: cursor.value
|
|
});
|
|
}
|
|
|
|
++current;
|
|
cursor.continue();
|
|
};
|
|
});
|
|
}
|
|
|
|
function removeHistoryItem(id, callback) {
|
|
queryDB((db) => {
|
|
let transaction = db.transaction(['history'], 'readwrite');
|
|
let historyStore = transaction.objectStore('history');
|
|
let removeItemRequest = historyStore.delete(id);
|
|
|
|
removeItemRequest.onerror = function(event) {
|
|
console.log(`Could not remove history item with ID: ${id}`);
|
|
console.log(event.target.error.message);
|
|
};
|
|
|
|
removeItemRequest.onsuccess = function(event) {
|
|
if (callback) {
|
|
callback();
|
|
}
|
|
};
|
|
});
|
|
}
|
|
|
|
function clearHistory(callback) {
|
|
queryDB((db) => {
|
|
let transaction = db.transaction(['history'], 'readwrite');
|
|
let historyStore = transaction.objectStore('history');
|
|
let clearRequest = historyStore.clear();
|
|
|
|
clearRequest.onsuccess = function(event) {
|
|
if (callback) {
|
|
callback();
|
|
}
|
|
};
|
|
});
|
|
}
|