標籤:
【送給在路上的程式猿】
對於一個開發人員而言,能夠勝任系統中隨意一個模組的開發是其核心價值的體現。
對於一個架構師而言,掌握各種語言的優勢並能夠利運用到系統中,由此簡化系統的開發,是其架構生涯的第一步。
對於一個Team Dev而言。能夠在短期內開發出使用者愜意的軟體系統是其核心競爭力的體現。
每個程式猿都不能固步自封,要多接觸新的行業,新的技術領域,突破自我。
makefile
.SUFFIXES: .c .oCC=gccSRCS=mysql1.c mydb.cOBJS=$(SRCS:.c=.o)EXEC=mysql1all: $(OBJS) $(CC) -o $(EXEC) $(OBJS) -lmysqlclient @echo ‘-------------ok--------------‘.c.o: $(CC) -Wall -g -o [email protected] -c $< clean: rm -f $(OBJS) rm -f core*
mydb.h
#ifndef MYDB_H_#define MYDB_H_void init_db();int conn_db(const char *hostname, const char *username, const char *password, const char *dbname);void disconn_db();int open_db(const char *SQL);int exec_db(const char *SQL);#endif /* MYDB_H_ */
mydb.c
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <mysql/mysql.h>#include "mydb.h"MYSQL *connection = NULL;MYSQL mysql;void init_db(){ mysql_init(&mysql);//初始化mysql}int conn_db(const char *hostname, const char *username, const char *password, const char *dbname){ if (connection) mysql_close(connection); connection = mysql_real_connect(&mysql, hostname, username, password, dbname, 0, 0, 0);//串連到mysql if (connection == NULL) { printf("%s\n", mysql_error(&mysql)); return -1;//串連失敗,返回-1 } printf("success connect to mysql\n"); return 0;}void disconn_db()//斷開資料庫連接{ if (connection) { mysql_close(connection); connection = NULL; }}int open_db(const char *SQL)//運行有返回資料集的SQL語句{ int state = mysql_query(connection, SQL);//運行SQL語句 if (state != 0) { printf("%s\n", mysql_error(connection)); return -1;//運行失敗,返回-1 } MYSQL_RES *result = mysql_store_result(connection);//得到查詢結果 if (result == (MYSQL_RES *) NULL) { printf("%s\n", mysql_error(connection)); return -1;//運行失敗。返回-1 } else { MYSQL_FIELD *sqlField; int iFieldCount = 0; while (1)//迴圈遍曆全部欄位 { sqlField = mysql_fetch_field(result); if (sqlField == NULL) break; printf("%s\t", sqlField->name);//向螢幕列印欄位名 iFieldCount++; } printf("\n");//每一行結尾列印一個\n字元 MYSQL_ROW sqlRow; while (1)//迴圈到每一行 { sqlRow = mysql_fetch_row(result); if (sqlRow == NULL) break; int i; for (i = 0; i < iFieldCount; i++)//迴圈得到每一行中的每個欄位 { if (sqlRow[i] == NULL) printf("NULL\t");//假設值為NULL。螢幕列印為"NULL" else printf("%s\t", (const char *)sqlRow[i]);//螢幕列印為欄位內容 } printf("\n");//每一行結尾列印一個\n字元 } printf("query is ok, %u rows affected\n", (unsigned int)mysql_affected_rows(connection)); mysql_free_result(result); } return 0;}int exec_db(const char *SQL)//運行沒有返回資料集的SQL語句{ int state = mysql_query(connection, SQL);//運行SQL語句 if (state != 0) { printf("%s\n", mysql_error(connection)); return -1; } printf("query is ok, %u rows affected\n", (unsigned int)mysql_affected_rows(connection)); return 0;}
mysql1.c
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <errno.h>#include <termios.h>#include "mydb.h"void sqldb(const char *src)//參數src為要啟動並執行SQL語句{ if ((strncmp(src, "select", 6) == 0) || (strncmp(src, "SELECT", 6) == 0) || (strncmp(src, "show", 4) == 0) || (strncmp(src, "SHOW", 4) == 0) || (strncmp(src, "desc", 4) == 0) || (strncmp(src, "DESC", 4) == 0)) { open_db(src);//假設src為有返回資料集SQL語句,那麼調用open_db函數 } else { exec_db(src);//假設src為沒有有返回資料集SQL語句。那麼調用exec_db函數 }}void work(const char *userid, const char *password){ init_db(); if (conn_db("localhost", userid, password, "test") != 0)//串連到資料庫 { return;//串連資料庫失敗。函數退出 } char buf[2048]; while (1)//迴圈從鍵盤讀取 { write(STDOUT_FILENO, "mysql1>", strlen("mysql1>"));//螢幕輸出命令提示字元mysql1> memset(buf, 0, sizeof(buf)); read(STDIN_FILENO, buf, sizeof(buf));//等待使用者從鍵盤輸入 if (strncmp(buf, "quit", 4) == 0) break;//使用者輸入quit,迴圈break; sqldb(buf); } disconn_db();//斷開資料庫連接}struct termios oldterm;void setstty()//設定輸入退格鍵,不回顯{ //system("stty erase ^H");//運行shell命令,也能夠 用來設定讀取使用者鍵盤輸入的時候。退格鍵不回顯 struct termios term; if(tcgetattr(STDIN_FILENO, &term) == -1)//得到系統termion的設定 { printf("tcgetattr error is %s\n", strerror(errno)); return; } oldterm = term;//保留當前termios設定,以便程式退出的時候能夠恢複termios /* term.c_lflag &= ~ICANON;//取消ICANON選項(不規範輸入) term.c_lflag |= ICANON;//設定ICANON選項(規範輸入) term.c_cc欄位為要設定的詳細特殊輸入字元,如c_cc[VERASE]代表退格鍵, term.c_cc[VERASE] = ‘\b‘;意思為把退格鍵改動為‘\b‘ VERASE代表向前擦出一個字元,VINTR代表發送ctrl + C中斷訊號,ctrl + c的ASCII碼為3 比如:term.c_cc[VINTR] = ‘\t‘;意思為將tab鍵設定為終端訊號 tcsetattr中,第二個參數說明,TCSAFLUSH:發送了全部輸出後更改才生效。在更改發生時,未讀取的全部輸入資料都被刪除 TCSANOW:更改馬上生效 TCSADRAIN:發送了全部輸出後更改才發生。假設更改輸出參數則應該使用該選項 */ term.c_cc[VERASE] = ‘\b‘;//‘\b‘為退格鍵的ASCII碼 if (tcsetattr(STDIN_FILENO, TCSANOW, &term) == -1)//設定系統termion { printf("tcsetattr error is %s\n", strerror(errno)); } return;}void returnstty()//恢複系統的termios設定{ if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &oldterm) == -1)//設定系統termion { printf("tcsetattr error is %s\n", strerror(errno)); } return;}int main(int arg, char *args[]){ if (arg < 4)//假設沒有參數,main函數退出 { return EXIT_FAILURE; } if (strncmp(args[1], "-u", 2) != 0)//假設第二個參數不是-u。main函數退出 { return EXIT_FAILURE; } if (strncmp(args[3], "-p", 2) != 0)//假設第四個參數不是-p,main函數退出 { return EXIT_FAILURE; } const char *passwd = getpass("please input password:");//輸入密碼,螢幕不回顯 setstty();//設定輸入退格鍵,不回顯 work(args[2], passwd); returnstty();//恢複系統的termios設定 return EXIT_SUCCESS;}
|========== 吳英強CSDN部落格專欄==========|
|== C/C++學院 專欄文章的內容(不定期更新)===|
|== linux驅動開發 探索linux底層的奧秘 ========|
|== Java基礎學習篇 掌握java語言的基礎知識=====|
|====== 每天進步一點點,健康快樂每一天 ======|
【C/C++學院】(23)Mysql資料庫編程--C語言編程實現mysqlclient