import path from "path"; import os from "os"; import fs from "fs"; import sqlite3, {Database} from "sqlite3"; import {CryptContentResult, SencondPassBusket, UploadResult, VideoComplete} from "../Model"; import {CheckBucket} from "./CheckCache"; export default class VedioSencondPassCache { private static sql_create_table = 'create table vedio_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,' + 'cover_key varchar,' + 'cover_url varchar,' + 'cover_crypt_info_filesize varchar,' + 'cover_crypt_info_key varchar,' + 'cover_crypt_info_digest varchar,' + 'storage_time varchar' + ')'; private static sql_insert_status = 'insert into vedio_sencond_pass_cache ' + '(plain_sha, ' + 'creation_time, ' + 'duration_time, ' + 'bucket_name, ' + 'key,' + 'url, ' + 'crypt_info_filesize,' + 'crypt_info_key,' + 'crypt_info_digest,' + 'cover_key ,cover_url ,cover_crypt_info_filesize,cover_crypt_info_key ,cover_crypt_info_digest,' + 'storage_time' + ')' + 'values (' + '?,?,?,?,?,' + '?,?,?,?,?,' + '?,?,?,?,?)'; private static sql_delete_status = 'delete from vedio_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,cover_key,cover_url,cover_crypt_info_filesize,cover_crypt_info_key ,cover_crypt_info_digest,storage_time from vedio_sencond_pass_cache where plain_sha = ?'; private static sql_querymin_status = 'select min(storage_time) from vedio_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 VedioSencondPassCache.initdb(dbfile); let obj = new VedioSencondPassCache(db); return obj; } private constructor(db: sqlite3.Database) { this._db = db; } insert(bucket: VedioSencondPassBucket) { return new Promise((resolve, reject) => { let sql = VedioSencondPassCache.sql_insert_status; let values: any[] = [ /** 视频源文件的摘要 */ bucket.plain_sha, /** 创建时间 */ bucket.creation_time, /** 存储时间 */ bucket.duration_time, /** 存储桶名称 */ bucket.bucket_name, /** 桶名称 */ //bucket.Complete.Bucket, /** 视频名称 */ bucket.Complete.Key, /** 视频url */ bucket.Complete.Url, /** 加密信息(当设置加密时返回) */ bucket.Complete.cryptInfo.fileSize, bucket.Complete.cryptInfo.key, bucket.Complete.cryptInfo.digest, //bucket.Complete.cryptInfo.objectKeyPartial, /** 图片名称 */ bucket.CoverComplete.Key, /** 图片url */ bucket.CoverComplete.Url, /** 加密信息(当设置加密时返回) */ bucket.CoverComplete.cryptInfo.fileSize, bucket.CoverComplete.cryptInfo.key, bucket.CoverComplete.cryptInfo.digest, bucket.storage_time //bucket.CoverComplete.cryptInfo.objectKeyPartial ]; this._db.run(sql, values, e => { if (e !== null) reject(e); else resolve(this); }); }); } delete(sha: string) { return new Promise((resolve, reject) => { let sql = VedioSencondPassCache.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 = VedioSencondPassCache.sql_query_status; this._db.get(sql, sha, (e, row) => { if (e !== null) reject(e); else { console.log(row); resolve(row); } }) }); } querymin() { return new Promise((resolve, reject) => { let sql = VedioSencondPassCache.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 = VedioSencondPassCache.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 VedioSencondPassBucket extends SencondPassBusket{ /** 原文件的摘要 */ plain_sha: string; /** 创建时间 */ creation_time: string; /** 存储时长 */ duration_time: string; /** 存储桶 */ bucket_name: string; /** 这里是返回的视频信息ID */ Complete : UploadResult; /** 这里返回的是封面的ID信息 */ CoverComplete : UploadResult; storage_time: string; }