162 lines
4.0 KiB
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);
|
|
}
|