From 4bff733352f608744e86328deb443d68ce666f7d Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Wed, 30 Dec 2009 04:30:25 +0100 Subject: Basic adding and assigning of tags implemented. Committing this before it gets out of hand. Only adding new tags is working atm. Created a text input dialog. Added a tag dialog. Other minor changes. --- db.c | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) (limited to 'db.c') diff --git a/db.c b/db.c index 4446d1e..b78ed54 100644 --- a/db.c +++ b/db.c @@ -323,6 +323,44 @@ int db_get_wallpaper_data(sqlite_uint64 id, struct wallpaper_t *wall) { return 1; } +int db_get_wall_tags(sqlite_uint64 wallid, GArray **array) { + struct tag_t temp, *temp2; + sqlite3_stmt *stmt; + int rc; + + rc = sqlite3_prepare_v2(db, "SELECT t.id, t.name FROM tag t JOIN walltags w ON (w.tagid = t.id AND w.wallid = ?)", -1, &stmt, NULL); + + if(rc != SQLITE_OK) { + return 0; + } + + rc = sqlite3_bind_int64(stmt, 1, wallid); + if(rc != SQLITE_OK) { + sqlite3_finalize(stmt); + return 0; + } + + *array = g_array_new(FALSE, FALSE, sizeof(struct tag_t)); + while((rc = sqlite3_step(stmt)) == SQLITE_ROW) { + temp.id = sqlite3_column_int64(stmt, 0); + temp.name = g_strdup(sqlite3_column_text(stmt, 1)); + g_array_append_val(*array, temp); + } + + sqlite3_finalize(stmt); + + if(rc != SQLITE_DONE) { + for(int i = 0; i < (*array)->len; i++) { + temp2 = &g_array_index(*array, struct tag_t, i); + g_free(temp2->name); + } + g_array_free(*array, TRUE); + return 0; + } + + return 1; +} + int db_get_wallpapers(sqlite_uint64 dirid, GArray **array) { struct wallpaper_t temp, *temp2; sqlite3_stmt *stmt; @@ -357,8 +395,130 @@ int db_get_wallpapers(sqlite_uint64 dirid, GArray **array) { temp2 = &g_array_index(*array, struct wallpaper_t, i); g_free(temp2->filepath); } + g_array_free(*array, TRUE); + return 0; + } + + return 1; +} + +sqlite_uint64 db_add_tag(const char *name) { + sqlite3_stmt *stmt; + int rc; + + rc = sqlite3_prepare_v2(db, "INSERT INTO tag (name) VALUES (?)", -1, &stmt, NULL); + + if(rc != SQLITE_OK) { + return 0; + } + + rc = sqlite3_bind_text(stmt, 1, name, -1, SQLITE_STATIC); + if(rc != SQLITE_OK) { + sqlite3_finalize(stmt); + return 0; + } + + rc = sqlite3_step(stmt); + + sqlite3_finalize(stmt); + if(rc == SQLITE_DONE) { + return sqlite3_last_insert_rowid(db); + } else { + return 0; + } +} + +int db_get_tags_all(GArray **array) { + struct tag_t temp, *temp2; + sqlite3_stmt *stmt; + int rc; + + rc = sqlite3_prepare_v2(db, "SELECT id, name FROM tag ORDER BY name", -1, &stmt, NULL); + if(rc != SQLITE_OK) { + return 0; + } + + *array = g_array_new(FALSE, FALSE, sizeof(struct tag_t)); + while((rc = sqlite3_step(stmt)) == SQLITE_ROW) { + temp.name = g_strdup(sqlite3_column_text(stmt, 1)); + temp.id = sqlite3_column_int64(stmt, 0); + g_array_append_val(*array, temp); + } + + sqlite3_finalize(stmt); + + if(rc != SQLITE_DONE) { + for(int i = 0; i < (*array)->len; i++) { + temp2 = &g_array_index(*array, struct tag_t, i); + g_free(temp2->name); + } + g_array_free(*array, TRUE); return 0; } return 1; } + +int db_add_wall_tag(sqlite_uint64 wallid, sqlite_uint64 tagid) { + sqlite3_stmt *stmt; + int rc; + + rc = sqlite3_prepare_v2(db, "INSERT OR REPLACE INTO walltags (wallid, tagid) VALUES (?, ?)", -1, &stmt, NULL); + + if(rc != SQLITE_OK) { + return 0; + } + + rc = sqlite3_bind_int64(stmt, 1, wallid); + if(rc != SQLITE_OK) { + sqlite3_finalize(stmt); + return 0; + } + + rc = sqlite3_bind_int64(stmt, 2, tagid); + if(rc != SQLITE_OK) { + sqlite3_finalize(stmt); + return 0; + } + + rc = sqlite3_step(stmt); + + sqlite3_finalize(stmt); + if(rc == SQLITE_DONE) { + return 1; + } else { + return 0; + } +} + +int db_remove_wall_tag(sqlite_uint64 wallid, sqlite_uint64 tagid) { + sqlite3_stmt *stmt; + int rc; + + rc = sqlite3_prepare_v2(db, "DELETE FROM walltags WHERE wallid = ? AND tagid = ?", -1, &stmt, NULL); + + if(rc != SQLITE_OK) { + return 0; + } + + rc = sqlite3_bind_int64(stmt, 1, wallid); + if(rc != SQLITE_OK) { + sqlite3_finalize(stmt); + return 0; + } + + rc = sqlite3_bind_int64(stmt, 2, tagid); + if(rc != SQLITE_OK) { + sqlite3_finalize(stmt); + return 0; + } + + rc = sqlite3_step(stmt); + + sqlite3_finalize(stmt); + if(rc == SQLITE_DONE) { + return 1; + } else { + return 0; + } +} -- cgit v1.2.3