背景
2022年底的项目,记录一下。
某项目后台使用C++程序开发,使用的是OCI连接Oracle数据库。现需要做去O国产化适配改造。
本文聊聊C/C++应用程序如何使用VastBase替换Oracle。
编译适配
开发包获取
从VastBase官方或接口人处获取OCI开发包,包含头文件(include)和库(.so或.a)。
注意:不是ODBC!ODBC是数据库的客户端工具访问时需要引入的,我们C程序需要引用OCI相关包。
获取到的OCI开发包内容如下:
Include包含文件:
Lib包含文件:
修改makefile
正常情况下,目标应用程序的makefile中需要有2处修改:对应到前文所说的include和lib。
include头文件包含
在vb的OCI开发包中对oracle的OCI做了重新定义和封装(见vb开发包中的oci.h),因此我们的C程序不需要进行修改,只需要修改makefile中头文件引入即可。
如,
INCLUDE=-I.. -I$(VAST_HOME)/include
这里我们可以在环境变量中定义好 VAST_HOME,然后将OCI开发包中的include和lib目录拷贝到里面。如:
环境变量:
$VAST_HOME下的内容:
2、lib修改
需要将原先引入Oracle库的地方修改为引用vb的lib,并显式添加lib库(除Oracle相关的lib外都保留),例如:
LDFLAGS=-L$LIBHOME -L$(VAST_HOME)/lib -L/usr/local/pa64/lib -L$(HOME)/src/lib -lpthread -lmmdb -lpublic -lodbcoci
做完上述2个步骤后,就可以直接编译程序即可,完成数据库的替换。
结语
编译时我们可以通过替换makefile中的头文件和库路径,实现数据库的替换,大多数情况下编译都会通过。
但是!编译通过并不意味着存储引擎替换完成。实践中你会发现这仅仅是个开始:VB中有好多写法并不完全兼容OCI,如错误码、OCIStmtFetch返回值不兼容、OCIAttrGet数据类型范围等等。这些问题都是跟VB的研发人员一起定位并修改的。在这里必须给VB的支撑力度点赞(与某梦相比...)!
后续文章中我会把程序适配过程中遇到的问题以及改造方案进行分享。