#include <stdio.h>
#include <mysql/mysql.h>
#include <unistd.h>

#define MyHOST "localhost"
#define MyNAME "zhouer"
#define MyDB   "zhouer"

#define QSIZE 256

MYSQL *dp;
MYSQL_RES *qp;
MYSQL_ROW row;

int opendb( char* passwd) {

	dp = mysql_init(NULL);
	if (dp == NULL) {
		fprintf(stderr, "mysql_init() failed\n");
		return 2;
	}

	mysql_real_connect(dp, MyHOST, MyNAME, passwd, MyDB, 0, NULL, 0);
	if (dp == NULL) {
		fprintf(stderr, "mysql_real_connect() failed\n");
		return 3;
	}

	if (mysql_select_db(dp, MyDB) != 0) {
		fprintf(stderr, "mysql_select_db() failed\n");
		mysql_close(dp);
		return 4;
	}
	return 0;
}

int main() {
	int i;
	int err, rows, cols;
	char query[QSIZE], passwd[128];

	strcpy(passwd, getpass("please input password for connecting mysql: "));

	err = opendb( passwd );
	if (err) {
		/* 如果資料庫沒開成功，沒戲唱了，輸出訊息 */
		return err;
	}

	while(1) {

		printf("input query: ");
		fgets(query, 128, stdin);

		if( !strcmp(query, "quit\n") ) {
			printf("bye!");
			break;
		}

		err = mysql_query(dp, query);
		if (err) {
			/* 執行發生了錯誤，可能指令的語法有錯，也可能其他，輸出訊息 */
			fprintf(stderr, "error in mysql_query\n");
			return 5;
		}

		qp = mysql_store_result(dp);
		if (qp != NULL) {

			/* 所有執行結果都已經儲存在 RAM 裡面，由 qp 指著，*/
			/* 接下來，只要針對 *qp 做資料處理就行了。         */

			rows = mysql_num_rows(qp);
			cols = mysql_num_fields(qp);

			/* printf("The result table has %d rows and %d columns\n", rows, cols); */

			while ((row = mysql_fetch_row(qp)) != NULL) {
				for (i = 0; i < cols; ++i) {
					printf("%s\t", row[i]);
				}
				putchar('\n');
			}

			mysql_free_result(qp);  /* 釋放儲存結果的記憶體 */
		}
	}

	mysql_close(dp);  /* 沒事早點切掉資料庫的連線，比較節省網路資源。*/

	return 0;
}

