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

人大金仓数据库KingbaseES LIBKCI驱动环境搭建

原创 数据猿 2023-12-26
3713


关键字:

接口、LIBKCI、驱动使用、例程、人大金仓、KingbaseES

一、环境准备

安装KES数据库,V8R6或者V9,建议用最新的,因为作者接下来是针对最新的数据库进行驱动使用和例程开发。

二、环境搭建

2.1 数据库安装与配置

1、安装KES数据库或者去FTP下载最新的daily-build文件如图1,然后解压安装,路径:ftp://192.168.4.13/FTP/数据库/内部版本/V8R6/内部版本/daily-build/20231008/build/,进入之后选择需要安装的版本,这里需要在Linux中安装,因此直接下载kingbase-V008R006B1009-linux-x86_64.tar.gz。

2、下载之后将其放到Linux中,然后执行以下解压命令,解压到当前目录:

tar -zxvf ingbase-V008R006B1009-linux-x86_64.tar.gz

解压之后会生成3个文件,直接继续解压咱们需要的KES_Server就行:

tar –xvf kingbase-server-linux-x86_64.tar

解压之后会有数据库的一些文件如bin、include、lib等,如图2.

图2-1 免编译数据库版本下载

图2-2 解压后生成相应文件

3、初始化数据库,进到bin中,初始化数据库,初始化后生成data目录:./initdb -D ../data -U system –W

进到data目录中修改kingbase.conf中的端口号,日志打印等,修改完成可以转到bin中启动数据库(启动数据库需要OpenSSL 1.1.1q)。

2.2 用例编辑和环境配置

1、建立测试例程,测试数据库连接,首先创建libkcitest.c文件,在文件中写入手册的数据库连接例程,添加头文件libkci_fe.h,写入数据库连接参数,连接数据库,关闭数据库。代码放在附录,需要的可以参考。

图2-3 数据库连接例程编辑

2、创建Makefile文件,使用vim进行创建和编辑,加入以下内容。

图2-4 编辑Makefile文件

在Makefile中加入数据库的lib路径和include路径,这样make的时候才能找到驱动文件和需要的库文件,另外可以在Makefile末尾加上clean的相关操作,这样就可以make之后使用make clean清除编译生成的文件。

.PHONY:clean

clean:

rm -f $(OBJ) $(TARGET)

rm -f core*

3、使用make命令编译libkcitest.c文件,make能提示你程序的问题,比如下图,提示缺少res和conn的定义,根据错误和警告可以在程序中快速定位和修改问题。

图2-5 编译文件

修改之后继续make,提示不能打开libkci.so.5,经过检查是没有将数据库的lib写到环境变量中,可以直接在Linux中依次执行以下指令:

export PATH=openssl地址/bin:$PATH

图2-6 缺少数据库lib环境变量

修改之后继续make,提示libkci.so对一些符号未定义的引用,经过检查是openssl版本不对,因此需要openssl 1.1.1k写到环境变量中,可以直接在Linux中依次执行以下指令:

export LD_LIBRARY_PATH=openssl地址/lib:$LD_LIBRARY_PATH

export LD_LIBRARY_PATH=数据库地址/lib:LD_LIBRARY_PATH

图2-7 缺少环境变量

2.3 驱动使用

1、修改完成libkcitest.c和加入相应的环境变量之后,使用make,编译之后会生成libkcitest.o和可执行文件libkci。

图2-8 编译生成相关文件

2、执行可执行文件libkci:./libkci,执行会在当前页面打印程序的相关输出信息,并且数据库后端也会有连接日志显示。

图2-9 执行用例

三、总结

1、libkci的驱动文件在安装完数据库后已经生成,不需要再去单独编译libkci,但是针对特定的场景和其他驱动,比如作者之前用到的QT等驱动都是需要libkci库的,此时需要用到单独编译的libkci的x86或x64,另外还要区分Windows和Linux,因此正常的驱动会有四个通用版本。此外不同的数据库驱动所需求的库文件也可能不一样,导致驱动某些功能无法使用,因此要注意数据库版本和libkci版本对应。

2、libkci例程当前不完善,作者接下来将完善libkci的copy用例、批量操作用例(插入、修改、读取)、负载均衡用例、大对象的二进制写入与读取等,用例的编写和使用可参考作者后续的文章。

附录一:LIBKCI连接数据库例程源码

#include <stdlib.h>

#include "libkci_fe.h"

static void exit_nicely(KCIConnection *conn)

{

KCIConnectionDestory(conn);

exit(1);

}

int main(int argc, char **argv)

{

const char *conninfo;

KCIResult *res = NULL;

KCIConnection *conn;

/*

* 如果用户在命令行上提供了一个参数,将它用作连接信息串。如:

* ./testlibkci5 "hostaddr=127.0.0.1 port=54321 user=system dbname=test password=123456"

* 否则默认用设置 dbname=kingbase 并为所有其他链接参数使用环境变量或默认值。

*/

if (argc > 1)

conninfo = argv[1];

else

conninfo = "host=10.12.1.30 port=52222 user=system password=123456 dbname=test sslmode=disable";

//conninfo = "dbname = kingbase";

/* 建立一个到数据库的连接 */

conn = KCIConnectionCreate(conninfo);

printf("*******数据库连接成功******\n\n");

/* 检查看后端连接是否成功建立 */

if (KCIConnectionGetStatus(conn) != CONNECTION_OK)

{

fprintf(stderr, "Connection to database failed: %s",

KCIConnectionGetLastError(conn));

exit_nicely(conn);

}

/* 设置总是安全的搜索路径,这样恶意用户就无法取得控制。*/

res = KCIStatementExecute(conn,"SELECT sys_catalog.set_config('search_path', '', false)");

if (KCIResultGetStatusCode(res) != EXECUTE_TUPLES_OK)

{

fprintf(stderr, "SET failed: %s", KCIConnectionGetLastError(conn));

KCIResultDealloc(res);

exit_nicely(conn);

}

/*

* 任何时候不再需要 KCIResult 时,应该 KCIResultDealloc 它来避免内存泄露

*/

KCIResultDealloc(res);

/* 关闭数据库的连接并且清理 */

KCIConnectionDestory(conn);

printf("*******数据库关闭成功******\n");

return 0;

}

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

评论