10.5.2. 多发比对 C 接口

10.5.2.1. 简介

多发比对提供了 C API ,可供 C/C++ 程序直接调用;用户只需要正确地引用 multiplex_client.h 与链接 libmultiplex_client.so 即可使用 C API。

10.5.2.2. 接口说明

要使用 C 接口,您需要发布包中对应操作系统平台的 so 动态库,以及 multiplex_client.h 头文件。

  // 目标数据库信息
  struct MultiplexTargetDBInfo {
      int dbType;       // 目标数据库类型,参考:UNISQL_DBTYPE_*宏定义
      char* schema;     // 目标信创库的库名或schema名
  };

  // SQL执行绑定变量信息
  struct MultiplexPraparedParameter {
      char* name;     // 绑定变量名称

      // 绑定变量类型,参考http接口中《数据类型支持范围》章节
      int   type;

      // 参数值:
      // 数值类型(不含numeric): 直接放在value值中, 例如: value = (void *)123;
      // 精确数值类型(numeric/number): 以字符串的形式提供,value = "11111222222222.2222222"
      // 日期、时间类型: 以字符串形式提供, 格式化样例: "2025-02-25 01:02:03.123"
      // 二进制类型: 提供相应内存起始地址
      void* value;    // 绑定变量值()

      // value的长度:
      // 如果是字符串类型(含日期,时间类型,精确数值类型),传入-1,则内部自动调用strlen获取长度;
      // 如果是二进制类型(如blob),则必须传入正确的长度
      // 如果是数值类型(不含numeric),此字段无效
      size_t valueLength;
  };

  // 多发执行结果(调用异常返回一个结果)
  struct MultiplexResult {
     int code;
     char *message;    // 返回消息
     char* traceId;    // 用于查询比对报告的ID
  };

  struct MultiplexOption {
    int batchFlag;
    int needTransfer;
  };

/**
* @brief 多发初始化
*
* @param serverUrl 多发服务器IP(参考多发HTTP接口)
* @param dbType 多发源数据库类型,参考:UNISQL_DBTYPE_*宏定义
* @param targetDBInfoList 多发目标数据库信息
* @param targetDBInfoListLength 多发目标数据库数量(targetDBInfoList的长度)
* @param handle 多发执行实例(返回参数),使用完毕需要使用multiplexDestory释放
* @param option 多发选项参数集合
* @return 错误码,0表示成功(其他参考多发http接口错误码章节)
*
* @note
*  1. 同一个handle不要多线程并发使用;
*  2. targetDBInfoList内部会复制一份,此函数返回后,应用可以释放此内存。
*/
extern int multiplexInit(
  const char *serverUrl,
  int dbType,
  MultiplexTargetDBInfo *targetDBInfoList,
  unsigned int targetDBInfoListLength,
  const MultiplexOption *option,
  void **handle);

/**
* @brief 多发实例释放函数
*
* @param multiplexInit函数返回的多发实例句柄
* @return 错误码,0表示成功(其他参考多发http接口错误码章节)
*/
extern int multiplexDestory(void *handle);

/**
* @brief 多发执行SQL
*
* @param handle  multiplexInit函数返回的多发实例句柄
* @param traceId 可选,如果没有则传入NULL,服务器会自动生成一个
* @param sql 执行语句
* @param preparedParam 绑定参数列表(如果没有绑定参数则传入NULL)
* @param preparedParamLength 绑定参数列表(如果没有绑定参数则传入0)
* @param result 多发比对执行结果(返回参数),必须先判断返回值,确认调用成功后再使用此结果。
* @return 错误码,0表示成功(其他参考多发http接口错误码章节)
*
* @note
*  1. 同一个handle不要多线程并发调用此接口
*  2. result由multiplex库内部分配
*     调用成功后,后续务必调用multiplexFree释放内存,调用失败(返回非0),则无需释放。
*/
extern int multiplexExecute(
    void *handle
    const char* traceId,
    const char *sql,
    const MultiplexPraparedParameter *preparedParam,
    unsigned int preparedParamLength,
    MultiplexResult** result);

/**
* @brief 多发库内存释放函数
* 多发库内部返回的数据结构,需要调用此函数释放,详见其他函数说明
*/
extern void multiplexFree(void *p);

