Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Try download latest db at first try #265

Merged
merged 3 commits into from
Dec 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion lib/database/database.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,11 @@ class DataBaseManager {
}

Future checkOpen() async {
if (!db!.isOpen) db = await openDatabase(dbPath!);
if(db != null){
if (!db!.isOpen) db = await openDatabase(dbPath!);
} else if(db == null){
db = await openDatabase(dbPath!);
}
}

Future<List<Map<String, dynamic>>> query(String str) async {
Expand Down
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
3 changes: 3 additions & 0 deletions lib/pages/database_download/decompress.dart
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ class P7zip {

final tempDir = await getTemporaryDirectory();
final libraryFile = File('${tempDir.path}/lib7zr.so');
if(await libraryFile.exists()){
await libraryFile.delete();
}
final createdFile = await libraryFile.create();
final openFile = await createdFile.open(mode: FileMode.write);
final writtenFile =
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
Loading