The regular INSERT is kept, mostly in case where the user has requested do not use UPDATE. This still allows pmacct to do bulk INSERT. However, the regular INSERT should not run in other cases, hence getting better performance. --- src/mysql_plugin.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/src/mysql_plugin.c b/src/mysql_plugin.c index edb99df..03a1925 100644 --- a/src/mysql_plugin.c +++ b/src/mysql_plugin.c @@ -318,19 +318,7 @@ int MY_cache_dbop(struct DBdesc *db, struct db_cache *cache_elem, struct insert_ for (num = 0; set[num].type; num++) (*set[num].handler)(cache_elem, idata, num, &ptr_set, NULL); - - /* sending UPDATE query */ - if (!config.sql_dont_try_update) { - 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 = mysql_query(db->desc, sql_data); - if (ret) goto signal_error; - } - if (config.sql_dont_try_update || (mysql_affected_rows(db->desc) == 0)) { - /* UPDATE failed, trying with an INSERT query */ #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); @@ -338,7 +326,20 @@ int MY_cache_dbop(struct DBdesc *db, struct db_cache *cache_elem, struct insert_ 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 + + /* sending UPDATE query. Use an INSERT ... ON DUPLICATE KEY UPDATE ... */ + if (!config.sql_dont_try_update) { + strncpy(sql_data, insert_clause, sizeof(sql_data)); + strncat(sql_data, values_clause, SPACELEFT(sql_data)); + strncat(sql_data, " ON DUPLICATE KEY UPDATE ", SPACELEFT(sql_data)); + strncat(sql_data, set_clause + 4, SPACELEFT(sql_data)); /* SET clause without "SET " */ + + ret = mysql_query(db->desc, sql_data); + if (ret) goto signal_error; + } + if (config.sql_dont_try_update || (mysql_affected_rows(db->desc) == 0)) { + /* UPDATE failed, trying with an INSERT query */ if (config.sql_multi_values) { multi_values_handling: if (!idata->mv.buffer_elem_num) { -- 1.7.10.4 _______________________________________________ pmacct-discussion mailing list http://www.pmacct.net/#mailinglists