/**
* @brief 多发动态库版本号
*/
extern const char *multiplexVersion();

10.5.2.3. 接口枚举说明

统一 SQL 的 C API 方言编码枚举如下:

#define UNISQL_DBTYPE_LIGHTDB_MYSQL         1  // LIGHTDB MYSQL模式
#define UNISQL_DBTYPE_LIGHTDB_ORACLE        2  // LIGHTDB ORACLE模式
#define UNISQL_DBTYPE_LIGHTDB_POSTGRESQL    3  // LIGHTDB POSTGRESQL模式
#define UNISQL_DBTYPE_DM                    4  // 达梦
#define UNISQL_DBTYPE_MYSQL                 5  // MYSQL
#define UNISQL_DBTYPE_TDSQL_MYSQL           6  // TDSQL MYSQL模式
#define UNISQL_DBTYPE_MYSQL_80              7  // MYSQL8
#define UNISQL_DBTYPE_OCEAN_BASE_MYSQL      8  // OceanBase MYSQL模式
#define UNISQL_DBTYPE_OCEAN_BASE_ORACLE     9  // OceanBase ORACLE模式
#define UNISQL_DBTYPE_OPENGAUSS             10 // OPENGAUSS
#define UNISQL_DBTYPE_ORACLE                11 // ORACLE
#define UNISQL_DBTYPE_POSTGRESQL            12 // POSTGRESQL
#define UNISQL_DBTYPE_GOLDENDB_MYSQL        13 // GOLDENDB MYSQL模式
#define UNISQL_DBTYPE_GOLDENDB_ORACLE       14 // GOLDENDB ORACLE模式
#define UNISQL_DBTYPE_GAUSSDB_MYSQL         15 // 高斯 MYSQL模式
#define UNISQL_DBTYPE_GAUSSDB_ORACLE        16 // 高斯 ORACLE模式
#define UNISQL_DBTYPE_SQLSVR                17 // SQLSVR模式
#define UNISQL_DBTYPE_TDSQL_PG_ORACLE       18 // tdsql_pg oracle模式
#define UNISQL_DBTYPE_GAUSSDB500_ORACLE     19 // 高斯 ORACLE模式,(GaussDB Kernel V500R002C10 build f6002322)版本

10.5.2.4. 接口返回状态参数

返回类型是一个 int ,取值有 2 种情况:

  • 返回 0: 代表多发比对成功

  • 返回 非0: 代表多发比对异常,可通过错误吗及日志中查看具体失败原因

10.5.2.5. 调用示例

示例代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "multiplex_client.h"

int main() {

    // 1.  目标数据库数量
    unsigned int targetDBCount = 2;
    // 2. 初始化目标数据库类型
    MultiplexTargetDBInfo *targetDBInfoList =
      (MultiplexTargetDBInfo *)malloc(targetDBCount * sizeof(MultiplexTargetDBInfo));

    targetDBInfoList[0].dbtype = UNISQL_DBTYPE_GAUSSDB_ORACLE;
    targetDBInfoList[0].scheam = "test";

    targetDBInfoList[1].dbtype = UNISQL_DBTYPE_DM;
    targetDBInfoList[1].scheam = "test";

    // 3. 多发服务器地址
    const char *multiplexServerUrl = "http://xxxx:xxx";

    // 4. 多发执行实例
    void *handle = NULL;

    // 5. 初始化实例
    MultiplexOption option;
    option.batchFlag = 1;
    option.needTransfer = 0;
    int r = multiplexInit(
              multiplexServerUrl,
              UNISQL_DBTYPE_ORACLE,
              targetDBInfoList,
              targetDBCount,
              &option,
              &handle);

    if(r != 0) {
      // 错误处理
    }

    // 6. 多发执行sql
    MultiplexResult* result = NULL;

    r = multiplexExecute(handle, NULL, "select xxx", NULL, 0, &result);
    if(r != 0) {
      // 错误处理
    }

    // 7. 结果处理(result)

    // 8. 释放结果集
    multiplexFree(result);

    // 9. 释放多发执行实例
    multiplexDestory(handle);

    return 0;
}