import path from "path"; import os from "os"; import fs from "fs"; import sqlite3, {Database} from "sqlite3"; import {ImageComplete, SencondPassBusket, UploadResult} from "../Model"; import {CheckBucket} from "./CheckCache"; /** * 插图数据库 * */ export default class FigureSencondPassCache { private static sql_create_table = 'create table figure_sencond_pass_cache (' + 'plain_sha varchar PRIMARY KEY NOT NULL unique,' + 'creation_time varchar,' + 'duration_time varchar,' + 'bucket_name varchar,' + 'key varchar,' + 'url varchar,' + 'crypt_info_filesize varchar,' + 'crypt_info_key varchar,' + 'crypt_info_digest varchar,' + 'crypt_info_object_key_partial varchar,' + 'storage_time varchar' + ')'; private static sql_insert_status = 'insert into figure_sencond_pass_cache ' + '(plain_sha, creation_time, duration_time, bucket_name, key,url, crypt_info_filesize,crypt_info_key,crypt_info_digest,crypt_info_object_key_partial,storage_time)' + 'values (?,?,?,?,?,?,?,?,?,?,?)'; private static sql_delete_status = 'delete from figure_sencond_pass_cache where plain_sha = ? '; private static sql_query_status = 'select plain_sha, creation_time, duration_time, bucket_name, key,url, crypt_info_filesize,crypt_info_key,crypt_info_digest,crypt_info_object_key_partial,storage_time from figure_sencond_pass_cache where plain_sha = ?'; private static sql_querymin_status = 'select min(storage_time) from figure_sencond_pass_cache'; private _db: Database; 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 FigureSencondPassCache.initdb(dbfile); let obj = new FigureSencondPassCache(db); return obj; } private constructor(db: sqlite3.Database) { this._db = db; } async insert(bucket: FigureSencondPassBucket) { return new Promise((resolve, reject) => { let sql = FigureSencondPassCache.sql_insert_status; let values: any[] = [ /** 原来文件的摘要 */ bucket.plain_sha, /** 创建时间 */ bucket.creation_time, /** 存储时间 */ bucket.duration_time, /** 桶名称 */ bucket.bucket_name, /** 图片名称 */ bucket.Complete.Key, /** 图片url */ bucket.Complete.Url, /** 图片加密信息 */ bucket.Complete.cryptInfo.fileSize, bucket.Complete.cryptInfo.key, bucket.Complete.cryptInfo.digest, bucket.Complete.cryptInfo.objectKeyPartial, bucket.storage_time ]; this._db.run(sql, values, e => { if (e !== null) reject(e); else resolve(this); }); }); } delete(sha: string) { return new Promise((resolve, reject) => { let sql = FigureSencondPassCache.sql_delete_status; this._db.get(sql, sha, e => { if (e !== null) reject(e); else { resolve(this); }; }) }); } query(sha: string) { return new Promise((resolve, reject) => { let sql = FigureSencondPassCache.sql_query_status; this._db.get(sql, sha, (e, row) => { if (e !== null) reject(e); else { resolve(row); } }) }); } querymin() { return new Promise((resolve, reject) => { let sql = FigureSencondPassCache.sql_querymin_status; this._db.get(sql, (e, row) => { if (e !== null) reject(e); else { resolve(row); } }) }); } 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 = FigureSencondPassCache.sql_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); } }) }) }); } } /**缓存数据流结构 */ export interface FigureSencondPassBucket extends SencondPassBusket{ /** 原文件的摘要 */ plain_sha: string; /** 创建时间 */ creation_time: string; /** 存储时长 */ duration_time: string; /** 存储桶 */ bucket_name: string; /** 这里是返回的视频信息ID */ Complete : UploadResult; storage_time: string; }