MySQL数据库技术(33)[MySQL防范]
本文“MySQL数据库技术(33)[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
? 6.5 客户机程序4—在运行时获得衔接参数
? ? 目前我们有了简单改正的避免呈现错误的衔接代码,我们要理解一些若何做某些比利用NULL 衔接参数更机灵的事情,如在运行时答应用户指定一些值.客户机程序3由于固定衔接参数方面的缺陷,要想更改那些值中的任何一个,都必须编辑源文件并重新编译.这非常不便利,分外是想使程序用于其他人时.在运行时指定衔接参数的一个通用的办法是利用号令行选项.MySQL 分发包中的程序承受两种情势的衔接参数,如表6 - 1所示.
? ? 与尺度的MySQL 客户机程序一致,客户机程序将承受一样的格局.这很简单,那是因为客户机库包含了实现选项解析的函数.
? ? 除此之外,客户机程序具有从选项文件中抽失信息的本领.这答应将衔接参数放在-/. m y. c n f(也就是主目录中的. m y.cnf 文件)中,以便不用在号令行中指定它们.客户机库使查抄MySQL 选项文件和从它们中抽取任何相关的值变得非常简单.只在程序中增添几行代码,便可以使选项文件辨认它,并且通过编写自己的代码而没必要重新改革这个框架来举行操作.附录E "MySQL 程序参考"中阐明了选项文件的语法.
? ? 6.5.1 拜候选项文件内容
? ? 利用load_default() 函数为衔接参数值读取选项文件, load_default() 探求选项文件、解析任何感爱好的可选组的内容,以及重新编写程序的参数向量( a rgv[] 数组),以便把来自于那些组的信息以号令行选项的情势安排在argv[] 的开首.这就是说,在号令行指定呈现的选项.因此,当解析号令选项时,就得到了作为通例选项解析循环部份的衔接参数.选项加到argv[] 的开首而不是加到末尾,所以,假如衔接参数真的在号令行指定,它们要比load_defaults() 增添的任何选项晚一些呈现(因而忽视).面的小程序show _ argv 显示了若何利用load _ defaults ( ),并举例阐明了对参数向量若何做出这样的改正:
? ? 该处理选项文件的代码包含:
? ? ■ groups[] 是一个字符串数组,表示所感爱好的选项文件组.关于客户机程序,始终至少指定"client" ([client] 组).数组的最后一个元素必须是NULL.
? ? ■ my_init() 是load_defaults() 所需的履行一些设置操作的初始化例程.
? ? ■ load_defaults() 有四个参数:选项文件的前缀(这里应当始终是" m y"),列出感爱好的可选组的数组、程序参数的数目和向量的地址.不传数目和向量的值,而是传地址,因为load_defaults() 需求改变它们的值.分外注意的是,固然a rgv 是一个指针,但还是要传& argv ,它是指针的地址.
? ? show _ argv打印参数两次,第一次是在号令行指定它们的时刻,第二次是在load _ defaults( )改正它们的时刻.为了查看load_defaults() 的运行效果,应确信在主目录中有一个具有[client] 组指定设置的. my.cnf 文件.假定. my.cnf 文件以下:
? ? 有大概会从不在号令行或~ /.my.cnf 文件中的s h o w _ a rgv 所产生的输出后果中看到一些选项.假如是这样,它们大概是在系统范围的选项文件中指定的.在主目录中读取. m y.cnf 之前,load_defaults() 实际上是在MySQL 数据目录中探求/ e t c / m y.cnf 和m y.cnf 文件(在Windows中, load_defaults() 在Windows 系统目录中探求文件C : my. c n f、C : \ m y s q l \ d a t a \ m y.cnf 和m y.ini ).
? ? 利用load_defaults() 的客户机程序几近始终是在选项组列表中指定" c l i e n t"(以便从选项文件中获得任何通用的客户机设置),但是也可认为恳求自己的程序恳求特定值.可将下列代码:
? ? 改正成:
? ? 然后将[ show _ argv] 组加到~ / . my.cnf 文件中:
? ? 有了这些改变,再次调用show _ argv 就得到了一个差别的后果,以下所示:
? ? 参数数组中选项值呈现的次序取决于它们在选项文件中列出的次序,而不是选项组在group[] 数组中列出的次序.这意味着将大概在选项文件的[client] 组之后指定程序专有的组.即假如在两个组中都指定了一个选项,程序专有的值将有更高的优先权.在这个例子中可以看到: 在组[client] 和[ show _ argv] 中都指定了host 选项,但是因为组[ show _ argv] 在选项文件的最后呈现,所以host 值将在参数向量中呈现并获得优先权.
? ? load_defaults() 不是从环境设置中提取值, 假如想利用环境变量的值, 比方MYSQL _ TCP _ PORT 大概MYSQL _ Unix _ PORT ,就必须利用getenv() 来自己管理.我不想把这个管理本领增添到客户机中,但这里有一个例子,介绍了若何查抄几个尺度的与M y S Q L
有关的环境变量值:
? ? 在尺度MySQL 客户机中,环境变量值的优先权比在选项文件或号令行指定值的优先权要低.假如查抄环境变量的值,并要与约定保持一致,那么就要在调用load_default() 大概处理号令行选项之前(不是之后)查抄环境.
? ? 6.5.2 解析号令行参数
? ? 目前我们可以把全部的衔接参数都放入参数向量,但需求一个解析该向量的办法.getopt_long() 函数就是为此目的计划的.getopt_long() 设在MySQL 客户机库的内部,因此,无论什么时刻与库衔接都可以拜候它.源文件中要包含getopt.h 头文件,可以把这个头文件从MySQL 源分发包的include 目录拷贝到正在开辟的客户机程序所在的目录中.
? ? load_defaults() 与安全
? ? 因为有些程序(如p s)可以显示任何历程的参数列表, load_defaults() 将口令的文本放在参数列表中,所以您大概对它处理窥测的含义表示惊奇.这没有问题,因为ps 显示原始的a rgv[] 内容,由load_defaults() 成立的任何口令参数都指向为它自己分配的区域,这个区域并非原始区域的一部份,所以ps 看不见它.另一方面,除非成心排除,不然在号令行指定的口令会在ps 中呈现.6 . 5 . 2节"解析号令行参数"介绍了若何去做.下面的程序show_param 利用load_defaults() 读取选项文件,然后调用getopt_long() 来分
析参数向量.show_param 举例阐明了通过履行以下操作参数处理的每个阶段发生了什么:
? ? 1) 成立主机名称、用户名称和口令的缺省值.
? ? 2) 打印原始衔接参数和参数向量值.
? ? 3) 调用load_defaults() 重新编写参数向量,反映选项文件内容,然后打印后果向量.
? ? 4) 调用getopt_long() 处理参数向量,然后打印后果参数值和参数向量中的剩余部份.
? ? show_param 答应利用各种指定的衔接参数的办法举行试验(无论是在选项文件中还是在号令行中),并通过显示利用什么值举行衔接来查看后果.当实际上我们把参数处理代码与衔接函数do_connect() 连到一同时,show_param 关于预知下一个客户机程序将要发生什么是很有效的.
? ? 以下是show_param.c 的代码:
? ? 为了处理参数向量, show _ argv() 利用getopt_long() ,它在循环中调用:
? ? getopt_long() 的前两个参数是程序的计数参数和向量参数,第三个参数列出了要辨认的选项字符.这些是程序选项的短名称情势.选项字符后可以有冒号、双冒号大概无冒号,表示选项值必须跟在选项背面、可以跟在选项背面大概不能跟在选项背面.第四个参数long_options 是一个指向可选构造数组的指针,每个可选构造为程序需求支持的选项指定信息.它的目标与第三个参数的可选字符串相近似.每个long_options[] 构造有四个元素,其描写以下:
? ? ■ 选项的长名称.
? ? ■ 选项值.这个值可以是required _ argument、optional _ argument 大概no _ argument,表明选项值是必须跟在选项背面、可以跟在选项背面,还是不能跟在选项背面(它们与第三个参数选项字符串中的冒号、双冒号或无冒号的作用相同).
? ? ■ 标志参数.可用它存储变量指针.假如找到这个选项, getopt_long() 则把第四个参数指定的值存储到变量中去.假如标志是NULL,getopt_long() 就把optarg 变量指向下一个选项的任何值,并返回选项的短名称.long_options[] 数组为全部的选项指定了NULL.那就是说,假如碰到getopt _ long( ),就返回每个参数,以便我们可以在switch语句中来处理它.
? ? ■ 选项的短(单个字符)名称.在long_options[] 数组中指定的短名称必须与作为第三个参数传送给getopt_long() 的选项字符串所利用的字母相匹配,不然程序将不能精确处理号令行参数.long_options[] 数组必须由一个全部元素都设为0 的构造所终止.getopt_long() 的第五个参数是一个指向int 变量的指针.getopt_long() 把与最后碰到的选项相符合的long_options[] 构造索引存储到变量中( show_param 不用这个值做任何事情).
? ? 请注意,口令选项(指定为--password 大概-p )可以得到一个选项值,那就是说,假如利用长选项情势可指定为--password 大概--password = your_pass,假如利用短选项情势则指定为-p 大概- p your _ pass.可选字符串中" p" 背面的双冒号和long_options[] 数组中的optional _ argument 表示了口令值的可选特点.分外是, MySQL 客户机答应在号令行省略口令值,然后提醒输入.这样避免了在号令行给出口令,它避免其他人通过盗窃看到口令.在写下一个客户机程序(客户机程序4)时,将把口令查抄性能增添进去.下面是show_param 的调用示例和后果输出(假定~ /.my.cnf 一向与show _ argv 示例有相同的内容):
? ? 输出后果阐明从号令行得到主机名(忽视选项文件中的这个值),从选项文件中得到用户名和口令.getopt_long() 精确解析了选项是在短选项情势( -h host_name )中指定还是在长选项情势( --user = paul ,--password = secret )中指定.
? ? 目前让我们去掉纯粹阐明选项处理例程是若何工作的这一部份,把剩余部份作为按照选项文件或号令行供应的任何选项而衔接到服务器的客户机的底子.源文件client4.c 的代码以下:
? ? 与前面开辟的客户机程序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 和键入的口令都传送到服务器:
? ? 客户机程序4也把数据库名some_db 传送给do _ connect( ),成为当前数据库.假如没有选项文件,则处理它的内容并用来改变参数衔接.
? ? 早期,我们曾热衷于封装代码,成立包装函数,目的是断开与服务器的衔接和从服务器的衔接断开.询问能否把解析选项部份安排到包装函数中也是公道的.我想这是大概的,但并不想去做.选项解析代码与衔接代码在程序间并不一致:程序常常支持除了尺度选项之外
的其他选项,差别的程序极大概支持其他选项的差别设置.这就使选项处理循环尺度化的函数很难编写.并且,与衔接的成立差别,在它的履行历程中程序可以但愿举行多次(因而是好的封装候选者),而选项解析只在程序开始时履行一次.
? ? 迄今为止,我们所做的工作完成了每个MySQL 客户机程序所必须做的事情:用得当的参数与服务器相衔接.当然应当知道若何衔接,目前知道怎么做了,并且处理的细节由客户机程序框架( client4.c )来实现,因此就没必要再去考虑了.这就是说可以集合精神干真正感爱好的事情—拜候数据库的内容.利用程序中全部的真正功效将在do_connect() 调用和do_disconnect() 调用之间发生,但是我们目前所拥有的是用于成立可为很多差别客户机程序利用的基本框架.编写一个新程序,要做到以下几点:
? ? 1) 制作一个client4.c 的备份.
? ? 2) 假如承受其他选项而不是client4.c 支持的尺度选项,那么改正处理选项循环.
? ? 3) 在衔接和断开调用之间加上自己的利用程序代码.
? ? 这样就算完成了.
? ? 构造客户机程序框架的目的是,很简单地成立和断开衔接,以便集合精神干真正想做的事情.
以上是“MySQL数据库技术(33)[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |