Skip to content

Commit 000ad8a

Browse files
committed
Update bridge
1 parent 9256def commit 000ad8a

File tree

1 file changed

+63
-3
lines changed

1 file changed

+63
-3
lines changed

lib/src/bridge/local_db_bridge.dart

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ typedef PointerBoolFFICallBack = Pointer<Bool> Function( // Usado si delete/clea
2929
typedef PointerBoolFFICallBackDirect = Pointer<Bool> Function( // Usado si clear devuelve Bool sin ID
3030
Pointer<AppDbState>);
3131
typedef PointerListFFICallBack = Pointer<Utf8> Function(Pointer<AppDbState>);
32+
typedef VoidAppDbStateCallBack = Void Function(Pointer<AppDbState>); // Nativo
33+
typedef DartVoidAppDbStateCallBack = void Function(Pointer<AppDbState>); // Dart
3234

3335
// Clase simplificada, sin WidgetsBindingObserver
3436
class LocalDbBridge extends LocalSbRequestImpl {
@@ -56,19 +58,42 @@ class LocalDbBridge extends LocalSbRequestImpl {
5658
Future<void> initialize(String databaseName) async {
5759
try {
5860
log('Initializing DB on platform: ${Platform.operatingSystem}');
61+
62+
// --- LLAMADA A DISPOSE ---
63+
// Intenta cerrar/liberar cualquier instancia nativa previa ANTES de continuar.
64+
await dispose();
65+
log('Previous instance disposed (if any).');
66+
// ------------------------
67+
68+
// Añadir extensión .db si falta
69+
if (!databaseName.contains('.db')) {
70+
log('Adding .db extension to database name.');
71+
databaseName = '$databaseName.db';
72+
}
73+
5974
if (_lib == null) {
6075
_lib = await CurrentPlatform.loadRustNativeLib();
76+
if (_lib case Err(error: final err)) {
77+
// Si la carga de la librería falla, lanzar error inmediatamente
78+
throw Exception("Failed to load native library: $err");
79+
}
6180
log('Library loaded: ${_lib}');
6281
}
82+
83+
// Vincular funciones (esto es seguro llamarlo varias veces si _lib ya existe)
6384
_bindFunctions();
6485
log('Functions bound successfully');
86+
6587
final appDir = await getApplicationDocumentsDirectory();
6688
log('Using app directory: ${appDir.path}');
89+
90+
// Llamar a _init para crear/abrir la nueva instancia
6791
await _init('${appDir.path}/$databaseName');
6892
log('Database initialized successfully');
93+
6994
} catch (e, stack) {
7095
log('Error initializing database: $e \nStack: $stack');
71-
// Relanzar para que la app sepa que la inicialización falló
96+
// Relanzar para que el código que llama a initialize (ej. main) sepa del fallo.
7297
rethrow;
7398
}
7499
}
@@ -87,7 +112,7 @@ class LocalDbBridge extends LocalSbRequestImpl {
87112
late final PointerBoolFFICallBackDirect _clearAllRecords;
88113
// Si devuelven Bool, usa los typedefs comentados abajo y ajusta el lookup y la lógica en los métodos.
89114
// late final PointerBoolFFICallBack _delete;
90-
// late final PointerBoolFFICallBackDirect _clearAllRecords;
115+
late final DartVoidAppDbStateCallBack _closeDatabase;
91116

92117

93118
// _bindFunctions (adaptado para asumir JSON en delete/clear)
@@ -105,6 +130,8 @@ class LocalDbBridge extends LocalSbRequestImpl {
105130
// Si devuelven Bool, usa esto:
106131
// _delete = lib.lookupFunction<PointerBoolFFICallBack, PointerBoolFFICallBack>(FFiFunctions.delete.cName);
107132
// _clearAllRecords = lib.lookupFunction<PointerBoolFFICallBackDirect, PointerBoolFFICallBackDirect>(FFiFunctions.clearAllRecords.cName);
133+
_closeDatabase = lib.lookupFunction<VoidAppDbStateCallBack, DartVoidAppDbStateCallBack>(FFiFunctions.closeDatabase.cName);
134+
108135
break;
109136
case Err(error: String error):
110137
log(error);
@@ -472,7 +499,40 @@ class LocalDbBridge extends LocalSbRequestImpl {
472499
return Err(ErrorLocalDb.unknown('Dart exception during getAll', originalError: error, stackTrace: stackTrace));
473500
}
474501
}
475-
// No hay método dispose
502+
503+
504+
// Método para llamar al cierre nativo
505+
Future<void> dispose() async {
506+
// Verificamos que _dbInstance no sea nullptr ANTES de intentar cerrarla.
507+
// Esto es importante si initialize falló parcialmente o si dispose se llama accidentalmente dos veces.
508+
// Como _dbInstance es `late final`, no puede ser null si initialize tuvo éxito.
509+
// La comprobación principal es contra `nullptr`.
510+
if (_dbInstance != nullptr) {
511+
try {
512+
log('Calling native close_database...');
513+
// Llama a la función FFI que acabamos de vincular
514+
_closeDatabase(_dbInstance);
515+
log('Native close_database called successfully.');
516+
517+
// ¡Importante! Aunque la memoria nativa se libera, _dbInstance en Dart
518+
// todavía contiene la dirección de memoria (ahora inválida).
519+
// Para evitar usarla accidentalmente, lo IDEAL sería ponerla a null.
520+
// PERO, como es `late final`, no podemos.
521+
// La llamada a dispose() ANTES de _init() en el NUEVO initialize()
522+
// se encargará de obtener una NUEVA instancia válida si es necesario.
523+
// Solo debemos asegurarnos de no usar _dbInstance después de llamar a dispose
524+
// hasta que initialize() la reasigne.
525+
526+
} catch (e, s) {
527+
// Captura errores específicos de FFI si ocurren durante el cierre
528+
log('Error calling native close_database: $e\n$s');
529+
// Podrías decidir si relanzar o solo registrar el error.
530+
// En general, un fallo al cerrar es menos crítico que uno al abrir.
531+
}
532+
} else {
533+
log('dispose() called but _dbInstance is nullptr (already closed or never initialized?).');
534+
}
535+
}
476536
}
477537

478538

0 commit comments

Comments
 (0)