diff --git a/packages/smooth_app/lib/database/dao_hive_product.dart b/packages/smooth_app/lib/database/dao_hive_product.dart new file mode 100644 index 000000000000..8f29bfc0757a --- /dev/null +++ b/packages/smooth_app/lib/database/dao_hive_product.dart @@ -0,0 +1,82 @@ +import 'dart:async'; +import 'dart:convert'; +import 'package:hive/hive.dart'; +import 'package:openfoodfacts/openfoodfacts.dart'; +import 'package:smooth_app/database/abstract_dao.dart'; +import 'package:smooth_app/database/dao_product_migration.dart'; +import 'package:smooth_app/database/local_database.dart'; + +/// Hive type adapter for [Product] +class _ProductAdapter extends TypeAdapter { + @override + final int typeId = 1; + + @override + Product read(BinaryReader reader) => + Product.fromJson(jsonDecode(reader.readString()) as Map); + + @override + void write(BinaryWriter writer, Product obj) => + writer.writeString(jsonEncode(obj.toJson())); +} + +/// /!\ Stupid class not be used anymore (from 2022-06-16) +/// But Hive needs it - it doesn't like data to be removed... +/// Where we store the products as "barcode => product". +@Deprecated('use [DaoProduct] instead') +class DaoHiveProduct extends AbstractDao implements DaoProductMigrationSource { + @Deprecated('use [DaoProduct] instead') + DaoHiveProduct(final LocalDatabase localDatabase) : super(localDatabase); + + static const String _hiveBoxName = 'products'; + + @override + Future init() async => Hive.openLazyBox(_hiveBoxName); + + @override + void registerAdapter() => Hive.registerAdapter(_ProductAdapter()); + + LazyBox _getBox() => Hive.lazyBox(_hiveBoxName); + + Future get(final String barcode) async => _getBox().get(barcode); + + @override + Future> getAll(final List barcodes) async { + final LazyBox box = _getBox(); + final Map result = {}; + for (final String barcode in barcodes) { + final Product? product = await box.get(barcode); + if (product != null) { + result[barcode] = product; + } + } + return result; + } + + Future put(final Product product) async => putAll([product]); + + Future putAll(final Iterable products) async { + final Map upserts = {}; + for (final Product product in products) { + upserts[product.barcode!] = product; + } + await _getBox().putAll(upserts); + } + + @override + Future> getAllKeys() async { + final LazyBox box = _getBox(); + final List result = []; + for (final dynamic key in box.keys) { + result.add(key.toString()); + } + return result; + } + + // Just for the migration + @override + Future deleteAll(final List barcodes) async { + final LazyBox box = _getBox(); + await box.deleteAll(barcodes); + } +} diff --git a/packages/smooth_app/lib/database/local_database.dart b/packages/smooth_app/lib/database/local_database.dart index fe1d86763158..f6a2d4336cf0 100644 --- a/packages/smooth_app/lib/database/local_database.dart +++ b/packages/smooth_app/lib/database/local_database.dart @@ -9,6 +9,7 @@ import 'package:smooth_app/background/background_task_manager.dart'; import 'package:smooth_app/data_models/up_to_date_product_list_provider.dart'; import 'package:smooth_app/data_models/up_to_date_product_provider.dart'; import 'package:smooth_app/database/abstract_dao.dart'; +import 'package:smooth_app/database/dao_hive_product.dart'; import 'package:smooth_app/database/dao_instant_string.dart'; import 'package:smooth_app/database/dao_int.dart'; import 'package:smooth_app/database/dao_product.dart'; @@ -71,6 +72,7 @@ class LocalDatabase extends ChangeNotifier { // only hive from there await Hive.initFlutter(); final List daos = [ + DaoHiveProduct(localDatabase), DaoProductList(localDatabase), DaoStringList(localDatabase), DaoString(localDatabase),