diff --git a/src/api/dns.c b/src/api/dns.c index 210a338e..c94efde4 100644 --- a/src/api/dns.c +++ b/src/api/dns.c @@ -172,17 +172,17 @@ static int api_dns_somelist_POST(struct mg_connection *conn, } const char *domain = elem->valuestring; - const char *table; + int table; if(whitelist) if(store_exact) - table = "whitelist"; + table = GRAVITY_DOMAINLIST_EXACT_WHITELIST; else - table = "regex_whitelist"; + table = GRAVITY_DOMAINLIST_REGEX_WHITELIST; else if(store_exact) - table = "blacklist"; + table = GRAVITY_DOMAINLIST_EXACT_BLACKLIST; else - table = "regex_blacklist"; + table = GRAVITY_DOMAINLIST_REGEX_BLACKLIST; cJSON *json = JSON_NEW_OBJ(); if(gravityDB_addToTable(table, domain)) @@ -215,17 +215,17 @@ static int api_dns_somelist_DELETE(struct mg_connection *conn, // Decode URL (necessar for regular expressions, harmless for domains) mg_url_decode(encoded_uri, strlen(encoded_uri), domain, sizeof(domain)-1u, 0); - const char *table; + int table; if(whitelist) if(store_exact) - table = "whitelist"; + table = GRAVITY_DOMAINLIST_EXACT_WHITELIST; else - table = "regex_whitelist"; + table = GRAVITY_DOMAINLIST_REGEX_WHITELIST; else if(store_exact) - table = "blacklist"; + table = GRAVITY_DOMAINLIST_EXACT_BLACKLIST; else - table = "regex_blacklist"; + table = GRAVITY_DOMAINLIST_REGEX_BLACKLIST; cJSON *json = JSON_NEW_OBJ(); if(gravityDB_delFromTable(table, domain)) diff --git a/src/database/gravity-db.c b/src/database/gravity-db.c index 3c6a360e..a6d43640 100644 --- a/src/database/gravity-db.c +++ b/src/database/gravity-db.c @@ -940,30 +940,33 @@ bool gravityDB_get_regex_client_groups(clientsData* client, const int numregex, return true; } -bool gravityDB_addToTable(const char *table, const char* domain) +bool gravityDB_addToTable(const int type, const char* domain) { - char *querystr = NULL; - // Build query string - if(asprintf(&querystr, "INSERT INTO %s (domain) VALUES (?);", table) < 30) - { - logg("gravityDB_addToTable(%s, %s) - asprintf() error", table, domain); - return false; - } - // Prepare SQLite statement sqlite3_stmt* stmt = NULL; + const char *querystr = "INSERT INTO domainlist (domain,type) VALUES (?,?);"; int rc = sqlite3_prepare_v2(gravity_db, querystr, -1, &stmt, NULL); if( rc != SQLITE_OK ){ - logg("gravityDB_addToTable(%s, %s) - SQL error prepare (%i): %s", - table, domain, rc, sqlite3_errmsg(gravity_db)); + logg("gravityDB_addToTable(%d, %s) - SQL error prepare (%i): %s", + type, domain, rc, sqlite3_errmsg(gravity_db)); return false; } - // Bind domain to prepared statement + // Bind domain string to prepared statement if((rc = sqlite3_bind_text(stmt, 1, domain, -1, SQLITE_STATIC)) != SQLITE_OK) { - logg("gravityDB_addToTable(%s, %s): Failed to bind domain (error %d) - %s", - table, domain, rc, sqlite3_errmsg(gravity_db)); + logg("gravityDB_addToTable(%d, %s): Failed to bind domain (error %d) - %s", + type, domain, rc, sqlite3_errmsg(gravity_db)); + sqlite3_reset(stmt); + sqlite3_finalize(stmt); + return false; + } + + // Bind domain type to prepared statement + if((rc = sqlite3_bind_int(stmt, 2, type)) != SQLITE_OK) + { + logg("gravityDB_addToTable(%d, %s): Failed to bind domain (error %d) - %s", + type, domain, rc, sqlite3_errmsg(gravity_db)); sqlite3_reset(stmt); sqlite3_finalize(stmt); return false; @@ -983,30 +986,33 @@ bool gravityDB_addToTable(const char *table, const char* domain) return okay; } -bool gravityDB_delFromTable(const char *table, const char* domain) +bool gravityDB_delFromTable(const int type, const char* domain) { - char *querystr = NULL; - // Build query string - if(asprintf(&querystr, "DELETE FROM %s WHERE domain = ?;", table) < 30) - { - logg("gravityDB_delFromTable(%s, %s) - asprintf() error", table, domain); - return false; - } - // Prepare SQLite statement sqlite3_stmt* stmt = NULL; + const char *querystr = "DELETE FROM domainlist WHERE domain = ? AND type = ?;"; int rc = sqlite3_prepare_v2(gravity_db, querystr, -1, &stmt, NULL); if( rc != SQLITE_OK ){ - logg("gravityDB_delFromTable(%s, %s) - SQL error prepare (%i): %s", - table, domain, rc, sqlite3_errmsg(gravity_db)); + logg("gravityDB_delFromTable(%d, %s) - SQL error prepare (%i): %s", + type, domain, rc, sqlite3_errmsg(gravity_db)); return false; } // Bind domain to prepared statement if((rc = sqlite3_bind_text(stmt, 1, domain, -1, SQLITE_STATIC)) != SQLITE_OK) { - logg("gravityDB_delFromTable(%s, %s): Failed to bind domain (error %d) - %s", - table, domain, rc, sqlite3_errmsg(gravity_db)); + logg("gravityDB_delFromTable(%d, %s): Failed to bind domain (error %d) - %s", + type, domain, rc, sqlite3_errmsg(gravity_db)); + sqlite3_reset(stmt); + sqlite3_finalize(stmt); + return false; + } + + // Bind domain type to prepared statement + if((rc = sqlite3_bind_int(stmt, 2, type)) != SQLITE_OK) + { + logg("gravityDB_delFromTable(%d, %s): Failed to bind domain (error %d) - %s", + type, domain, rc, sqlite3_errmsg(gravity_db)); sqlite3_reset(stmt); sqlite3_finalize(stmt); return false; diff --git a/src/database/gravity-db.h b/src/database/gravity-db.h index 3660eb9e..dbcff0cd 100644 --- a/src/database/gravity-db.h +++ b/src/database/gravity-db.h @@ -17,6 +17,10 @@ // Table indices enum { GRAVITY_TABLE, EXACT_BLACKLIST_TABLE, EXACT_WHITELIST_TABLE, REGEX_BLACKLIST_TABLE, REGEX_WHITELIST_TABLE, UNKNOWN_TABLE }; +enum { GRAVITY_DOMAINLIST_EXACT_WHITELIST = 0, + GRAVITY_DOMAINLIST_EXACT_BLACKLIST = 1, + GRAVITY_DOMAINLIST_REGEX_WHITELIST = 2, + GRAVITY_DOMAINLIST_REGEX_BLACKLIST = 3 }; bool gravityDB_open(void); bool gravityDB_prepare_client_statements(const int clientID, clientsData* client); @@ -34,7 +38,7 @@ bool in_blacklist(const char *domain, const int clientID, clientsData* client); bool gravityDB_get_regex_client_groups(clientsData* client, const int numregex, const int *regexid, const unsigned char type, const char* table, const int clientID); -bool gravityDB_addToTable(const char *table, const char* domain); -bool gravityDB_delFromTable(const char *table, const char* domain); +bool gravityDB_addToTable(const int type, const char* domain); +bool gravityDB_delFromTable(const int type, const char* domain); #endif //GRAVITY_H