You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

178 lines
4.3 KiB

const DB_NAME = "SSEDB"
const OBJECT_STORE = "SSEData"
const KEY_SAVEDSEARCHES = "sse-savedsearches"
const DB_VERSION = 2
window.db = undefined
/**
* Initialize the database
* @returns
*/
function initDatabase() {
return new Promise(function (resolve, reject) {
// console.log("initDatabase called ", window.db)
if (window.db) {
resolve(window.db)
return
}
const request = indexedDB.open(DB_NAME, DB_VERSION)
request.onerror = (event) => {
reject(window.db)
console.error("Browser has no support for IndexedDB?!")
}
request.onsuccess = (event) => {
window.db = event.target.result
initializeDBHandlers()
resolve(window.db)
}
// This event is only implemented in recent browsers
request.onupgradeneeded = (event) => {
// Save the IDBDatabase interface
window.db = event.target.result
initializeDBStore(window.db, OBJECT_STORE)
resolve(window.db)
}
})
}
function initializeDBHandlers() {
window.db.onerror = (event) => {
console.error(`Database error: ${event.target.errorCode}`)
}
}
function initializeDBStore(db, storeName) {
if (!db.objectStoreNames.contains(storeName)) {
db.createObjectStore(storeName) // create it
}
}
/**
* Add data if doesn't exist
* @param {*} key -> Key
* @param {*} value -> Data
* @returns
*/
async function addData(key, value) {
return new Promise(async function (resolve, reject) {
/**
* Check data exist or not.
*/
let dataExist = false
try {
let data = await getData(key)
// console.log("Exist -> ", data)
dataExist = true
} catch (error) {
console.log("Doesn't exist")
dataExist = false
}
let transaction = window.db.transaction(OBJECT_STORE, "readwrite")
/**
* Add data into the db
*/
let request
if (dataExist) {
request = transaction.objectStore(OBJECT_STORE).put(value, key)
} else {
request = transaction.objectStore(OBJECT_STORE).add(value, key)
}
request.onerror = function (event) {
// ConstraintError occurs when an object with the same id already exists
if (request.error.name == "ConstraintError") {
console.log("Book with such id already exists") // handle the error
event.preventDefault() // don't abort the transaction
// use another key for the book?
} else {
// unexpected error, can't handle it
// the transaction will abort
}
}
request.onsuccess = function () {
resolve()
}
request.onerror = function () {
reject()
}
transaction.onabort = function () {
console.log("Error", transaction.error)
reject()
}
})
}
/**
* Get data for the key
* @param {*} key -> Key
*/
function getData(key) {
return new Promise(function (resolve, reject) {
let transaction = window.db.transaction(OBJECT_STORE, "readonly")
let store = transaction.objectStore(OBJECT_STORE)
let request = store.get(key)
request.onsuccess = function () {
resolve(request.result)
// console.log("Result: ", request.result)
}
request.onerror = function () {
console.log("Error: ", request.error)
reject(request.error)
}
})
}
/**
* Delete data for the key
* @param {*} key -> Key
*/
function deleteData(key) {
return new Promise(function (resolve, reject) {
let transaction = window.db.transaction(OBJECT_STORE, "readwrite")
let store = transaction.objectStore(OBJECT_STORE)
let request = store.delete(key)
request.onsuccess = function () {
resolve()
}
request.onerror = function () {
reject()
}
})
}
define([], function () {
return {
initDatabase,
addData,
deleteData,
getData,
KEY_SAVEDSEARCHES,
}
})
// return {
// initDatabase,
// addData,
// deleteData,
// getData
// }