• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

obclient: A MariaDB-based command line tool to connect to OceanBase Database.

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

obclient

开源软件地址:

https://gitee.com/oceanbase/obclient

开源软件介绍:

什么是 OceanBase Client

OceanBase Client(简称 OBClient) 是一个基于 MariaDB 开发的客户端工具。您可以使用 OBClient 访问 OceanBase 数据库的集群。OBClient 采用 GPL 协议。

OBClient 依赖 libobclient。libobclient 是一个基于 MariaDB 的 mariadb-connector-c 开发的 OceanBase C API Lib 库。libobclient 允许 C/C++ 程序以一种较为底层的方式访问 OceanBase 数据库集群。libobclient 支持使用 OceanBase 数据库的最新数据模型。libobclient 采用 LGPL 协议。

如何获取 OBClient

按以下方式获取 OBClient:

通过 YUM 源攻取 OBClient

# 添加 yum 源sudo yum install -y yum-utilssudo yum-config-manager \   --add-repo \  https://mirrors.aliyun.com/oceanbase/OceanBase.repo   # 安装 OBClientsudo yum install obclient

通过源码构建 OBClient

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-develcd rpm# 打包obclient的rpm包sh obclient-build.sh进入到libobclient的仓库cd rpm#打包libobclient的rpm 这里面主要是so和头文件sh libobclient-build.sh#安装,需要先安装libobclient的rpm,再安装obclient的rpm。

使用限制

OBClient 暂时不支持部分 Oracle 类型的写入。例如 blob 和 raw 等。

操作指南

Statement

C API 详细信息,参考 MySQL C API 基础函数文档。代码示例如下:

/* 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);

Prepared Statement

C API 详细信息,参考 MySQL C API 预置语句函数文档。代码示例如下:

MYSQL_STMT *stmt;MYSQL_BIND ps_params[3];  /* input parameter buffers */int        int_data[3];   /* input/output values */my_bool    is_null[3];    /* output value nullability */int        status;/* set up stored procedure */status = mysql_query(mysql, "DROP PROCEDURE IF EXISTS p1");test_error(mysql, status);status = mysql_query(mysql,  "CREATE PROCEDURE p1("  "  IN p_in INT, "  "  OUT p_out INT, "  "  INOUT p_inout INT) "  "BEGIN "  "  SELECT p_in, p_out, p_inout; "  "  SET p_in = 100, p_out = 200, p_inout = 300; "  "  SELECT p_in, p_out, p_inout; "  "END");test_error(mysql, status);/* initialize and prepare CALL statement with parameter placeholders */stmt = mysql_stmt_init(mysql);if (!stmt){  printf("Could not initialize statement\n");  exit(1);}status = mysql_stmt_prepare(stmt, "CALL p1(?, ?, ?)", 16);test_stmt_error(stmt, status);/* initialize parameters: p_in, p_out, p_inout (all INT) */memset(ps_params, 0, sizeof (ps_params));ps_params[0].buffer_type = MYSQL_TYPE_LONG;ps_params[0].buffer = (char *) &int_data[0];ps_params[0].length = 0;ps_params[0].is_null = 0;ps_params[1].buffer_type = MYSQL_TYPE_LONG;ps_params[1].buffer = (char *) &int_data[1];ps_params[1].length = 0;ps_params[1].is_null = 0;ps_params[2].buffer_type = MYSQL_TYPE_LONG;ps_params[2].buffer = (char *) &int_data[2];ps_params[2].length = 0;ps_params[2].is_null = 0;/* bind parameters */status = mysql_stmt_bind_param(stmt, ps_params);test_stmt_error(stmt, status);/* assign values to parameters and execute statement */int_data[0]= 10;  /* p_in */int_data[1]= 20;  /* p_out */int_data[2]= 30;  /* p_inout */status = mysql_stmt_execute(stmt);test_stmt_error(stmt, status);/* process results until there are no more */do {  int i;  int num_fields;       /* number of columns in result */  MYSQL_FIELD *fields;  /* for result set metadata */  MYSQL_BIND *rs_bind;  /* for output buffers */  /* the column count is > 0 if there is a result set */  /* 0 if the result is only the final status packet */  num_fields = mysql_stmt_field_count(stmt);  if (num_fields > 0)  {    /* there is a result set to fetch */    printf("Number of columns in result: %d\n", (int) num_fields);    /* what kind of result set is this? */    printf("Data: ");    if(mysql->server_status & SERVER_PS_OUT_PARAMS)      printf("this result set contains OUT/INOUT parameters\n");    else      printf("this result set is produced by the procedure\n");    MYSQL_RES *rs_metadata = mysql_stmt_result_metadata(stmt);    test_stmt_error(stmt, rs_metadata == NULL);    fields = mysql_fetch_fields(rs_metadata);    rs_bind = (MYSQL_BIND *) malloc(sizeof (MYSQL_BIND) * num_fields);    if (!rs_bind)    {      printf("Cannot allocate output buffers\n");      exit(1);    }    memset(rs_bind, 0, sizeof (MYSQL_BIND) * num_fields);    /* set up and bind result set output buffers */    for (i = 0; i < num_fields; ++i)    {      rs_bind[i].buffer_type = fields[i].type;      rs_bind[i].is_null = &is_null[i];      switch (fields[i].type)      {        case MYSQL_TYPE_LONG:          rs_bind[i].buffer = (char *) &(int_data[i]);          rs_bind[i].buffer_length = sizeof (int_data);          break;        default:          fprintf(stderr, "ERROR: unexpected type: %d.\n", fields[i].type);          exit(1);      }    }    status = mysql_stmt_bind_result(stmt, rs_bind);    test_stmt_error(stmt, status);    /* fetch and display result set rows */    while (1)    {      status = mysql_stmt_fetch(stmt);      if (status == 1 || status == MYSQL_NO_DATA)        break;      for (i = 0; i < num_fields; ++i)      {        switch (rs_bind[i].buffer_type)        {          case MYSQL_TYPE_LONG:            if (*rs_bind[i].is_null)              printf(" val[%d] = NULL;", i);            else              printf(" val[%d] = %ld;",                     i, (long) *((int *) rs_bind[i].buffer));            break;          default:            printf("  unexpected type (%d)\n",              rs_bind[i].buffer_type);        }      }      printf("\n");    }    mysql_free_result(rs_metadata); /* free metadata */    free(rs_bind);                  /* free output buffers */  }  else  {    /* no columns = final status packet */    printf("End of procedure output\n");  }  /* more results? -1 = no, >0 = error, 0 = yes (keep looking) */  status = mysql_stmt_next_result(stmt);  if (status > 0)    test_stmt_error(stmt, status);} while (status == 0);mysql_stmt_close(stmt);

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap