import sqlite3, { Database, Statement } from 'sqlite3'; import os from 'os'; import path from 'path'; import fs from 'fs'; export default class TaskStatus { private static sql_create_table = 'create table checkpoint (' + 'md5 varchar PRIMARY KEY NOT NULL unique, ' + 'media_id varchar, ' + 'file_size mediumint, ' + 'object_key varchar, ' + 'part_size mediumint, ' + 'upload_id varchar )'; private static sql_insert_status = 'insert into checkpoint ' + '( md5, media_id, file_size, object_key, part_size, upload_id ) values (?,?,?,?,?,?)'; private static sql_delete_status = 'delete from checkpoint where md5 = ?'; private static sql_query_status = 'select md5,media_id,file_size,object_key,part_size,upload_id from checkpoint where md5 = ?'; private _db: Database; static async build() { let dbDir = path.join(os.tmpdir(), 'wl_status/'); let dbfile = path.join(dbDir, 'index.db'); //确保目录存在 if (!fs.existsSync(dbDir)) { fs.mkdirSync(dbDir); } let db = await TaskStatus.initdb(dbfile); let obj = new TaskStatus(db); return obj; } private constructor(db: sqlite3.Database) { this._db = db; } insert(checkpoint: StatusCheckpoint) { return new Promise((resolve, reject) => { let sql = TaskStatus.sql_insert_status; let values: any[] = [ checkpoint.md5, checkpoint.media_id, checkpoint.file_size, checkpoint.object_key, checkpoint.part_size, checkpoint.upload_id ]; this._db.run(sql, values, e => { if (e !== null) reject(e); else resolve(this); }); }); } delete(md5: string) { return new Promise((resolve, reject) => { let sql = TaskStatus.sql_delete_status; this._db.get(sql, md5, e => { if (e !== null) reject(e); else { resolve(this); }; }) }); } query(md5: string) { return new Promise((resolve, reject) => { let sql = TaskStatus.sql_query_status; this._db.get(sql, md5, (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 = TaskStatus.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 StatusCheckpoint { md5: string; media_id: string; file_size: number; object_key: string; part_size: number; upload_id: string; }