实现一个简单的 mysql 工具

无论在 windows 下还是 linux 下,我们每次去连接 mysql 的时候都会运行一个叫做 mysql 的命令,本文就模仿制作一个类似的程序,实现可以在里面执行 DML 和 DQL 语句。具体代码的实现请参考程序。


代码实现

#include <stdio.h>
#include <mysql.h>
#include <string.h>
#include <ctype.h>

int main(int argc, char* argv[])
{
	unsigned int err;
	MYSQL* mysql;
	// 初始化 mysql 句柄
	mysql = mysql_init(NULL);
	if (mysql == NULL)
	{
		err = mysql_errno(mysql);
		printf("mysql_init error, code = %d\n", err);
		return err;
	}
	
	// 连接服务器
	mysql = mysql_real_connect(mysql, "127.0.0.1", "root", "******", "mydb61", 0, NULL, 0);
	if (NULL == mysql)
	{
		err = mysql_errno(mysql);
		printf("mysql_real_connect error, code = %d\n", err);
		return err;
	}
	
	char sql[1024];
	while (1)
	{
		printf("mysql> ");
		fgets(sql, sizeof(sql), stdin);
		sql[strlen(sql) - 1] = '\0';
		
		// 判断是否是输入了退出指令
		if (strcmp(sql, "EXIT") == 0 || strcmp(sql, "QUIT") == 0 ||
			strcmp(sql, "exit") == 0 || strcmp(sql, "quit") == 0)
		{
			break;
		}
		// 判断是否是执行了 select 或 show 或 desc 开头的命令
		if (strncmp(sql, "SELECT", 6) == 0 || strncmp(sql, "select", 6) == 0 ||
			strncmp(sql, "SHOW", 4) == 0 || strncmp(sql, "show", 4) == 0 ||
			strncmp(sql, "DESC", 4) == 0 || strncmp(sql, "desc", 4) == 0)
		{
			// 执行 sql 语句,如果要查询包含二进制数据的,要用 mysql_real_query
			err = mysql_query(mysql, sql);
			if (err != 0)
			{
				err = mysql_errno(mysql);
				printf("mysql_query error, code = %d\n", err);
				return err;
			}
			
			// 获取查询出来的数据有多少个列
			unsigned int num, i = 0;
			num = mysql_field_count(mysql);
			
			// 获取结果集
			MYSQL_RES* result;
			result = mysql_store_result(mysql);
			if (NULL == result)
			{
				err = mysql_errno(mysql);
				printf("mysql_query error, code = %d\n", err);
				return err;
			}
			
			/*
			与 mysql_field_count() 功能一致,但 mysql_field_count() 是返回上一次执行语句(query)结果列的数目
			而 mysql_num_fields() 是从结果集中获取返回列数
			*/

			// 获取表头内容
			MYSQL_FIELD *fields;
			fields = mysql_fetch_fields(result);
			for(i = 0; i < num; i++)
			{
			   printf("%8s\t", fields[i].name);
			}
			putchar(10);
			
			// 读取结果集
			MYSQL_ROW row;
			while ((row = mysql_fetch_row(result)))
			{
				for (i = 0; i < num; i++)
				{
					printf("%8s\t", row[i]);
				}
				putchar(10);
			}
			// 释放结果集
			mysql_free_result(result);
		}
		else
		{
			// 执行 DQL 语句
			err = mysql_query(mysql, sql);
			if (err != 0)
			{
				err = mysql_errno(mysql);
				printf("mysql_query error, code = %d\n", err);
				return err;
			}
			my_ulonglong row = mysql_affected_rows(mysql);
			printf("Query OK, %d row affected", row);
		}
		putchar(10);
	}
	// 关闭 mysql 句柄
	mysql_close(mysql);
	return 0;
}

编译程序

编译指令:gcc mysql_tool.c -o mysql_tool -I /usr/include/mysql -L /usr/lib64/mysql -l mysqlclient -l stdc++ -l pthread -l dl -l rt

执行效果

2015-07-27_220038

我们分别执行了两个 select 语句,可以正确的得到查询结果,并且执行了一个 update 语句,可以返回有多少行受影响了。这就是我们模仿的一个 mysql 客户端工具。

 

说说你的想法