From 05f7ecf55f3c51e3febdb00a1e9843771b504db3 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Fri, 8 Dec 2023 00:09:24 +0800 Subject: [PATCH] Fix exception when syncing dir with path only --- app/lib/entity/file/file_cache_manager.dart | 2 +- np_db/lib/src/api.dart | 2 +- .../lib/src/database/file_extension.dart | 27 ++++++++++++++++++- np_db_sqlite/lib/src/sqlite_api.dart | 4 +-- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/app/lib/entity/file/file_cache_manager.dart b/app/lib/entity/file/file_cache_manager.dart index 084fc995..853fdeb7 100644 --- a/app/lib/entity/file/file_cache_manager.dart +++ b/app/lib/entity/file/file_cache_manager.dart @@ -92,7 +92,7 @@ class FileSqliteCacheUpdater { try { await _c.npDb.syncDirFiles( account: account.toDb(), - dirFileId: dir.fileId!, + dirFile: dir.toDbKey(), files: remote.map((e) => e.toDb()).toList(), ); } finally { diff --git a/np_db/lib/src/api.dart b/np_db/lib/src/api.dart index 7394b51a..f7bcb5dd 100644 --- a/np_db/lib/src/api.dart +++ b/np_db/lib/src/api.dart @@ -214,7 +214,7 @@ abstract class NpDb { /// Add or replace files in db Future syncDirFiles({ required DbAccount account, - required int dirFileId, + required DbFileKey dirFile, required List files, }); diff --git a/np_db_sqlite/lib/src/database/file_extension.dart b/np_db_sqlite/lib/src/database/file_extension.dart index dd4533fd..ecab3bac 100644 --- a/np_db_sqlite/lib/src/database/file_extension.dart +++ b/np_db_sqlite/lib/src/database/file_extension.dart @@ -261,7 +261,7 @@ extension SqliteDbFileExtension on SqliteDb { Future syncDirFiles({ required ByAccount account, - required int dirFileId, + required DbFileKey dirFile, required List objs, }) async { _log.info("[syncDirFiles] files: [length: ${objs.length}]"); @@ -286,6 +286,11 @@ extension SqliteDbFileExtension on SqliteDb { idMap.addAll(insertMap); } + final dirFileId = dirFile.fileId ?? + await _queryFileIdByRelativePath( + account: ByAccount.sql(sqlAccount), + relativePath: dirFile.relativePath!, + ).notNull(); final dirRowId = idMap[dirFileId]; if (dirRowId == null) { _log.severe("[syncDirFiles] Dir not inserted"); @@ -549,6 +554,26 @@ extension SqliteDbFileExtension on SqliteDb { await (delete(dirFiles)..where((t) => t.dir.equals(rowId.fileRowId))).go(); } + Future _queryFileIdByRelativePath({ + required ByAccount account, + required String relativePath, + }) async { + _log.info("[_queryFileIdByRelativePath] relativePath: $relativePath"); + final query = _queryFiles().let((q) { + q + ..setQueryMode( + FilesQueryMode.expression, + expressions: [ + files.fileId, + ], + ) + ..setAccount(account) + ..byRelativePath(relativePath); + return q.build()..limit(1); + }); + return query.map((r) => r.read(files.fileId)!).getSingleOrNull(); + } + /// Update Db files /// /// Return a list of files that are not yet inserted to the DB (thus not diff --git a/np_db_sqlite/lib/src/sqlite_api.dart b/np_db_sqlite/lib/src/sqlite_api.dart index 7495ec23..c586eab1 100644 --- a/np_db_sqlite/lib/src/sqlite_api.dart +++ b/np_db_sqlite/lib/src/sqlite_api.dart @@ -309,14 +309,14 @@ class NpDbSqlite implements NpDb { @override Future syncDirFiles({ required DbAccount account, - required int dirFileId, + required DbFileKey dirFile, required List files, }) async { final sqlFiles = await files.toSql(); await _db.use((db) async { await db.syncDirFiles( account: ByAccount.db(account), - dirFileId: dirFileId, + dirFile: dirFile, objs: sqlFiles, ); });