diff -ruBbd cacti-cactid-0.8.6g/cactid.h cacti-cactid-0.8.6g-patched/cactid.h --- cacti-cactid-0.8.6g/cactid.h 2006-01-11 19:25:55.000000000 -0500 +++ cacti-cactid-0.8.6g-patched/cactid.h 2006-01-22 18:57:38.000000000 -0500 @@ -121,6 +121,7 @@ #define STAT_DESCRIP_ERROR 99 #define CACTID_PARENT 1 #define CACTID_FORK 0 +#define MAX_MYSQL_BUF_SIZE 1400 /* locations to search for the config file */ #define CONFIG_PATHS 2 Only in cacti-cactid-0.8.6g-patched: mysql_max_packet_size.patch diff -ruBbd cacti-cactid-0.8.6g/poller.c cacti-cactid-0.8.6g-patched/poller.c --- cacti-cactid-0.8.6g/poller.c 2006-01-11 19:25:55.000000000 -0500 +++ cacti-cactid-0.8.6g-patched/poller.c 2006-01-22 18:57:38.000000000 -0500 @@ -109,13 +109,12 @@ int j; int num_oids = 0; int snmp_poller_items = 0; - int buffer; + int out_buffer; int php_process; char *poll_result = NULL; char update_sql[BUFSIZE]; char temp_result[BUFSIZE]; - char delim = ' '; int last_snmp_version = 0; int last_snmp_port = 0; @@ -681,26 +680,52 @@ } } - /* format database insert */ - buffer = 600*rows_processed+100; - - if (!(query3 = (char *)malloc(buffer))) { + /* insert the query results into the database */ + if (!(query3 = (char *)malloc(MAX_MYSQL_BUF_SIZE))) { die("ERROR: Fatal malloc error: poller.c query3 oids!\n"); } - memset(query3, 0, buffer); + query3[0] = '\0'; - snprintf(query3, buffer-1, "INSERT INTO poller_output (local_data_id,rrd_name,time,output) VALUES"); + int new_buffer = TRUE; + + snprintf(query3, MAX_MYSQL_BUF_SIZE-1, "INSERT INTO poller_output (local_data_id,rrd_name,time,output) VALUES"); + out_buffer = strlen(query3); i = 0; while (i < rows_processed) { - snprintf(result_string, sizeof(result_string)-1, "%c(%i,'%s','%s','%s')", delim, poller_items[i].local_data_id, poller_items[i].rrd_name, start_datetime, poller_items[i].result); + snprintf(result_string, sizeof(result_string)-1, " (%i,'%s','%s','%s')", poller_items[i].local_data_id, poller_items[i].rrd_name, start_datetime, poller_items[i].result); + + /* if the next element to the buffer will overflow it, write to the database */ + if ((out_buffer + strlen(result_string)) >= MAX_MYSQL_BUF_SIZE) { + /* insert the record */ + db_insert(&mysql, query3); + + /* re-initialize the query buffer */ + snprintf(query3, MAX_MYSQL_BUF_SIZE-1, "INSERT INTO poller_output (local_data_id,rrd_name,time,output) VALUES"); + + /* reset the output buffer length */ + out_buffer = strlen(query3); + + /* set binary, let the system know we are a new buffer */ + new_buffer = TRUE; + } + + /* if this is our first pass, or we just outputted to the database, need to change the delimeter */ + if (new_buffer) { + result_string[0] = ' '; + }else{ + result_string[0] = ','; + } + + out_buffer = out_buffer + strlen(result_string); strncat(query3, result_string, strlen(result_string)); - delim = ','; + + new_buffer = FALSE; i++; } - /* only perform and insert if there is something to insert */ - if (rows_processed > 0) { + /* perform the last insert if required */ + if (out_buffer > 0) { /* insert records into database */ db_insert(&mysql, query3); }