Skip to content

Commit 4acbd17

Browse files
authored
fix(sqflite): recursion in openDatabase when using SentrySqfliteDatabaseFactory (#3231)
* Fix sqflite recursion * Update Changelog * Update sqflite prefix usage
1 parent 5be269a commit 4acbd17

File tree

3 files changed

+40
-8
lines changed

3 files changed

+40
-8
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
### Fixes
6+
7+
- Recursion in `openDatabase` when using `SentrySqfliteDatabaseFactory` ([#3231](https://github.com/getsentry/sentry-dart/pull/3231))
8+
39
## 9.7.0-beta.2
410

511
### Features

packages/sqflite/lib/src/sentry_sqflite_database_factory.dart

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import 'package:meta/meta.dart';
22
import 'package:sentry/sentry.dart';
3-
import 'package:sqflite/sqflite.dart';
3+
import 'package:sqflite/sqflite.dart' as sqflite;
44
// ignore: implementation_imports
55
import 'package:sqflite_common/src/factory_mixin.dart';
66
// ignore: implementation_imports
@@ -33,31 +33,31 @@ class SentrySqfliteDatabaseFactory with SqfliteDatabaseFactoryMixin {
3333
/// final database = await openDatabase('path/to/db');
3434
/// ```
3535
SentrySqfliteDatabaseFactory({
36-
DatabaseFactory? databaseFactory,
36+
sqflite.DatabaseFactory? databaseFactory,
3737
@internal Hub? hub,
38-
}) : _databaseFactory = databaseFactory,
38+
}) : _databaseFactory = databaseFactory ?? sqflite.databaseFactory,
3939
_hub = hub ?? HubAdapter();
4040

4141
final Hub _hub;
42-
final DatabaseFactory? _databaseFactory;
42+
final sqflite.DatabaseFactory _databaseFactory;
4343

4444
@override
4545
Future<T> invokeMethod<T>(String method, [Object? arguments]) =>
4646
impl.invokeMethod(method, arguments);
4747

4848
@override
49-
Future<Database> openDatabase(
49+
Future<sqflite.Database> openDatabase(
5050
String path, {
51-
OpenDatabaseOptions? options,
51+
sqflite.OpenDatabaseOptions? options,
5252
}) async {
53-
final databaseFactory = _databaseFactory ?? this;
53+
final databaseFactory = _databaseFactory;
5454

5555
// ignore: invalid_use_of_internal_member
5656
if (!_hub.options.isTracingEnabled()) {
5757
return databaseFactory.openDatabase(path, options: options);
5858
}
5959

60-
return Future<Database>(() async {
60+
return Future<sqflite.Database>(() async {
6161
final currentSpan = _hub.getSpan();
6262
final description = 'Open DB: $path';
6363
final span = currentSpan?.startChild(

packages/sqflite/test/sentry_sqflite_database_factory_dart_test.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,32 @@ void main() {
8888
});
8989
});
9090

91+
group('openDatabase without delegate', () {
92+
late Fixture fixture;
93+
94+
setUp(() {
95+
fixture = Fixture();
96+
97+
when(fixture.hub.options).thenReturn(fixture.options);
98+
when(fixture.hub.scope).thenReturn(fixture.scope);
99+
when(fixture.hub.getSpan()).thenReturn(fixture.tracer);
100+
101+
// using ffi for testing on vm
102+
sqfliteFfiInit();
103+
databaseFactory = databaseFactoryFfi;
104+
});
105+
106+
test('does not recurse when calling instance openDatabase', () async {
107+
final wrapper = SentrySqfliteDatabaseFactory(hub: fixture.hub);
108+
109+
final db = await wrapper.openDatabase(inMemoryDatabasePath);
110+
111+
expect(db is SentryDatabase, true);
112+
113+
await db.close();
114+
});
115+
});
116+
91117
tearDown(() {
92118
databaseFactory = sqfliteDatabaseFactoryDefault;
93119
});

0 commit comments

Comments
 (0)