static gboolean _ensure_table_is_syslogng_conform(AFSqlDestDriver *self, dbi_result db_res, const gchar *table) { gboolean success = TRUE; gboolean new_transaction_started = FALSE; gint i; GString *query_string = g_string_sized_new(32); for (i = 0; success && (i < self->fields_len); i++) { if (dbi_result_get_field_idx(db_res, self->fields[i].name) == 0) { GList *l; if (!new_transaction_started) { if (!afsql_dd_begin_new_transaction(self)) { msg_error("Starting new transaction for modifying(ALTER) table has failed", evt_tag_str("table", table), NULL); success = FALSE; break; } new_transaction_started = TRUE; } /* field does not exist, add this column */ g_string_printf(query_string, "ALTER TABLE %s ADD %s %s", table, self->fields[i].name, self->fields[i].type); if (!afsql_dd_run_query(self, query_string->str, FALSE, NULL)) { msg_error("Error adding missing column, giving up", evt_tag_str("table", table), evt_tag_str("column", self->fields[i].name), NULL); success = FALSE; break; } for (l = self->indexes; l; l = l->next) { if (strcmp((gchar *) l->data, self->fields[i].name) == 0) { /* this is an indexed column, create index */ afsql_dd_create_index(self, table, self->fields[i].name); } } } } if (new_transaction_started && ( !success || !afsql_dd_commit_transaction(self))) { afsql_dd_rollback_transaction(self); success = FALSE; } g_string_free(query_string, TRUE); return success; }
/** * afsql_dd_validate_table: * * Check if the given table exists in the database. If it doesn't * create it, if it does, check if all the required fields are * present and create them if they don't. * * NOTE: This function can only be called from the database thread. **/ static gboolean afsql_dd_validate_table(AFSqlDestDriver *self, GString *table) { GString *query_string; dbi_result db_res; gboolean success = FALSE; gint i; if (self->flags & AFSQL_DDF_DONT_CREATE_TABLES) return TRUE; afsql_dd_check_sql_identifier(table->str, TRUE); if (g_hash_table_lookup(self->validated_tables, table->str)) return TRUE; query_string = g_string_sized_new(32); g_string_printf(query_string, "SELECT * FROM %s WHERE 0=1", table->str); if (afsql_dd_run_query(self, query_string->str, TRUE, &db_res)) { /* table exists, check structure */ success = TRUE; for (i = 0; success && (i < self->fields_len); i++) { if (dbi_result_get_field_idx(db_res, self->fields[i].name) == 0) { GList *l; /* field does not exist, add this column */ g_string_printf(query_string, "ALTER TABLE %s ADD %s %s", table->str, self->fields[i].name, self->fields[i].type); if (!afsql_dd_run_query(self, query_string->str, FALSE, NULL)) { msg_error("Error adding missing column, giving up", evt_tag_str("table", table->str), evt_tag_str("column", self->fields[i].name), NULL); success = FALSE; break; } for (l = self->indexes; l; l = l->next) { if (strcmp((gchar *) l->data, self->fields[i].name) == 0) { /* this is an indexed column, create index */ afsql_dd_create_index(self, table->str, self->fields[i].name); } } } } dbi_result_free(db_res); } else { /* table does not exist, create it */ g_string_printf(query_string, "CREATE TABLE %s (", table->str); for (i = 0; i < self->fields_len; i++) { g_string_append_printf(query_string, "%s %s", self->fields[i].name, self->fields[i].type); if (i != self->fields_len - 1) g_string_append(query_string, ", "); } g_string_append(query_string, ")"); if (afsql_dd_run_query(self, query_string->str, FALSE, NULL)) { GList *l; success = TRUE; for (l = self->indexes; l; l = l->next) { afsql_dd_create_index(self, table->str, (gchar *) l->data); } } else { msg_error("Error creating table, giving up", evt_tag_str("table", table->str), NULL); } } if (success) { /* we have successfully created/altered the destination table, record this information */ g_hash_table_insert(self->validated_tables, g_strdup(table->str), GUINT_TO_POINTER(TRUE)); } g_string_free(query_string, TRUE); return success; }