仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 707|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL编程:MYSQL客户机程序4―在运转时猎取毗连参...

[复制链接]
精灵巫婆 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:23:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
只需每年花费2000到5000美元。无论你是自掏腰包来创建一个新兴公司,还是得到了风险投资商的赞助,使用MySQL都可以降低你所需要的人力成本。
6.5客户机程序4―在运转时猎取毗连参数
如今我们有了简单修正的避免呈现毛病的毗连代码,我们要懂得一些怎样做某些比利用NULL毗连参数更乖巧的事变,如在运转时同意用户指定一些值。客户机程序3因为流动毗连参数方面的缺点,要想变动那些值中的任何一个,都必需编纂源文件偏重新编译。这非常不便利,出格是想使程序用于其别人时。在运转时指定毗连参数的一个通用的办法是利用命令行选项。MySQL分发包中的程序承受两种情势的毗连参数,如表6-1所示。

与尺度的MySQL客户机程序分歧,客户机程序将承受一样的格局。这很简单,那是由于客户机库包含了完成选项剖析的函数。
除此以外,客户机程序具有从选项文件中抽失信息的才能。这同意将毗连参数放在-/.my.cnf(也就是主目次中的.my.cnf文件)中,以便不必在命令行中指定它们。客户机库使反省MySQL选项文件和从它们中抽取任何相干的值变得十分简单。只在程序中增添几行代码,就能够使选项文件辨认它,而且经由过程编写本人的代码而不用从头改革这个框架来举行操纵。附录E“MySQL程序参考”中申明了选项文件的语法。
6.5.1会见选项文件内容
利用load_default()函数为毗连参数值读取选项文件,load_default()寻觅选项文件、剖析任何感乐趣的可选组的内容,和从头编写程序的参数向量(argv[]数组),以便把来自于那些组的信息以命令行选项的情势安排在argv[]的开首。这就是说,在命令行指定呈现的选项。因而,当剖析命令选项时,就失掉了作为惯例选项剖析轮回部分的毗连参数。选项加到argv[]的开首而不是加到开端,以是,假如毗连参数真的在命令行指定,它们要比load_defaults()增添的任何选项晚一些呈现(因此疏忽)。面的小程序show_argv显现了怎样利用load_defaults(),并举例申明了对参数向量怎样做出如许的修正:

该处置选项文件的代码包含:
■groups[]是一个字符串数组,暗示所感乐趣的选项文件组。关于客户机程序,一直最少指定“client”([client]组)。数组的最初一个元素必需是NULL。
■my_init()是load_defaults()所需的实行一些设置操纵的初始化例程。
■load_defaults()有四个参数:选项文件的前缀(这里应当一直是“my”),列出感乐趣的可选组的数组、程序参数的数量和向量的地点。不传数量和向量的值,而是传地点,由于load_defaults()必要改动它们的值。出格注重的是,固然argv是一个指针,但仍是要传&argv,它是指针的地点。
show_argv打印参数两次,第一次是在命令行指定它们的时分,第二次是在load_defaults()修正它们的时分。为了检察load_defaults()的运转效果,应确信在主目次中有一个具有[client]组指定设置的.my.cnf文件。假定.my.cnf文件以下:

有大概会从不在命令行或~/.my.cnf文件中的show_argv所发生的输入了局中看到一些选项。假如是如许,它们也许是在体系局限的选项文件中指定的。在主目次中读取.my.cnf之前,load_defaults()实践上是在MySQL数据目次中寻觅/etc/my.cnf和my.cnf文件(在Windows中,load_defaults()在Windows体系目次中寻觅文件C:my.cnf、C:mysqldatamy.cnf和my.ini)。
利用load_defaults()的客户机程序几近一直是在选项组列表中指定“client”(以便从选项文件中猎取任何通用的客户机设置),可是也能够为哀求本人的程序哀求特定值。可将以下代码:

修正为:

然后将[show_argv]组加到~/.my.cnf文件中:

