Files
jadb/bin/jadb.dart

162 lines
4.0 KiB
Dart

import 'dart:convert';
import 'dart:ffi';
import 'dart:io';
import 'package:args/args.dart';
import 'package:args/command_runner.dart';
import 'package:jadb/_data_ingestion/jmdict/parser.dart';
import 'package:jadb/_data_ingestion/kanjidic/parser.dart';
import 'package:jadb/_data_ingestion/radkfile/parser.dart';
import 'package:jadb/search.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:sqlite3/open.dart';
void addLibsqliteArg(ArgParser argParser) {
argParser.addOption(
'libsqlite',
help:
'Path to the SQLite library. This is used to load the SQLite library dynamically.',
valueHelp: 'PATH',
defaultsTo: Platform.environment['LIBSQLITE_PATH'],
);
}
void addJadbArg(ArgParser argParser) {
argParser.addOption(
'jadb',
abbr: 'f',
help: 'Path to the SQLite database file.',
valueHelp: 'PATH',
mandatory: true,
);
}
class CreateDb extends Command {
final name = "create-db";
final description = "Create the database";
CreateDb() {
addLibsqliteArg(argParser);
}
Future<void> run() async {
if (argResults!.option('libsqlite') == null) {
print(argParser.usage);
exit(64);
}
final db = await createDatabaseFactoryFfi(ffiInit: () {
open.overrideForAll(
() => DynamicLibrary.open(argResults!.option('libsqlite')!),
);
}).openDatabase(
Directory.current.uri.resolve('jadb.sqlite').path,
options: OpenDatabaseOptions(
onOpen: (db) {
db.execute("PRAGMA foreign_keys = ON");
},
),
);
await addDataFromJMdict(db);
await addDataFromRADKFILE(db);
await addDataFromKANJIDIC(db);
}
}
class QueryKanji extends Command {
final name = "query-kanji";
final description = "Query the database for kanji data";
QueryKanji() {
addLibsqliteArg(argParser);
addJadbArg(argParser);
}
Future<void> run() async {
if (argResults!.option('libsqlite') == null ||
!argResults!.wasParsed('jadb')) {
print(argParser.usage);
exit(64);
}
final db = await createDatabaseFactoryFfi(ffiInit: () {
open.overrideForAll(
() => DynamicLibrary.open(argResults!.option('libsqlite')!),
);
}).openDatabase(
Directory.current.uri.resolve(argResults!.option('jadb')!).path,
options: OpenDatabaseOptions(
readOnly: true,
onOpen: (db) {
db.execute("PRAGMA foreign_keys = ON");
},
),
);
final result = await JaDBConnection(db).searchKanji('');
if (result == null) {
print("No such kanji");
} else {
print(JsonEncoder.withIndent(' ').convert(result.toJson()));
}
}
}
class QueryWord extends Command {
final name = "query-word";
final description = "Query the database for word data";
QueryWord() {
addLibsqliteArg(argParser);
addJadbArg(argParser);
}
Future<void> run() async {
if (argResults!.option('libsqlite') == null ||
!argResults!.wasParsed('jadb')) {
print(argParser.usage);
exit(64);
}
final db = await createDatabaseFactoryFfi(ffiInit: () {
open.overrideForAll(
() => DynamicLibrary.open(argResults!.option('libsqlite')!),
);
}).openDatabase(
Directory.current.uri.resolve(argResults!.option('jadb')!).path,
options: OpenDatabaseOptions(
readOnly: true,
onOpen: (db) {
db.execute("PRAGMA foreign_keys = ON");
},
),
);
final result = await JaDBConnection(db).searchWord('kana');
if (result == null) {
print("Invalid search");
} else if (result.isEmpty) {
print("No matches");
} else {
print(JsonEncoder.withIndent(' ')
.convert(result.map((e) => e.toJson()).toList()));
}
}
}
Future<void> main(List<String> args) async {
final runner = CommandRunner(
'jadb',
"CLI tool to help creating and testing the jadb database",
);
runner.addCommand(CreateDb());
runner.addCommand(QueryKanji());
runner.addCommand(QueryWord());
runner.run(args);
}