From e723c341cb6c0189d22c8bbfbe29be65a726dd40 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Tue, 28 Apr 2026 16:52:34 +0900 Subject: [PATCH] [sqflite_tizen] Update sqflite to 2.4.2 --- packages/sqflite/CHANGELOG.md | 6 +- packages/sqflite/README.md | 4 +- .../integration_test/sqflite_test.dart | 23 +- .../example/lib/database/database.dart | 2 +- .../example/lib/database/database_impl.dart | 8 +- .../example/lib/exception_test_page.dart | 15 +- .../sqflite/example/lib/exp_test_page.dart | 255 ++++++++++++++++-- .../sqflite/example/lib/io_test_page.dart | 71 +++++ packages/sqflite/example/lib/main.dart | 26 +- .../sqflite/example/lib/manual_test_page.dart | 45 +++- packages/sqflite/example/lib/model/item.dart | 15 +- packages/sqflite/example/lib/model/test.dart | 4 +- .../sqflite/example/lib/open_test_page.dart | 28 +- .../sqflite/example/lib/raw_test_page.dart | 64 +++-- .../sqflite/example/lib/slow_test_page.dart | 5 +- packages/sqflite/example/lib/src/expect.dart | 18 +- .../sqflite/example/lib/src/item_widget.dart | 8 +- .../example/lib/src/main_item_widget.dart | 3 +- packages/sqflite/example/lib/test_page.dart | 22 +- .../sqflite/example/lib/type_test_page.dart | 87 ++++-- packages/sqflite/example/lib/utils.dart | 9 +- packages/sqflite/example/pubspec.yaml | 5 +- packages/sqflite/pubspec.yaml | 6 +- 23 files changed, 543 insertions(+), 186 deletions(-) create mode 100644 packages/sqflite/example/lib/io_test_page.dart diff --git a/packages/sqflite/CHANGELOG.md b/packages/sqflite/CHANGELOG.md index f3748bd9a..6634c156c 100644 --- a/packages/sqflite/CHANGELOG.md +++ b/packages/sqflite/CHANGELOG.md @@ -1,6 +1,8 @@ -## NEXT +## 0.1.4 -* Update minimum Flutter and Dart version to 3.13 and 3.1. +* Update sqflite to 2.4.2. +* Update minimum Flutter and Dart version to 3.13 and 3.7. +* Update the example app and integration_test. * Update code format. ## 0.1.3 diff --git a/packages/sqflite/README.md b/packages/sqflite/README.md index 7787a4409..0412e9dc5 100644 --- a/packages/sqflite/README.md +++ b/packages/sqflite/README.md @@ -10,8 +10,8 @@ This package is not an _endorsed_ implementation of `sqflite`. Therefore, you ha ```yaml dependencies: - sqflite: ^2.3.0 - sqflite_tizen: ^0.1.3 + sqflite: ^2.4.2 + sqflite_tizen: ^0.1.4 ``` Then you can import `sqflite` in your Dart code: diff --git a/packages/sqflite/example/integration_test/sqflite_test.dart b/packages/sqflite/example/integration_test/sqflite_test.dart index c7d27f73a..e0202505d 100644 --- a/packages/sqflite/example/integration_test/sqflite_test.dart +++ b/packages/sqflite/example/integration_test/sqflite_test.dart @@ -2,13 +2,12 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +import 'dart:async'; import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; -// ignore: import_of_legacy_library_into_null_safe import 'package:integration_test/integration_test.dart'; import 'package:path/path.dart'; -import 'package:pedantic/pedantic.dart'; import 'package:sqflite/sqflite.dart'; // ignore_for_file: avoid_print @@ -184,10 +183,9 @@ void main() { for (var i = 0; i < count; i++) { final db = dbs[i]!; try { - final name = (await db.query('Test', columns: ['name'])) - .first - .values - .first as String?; + final name = + (await db.query('Test', columns: ['name'])).first.values.first + as String?; expect(name, 'test_$i'); } finally { await db.close(); @@ -256,10 +254,21 @@ void main() { test('deleteDatabase', () async { // await devVerbose(); + const path = 'test_delete_database.db'; + await deleteDatabase(path); + expect(await databaseExists(path), isFalse); + late Database db; try { - const path = 'test_delete_database.db'; + db = await openDatabase(path); + expect(await db.getVersion(), 0); + await db.setVersion(1); + await db.close(); + expect(await databaseExists(path), isTrue); + await deleteDatabase(path); + expect(await databaseExists(path), isFalse); + db = await openDatabase(path); expect(await db.getVersion(), 0); await db.setVersion(1); diff --git a/packages/sqflite/example/lib/database/database.dart b/packages/sqflite/example/lib/database/database.dart index 0fb2b9b9f..c0dc9d684 100644 --- a/packages/sqflite/example/lib/database/database.dart +++ b/packages/sqflite/example/lib/database/database.dart @@ -1,2 +1,2 @@ export 'database_impl.dart'; -export 'database_io.dart' if (dart.library.html) 'database_web.dart'; +export 'database_io.dart' if (dart.library.js_interop) 'database_web.dart'; diff --git a/packages/sqflite/example/lib/database/database_impl.dart b/packages/sqflite/example/lib/database/database_impl.dart index 9166d6131..c204d72ed 100644 --- a/packages/sqflite/example/lib/database/database_impl.dart +++ b/packages/sqflite/example/lib/database/database_impl.dart @@ -52,7 +52,7 @@ abstract class PlatformHandler { // Compat, to keep the example page as is // --- -/// delete the db, create the folder and returnes its path +/// delete the db, create the folder and returns its path Future initDeleteDb(String dbName) => platformHandler.initDeleteDb(dbName); @@ -61,8 +61,7 @@ Future writeFileAsBytes( String path, List bytes, { bool flush = false, -}) => - platformHandler.writeFileAsBytes(path, bytes, flush: flush); +}) => platformHandler.writeFileAsBytes(path, bytes, flush: flush); /// Read a file as bytes Future readFileAsBytes(String path) => @@ -73,8 +72,7 @@ Future writeFileAsString( String path, String text, { bool flush = false, -}) => - platformHandler.writeFileAsString(path, text, flush: flush); +}) => platformHandler.writeFileAsString(path, text, flush: flush); /// Read a file as a string Future readFileAsString(String path) => diff --git a/packages/sqflite/example/lib/exception_test_page.dart b/packages/sqflite/example/lib/exception_test_page.dart index b81904f44..1173197a5 100644 --- a/packages/sqflite/example/lib/exception_test_page.dart +++ b/packages/sqflite/example/lib/exception_test_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:sqflite/sqflite.dart'; -import 'package:sqflite/sql.dart'; +import 'package:sqflite/utils/utils.dart'; +import 'package:sqflite_common/sql.dart'; import 'src/common_import.dart'; import 'test_page.dart'; @@ -24,7 +25,7 @@ class ExceptionTestPage extends TestPage { await txn.rawInsert('INSERT INTO Test (name) VALUES (?)', [ 'item', ]); - final afterCount = Sqflite.firstIntValue( + final afterCount = firstIntValue( await txn.rawQuery('SELECT COUNT(*) FROM Test'), ); expect(afterCount, 1); @@ -40,7 +41,7 @@ class ExceptionTestPage extends TestPage { } verify(hasFailed); - final afterCount = Sqflite.firstIntValue( + final afterCount = firstIntValue( await db.rawQuery('SELECT COUNT(*) FROM Test'), ); expect(afterCount, 0); @@ -69,7 +70,7 @@ class ExceptionTestPage extends TestPage { verify(hasFailed); - final afterCount = Sqflite.firstIntValue( + final afterCount = firstIntValue( await db.rawQuery('SELECT COUNT(*) FROM Test'), ); expect(afterCount, 0); @@ -384,8 +385,8 @@ class ExceptionTestPage extends TestPage { await db.close(); }); - test('Bind no argument (no iOS)', () async { - if (!platform.isIOS) { + test('Bind no argument (no iOS/MacOS)', () async { + if (!platform.isIOS && !platform.isMacOS) { // await Sqflite.devSetDebugModeOn(true); final path = await initDeleteDb('bind_no_arg_failed.db'); final db = await openDatabase(path); @@ -499,7 +500,7 @@ class ExceptionTestPage extends TestPage { try { var hasTimedOut = false; var callbackCount = 0; - Sqflite.setLockWarningInfo( + setLockWarningInfo( duration: const Duration(milliseconds: 200), callback: () { callbackCount++; diff --git a/packages/sqflite/example/lib/exp_test_page.dart b/packages/sqflite/example/lib/exp_test_page.dart index dc4d7223f..c1b7dfe30 100644 --- a/packages/sqflite/example/lib/exp_test_page.dart +++ b/packages/sqflite/example/lib/exp_test_page.dart @@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; +import 'package:sqflite/utils/utils.dart'; import 'package:sqflite_common/sqflite_dev.dart'; import 'package:sqflite_tizen_example/src/common_import.dart'; import 'package:sqflite_tizen_example/utils.dart'; @@ -156,12 +157,9 @@ class ExpTestPage extends TestPage { // inserted in a wrong order to check ASC/DESC await db.insert(table, {'group': 'group_value'}); - await db.update( - table, - { - 'group': 'group_new_value', - }, - where: "\"group\" = 'group_value'"); + await db.update(table, { + 'group': 'group_new_value', + }, where: "\"group\" = 'group_value'"); final expectedResult = [ {'group': 'group_new_value'}, @@ -513,12 +511,9 @@ CREATE TABLE test ( await db.execute('PRAGMA sqflite -- db_config_defensive_off'); await db.execute('PRAGMA writable_schema = ON'); expect( - await db.update( - 'sqlite_master', - { - 'sql': 'CREATE TABLE Test(value BLOB)', - }, - where: 'name = \'Test\' and type = \'table\''), + await db.update('sqlite_master', { + 'sql': 'CREATE TABLE Test(value BLOB)', + }, where: 'name = \'Test\' and type = \'table\''), 1, ); } finally { @@ -533,12 +528,9 @@ CREATE TABLE test ( await db.execute('CREATE TABLE Test(value TEXT)'); await db.execute('PRAGMA writable_schema = ON'); expect( - await db.update( - 'sqlite_master', - { - 'sql': 'CREATE TABLE Test(value BLOB)', - }, - where: 'name = \'Test\' and type = \'table\''), + await db.update('sqlite_master', { + 'sql': 'CREATE TABLE Test(value BLOB)', + }, where: 'name = \'Test\' and type = \'table\''), 1, ); } finally { @@ -546,6 +538,21 @@ CREATE TABLE test ( } }); + test('PRAGMA quick check', () async { + //await databaseFactory.debugSetLogLevel(sqfliteLogLevelVerbose); + final db = await openDatabase(inMemoryDatabasePath); + try { + await db.rawQuery('PRAGMA quick_check'); + + try { + await db.execute('PRAGMA quick_check'); + } catch (e) { + print('execute PRAGMA quick_check failed: $e'); + } + } finally { + await db.close(); + } + }); test('ATTACH database', () async { final db1Path = await initDeleteDb('attach1.db'); final db2Path = await initDeleteDb('attach2.db'); @@ -641,10 +648,7 @@ CREATE TABLE test ( map, conflictAlgorithm: ConflictAlgorithm.replace, ); - expect( - Sqflite.firstIntValue(await db.query(table, columns: ['COUNT(*)'])), - 1, - ); + expect(firstIntValue(await db.query(table, columns: ['COUNT(*)'])), 1); } finally { // ignore: deprecated_member_use await databaseFactory.setLogLevel(sqfliteLogLevelNone); @@ -799,17 +803,33 @@ CREATE TABLE test ( } await db.close(); }); - // Issue https://github.com/tekartik/sqflite/issues/929 + + Future getJournalMode(Database db) async { + var result = await db.rawQuery('PRAGMA journal_mode'); + var journalMode = result.first.values.first!.toString(); + return journalMode; + } + + Future getAutoVacuum(Database db) async { + var result = await db.rawQuery('PRAGMA auto_vacuum'); + var autoVacuum = firstIntValue(result); + return autoVacuum; + } + + // Issue https://github.com/tekartik/sqflite_common/issues/929 // Pragma has to use rawQuery...why, on sqflite Android test('wal', () async { - // await Sqflite.devSetDebugModeOn(true); - var db = await openDatabase(inMemoryDatabasePath); + final path = await initDeleteDb('exp_wal.db'); + var db = await openDatabase(path); try { await db.execute('PRAGMA journal_mode=WAL'); } catch (e) { - print(e); await db.rawQuery('PRAGMA journal_mode=WAL'); } + expect((await getJournalMode(db)).toLowerCase(), 'wal'); + await db.setJournalMode('DELETE'); + expect((await getJournalMode(db)).toLowerCase(), 'delete'); + await db.setJournalMode('WAL'); await db.execute('CREATE TABLE test (id INTEGER)'); await db.insert('test', {'id': 1}); try { @@ -821,6 +841,189 @@ CREATE TABLE test ( await db.close(); } }); + + test('auto_vacuum and wal', () async { + final path = await initDeleteDb('exp_auto_vacuum_and wal.db'); + var options = OpenDatabaseOptions( + version: 1, + onConfigure: (db) async { + // Check the version to know if the database exists + // auto_vacuum mode must be set before tables are created + var version = await db.getVersion(); + if (version == 0) { + await db.execute('PRAGMA auto_vacuum = 2'); + } + var journalMode = (await getJournalMode(db)).toLowerCase(); + if (journalMode != 'wal') { + await db.setJournalMode('WAL'); + } + }, + onCreate: (db, version) async { + await db.execute('CREATE TABLE test (id INTEGER)'); + }, + ); + var db = await databaseFactory.openDatabase(path, options: options); + try { + await db.insert('test', {'id': 1}); + + Future checkData() async { + expect((await getJournalMode(db)).toLowerCase(), 'wal'); + expect(await getAutoVacuum(db), 2); + var resultSet = await db.rawQuery('SELECT id FROM test'); + expect(resultSet, [ + {'id': 1}, + ]); + } + + await checkData(); + + /// Close and re-open and check the data + await db.close(); + db = await databaseFactory.openDatabase(path, options: options); + await checkData(); + } finally { + await db.close(); + } + }); + + Future supports(String exec) async { + final db = await databaseFactory.openDatabase(inMemoryDatabasePath); + print('supports: $exec'); + try { + await db.execute(exec); + return true; + } catch (e) { + print('does not support $exec: $e'); + return false; + } finally { + await db.close(); + } + } + + late final supportsFts3 = supports( + 'CREATE VIRTUAL TABLE foo USING fts3(title, content)', + ); + late final supportsFts4 = supports( + 'CREATE VIRTUAL TABLE foo USING fts4(title, content)', + ); + late final supportsFts5 = supports( + 'CREATE VIRTUAL TABLE foo USING fts5(title, content)', + ); + + test('fts3', () async { + if (!await supportsFts3) { + print('fts3 not supported'); + return false; + } + + var path = await initDeleteDb('exp_fts3.db'); + + /// Simple fts3 test + var db = await databaseFactory.openDatabase( + path, + options: OpenDatabaseOptions( + version: 1, + onCreate: (Database db, int version) async { + await db.execute( + 'CREATE VIRTUAL TABLE test USING fts3(title, body)', + ); + + await db.insert('test', { + 'title': 'Test1', + 'body': 'without quote', + }); + await db.insert('test', { + 'title': 'Test2', + 'body': "with ' quote", + }); + }, + ), + ); + + var resultSet = await db.query( + 'test', + where: 'body MATCH ?', + whereArgs: ['quote'], + ); + expect(resultSet.length, 2); + await db.close(); + }); + test('fts4', () async { + if (!await supportsFts4) { + print('fts4 not supported'); + return false; + } + + var path = await initDeleteDb('exp_fts4.db'); + + /// Simple fts4 test + var db = await databaseFactory.openDatabase( + path, + options: OpenDatabaseOptions( + version: 1, + onCreate: (Database db, int version) async { + await db.execute( + 'CREATE VIRTUAL TABLE test USING fts4(title, body)', + ); + + await db.insert('test', { + 'title': 'Test1', + 'body': 'without quote', + }); + await db.insert('test', { + 'title': 'Test2', + 'body': "with ' quote", + }); + }, + ), + ); + + var resultSet = await db.query( + 'test', + where: 'body MATCH ?', + whereArgs: ['quote'], + ); + expect(resultSet.length, 2); + await db.close(); + }); + test('fts5', () async { + if (!await supportsFts5) { + print('fts5 not supported'); + return false; + } + + var path = await initDeleteDb('exp_fts5.db'); + + /// Simple fts5 test + var db = await databaseFactory.openDatabase( + path, + options: OpenDatabaseOptions( + version: 1, + onCreate: (Database db, int version) async { + await db.execute( + 'CREATE VIRTUAL TABLE test USING fts5(title, body)', + ); + + await db.insert('test', { + 'title': 'Test1', + 'body': 'without quote', + }); + await db.insert('test', { + 'title': 'Test2', + 'body': "with ' quote", + }); + }, + ), + ); + + var resultSet = await db.query( + 'test', + where: 'body MATCH ?', + whereArgs: ['quote'], + ); + expect(resultSet.length, 2); + await db.close(); + }); } } diff --git a/packages/sqflite/example/lib/io_test_page.dart b/packages/sqflite/example/lib/io_test_page.dart new file mode 100644 index 000000000..22b903544 --- /dev/null +++ b/packages/sqflite/example/lib/io_test_page.dart @@ -0,0 +1,71 @@ +import 'dart:io' as io; + +import 'package:flutter/foundation.dart'; +import 'package:path/path.dart'; +import 'package:sqflite/sqflite.dart'; + +import 'src/common_import.dart'; +import 'test_page.dart'; + +/// Open test page. +class IoTestPage extends TestPage { + /// Open test page. + IoTestPage({Key? key}) : super('IO tests', key: key) { + // ignore: unused_local_variable + final factory = databaseFactory; + + test('Delete database', () async { + //await factory.setLogLevel(sqfliteLogLevelVerbose); + final path = await initDeleteDb('delete_io_database.db'); + // print(path); + Future> findDbRelatedFiles() async { + var dir = io.Directory(dirname(path)); + var files = + await dir + .list() + .map((e) => basename(e.path)) + .where((e) => e.startsWith(basename(path))) + .toList(); + // print('files: $files'); + return files; + } + + expect(await findDbRelatedFiles(), isEmpty); + + var db = await openDatabase( + path, + version: 1, + onCreate: (db, version) async { + await db.execute('CREATE TABLE Test (id INTEGER PRIMARY KEY)'); + }, + ); + expect(await findDbRelatedFiles(), isNotEmpty); + await db.close(); + + expect(await findDbRelatedFiles(), isNotEmpty); + await deleteDatabase(path); + expect(await findDbRelatedFiles(), isEmpty); + + // try wal mode + db = await openDatabase( + path, + version: 1, + onConfigure: (db) async { + try { + await db.execute('PRAGMA journal_mode = WAL'); + } catch (e) { + if (kDebugMode) { + print('Error setting WAL mode: $e'); + } + } + }, + onCreate: (db, version) async { + await db.execute('CREATE TABLE Test (id INTEGER PRIMARY KEY)'); + }, + ); + expect(await findDbRelatedFiles(), isNotEmpty); + await deleteDatabase(path); + expect(await findDbRelatedFiles(), isEmpty); + }); + } +} diff --git a/packages/sqflite/example/lib/main.dart b/packages/sqflite/example/lib/main.dart index ec73cbdcb..77ecf8d44 100644 --- a/packages/sqflite/example/lib/main.dart +++ b/packages/sqflite/example/lib/main.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:sqflite_tizen_example/batch_test_page.dart'; import 'package:sqflite_tizen_example/deprecated_test_page.dart'; @@ -8,6 +9,7 @@ import 'package:sqflite_tizen_example/exp_test_page.dart'; import 'package:sqflite_tizen_example/manual_test_page.dart'; import 'package:sqflite_tizen_example/src/dev_utils.dart'; +import 'io_test_page.dart'; import 'model/main_item.dart'; import 'open_test_page.dart'; import 'raw_test_page.dart'; @@ -15,6 +17,7 @@ import 'slow_test_page.dart'; import 'src/main_item_widget.dart'; import 'todo_test_page.dart'; import 'type_test_page.dart'; +export 'utils.dart' show supportsCompatMode; void main() { mainExampleApp(); @@ -32,7 +35,7 @@ void mainExampleApp() { /// Sqflite test app class SqfliteExampleApp extends StatefulWidget { /// test app. - const SqfliteExampleApp({Key? key}) : super(key: key); + const SqfliteExampleApp({super.key}); // This widget is the root of your application. @override @@ -67,9 +70,15 @@ const String testManualRoute = '/test/manual'; /// Experiment test page. const String testExpRoute = '/test/exp'; +/// IO only test page. +const String testIoRoute = '/test/io'; + /// Deprecated test page. const String testDeprecatedRoute = '/test/deprecated'; +/// Extra routes added by the application. +Map? extraRoutes; + class _SqfliteExampleAppState extends State { var routes = { '/test': (BuildContext context) => MyHomePage(), @@ -82,8 +91,9 @@ class _SqfliteExampleAppState extends State { testBatchRoute: (BuildContext context) => BatchTestPage(), testExceptionRoute: (BuildContext context) => ExceptionTestPage(), testExpRoute: (BuildContext context) => ExpTestPage(), + if (!kIsWeb) testIoRoute: (BuildContext context) => IoTestPage(), testDeprecatedRoute: (BuildContext context) => DeprecatedTestPage(), - }; + }..addAll(extraRoutes ?? {}); @override Widget build(BuildContext context) { @@ -110,7 +120,7 @@ class _SqfliteExampleAppState extends State { /// App home menu page. class MyHomePage extends StatefulWidget { /// App home menu page. - MyHomePage({Key? key, this.title}) : super(key: key) { + MyHomePage({super.key, this.title}) { _items.add( MainItem('Raw tests', 'Raw SQLite operations', route: testRawRoute), ); @@ -151,6 +161,9 @@ class MyHomePage extends StatefulWidget { route: testExceptionRoute, ), ); + if (!kIsWeb) { + _items.add(MainItem('IO tests', 'IO tests', route: testIoRoute)); + } _items.add( MainItem( 'Manual tests', @@ -158,6 +171,7 @@ class MyHomePage extends StatefulWidget { route: testManualRoute, ), ); + _items.add( MainItem( 'Deprecated test', @@ -165,7 +179,11 @@ class MyHomePage extends StatefulWidget { route: testDeprecatedRoute, ), ); - + if (extraRoutes != null) { + for (var entry in extraRoutes!.entries) { + _items.add(MainItem(entry.key, 'Extra test', route: entry.key)); + } + } // Uncomment to view all logs //Sqflite.devSetDebugModeOn(true); } diff --git a/packages/sqflite/example/lib/manual_test_page.dart b/packages/sqflite/example/lib/manual_test_page.dart index 629872aac..cae77cdad 100644 --- a/packages/sqflite/example/lib/manual_test_page.dart +++ b/packages/sqflite/example/lib/manual_test_page.dart @@ -1,10 +1,12 @@ import 'dart:typed_data'; import 'package:flutter/material.dart'; +import 'package:path/path.dart' hide context; import 'package:sqflite/sqflite.dart'; // ignore: implementation_imports import 'package:sqflite/src/factory_mixin.dart' as impl; import 'package:sqflite/utils/utils.dart'; +import 'package:sqflite_common/sqflite_dev.dart'; import 'package:sqflite_tizen_example/src/item_widget.dart'; import 'package:sqflite_tizen_example/utils.dart'; @@ -16,7 +18,7 @@ import 'src/common_import.dart'; /// Manual test page. class ManualTestPage extends StatefulWidget { /// Test page. - const ManualTestPage({Key? key}) : super(key: key); + const ManualTestPage({super.key}); @override // ignore: library_private_types_in_public_api @@ -38,8 +40,19 @@ class _ManualTestPageState extends State { ); } - Future _openDatabase() async { - return database ??= await databaseFactory.openDatabase(dbName); + Future _openDatabase({bool wal = false}) async { + var path = await getDatabasesPath(); + print('path ${join(path, dbName)}'); + return database ??= await databaseFactory.openDatabase( + dbName, + options: OpenDatabaseOptions( + onConfigure: (db) async { + if (wal) { + await db.execute('PRAGMA journal_mode = WAL'); + } + }, + ), + ); } Future _closeDatabase() async { @@ -52,9 +65,9 @@ class _ManualTestPageState extends State { } Future _incrementVersion() async { - final version = await database?.getVersion() ?? 0; + final version = await database!.getVersion(); print('version $version'); - await database?.setVersion(version + 1); + await database!.setVersion(version + 1); } late List items; @@ -109,6 +122,12 @@ class _ManualTestPageState extends State { SqfMenuItem('openDatabase', () async { await _openDatabase(); }, summary: 'Open the database'), + SqfMenuItem('openDatabase WAL', () async { + await _openDatabase(wal: true); + }, summary: 'Open the database on set WAL mode'), + SqfMenuItem('transaction add and query', () async { + await _addAndQuery(); + }, summary: 'open/create table/add/query'), SqfMenuItem( 'transaction add and query and pause', () async { @@ -150,21 +169,21 @@ class _ManualTestPageState extends State { ), SqfMenuItem('log level: none', () async { // ignore: deprecated_member_use - await Sqflite.devSetOptions( + await databaseFactory.setOptions( // ignore: deprecated_member_use SqfliteOptions(logLevel: sqfliteLogLevelNone), ); }, summary: 'No logs'), SqfMenuItem('log level: sql', () async { // ignore: deprecated_member_use - await Sqflite.devSetOptions( + await databaseFactory.setOptions( // ignore: deprecated_member_use SqfliteOptions(logLevel: sqfliteLogLevelSql), ); }, summary: 'Log sql command and basic database operation'), SqfMenuItem('log level: verbose', () async { // ignore: deprecated_member_use - await Sqflite.devSetOptions( + await databaseFactory.setOptions( // ignore: deprecated_member_use SqfliteOptions(logLevel: sqfliteLogLevelVerbose), ); @@ -256,12 +275,13 @@ class _ManualTestPageState extends State { /// Multiple db test page. class MultipleDbTestPage extends StatelessWidget { /// Test page. - const MultipleDbTestPage({Key? key}) : super(key: key); + const MultipleDbTestPage({super.key}); @override Widget build(BuildContext context) { Widget dbTile(String name) { return ListTile( + dense: true, title: Text(name), onTap: () { Navigator.of(context).push( @@ -291,7 +311,7 @@ class MultipleDbTestPage extends StatelessWidget { /// Simple db test page. class SimpleDbTestPage extends StatefulWidget { /// Simple db test page. - const SimpleDbTestPage({Key? key, required this.dbName}) : super(key: key); + const SimpleDbTestPage({super.key, required this.dbName}); /// db name. final String dbName; @@ -305,7 +325,7 @@ class _SimpleDbTestPageState extends State { Database? database; Future _openDatabase() async { - // await Sqflite.devSetOptions(SqfliteOptions(logLevel: sqfliteLogLevelVerbose)); + // await databaseFactory.setOptions(SqfliteOptions(logLevel: sqfliteLogLevelVerbose)); return database ??= await databaseFactory.openDatabase( widget.dbName, options: OpenDatabaseOptions( @@ -339,6 +359,7 @@ class _SimpleDbTestPageState extends State { String? summary, }) { return ListTile( + dense: true, title: Text(title), subtitle: summary == null ? null : Text(summary), onTap: onTap, @@ -350,7 +371,7 @@ class _SimpleDbTestPageState extends State { final result = firstIntValue( await db.query('test', columns: ['COUNT(*)']), ); - // Temp for nnbd successfull lint + // Temp for nnbd successful lint if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( diff --git a/packages/sqflite/example/lib/model/item.dart b/packages/sqflite/example/lib/model/item.dart index 881450900..58a8c8c4e 100644 --- a/packages/sqflite/example/lib/model/item.dart +++ b/packages/sqflite/example/lib/model/item.dart @@ -13,6 +13,9 @@ enum ItemState { /// test fails. failure, + + /// test warning + warning, // when false is returned } /// Menu item. @@ -30,7 +33,7 @@ class Item { /// Menu item implementation. class SqfMenuItem extends Item { /// Menu item implementation. - SqfMenuItem(String name, this.body, {this.summary}) : super(name) { + SqfMenuItem(super.name, this.body, {this.summary}) { state = ItemState.none; } @@ -42,8 +45,12 @@ class SqfMenuItem extends Item { state = ItemState.running; return Future.delayed(const Duration()).then((_) async { try { - await body(); - state = ItemState.success; + var result = await body(); + if (result == false) { + state = ItemState.warning; + } else { + state = ItemState.success; + } } catch (e) { state = ItemState.failure; rethrow; @@ -52,5 +59,5 @@ class SqfMenuItem extends Item { } /// Menu item body. - final FutureOr Function() body; + final FutureOr Function() body; } diff --git a/packages/sqflite/example/lib/model/test.dart b/packages/sqflite/example/lib/model/test.dart index fad2fd769..5a4a363f7 100644 --- a/packages/sqflite/example/lib/model/test.dart +++ b/packages/sqflite/example/lib/model/test.dart @@ -4,8 +4,8 @@ import 'dart:async'; class Test { /// Test definition. Test(this.name, this.fn, {bool? solo, bool? skip}) - : solo = solo == true, - skip = skip == true; + : solo = solo == true, + skip = skip == true; /// Only run this test. final bool solo; diff --git a/packages/sqflite/example/lib/open_test_page.dart b/packages/sqflite/example/lib/open_test_page.dart index a797f0d68..dfd9fa92b 100644 --- a/packages/sqflite/example/lib/open_test_page.dart +++ b/packages/sqflite/example/lib/open_test_page.dart @@ -4,11 +4,10 @@ import 'package:flutter/services.dart'; import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; import 'package:sqflite/src/database_mixin.dart' // ignore: implementation_imports - show - SqfliteDatabaseMixin; + show SqfliteDatabaseMixin; import 'package:sqflite/src/factory_mixin.dart' // ignore: implementation_imports - show - SqfliteDatabaseFactoryMixin; + show SqfliteDatabaseFactoryMixin; +import 'package:sqflite/utils/utils.dart'; import 'package:synchronized/synchronized.dart'; import 'src/common_import.dart'; @@ -160,7 +159,7 @@ class OpenTestPage extends TestPage { expect(await databaseExists(path), false); final db = await openDatabase(path); await db.close(); - expect((await pathExists(path)), true); + expect(await pathExists(path), true); expect(await databaseExists(path), true); print('Deleting database $path'); await deleteDatabase(path); @@ -581,10 +580,7 @@ class OpenTestPage extends TestPage { onCreate: onCreate, onOpen: onOpen, ); - expect( - Sqflite.firstIntValue(await db.rawQuery('SELECT COUNT(*) FROM Test')), - 2, - ); + expect(firstIntValue(await db.rawQuery('SELECT COUNT(*) FROM Test')), 2); await db.close(); }); @@ -602,18 +598,12 @@ class OpenTestPage extends TestPage { } var db = await openDatabase(path, version: 1, onCreate: onCreate); - expect( - Sqflite.firstIntValue(await db.rawQuery('SELECT COUNT(*) FROM Test')), - 1, - ); + expect(firstIntValue(await db.rawQuery('SELECT COUNT(*) FROM Test')), 1); await db.close(); db = await openReadOnlyDatabase(path); - expect( - Sqflite.firstIntValue(await db.rawQuery('SELECT COUNT(*) FROM Test')), - 1, - ); + expect(firstIntValue(await db.rawQuery('SELECT COUNT(*) FROM Test')), 1); try { await db.rawInsert('INSERT INTO Test(value) VALUES(?)', ['value1']); @@ -915,8 +905,8 @@ class OpenTestPage extends TestPage { await db.execute('BEGIN IMMEDIATE'); // Trick to make sure we don't reuse the same instance during open (factory as SqfliteDatabaseFactoryMixin).databaseOpenHelpers.remove( - db.path, - ); + db.path, + ); final db2 = await factory.openDatabase( path, diff --git a/packages/sqflite/example/lib/raw_test_page.dart b/packages/sqflite/example/lib/raw_test_page.dart index 47585f401..3fb7dd402 100644 --- a/packages/sqflite/example/lib/raw_test_page.dart +++ b/packages/sqflite/example/lib/raw_test_page.dart @@ -15,7 +15,7 @@ class RawTestPage extends TestPage { /// Raw test page. RawTestPage({Key? key}) : super('Raw tests', key: key) { test('Simple', () async { - // await Sqflite.devSetDebugModeOn(true); + // await databaseFactory.setLogLevel(sqfliteLogLevelVerbose); final path = await initDeleteDb('raw_simple.db'); final db = await openDatabase(path); @@ -104,15 +104,14 @@ class RawTestPage extends TestPage { Future testItem(int i) async { await db.transaction((txn) async { - final count = Sqflite.firstIntValue( - await txn.rawQuery('SELECT COUNT(*) FROM Test'), - )!; + final count = + firstIntValue(await txn.rawQuery('SELECT COUNT(*) FROM Test'))!; await Future.delayed(const Duration(milliseconds: 40)); await txn.rawInsert('INSERT INTO Test (name) VALUES (?)', [ 'item $i', ]); //print(await db.query('SELECT COUNT(*) FROM Test')); - final afterCount = Sqflite.firstIntValue( + final afterCount = firstIntValue( await txn.rawQuery('SELECT COUNT(*) FROM Test'), ); expect(count + 1, afterCount); @@ -168,7 +167,7 @@ class RawTestPage extends TestPage { await step3.future; - final count = Sqflite.firstIntValue( + final count = firstIntValue( await txn.rawQuery('SELECT COUNT(*) FROM Test'), ); expect(count, 1); @@ -180,7 +179,7 @@ class RawTestPage extends TestPage { await Future.wait([future1, future2]); - final count = Sqflite.firstIntValue( + final count = firstIntValue( await db.rawQuery('SELECT COUNT(*) FROM Test'), ); expect(count, 1); @@ -231,7 +230,7 @@ class RawTestPage extends TestPage { await step3.future; - final count = Sqflite.firstIntValue( + final count = firstIntValue( await txn.rawQuery('SELECT COUNT(*) FROM Test'), ); expect(count, 1); @@ -243,7 +242,7 @@ class RawTestPage extends TestPage { await Future.wait([future1, future2]); - final count = Sqflite.firstIntValue( + final count = firstIntValue( await db.rawQuery('SELECT COUNT(*) FROM Test'), ); expect(count, 1); @@ -266,7 +265,7 @@ class RawTestPage extends TestPage { await txn.rawInsert('INSERT INTO Test (name) VALUES (?)', ['item 2']); }); - final afterCount = Sqflite.firstIntValue( + final afterCount = firstIntValue( await db.rawQuery('SELECT COUNT(*) FROM Test'), ); expect(afterCount, 2); @@ -289,7 +288,7 @@ class RawTestPage extends TestPage { await db.transaction((txn) async { await txn.rawInsert('INSERT INTO Test (name) VALUES (?)', ['item']); - final afterCount = Sqflite.firstIntValue( + final afterCount = firstIntValue( await txn.rawQuery('SELECT COUNT(*) FROM Test'), ); expect(afterCount, 1); @@ -297,16 +296,16 @@ class RawTestPage extends TestPage { /* // this is not working on Android int db2AfterCount = - Sqflite.firstIntValue(await db2.rawQuery('SELECT COUNT(*) FROM Test')); + firstIntValue(await db2.rawQuery('SELECT COUNT(*) FROM Test')); assert(db2AfterCount == 0); */ }); - final db2AfterCount = Sqflite.firstIntValue( + final db2AfterCount = firstIntValue( await db2.rawQuery('SELECT COUNT(*) FROM Test'), ); expect(db2AfterCount, 1); - final afterCount = Sqflite.firstIntValue( + final afterCount = firstIntValue( await db.rawQuery('SELECT COUNT(*) FROM Test'), ); expect(afterCount, 1); @@ -386,9 +385,11 @@ class RawTestPage extends TestPage { // Make sure the directory exists try { - // ignore: avoid_slow_async_io - if (!await io.Directory(databasesPath).exists()) { - await io.Directory(databasesPath).create(recursive: true); + if (!kIsWeb) { + // ignore: avoid_slow_async_io + if (!await io.Directory(databasesPath).exists()) { + await io.Directory(databasesPath).create(recursive: true); + } } } catch (_) {} @@ -443,9 +444,10 @@ class RawTestPage extends TestPage { expect(list, expectedList); // Count the records - count = (Sqflite.firstIntValue( - await database.rawQuery('SELECT COUNT(*) FROM Test'), - ))!; + count = + (firstIntValue( + await database.rawQuery('SELECT COUNT(*) FROM Test'), + ))!; expect(count, 2); // Delete a record @@ -469,7 +471,7 @@ class RawTestPage extends TestPage { ); db2 = await openReadOnlyDatabase(path); - final count = Sqflite.firstIntValue( + final count = firstIntValue( await db2.rawQuery('SELECT COUNT(*) FROM Test'), ); expect(count, 0); @@ -520,8 +522,8 @@ class RawTestPage extends TestPage { 'CREATE TABLE Test (name TEXT PRIMARY KEY) WITHOUT ROWID', ); var id = await db.insert('Test', {'name': 'test'}); - expect(id, 0); + expect(id, 0); id = await db.insert('Test', {'name': 'other'}); expect(id, 0); @@ -671,21 +673,15 @@ class RawTestPage extends TestPage { } on StateError catch (_) {} // No data - cursor = await db.rawQueryCursor( - 'SELECT * FROM test WHERE id > ?', - [ - 3, - ], - bufferSize: 2); + cursor = await db.rawQueryCursor('SELECT * FROM test WHERE id > ?', [ + 3, + ], bufferSize: 2); expect(await cursor.moveNext(), isFalse); // Matching page size - cursor = await db.rawQueryCursor( - 'SELECT * FROM test WHERE id > ?', - [ - 1, - ], - bufferSize: 2); + cursor = await db.rawQueryCursor('SELECT * FROM test WHERE id > ?', [ + 1, + ], bufferSize: 2); expect(await cursor.moveNext(), isTrue); expect(await cursor.moveNext(), isTrue); expect(await cursor.moveNext(), isFalse); diff --git a/packages/sqflite/example/lib/slow_test_page.dart b/packages/sqflite/example/lib/slow_test_page.dart index 684dd1485..d0f6bddd9 100644 --- a/packages/sqflite/example/lib/slow_test_page.dart +++ b/packages/sqflite/example/lib/slow_test_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/foundation.dart'; import 'package:sqflite/sqflite.dart'; +import 'package:sqflite_common/sqflite_dev.dart'; import 'src/common_import.dart'; import 'test_page.dart'; @@ -83,7 +84,7 @@ class SlowTestPage extends TestPage { if (platform.isAndroid) { test('Perf android NORMAL_PRIORITY', () async { // ignore_for_file: deprecated_member_use, deprecated_member_use_from_same_package - await Sqflite.devSetOptions( + await databaseFactory.setOptions( SqfliteOptions()..androidThreadPriority = 0, ); try { @@ -91,7 +92,7 @@ class SlowTestPage extends TestPage { await perfDo(count); } finally { // Background priority - await Sqflite.devSetOptions( + await databaseFactory.setOptions( SqfliteOptions()..androidThreadPriority = 10, ); } diff --git a/packages/sqflite/example/lib/src/expect.dart b/packages/sqflite/example/lib/src/expect.dart index d07d7e485..a8d4cbe8d 100644 --- a/packages/sqflite/example/lib/src/expect.dart +++ b/packages/sqflite/example/lib/src/expect.dart @@ -21,13 +21,14 @@ class TestFailure { /// The type used for functions that can be used to build up error reports /// upon failures in [expect]. @Deprecated('Will be removed in 0.13.0.') -typedef ErrorFormatter = String Function( - dynamic actual, - Matcher matcher, - String? reason, - Map matchState, - bool verbose, -); +typedef ErrorFormatter = + String Function( + dynamic actual, + Matcher matcher, + String? reason, + Map matchState, + bool verbose, + ); /// Assert that [actual] matches [matcher]. /// @@ -73,8 +74,7 @@ Future expectLater( Object? matcher, { String? reason, Object? skip, -}) => - _expect(actual, matcher, reason: reason, skip: skip) as Future; +}) => _expect(actual, matcher, reason: reason, skip: skip) as Future; String _formatFailure( Matcher expected, diff --git a/packages/sqflite/example/lib/src/item_widget.dart b/packages/sqflite/example/lib/src/item_widget.dart index 5e56b68cb..e12fcf15f 100644 --- a/packages/sqflite/example/lib/src/item_widget.dart +++ b/packages/sqflite/example/lib/src/item_widget.dart @@ -4,8 +4,7 @@ import 'package:sqflite_tizen_example/model/item.dart'; /// Item widget. class ItemWidget extends StatefulWidget { /// Item widget. - const ItemWidget(this.item, this.onTap, {this.summary, Key? key}) - : super(key: key); + const ItemWidget(this.item, this.onTap, {this.summary, super.key}); /// item summary. final String? summary; @@ -42,8 +41,13 @@ class _ItemWidgetState extends State { icon = Icons.close; color = Colors.red; break; + case ItemState.warning: + icon = Icons.warning; + color = Colors.orange; + break; } return ListTile( + dense: true, // isThreeLine: widget.summary != null, leading: SizedBox( child: IconButton( diff --git a/packages/sqflite/example/lib/src/main_item_widget.dart b/packages/sqflite/example/lib/src/main_item_widget.dart index da3adee92..a7c707932 100644 --- a/packages/sqflite/example/lib/src/main_item_widget.dart +++ b/packages/sqflite/example/lib/src/main_item_widget.dart @@ -4,7 +4,7 @@ import 'package:sqflite_tizen_example/model/main_item.dart'; /// Main item widget. class MainItemWidget extends StatefulWidget { /// Main item widget. - const MainItemWidget(this.item, this.onTap, {Key? key}) : super(key: key); + const MainItemWidget(this.item, this.onTap, {super.key}); /// item data. final MainItem item; @@ -21,6 +21,7 @@ class _MainItemWidgetState extends State { @override Widget build(BuildContext context) { return ListTile( + dense: true, title: Text(widget.item.title), subtitle: Text(widget.item.description), onTap: _onTap, diff --git a/packages/sqflite/example/lib/test_page.dart b/packages/sqflite/example/lib/test_page.dart index b0073d96b..b590479d5 100644 --- a/packages/sqflite/example/lib/test_page.dart +++ b/packages/sqflite/example/lib/test_page.dart @@ -1,6 +1,9 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:meta/meta.dart'; +import 'package:sqflite/sqflite.dart'; +import 'package:sqflite_common/sqflite_dev.dart'; import 'package:sqflite_tizen_example/src/common_import.dart'; import 'package:sqflite_tizen_example/src/expect.dart'; @@ -17,7 +20,7 @@ export 'src/expect.dart' show expect, fail; /// Base test page. class TestPage extends StatefulWidget { /// Base test page. - TestPage(this.title, {Key? key}) : super(key: key); + TestPage(this.title, {super.key}); /// The title. final String title; @@ -30,6 +33,13 @@ class TestPage extends StatefulWidget { tests.add(Test(name, fn)); } + @doNotSubmit + /// Enable extra debug when needed + Future enableDebug() async { + // ignore: deprecated_member_use + await databaseFactory.setLogLevel(sqfliteLogLevelVerbose); + } + /// define a solo test. @Deprecated('SOLO_TEST - On purpose to remove before checkin') // ignore: non_constant_identifier_names @@ -122,9 +132,10 @@ class _TestPageState extends State with Group { items.add(item); }); try { - await test.fn(); + var result = await test.fn(); - item = Item(test.name)..state = ItemState.success; + item = Item(test.name) + ..state = result == false ? ItemState.warning : ItemState.success; } catch (e, st) { print(e); print(st); @@ -154,10 +165,11 @@ class _TestPageState extends State with Group { }); try { print('TEST Running ${test.name}'); - await test.fn(); + var result = await test.fn(); print('TEST Done ${test.name}'); - item = Item(test.name)..state = ItemState.success; + item = Item(test.name) + ..state = (result == false) ? ItemState.warning : ItemState.success; } catch (e, st) { print('TEST Error $e running ${test.name}'); try { diff --git a/packages/sqflite/example/lib/type_test_page.dart b/packages/sqflite/example/lib/type_test_page.dart index cb231e707..b0a0c01c8 100644 --- a/packages/sqflite/example/lib/type_test_page.dart +++ b/packages/sqflite/example/lib/type_test_page.dart @@ -1,8 +1,8 @@ -import 'dart:async'; import 'dart:math'; import 'package:flutter/foundation.dart'; import 'package:sqflite/sqflite.dart'; +import 'package:sqflite/utils/utils.dart'; import 'package:sqflite_tizen_example/utils.dart'; import 'test_page.dart'; @@ -41,23 +41,41 @@ class TypeTestPage extends TestPage { //devPrint('2^33: ${await getValue(id)}'); expect(await getValue(id), pow(2, 33)); - id = await insertValue(pow(2, 62)); - //devPrint('2^62: ${pow(2, 62)} ${await getValue(id)}'); - expect( - await getValue(id), - pow(2, 62), - reason: '2^62: ${pow(2, 62)} ${await getValue(id)}', - ); + // about web limits + id = await insertValue(pow(2, 53)); + expect(await getValue(id), pow(2, 53)); + + if (!kIsWeb) { + // Not for web + id = await insertValue(pow(2, 62)); + //devPrint('2^62: ${pow(2, 62)} ${await getValue(id)}'); + expect( + await getValue(id), + pow(2, 62), + reason: '2^62: ${pow(2, 62)} ${await getValue(id)}', + ); - var value = pow(2, 63).round() - 1; - id = await insertValue(value); - //devPrint('${value} ${await getValue(id)}'); - expect(await getValue(id), value, reason: '$value ${await getValue(id)}'); + var value = pow(2, 63).round() - 1; + id = await insertValue(value); + //devPrint('${value} ${await getValue(id)}'); + expect( + await getValue(id), + value, + reason: '$value ${await getValue(id)}', + ); - value = -(pow(2, 63)).round(); - id = await insertValue(value); - //devPrint('${value} ${await getValue(id)}'); - expect(await getValue(id), value, reason: '$value ${await getValue(id)}'); + value = -(pow(2, 63)).round(); + id = await insertValue(value); + //devPrint('${value} ${await getValue(id)}'); + expect( + await getValue(id), + value, + reason: '$value ${await getValue(id)}', + ); + } + var bigValue = 1234567890123456; + id = await insertValue(bigValue); + expect(await getValue(id), bigValue); /* id = await insertValue(pow(2, 63)); devPrint('2^63: ${pow(2, 63)} ${await getValue(id)}'); @@ -91,12 +109,18 @@ class TypeTestPage extends TestPage { // big float id = await insertValue(1 / 3); expect(await getValue(id), 1 / 3); - id = await insertValue(pow(2, 63) + .1); - expect(await getValue(id), pow(2, 63) + 0.1); + if (!kIsWeb) { + id = await insertValue(pow(2, 63) + .1); + expect(await getValue(id), pow(2, 63) + 0.1); + + // integer? + id = await insertValue(pow(2, 62)); + expect(await getValue(id), pow(2, 62)); + } + var bigValue = 1234567890123456789.0; + id = await insertValue(bigValue); + expect(await getValue(id), bigValue); - // integer? - id = await insertValue(pow(2, 62)); - expect(await getValue(id), pow(2, 62)); await data.db.close(); }); @@ -128,7 +152,7 @@ class TypeTestPage extends TestPage { }); test('blob', () async { - // await Sqflite.devSetDebugModeOn(true); + // databaseFactory = databaseFactory.debugQuickLoggerWrapper(); final path = await initDeleteDb('type_blob.db'); data.db = await openDatabase( path, @@ -189,18 +213,17 @@ class TypeTestPage extends TestPage { // try blob lookup using hex rows = await data.db.rawQuery( 'SELECT * FROM Test WHERE hex(value) = ?', - [Sqflite.hex(blob1234)], + [hex(blob1234)], ); expect(rows.length, 1); expect(rows[0]['id'], 3); // Insert empty blob - // TODO: Fix this behavior - // final blobEmpty = Uint8List(0); - // id = await insertValue(blobEmpty); - // value = await getValue(id); - // expect(value, const TypeMatcher()); - // expect(value, isEmpty); + final blobEmpty = Uint8List(0); + id = await insertValue(blobEmpty); + value = await getValue(id); + expect(value, const TypeMatcher()); + expect(value, isEmpty); } finally { await data.db.close(); } @@ -251,6 +274,9 @@ class TypeTestPage extends TestPage { await insertValue(DateTime.fromMillisecondsSinceEpoch(1234567890)); } on ArgumentError catch (_) { failed = true; + } on UnsupportedError catch (_) { + // this happens on the web + failed = true; } expect(failed, true); } finally { @@ -275,6 +301,9 @@ class TypeTestPage extends TestPage { await insertValue(true); } on ArgumentError catch (_) { failed = true; + } on DatabaseException catch (_) { + // this happens on the web + failed = true; } if (supportsCompatMode) { print('for now bool are accepted but inconsistent on iOS/Android'); diff --git a/packages/sqflite/example/lib/utils.dart b/packages/sqflite/example/lib/utils.dart index cf8cfc7c6..33779fd80 100644 --- a/packages/sqflite/example/lib/utils.dart +++ b/packages/sqflite/example/lib/utils.dart @@ -1,12 +1,7 @@ -import 'package:sqflite/sqflite.dart'; -import 'package:sqflite/sqflite_dev.dart'; - /// Usage: await sleep(500); Future sleep([int milliseconds = 0]) => Future.delayed(Duration(milliseconds: milliseconds)); /// Supports compat mode (devSetDebugModeOn, queryAsMap, fts4, some error handled - missing parameter, bad file) -bool get supportsCompatMode { - // ignore: invalid_use_of_visible_for_testing_member - return databaseFactory == sqfliteDatabaseFactoryDefault; -} +/// Should only be true for the sqflite package. +var supportsCompatMode = false; diff --git a/packages/sqflite/example/pubspec.yaml b/packages/sqflite/example/pubspec.yaml index 2b3dee22e..820552112 100644 --- a/packages/sqflite/example/pubspec.yaml +++ b/packages/sqflite/example/pubspec.yaml @@ -3,7 +3,7 @@ description: Demonstrates how to use the sqflite_tizen plugin. publish_to: "none" environment: - sdk: ">=3.1.0 <4.0.0" + sdk: ">=3.7.0 <4.0.0" flutter: ">=3.13.0" dependencies: @@ -11,7 +11,7 @@ dependencies: collection: any flutter: sdk: flutter - sqflite: ^2.3.0 + sqflite: ^2.4.2 sqflite_common: sqflite_tizen: path: ../ @@ -20,7 +20,6 @@ dependencies: meta: dev_dependencies: - pedantic: ^1.11.0 flutter_lints: ^2.0.0 flutter_test: sdk: flutter diff --git a/packages/sqflite/pubspec.yaml b/packages/sqflite/pubspec.yaml index b9314840a..140fc24a5 100644 --- a/packages/sqflite/pubspec.yaml +++ b/packages/sqflite/pubspec.yaml @@ -2,10 +2,10 @@ name: sqflite_tizen description: Tizen implementation of the sqflite plugin. homepage: https://github.com/flutter-tizen/plugins repository: https://github.com/flutter-tizen/plugins/tree/master/packages/sqflite -version: 0.1.3 +version: 0.1.4 environment: - sdk: ">=3.1.0 <4.0.0" + sdk: ">=3.7.0 <4.0.0" flutter: ">=3.13.0" flutter: @@ -19,4 +19,4 @@ flutter: dependencies: flutter: sdk: flutter - sqflite: ^2.3.0 + sqflite: ^2.4.2