summaryrefslogtreecommitdiff
path: root/db.c
diff options
context:
space:
mode:
Diffstat (limited to 'db.c')
-rw-r--r--db.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/db.c b/db.c
index 38a24e2..2e3c5bf 100644
--- a/db.c
+++ b/db.c
@@ -743,3 +743,55 @@ int db_remove_wall_tag(sqlite_uint64 wallid, sqlite_uint64 tagid) {
return 0;
}
}
+
+int db_wall_tags_inconsistent(GArray *wallarray, GHashTable **inconsistent_table) {
+ sqlite3_stmt *stmt;
+ int rc;
+ gchar *join, *query;
+
+ join = gen_joinstring(wallarray->len);
+ query = g_strdup_printf("SELECT t.id, COUNT(t.id) FROM tag t JOIN walltags wt ON (t.id = wt.tagid AND wt.wallid IN (%s)) GROUP BY t.id", join);
+
+ rc = sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
+
+ g_free(query);
+
+ if(rc != SQLITE_OK) {
+ return 0;
+ }
+
+ for(int i = 0; i < wallarray->len; i++) {
+ sqlite3_uint64 wallid = g_array_index(wallarray, guint64, i);
+
+ rc = sqlite3_bind_int64(stmt, i + 1, wallid);
+ if(rc != SQLITE_OK) {
+ sqlite3_finalize(stmt);
+ return 0;
+ }
+ }
+
+ *inconsistent_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_free);
+ while((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
+ struct tag_inconsistent_data_t *data = g_malloc(sizeof(struct tag_inconsistent_data_t));
+ int count;
+ sqlite3_uint64 tagid;
+
+ tagid = sqlite3_column_int64(stmt, 0);
+ count = sqlite3_column_int(stmt, 1);
+ // set active if selected
+ data->active = count > 0;
+ // set inconsistent if not selected by none or all
+ data->inconsistent = !(count == 0 || count == wallarray->len);
+
+ g_hash_table_insert(*inconsistent_table, (gpointer)tagid, data);
+ }
+
+ sqlite3_finalize(stmt);
+
+ if(rc != SQLITE_DONE) {
+ g_hash_table_destroy(*inconsistent_table);
+ return 0;
+ }
+
+ return 1;
+}