import sqlite3, {Database} from "sqlite3"; import path from "path"; import os from "os"; import fs from "fs"; import CheckCache from "./CheckCache"; /** * @brief 设置续传缓存机制 * 初始化的时候执行一次 之后每一个小时执行一次 */ export default class TimeCache { /** * @brief 上次删除当时间 * @function sql_delect_insert_status 插入上次删除的时间信息 * @function sql_delecttime_create_table 创建时间轴的表 * @function sql_delecttime_query_status 查询删除时间 * @function sql_delecttime_update_status 刷新删除时间 * */ private static sql_delecttime_create_table = 'create table time_table ( time_name varchar PRIMARY KEY NOT NULL unique, time_value varchar)'; private static sql_delecttime_insert_status = 'insert into time_table (time_name, time_value) values (?,?)'; private static sql_delecttime_query_status = 'select time_value from time_table where time_name = ?'; private static sql_delecttime_update_status = 'update time_table set time_value = ? where time_name = ?'; private static sql_delecttime_delect_status = 'delete from time_table where time_name = ?'; /** * @breif 自动过期逻辑的触发器 * */ private static sql_trigger_status = ''; private _db: Database; private constructor(db: sqlite3.Database) { this._db = db; } static async build() { let dbDir = path.join(os.tmpdir(), 'wl_cache/'); let dbfile = path.join(dbDir, 'index.db'); console.log("The database file:" + dbfile + " will be created."); //确保目录存在 if (!fs.existsSync(dbDir)) { fs.mkdirSync(dbDir); } let db = await TimeCache.initdb(dbfile); let obj = new TimeCache(db); return obj; } /** * @brief 触发器 设置数据库自动过期 * * */ private static initdb(dbfile: string) { return new Promise((resolve, reject) => { let db = new sqlite3.Database(dbfile, err => { if (err !== null) { console.error(dbfile + ' open failure!'); reject(err); } let sql = TimeCache.sql_delecttime_create_table; db.run(sql, e => { if (e !== null) { if ((e as any).errno === 1) { console.debug(e.message); resolve(db); } else { reject(e); } } else { resolve(db); } }) }) }); } insert(bucket: TimeBucket) { return new Promise((resolve, reject) => { let sql = TimeCache.sql_delecttime_insert_status; let values: any[] = [ bucket.time_name, bucket.time_value ]; this._db.run(sql, values, e => { if (e !== null) reject(e); else resolve(this); }); }); } query(sha: string) { return new Promise((resolve, reject) => { let sql = TimeCache.sql_delecttime_query_status; this._db.get(sql, sha, (e, row) => { if (e !== null) reject(e); else { resolve(row); } }) }); } delete(sha: string) { return new Promise((resolve, reject) => { let sql = TimeCache.sql_delecttime_delect_status; this._db.get(sql, sha, e => { if (e !== null) reject(e); else { resolve(this); } ; }) }); } update(bucket: TimeBucket) { return new Promise((resolve, reject) => { let sql = TimeCache.sql_delecttime_update_status; let values: any[] = [ bucket.time_name, bucket.time_value ]; this._db.run(sql, values, e => { if (e !== null) reject(e); else resolve(this); }); }); } } /** 续传信息 */ export interface TimeBucket{ time_name: string; time_value: string; }