最好开始用C ++开发数据库接口?

时间:2011-06-26 14:31:32

标签: c++ interface relational-database

我正在研究一些基于服务器/客户端的应用程序。 该应用程序是多线程的,具有插件支持(通过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。

有没有人这样做过,可以给我一些建议吗?

2 个答案:

答案 0 :(得分:3)

我自己从未设计过这样的东西,但我之前看过的一个例子是数据库记录存储在一个基本上是std::map<std::string, boost::any>的结构中的设置,只有自己描述的类型,所以你知道什么它们与boost::any不同。然后可以针对数据库运行SQL查询,然后使用您要求的字段返回其中一个通用结构。

如果你把这些东西放到基类中,那么你可以派生出具体的类来处理数据库特定的细节 - 这可以让你随时交换数据库,并为你的插件提供充分的灵活性。

虽然,如果您不想让插件完全自由,我想您可以让他们访问受限制的用户。

答案 1 :(得分:0)

这看起来像是Strategy Pattern的一个场景。您可以包装检索策略对象中的某些数据的查询。然后,您可以提供一组默认策略,但客户可以提供使用DBMS特定内容或使用不同模式的自己的策略。