devfty
Version:
Devfty is a library for developer building low code factory
174 lines (163 loc) • 5.9 kB
text/typescript
import DB_BASE from './base'
export default class PB_TABLE {
db: DB_BASE // 数据库
name: string // 表名
keyField: string // 主键字段
constructor(db: DB_BASE, tableName: string, keyField: string) {
this.db = db
this.name = tableName
this.keyField = keyField
if (!db.getTableData(tableName)) {
db.setTableData(tableName, {})
}
}
insert(data: any) {
const key = data?.[this.keyField]
if (!key) return { code: -1, msg: '主键不存在' }
const pb_table = this.db.getTableData(this.name)
if (pb_table[key]) {
return { code: -2, msg: `主键【${key}】重复` }
}
pb_table[key] = data
this.db.setTableData(this.name, pb_table)
return { code: 0, msg: '' }
}
batchInsert(data: any) {
if (!Array.isArray(data)) return { code: -1, msg: '数据不存在' }
let res = { code: 0, msg: '' }
const pb_table = this.db.getTableData(this.name)
for (let i = 0; i < data.length; i++) {
const row = data[i]
const key = row?.[this.keyField]
if (!key) {
res = { code: -1, msg: '主键不存在' }
break
}
if (pb_table[key]) {
res = { code: -2, msg: `主键【${key}】重复` }
break
}
pb_table[key] = row
}
if (res.code !== 0) {
return res
}
this.db.setTableData(this.name, pb_table)
return res
}
delete(data: any) {
const key = data?.[this.keyField]
const pb_table = this.db.getTableData(this.name)
if (!key) {
return { code: -1, msg: '主键不存在' }
}
if (!pb_table[key]) {
return { code: -2, msg: `记录【${key}】不存在` }
}
delete pb_table[key]
this.db.setTableData(this.name, pb_table)
return { code: 0, msg: '' }
}
batchDelete(data: any) {
if (!Array.isArray(data)) return { code: -1, msg: '数据不存在' }
let res = { code: 0, msg: '' }
const pb_table = this.db.getTableData(this.name)
for (let i = 0; i < data.length; i++) {
const row = data[i]
const key = row?.[this.keyField]
if (!key) {
res = { code: -1, msg: '主键不存在' }
break
}
if (!pb_table[key]) {
return { code: -2, msg: `记录【${key}】不存在` }
}
delete pb_table[key]
}
if (res.code !== 0) {
return res
}
this.db.setTableData(this.name, pb_table)
return res
}
select(key?: any) {
const pb_table: any = this.db.getTableData(this.name)
const list: any[] = []
if (typeof key === 'string' || typeof key === 'number') {
if (!pb_table[key]) {
return { code: -2, msg: `记录【${key}】不存在` }
}
list.push(pb_table[key])
} else {
let o = key
if (Array.isArray(o)) {
const arr = o
o = {}
arr.reduce((a, b) => {
a['name'] = b.value
return 1
}, o)
}
for (const key in pb_table) {
const row = pb_table[key]
let flag: any = undefined
if (typeof o === 'function') {
flag = o(row, key)
} else if (typeof o === 'object' && Object.keys(o).length > 0) {
let equal = true
for (const name in o) {
if (row[name] && o[name] && `${row[name]}`.indexOf(`${o[name]}`) == -1) {
equal = false
break
}
}
flag = equal
}
if (flag === undefined || flag) {
list.push(pb_table[key])
}
}
}
return { code: 0, msg: '', data: list }
}
update(data: any) {
const key = data?.[this.keyField]
const pb_table = this.db.getTableData(this.name)
if (!pb_table[key]) {
return { code: -2, msg: `记录【${key}】不存在` }
}
const { code } = pb_table[key]
const newData = { ...pb_table[key], ...data, code }
pb_table[key] = newData
this.db.setTableData(this.name, pb_table)
return { code: 0, msg: '', data: newData }
}
batchUpdate(data: any) {
if (!Array.isArray(data)) return { code: -1, msg: '数据不存在' }
let res = { code: 0, msg: '' }
const pb_table = this.db.getTableData(this.name)
for (let i = 0; i < data.length; i++) {
const row = data[i]
const key = row?.[this.keyField]
if (!key) {
res = { code: -1, msg: '主键不存在' }
break
}
const oldRow = pb_table[key]
if (!oldRow) {
console.log(`[warning] batchUpdate 记录【${key}】不存在`, row)
// return { code: -2, msg: `记录【${key}】不存在` }
pb_table[key] = row
continue
}
const { code } = oldRow
const newRow = { ...oldRow, ...row, code }
pb_table[key] = newRow
}
if (res.code !== 0) {
return res
}
this.db.setTableData(this.name, pb_table)
return res
}
}