#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. python出租车计费标准_用Python绘制出租车出发点的动态热力图
  2. java程序中怎么保证多线程的运行安全_Java线程安全问答(草稿)
  3. 毫秒值转换为日期工具_为机器学习准备数据
  4. Windows手动更新补丁
  5. 什么是空间分配担保策略?
  6. ML.NET 1.0 发布,单击右键即可添加机器学习模型
  7. 下一代面向知识的 BI 到底有何不同,从 nextionBI 数据解读能力中一探究竟
  8. Ubuntu的默认root密码是多少,修改root密码
  9. js常用方法之Array对象方法扩展
  10. 在VS2010进行MFC编程设置字符集的问题(使用多字节字符集引起错误)
  11. 数据库 | PostgreSQL从入门到精通
  12. ISO9001质量管理体系申请条件以及认证流程
  13. 六种复杂控制系统简述:串级、分程、比值、前馈、选择性和三冲量控制
  14. 【maya】模型学习
  15. 如何写一篇数据分析报告3 - 分析背景是什么
  16. 新计算机的word无法输入文字,word打字后面的字消失怎么办
  17. 爬虫 (6)- Scrapy 实战案例 - 爬取不锈钢的相关钢卷信息
  18. Interview QA-COBOL COBOL II
  19. 如何在网页中嵌入播放器
  20. 外卖cps 赚钱小程序源码

热门文章

  1. 计算机基础知识总结论文,大学计算机基础总结论文
  2. iis5.0+php5.0+mysql5.0配置完全手册_IIS5.0+PHP5.0+MySQL5.0配置完全手册
  3. 【C++深度剖析教程16】智能指针的分析
  4. hive工作中分享总结
  5. Hive分析窗口函数(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP
  6. pycharm常用设置(keymap设置及eclipse常用快捷键总结)
  7. SpringBoot使用Jsp
  8. 发现了拯救“文献多的一团麻”的工具
  9. [NOIP2010提高组]关押罪犯
  10. C#学习笔记-数据的传递(公共变量)以及Dictionary