int PG_cache_dbop(struct DBdesc *db, struct db_cache *cache_elem, struct insert_data *idata) { PGresult *ret; char *ptr_values, *ptr_where, *err_string; int num=0, have_flows=0; if (lh.what_to_count & COUNT_FLOWS) have_flows = TRUE; /* constructing SQL query */ ptr_where = where_clause; ptr_values = values_clause; while (num < idata->num_primitives) { (*where[num].handler)(cache_elem, idata, num, &ptr_values, &ptr_where); num++; } if (have_flows) snprintf(sql_data, sizeof(sql_data), update_clause, cache_elem->packet_counter, cache_elem->bytes_counter, cache_elem->flows_counter, time(NULL)); else snprintf(sql_data, sizeof(sql_data), update_clause, cache_elem->packet_counter, cache_elem->bytes_counter, time(NULL)); strncat(sql_data, where_clause, SPACELEFT(sql_data)); /* sending UPDATE query */ if (!sql_dont_try_update) { ret = PQexec(db->desc, sql_data); if (PQresultStatus(ret) != PGRES_COMMAND_OK) { err_string = PQresultErrorMessage(ret); PQclear(ret); printf("FAILED query follows:\n%s\n", sql_data); printf("%s\n", err_string); return TRUE; } PQclear(ret); } if (sql_dont_try_update || (!PG_affected_rows(ret))) { /* UPDATE failed, trying with an INSERT query */ strncpy(sql_data, insert_clause, sizeof(sql_data)); #if defined HAVE_64BIT_COUNTERS if (have_flows) snprintf(ptr_values, SPACELEFT(values_clause), ", %llu, %llu, %llu)", cache_elem->packet_counter, cache_elem->bytes_counter, cache_elem->flows_counter); else snprintf(ptr_values, SPACELEFT(values_clause), ", %llu, %llu)", cache_elem->packet_counter, cache_elem->bytes_counter); #else if (have_flows) snprintf(ptr_values, SPACELEFT(values_clause), ", %lu, %lu, %lu)", cache_elem->packet_counter, cache_elem->bytes_counter, cache_elem->flows_counter); else snprintf(ptr_values, SPACELEFT(values_clause), ", %lu, %lu)", cache_elem->packet_counter, cache_elem->bytes_counter); #endif strncat(sql_data, values_clause, SPACELEFT(sql_data)); ret = PQexec(db->desc, sql_data); if (PQresultStatus(ret) != PGRES_COMMAND_OK) { err_string = PQresultErrorMessage(ret); PQclear(ret); printf("FAILED query follows:\n%s\n", sql_data); printf("%s\n", err_string); return TRUE; } PQclear(ret); } if (debug) printf("%s\n\n", sql_data); return FALSE; }
int PG_cache_dbop(struct DBdesc *db, struct db_cache *cache_elem, struct insert_data *idata) { PGresult *ret; char *ptr_values, *ptr_where, *ptr_set, *ptr_insert; int num=0, num_set=0, have_flows=0; if (config.what_to_count & COUNT_FLOWS) have_flows = TRUE; /* constructing SQL query */ ptr_where = where_clause; ptr_values = values_clause; ptr_set = set_clause; ptr_insert = insert_full_clause; memset(where_clause, 0, sizeof(where_clause)); memset(values_clause, 0, sizeof(values_clause)); memset(set_clause, 0, sizeof(set_clause)); memset(insert_full_clause, 0, sizeof(insert_full_clause)); for (num = 0; num < idata->num_primitives; num++) (*where[num].handler)(cache_elem, idata, num, &ptr_values, &ptr_where); if (cache_elem->flow_type == NF9_FTYPE_EVENT || cache_elem->flow_type == NF9_FTYPE_OPTION) { for (num_set = 0; set_event[num_set].type; num_set++) (*set_event[num_set].handler)(cache_elem, idata, num_set, &ptr_set, NULL); } else { for (num_set = 0; set[num_set].type; num_set++) (*set[num_set].handler)(cache_elem, idata, num_set, &ptr_set, NULL); } /* sending UPDATE query a) if not switched off and b) if we actually have something to update */ if (!config.sql_dont_try_update && num_set) { strncpy(sql_data, update_clause, SPACELEFT(sql_data)); strncat(sql_data, set_clause, SPACELEFT(sql_data)); strncat(sql_data, where_clause, SPACELEFT(sql_data)); ret = PQexec(db->desc, sql_data); if (PQresultStatus(ret) != PGRES_COMMAND_OK) { db->errmsg = PQresultErrorMessage(ret); PQclear(ret); Log(LOG_DEBUG, "DEBUG ( %s/%s ): FAILED query follows:\n%s\n", config.name, config.type, sql_data); if (db->errmsg) Log(LOG_ERR, "ERROR ( %s/%s ): %s\n\n", config.name, config.type, db->errmsg); sql_db_fail(db); return TRUE; } PQclear(ret); } if (config.sql_dont_try_update || !num_set || (!PG_affected_rows(ret))) { /* UPDATE failed, trying with an INSERT query */ if (cache_elem->flow_type == NF9_FTYPE_EVENT || cache_elem->flow_type == NF9_FTYPE_OPTION) { strncpy(insert_full_clause, insert_clause, SPACELEFT(insert_full_clause)); strncat(insert_full_clause, insert_nocounters_clause, SPACELEFT(insert_full_clause)); strncat(ptr_values, ")", SPACELEFT(values_clause)); } else { strncpy(insert_full_clause, insert_clause, SPACELEFT(insert_full_clause)); strncat(insert_full_clause, insert_counters_clause, SPACELEFT(insert_full_clause)); #if defined HAVE_64BIT_COUNTERS if (have_flows) snprintf(ptr_values, SPACELEFT(values_clause), ", %llu, %llu, %llu)", cache_elem->packet_counter, cache_elem->bytes_counter, cache_elem->flows_counter); else snprintf(ptr_values, SPACELEFT(values_clause), ", %llu, %llu)", cache_elem->packet_counter, cache_elem->bytes_counter); #else if (have_flows) snprintf(ptr_values, SPACELEFT(values_clause), ", %lu, %lu, %lu)", cache_elem->packet_counter, cache_elem->bytes_counter, cache_elem->flows_counter); else snprintf(ptr_values, SPACELEFT(values_clause), ", %lu, %lu)", cache_elem->packet_counter, cache_elem->bytes_counter); #endif } strncpy(sql_data, insert_full_clause, sizeof(sql_data)); strncat(sql_data, values_clause, SPACELEFT(sql_data)); ret = PQexec(db->desc, sql_data); if (PQresultStatus(ret) != PGRES_COMMAND_OK) { db->errmsg = PQresultErrorMessage(ret); PQclear(ret); Log(LOG_DEBUG, "DEBUG ( %s/%s ): FAILED query follows:\n%s\n", config.name, config.type, sql_data); if (db->errmsg) Log(LOG_ERR, "ERROR ( %s/%s ): %s\n\n", config.name, config.type, db->errmsg); sql_db_fail(db); return TRUE; } PQclear(ret); idata->iqn++; } else idata->uqn++; idata->een++; Log(LOG_DEBUG, "DEBUG ( %s/%s ): %s\n\n", config.name, config.type, sql_data); return FALSE; }