| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  | import 'dart:io'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import 'package:aidedejeu_flutter/databases/database.dart'; | 
					
						
							|  |  |  | import 'package:aidedejeu_flutter/models/filters.dart' as Filters; | 
					
						
							|  |  |  | import 'package:aidedejeu_flutter/models/items.dart'; | 
					
						
							|  |  |  | import 'package:flutter/services.dart'; | 
					
						
							|  |  |  | import 'package:path/path.dart'; | 
					
						
							|  |  |  | import 'package:sqflite/sqflite.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SqfliteDB extends BaseDB { | 
					
						
							|  |  |  |   static SqfliteDB _instance; | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |   static SqfliteDB get instance { | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |     if (_instance == null) { | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |       _instance = SqfliteDB(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return _instance; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |   Database _database; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<Database> get database async { | 
					
						
							|  |  |  |     if (_database != null) return _database; | 
					
						
							|  |  |  |     _database = await getDatabaseInstance(); | 
					
						
							|  |  |  |     return _database; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<Database> getDatabaseInstance() async { | 
					
						
							|  |  |  |     var databasesPath = await getDatabasesPath(); | 
					
						
							|  |  |  |     var path = join(databasesPath, "library.db"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var exists = await databaseExists(path); | 
					
						
							|  |  |  |     exists = false; | 
					
						
							|  |  |  |     if (!exists) { | 
					
						
							|  |  |  |       print("Creating new copy from asset"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       try { | 
					
						
							|  |  |  |         await Directory(dirname(path)).create(recursive: true); | 
					
						
							|  |  |  |       } catch (_) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       ByteData data = await rootBundle.load(join("assets", "library.db")); | 
					
						
							|  |  |  |       List<int> bytes = | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |           data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       await File(path).writeAsBytes(bytes, flush: true); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       print("Opening existing database"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return await openDatabase(path, readOnly: true); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |   @override | 
					
						
							|  |  |  |   Future<List<Item>> loadAllItems() async { | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |     final db = await database; | 
					
						
							|  |  |  |     var response = await db.query( | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |       "Items", | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |     ); | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |     if (response.isNotEmpty) { | 
					
						
							|  |  |  |       return itemsFromMapList(response); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Future<Item> getItemWithId(String id) async { | 
					
						
							|  |  |  |     print("getItemWithId " + id); | 
					
						
							|  |  |  |     final db = await database; | 
					
						
							|  |  |  |     var response = await db | 
					
						
							|  |  |  |         .query("Items", where: "Id = ? OR RootId = ?", whereArgs: [id, id]); | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |     if (response.isEmpty) { | 
					
						
							|  |  |  |       print("Id not found"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return response.isNotEmpty ? itemFromMap(response.first) : null; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |   @override | 
					
						
							|  |  |  |   Future<Item> loadChildrenItems( | 
					
						
							|  |  |  |       Item item, List<Filters.Filter> filters) async { | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |     print("getChildrenItems " + (item?.itemType ?? "")); | 
					
						
							|  |  |  |     if (item.itemType.endsWith("Items")) { | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |       String itemType = item.itemType.substring(0, item.itemType.length - 1); | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |       String family = ""; | 
					
						
							|  |  |  |       if (item is FilteredItems) { | 
					
						
							|  |  |  |         family = item.family ?? ""; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       String whereFilter = ""; | 
					
						
							|  |  |  |       if (filters != null) { | 
					
						
							|  |  |  |         filters.forEach((filter) { | 
					
						
							|  |  |  |           if (filter.selectedValues.isNotEmpty) { | 
					
						
							|  |  |  |             whereFilter = " AND (${filter.name} LIKE '%" + | 
					
						
							|  |  |  |                 filter.selectedValues.join("%' OR ${filter.name} LIKE '%") + | 
					
						
							|  |  |  |                 "%')"; | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |           if (filter.rangeValues != null && | 
					
						
							|  |  |  |               (filter.rangeValues.start > 0 || | 
					
						
							|  |  |  |                   filter.rangeValues.end < filter.values.length - 1)) { | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |             whereFilter = | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |                 " AND ([${filter.name}] BETWEEN '${filter.values[filter.rangeValues.start.round()]}' AND '${filter.values[filter.rangeValues.end.round()]}')"; | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |           } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       print(whereFilter); | 
					
						
							|  |  |  |       final db = await database; | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |       var response = await db.query("Items", | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |           where: "ItemType = ? AND Family = ?" + whereFilter, | 
					
						
							|  |  |  |           whereArgs: [itemType, family], | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |           orderBy: "NormalizedName"); | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |       if (response.isEmpty) { | 
					
						
							|  |  |  |         print("Children not found"); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |       item.children = response.isNotEmpty ? itemsFromMapList(response) : null; | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     return item; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |   @override | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |   Future<List<RaceItem>> loadRaces() async { | 
					
						
							|  |  |  |     final db = await database; | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |     var response = await db.query("Items", | 
					
						
							|  |  |  |         where: "ItemType = 'RaceItem'", orderBy: "NormalizedName"); | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |     if (response.isNotEmpty) { | 
					
						
							|  |  |  |       return itemsFromMapList(response); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |   @override | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |   Future<List<SubRaceItem>> loadSubRaces(RaceItem race) async { | 
					
						
							|  |  |  |     final db = await database; | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |     var response = await db.query("Items", | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |         where: "ItemType = 'SubRaceItem' AND ParentLink = ?", | 
					
						
							|  |  |  |         whereArgs: [race.id], | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |         orderBy: "NormalizedName"); | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |     if (response.isNotEmpty) { | 
					
						
							|  |  |  |       return itemsFromMapList(response); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |   @override | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |   Future<List<T>> loadTypedItems<T extends Item>( | 
					
						
							|  |  |  |       {String itemType, Item item}) async { | 
					
						
							|  |  |  |     final db = await database; | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |     var response = await db.query("Items", | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |         where: "ItemType = ?" + (item != null ? " AND ParentLink = ?" : ""), | 
					
						
							|  |  |  |         whereArgs: item != null ? [itemType, item.id] : [itemType], | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |         orderBy: "NormalizedName"); | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |     if (response.isNotEmpty) { | 
					
						
							|  |  |  |       return itemsFromMapList(response); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-16 13:12:24 +02:00
										 |  |  |   @override | 
					
						
							|  |  |  |   Future<List<OriginItem>> loadOrigins() async { | 
					
						
							|  |  |  |     return loadTypedItems<OriginItem>(itemType: "OriginItem"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |   @override | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |   Future<List<BackgroundItem>> loadBackgrounds() async { | 
					
						
							|  |  |  |     return loadTypedItems<BackgroundItem>(itemType: "BackgroundItem"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  |   @override | 
					
						
							| 
									
										
										
										
											2020-03-22 20:36:08 +01:00
										 |  |  |   Future<List<SubBackgroundItem>> loadSubBackgrounds(Item item) async { | 
					
						
							|  |  |  |     return loadTypedItems<SubBackgroundItem>( | 
					
						
							|  |  |  |         itemType: "SubBackgroundItem", item: item); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-03-22 21:20:14 +01:00
										 |  |  | } |