由于找不到合适的数据存储插件, 暂停开发. 准备先开发一个 ts 的 indexedDB 插件

This commit is contained in:
hunlongyu
2020-01-15 16:19:58 +08:00
parent f05a361265
commit 36e1372f51
11 changed files with 182 additions and 152 deletions

View File

@@ -1,41 +0,0 @@
const videoSchema = {
version: 0,
type: 'object',
properties: {
name: {
type: 'string'
},
type: {
type: 'string'
},
time: {
type: 'string'
},
detail: {
type: 'string',
primary: true
},
urls: {
type: 'array'
},
index: {
type: 'number'
}
}
}
const settingSchema = {
version: 0,
type: 'object',
properties: {
theme: {
type: 'string',
default: 'light'
}
}
}
export {
videoSchema,
settingSchema
}

133
src/plugins/tinydb/Table.ts Normal file
View File

@@ -0,0 +1,133 @@
export class Table {
name: string
db: IDBDatabase
constructor (name: string, db:IDBDatabase) {
this.name = name
this.db = db
}
// create transaction
transaction (mode = true) {
return this.db.transaction([this.name], mode === true ? 'readwrite' : 'readonly')
}
// open or conntect this table
request () {
return this.transaction().objectStore(this.name)
}
// get
select (selector: any) {
let index: string
let indexValue: any
for (let name in selector) {
index = name
indexValue = selector[name]
}
return new Promise((resolve, reject) => {
const selectRequest = this.request().index(index).getAll(indexValue)
selectRequest.onsuccess = (e:any) => {
resolve(e.target.result)
}
selectRequest.onerror = (e:any) => {
reject(e.target.result)
}
})
}
selectId (id:number) {
return new Promise((resolve, reject) => {
const selectRequest = this.request().get(id)
selectRequest.onsuccess = (e:any) => {
resolve(e.target.result)
}
selectRequest.onerror = (e:any) => {
reject(e.target.result)
}
})
}
selectAll () {
return new Promise((resolve, reject) => {
const selectRequest = this.request().getAll()
selectRequest.onsuccess = (e:any) => {
resolve(e.target.result)
}
selectRequest.onerror = (e:any) => {
reject(e.target.result)
}
})
}
// some
some (index: any, start:any, end:any) {
return new Promise((resolve, reject) => {
const temp:any = []
const cursor = this.request().index(index)
const range = IDBKeyRange.bound(start, end)
cursor.openCursor(range).onsuccess = (ev:any) => {
const res = ev.target.result
if (res) {
temp.push(res.value)
res.continue()
} else {
resolve(temp)
}
}
cursor.openCursor(range).onerror = (ev: any) => {
reject(ev)
}
})
}
// put
update (data: any) {
return new Promise((resolve, reject) => {
const updateRequest = this.request().put(data)
updateRequest.onsuccess = (e:any) => {
resolve(e)
}
updateRequest.onerror = (e:any) => {
reject(e)
}
})
}
// add
insert (data: any) {
return new Promise((resolve, reject) => {
const addRequest = this.request().add(data)
addRequest.onsuccess = (e:any) => {
resolve(e)
}
addRequest.onerror = (e:any) => {
reject(e)
}
})
}
// get -> delete
delete (selector: any) {
return new Promise((resolve, reject) => {
this.select(selector).then((res: any) => {
if (res.length) {
res.forEach((item: any, index: any, arr: any) => {
const request = this.request()
const keyPath = request.keyPath as string
const deleteRequest = request.delete(item[keyPath])
deleteRequest.onsuccess = (e: any) => {
if (index === arr.length - 1) {
resolve(e)
}
}
deleteRequest.onerror = (e: any) => {
reject(e)
}
})
}
})
})
}
clear () {
return new Promise((resolve, reject) => {
const deleteRequest = this.request().clear()
deleteRequest.onsuccess = (e: any) => {
resolve(e)
}
deleteRequest.onerror = (e: any) => {
reject(e)
}
})
}
}

View File

@@ -0,0 +1,5 @@
import tiny from 'tinydb'
const db = {}
export default db

View File

@@ -0,0 +1,34 @@
export interface Database {
databaseName: string
tables: Array<DatabaseTable>
version?: number
}
export interface DatabaseTable {
name: string
keyPath: string
autoIncrement: boolean
indexs: Array<RuleIndex>
}
export interface RuleIndex {
index: string
relativeIndex: string
unique: boolean
}
export interface TinyDBRule {
db: IDBDatabase
name: string
version: number
table: IDBObjectStore
tables: Array<DatabaseTable>
connect(): Promise<IDBDatabase>
}
export interface TableFn {
select(): any
update(): any
insert(): any
delete(): any
}