我正在研究一些基于服务器/客户端的应用程序。
该应用程序是多线程的,具有插件支持(通过dlopen
,...),并且可以与多个数据库一起使用。
现在我正在寻找一些提示来开始设计DBI-ABC。首先,我想到了一个简单的界面:
typedef struct {
unsigned int userid;
std::string username;
std::string fullname;
unsigned int usermodes;
} user_row_t;
class AbstractDBI
{
public:
virtual ~AbstractDBI() {};
virtual bool getUserData(int userid,user_row_t &row) const = 0;
virtual bool setUserData(user_row_t &row) const = 0;
// ...
}
此设计足以处理应用程序核心使用的所有语句。但是如果我们需要在用户编写的插件中访问数据库,我们就必须触及DBI类。
由于应用程序将处于繁重的负载状态,准备好的语句是必不可少的。我们还想使用特定于数据库的数据类型,例如inet
用于postgres。
有没有人这样做过,可以给我一些建议吗?
答案 0 :(得分:3)
我自己从未设计过这样的东西,但我之前看过的一个例子是数据库记录存储在一个基本上是std::map<std::string, boost::any>
的结构中的设置,只有自己描述的类型,所以你知道什么它们与boost::any
不同。然后可以针对数据库运行SQL查询,然后使用您要求的字段返回其中一个通用结构。
如果你把这些东西放到基类中,那么你可以派生出具体的类来处理数据库特定的细节 - 这可以让你随时交换数据库,并为你的插件提供充分的灵活性。
虽然,如果您不想让插件完全自由,我想您可以让他们访问受限制的用户。
答案 1 :(得分:0)
这看起来像是Strategy Pattern的一个场景。您可以包装检索策略对象中的某些数据的查询。然后,您可以提供一组默认策略,但客户可以提供使用DBMS特定内容或使用不同模式的自己的策略。