My SQL数据库实用技术(33)
织梦内容管理系统
输出结果说明从命令行得到主机名(忽略选项文件中的这个值),从选项文件中得到用户名和口令。getopt_long() 正确分析了选项是在短选项形式( -h host_name )中指定还是在长选项形式( --user = paul ,--password = secret )中指定。
现在让我们去掉纯粹说明选项处理例程是如何工作的这一部分,把剩余部分作为根据选项文件或命令行提供的任何选项而连接到服务器的客户机的基础。源文件client4.c 的代码如下:
织梦内容管理系统
织梦内容管理系统
dedecms.com
内容来自dedecms
本文来自织梦
copyright dedecms
内容来自dedecms
dedecms.com
织梦内容管理系统
与前面开发的客户机程序1、客户机程序2和客户机程序3比较一下,客户机程序4具有一些以前没有的内容:
■ 答应在命令行指定数据库名称,它紧跟在由getopt_long() 分析的选项的后面。这与MySQL 分发包中标准客户机的行为是一致的。
■ 对口令值做了备份之后,删除参数向量中的任何口令值。这使时间窗口最小化,在时间窗口中命令行所指定的口令对于ps 或其他系统状态程序是可见的(窗口缩到最小,但并没有删除。命令行指定的口令仍然不太安全)。
■ 假如给出没有值的口令选项,则客户机程序提示用户用get_tty_password() 输入口令。在客户机库中,这是一个实用程序,它提示输入口令而不在显示器上回应(客户机库布满了这样吸引人的东西。因为找到了相关的例程和使用它们的方法,所以有助于从MySQL 客户机程序的源文件中的读取)。您可能会问:“为什么不只调用getpass( )呢?”回答是,并不是所有的系统都有这个函数,如Windows。get_tty_password() 可以在系统间移植,因为它被配置为适应各种不同系统。
客户机程序4按照指定的选项来响应。假设没有使事件复杂化的选项文件。假如无参数调用客户机程序4,则连接到localhost,并把UNIX 注册名和无口令传递到服务器中。相反,假如像介绍的那样调用客户机程序4,则提示输入口令(没有直接以-p 开头的口令值),连接到some _ host,并将用户名some_user 和键入的口令都传递到服务器: 内容来自dedecms
copyright dedecms
客户机程序4也把数据库名some_db 传递给do _ connect( ),成为当前数据库。假如没有选项文件,则处理它的内容并用来改变参数连接。
早期,我们曾热衷于封装代码,创建包装函数,目的是断开与服务器的连接和从服务器的连接断开。询问是否把分析选项部分放置到包装函数中也是合理的。我想这是可能的,但并不想去做。选项分析代码与连接代码在程序间并不一致:程序经常支持除了标准选项之外
的其他选项,不同的程序很可能支持其他选项的不同设置。这就使选项处理循环标准化的函数很难编写。而且,与连接的建立不同,在它的执行过程中程序可以希望进行多次(因而是好的封装候选者),而选项分析只在程序开始时执行一次。
文章评论
共有位Admini5网友发表了评论 查看完整内容