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:
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)