时间:2021-07-01 10:21:17 帮助过:8人阅读
typedef struct st_mysql
{
NET net; /* Communication parameters */
unsigned char *connector_fd; /* ConnectorFd for SSL */
char *host,*user,*passwd,*unix_socket,*server_version,*host_info;
char *info, *db;
struct charset_info_st *charset;
MYSQL_FIELD *fields;
MEM_ROOT field_alloc;
my_ulonglong affected_rows;
my_ulonglong insert_id; /* id if insert on table with NEXTNR */
my_ulonglong extra_info; /* Not used */
unsigned long thread_id; /* Id for connection in server */
unsigned long packet_length;
unsigned int port;
unsigned long client_flag,server_capabilities;
unsigned int protocol_version;
unsigned int field_count;
unsigned int server_status;
unsigned int server_language;
unsigned int warning_count;
struct st_mysql_options options;
enum mysql_status status;
my_bool free_me; /* If free in mysql_close */
my_bool reconnect; /* set to 1 if automatic reconnect */
/* session-wide random string */
char scramble[SCRAMBLE_LENGTH+1];
/*
Set if this is the original connection, not a master or a slave we have
added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave()
*/
my_bool rpl_pivot;
/*
Pointers to the master, and the next slave connections, points to
itself if lone connection.
*/
struct st_mysql* master, *next_slave;
struct st_mysql* last_used_slave; /* needed for round-robin slave pick */
/* needed for send/read/store/use result to work correctly with replication */
struct st_mysql* last_used_con;
LIST *stmts; /* list of all statements */
const struct st_mysql_methods *methods;
void *thd;
/*
Points to boolean flag in MYSQL_RES or MYSQL_STMT. We set this flag
from mysql_stmt_close if close had to cancel result set of this object.
*/
my_bool *unbuffered_fetch_owner;
/* needed for embedded server - no net buffer to store the 'info' */
char *info_buffer;
void *extension;
} MYSQL;
2. MYSQL_RES
MYSQL_RES结构代表返回行的查询结果(SELECT、SHOW、DESCRIBE等),从数据库读取数据,最后就是从MYSQL_RES中读取数据。
MYSQL_RES定义如下:
typedef struct st_mysql_res {
my_ulonglong row_count;
MYSQL_FIELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;
unsigned long *lengths; /* column lengths of current row */
MYSQL *handle; /* for unbuffered reads */
const struct st_mysql_methods *methods;
MYSQL_ROW row; /* If unbuffered read */
MYSQL_ROW current_row; /* buffer to current row */
MEM_ROOT field_alloc;
unsigned int field_count, current_field;
my_bool eof; /* Used by mysql_fetch_row */
/* mysql_stmt_close() had to cancel this result */
my_bool unbuffered_fetch_cancelled;
void *extension;
} MYSQL_RES;
MySQL 有如下C语言API:
|
函数 |
描述 |
|
mysql_affected_rows() |
返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。 |
|
mysql_autocommit() |
切换 autocommit模式,ON/OFF |
|
mysql_change_user() |
更改打开连接上的用户和数据库。 |
|
mysql_charset_name() |
返回用于连接的默认字符集的名称。 |
|
mysql_close() |
关闭服务器连接。 |
|
mysql_commit() |
提交事务。 |
|
mysql_connect() |
连接到MySQL服务器。该函数已不再被重视,使用mysql_real_connect()取代。 |
|
mysql_create_db() |
创建数据库。该函数已不再被重视,使用SQL语句CREATE DATABASE取而代之。 |
|
mysql_data_seek() |
在查询结果集中查找属性行编号。 |
|
mysql_debug() |
用给定的字符串执行DBUG_PUSH。 |
|
mysql_drop_db() |
撤销数据库。该函数已不再被重视,使用SQL语句DROP DATABASE取而代之。 |
|
mysql_dump_debug_info() |
让服务器将调试信息写入日志。 |
|
mysql_eof() |
确定是否读取了结果集的最后一行。该函数已不再被重视,可以使用mysql_errno()或mysql_error()取而代之。 |
|
mysql_errno() |
返回上次调用的MySQL函数的错误编号。 |
|
mysql_error() |
返回上次调用的MySQL函数的错误消息。 |
|
mysql_escape_string() |
为了用在SQL语句中,对特殊字符进行转义处理。 |
|
mysql_fetch_field() |
返回下一个表字段的类型。 |
|
mysql_fetch_field_direct() |
给定字段编号,返回表字段的类型。 |
|
mysql_fetch_fields() |
返回所有字段结构的数组。 |
|
mysql_fetch_lengths() |
返回当前行中所有列的长度。 |
|
mysql_fetch_row() |
从结果集中获取下一行 |
|
mysql_field_seek() |
将列光标置于指定的列。 |
|
mysql_field_count() |
返回上次执行语句的结果列的数目。 |
|
mysql_field_tell() |
返回上次mysql_fetch_field()所使用字段光标的位置。 |
|
mysql_free_result() |
释放结果集使用的内存。 |
|
mysql_get_client_info() |
以字符串形式返回客户端版本信息。 |
|
mysql_get_client_version() |
以整数形式返回客户端版本信息。 |
|
mysql_get_host_info() |
返回描述连接的字符串。 |
|
mysql_get_server_version() |
以整数形式返回服务器的版本号。 |
|
mysql_get_proto_info() |
返回连接所使用的协议版本。 |
|
mysql_get_server_info() |
返回服务器的版本号。 |
|
mysql_info() |
返回关于最近所执行查询的信息。 |
|
mysql_init() |
获取或初始化MYSQL结构。 |
|
mysql_insert_id() |
返回上一个查询为AUTO_INCREMENT列生成的ID。 |
|
mysql_kill() |
杀死给定的线程。 |
|
mysql_library_end() |
最终确定MySQL C API库。 |
|
mysql_library_init() |
初始化MySQL C API库。 |
|
mysql_list_dbs() |
返回与简单正则表达式匹配的数据库名称。 |
|
mysql_list_fields() |
返回与简单正则表达式匹配的字段名称。 |
|
mysql_list_processes() |
返回当前服务器线程的列表。 |
|
mysql_list_tables() |
返回与简单正则表达式匹配的表名。 |
|
mysql_more_results() |
检查是否还存在其他结果。 |
|
mysql_next_result() |
在多语句执行过程中返回/初始化下一个结果。 |
|
mysql_num_fields() |
返回结果集中的列数。 |
|
mysql_num_rows() |
返回结果集中的行数。 |
|
mysql_options() |
为mysql_connect()设置连接选项。 |
|
mysql_ping() |
检查与服务器的连接是否工作,如有必要重新连接。 |
|
mysql_query() |
执行指定为“以Null终结的字符串”的SQL查询。 |
|
mysql_real_connect() |
连接到MySQL服务器。 |
|
mysql_real_escape_string() |
考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的特殊字符进行转义处理。 |
|
mysql_real_query() |
执行指定为计数字符串的SQL查询。 |
|
mysql_refresh() |
刷新或复位表和高速缓冲。 |
|
mysql_reload() |
通知服务器再次加载授权表。 |
|
mysql_rollback() |
回滚事务。 |
|
mysql_row_seek() |
使用从mysql_row_tell()返回的值,查找结果集中的行偏移。 |
|
mysql_row_tell() |
返回行光标位置。 |
|
mysql_select_db() |
选择数据库。 |
|
mysql_server_end() |
最终确定嵌入式服务器库。 |
|
mysql_server_init() |
初始化嵌入式服务器库。 |
|
mysql_set_server_option() |
为连接设置选项(如多语句)。 |
|
mysql_sqlstate() |
返回关于上一个错误的SQLSTATE错误代码。 |
|
mysql_shutdown() |
关闭数据库服务器。 |
|
mysql_stat() |
以字符串形式返回服务器状态。 |
|
mysql_store_result() |
检索完整的结果集至客户端。 |
|
mysql_thread_id() |
返回当前线程ID。 |
|
mysql_thread_safe() |
如果客户端已编译为线程安全的,返回1。 |
|
mysql_use_result() |
初始化逐行的结果集检索。 |
|
mysql_warning_count() |
返回上一个SQL语句的告警数。 |
与MySQL交互时,应用程序应使用该一般性原则:
1. 通过调用mysql_library_init(),初始化MySQL库。库可以是mysqlclient C客户端库,或mysqld嵌入式服务器库,具体情况取决于应用程序是否与“-libmysqlclient”或“-libmysqld”标志链接。
2. 通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到服务器。
3. 发出SQL语句并处理其结果。(在下面的讨论中,详细介绍了使用它的方法)。
4. 通过调用mysql_close(),关闭与MySQL服务器的连接。
5. 通过调用mysql_library_end(),结束MySQL库的使用。
调用mysql_library_init()和mysql_library_end()的目的在于,为MySQL库提供恰当的初始化和结束处理。对于与客户端库链接的应用程序,它们提供了改进的内存管理功能。如果不调用mysql_library_end(),内存块仍将保持分配状态(这不会增加应用程序使用的内存量,但某些内存泄漏检测器将抗议它)。对于与嵌入式服务器链接的应用程序,这些调用会启动并停止服务器。
mysql_library_init()和mysql_library_end()实际上是#define符号,这类符号使得它们等效于mysql_server_init()和mysql_server_end(),但其名称更清楚地指明,无论应用程序使用的是mysqlclient或mysqld库,启动或结束MySQL库时,应调用它们。对于早期的MySQL版本,可调用mysql_server_init()和mysql_server_end()取而代之。
如果愿意,可省略对mysql_library_init()的调用,这是因为,必要时,mysql_init()会自动调用它。
要想连接到服务器,可调用mysql_init()来初始化连接处理程序,然后用该处理程序(以及其他信息,如主机名、用户名和密码)调用mysql_real_connect()。建立连接后,在低于5.0.3版的API中,mysql_real_connect()会将再连接标志(MYSQL结构的一部分)设置为1,或在较新的版本中,将其设置为0。对于该标志,值“1”指明,如果因连接丢失而无法执行语句,放弃之前,会尝试再次连接到服务器。从MySQL 5.0.13开始,可以在mysql_options()上使用MYSQL_OPT_RECONNECT选项,以控制再连接行为。完成连接后,调用mysql_close()中止它。
当连接处于活动状态时,客户端或许会使用mysql_query()或mysql_real_query()向服务器发出SQL查询。两者的差别在于,mysql_query()预期的查询为指定的、由Null终结的字符串,而myql_real_query()预期的是计数字符串。如果字符串包含二进制数据(其中可能包含Null字节),就必须使用mysql_real_squery()。
对于每个非SELECT查询(例如INSERT、UPDATE、DELETE),通过调用mysql_affected_rows(),可发现有多少行已被改变(影响)。
对于SELECT查询,能够检索作为结果集的行。注意,某些语句因其返回行,类似与SELECT。包括SHOW、DESCRIBE和EXPLAIN。应按照对待SELECT语句的方式处理它们。
客户端处理结果集的方式有两种。一种方式是,通过调用mysql_store_result(),一次性地检索整个结果集。该函数能从服务器获得查询返回的所有行,并将它们保存在客户端。第二种方式是针对客户端的,通过调用mysql_use_result(),对“按行”结果集检索进行初始化处理。该函数能初始化检索结果,但不能从服务器获得任何实际行。
在这两种情况下,均能通过调用mysql_fetch_row()访问行。通过mysql_store_result(),mysql_fetch_row()能够访问以前从服务器获得的行。通过mysql_use_result(),mysql_f