有了这些改动,再次挪用show_argv就失掉了一个分歧的了局,以下所示:

参数数组当选项值呈现的按次取决于它们在选项文件中列出的按次,而不是选项组在group[]数组中列出的按次。这意味着将大概在选项文件的[client]组以后指定程序专有的组。即假如在两个组中都指定了一个选项,程序专有的值将有更高的优先权。在这个例子中能够看到:在组[client]和[show_argv]中都指定了host选项,可是由于组[show_argv]在选项文件的最初呈现,以是host值将在参数向量中呈现并获得优先权。
load_defaults()不是从情况设置中提取值,假如想利用情况变量的值,比方MYSQL_TCP_PORT大概MYSQL_UNIX_PORT,就必需利用getenv()来本人办理。我不想把这个办理才能增添到客户机中,但这里有一个例子,先容了怎样反省几个尺度的与MySQL有关的情况变量值:

在尺度MySQL客户机中,情况变量值的优先权比在选项文件或命令行指定值的优先官僚低。假如反省情况变量的值,并要与商定坚持分歧,那末就要在挪用load_default()大概处置命令行选项之前(不是以后)反省情况。
6.5.2剖析命令行参数
如今我们能够把一切的毗连参数都放进参数向量,但必要一个剖析该向量的办法。getopt_long()函数就是为此目标计划的。getopt_long()设在MySQL客户机库的外部,因而,不管甚么时分与库毗连都能够会见它。源文件中要包括getopt.h头文件,能够把这个头文件从MySQL源分发包的include目次拷贝到正在开辟的客户机程序地点的目次中。
load_defaults()与平安
由于有些程序(如ps)能够显现任何历程的参数列表,load_defaults()将口令的文本放在参数列表中,以是您大概对它处置窥伺的含义暗示惊奇。这没有成绩,由于ps显现原始的argv[]内容,由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大概-pyour_pass。可选字符串中“p”前面的双冒号和long_options[]数组中的optional_argument暗示了口令值的可选特征。出格是,MySQL客户机同意在命令行省略口令值,然后提醒输出。如许制止了在命令行给出口令,它避免其别人经由过程偷盗看到口令。在写下一个客户机程序(客户机程序4)时,将把口令反省功能增加出来。上面是show_param的挪用示例和了局输入(假定~/.my.cnf一向与show_argv示例有不异的内容):

输入了局申明从命令行失掉主机名(疏忽选项文件中的这个值),从选项文件中失掉用户名和口令。getopt_long()准确剖析了选项是在短选项情势(-hhost_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中有如此众多的额外功能可选,诸如存储引擎等,你可以选择最适合你公司的一个,或者尝试选用多个引擎。MySQL开始非常小巧,但是可以随着公司的成长而不断地变强大。
小女巫 该用户已被删除
沙发
发表于 2015-1-19 10:08:05 | 只看该作者
对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。
柔情似水 该用户已被删除
板凳
发表于 2015-1-28 06:06:00 来自手机 | 只看该作者
数据库物理框架没有变动undo和redo都放在数据库得transaction中,个人感觉是个败笔。如果说我们在设计数据库的时候考虑分多个数据库,可能能在一定程度上避免I/O效率问题。
山那边是海 该用户已被删除
地板
发表于 2015-2-5 18:51:49 | 只看该作者
SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。
精灵巫婆 该用户已被删除
5#
 楼主| 发表于 2015-2-13 06:42:54 | 只看该作者
而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~
简单生活 该用户已被删除
6#
发表于 2015-3-3 18:21:59 | 只看该作者
SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。
灵魂腐蚀 该用户已被删除
7#
发表于 2015-3-11 12:42:18 | 只看该作者
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
变相怪杰 该用户已被删除
8#
发表于 2015-3-18 18:45:45 | 只看该作者
你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。
活着的死人 该用户已被删除
9#
发表于 2015-3-26 14:12:23 | 只看该作者
光写几个SQL实在叫无知。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-6 02:48

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表