From 5ae7b13d974ee3dfc633c7967cb926f246f1c3d1 Mon Sep 17 00:00:00 2001 From: TaYaKi71751 Date: Wed, 6 Dec 2023 16:10:39 +0900 Subject: [PATCH] Update chunkSync to master on splash --- lib/pages/splash/splash_page.dart | 2 +- lib/version/sync.dart | 79 ++++++++++++++++++++++++++++++- 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/lib/pages/splash/splash_page.dart b/lib/pages/splash/splash_page.dart index bb3130761..b077f8fa3 100644 --- a/lib/pages/splash/splash_page.dart +++ b/lib/pages/splash/splash_page.dart @@ -243,7 +243,7 @@ class _SplashPageState extends State { if (connectivityResult != ConnectivityResult.none) { try { _changeMessage('check sync...'); - await SyncManager.checkSync(); + await SyncManager.checkSyncLatest(); if (!SyncManager.firstSync && SyncManager.chunkRequire) { setState(() { diff --git a/lib/version/sync.dart b/lib/version/sync.dart index e5a605849..081f4e9fc 100644 --- a/lib/version/sync.dart +++ b/lib/version/sync.dart @@ -51,12 +51,89 @@ class SyncManager { static const ignoreUserAcceptThreshold = 1024 * 1024 * 10; // 10MB static List? _rows; static int requestSize = 0; + + static Future checkSyncLatest() async { + try { + var ls = const LineSplitter(); + var infoRaw = (await http.get(syncInfoURL('master'))).body; + var lines = ls.convert(infoRaw); + + final prefs = await SharedPreferences.getInstance(); + var latest = prefs.getInt('synclatest'); + var lastDB = prefs.getString('databasesync'); + + if (latest == null) { + syncRequire = firstSync = true; + latest = 0; + } else if (lastDB != null && + DateTime.now().difference(DateTime.parse(lastDB)).inDays > 7) { + syncRequire = true; + } + + // lines: [old ... latest] + // _rows: [latest ... old] + _rows = []; + + /* + syncversion은 + + ... + chunk 1640992742 https://github.com/violet-dev/chunk/releases/download/1640992742/data-637765895426855402.json 31519 + db 1640997991 https://github.com/violet-dev/db/releases/download/2022.01.01/rawdata + chunk 1640998430 https://github.com/violet-dev/chunk/releases/download/1640998430/data-637765952304854006.json 47546 + chunk 1640998430 https://github.com/violet-dev/chunk/releases/download/1640998430/data-637765952304854006.db 45056 + chunk 1641003001 https://github.com/violet-dev/chunk/releases/download/1641003001/data-637765998015030026.json 30911 + chunk 1641003001 https://github.com/violet-dev/chunk/releases/download/1641003001/data-637765998015030026.db 32768 + ... + + 와 같은 형식으로 아래쪽이 항상 최신 청크다. 따라서 reversed 탐색을 시도한다. + */ + for (var element in lines.reversed) { + if (element.startsWith('#')) continue; + + var split = element.split(' '); + var type = split[0]; + var timestamp = int.parse(split[1]); + var url = split[2]; + var size = 0; + if (type == 'chunk') size = int.parse(split[3]); + + // We require only json files when synchronize with chunk. + if (type == 'chunk' && !url.endsWith('.json')) continue; + + // + // 마지막으로 동기화한 시간보다 작은 경우 해당 청크는 무시한다. + // + if (type == 'chunk' && timestamp <= latest) continue; + + requestSize += size; + _rows!.add(SyncInfoRecord( + type: type, + timestamp: timestamp, + url: url, + size: size, + )); + } + + /* + 너무 많은 청크를 다운로드해야하는 경우 동기화를 추천한다. + 그 이유는 다운로드해야하는 파일이 너무 많아지기 때문이며, + 또한 데이터베이스의 무결성이 훼손될 가능성이 있기 때문이다. + */ + if (requestSize > ignoreUserAcceptThreshold) syncRequire = true; + if (_rows!.any((element) => element.type == 'chunk')) chunkRequire = true; + } catch (e, st) { + Logger.error('[Sync-check] E: $e\n' + '$st'); + } + } + static Future checkSync() async { for(int i = 0;i < 100;i++){ try { var ls = const LineSplitter(); - var infoRaw = (await http.get(syncInfoURL('master~'+i.toString()))).body; + var infoRaw = (await http.get(syncInfoURL('d2bd5ae068efb26eb4689e5d6281a590e59fc4e2'))).body; var lines = ls.convert(infoRaw); final prefs = await SharedPreferences.getInstance();