暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C 应用程序连接 OceanBase 数据库

本文提供 C 应用程序连接 OceanBase 数据库的连接代码示例。

前提条件

在安装使用 OceanBase Connector/C 前请确保设置了基本的数据库开发环境,要求如下:

  • GCC 版本为 3.4.6 及以上,推荐使用 4.8.5 版本。

  • CMake 版本为 2.8.12 及以上.

安装 C 驱动

Linux 安装

获取 OceanBase Connector/C 安装包(即 libobclient)和 obclient 安装包。

下载安装包,请参考 镜像站 ,根据自身的系统版本在镜像库中找到需要的安装包。

  1. 安装 libobclient。

    sudo rpm -ivh libobclient-xx.x86_64.rpm
    
  2. 安装 obclient。

    sudo rpm -ivh obclient-xx.x86_64.rpm

    
    >**说明**
    >
    >由于 obclient 依赖于 libobclient,所以需要先安装 libobclient。
    
    
    

### 从源代码编译

OceanBase 数据库的 Github 仓库提供的最新开发版本的源代码(包含子库 libobclient),参见 obclient

  1. 安装依赖工具。

    sudo yum install -y git cmake gcc make openssl-devel ncurses-devel rpm-build  gcc-c++ bison bison-devel zlib-devel gnutls-devel libxml2-devel openssl-devel \
    libevent-devel libaio-devel
    
  2. 代码编译及打包

    1. 下载 obclient 源代码(包含子库)。

      git clone --recurse-submodules https://github.com/oceanbase/obclient #下载 obclient 源代码(包含子库)
      cd obclient
      
    2. 执行 libobclient 编译。

      cd obclient/libmariadb
      sh build.sh
      
    3. 打包 libobclient 的 RPM 安装包。

      cd rpm
      sh libobclient-build.sh
      
    4. 执行 obclient 编译。

      cd ../..  #回到 obclient 目录
      sh build.sh
      
    5. 打包 obclient 的 RPM 安装包。

      cd rpm
      sh obclient-build.sh
      
  3. 安装 libobclient 和 obclient。

    cd /obclient/libmariadb/rpm
    sudo rpm -ivh libobclient-xx.x86_64.rpm
    cd ../../rpm # obclient/rpm 目录
    sudo rpm -ivh obclient-xx.x86_64.rpm
    

    说明

    由于 obclient 依赖于 libobclient,所以需要先安装 libobclient。

操作示例

应用程序通过 OceanBase Connector/C 与数据库服务器 OBServer 交互的基本方式如下:

  1. 调用 mysql_library_init() 初始化 MySQL 库。

    mysql_library_init(0, NULL, NULL);
    
  2. 调用 mysql_init() 初始化一个连接句柄。

    MYSQL *mysql = mysql_init(NULL);
    
  3. 调用 mysql_real_connect() 连接到 OBServer。

    mysql_real_connect (mysql, host_name, user_name, password,
    db_name, port_num, socket_name, CLIENT_MULTI_STATEMENTS)
    
  4. 调用 mysql_real_query() 或 mysql_query() 向 OBServer 发送 SQL 语句。

    mysql_query(mysql,"sql_statement");
    
  5. 调用 mysql_store_result() 或 mysql_use_result() 处理其结果。

    result=mysql_store_result(mysql);
    
  6. 调用 mysql_free_result() 释放内存。

    mysql_free_result(result);
    
  7. 调用 mysql_close() 关闭与 OBServer 的连接。

    mysql_close(mysql);
    
  8. 调用 mysql_library_end() 结束 libobclient 的使用。

    mysql_library_end();
    

示例代码

以 mysql_test.c 文件为例,代码如下:

#include "mysql.h"
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
  mysql_library_init(0, NULL, NULL);
  MYSQL *mysql = mysql_init(NULL);
  char* host_name = "172.xx.xx.xx";//set your mysql host
  char* user_name = "r***"; //set your user_name
  char* password = "***1**"; //set your password
  char* db_name = "test"; //set your databasename
  int port_num = 2883; //set your mysql port
  char* socket_name = NULL;
  MYSQL_RES* result;
  int status = 0;
  /* connect to server with the CLIENT_MULTI_STATEMENTS option */
  if (mysql_real_connect (mysql, host_name, user_name, password,
    db_name, port_num, socket_name, CLIENT_MULTI_STATEMENTS) == NULL)
  {
    printf("mysql_real_connect() failed\n");
    mysql_close(mysql);
    exit(1);
  }

  /* execute multiple statements */
  status = mysql_query(mysql,
                     "DROP TABLE IF EXISTS test_table;\
                      CREATE TABLE test_table(id INT);\
                      INSERT INTO test_table VALUES(10);\
                      UPDATE test_table SET id=20 WHERE id=10;\
                      SELECT * FROM test_table;\
                      DROP TABLE test_table");
  if (status)
  {
    printf("Could not execute statement(s)");
    mysql_close(mysql);
    exit(0);
  }

 /* process each statement result */
 do {
   /* did current statement return data? */
   result = mysql_store_result(mysql);
   if (result)
   {
     /* yes; process rows and free the result set */
     //process_result_set(mysql, result);
     mysql_free_result(result);
   }
   else          /* no result set or error */
   {
     if (mysql_field_count(mysql) == 0)
     {
       printf("%lld rows affected\n",
            mysql_affected_rows(mysql));
     }
     else  /* some error occurred */
     {
       printf("Could not retrieve result set\n");
       break;
     }
  }
  /* more results? -1 = no, >0 = error, 0 = yes (keep looping) */
  if ((status = mysql_next_result(mysql)) > 0)
    printf("Could not execute statement\n");
  } while (status == 0);

  mysql_close(mysql);
}

参数说明:

  • hostname:OceanBase 数据库连接 IP,通常是一个 OBProxy 地址。

  • username:租户的连接账户,MySQL 模式的租户管理员用户名默认是 root

  • password:用户密码。

  • dbname:需要访问的数据库名称。

  • port:OceanBase 数据库连接端口,也是 OBProxy 的监听端口,默认是 2883,可以自定义。

代码编辑完成后,可以通过如下命令进行编译和执行:

//编译
g++ -I/u01/obclient/include/ -L/u01/obclient/lib -lobclnt mysql_test.c -o mysql_test
//指定运行路径
export LD_LIBRARY_PATH=/u01/obclient/lib
//运行
./mysql_test

说明

obclient 安装的默认路径为 /u01/obclient

相关内容

关于 OceanBase Connector/C 的详细安装和使用信息,请参考文档 《OceanBase Connector/C 开发者指南》。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论