MySQL提供用C编程语言编写的客户机库,可以用它编写访问MySQL的客户机程序。这个库定义了应用程序编程接口,包括下面的实用程序:
■ 建立和终止与服务器会话的连接管理例程。
■ 构造查询的例程,将例程发送到服务器,并处理结果。
■ 当其他C API调用失败时,确定错误准确原因的状态和错误报告函数。
本章介绍如何用客户机库编写自己的程序。我们要记住的一些要点是,自己的程序与MySQL分发包中已有的客户机程序的一致性,代码的模块性和可重用性。本章假设您知道用C编程的一些知识,但并不一定是专家。本章从简单到复杂粗略地开发了一系列的客户机程序。这个过程是第一部分开发了一个程序框架,该框架除了与服务器连接和断开以外不能作任何事情。这样做的原因是,尽管MySQL客户机程序是为不同的目的而编写的,但它们都有一个共同点:即创建与服务器的连接。
我们将用以下步骤来建立这个程序框架:
1. 编写一些连接和断开的简要代码(客户机程序1)。
2. 增加一些错误检查(客户机程序2)。
3. 使连接代码模块化和可重用化(客户机程序3)。
4. 增加获取运行时连接参数的能力(主机,用户,口令)(客户机程序4)。
这个框架一般是合理的,可以使用它作为编写任意数量的客户机程序的基础。开发它以后,我们将暂不考虑如何处理各种问题。首先,我们将讨论如何处理特定的硬编码的SQL语句,然后再开发用于处理任意语句的代码。在这之后,将查询处理的代码增加到客户机程序框架中,开发另一个程序(客户机程序5),它类似于mysql客户机程序。我们也将考虑(并解决)一些通用的问题,如“如何获取有关表的结构信息?”和“如何在数据库中插入图像?”只有在需要时,本章才讨论客户机库的函数和数据类型。要想了解所有函数和类型的列表,请参阅附录F“C API 参考”。可以用这个附录作为使用客户机库任何部分的进一步的背景信息的参考。
样例程序可以由联机下载得到,可以直接使用,而不必再键入它们。有关的指导,请参阅附录A“获得和安装软件”。
在哪里寻找样例
MySQL邮件清单的一个共同问题就是“我在哪里可以找到一些用C 写的客户机样例?”。当然,这个答案是“就在本书里!”。但是,许多人好像并没有考虑的是MySQL分发包中包括了若干客户机程序(例如mysql、mysqladmin 和mysqldump),这些大部分都是用C编写的。因为这个分发包可以很容易地以源程序形式使用,所以MySQL提供非常少的样例客户机代码。因此,如果您还没有这样做,找个时间找到源程序分发包,在客户机目录中查看这些程序。MySQL客户机程序为共享软件,从那里可以为自己的程序自由地借用代码。
在本章提供的样例和MySQL分发包中包括的客户机程序之间,可以找到与自己编写程序时想做的事情相类似的代码。如果是这样,可以通过拷贝和修改已有的程序来重新使用代码。应该阅读本章,了解客户机库是如何工作的。然而,请记住,并不总是需要自己编写琐碎的每件事情(您将注意到,在本章编写程序的讨论中,代码的可重用性是目的之一)。通过使用其他人编好的程序,可以避免许多工作,那是最好的。
6.1建立客户机程序的一般过程
本节介绍使用MySQL客户机库编译和连接程序所包括的步骤。不同的系统建立客户机程序的命令也有所不同,可能需要稍微修改一下这里介绍的命令。然而,这里的说明是通用的,应该能够将它用于几乎您编写的任何客户机程序中。
6.1.1基本的系统需求
当您用C 编写MySQL客户程序时,显然将需要一个C 编译程序。这里说明的样例使用gclearcase/" target="_blank" >cc。除了自己的源文件以外,还将需要下列程序:
■ MySQL头文件。
■ MySQL客户机库。
MySQL头文件和客户机库组成客户机编程的支持程序。它们可能已经安装到您的系统上。如果没有,应获取它们。如果MySQL从源程序分发包或二进制分发包中安装,则客户机可编程的支持程序应该已经作为该处理的一部分安装了。如果MySQL是从RPM 文件中安装的,
则除非安装了开发程序R P M,否则就没有这种支持。如果需要安装MySQL头文件和库,请参阅附录A。
6.1.2 编译和连接客户机程序
要想编译和连接客户机程序,就必须指定MySQL头文件和客户机库的位置,因为它们通常不安装在编译程序和连接程序缺省搜索的位置。对于下面的样例,假定头文件和客户机库的位置为/usr/local/include/mysql和/ usr / local / lib / mysql。要想告知编译程序如何寻找MySQL头文件,则当将源文件编译为目标文件时,传送给它一个-I/usr/local/include/mysql参数。例如,可以使用这样的命令:
要想告知连接程序在哪,可以找到客户机库和它的名称,当连接目标文件产生一个可执行的二进制文件时,传送-L/usr/local/lib/mysql和-lmysqlclient 参数,如下所示:
如果客户机程序包括多个文件,则所有目标文件的名称都要列在连接命令上。如果连接步骤导致不能找到必需的floor() 函数的错误,则通过在命令行的后面增加- l m,连接到数学库:
可能还需要增加其他的库。例如,在Solaris 上可能需要-lsocket -lnsl。
如果没有使用make 建立程序,则建议您了解一下如何进行,以便不必手工地键入许多建立程序的命令。假设有一个客户机程序myclient,包括两个源文件main.c 和aux.c,及一个头文件myclient.h。一个简单的Makefile 建立这个程序的代码,如下所示:
如果是一个需要连接到数学库的系统,则更改LIBS 的值,并将-lm 加到最后:LIBS = -L/usr/local/lib/mysql-lmysqlclient -lm
如果需要其他的库,如-lsocket 和- l n s l,则也要将这些库加到LIBS 中。使用M a k e f i l e,无论何时修改何源文件,只简单地键入“ m a k e”就可以重新建立程序代码。那比键入一句长的gcc 命令更容易,发生错误更少。