#include

#include

#include

#include

#include

#include

#include

#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;

}

c语言如何编写mysql客户端_【C/C++学院】(23)Mysql数据库编程--C语言编程实现mysql客户端...相关推荐

  1. MySQL入门_实战3_创建和删除数据库

    MySQL入门_实战系列文章目录 MySQL入门_实战1 MYSQL安装和卸载 MySQL入门_实战2 MYSQL的登录和断开以及SQL查询常见问题 文章目录 MySQL入门_实战系列文章目录 前言 ...

  2. java要学mysql 吗_做JAVA开发需要把数据库学习到何种程度

    原标题:做JAVA开发需要把数据库学习到何种程度 做JAVA开发需要把数据库学习到何种程度?智递科技小编和大家一起探讨交流: 1.开发人员对DB的掌握,越深入,你能做的事情就越多. 2.完成业务功能, ...

  3. 数据库mysql工序_网易杭研总结:数据库高可用技术之道(4)

    数据库作为IT系统中最关键的服务之一,其可用性一直是系统设计中的重点考虑因素.同时,由于数据库有数据有状态的天性,数据库高可用有其天然的复杂性和难点,云原生架构下尤其如此,是一个值得深入探讨的课题.本 ...

  4. mysql语言的创建模式文件_南开17春学期《数据库应用系统设计》在线作业 免费答案...

    17秋18春学期<数据库应用系统设计>在线作业 一.单选题(共 21 道试题,共 42 分.) 1. 在PowerScript语言中,要访问myobject对象中的name属性,正确的写法 ...

  5. postgresql 客户端_一款功能强大的数据库客户端:DataGrip

    前言 在我们日常的程序开发中,很大一部分时间是在与数据库打交道. 查数据,导数据,检查SQL执行计划,优化SQL等,是我们数据库开发工作的重要组成部分,而且很多时候我们会使用到多款数据库,如Oracl ...

  6. golang mysql封装_自己封装的golang 操作数据库方法

    这个是我用Go写的第一个东东,可能还存在些BUG没有测试到.这里主要是提供一个参考.各位可以改写成自己的风格. 在命令行下输入如下两条命令,进行安装 go get github.com/male110 ...

  7. c语言改变cmd 字体大小_嵌入式开发中常见3个的C语言技巧

    原文:https://www.cnblogs.com/CrazyCatJack/p/6080266.html 1.指向函数的指针 指针不光能指向变量.字符串.数组,还能够指向函数.在C语言中允许将函数 ...

  8. 64位oracle客户端_开发小记-golang连接Oracle数据库配置

    项目需求golang连接Orale数据库,使用mattn/go-oci8包,github地址 https://github.com/mattn/go-oci8 过程 Oracle Client和SDK ...

  9. jframe和mysql登陆_刚写的一个从数据库读取账户和密码进行登陆的小程序~高手请无~...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; impo ...

  10. springboot mysql事物_在Spring Boot中使用数据库事务

    关于数据库访问还有一个核心操作那就是事务的处理了,前面两篇博客小伙伴们已经见识到Spring Boot带给我们的巨大便利了,其实不用猜,我们也知道Spring Boot在数据库事务处理问题上也给我们带 ...

最新文章

  1. 灰度图像--图像分割 Scharr算子
  2. ubuntu下使用串口调试终端minicom链接typec接口
  3. ReDim Preserve 的用途
  4. C#的加密解密算法,包括Silverlight的MD5算法
  5. python自动化从零开始_从零开始的自动化测试框架——Python篇
  6. USACO 1.1 Your Ride Is Here
  7. 使用Java API的5个技巧
  8. BZOJ 2460: [BeiJing2011]元素 线性基
  9. 学习微机原理与接口这一篇就够了
  10. SQL注入之注入检测总结
  11. ubuntu 20.04 不能鼠标双击打开 .desktop (桌面快捷方式图标)文件(双击变为使用文本编辑器打开)的解决办法
  12. AMiner会议论文推荐第三十二期
  13. 背包问题(动态规划 C/C++)
  14. CG-62 压电式雨量传感器 什么是压电式雨量传感器,压电雨量传感器和翻斗式雨量传感器优势对比
  15. 模板:旋转卡壳(计算几何)
  16. Java 文字转拼音工具类
  17. Linux 配置关掉虚拟防火墙
  18. Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程
  19. Fantasy of a Summation(找规律,水)
  20. iOS开发技巧--iOS app 上架(2016年10月底)以及版本迭代上架

热门文章

  1. spring 整合quartz
  2. (JAVA)格式化输出日期
  3. oracle使用 union all 用自增序列_值得收藏的Oracle数据库性能优化
  4. 高一计算机网络技术应用计划,高一计算机网络应用基础教学计划
  5. 【软件开发底层知识修炼】二十三 ABI-应用程序二进制接口三之深入理解函数栈帧的形成与摧毁
  6. 【C++深度剖析教程11】C++学习之编写代码实现复数类
  7. Cocos2dx 3.11版本 视频添加跳过按钮
  8. 贝叶斯原理及其推断简介
  9. struts2 Eclipse 中集成strust2开发框架实例
  10. python的collection系列-默认字典(defaultdict)