From cba8016e94dd9bd57a69bb5d4762475b1a103316 Mon Sep 17 00:00:00 2001 From: IANewCool Date: Mon, 11 Aug 2025 20:26:02 -0400 Subject: [PATCH] fix(database): add conditional imports for web/native database connections - Add connection_web.dart for IndexedDB via drift - Add connection_native.dart for sqlite3 - Remove direct platform-specific imports from database.dart - Enable web compilation without FFI dependencies --- lib/models/database/connection_native.dart | 25 ++++++++++++++++ lib/models/database/connection_web.dart | 8 +++++ lib/models/database/database.dart | 34 ++++------------------ 3 files changed, 39 insertions(+), 28 deletions(-) create mode 100644 lib/models/database/connection_native.dart create mode 100644 lib/models/database/connection_web.dart diff --git a/lib/models/database/connection_native.dart b/lib/models/database/connection_native.dart new file mode 100644 index 00000000..591976a6 --- /dev/null +++ b/lib/models/database/connection_native.dart @@ -0,0 +1,25 @@ +import 'dart:io'; +import 'package:drift/drift.dart'; +import 'package:drift/native.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:path/path.dart' as p; +import 'package:sqlite3/sqlite3.dart'; +import 'package:sqlite3_flutter_libs/sqlite3_flutter_libs.dart'; + +DatabaseConnection connect() { + return DatabaseConnection.delayed(Future(() async { + if (Platform.isAndroid) { + await applyWorkaroundToOpenSqlite3OnOldAndroidVersions(); + } + + final cacheBase = (await getTemporaryDirectory()).path; + // Make sqlite3 pick a more suitable location for temporary files - the + // one from the system may be inaccessible due to sandboxing. + // We can't access /tmp on Android, which sqlite3 would try by default. + sqlite3.tempDirectory = cacheBase; + + final appDocDir = await getApplicationDocumentsDirectory(); + final dbPath = p.join(appDocDir.path, 'spotube.db'); + return NativeDatabase(File(dbPath)); + })); +} \ No newline at end of file diff --git a/lib/models/database/connection_web.dart b/lib/models/database/connection_web.dart new file mode 100644 index 00000000..b1dba615 --- /dev/null +++ b/lib/models/database/connection_web.dart @@ -0,0 +1,8 @@ +import 'package:drift/drift.dart'; +import 'package:drift/web.dart'; + +DatabaseConnection connect() { + // IndexedDB vía drift para web + final db = WebDatabase('tunestream_db'); + return DatabaseConnection.fromExecutor(db); +} \ No newline at end of file diff --git a/lib/models/database/database.dart b/lib/models/database/database.dart index 151bbc78..7cadca37 100644 --- a/lib/models/database/database.dart +++ b/lib/models/database/database.dart @@ -1,13 +1,10 @@ library database; import 'dart:convert'; -import 'dart:io'; import 'package:drift/drift.dart'; import 'package:encrypt/encrypt.dart'; import 'package:media_kit/media_kit.dart' hide Track; -import 'package:path/path.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:shadcn_flutter/shadcn_flutter.dart' show ThemeMode, Colors; import 'package:spotify/spotify.dart' hide Playlist; import 'package:spotube/models/database/database.steps.dart'; @@ -17,12 +14,13 @@ import 'package:spotube/services/kv_store/kv_store.dart'; import 'package:spotube/services/sourced_track/enums.dart'; import 'package:flutter/widgets.dart' hide Table, Key, View; import 'package:spotube/modules/settings/color_scheme_picker_dialog.dart'; -import 'package:drift/native.dart'; import 'package:spotube/services/youtube_engine/newpipe_engine.dart'; import 'package:spotube/services/youtube_engine/youtube_explode_engine.dart'; import 'package:spotube/services/youtube_engine/yt_dlp_engine.dart'; -import 'package:sqlite3/sqlite3.dart'; -import 'package:sqlite3_flutter_libs/sqlite3_flutter_libs.dart'; + +// Conditional import para diferentes plataformas +import 'connection_native.dart' + if (dart.library.html) 'connection_web.dart'; part 'database.g.dart'; @@ -126,26 +124,6 @@ class AppDatabase extends _$AppDatabase { } } -LazyDatabase _openConnection() { - // the LazyDatabase util lets us find the right location for the file async. - return LazyDatabase(() async { - // put the database file, called db.sqlite here, into the documents folder - // for your app. - final dbFolder = await getApplicationSupportDirectory(); - final file = File(join(dbFolder.path, 'db.sqlite')); - - // Also work around limitations on old Android versions - if (Platform.isAndroid) { - await applyWorkaroundToOpenSqlite3OnOldAndroidVersions(); - } - - // Make sqlite3 pick a more suitable location for temporary files - the - // one from the system may be inaccessible due to sandboxing. - final cacheBase = (await getTemporaryDirectory()).path; - // We can't access /tmp on Android, which sqlite3 would try by default. - // Explicitly tell it about the correct temporary directory. - sqlite3.tempDirectory = cacheBase; - - return NativeDatabase.createInBackground(file); - }); +DatabaseConnection _openConnection() { + return connect(); }