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 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 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 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 main(List 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); }