起因:
============================================================
做一个任务调度器的内核,拟采用数据库来实现对任务计划的创建,任务分发、任务执行跟踪等操作。考虑到实际的应用中,客户的数据库环境不可预知,因此计划将针对不同数据库的访问操作封装在独立的动态链接库中,通过配置文件来决定针对不同的数据库类型来调用不同的数据库访问动态链接库。从而达到不同的数据库,动态调用不同的数据库访问操作的动态连接库的目的。
一下是简单的测试,用于验证技术上是否可行。
闲话少述,贴代码:
file:add.c
-
#include <stdio.h>
-
#include <stdlib.h>
-
-
int add(int a, int b)
-
{
-
return a+b;
-
}
file:demo.c
-
#include <stdio.h>
-
#include <stdlib.h> // EXIT_FAILURE
-
#include <dlfcn.h> // dlopen, dlerror, dlsym, dlclose
-
-
typedef int(* FUNC_ADD)(int, int);
-
-
const char* dllPath = "./libadd.so";
-
-
int main()
-
{
-
void* handle = dlopen( dllPath, RTLD_LAZY );
-
-
if( !handle )
-
{
-
fprintf( stderr, "[%s](%d) dlopen get error: %s\n", __FILE__, __LINE__, dlerror() );
-
exit( EXIT_FAILURE );
-
}
-
-
do{ // for resource handle
-
FUNC_ADD add_func = (FUNC_ADD)dlsym( handle, "add" );
-
printf( "1 add 2 is %d \n", add_func(1,2) );
-
}while(0); // for resource handle
-
dlclose( handle );
-
}
file:Makefile
-
TARGET = libadd.so loaddemo
-
-
CC = cc
-
CFLAGS = -O2 -c -K PIC -DDEBUG
-
-
INCLDIR = -I/usr/include -I.
-
-
all:$(TARGET)
-
-
clean:
-
rm -f $(TARGET) *.o core.*
-
-
libadd.so:add.c
-
$(CC) -dy -K PIC -G -o $@ $^
-
-
loaddemo:demo.o
-
$(CC) -o $@ $^ -ldl
-
-
# #######################################################################################
-
.SUFFIXES:
-
.SUFFIXES:.c .o
-
-
.c.o:
-
$(CC) $(CFLAGS) $(INCLDIR) $<
执行编译:
$ gmake
运行看结果
$ ./loaddemo
$ 1 add 2 is 3
通过测试,验证了最初的猜想,该方案确实可行,可以将针对数据库的操作封装在动态链接库中,通过 将数据库的类型描述写入到一个配置文件中,程序读取该配置文件,然后根据配置文件获取需要动态加载的动态连接库的名字,从而实现针对不同的数据库类型的兼容。
需要注意的是:
1、每个数据库类型都需要独立的封装一个动态链接库,初步计划封装针对 MySQL、Oracle、DB2、Informix、PostgreSQL 的数据库访问的动态链接库。
2、每个动态链接库中,针对数据库的每一个访问的函数的名字必须是相同的。
3、如果针对新的数据库进行扩展,只需要针对新的数据库类型编写新的数据库操作函数,并独立封装成动态链接库,然后修改配置文件即可。
阅读(1075) | 评论(0) | 转发(0) |