#if defined(_NT) #include #else #define TRUE 1 #define FALSE 0 #endif #include #include #include #include #include #include #define QUERY_DROP_TABLE "DROP TABLE xxx" #define QUERY_CREATE_TABLE "CREATE TABLE xxx (id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(20) NOT NULL) TYPE = INNODB" MYSQL *mysql = NULL; void print_mysql_error(MYSQL *mysql) { fprintf(stderr, "%d:%s\n", mysql_errno(mysql), mysql_error(mysql)); } void print_mysql_stmt_error(MYSQL_STMT *stmt) { fprintf(stderr, "stmt error=%s\n", mysql_stmt_error(stmt)); } void exec_query(const char *query, const int IgnoreError) { if (mysql_query(mysql, query)) { if (IgnoreError == FALSE) { fprintf(stderr, "mysql_query(), failed\n"); fprintf(stderr, "query=%s\n", query); goto ErrorExit; } } return; ErrorExit: print_mysql_error(mysql); return; } int select_statement() { #define QUERY "select name from xxx" #define QUERY2 "select name from xxx where id=10" MYSQL_STMT *stmt, *stmt2; MYSQL_BIND bind_array[10]; MYSQL_BIND bind_array2[10]; char name[256], name2[256]; int rc; const unsigned long type= CURSOR_TYPE_READ_ONLY; unsigned long name_len, name_len2; stmt = mysql_stmt_init(mysql); if (!stmt) { fprintf(stderr, " mysql_stmt_init(), out of memory\n"); goto ErrorExit; } mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (const void *) &type); if (mysql_stmt_prepare(stmt, QUERY, strlen(QUERY))) { fprintf(stderr, " mysql_stmt_prepare(), failed\n"); print_mysql_stmt_error(stmt); goto ErrorExit; } /* output bind */ memset(bind_array, 0, sizeof(bind_array)); bind_array[0].buffer_type= MYSQL_TYPE_STRING; bind_array[0].buffer= (char *) name; bind_array[0].buffer_length= sizeof(name); bind_array[0].length= &name_len; if (mysql_stmt_bind_result(stmt, bind_array)) { fprintf(stderr, " mysql_stmt_bind_result(), failed\n"); print_mysql_stmt_error(stmt); goto ErrorExit; } if (mysql_stmt_execute(stmt)) { fprintf(stderr, " mysql_stmt_execute(), failed\n"); print_mysql_stmt_error(stmt); goto ErrorExit; } /* read a row; not the complete resultset */ rc = mysql_stmt_fetch(stmt); if (rc == MYSQL_NO_DATA) { printf("no rows found\n"); } else { if (rc == 0) { name[name_len]= '\0'; printf("%s\n", name); } else { print_mysql_stmt_error(stmt); } } mysql_stmt_free_result(stmt); mysql_stmt_reset(stmt); stmt2 = mysql_stmt_init(mysql); if (!stmt2) { fprintf(stderr, " mysql_stmt_init(), out of memory\n"); goto ErrorExit; } mysql_stmt_attr_set(stmt2, STMT_ATTR_CURSOR_TYPE, (const void *) &type); if (mysql_stmt_prepare(stmt2, QUERY2, strlen(QUERY2))) { fprintf(stderr, " mysql_stmt_prepare(), failed\n"); print_mysql_stmt_error(stmt2); goto ErrorExit; } /* output bind */ memset(bind_array2, 0, sizeof(bind_array2)); bind_array2[0].buffer_type= MYSQL_TYPE_STRING; bind_array2[0].buffer= (char *) name2; bind_array2[0].buffer_length= sizeof(name2); bind_array2[0].length= &name_len2; if (mysql_stmt_bind_result(stmt2, bind_array2)) { fprintf(stderr, " mysql_stmt_bind_result(), failed\n"); print_mysql_stmt_error(stmt2); goto ErrorExit; } if (mysql_stmt_execute(stmt2)) { fprintf(stderr, " mysql_stmt_execute(), failed\n"); print_mysql_stmt_error(stmt2); goto ErrorExit; } /* read rows from the second resultset */ for (;;) { rc = mysql_stmt_fetch(stmt2); if (rc == MYSQL_NO_DATA) { printf("no rows found\n"); break; } else { if (rc == 0) { name2[name_len2]= '\0'; printf("%s\n", name2); } else { print_mysql_stmt_error(stmt2); printf("error\n"); break; } } } if (mysql_stmt_close(stmt)) { fprintf(stderr, " mysql_stmt_close(), failed\n"); print_mysql_stmt_error(stmt); goto ErrorExit; } if (mysql_stmt_close(stmt2)) { fprintf(stderr, " mysql_stmt_close(), failed\n"); print_mysql_stmt_error(stmt2); goto ErrorExit; } return(TRUE); ErrorExit: print_mysql_error(mysql); return(FALSE); } int main(void) { int i = 0; char buf[100]; if ((mysql = mysql_init((MYSQL *) 0)) == NULL) goto ErrorExit; if (mysql_real_connect(mysql, "", "root", "root", "mysql", 0, NULL, 0) == NULL) goto ErrorExit; exec_query(QUERY_DROP_TABLE, TRUE); exec_query(QUERY_CREATE_TABLE, FALSE); for (i = 10; i <= 340; i = i + 10) { sprintf(buf, "insert into xxx (id,name) values (%d,'a%03d')", i, i); exec_query(buf, FALSE); } mysql_autocommit( mysql, FALSE ); exec_query("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED", FALSE ); /* */ (void) select_statement(); mysql_close(mysql); return(0); ErrorExit: print_mysql_error(mysql); return(1); }