diff --git a/lib/database/database_service.dart b/lib/database/database_service.dart index 87fc2c4..0bb3759 100644 --- a/lib/database/database_service.dart +++ b/lib/database/database_service.dart @@ -1,6 +1,5 @@ import 'corpus_database_interface.dart'; -import 'formulas_database.dart' - if (dart.library.html) 'formulas_database_web.dart'; +import 'formulas_database.dart'; import 'package:d4rt_formulas/formula_models.dart' as models; // Extension to add corpus loading/saving functionality to FormulasDatabase diff --git a/lib/database/formulas_database.dart b/lib/database/formulas_database.dart index 28527c2..e63c751 100644 --- a/lib/database/formulas_database.dart +++ b/lib/database/formulas_database.dart @@ -1,8 +1,9 @@ import 'package:drift/drift.dart'; -import 'package:drift/native.dart'; -import 'package:path/path.dart' as p; -import 'package:path_provider/path_provider.dart'; -import 'dart:io'; + +import 'formulas_database_unsupported.dart' +if (dart.library.html) 'formulas_database_web.dart' +if (dart.library.ffi) 'formulas_database_native.dart'; + part 'formulas_database.g.dart'; @@ -14,7 +15,7 @@ class FormulaElements extends Table { @DriftDatabase(tables: [FormulaElements]) class FormulasDatabase extends _$FormulasDatabase { - FormulasDatabase() : super(_openConnection()); + FormulasDatabase() : super(openConnection()); @override int get schemaVersion => 1; @@ -44,29 +45,8 @@ class FormulasDatabase extends _$FormulasDatabase { Future deleteFormulaElement(int id) { return (delete(formulaElements)..where((tbl) => tbl.id.equals(id))).go(); } - + // Additional helper methods for direct access to the table SimpleSelectStatement get allFormulaElements => select(formulaElements); } -LazyDatabase _openConnection() { - return LazyDatabase(() async { - // Determine the platform-specific database directory - Directory dbDirectory; - - if (Platform.isLinux || Platform.isWindows || Platform.isMacOS) { - final appSupportDir = await getApplicationSupportDirectory(); - dbDirectory = Directory(p.join(appSupportDir.path, 'd4rt_formulas')); - } else { - dbDirectory = await getApplicationDocumentsDirectory(); - } - - // Ensure the directory exists - await dbDirectory.create(recursive: true); - - // Create the database file in the platform-specific directory - final file = File(p.join(dbDirectory.path, 'formulas.sqlite')); - return NativeDatabase.createInBackground(file); - }); -} - diff --git a/lib/database/formulas_database_native.dart b/lib/database/formulas_database_native.dart new file mode 100644 index 0000000..31c0ea6 --- /dev/null +++ b/lib/database/formulas_database_native.dart @@ -0,0 +1,28 @@ +import 'package:drift/drift.dart'; +import 'package:drift/native.dart'; +import 'package:path/path.dart' as p; +import 'package:path_provider/path_provider.dart'; +import 'dart:io'; + + +LazyDatabase openConnection() { + return LazyDatabase(() async { + // Determine the platform-specific database directory + Directory dbDirectory; + + if (Platform.isLinux || Platform.isWindows || Platform.isMacOS) { + final appSupportDir = await getApplicationSupportDirectory(); + dbDirectory = Directory(p.join(appSupportDir.path, 'd4rt_formulas')); + } else { + dbDirectory = await getApplicationDocumentsDirectory(); + } + + // Ensure the directory exists + await dbDirectory.create(recursive: true); + + // Create the database file in the platform-specific directory + final file = File(p.join(dbDirectory.path, 'formulas.sqlite')); + return NativeDatabase.createInBackground(file); + }); +} + diff --git a/lib/database/formulas_database_unsupported.dart b/lib/database/formulas_database_unsupported.dart new file mode 100644 index 0000000..ee8c241 --- /dev/null +++ b/lib/database/formulas_database_unsupported.dart @@ -0,0 +1,6 @@ +import 'package:drift/drift.dart'; + +LazyDatabase openConnection() { + throw UnsupportedError('This platform is not supported for FormulasDatabase'); +} + diff --git a/lib/database/formulas_database_web.dart b/lib/database/formulas_database_web.dart index e618953..6ccbed0 100644 --- a/lib/database/formulas_database_web.dart +++ b/lib/database/formulas_database_web.dart @@ -1,52 +1,8 @@ import 'package:drift/drift.dart'; import 'package:drift/web.dart'; -part 'formulas_database_web.g.dart'; -// Define the FORMULAELEMENT table to store both formulas and units as text -class FormulaElements extends Table { - IntColumn get id => integer().autoIncrement()(); - TextColumn get elementText => text()(); -} - -@DriftDatabase(tables: [FormulaElements]) -class FormulasDatabase extends _$FormulasDatabase { - FormulasDatabase() : super(_openConnection()); - - @override - int get schemaVersion => 1; - - // Method to insert a new formula element (either formula or unit) - Future insertFormulaElement(String elementText) { - return into(formulaElements).insert(FormulaElementsCompanion.insert(elementText: elementText)); - } - - // Method to get all formula elements - Future> getAllFormulaElements() { - return select(formulaElements).get(); - } - - // Method to get a formula element by ID - Future getFormulaElementById(int id) { - return (select(formulaElements)..where((tbl) => tbl.id.equals(id))).getSingleOrNull(); - } - - // Method to update a formula element - Future updateFormulaElement(int id, String newElementText) { - return (update(formulaElements)..where((tbl) => tbl.id.equals(id))) - .write(FormulaElementsCompanion.insert(elementText: newElementText)); - } - - // Method to delete a formula element - Future deleteFormulaElement(int id) { - return (delete(formulaElements)..where((tbl) => tbl.id.equals(id))).go(); - } - - // Additional helper methods for direct access to the table - SimpleSelectStatement get allFormulaElements => select(formulaElements); -} - -LazyDatabase _openConnection() { +LazyDatabase openConnection() { return LazyDatabase(() async { // For web, use the web implementation return WebDatabase.withStorage( diff --git a/lib/database/formulas_database_web.g.dart b/lib/database/formulas_database_web.g.dart deleted file mode 100644 index dc1b06c..0000000 --- a/lib/database/formulas_database_web.g.dart +++ /dev/null @@ -1,378 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'formulas_database_web.dart'; - -// ignore_for_file: type=lint -class $FormulaElementsTable extends FormulaElements - with TableInfo<$FormulaElementsTable, FormulaElement> { - @override - final GeneratedDatabase attachedDatabase; - final String? _alias; - $FormulaElementsTable(this.attachedDatabase, [this._alias]); - static const VerificationMeta _idMeta = const VerificationMeta('id'); - @override - late final GeneratedColumn id = GeneratedColumn( - 'id', - aliasedName, - false, - hasAutoIncrement: true, - type: DriftSqlType.int, - requiredDuringInsert: false, - defaultConstraints: GeneratedColumn.constraintIsAlways( - 'PRIMARY KEY AUTOINCREMENT', - ), - ); - static const VerificationMeta _elementTextMeta = const VerificationMeta( - 'elementText', - ); - @override - late final GeneratedColumn elementText = GeneratedColumn( - 'element_text', - aliasedName, - false, - type: DriftSqlType.string, - requiredDuringInsert: true, - ); - @override - List get $columns => [id, elementText]; - @override - String get aliasedName => _alias ?? actualTableName; - @override - String get actualTableName => $name; - static const String $name = 'formula_elements'; - @override - VerificationContext validateIntegrity( - Insertable instance, { - bool isInserting = false, - }) { - final context = VerificationContext(); - final data = instance.toColumns(true); - if (data.containsKey('id')) { - context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); - } - if (data.containsKey('element_text')) { - context.handle( - _elementTextMeta, - elementText.isAcceptableOrUnknown( - data['element_text']!, - _elementTextMeta, - ), - ); - } else if (isInserting) { - context.missing(_elementTextMeta); - } - return context; - } - - @override - Set get $primaryKey => {id}; - @override - FormulaElement map(Map data, {String? tablePrefix}) { - final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; - return FormulaElement( - id: attachedDatabase.typeMapping.read( - DriftSqlType.int, - data['${effectivePrefix}id'], - )!, - elementText: attachedDatabase.typeMapping.read( - DriftSqlType.string, - data['${effectivePrefix}element_text'], - )!, - ); - } - - @override - $FormulaElementsTable createAlias(String alias) { - return $FormulaElementsTable(attachedDatabase, alias); - } -} - -class FormulaElement extends DataClass implements Insertable { - final int id; - final String elementText; - const FormulaElement({required this.id, required this.elementText}); - @override - Map toColumns(bool nullToAbsent) { - final map = {}; - map['id'] = Variable(id); - map['element_text'] = Variable(elementText); - return map; - } - - FormulaElementsCompanion toCompanion(bool nullToAbsent) { - return FormulaElementsCompanion( - id: Value(id), - elementText: Value(elementText), - ); - } - - factory FormulaElement.fromJson( - Map json, { - ValueSerializer? serializer, - }) { - serializer ??= driftRuntimeOptions.defaultSerializer; - return FormulaElement( - id: serializer.fromJson(json['id']), - elementText: serializer.fromJson(json['elementText']), - ); - } - @override - Map toJson({ValueSerializer? serializer}) { - serializer ??= driftRuntimeOptions.defaultSerializer; - return { - 'id': serializer.toJson(id), - 'elementText': serializer.toJson(elementText), - }; - } - - FormulaElement copyWith({int? id, String? elementText}) => FormulaElement( - id: id ?? this.id, - elementText: elementText ?? this.elementText, - ); - FormulaElement copyWithCompanion(FormulaElementsCompanion data) { - return FormulaElement( - id: data.id.present ? data.id.value : this.id, - elementText: data.elementText.present - ? data.elementText.value - : this.elementText, - ); - } - - @override - String toString() { - return (StringBuffer('FormulaElement(') - ..write('id: $id, ') - ..write('elementText: $elementText') - ..write(')')) - .toString(); - } - - @override - int get hashCode => Object.hash(id, elementText); - @override - bool operator ==(Object other) => - identical(this, other) || - (other is FormulaElement && - other.id == this.id && - other.elementText == this.elementText); -} - -class FormulaElementsCompanion extends UpdateCompanion { - final Value id; - final Value elementText; - const FormulaElementsCompanion({ - this.id = const Value.absent(), - this.elementText = const Value.absent(), - }); - FormulaElementsCompanion.insert({ - this.id = const Value.absent(), - required String elementText, - }) : elementText = Value(elementText); - static Insertable custom({ - Expression? id, - Expression? elementText, - }) { - return RawValuesInsertable({ - if (id != null) 'id': id, - if (elementText != null) 'element_text': elementText, - }); - } - - FormulaElementsCompanion copyWith({ - Value? id, - Value? elementText, - }) { - return FormulaElementsCompanion( - id: id ?? this.id, - elementText: elementText ?? this.elementText, - ); - } - - @override - Map toColumns(bool nullToAbsent) { - final map = {}; - if (id.present) { - map['id'] = Variable(id.value); - } - if (elementText.present) { - map['element_text'] = Variable(elementText.value); - } - return map; - } - - @override - String toString() { - return (StringBuffer('FormulaElementsCompanion(') - ..write('id: $id, ') - ..write('elementText: $elementText') - ..write(')')) - .toString(); - } -} - -abstract class _$FormulasDatabase extends GeneratedDatabase { - _$FormulasDatabase(QueryExecutor e) : super(e); - $FormulasDatabaseManager get managers => $FormulasDatabaseManager(this); - late final $FormulaElementsTable formulaElements = $FormulaElementsTable( - this, - ); - @override - Iterable> get allTables => - allSchemaEntities.whereType>(); - @override - List get allSchemaEntities => [formulaElements]; -} - -typedef $$FormulaElementsTableCreateCompanionBuilder = - FormulaElementsCompanion Function({ - Value id, - required String elementText, - }); -typedef $$FormulaElementsTableUpdateCompanionBuilder = - FormulaElementsCompanion Function({ - Value id, - Value elementText, - }); - -class $$FormulaElementsTableFilterComposer - extends Composer<_$FormulasDatabase, $FormulaElementsTable> { - $$FormulaElementsTableFilterComposer({ - required super.$db, - required super.$table, - super.joinBuilder, - super.$addJoinBuilderToRootComposer, - super.$removeJoinBuilderFromRootComposer, - }); - ColumnFilters get id => $composableBuilder( - column: $table.id, - builder: (column) => ColumnFilters(column), - ); - - ColumnFilters get elementText => $composableBuilder( - column: $table.elementText, - builder: (column) => ColumnFilters(column), - ); -} - -class $$FormulaElementsTableOrderingComposer - extends Composer<_$FormulasDatabase, $FormulaElementsTable> { - $$FormulaElementsTableOrderingComposer({ - required super.$db, - required super.$table, - super.joinBuilder, - super.$addJoinBuilderToRootComposer, - super.$removeJoinBuilderFromRootComposer, - }); - ColumnOrderings get id => $composableBuilder( - column: $table.id, - builder: (column) => ColumnOrderings(column), - ); - - ColumnOrderings get elementText => $composableBuilder( - column: $table.elementText, - builder: (column) => ColumnOrderings(column), - ); -} - -class $$FormulaElementsTableAnnotationComposer - extends Composer<_$FormulasDatabase, $FormulaElementsTable> { - $$FormulaElementsTableAnnotationComposer({ - required super.$db, - required super.$table, - super.joinBuilder, - super.$addJoinBuilderToRootComposer, - super.$removeJoinBuilderFromRootComposer, - }); - GeneratedColumn get id => - $composableBuilder(column: $table.id, builder: (column) => column); - - GeneratedColumn get elementText => $composableBuilder( - column: $table.elementText, - builder: (column) => column, - ); -} - -class $$FormulaElementsTableTableManager - extends - RootTableManager< - _$FormulasDatabase, - $FormulaElementsTable, - FormulaElement, - $$FormulaElementsTableFilterComposer, - $$FormulaElementsTableOrderingComposer, - $$FormulaElementsTableAnnotationComposer, - $$FormulaElementsTableCreateCompanionBuilder, - $$FormulaElementsTableUpdateCompanionBuilder, - ( - FormulaElement, - BaseReferences< - _$FormulasDatabase, - $FormulaElementsTable, - FormulaElement - >, - ), - FormulaElement, - PrefetchHooks Function() - > { - $$FormulaElementsTableTableManager( - _$FormulasDatabase db, - $FormulaElementsTable table, - ) : super( - TableManagerState( - db: db, - table: table, - createFilteringComposer: () => - $$FormulaElementsTableFilterComposer($db: db, $table: table), - createOrderingComposer: () => - $$FormulaElementsTableOrderingComposer($db: db, $table: table), - createComputedFieldComposer: () => - $$FormulaElementsTableAnnotationComposer($db: db, $table: table), - updateCompanionCallback: - ({ - Value id = const Value.absent(), - Value elementText = const Value.absent(), - }) => FormulaElementsCompanion(id: id, elementText: elementText), - createCompanionCallback: - ({ - Value id = const Value.absent(), - required String elementText, - }) => FormulaElementsCompanion.insert( - id: id, - elementText: elementText, - ), - withReferenceMapper: (p0) => p0 - .map((e) => (e.readTable(table), BaseReferences(db, table, e))) - .toList(), - prefetchHooksCallback: null, - ), - ); -} - -typedef $$FormulaElementsTableProcessedTableManager = - ProcessedTableManager< - _$FormulasDatabase, - $FormulaElementsTable, - FormulaElement, - $$FormulaElementsTableFilterComposer, - $$FormulaElementsTableOrderingComposer, - $$FormulaElementsTableAnnotationComposer, - $$FormulaElementsTableCreateCompanionBuilder, - $$FormulaElementsTableUpdateCompanionBuilder, - ( - FormulaElement, - BaseReferences< - _$FormulasDatabase, - $FormulaElementsTable, - FormulaElement - >, - ), - FormulaElement, - PrefetchHooks Function() - >; - -class $FormulasDatabaseManager { - final _$FormulasDatabase _db; - $FormulasDatabaseManager(this._db); - $$FormulaElementsTableTableManager get formulaElements => - $$FormulaElementsTableTableManager(_db, _db.formulaElements); -} diff --git a/lib/service_locator.dart b/lib/service_locator.dart index 159c491..85ef1dd 100644 --- a/lib/service_locator.dart +++ b/lib/service_locator.dart @@ -1,6 +1,6 @@ import 'package:get_it/get_it.dart'; -import 'database/formulas_database.dart' - if (dart.library.html) 'database/formulas_database_web.dart'; + +import 'database/formulas_database.dart'; GetIt locator = GetIt.instance; diff --git a/web/index.html b/web/index.html index 2c7ddf7..83a8baa 100644 --- a/web/index.html +++ b/web/index.html @@ -34,5 +34,6 @@ +