27.7.6.41 mysql_library_init()
int mysql_library_init(int argc, char **argv, char **groups)
Description
在调用任何其他 MySQL 函数之前,无论您的应用程序是常规 Client 端程序还是使用嵌入式服务器,都请调用此函数以初始化 MySQLClient 端库。如果应用程序使用嵌入式服务器,则此调用将启动服务器并初始化服务器使用的所有子系统(mysys
,InnoDB
等)。
Note
为了避免在使用库完成应用程序后发生内存泄漏(例如,在关闭与服务器的连接之后),请确保显式调用mysql_library_end()。这样可以执行内存 Management 以清理和释放库使用的资源。参见第 27.7.6.40 节“ mysql_library_end()”。
应用程序是作为常规 Client 端运行还是使用嵌入式服务器的选择取决于您在链接时使用libmysqlclient
还是libmysqld
库来生成最终的可执行文件。有关更多信息,请参见第 27.7.5 节“ C API 函数概述”。
在非多线程环境中,可以省略对mysql_library_init()的调用,因为mysql_init()将根据需要自动调用它。但是,mysql_library_init()在多线程环境中不是线程安全的,因此mysql_init()也不是,它调用mysql_library_init()。无论是调用mysql_library_init()还是间接通过mysql_init(),都必须在生成任何线程之前调用mysql_library_init(),或者使用 Mutex 来保护该调用。在进行任何其他 Client 端库调用之前,请执行此操作。
argc
和argv
参数类似于main()
的参数,并允许将选项传递给嵌入式服务器。为了方便起见,如果没有服务器的命令行参数,则argc
可以是0
(零)。对于仅用作常规(非嵌入式)Client 端的应用程序,这是常见情况,并且该调用通常写为mysql_library_init(0,NULL,NULL)。
#include <mysql.h>
#include <stdlib.h>
int main(void) {
if (mysql_library_init(0, NULL, NULL)) {
fprintf(stderr, "could not initialize MySQL client library\n");
exit(1);
}
/* Use any MySQL API functions here */
mysql_library_end();
return EXIT_SUCCESS;
}
当要传递参数(argc
大于0
)时,argv
的第一个元素将被忽略(通常包含程序名称)。 mysql_library_init()复制参数,因此可以安全地在调用后销毁argv
或groups
。
对于嵌入式应用程序,如果要连接到外部服务器而不启动嵌入式服务器,则必须为argc
指定一个负值。
groups
参数是一个字符串数组,用于指示要从中读取选项的选项文件中的组。参见第 4.2.2.2 节“使用选项文件”。在数组NULL
中进行最后的 Importing。为了方便起见,如果groups
参数本身是NULL
,则默认使用[server]
和[embedded]
组。
#include <mysql.h>
#include <stdlib.h>
static char *server_args[] = {
"this_program", /* this string is not used */
"--datadir=.",
"--key_buffer_size=32M"
};
static char *server_groups[] = {
"embedded",
"server",
"this_program_SERVER",
(char *)NULL
};
int main(void) {
if (mysql_library_init(sizeof(server_args) / sizeof(char *),
server_args, server_groups)) {
fprintf(stderr, "could not initialize MySQL client library\n");
exit(1);
}
/* Use any MySQL API functions here */
mysql_library_end();
return EXIT_SUCCESS;
}
Return Values
零成功。如果发生错误,则为非零值。