本文介紹了如何通過 OceanBase Connector/C 驅動串連並使用 OceanBase 資料庫。
前提條件
在安裝使用 OceanBase Connector/C 前請確保設定了基本的資料庫開發環境,要求如下:
GCC 版本為 3.4.6 及以上,推薦使用 4.8.5 版本。
CMake 版本為 2.8.12 及以上。
C 驅動串連 OceanBase 資料庫
步驟一:擷取資料庫連接參數
參考 擷取串連參數 文檔,擷取相應的租戶串連參數,例如:
$ obclient -hxxx.xxx.xxx.xxx -P3306 -u a**** -p****** -Dtest資料庫連接參數包含了訪問資料庫所需的參數資訊,在驗證範例程式碼前,可通過資料庫連接參數驗證登入資料庫,保證資訊正確。
參數說明:
-h:OceanBase 資料庫連接的網域名稱。
-P:OceanBase 資料庫連接連接埠,MySQL 模式租戶預設是 3306。
-u:租戶的串連帳號。
-p:帳號密碼。
-D:資料庫名稱。
步驟二:安裝 OceanBase Connector/C 驅動
通過 rpm 安裝
擷取 OceanBase Connector/C 安裝包(即 LibOBClient)和 OBClient 安裝包。更多版本的安裝包,請參考 鏡像站,根據自身的系統版本在鏡像庫中找到需要的安裝包。
由於 OBClient 依賴於 LibOBClient,所以需要先安裝 LibOBClient。
安裝 LibOBClient。
$ sudo rpm -ivh libobclient-xx.x86_64.rpm安裝 OBClient。
$ sudo rpm -ivh obclient-xx.x86_64.rpm
從源碼編譯
OceanBase 資料庫的 Github 倉庫提供的最新開發版本的原始碼(包含子庫),參見 obclient。
安裝依賴工具。
$ 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代碼編譯及打包
下載 obclient 原始碼(包含子庫)。
$ git clone --recurse-submodules https://github.com/oceanbase/obclient進入 obclient/libmariadb 目錄。
$ cd obclient/libmariadb執行 LibOBClient 編譯。
$ sh build.sh打包 LibOBClient 的 RPM 安裝包。
$ sh rpm/libobclient-build.sh回到 obclient 目錄。
$ cd ..執行 OBClient 編譯。
$ sh build.sh打包 OBClient 的 RPM 安裝包。
$ sh rpm/obclient-build.sh
安裝 LibOBClient。
$ sudo rpm -ivh /libmariadb/rpmlibobclient-xx.x86_64.rpm安裝 OBClient。
$ sudo rpm -ivh rpm/obclient-xx.x86_64.rpm說明由於 OBClient 依賴於 LibOBClient,所以需要先安裝 LibOBClient。
步驟三:編寫程式碼範例
通過 OceanBase Connector/C 與資料庫伺服器 OBServer 節點互動的基本方式如下:
調用
mysql_library_init()初始化 MySQL 庫。mysql_library_init(0, NULL, NULL);調用
mysql_init()初始化一個串連控制代碼。MYSQL *mysql = mysql_init(NULL);調用
mysql_real_connect()串連到 OBServer 節點。mysql_real_connect (mysql, host_name, user_name, password, db_name, port_num, socket_name, CLIENT_MULTI_STATEMENTS)調用
mysql_real_query()或mysql_query()向 OBServer 節點發送 SQL 陳述式。mysql_query(mysql,"sql_statement");調用
mysql_store_result()或mysql_use_result()處理其結果。result=mysql_store_result(mysql);調用
mysql_free_result()釋放記憶體。mysql_free_result(result);調用
mysql_close()關閉與 OBServer 節點的串連。mysql_close(mysql);調用
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 = "xxx.xxx.xxx.xxx";//set your mysql host
char* user_name = "a****"; //set your user_name
char* password = "******"; //set your password
char* db_name = "test"; //set your databasename
int port_num = 3306; //set your mysql port
char* socket_name = NULL;
MYSQL_RES* result;
MYSQL_FIELD* fields;
MYSQL_ROW row;
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;");
if (status)
{
printf("Could not execute statement(s)");
mysql_close(mysql);
exit(0);
}
status = mysql_query(mysql, "CREATE TABLE test_table(id INT,name varchar(24));");
status = mysql_query(mysql, "INSERT INTO test_table VALUES(10,'hangzhou'),(20,'shanghai');");
status = mysql_query(mysql, "UPDATE test_table SET id=20 WHERE id=10;");
status = mysql_query(mysql, "SELECT * FROM test_table;");
/* 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);
int num_fields = mysql_num_fields(result);
int num_rows = mysql_num_rows(result);
printf("result: %d rows %d fields\n", num_rows, num_fields);
printf("---------------------\n");
fields = mysql_fetch_fields(result);
for (int i = 0; i < num_fields; ++i)
{
printf("%s\t", fields[i].name);
}
printf("\n---------------------\n");
while ((row = mysql_fetch_row(result)))
{
for (int i = 0; i < num_fields; ++i)
{
printf("%s\t", row[i] ? row[i] : "NULL");
}
printf("\n");
}
printf("---------------------\n");
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");
}
}
status = mysql_query(mysql, "DROP TABLE test_table;");
mysql_close(mysql);
return 0;
}
修改代碼中的資料庫連接參數。參考如下欄位,對應的值,則取自步驟一擷取的資料庫連接參數。
host_name:取自
-h參數,OceanBase 資料庫連接的網域名稱。user_name:取自
-u參數,租戶的串連帳號。password:取自
-p參數,帳號密碼。db_name:取自
-D參數,資料庫名稱。port_num:取自
-P參數,OceanBase 資料庫連接連接埠,MySQL 模式租戶預設是 3306。
步驟四:運行樣本
代碼編輯完成後,可以通過如下命令進行編譯:
obclient 安裝的預設路徑為 /u01/obclient。
$ 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。
$ ./mysql_test輸出如下結果,說明資料庫連接成功,樣本語句正確執行。
--------------------- id name --------------------- 20 hangzhou 20 shanghai ---------------------