Add count of found rows
[ftsbench.git] / mysqldriver.c
index 034a37a..68f5b40 100644 (file)
@@ -50,7 +50,10 @@ typedef struct ftsMY {
 static void
 execQuery(ftsDB *adb, char **words, int flags) {
        ftsMY *db = (ftsMY*)adb;
-       static MYSQL_BIND       data;
+       static MYSQL_BIND       datain, dataout;
+       static int intout;
+       static my_bool  isnull, my_error;
+       static unsigned long    length;
        MYSQL_RES       *res;
 
        if ( db->prepareStmt == NULL ) {
@@ -71,9 +74,16 @@ execQuery(ftsDB *adb, char **words, int flags) {
                        exit(1);
                }
 
-               memset(&data, 0, sizeof(MYSQL_BIND));
-               data.buffer_type = MYSQL_TYPE_BLOB;
-               data.length = (unsigned long*)&(db->b.strlen);
+               memset(&datain, 0, sizeof(MYSQL_BIND));
+               datain.buffer_type = MYSQL_TYPE_BLOB;
+               datain.length = (unsigned long*)&(db->b.strlen);
+
+               memset(&dataout, 0, sizeof(MYSQL_BIND));
+               dataout.buffer_type= MYSQL_TYPE_LONG;
+               dataout.buffer= (char *)&intout;
+               dataout.is_null= &isnull;
+               dataout.length= &length;
+               dataout.error= &my_error;
 
                db->flags = flags;
        }
@@ -90,27 +100,43 @@ execQuery(ftsDB *adb, char **words, int flags) {
                words++;
        }
 
-       data.buffer = db->b.str;
-       data.buffer_length = db->b.strlen;
+       datain.buffer = db->b.str;
+       datain.buffer_length = db->b.strlen;
 
-       if ( mysql_stmt_bind_param(db->prepareStmt, &data) ) {
+       if ( mysql_stmt_bind_param(db->prepareStmt, &datain) ) {
                fprintf(stderr,"mysql_stmt_bind_param failed: %s\n", mysql_error(db->conn));
                exit(1);
        }
 
+       res = mysql_stmt_result_metadata(db->prepareStmt);
+       if ( !res ) { 
+               fprintf(stderr,"mysql_stmt_result_metadata failed: %s\n", mysql_error(db->conn));
+               exit(1);
+       }
+
        if ( mysql_stmt_execute( db->prepareStmt ) ) {
                fprintf(stderr,"mysql_stmt_execute failed: %s\n", mysql_error(db->conn));
                exit(1);
        }
 
-       res = mysql_store_result(db->conn);
-       if ( res == NULL ) {
-               if  ( mysql_errno(db->conn)!=0 ) {
-                       fprintf(stderr,"mysql_store_result failed: %s\n", mysql_error(db->conn));
-                       exit(1);
-               }
-       } else
-               mysql_free_result(res);
+       if (mysql_stmt_bind_result( db->prepareStmt, &dataout)) {
+               fprintf(stderr,"mysql_stmt_bind_result failed: %s\n", mysql_error(db->conn));
+               exit(1);
+       }
+
+       if ( mysql_stmt_store_result( db->prepareStmt ) ) {
+               fprintf(stderr,"mysql_stmt_store_result failed: %s\n", mysql_error(db->conn));
+               exit(1);
+       }
+
+       if ( !mysql_stmt_fetch( db->prepareStmt) ) {
+               db->db.nres += intout;
+       } else {
+               fprintf(stderr,"mysql_stmt_fetch returns void result\n");
+               exit(1);
+       }
+
+       mysql_free_result(res);
 
        pthread_mutex_lock(&(db->db.nqueryMutex));
        db->db.nquery ++;