diff --git a/db.ts b/db.ts index 7f58175..7abbae9 100644 --- a/db.ts +++ b/db.ts @@ -52,7 +52,25 @@ export type GMetaRaw = { first_gid: number | null; first_key: string | null; }; -const ALL_TABLES = ["version"]; +export type PMeta = { + gid: number; + index: number; + token: string; + name: string; + width: number; + height: number; + is_original: boolean; +}; +export type PMetaRaw = { + gid: number; + index: number; + token: string; + name: string; + width: number; + height: number; + is_original: number; +}; +const ALL_TABLES = ["version", "task", "gmeta", "pmeta"]; const VERSION_TABLE = `CREATE TABLE version ( id TEXT, ver TEXT, @@ -84,11 +102,21 @@ const GMETA_TABLE = `CREATE TABLE gmeta ( first_key TEXT, PRIMARY KEY (gid) );`; +const PMETA_TABLE = `CREATE TABLE pmeta ( + gid INT, + "index" INT, + token TEXT, + name TEXT, + width INT, + height INT, + is_original BOOLEAN, + PRIMARY KEY (gid, token) +);`; export class EhDb { db; flock_enabled: boolean = eval('typeof Deno.flock !== "undefined"'); - file: Deno.FsFile | undefined; + #file: Deno.FsFile | undefined; _exist_table: Set = new Set(); #lock_file: string | undefined; readonly version = new SemVer("1.0.0-0"); @@ -98,7 +126,7 @@ export class EhDb { if (!this._check_database()) this._create_table(); if (this.flock_enabled) { this.#lock_file = join(base_path, "db.lock"); - this.file = Deno.openSync(this.#lock_file, { + this.#file = Deno.openSync(this.#lock_file, { create: true, write: true, }); @@ -130,6 +158,9 @@ export class EhDb { if (!this._exist_table.has("gmeta")) { this.db.execute(GMETA_TABLE); } + if (!this._exist_table.has("pmeta")) { + this.db.execute(PMETA_TABLE); + } this._updateExistsTable(); } _read_version() { @@ -168,6 +199,12 @@ export class EhDb { gmeta, ); } + add_pmeta(pmeta: PMeta) { + this.db.queryEntries( + "INSERT OR REPLACE INTO pmeta VALUES (:gid, :index, :token, :name, :width, :height, :is_original)", + pmeta, + ); + } add_task(task: Task) { return this.transaction(() => { this.db.query( @@ -202,8 +239,8 @@ export class EhDb { } close() { this.db.close(); - if (this.file) { - this.file.close(); + if (this.#file) { + this.#file.close(); if (this.#lock_file) Deno.removeSync(this.#lock_file); } } @@ -225,24 +262,32 @@ export class EhDb { } convert_gmeta(m: GMetaRaw[]): GMeta[] { return m.map((m) => { - const b = m.expunged === 1; + const b = m.expunged !== 0; const t = m; t.expunged = b; return t; }); } + convert_pmeta(m: PMetaRaw[]): PMeta[] { + return m.map((m) => { + const b = m.is_original !== 0; + const t = m; + t.is_original = b; + return t; + }); + } delete_task(task: Task) { return this.transaction(() => { this.db.query("DELETE FROM task WHERE id = ?;", [task.id]); }); } async flock() { - if (!this.file) return; - await eval(`Deno.flock(${this.file.rid}, true);`); + if (!this.#file) return; + await eval(`Deno.flock(${this.#file.rid}, true);`); } async funlock() { - if (!this.file) return; - await eval(`Deno.funlock(${this.file.rid});`); + if (!this.#file) return; + await eval(`Deno.funlock(${this.#file.rid});`); } get_gmeta_by_gid(gid: number) { const s = this.convert_gmeta( @@ -253,6 +298,24 @@ export class EhDb { ); return s.length ? s[0] : undefined; } + get_pmeta_by_index(gid: number, index: number) { + const s = this.convert_pmeta( + this.db.queryEntries( + 'SELECT * FROM pmeta WHERE gid = ? AND "index" = ?;', + [gid, index], + ), + ); + return s.length ? s[0] : undefined; + } + get_pmeta_by_token(gid: number, token: string) { + const s = this.convert_pmeta( + this.db.queryEntries( + "SELECT * FROM pmeta WHERE gid = ? AND token = ?;", + [gid, token], + ), + ); + return s.length ? s[0] : undefined; + } get_tasks_by_pid(pid: number) { return this.transaction(() => this.db.queryEntries("SELECT * FROM task WHERE pid = ?;", [ diff --git a/db_test.ts b/db_test.ts index 93dde63..5aa0766 100644 --- a/db_test.ts +++ b/db_test.ts @@ -1,5 +1,5 @@ import { assertEquals } from "std/testing/asserts.ts"; -import { EhDb, GMeta } from "./db.ts"; +import { EhDb, GMeta, PMeta } from "./db.ts"; import { TaskType } from "./task.ts"; import { remove_if_exists } from "./test_base.ts"; import { sure_dir } from "./utils.ts"; @@ -40,5 +40,17 @@ Deno.test("DbTest", async () => { gmeta, db.get_gmeta_by_gid(1), ); + const pmeta: PMeta = { + gid: 1, + index: 1, + token: "sddd", + name: "a.png", + width: 1280, + height: 720, + is_original: true, + }; + db.add_pmeta(pmeta); + assertEquals(pmeta, db.get_pmeta_by_token(pmeta.gid, pmeta.token)); + assertEquals(pmeta, db.get_pmeta_by_index(pmeta.gid, pmeta.index)); db.close(); }); diff --git a/page/MPVPage.ts b/page/MPVPage.ts index 657ca0d..b9b2e08 100644 --- a/page/MPVPage.ts +++ b/page/MPVPage.ts @@ -91,6 +91,9 @@ class MPVImage { get page_token() { return this.base.k; } + get src() { + return this.data?.i; + } get thumbnail() { return this.base.t; } diff --git a/page/MPVPage_test.ts b/page/MPVPage_test.ts index 2c72ffd..523afdb 100644 --- a/page/MPVPage_test.ts +++ b/page/MPVPage_test.ts @@ -22,7 +22,7 @@ Deno.test("MPVPage_test", async () => { } assertEquals(p1.origin_xres, 2449); assertEquals(p1.origin_yres, 3427); - console.log(p1.data.i); + console.log(p1.src); const p2 = re.imagelist[1]; assertEquals(p2.index, 2); assertEquals(p2.name, "2.png"); @@ -32,7 +32,7 @@ Deno.test("MPVPage_test", async () => { assert(!p2.is_original); assertEquals(p2.origin_xres, 3351); assertEquals(p2.origin_yres, 4894); - console.log(p2.data.i); + console.log(p2.src); /* console.log(p2.original_imgurl); const r = await p2.load_original_image(); assert(r);