cepheid

An Aurora 4X clone
Log | Files | Refs | README

commit fda512107eeea19a05dfb030deb4e34846b71158
parent 1851992f949b891f1c7e0bba417cc9f3f24cea43
Author: hhvn <dev@hhvn.uk>
Date:   Sat, 19 Nov 2022 20:05:26 +0000

Add ability to check if DB has been changed

Diffstat:
Mdb/db.c | 43++++++++++++++++++++++++++++++++++++++++---
Mdb/db.h | 16++++++++++++++++
Msrc/main.h | 2+-
Msrc/save.c | 7+++++++
4 files changed, 64 insertions(+), 4 deletions(-)

diff --git a/db/db.c b/db/db.c @@ -18,6 +18,7 @@ struct DB { char *dir; struct Group **tracked; size_t tl; + int changes; DB *next; }; @@ -26,6 +27,7 @@ struct Group { char *dir; char *name; char *path; + int changes; Pair *pairs; }; @@ -108,7 +110,7 @@ dbdeclare(char *dir) { db->tracked = malloc(db->tl * sizeof(Group *)); if (!db->tracked) return -1; memset(db->tracked, 0, db->tl * sizeof(Group *)); - + db->changes = 0; if (!dbs) { db->prev = db->next = NULL; @@ -319,6 +321,7 @@ initgroup(char *dir, char *group) { return NULL; } sprintf(ret->path, "%s/%s", dir, group); + ret->changes = 0; track(ret); return ret; } @@ -551,11 +554,20 @@ int dbset(char *dir, char *group, char *key, char *val) { Group *gp; Pair *pp; + int ret; + if (!(gp = getgroup(dir, group, 1))) return -1; if (!(pp = getpair(gp, key))) - return appendpair(&gp->pairs, key, val); - return dbset_p(pp, val); + ret = appendpair(&gp->pairs, key, val); + else + ret = dbset_p(pp, val); + + if (ret != -1) { + gp->changes++; + gp->db->changes++; + } + return ret; } /* @@ -651,6 +663,12 @@ dbwritegroup_p(Group *group) { return -1; } + if (!group->changes) + return 0; + + group->db->changes -= group->changes; + group->changes = 0; + path = strdup(group->path); if (!path) return -1; dir = dirname(path); @@ -702,6 +720,25 @@ dbwrite(char *db) { } /* + * Changes + */ +int +dbchangesgroup(char *dir, char *group) { + Group *p; + if ((p = getgroup(dir, group, 0))) + return p->changes; + return 0; +} + +int +dbchanges(char *db) { + DB *p; + if ((p = getdb(db))) + return p->changes; + return 0; +} + +/* * Free */ diff --git a/db/db.h b/db/db.h @@ -123,6 +123,22 @@ int dbwritegroup(char *dir, char *group); int dbwrite(char *db); /* ----- + * Checking for changes + */ + +/* Check for changes in a group. + * Returns the number of changes. + * On error, returns 0, but this can also be valid. + */ +int dbchangesgroup(char *dir, char *group); + +/* Check for changes in a DB. + * Returns the number of changes. + * On error, returns 0, but this can also be valid. + */ +int dbchanges(char *db); + +/* ----- * Cleanup */ diff --git a/src/main.h b/src/main.h @@ -174,8 +174,8 @@ char * bodytype_strify(Body *body); Body * body_init(char *name); /* save.c */ -#define SAVE_READ_STEPS 2 void save_read(char *dir); +int save_changed(void); void save_write(void); int save_exists(char *name); int save_create(char *name); diff --git a/src/save.c b/src/save.c @@ -50,6 +50,13 @@ save_read(char *name) { return; }; +int +save_changed(void) { + if (!save) + return 0; + return dbchanges(save->db.dir) ? 1 : 0; +} + void save_write(void) { if (view_main.sys)