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 'source-map-support/register';
import { YGOCardConfig } from './config'; import { YGOCardConfig } from './config';
import sqlite, { Database } from 'better-sqlite3'; import SQL from 'sql.js';
import { promises as fs } from 'fs'; import { promises as fs } from 'fs';
import _ from 'lodash'; import _ from 'lodash';
import { YGOProCard } from './YGOProCard'; import { YGOProCard } from './YGOProCard';
import { plainToClass } from 'class-transformer'; import { plainToInstance } from 'class-transformer';
import path from 'path'; 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'; export * from './config';
...@@ -15,15 +22,24 @@ export default class YGOCardPlugin ...@@ -15,15 +22,24 @@ export default class YGOCardPlugin
extends StarterPlugin(YGOCardConfig) extends StarterPlugin(YGOCardConfig)
implements LifecycleEvents implements LifecycleEvents
{ {
private dbs: Database[] = []; @InjectLogger()
private queryInDB(value: string, db: Database) { private logger: Logger;
private dbs: SQL.Database[] = [];
private queryInDB(value: string, db: SQL.Database) {
const possibleValueNumber = parseInt(value) || 0; const possibleValueNumber = parseInt(value) || 0;
const statement = db.prepare<[number, string, string]>( 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 = ? or texts.name like ('%' || ? || '%') or texts.desc like ('%' || ? || '%'))", "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 statement.bind({
.all(possibleValueNumber, value, value) $num: possibleValueNumber,
.map((obj) => plainToClass(YGOProCard, obj)); $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) { private queryInAllDBs(value: string, matchCount?: number) {
return _.sortBy( return _.sortBy(
...@@ -34,7 +50,7 @@ export default class YGOCardPlugin ...@@ -34,7 +50,7 @@ export default class YGOCardPlugin
(c) => c.getDistanceFrom(value), (c) => c.getDistanceFrom(value),
).slice(0, matchCount || this.config.matchCount); ).slice(0, matchCount || this.config.matchCount);
} }
private async loadDBs() { private async loadDBs(SQL: SQL.SqlJsStatic) {
const allDatabaseFiles = _.flatten( const allDatabaseFiles = _.flatten(
await Promise.all( await Promise.all(
this.config.databasePaths.map(async (p) => this.config.databasePaths.map(async (p) =>
...@@ -44,19 +60,18 @@ export default class YGOCardPlugin ...@@ -44,19 +60,18 @@ export default class YGOCardPlugin
), ),
), ),
); );
this.ctx this.logger.info(
.logger('ygocard') `Will load cards from ${allDatabaseFiles.length} databases.`,
.info(`Will load cards from ${allDatabaseFiles.length} databases.`); );
this.dbs = allDatabaseFiles.map((dbFile) => const buffers = await Promise.all(
sqlite(dbFile, { allDatabaseFiles.map((f) => fs.readFile(f)),
readonly: true,
fileMustExist: true,
}),
); );
this.dbs = buffers.map((b) => new SQL.Database(b));
} }
onConnect() { async onConnect() {
this.loadDBs(); const SQL = await initSqlJs();
return this.loadDBs(SQL);
} }
onDisconnect() { 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