X-Git-Url: http://sigaev.ru/git/gitweb.cgi?p=ftsbench.git;a=blobdiff_plain;f=mysqldriver.c;fp=mysqldriver.c;h=68f5b40c366f1d6b50cedb7410b60557adbd27f0;hp=034a37ae17561f422d1988feb24abc02d57b6732;hb=04bb53c0bccbe6936503cb32b4c80024a90f19c1;hpb=18b8e016bce54cca0bc8efb4f4252bd0b049605d diff --git a/mysqldriver.c b/mysqldriver.c index 034a37a..68f5b40 100644 --- a/mysqldriver.c +++ b/mysqldriver.c @@ -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 ++;