From 843133295f5c79eccb8e016b4c08568343a38fb1 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Tue, 18 Jul 2023 00:22:49 +0100 Subject: [PATCH 1/3] Storage fast migrate (use rename recursively) --- .../services/storage/storage_external_api.c | 61 +++++++++++-------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/applications/services/storage/storage_external_api.c b/applications/services/storage/storage_external_api.c index f77fb4d03..69637b06e 100644 --- a/applications/services/storage/storage_external_api.c +++ b/applications/services/storage/storage_external_api.c @@ -593,8 +593,10 @@ FS_Error storage_common_copy(Storage* storage, const char* old_path, const char* return error; } +static FS_Error _storage_common_merge(Storage*, const char*, const char*, bool); + static FS_Error - storage_merge_recursive(Storage* storage, const char* old_path, const char* new_path) { + storage_merge_recursive(Storage* storage, const char* old_path, const char* new_path, bool copy) { FS_Error error = FSE_OK; DirWalk* dir_walk = dir_walk_alloc(storage); FuriString *path, *file_basename, *tmp_new_path; @@ -636,8 +638,8 @@ static FS_Error } } } - error = storage_common_merge( - storage, furi_string_get_cstr(path), furi_string_get_cstr(tmp_new_path)); + error = _storage_common_merge( + storage, furi_string_get_cstr(path), furi_string_get_cstr(tmp_new_path), copy); if(error != FSE_OK) { break; @@ -654,7 +656,7 @@ static FS_Error return error; } -FS_Error storage_common_merge(Storage* storage, const char* old_path, const char* new_path) { +static FS_Error _storage_common_merge(Storage* storage, const char* old_path, const char* new_path, bool copy) { FS_Error error; const char* new_path_tmp = NULL; FuriString* new_path_next = NULL; @@ -665,7 +667,12 @@ FS_Error storage_common_merge(Storage* storage, const char* old_path, const char if(error == FSE_OK) { if(file_info_is_dir(&fileinfo)) { - error = storage_merge_recursive(storage, old_path, new_path); + if(!copy) { + error = storage_common_rename(storage, old_path, new_path); + } + if(copy || error != FSE_OK) { + error = storage_merge_recursive(storage, old_path, new_path, copy); + } } else { error = storage_common_stat(storage, new_path, &fileinfo); if(error == FSE_OK) { @@ -699,22 +706,26 @@ FS_Error storage_common_merge(Storage* storage, const char* old_path, const char } else { new_path_tmp = new_path; } - Stream* stream_from = file_stream_alloc(storage); - Stream* stream_to = file_stream_alloc(storage); + if(copy) { + Stream* stream_from = file_stream_alloc(storage); + Stream* stream_to = file_stream_alloc(storage); - do { - if(!file_stream_open(stream_from, old_path, FSAM_READ, FSOM_OPEN_EXISTING)) break; - if(!file_stream_open(stream_to, new_path_tmp, FSAM_WRITE, FSOM_CREATE_NEW)) break; - stream_copy_full(stream_from, stream_to); - } while(false); + do { + if(!file_stream_open(stream_from, old_path, FSAM_READ, FSOM_OPEN_EXISTING)) break; + if(!file_stream_open(stream_to, new_path_tmp, FSAM_WRITE, FSOM_CREATE_NEW)) break; + stream_copy_full(stream_from, stream_to); + } while(false); - error = file_stream_get_error(stream_from); - if(error == FSE_OK) { - error = file_stream_get_error(stream_to); + error = file_stream_get_error(stream_from); + if(error == FSE_OK) { + error = file_stream_get_error(stream_to); + } + + stream_free(stream_from); + stream_free(stream_to); + } else { + error = storage_common_rename(storage, old_path, new_path_tmp); } - - stream_free(stream_from); - stream_free(stream_to); } } @@ -723,6 +734,10 @@ FS_Error storage_common_merge(Storage* storage, const char* old_path, const char return error; } +FS_Error storage_common_merge(Storage* storage, const char* old_path, const char* new_path) { + return _storage_common_merge(storage, old_path, new_path, true); +} + FS_Error storage_common_mkdir(Storage* storage, const char* path) { S_API_PROLOGUE; SAData data = { @@ -774,14 +789,10 @@ FS_Error storage_common_migrate(Storage* storage, const char* source, const char return FSE_OK; } - FS_Error error = storage_common_rename(storage, source, dest); + FS_Error error = _storage_common_merge(storage, source, dest, false); - if(error != FSE_OK) { - error = storage_common_merge(storage, source, dest); - - if(error == FSE_OK) { - storage_simply_remove_recursive(storage, source); - } + if(error == FSE_OK) { + storage_simply_remove_recursive(storage, source); } return error; From bd9f2b6ff70581a935a666e67ee3d099070e9832 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Tue, 18 Jul 2023 00:23:05 +0100 Subject: [PATCH 2/3] Add migrate to storage cli --- applications/services/storage/storage_cli.c | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/applications/services/storage/storage_cli.c b/applications/services/storage/storage_cli.c index 096060d82..447e76afc 100644 --- a/applications/services/storage/storage_cli.c +++ b/applications/services/storage/storage_cli.c @@ -29,6 +29,7 @@ static void storage_cli_print_usage() { "\twrite_chunk\t - read data from cli and append it to file, should contain how many bytes you want to write\r\n"); printf("\tcopy\t - copy file to new file, must contain new path\r\n"); printf("\trename\t - move file to new file, must contain new path\r\n"); + printf("\tmigrate\t - \r\n"); printf("\tmkdir\t - creates a new directory\r\n"); printf("\tmd5\t - md5 hash of the file\r\n"); printf("\tstat\t - info about file or dir\r\n"); @@ -466,6 +467,27 @@ static void storage_cli_rename(Cli* cli, FuriString* old_path, FuriString* args) furi_record_close(RECORD_STORAGE); } +static void storage_cli_migrate(Cli* cli, FuriString* old_path, FuriString* args) { + UNUSED(cli); + Storage* api = furi_record_open(RECORD_STORAGE); + FuriString* new_path; + new_path = furi_string_alloc(); + + if(!args_read_probably_quoted_string_and_trim(args, new_path)) { + storage_cli_print_usage(); + } else { + FS_Error error = storage_common_migrate( + api, furi_string_get_cstr(old_path), furi_string_get_cstr(new_path)); + + if(error != FSE_OK) { + storage_cli_print_error(error); + } + } + + furi_string_free(new_path); + furi_record_close(RECORD_STORAGE); +} + static void storage_cli_mkdir(Cli* cli, FuriString* path) { UNUSED(cli); Storage* api = furi_record_open(RECORD_STORAGE); @@ -589,6 +611,11 @@ void storage_cli(Cli* cli, FuriString* args, void* context) { break; } + if(furi_string_cmp_str(cmd, "migrate") == 0) { + storage_cli_migrate(cli, path, args); + break; + } + if(furi_string_cmp_str(cmd, "mkdir") == 0) { storage_cli_mkdir(cli, path); break; From 23cee7197e9aa210f5a4585a5b24290547b53097 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Tue, 18 Jul 2023 00:25:15 +0100 Subject: [PATCH 3/3] <:N1:1130620612352679958><:N2:1130620354440745162> --- .../services/storage/storage_external_api.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/applications/services/storage/storage_external_api.c b/applications/services/storage/storage_external_api.c index 69637b06e..1cfe06a52 100644 --- a/applications/services/storage/storage_external_api.c +++ b/applications/services/storage/storage_external_api.c @@ -595,8 +595,11 @@ FS_Error storage_common_copy(Storage* storage, const char* old_path, const char* static FS_Error _storage_common_merge(Storage*, const char*, const char*, bool); -static FS_Error - storage_merge_recursive(Storage* storage, const char* old_path, const char* new_path, bool copy) { +static FS_Error storage_merge_recursive( + Storage* storage, + const char* old_path, + const char* new_path, + bool copy) { FS_Error error = FSE_OK; DirWalk* dir_walk = dir_walk_alloc(storage); FuriString *path, *file_basename, *tmp_new_path; @@ -656,7 +659,8 @@ static FS_Error return error; } -static FS_Error _storage_common_merge(Storage* storage, const char* old_path, const char* new_path, bool copy) { +static FS_Error + _storage_common_merge(Storage* storage, const char* old_path, const char* new_path, bool copy) { FS_Error error; const char* new_path_tmp = NULL; FuriString* new_path_next = NULL; @@ -711,8 +715,10 @@ static FS_Error _storage_common_merge(Storage* storage, const char* old_path, co Stream* stream_to = file_stream_alloc(storage); do { - if(!file_stream_open(stream_from, old_path, FSAM_READ, FSOM_OPEN_EXISTING)) break; - if(!file_stream_open(stream_to, new_path_tmp, FSAM_WRITE, FSOM_CREATE_NEW)) break; + if(!file_stream_open(stream_from, old_path, FSAM_READ, FSOM_OPEN_EXISTING)) + break; + if(!file_stream_open(stream_to, new_path_tmp, FSAM_WRITE, FSOM_CREATE_NEW)) + break; stream_copy_full(stream_from, stream_to); } while(false);