🎨 fix(db): 不知道有没有什么用但还是感觉有优化

This commit is contained in:
BTMuli
2023-04-25 20:17:30 +08:00
parent c9bef8927b
commit 96018666c5

View File

@@ -5,12 +5,11 @@
* @since Alpha v0.1.4 * @since Alpha v0.1.4
*/ */
// tauri
import Database from "tauri-plugin-sql-api"; import Database from "tauri-plugin-sql-api";
// utils
import { importUIAFData, initSQLiteData, initSQLiteTable } from "./TGSql"; import { importUIAFData, initSQLiteData, initSQLiteTable } from "./TGSql";
import { getUiafStatus } from "./UIAF"; import { getUiafStatus } from "./UIAF";
const dbLink = await Database.load("sqlite:tauri-genshin.db");
class TGSqlite { class TGSqlite {
/** /**
* @description 数据库地址 * @description 数据库地址
@@ -20,14 +19,6 @@ class TGSqlite {
* @since Alpha v0.1.4 * @since Alpha v0.1.4
*/ */
private readonly dbPath: string = "sqlite:tauri-genshin.db"; private readonly dbPath: string = "sqlite:tauri-genshin.db";
/**
* @description 数据库实例
* @private
* @type {Database}
* @memberof TGSqlite
* @since Alpha v0.1.4
*/
private readonly db: Database;
/** /**
* @description 数据库包含的表 * @description 数据库包含的表
* @private * @private
@@ -42,17 +33,6 @@ class TGSqlite {
"NameCard", "NameCard",
]; ];
/**
* @description 构造函数
* @constructor
* @memberof TGSqlite
* @since Alpha v0.1.4
*/
constructor () {
// 异步
this.db = dbLink;
}
/** /**
* @description 初始化数据库 * @description 初始化数据库
* @memberof TGSqlite * @memberof TGSqlite
@@ -61,14 +41,16 @@ class TGSqlite {
* @memberof TGSqlite * @memberof TGSqlite
*/ */
public async init (): Promise<void> { public async init (): Promise<void> {
const db = await Database.load(this.dbPath);
const sqlT = initSQLiteTable(); const sqlT = initSQLiteTable();
for (const item of sqlT) { for (const item of sqlT) {
await this.db.execute(item); await db.execute(item);
} }
const sqlD = await initSQLiteData(); const sqlD = await initSQLiteData();
for (const item of sqlD) { for (const item of sqlD) {
await this.db.execute(item); await db.execute(item);
} }
await db.close();
} }
/** /**
@@ -78,14 +60,18 @@ class TGSqlite {
* @returns {Promise<boolean>} * @returns {Promise<boolean>}
*/ */
public async check (): Promise<boolean> { public async check (): Promise<boolean> {
const db = await Database.load(this.dbPath);
let isVertified = false;
// 检测数据表是否都存在 // 检测数据表是否都存在
const sqlT = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;"; const sqlT = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;";
const res: Array<{ name: string }> = await this.db.select(sqlT); const res: Array<{ name: string }> = await db.select(sqlT);
if (res.length !== this.tables.length) return false; if (res.length === this.tables.length) {
for (const item of res) { if (res.every((item) => this.tables.includes(item.name))) {
if (!this.tables.includes(item.name)) return false; isVertified = true;
}
} }
return true; await db.close();
return isVertified;
} }
/** /**
@@ -95,10 +81,12 @@ class TGSqlite {
* @returns {Promise<void>} * @returns {Promise<void>}
*/ */
public async reset (): Promise<void> { public async reset (): Promise<void> {
const db = await Database.load(this.dbPath);
this.tables.map(async (item) => { this.tables.map(async (item) => {
const sql = `DROP TABLE IF EXISTS ${item};`; const sql = `DROP TABLE IF EXISTS ${item};`;
await this.db.execute(sql); await db.execute(sql);
}); });
await db.close();
await this.init(); await this.init();
} }
@@ -109,10 +97,12 @@ class TGSqlite {
* @returns {Promise<{ version: string, buildTime: string }>} * @returns {Promise<{ version: string, buildTime: string }>}
*/ */
public async getMetadata (): Promise<{ version: string, buildTime: string }> { public async getMetadata (): Promise<{ version: string, buildTime: string }> {
const db = await Database.load(this.dbPath);
const sql = "SELECT * FROM AppData WHERE key='appVersion' OR key='dataUpdated';"; const sql = "SELECT * FROM AppData WHERE key='appVersion' OR key='dataUpdated';";
const res: Array<{ key: string, value: string }> = await this.db.select(sql); const res: Array<{ key: string, value: string }> = await db.select(sql);
const version = res.find((item) => item.key === "appVersion")?.value ?? "0.0.0"; const version = res.find((item) => item.key === "appVersion")?.value ?? "0.0.0";
const buildTime = res.find((item) => item.key === "dataUpdated")?.value ?? "1970-01-01 00:00:00"; const buildTime = res.find((item) => item.key === "dataUpdated")?.value ?? "1970-01-01 00:00:00";
await db.close();
return { version, buildTime }; return { version, buildTime };
} }
@@ -123,8 +113,10 @@ class TGSqlite {
* @returns {Promise<BTMuli.SQLite.AchievementSeries[]>} * @returns {Promise<BTMuli.SQLite.AchievementSeries[]>}
*/ */
public async getAchievementSeries (): Promise<BTMuli.SQLite.AchievementSeries[]> { public async getAchievementSeries (): Promise<BTMuli.SQLite.AchievementSeries[]> {
const db = await Database.load(this.dbPath);
const sql = "SELECT * FROM AchievementSeries ORDER BY `order` ASC;"; const sql = "SELECT * FROM AchievementSeries ORDER BY `order` ASC;";
const res: BTMuli.SQLite.AchievementSeries[] = await this.db.select(sql); const res: BTMuli.SQLite.AchievementSeries[] = await db.select(sql);
await db.close();
return res; return res;
} }
@@ -136,8 +128,10 @@ class TGSqlite {
* @returns {Promise<BTMuli.SQLite.NameCard>} * @returns {Promise<BTMuli.SQLite.NameCard>}
*/ */
public async getNameCard (seriesId: number): Promise<BTMuli.SQLite.NameCard> { public async getNameCard (seriesId: number): Promise<BTMuli.SQLite.NameCard> {
const db = await Database.load(this.dbPath);
const sql = `SELECT * FROM NameCard WHERE name=(SELECT nameCard FROM AchievementSeries WHERE id=${seriesId});`; const sql = `SELECT * FROM NameCard WHERE name=(SELECT nameCard FROM AchievementSeries WHERE id=${seriesId});`;
const res: BTMuli.SQLite.NameCard[] = await this.db.select(sql); const res: BTMuli.SQLite.NameCard[] = await db.select(sql);
await db.close();
return res[0]; return res[0];
} }
@@ -149,13 +143,15 @@ class TGSqlite {
* @returns {Promise<BTMuli.SQLite.Achievements[]>} * @returns {Promise<BTMuli.SQLite.Achievements[]>}
*/ */
public async getAchievements (seriesId?: number): Promise<BTMuli.SQLite.Achievements[]> { public async getAchievements (seriesId?: number): Promise<BTMuli.SQLite.Achievements[]> {
const db = await Database.load(this.dbPath);
let sql; let sql;
if (seriesId) { if (seriesId) {
sql = `SELECT * FROM Achievements WHERE series=${seriesId} ORDER BY isCompleted DESC, \`order\` ASC;`; sql = `SELECT * FROM Achievements WHERE series=${seriesId} ORDER BY isCompleted DESC, \`order\` ASC;`;
} else { } else {
sql = "SELECT * FROM Achievements ORDER BY isCompleted DESC, `order` ASC;"; sql = "SELECT * FROM Achievements ORDER BY isCompleted DESC, `order` ASC;";
} }
const res: BTMuli.SQLite.Achievements[] = await this.db.select(sql); const res: BTMuli.SQLite.Achievements[] = await db.select(sql);
await db.close();
return res; return res;
} }
@@ -166,8 +162,10 @@ class TGSqlite {
* @returns {Promise<{total:number,fin:number}>} * @returns {Promise<{total:number,fin:number}>}
*/ */
public async getAchievementsOverview (): Promise<{ total: number, fin: number }> { public async getAchievementsOverview (): Promise<{ total: number, fin: number }> {
const db = await Database.load(this.dbPath);
const sql = "SELECT SUM(totalCount) AS total, SUM(finCount) AS fin FROM AchievementSeries;"; const sql = "SELECT SUM(totalCount) AS total, SUM(finCount) AS fin FROM AchievementSeries;";
const res: Array<{ total: number, fin: number }> = await this.db.select(sql); const res: Array<{ total: number, fin: number }> = await db.select(sql);
await db.close();
return res[0]; return res[0];
} }
@@ -179,6 +177,7 @@ class TGSqlite {
* @returns {Promise<BTMuli.SQLite.Achievements[]>} * @returns {Promise<BTMuli.SQLite.Achievements[]>}
*/ */
public async searchAchievements (keyword: string): Promise<BTMuli.SQLite.Achievements[]> { public async searchAchievements (keyword: string): Promise<BTMuli.SQLite.Achievements[]> {
const db = await Database.load(this.dbPath);
let sql; let sql;
if (keyword.startsWith("v")) { if (keyword.startsWith("v")) {
const version = keyword.replace("v", ""); const version = keyword.replace("v", "");
@@ -186,7 +185,8 @@ class TGSqlite {
} else { } else {
sql = `SELECT * FROM Achievements WHERE name LIKE '%${keyword}%' OR description LIKE '%${keyword}%' ORDER BY isCompleted DESC, \`order\` ASC;`; sql = `SELECT * FROM Achievements WHERE name LIKE '%${keyword}%' OR description LIKE '%${keyword}%' ORDER BY isCompleted DESC, \`order\` ASC;`;
} }
const res: BTMuli.SQLite.Achievements[] = await this.db.select(sql); const res: BTMuli.SQLite.Achievements[] = await db.select(sql);
await db.close();
return res; return res;
} }
@@ -198,10 +198,12 @@ class TGSqlite {
* @returns {Promise<void>} * @returns {Promise<void>}
*/ */
public async mergeUIAF (achievements: TGPlugin.UIAF.Achievement[]): Promise<void> { public async mergeUIAF (achievements: TGPlugin.UIAF.Achievement[]): Promise<void> {
const db = await Database.load(this.dbPath);
const sql = importUIAFData(achievements); const sql = importUIAFData(achievements);
for (const item of sql) { for (const item of sql) {
await this.db.execute(item); await db.execute(item);
} }
await db.close();
} }
/** /**
@@ -211,8 +213,10 @@ class TGSqlite {
* @returns {Promise<TGPlugin.UIAF.Achievement[]>} * @returns {Promise<TGPlugin.UIAF.Achievement[]>}
*/ */
public async getUIAF (): Promise<TGPlugin.UIAF.Achievement[]> { public async getUIAF (): Promise<TGPlugin.UIAF.Achievement[]> {
const db = await Database.load(this.dbPath);
const sql = "SELECT * FROM Achievements WHERE isCompleted = 1 OR progress > 0"; const sql = "SELECT * FROM Achievements WHERE isCompleted = 1 OR progress > 0";
const res: BTMuli.SQLite.Achievements[] = await this.db.select(sql); const res: BTMuli.SQLite.Achievements[] = await db.select(sql);
await db.close();
const achievements: TGPlugin.UIAF.Achievement[] = []; const achievements: TGPlugin.UIAF.Achievement[] = [];
for (const item of res) { for (const item of res) {
const completed = item.isCompleted === 1; const completed = item.isCompleted === 1;