另外,如果pzconnect函数的函数名改为connect,就会在mysql_real_connect的时候出错(段错误),我想应该是因为mysql_real_connect会调用它自己的一个connect函数吧,而我这个和它的冲突了,改了名就没事了。。
对getinstr进行了加强。
第一个字符就输入回车,不记录在指令区
如果回车不是第一个字符,就先替换成\0,看看指令是不是quit或者exit;
不是的话,就把回车替换成空格,这样就不会把
SELECT * FROM
children
变成
SELECT * FROMchildren
改了以后变成
SELECT * FROM children
这和mysql客户端是一致的。
编译命令:
gcc pzmysqlc.c -o pzmysqlc -I/usr/include/mysql -lmysqlclient -Wall
#include <stdio.h> #include <mysql.h> #include <string.h>
#define QUER 0 #define QUIT 1 #define CONT 2
int pzconnect(MYSQL *cp) { mysql_init(cp); if(mysql_real_connect(cp, "localhost", "pz", NULL, "pz", 0, NULL, 0) == NULL){ return -1; } return 0; }
void reperr(MYSQL *cp) { fprintf(stderr, "Error %d: %s\n", mysql_errno(cp), mysql_error(cp)); }
int getinstr(char *instr, int lim) { char *sp = instr; while((*sp = getchar()) != ';') { if(*sp == '\n'){ if(sp == instr) return CONT; *sp = '\0'; if(strcmp(instr, "quit") == 0 || strcmp(instr, "exit") == 0) { return QUIT; } *sp++ = ' '; continue; } sp++; } *sp = '\0'; return QUER; }
int showres(MYSQL *cp) { MYSQL_RES *resp; MYSQL_ROW row; int fc, i; resp = mysql_store_result(cp); fc = mysql_field_count(cp); while((row = mysql_fetch_row(resp)) != NULL) { for(i = 0; i < fc; i++){ printf("%s ", row[i]); } printf("\n"); } if(mysql_errno(cp)){ return -1; } mysql_free_result(resp); return 0; }
void welcome() { printf("Welcome!\n"); }
int main() { MYSQL conn; char instr[512]; int r; if(pzconnect(&conn) != 0){ reperr(&conn); return -1; } welcome(); while((r = getinstr(instr, 512)) != QUIT) { if(r == CONT) continue; if(mysql_query(&conn, instr) != 0){ reperr(&conn); continue; } if(showres(&conn) != 0) { reperr(&conn); } }
mysql_close(&conn); return 0; }
|
阅读(1537) | 评论(0) | 转发(0) |