From c4abcabca20da6933a9b8bc137a79d37c34bef67 Mon Sep 17 00:00:00 2001 From: h7x4 Date: Tue, 2 Jun 2026 02:56:51 +0900 Subject: [PATCH] search: add api for fetching datasource versions --- lib/search.dart | 10 ++- lib/search/versions.dart | 84 +++++++++++++++++++++++ test/search/datasource_versions_test.dart | 12 ++++ 3 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 lib/search/versions.dart create mode 100644 test/search/datasource_versions_test.dart diff --git a/lib/search.dart b/lib/search.dart index ff4719d..7089d9e 100644 --- a/lib/search.dart +++ b/lib/search.dart @@ -4,6 +4,7 @@ import 'package:jadb/models/word_search/word_search_result.dart'; import 'package:jadb/search/filter_kanji.dart'; import 'package:jadb/search/kanji_search.dart'; import 'package:jadb/search/radical_search.dart'; +import 'package:jadb/search/versions.dart'; import 'package:jadb/search/word_search/word_search.dart'; import 'package:sqflite_common/sqlite_api.dart'; @@ -18,8 +19,9 @@ extension JaDBConnection on DatabaseExecutor { searchKanjiWithDbConnection(this, kanji); /// Search for a kanji in the database. - Future> jadbGetManyKanji(Iterable kanji) => - searchManyKanjiWithDbConnection(this, kanji); + Future> jadbGetManyKanji( + Iterable kanji, + ) => searchManyKanjiWithDbConnection(this, kanji); /// Filter a list of characters, and return the ones that are listed in the kanji dictionary. Future> filterKanji( @@ -68,4 +70,8 @@ extension JaDBConnection on DatabaseExecutor { /// of the radicals, and return those. Future> jadbSearchKanjiByRadicals(List radicals) => searchKanjiByRadicalsWithDbConnection(this, radicals); + + /// Retrieve the version information for all datasources in the database. + Future jadbGetDatasourceVersions() => + getDatasourceVersions(this); } diff --git a/lib/search/versions.dart b/lib/search/versions.dart new file mode 100644 index 0000000..ce11a41 --- /dev/null +++ b/lib/search/versions.dart @@ -0,0 +1,84 @@ +import 'package:jadb/table_names/jmdict.dart'; +import 'package:jadb/table_names/kanjidic.dart'; +import 'package:jadb/table_names/radkfile.dart'; +import 'package:jadb/table_names/tanos_jlpt.dart'; +import 'package:sqflite_common/sqlite_api.dart'; + +class DatasourceVersions { + final String jmdictVersion; + final DateTime jmdictDate; + final String jmdictHash; + + final String kanjidic2Version; + final DateTime kanjidic2Date; + final String kanjidic2Hash; + + final String radkfileVersion; + final DateTime radkfileDate; + final String radkfileHash; + + final String tanosJlptVersion; + final DateTime tanosJlptDate; + final String tanosJlptHash; + + const DatasourceVersions({ + required this.jmdictVersion, + required this.jmdictDate, + required this.jmdictHash, + required this.kanjidic2Version, + required this.kanjidic2Date, + required this.kanjidic2Hash, + required this.radkfileVersion, + required this.radkfileDate, + required this.radkfileHash, + required this.tanosJlptVersion, + required this.tanosJlptDate, + required this.tanosJlptHash, + }); +} + +DateTime _parseDateTime(String dateString) { + try { + return DateTime.parse(dateString); + } catch (e) { + if (RegExp(r'^\d{4}-\d{2}$').hasMatch(dateString)) { + return DateTime.parse('$dateString-01'); + } else if (RegExp(r'^\d{4}$').hasMatch(dateString)) { + return DateTime.parse('$dateString-01-01'); + } else { + throw FormatException('Invalid date format: $dateString'); + } + } +} + +Future getDatasourceVersions( + final DatabaseExecutor connection, +) async { + final jmdictVersion = await connection + .query(JMdictTableNames.version) + .then((rows) => rows.first); + final kanjidic2Version = await connection + .query(KANJIDICTableNames.version) + .then((rows) => rows.first); + final radkfileVersion = await connection + .query(RADKFILETableNames.version) + .then((rows) => rows.first); + final tanosJlptVersion = await connection + .query(TanosJLPTTableNames.version) + .then((rows) => rows.first); + + return DatasourceVersions( + jmdictVersion: jmdictVersion['version'] as String, + jmdictDate: _parseDateTime(jmdictVersion['date'].toString()), + jmdictHash: jmdictVersion['hash'] as String, + kanjidic2Version: kanjidic2Version['version'] as String, + kanjidic2Date: _parseDateTime(kanjidic2Version['date'].toString()), + kanjidic2Hash: kanjidic2Version['hash'] as String, + radkfileVersion: radkfileVersion['version'] as String, + radkfileDate: _parseDateTime(radkfileVersion['date'].toString()), + radkfileHash: radkfileVersion['hash'] as String, + tanosJlptVersion: tanosJlptVersion['version'] as String, + tanosJlptDate: _parseDateTime(tanosJlptVersion['date'].toString()), + tanosJlptHash: tanosJlptVersion['hash'] as String, + ); +} diff --git a/test/search/datasource_versions_test.dart b/test/search/datasource_versions_test.dart new file mode 100644 index 0000000..d6b1e2f --- /dev/null +++ b/test/search/datasource_versions_test.dart @@ -0,0 +1,12 @@ +import 'package:jadb/search.dart'; +import 'package:test/test.dart'; + +import 'setup_database_connection.dart'; + +void main() { + test('Retrieve datasource versions', () async { + final connection = await setupDatabaseConnection(); + final result = await connection.jadbGetDatasourceVersions(); + expect(result, isNotNull); + }); +}