怎么用C语言实现数据库反射
如何用C语言实现数据库反射?工程需要使用到两种数据库:MySQL和SQLITE。我首先将常用的SQLITE的C语言API封装
如何用C语言实现数据库反射?
工程需要使用到两种数据库:MySQL和SQLITE。
我首先将常用的SQLITE的C语言API封装了一下,统一为MySQL的C语言API形式。
然后再使用宏替换具体的函数调用,例如:
C/C++ code#ifdef DATABASE_MYSQL#define DB_QUERY mysql_query //mysql_query()函数#elif defined DATABASE_SQLITE#define DB_QUERY sqlite_query //sqlite_query()函数,与mysql_query()的参数列表是一致的#endif
最后在程序里面使用数据库API时,只需调用DB_QUERY()。由宏来决定具体用到的是mysql_query()还是sqlite_query()。
而这样的程序在预处理期即必须知道要使用的是MySQL还是SQLITE数据库。
请问大家,能否在运行期通过读配置文件的方式选择使用哪种数据库及其C语言API?如能,如何实现呢?
[解决办法]1。如果编译时期都编译,用函数指针数组实现,这个简单,快,但不能满足动态需求。
2。如果编译时期不需要,运行时才需要,使用模块的思想,把这些封装在一个dll中,读配置时loadlibrary()进行注册,形成注册链,运行时调用。
例如 所有请求定义公共原型:
typedef struct
{
int (*DB_OPEN)();
int (*DB_QUERY)(arg,arg2,..);
....
}plugin;
动态库初始化时new plugin(),并填好这些指针,然后把这个plugin加入到某个全局容器中。
调用部分轮询这个容器,根据返回值判断其是否已经处理,是否需要继续下发到下一个plugin,你这个数据库不需要如此复杂,只可能同时一个库,容器直接变成全局指针就行。
[解决办法]我觉得楼主把这个问题想得有点复杂了。
用最简单的多态就可以做到。因为不管怎么说,在运行时,可以告知封装函数db_query某种对象,db_query可以根据这个传递过来的对象,判断是要调用mysql_query还是sqlite_query就可以了。
另外楼主也可以考虑使用adapter模式来实现。