MySQL C API:需要在* Embedded *模式下启动DB的示例

时间:2014-07-02 14:24:09

标签: mysql c embedded-database

我使用的是 C 工具,我需要在其中集中操作和查询流程内部数据。

因此,我决定在嵌入式模式下使用 MySQL C API ,因此我可以为我的工具的每个正在运行的进程设置一个嵌入式数据库,并使用它上面的所有SQL功能。

我在网上找到的所有 MySQL C API 教程都涉及到连接到正在运行的服务器,这不是我的情况。

在Oracle的MySQL网站中有一些使用嵌入式模式的示例,但它们并不简单,并且很难让它们发挥作用。

问:有人可以指点我或者在嵌入式模式下使用 MySQL C API 启动数据库的简短示例吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

经过多次尝试,终于回答自己并与你分享:

  • 创建一个用于存储DB的中央数据目录。在此示例中,我将使用/tmp/mysql_embedded_data

> mkdir /tmp/mysql_embedded_data

  • 创建一个C文件,如下例所示:
#include <my_global.h>
#include <mysql.h>

int main(int argc, char **argv) {  
    static char *server_options[] = {
                                   "mysql_test", // An unused string 
                                    "--datadir=/tmp/mysql_embedded_data", // Your data dir
                                    NULL };
    int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;

    static char *server_groups[] = { "libmysqld_server",
                                     "libmysqld_client", NULL };


    // Init MySQL lib and connection    
    mysql_library_init(num_elements, server_options, server_groups);
    MYSQL *con = mysql_init(NULL);

    if (con == NULL) {
        fprintf(stderr, "%s\n", mysql_error(con));
        exit(1);
    }

    mysql_options(con, MYSQL_READ_DEFAULT_GROUP, "libmysqld_client");
    mysql_options(con, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL);

    // Connect to no host/port -> Embedded mode
    if (mysql_real_connect(con, NULL, NULL, NULL, NULL, 0, NULL, 0) == NULL) {
        fprintf(stderr, "%s\n", mysql_error(con));
        mysql_close(con);
        exit(1);
    }

    // Create a sample empty DB, named "aNewDatabase"
    if (mysql_query(con, "CREATE DATABASE aNewDatabase")) {
        fprintf(stderr, "%s\n", mysql_error(con));
        mysql_close(con);
        exit(1);
    }

    // Close connection
    mysql_close(con);
    exit(0);
}
  • 编译您的文件(我假设在此示例中我的C文件名为/tmp/mysql_try.c

gcc /tmp/mysql_try.c -o /tmp/mysql_try -lz `mysql_config --include --libmysqld-libs`

  • 运行已编译的程序:

> /tmp/mysql_try

  • 当您的程序返回时,请确保数据库创建成功。我们将示例DB命名为aNewDatabase,因此我们将检查它是否在我们创建的数据目录中有一个目录 - &gt;我们将检查目录/tmp/mysql_embedded_data/aNewDatabase是否已创建:

> ls /tmp/mysql_embedded_data/aNewDatabase db.opt

  • 享受!