int MY_compose_static_queries() { int primitives=0, set_primitives=0, set_event_primitives=0, have_flows=0; 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 ... " and "... WHERE ..." stuff */ strncpy(where[primitives].string, " WHERE ", sizeof(where[primitives].string)); snprintf(insert_clause, sizeof(insert_clause), "INSERT INTO `%s` (", config.sql_table); strncpy(values[primitives].string, " VALUES (", sizeof(values[primitives].string)); primitives = MY_evaluate_history(primitives); primitives = sql_evaluate_primitives(primitives); 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 */ snprintf(lock_clause, sizeof(lock_clause), "LOCK TABLES `%s` WRITE", config.sql_table); strncpy(unlock_clause, "UNLOCK TABLES", sizeof(unlock_clause)); /* "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=NOW()", 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=NOW()", SPACELEFT(set_event[set_event_primitives].string)); set_event[set_event_primitives].type = TIMESTAMP; set_event[set_event_primitives].handler = count_noop_setclause_event_handler; set_event_primitives++; } else { strncpy(set[set_primitives].string, ", ", SPACELEFT(set[set_primitives].string)); strncat(set[set_primitives].string, "stamp_updated=UNIX_TIMESTAMP(NOW())", 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=UNIX_TIMESTAMP(NOW())", SPACELEFT(set_event[set_event_primitives].string)); set_event[set_event_primitives].type = TIMESTAMP; set_event[set_event_primitives].handler = count_noop_setclause_event_handler; set_event_primitives++; } } return primitives; }
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; }
int SQLI_compose_static_queries() { int primitives=0, set_primitives=0, set_event_primitives=0, have_flows=0; 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 ... " and "... WHERE ..." stuff */ strncpy(where[primitives].string, " WHERE ", sizeof(where[primitives].string)); snprintf(insert_clause, sizeof(insert_clause), "INSERT INTO %s (", config.sql_table); strncpy(values[primitives].string, " VALUES (", sizeof(values[primitives].string)); primitives = SQLI_evaluate_history(primitives); primitives = sql_evaluate_primitives(primitives); 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_locking_style) Log(LOG_WARNING, "WARN ( %s/%s ): sql_locking_style is not supported. Ignored.\n", config.name, config.type); snprintf(lock_clause, sizeof(lock_clause), "BEGIN", config.sql_table); strncpy(unlock_clause, "COMMIT", sizeof(unlock_clause)); /* "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.timestamps_since_epoch) { strncpy(set[set_primitives].string, ", ", SPACELEFT(set[set_primitives].string)); strncat(set[set_primitives].string, "stamp_updated=DATETIME('now', 'localtime')", 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=DATETIME('now', 'localtime')", SPACELEFT(set_event[set_event_primitives].string)); set_event[set_event_primitives].type = TIMESTAMP; set_event[set_event_primitives].handler = count_noop_setclause_event_handler; set_event_primitives++; } else { strncpy(set[set_primitives].string, ", ", SPACELEFT(set[set_primitives].string)); strncat(set[set_primitives].string, "stamp_updated=STRFTIME('%%s', 'now')", 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=STRFTIME('%%s', 'now')", SPACELEFT(set_event[set_event_primitives].string)); set_event[set_event_primitives].type = TIMESTAMP; set_event[set_event_primitives].handler = count_noop_setclause_event_handler; set_event_primitives++; } } return primitives; }