Commit 60db9354 authored by nanahira's avatar nanahira

migrate to sqljs

parent d90ad277
Subproject commit b53a96ad782fb428294895081eb913fda3bb68f0
Subproject commit c8ee02c963ea36824054bd7271fd434d6a3fd015
This diff is collapsed.
// import 'source-map-support/register';
import { YGOCardConfig } from './config';
import sqlite, { Database } from 'better-sqlite3';
import SQL from 'sql.js';
import { promises as fs } from 'fs';
import _ from 'lodash';
import { YGOProCard } from './YGOProCard';
import { plainToClass } from 'class-transformer';
import { plainToInstance } from 'class-transformer';
import path from 'path';
import { StarterPlugin, DefinePlugin, LifecycleEvents } from 'koishi-thirdeye';
import {
StarterPlugin,
DefinePlugin,
LifecycleEvents,
InjectLogger,
} from 'koishi-thirdeye';
import { Logger } from 'koishi';
import initSqlJs from 'sql.js';
export * from './config';
......@@ -15,15 +22,24 @@ export default class YGOCardPlugin
extends StarterPlugin(YGOCardConfig)
implements LifecycleEvents
{
private dbs: Database[] = [];
private queryInDB(value: string, db: Database) {
@InjectLogger()
private logger: Logger;
private dbs: SQL.Database[] = [];
private queryInDB(value: string, db: SQL.Database) {
const possibleValueNumber = parseInt(value) || 0;
const statement = db.prepare<[number, string, string]>(
"select datas.*,texts.name,texts.desc from datas,texts where datas.id = texts.id and datas.type & 0x4000 = 0 and (datas.alias = 0 or datas.id - datas.alias > 10) and (datas.id = ? or texts.name like ('%' || ? || '%') or texts.desc like ('%' || ? || '%'))",
const statement = db.prepare(
"select datas.*,texts.name,texts.desc from datas,texts where datas.id = texts.id and datas.type & 0x4000 = 0 and (datas.alias = 0 or datas.id - datas.alias > 10) and (datas.id = $num or texts.name like ('%' || $query || '%') or texts.desc like ('%' || $query || '%'))",
);
return statement
.all(possibleValueNumber, value, value)
.map((obj) => plainToClass(YGOProCard, obj));
statement.bind({
$num: possibleValueNumber,
$query: value,
});
const results: any[] = [];
while (statement.step()) {
results.push(statement.getAsObject());
}
return results.map((obj) => plainToInstance(YGOProCard, obj));
}
private queryInAllDBs(value: string, matchCount?: number) {
return _.sortBy(
......@@ -34,7 +50,7 @@ export default class YGOCardPlugin
(c) => c.getDistanceFrom(value),
).slice(0, matchCount || this.config.matchCount);
}
private async loadDBs() {
private async loadDBs(SQL: SQL.SqlJsStatic) {
const allDatabaseFiles = _.flatten(
await Promise.all(
this.config.databasePaths.map(async (p) =>
......@@ -44,19 +60,18 @@ export default class YGOCardPlugin
),
),
);
this.ctx
.logger('ygocard')
.info(`Will load cards from ${allDatabaseFiles.length} databases.`);
this.dbs = allDatabaseFiles.map((dbFile) =>
sqlite(dbFile, {
readonly: true,
fileMustExist: true,
}),
this.logger.info(
`Will load cards from ${allDatabaseFiles.length} databases.`,
);
const buffers = await Promise.all(
allDatabaseFiles.map((f) => fs.readFile(f)),
);
this.dbs = buffers.map((b) => new SQL.Database(b));
}
onConnect() {
this.loadDBs();
async onConnect() {
const SQL = await initSqlJs();
return this.loadDBs(SQL);
}
onDisconnect() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment