From d8c43c7855014533ae6f3e6b78a566ad2f550aa8 Mon Sep 17 00:00:00 2001 From: Masahiko AMANO Date: Wed, 28 Dec 2022 16:48:35 +0300 Subject: [PATCH] perf(lib): do not save unchanged database files --- include/tanabata.h | 9 ++++++--- lib/database.c | 50 +++++++++++++++++++++++++++++++++++----------- lib/kazari.c | 12 +++++++++-- lib/sasa.c | 19 ++++++++++++++---- lib/tanzaku.c | 20 ++++++++++++++++--- 5 files changed, 86 insertions(+), 24 deletions(-) diff --git a/include/tanabata.h b/include/tanabata.h index f16480c..5b6e528 100644 --- a/include/tanabata.h +++ b/include/tanabata.h @@ -17,9 +17,12 @@ extern "C" { // Tanabata (七夕) - the struct with all databases typedef struct tanabata { - Sasahyou sasahyou; // Sasahyou struct - Sappyou sappyou; // Sappyou struct - Shoppyou shoppyou; // Shoppyou struct + Sasahyou sasahyou; // Sasahyou struct + Sappyou sappyou; // Sappyou struct + Shoppyou shoppyou; // Shoppyou struct + _Bool sasahyou_mod; // Sasahyou modified flag + _Bool sappyou_mod; // Sappyou modified flag + _Bool shoppyou_mod; // Shoppyou modified flag } Tanabata; // ==================== DATABASE SECTION ==================== // diff --git a/lib/database.c b/lib/database.c index 482dfea..d3f8c39 100644 --- a/lib/database.c +++ b/lib/database.c @@ -14,6 +14,9 @@ int tanabata_init(Tanabata *tanabata) { if (shoppyou_init(&tanabata->shoppyou) != 0) { return 1; } + tanabata->sasahyou_mod = 1; + tanabata->sappyou_mod = 1; + tanabata->shoppyou_mod = 1; return 0; } @@ -51,6 +54,7 @@ int tanabata_weed(Tanabata *tanabata) { tanabata->shoppyou.hole_cnt = 0; free(tanabata->shoppyou.holes); tanabata->shoppyou.database = realloc(tanabata->shoppyou.database, tanabata->shoppyou.size * sizeof(Kazari)); + tanabata->shoppyou_mod = 1; } if (tanabata->sasahyou.hole_cnt > 0) { hole_cnt = 0; @@ -63,6 +67,7 @@ int tanabata_weed(Tanabata *tanabata) { for (uint64_t j = 0; j < tanabata->shoppyou.size; j++) { if (current_kazari->sasa_id == current_sasa->id) { current_kazari->sasa_id = new_id; + tanabata->shoppyou_mod = 1; } current_kazari++; } @@ -78,6 +83,7 @@ int tanabata_weed(Tanabata *tanabata) { tanabata->sasahyou.hole_cnt = 0; free(tanabata->sasahyou.holes); tanabata->sasahyou.database = realloc(tanabata->sasahyou.database, tanabata->sasahyou.size * sizeof(Sasa)); + tanabata->sasahyou_mod = 1; } if (tanabata->sappyou.hole_cnt > 0) { hole_cnt = 0; @@ -90,6 +96,7 @@ int tanabata_weed(Tanabata *tanabata) { for (uint64_t j = 0; j < tanabata->shoppyou.size; j++) { if (current_kazari->tanzaku_id == current_tanzaku->id) { current_kazari->tanzaku_id = new_id; + tanabata->shoppyou_mod = 1; } current_kazari++; } @@ -105,6 +112,7 @@ int tanabata_weed(Tanabata *tanabata) { tanabata->sappyou.hole_cnt = 0; free(tanabata->sappyou.holes); tanabata->sappyou.database = realloc(tanabata->sappyou.database, tanabata->sappyou.size * sizeof(Tanzaku)); + tanabata->sappyou_mod = 1; } return 0; } @@ -119,19 +127,25 @@ int tanabata_load(Tanabata *tanabata) { if (shoppyou_load(&tanabata->shoppyou) != 0) { return 1; } + tanabata->sasahyou_mod = 0; + tanabata->sappyou_mod = 0; + tanabata->shoppyou_mod = 0; return 0; } int tanabata_save(Tanabata *tanabata) { - if (sasahyou_save(&tanabata->sasahyou) != 0) { + if (tanabata->sasahyou_mod && sasahyou_save(&tanabata->sasahyou) != 0) { return 1; } - if (sappyou_save(&tanabata->sappyou) != 0) { + if (tanabata->sappyou_mod && sappyou_save(&tanabata->sappyou) != 0) { return 1; } - if (shoppyou_save(&tanabata->shoppyou) != 0) { + if (tanabata->shoppyou_mod && shoppyou_save(&tanabata->shoppyou) != 0) { return 1; } + tanabata->sasahyou_mod = 0; + tanabata->sappyou_mod = 0; + tanabata->shoppyou_mod = 0; return 0; } @@ -154,6 +168,9 @@ int tanabata_open(Tanabata *tanabata, const char *path) { return 1; } free(file_path); + tanabata->sasahyou_mod = 0; + tanabata->sappyou_mod = 0; + tanabata->shoppyou_mod = 0; return 0; } @@ -163,17 +180,26 @@ int tanabata_dump(Tanabata *tanabata, const char *path) { return 1; } char *file_path = malloc(strlen(path) + 10); - strcpy(file_path, path); - if (sasahyou_dump(&tanabata->sasahyou, strcat(file_path, "/sasahyou")) != 0) { - return 1; + if (tanabata->sasahyou_mod) { + strcpy(file_path, path); + if (sasahyou_dump(&tanabata->sasahyou, strcat(file_path, "/sasahyou")) != 0) { + return 1; + } + tanabata->sasahyou_mod = 0; } - strcpy(file_path, path); - if (sappyou_dump(&tanabata->sappyou, strcat(file_path, "/sappyou")) != 0) { - return 1; + if (tanabata->sappyou_mod) { + strcpy(file_path, path); + if (sappyou_dump(&tanabata->sappyou, strcat(file_path, "/sappyou")) != 0) { + return 1; + } + tanabata->sappyou_mod = 0; } - strcpy(file_path, path); - if (shoppyou_dump(&tanabata->shoppyou, strcat(file_path, "/shoppyou")) != 0) { - return 1; + if (tanabata->shoppyou_mod) { + strcpy(file_path, path); + if (shoppyou_dump(&tanabata->shoppyou, strcat(file_path, "/shoppyou")) != 0) { + return 1; + } + tanabata->shoppyou_mod = 0; } free(file_path); return 0; diff --git a/lib/kazari.c b/lib/kazari.c index bfee99b..8c4fcac 100644 --- a/lib/kazari.c +++ b/lib/kazari.c @@ -14,11 +14,19 @@ int tanabata_kazari_add(Tanabata *tanabata, uint64_t sasa_id, uint64_t tanzaku_i } current_kazari++; } - return kazari_add(&tanabata->shoppyou, sasa_id, tanzaku_id); + if (kazari_add(&tanabata->shoppyou, sasa_id, tanzaku_id) == 0) { + tanabata->shoppyou_mod = 1; + return 0; + } + return 1; } int tanabata_kazari_rem(Tanabata *tanabata, uint64_t sasa_id, uint64_t tanzaku_id) { - return kazari_rem(&tanabata->shoppyou, sasa_id, tanzaku_id); + if (kazari_rem(&tanabata->shoppyou, sasa_id, tanzaku_id) == 0) { + tanabata->shoppyou_mod = 1; + return 0; + } + return 1; } Tanzaku *tanabata_tanzaku_get_by_sasa(Tanabata *tanabata, uint64_t sasa_id) { diff --git a/lib/sasa.c b/lib/sasa.c index 37648f6..1fde9a4 100644 --- a/lib/sasa.c +++ b/lib/sasa.c @@ -16,8 +16,9 @@ int tanabata_sasa_add(Tanabata *tanabata, const char *path) { } char *abspath = NULL; abspath = realpath(path, abspath); - if (abspath != NULL) { - return sasa_add(&tanabata->sasahyou, abspath); + if (abspath != NULL && sasa_add(&tanabata->sasahyou, abspath) == 0) { + tanabata->sasahyou_mod = 1; + return 0; } return 1; } @@ -30,10 +31,15 @@ int tanabata_sasa_rem_by_id(Tanabata *tanabata, uint64_t sasa_id) { for (uint64_t j = 0; j < tanabata->shoppyou.size; j++) { if (current_kazari->sasa_id == sasa_id) { current_kazari->sasa_id = HOLE_ID; + tanabata->shoppyou_mod = 1; } current_kazari++; } - return sasa_rem(&tanabata->sasahyou, sasa_id); + if (sasa_rem(&tanabata->sasahyou, sasa_id) == 0) { + tanabata->sasahyou_mod = 1; + return 0; + } + return 1; } int tanabata_sasa_rem_by_path(Tanabata *tanabata, const char *path) { @@ -44,10 +50,15 @@ int tanabata_sasa_rem_by_path(Tanabata *tanabata, const char *path) { for (uint64_t j = 0; j < tanabata->shoppyou.size; j++) { if (current_kazari->sasa_id == current_sasa->id) { current_kazari->sasa_id = HOLE_ID; + tanabata->shoppyou_mod = 1; } current_kazari++; } - return sasa_rem(&tanabata->sasahyou, current_sasa->id); + if (sasa_rem(&tanabata->sasahyou, current_sasa->id) == 0) { + tanabata->sasahyou_mod = 1; + return 0; + } + return 1; } current_sasa++; } diff --git a/lib/tanzaku.c b/lib/tanzaku.c index 2acf86c..23ac55d 100644 --- a/lib/tanzaku.c +++ b/lib/tanzaku.c @@ -13,7 +13,11 @@ int tanabata_tanzaku_add(Tanabata *tanabata, const char *name, const char *descr } current_tanzaku++; } - return tanzaku_add(&tanabata->sappyou, name, description); + if (tanzaku_add(&tanabata->sappyou, name, description) == 0) { + tanabata->sappyou_mod = 1; + return 0; + } + return 1; } int tanabata_tanzaku_rem_by_id(Tanabata *tanabata, uint64_t tanzaku_id) { @@ -24,10 +28,15 @@ int tanabata_tanzaku_rem_by_id(Tanabata *tanabata, uint64_t tanzaku_id) { for (uint64_t i = 0; i < tanabata->shoppyou.size; i++) { if (current_kazari->tanzaku_id == tanzaku_id) { current_kazari->tanzaku_id = HOLE_ID; + tanabata->shoppyou_mod = 1; } current_kazari++; } - return tanzaku_rem(&tanabata->sappyou, tanzaku_id); + if (tanzaku_rem(&tanabata->sappyou, tanzaku_id) == 0) { + tanabata->sappyou_mod = 1; + return 0; + } + return 1; } int tanabata_tanzaku_rem_by_name(Tanabata *tanabata, const char *name) { @@ -38,10 +47,15 @@ int tanabata_tanzaku_rem_by_name(Tanabata *tanabata, const char *name) { for (uint64_t j = 0; j < tanabata->shoppyou.size; j++) { if (current_kazari->tanzaku_id == current_tanzaku->id) { current_kazari->tanzaku_id = HOLE_ID; + tanabata->shoppyou_mod = 1; } current_kazari++; } - return tanzaku_rem(&tanabata->sappyou, current_tanzaku->id); + if (tanzaku_rem(&tanabata->sappyou, current_tanzaku->id) == 0) { + tanabata->sappyou_mod = 1; + return 0; + } + return 1; } current_tanzaku++; }