Skip to content

Commit

Permalink
Try download latest db at first try
Browse files Browse the repository at this point in the history
  • Loading branch information
TaYaKi71751 committed Dec 8, 2023
1 parent 65b8d18 commit b9e7926
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 93 deletions.
77 changes: 67 additions & 10 deletions lib/pages/database_download/database_download_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,21 @@ class DataBaseDownloadPageState extends State<DataBaseDownloadPage> {
}

Future<void> downloadFileAndroid() async {
try {
await downloadFileAndroidWith('latest', true);
} catch(e){
await downloadFileAndroidWith('old', false);
}
}
Future<void> downloadFileIOS() async {
try {
await downloadFileIOSWith('latest', true);
} catch(e){
await downloadFileIOSWith('old', false);
}
}

Future<void> downloadFileAndroidWith(String target, bool _throw) async {
Dio dio = Dio();
int oneMega = 1024 * 1024;
int nu = 0;
Expand All @@ -97,6 +112,18 @@ class DataBaseDownloadPageState extends State<DataBaseDownloadPage> {
if (await File('${dir.path}/db.sql.7z').exists()) {
await File('${dir.path}/db.sql.7z').delete();
}
switch(target){
case 'latest': await SyncManager.checkSyncLatest(_throw); break;
case 'old': await SyncManager.checkSyncOld(_throw); break;
default: {
try {
await downloadFileAndroidWith('latest', true);
} catch(e){
await downloadFileAndroidWith('old', false);
}
return;
}
}
Timer timer = Timer.periodic(
const Duration(seconds: 1),
(Timer timer) => setState(() {
Expand All @@ -105,7 +132,6 @@ class DataBaseDownloadPageState extends State<DataBaseDownloadPage> {
tlatest = tnu;
tnu = 0;
}));
await SyncManager.checkSync();
await dio.download(
SyncManager.getLatestDB().getDBDownloadUrl(widget.dbType!),
'${dir.path}/db.sql.7z', onReceiveProgress: (rec, total) {
Expand Down Expand Up @@ -163,9 +189,18 @@ class DataBaseDownloadPageState extends State<DataBaseDownloadPage> {
await DataBaseManager.reloadInstance();

if (Settings.useOptimizeDatabase) {
await deleteUnused();

await indexing();
try {
await deleteUnused();
} catch(e1,st1){
Logger.error('[deleteUnused] E: $e1\n'
'$st1');
}
try {
await indexing();
} catch(e1,st1){
Logger.error('[indexing] E: $e1\n'
'$st1');
}
}

if (widget.isSync == true) {
Expand All @@ -181,6 +216,7 @@ class DataBaseDownloadPageState extends State<DataBaseDownloadPage> {
} catch (e, st) {
Logger.error('[DBDownload] E: $e\n'
'$st');
if(_throw) throw e;
}

setState(() {
Expand All @@ -189,7 +225,7 @@ class DataBaseDownloadPageState extends State<DataBaseDownloadPage> {
});
}

Future<void> downloadFileIOS() async {
Future<void> downloadFileIOSWith(String target, bool _throw) async {
Dio dio = Dio();
int oneMega = 1024 * 1024;
int nu = 0;
Expand All @@ -202,6 +238,19 @@ class DataBaseDownloadPageState extends State<DataBaseDownloadPage> {
if (await File('$dir/data.db').exists()) {
await File('$dir/data.db').delete();
}
switch(target){
case 'latest': await SyncManager.checkSyncLatest(_throw); break;
case 'old': await SyncManager.checkSyncOld(_throw); break;
default: {
try {
await downloadFileIOSWith('latest', true);
} catch(e){
await downloadFileIOSWith('old', false);
}
return;
}
}

Timer timer = Timer.periodic(
const Duration(seconds: 1),
(Timer timer) => setState(() {
Expand All @@ -210,7 +259,6 @@ class DataBaseDownloadPageState extends State<DataBaseDownloadPage> {
tlatest = tnu;
tnu = 0;
}));
await SyncManager.checkSync();
await dio.download(
SyncManager.getLatestDB().getDBDownloadUrliOS(widget.dbType!),
'$dir/data.db', onReceiveProgress: (rec, total) {
Expand Down Expand Up @@ -246,9 +294,18 @@ class DataBaseDownloadPageState extends State<DataBaseDownloadPage> {

await DataBaseManager.reloadInstance();

if (Settings.useOptimizeDatabase) await deleteUnused();

await indexing();
try {
if (Settings.useOptimizeDatabase) await deleteUnused();
} catch(e1,st1){
Logger.error('[deleteUnused] E: $e1\n'
'$st1');
}
try {
await indexing();
} catch(e1,st1){
Logger.error('[indexing] E: $e1\n'
'$st1');
}

if (widget.isSync == true) {
Navigator.pop(context);
Expand All @@ -263,6 +320,7 @@ class DataBaseDownloadPageState extends State<DataBaseDownloadPage> {
} catch (e, st) {
Logger.error('[DBDownload] E: $e\n'
'$st');
if(_throw) throw e;
}

setState(() {
Expand All @@ -275,7 +333,6 @@ class DataBaseDownloadPageState extends State<DataBaseDownloadPage> {
var sql = HitomiManager.translate2query(
'${Settings.includeTags} ${Settings.excludeTags.where((e) => e.trim().isNotEmpty).map((e) => '-$e').join(' ')}')
.replaceAll(' AND ExistOnHitomi=1', '');

await (await DataBaseManager.getInstance()).delete('HitomiColumnModel',
'NOT (${sql.substring(sql.indexOf('WHERE') + 6)})', []);
}
Expand Down
2 changes: 1 addition & 1 deletion lib/pages/splash/splash_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ class _SplashPageState extends State<SplashPage> {
if (connectivityResult != ConnectivityResult.none) {
try {
_changeMessage('check sync...');
await SyncManager.checkSyncLatest();
await SyncManager.checkSyncLatest(true);

if (!SyncManager.firstSync && SyncManager.chunkRequire) {
setState(() {
Expand Down
94 changes: 12 additions & 82 deletions lib/version/sync.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,19 @@ class SyncManager {
static List<SyncInfoRecord>? _rows;
static int requestSize = 0;

static Future<void> checkSyncLatest() async {
static Future<void> checkSyncLatest(bool _throw) async {
await checkSync('master', _throw);
}

static Future<void> checkSyncOld(bool _throw) async {
await checkSync('d2bd5ae068efb26eb4689e5d6281a590e59fc4e2', _throw);
}


static Future<void> checkSync(String branch, bool _throw) async {
try {
var ls = const LineSplitter();
var infoRaw = (await http.get(syncInfoURL('master'))).body;
var infoRaw = (await http.get(syncInfoURL(branch))).body;
var lines = ls.convert(infoRaw);

final prefs = await SharedPreferences.getInstance();
Expand Down Expand Up @@ -125,86 +134,7 @@ class SyncManager {
} catch (e, st) {
Logger.error('[Sync-check] E: $e\n'
'$st');
}
}


static Future<void> checkSync() async {
for(int i = 0;i < 100;i++){
try {
var ls = const LineSplitter();
var infoRaw = (await http.get(syncInfoURL('d2bd5ae068efb26eb4689e5d6281a590e59fc4e2'))).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) {
continue;
Logger.error('[Sync-check] E: $e\n'
'$st');
}
if(_throw) throw e;
}
}

Expand Down

0 comments on commit b9e7926

Please sign in to comment.