//头文件 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <mysql/mysql.h> #include <termios.h> #ifdef __cplusplus extern "C" { #endif //设置退格键不回显 int set_Backkey(); //获取用户SQL语句,判断用户操作,不区分大小写 void read_user_print(MYSQL *pmysql,MYSQL *connection); #ifdef __cplusplus } #endif
//辅助方法实现 #include "pub.h" //设置退格键不回显 int set_Backkey() { struct termios term; memset(&term, 0, sizeof(term)); /*获取当前系统的termios设置*/ if (tcgetattr(STDIN_FILENO, &term) == -1) { printf("tcgetattr() failed! error message:%s ", strerror(errno)); return -1; } /*设置tremios的擦除字符功能为退格键*/ term.c_cc[VERASE] = ''; if (tcsetattr(STDIN_FILENO, TCSANOW, &term) == -1) { printf("tcsetattr() failed! error message:%s ", strerror(errno)); return -1; } return 0; } //获取用户SQL语句,判断用户操作,不区分大小写 void read_user_print(MYSQL *pmysql, MYSQL *connection) { if (connection == NULL || pmysql == NULL) { printf("read_user_print() params not correct! "); return; } /*等待用户控制台输入*/ //获取数据库名称 char buf_mysql[100] = { 0 }; strcpy(buf_mysql, "mysql1>"); int i = 0,j = 0; char temp_buf[1024] = { 0 }; while (1) { /*显示mysql1>*/ write(STDOUT_FILENO, buf_mysql, sizeof(buf_mysql)); /*等待用户输入*/ char buf_read[1024] = { 0 }; read(STDIN_FILENO, buf_read, sizeof(buf_read)); /*执行用户SQL*/ /*判断用户输入的是查询操作,还是更新操作, * 更新操作有 update,delete,use,set,insert * 注意不区分大小写匹配 * 将用户所有输入都转化为大写,遇到空格结束 * */ memset(temp_buf,0,sizeof(temp_buf)); strcpy(temp_buf, buf_read); for (i=0; i < strlen(temp_buf); i++) { //如果当前字符不是空格 if (temp_buf[i] != ' ') { if (temp_buf[i] > 96 && temp_buf[i] < 123) { /*小写转化成大写*/ temp_buf[i] = temp_buf[i] - 32; } } else { break; } } int flag = 0; if (strncmp(temp_buf, "UPDATE", 6) == 0) { flag = 1; } else if (strncmp(temp_buf, "DELETE", 6) == 0) { flag = 1; } else if (strncmp(temp_buf, "USE", 3) == 0) { flag = 1; } else if (strncmp(temp_buf, "SET", 3) == 0) { flag = 1; } else if (strncmp(temp_buf, "INSERT", 6) == 0) { flag = 1; } //执行mysql_query() if (mysql_query(connection, buf_read) != 0) { printf("SQL error:%s ", mysql_error(pmysql)); break; } if (flag) { printf("SQL 更新成功! "); } else { //执行查询语句 MYSQL_RES *result = mysql_store_result(connection); if (result == NULL) { printf("mysql_store_result() failed ! "); break; } MYSQL_ROW row; MYSQL_FIELD *field; /*展示列数据*/ int numx = 0; while (1) { field = mysql_fetch_field(result); if (field == NULL) break; printf("%s ", field->name); numx++; } printf(" "); while (1) { row = mysql_fetch_row(result); if (row == NULL) break; /*打印一行中每一列的数据*/ for (j=0; j < numx; j++) { printf("%s ", row[j]); } /*每行换行*/ printf(" "); } //释放查询结果集 mysql_free_result(result); } printf(" "); } }
//mysql客户端实现 #include "pub.h" int main(int arg, char *args[]) { //mysql -h 192.168.1.101 -u dbuser1 -p if (arg < 4) { printf("please print three params! "); return -1; } char hostname[100] = { 0 }; char username[100] = { 0 }; char passwd[100] = { 0 }; //char dbname[100] = { 0 }; if (strncmp(args[1], "-h", 2) == 0) { strcpy(hostname, args[1]); strcpy(username, args[4]); } else if (strncmp(args[1], "-u", 2) == 0) { strcpy(hostname, "localhost"); strcpy(username, args[2]); } else { printf("error print!"); return -1; } //获取密码 strcpy(passwd, getpass("Enter password: ")); //设置退格键不回显 if (set_Backkey() < 0) { printf("设置退格键不回显失败! "); } //创建mysql connection MYSQL mysql, *connection=NULL; //init mysql mysql_init(&mysql); //connect mysql server connection = mysql_real_connect(&mysql, hostname, username, passwd, "", 0, 0, 0); if (connection == NULL) { printf("mysql_real_connect() failed ! error message:%s ", mysql_error(&mysql)); return -1; } /*用户输入*/ read_user_print(&mysql,connection); //close sql server mysql_close(connection); return 0; }
.SUFFIXES:.c .o CC=gcc SRCS=tec01.c pub.c OBJS=$(SRCS:.c=.o) EXEC=runsql start:$(OBJS) $(CC) -o $(EXEC) $(OBJS) -lmysqlclient @echo "-------OK----------" .c.o: $(CC) -Wall -g -o $@ -c $< clean: rm -f $(OBJS) rm -f $(EXEC)