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

Reply via email to