关键字:
接口、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;
}




