void SQLI_init_default_values(struct insert_data *idata) { config.sql_recovery_logfile = FALSE; /* not supported */ /* Linking database parameters */ if (!config.sql_db) config.sql_db = sqlite3_db; if (!config.sql_table) { if (config.sql_table_version == (SQL_TABLE_VERSION_BGP+1)) config.sql_table = sqlite3_table_bgp; else if (config.sql_table_version == 8) config.sql_table = sqlite3_table_v8; else if (config.sql_table_version == 7) config.sql_table = sqlite3_table_v7; else if (config.sql_table_version == 6) config.sql_table = sqlite3_table_v6; else if (config.sql_table_version == 5) config.sql_table = sqlite3_table_v5; else if (config.sql_table_version == 4) config.sql_table = sqlite3_table_v4; else if (config.sql_table_version == 3) config.sql_table = sqlite3_table_v3; else if (config.sql_table_version == 2) config.sql_table = sqlite3_table_v2; else config.sql_table = sqlite3_table; } if (strchr(config.sql_table, '%')) idata->dyn_table = TRUE; glob_dyn_table = idata->dyn_table; if (config.sql_backup_host) idata->recover = TRUE; if (config.sql_multi_values) { multi_values_buffer = malloc(config.sql_multi_values); if (!multi_values_buffer) { Log(LOG_ERR, "ERROR ( %s/%s ): Unable to get enough room (%d) for multi value queries.\n", config.name, config.type, config.sql_multi_values); config.sql_multi_values = FALSE; } memset(multi_values_buffer, 0, config.sql_multi_values); } if (config.sql_locking_style) idata->locks = sql_select_locking_style(config.sql_locking_style); }
void PG_init_default_values(struct insert_data *idata) { /* Linking database parameters */ if (!config.sql_data) config.sql_data = typed_str; if (!config.sql_user) config.sql_user = pgsql_user; if (!config.sql_db) config.sql_db = pgsql_db; if (!config.sql_passwd) config.sql_passwd = pgsql_pwd; if (!config.sql_table) { /* checking 'typed' table constraints */ if (!strcmp(config.sql_data, "typed")) { if (config.what_to_count & (COUNT_SRC_AS|COUNT_SUM_AS|COUNT_DST_AS) && config.what_to_count & (COUNT_SRC_HOST|COUNT_SUM_HOST|COUNT_DST_HOST|COUNT_SRC_NET|COUNT_SUM_NET|COUNT_DST_NET) && config.sql_table_version < 6) { Log(LOG_ERR, "ERROR ( %s/%s ): 'typed' PostgreSQL table in use: unable to mix HOST/NET and AS aggregations.\n", config.name, config.type); exit_plugin(1); } typed = TRUE; } else if (!strcmp(config.sql_data, "unified")) typed = FALSE; else { Log(LOG_ERR, "ERROR ( %s/%s ): Ignoring unknown 'sql_data' value '%s'.\n", config.name, config.type, config.sql_data); exit_plugin(1); } if (typed) { if (config.sql_table_version == (SQL_TABLE_VERSION_BGP+1)) config.sql_table = pgsql_table_bgp; else if (config.sql_table_version == 8) config.sql_table = pgsql_table_v8; else if (config.sql_table_version == 7) config.sql_table = pgsql_table_v7; else if (config.sql_table_version == 6) config.sql_table = pgsql_table_v6; else if (config.sql_table_version == 5) { if (config.what_to_count & (COUNT_SRC_AS|COUNT_DST_AS|COUNT_SUM_AS)) config.sql_table = pgsql_table_as_v5; else config.sql_table = pgsql_table_v5; } else if (config.sql_table_version == 4) { if (config.what_to_count & (COUNT_SRC_AS|COUNT_DST_AS|COUNT_SUM_AS)) config.sql_table = pgsql_table_as_v4; else config.sql_table = pgsql_table_v4; } else if (config.sql_table_version == 3) { if (config.what_to_count & (COUNT_SRC_AS|COUNT_DST_AS|COUNT_SUM_AS)) config.sql_table = pgsql_table_as_v3; else config.sql_table = pgsql_table_v3; } else if (config.sql_table_version == 2) { if (config.what_to_count & (COUNT_SRC_AS|COUNT_DST_AS|COUNT_SUM_AS)) config.sql_table = pgsql_table_as_v2; else config.sql_table = pgsql_table_v2; } else { if (config.what_to_count & (COUNT_SRC_AS|COUNT_DST_AS|COUNT_SUM_AS)) config.sql_table = pgsql_table_as; else config.sql_table = pgsql_table; } } else { if (config.sql_table_version == 8) { Log(LOG_WARNING, "WARN ( %s/%s ): Unified data are no longer supported. Switching to typed data.\n", config.name, config.type); config.sql_table = pgsql_table_v8; } if (config.sql_table_version == 7) { Log(LOG_WARNING, "WARN ( %s/%s ): Unified data are no longer supported. Switching to typed data.\n", config.name, config.type); config.sql_table = pgsql_table_v7; } else if (config.sql_table_version == 6) { Log(LOG_WARNING, "WARN ( %s/%s ): Unified data are no longer supported. Switching to typed data.\n", config.name, config.type); config.sql_table = pgsql_table_v6; } else if (config.sql_table_version == 5) config.sql_table = pgsql_table_uni_v5; else if (config.sql_table_version == 4) config.sql_table = pgsql_table_uni_v4; else if (config.sql_table_version == 3) config.sql_table = pgsql_table_uni_v3; else if (config.sql_table_version == 2) config.sql_table = pgsql_table_uni_v2; else config.sql_table = pgsql_table_uni; } } if (strchr(config.sql_table, '%') || strchr(config.sql_table, '$')) idata->dyn_table = TRUE; glob_dyn_table = idata->dyn_table; if (config.sql_backup_host || config.sql_recovery_logfile) idata->recover = TRUE; if (!config.sql_dont_try_update && config.sql_use_copy) config.sql_use_copy = FALSE; if (config.sql_locking_style) idata->locks = sql_select_locking_style(config.sql_locking_style); }
int PG_compose_static_queries() { int primitives=0, set_primitives=0, set_event_primitives=0, have_flows=0, lock=0; char default_delim[] = ",", delim_buf[SRVBUFLEN]; if (config.what_to_count & COUNT_FLOWS || (config.sql_table_version >= 4 && config.sql_table_version < SQL_TABLE_VERSION_BGP && !config.sql_optimize_clauses)) { config.what_to_count |= COUNT_FLOWS; have_flows = TRUE; if ((config.sql_table_version < 4 || config.sql_table_version >= SQL_TABLE_VERSION_BGP) && !config.sql_optimize_clauses) { Log(LOG_ERR, "ERROR ( %s/%s ): The accounting of flows requires SQL table v4. Exiting.\n", config.name, config.type); exit_plugin(1); } } /* "INSERT INTO ... VALUES ... ", "COPY ... ", "... WHERE ..." stuff */ strncpy(where[primitives].string, " WHERE ", sizeof(where[primitives].string)); snprintf(copy_clause, sizeof(copy_clause), "COPY %s (", config.sql_table); snprintf(insert_clause, sizeof(insert_clause), "INSERT INTO %s (", config.sql_table); strncpy(values[primitives].string, " VALUES (", sizeof(values[primitives].string)); primitives = PG_evaluate_history(primitives); primitives = sql_evaluate_primitives(primitives); strncat(copy_clause, ", packets, bytes", SPACELEFT(copy_clause)); if (have_flows) strncat(copy_clause, ", flows", SPACELEFT(copy_clause)); if (!config.sql_delimiter || !config.sql_use_copy) snprintf(delim_buf, SRVBUFLEN, ") FROM STDIN DELIMITER \'%s\'", default_delim); else snprintf(delim_buf, SRVBUFLEN, ") FROM STDIN DELIMITER \'%s\'", config.sql_delimiter); strncat(copy_clause, delim_buf, SPACELEFT(copy_clause)); strncpy(insert_counters_clause, ", packets, bytes", SPACELEFT(insert_counters_clause)); if (have_flows) strncat(insert_counters_clause, ", flows", SPACELEFT(insert_counters_clause)); strncat(insert_counters_clause, ")", SPACELEFT(insert_counters_clause)); strncpy(insert_nocounters_clause, ")", SPACELEFT(insert_nocounters_clause)); /* "LOCK ..." stuff */ if (config.sql_dont_try_update) snprintf(lock_clause, sizeof(lock_clause), "BEGIN;"); else { if (config.sql_locking_style) lock = sql_select_locking_style(config.sql_locking_style); switch (lock) { case PM_LOCK_NONE: snprintf(lock_clause, sizeof(lock_clause), "BEGIN;"); break; case PM_LOCK_ROW_EXCLUSIVE: snprintf(lock_clause, sizeof(lock_clause), "BEGIN; LOCK %s IN ROW EXCLUSIVE MODE;", config.sql_table); break; case PM_LOCK_EXCLUSIVE: default: snprintf(lock_clause, sizeof(lock_clause), "BEGIN; LOCK %s IN EXCLUSIVE MODE;", config.sql_table); break; } } /* "UPDATE ... SET ..." stuff */ snprintf(update_clause, sizeof(update_clause), "UPDATE %s ", config.sql_table); set_primitives = sql_compose_static_set(have_flows); set_event_primitives = sql_compose_static_set_event(); if (config.sql_history) { if (!config.sql_history_since_epoch) { strncpy(set[set_primitives].string, ", ", SPACELEFT(set[set_primitives].string)); strncat(set[set_primitives].string, "stamp_updated=CURRENT_TIMESTAMP(0)", SPACELEFT(set[set_primitives].string)); set[set_primitives].type = TIMESTAMP; set[set_primitives].handler = count_noop_setclause_handler; set_primitives++; if (set_event_primitives) strncpy(set_event[set_event_primitives].string, ", ", SPACELEFT(set_event[set_event_primitives].string)); else strncpy(set_event[set_event_primitives].string, "SET ", SPACELEFT(set_event[set_event_primitives].string)); strncat(set_event[set_event_primitives].string, "stamp_updated=CURRENT_TIMESTAMP(0)", SPACELEFT(set_event[set_event_primitives].string)); set_event[set_event_primitives].type = TIMESTAMP; set_event[set_event_primitives].handler = count_noop_setclause_handler; set_event_primitives++; } else { strncpy(set[set_primitives].string, ", ", SPACELEFT(set[set_primitives].string)); strncat(set[set_primitives].string, "stamp_updated=DATE_PART('epoch',NOW())::BIGINT", SPACELEFT(set[set_primitives].string)); set[set_primitives].type = TIMESTAMP; set[set_primitives].handler = count_noop_setclause_handler; set_primitives++; if (set_event_primitives) strncpy(set_event[set_event_primitives].string, ", ", SPACELEFT(set_event[set_event_primitives].string)); else strncpy(set_event[set_event_primitives].string, "SET ", SPACELEFT(set_event[set_event_primitives].string)); strncat(set_event[set_event_primitives].string, "stamp_updated=DATE_PART('epoch',NOW())::BIGINT", SPACELEFT(set_event[set_event_primitives].string)); set_event[set_event_primitives].type = TIMESTAMP; set_event[set_event_primitives].handler = count_noop_setclause_handler; set_primitives++; } } /* values for COPY */ memcpy(©_values, &values, sizeof(copy_values)); { int num, x, y; char *ptr; ptr = strchr(copy_values[0].string, '('); ptr++; strcpy(copy_values[0].string, ptr); for (num = 0; num < primitives; num++) { for (x = 0; copy_values[num].string[x] != '\0'; x++) { if (copy_values[num].string[x] == ' ' || copy_values[num].string[x] == '\'') { for (y = x + 1; copy_values[num].string[y] != '\0'; y++) copy_values[num].string[y-1] = copy_values[num].string[y]; copy_values[num].string[y-1] = '\0'; x--; } } copy_values[num].string[x] = '\0'; } } return primitives; }