2011-07-01 35 views
2

在我們當前的項目中,我們需要一些高級別的DBI用於不同的數據庫。它應該提供以下功能:C++ DBI類 - 最好的/開發者最友好的風格

  • 在內存中緩存 - 的DBI應該能夠緩存所有讀取和更新寫作調用緩存中(我們的編碼上的應用是重螺紋,並且需要快速一直訪問當前數據)。內存高速緩存將基於boost::multi_index
  • 自動SQL建築 - 我們不想解析SQL語句在內存中緩存

來查找我們需要爲提供的功能:定義表佈局,做選擇,插入,更新,連接......,界面會變得非常複雜。

我們需要一個調用接口函數的好方法。

有很多風格,但我們找不到任何有用的用途。

這裏舉幾個例子:

SOCI

sql << "select name, salary from persons where id = " << id, into(name), into(salary); 

我們不希望一些SQL語句,所以我們必須定義whatfrom以不同的方式。

pqxx

Conn.prepare("select_salary", 
    "select name, salary from persons where id = $1") 
    ((string)"integer",prepare::treat_direct); 

重載operator()的大量使用僅僅是醜陋,但它可以爲我們工作了。

任何建議如何設計的界面?

回答

1

如何使用對象關係映射?下面是一些代碼片段的想法,我只是在Python中完成這個任務,而不是在C++中完成,並且只對相當簡單的數據庫進行。有一個list of frameworks on Wikipedia應該避免過多輪相關的R & D.

class people: public dbi_table 
{ 
    // id column handled by dbi_table. 
    name: string_column; 
    salary: money_column; 
}; 

class cost_center: public dbi_table 
{ 
    name: string_column; 
    office: foreign_key<offices>; 
}; 

class people_cost_center_link: public link_table 
{ 
    // Many-many relationships. 
}; 

然後,你可以操縱的記錄爲對象,所有關係的東西是由框架處理。查詢是通過定義查詢對象,然後獲得結果的迭代器來完成的(代碼示例,請參閱the ODB wikipedia page)。

+0

謝謝你的想法,但我們已經評估過。ODB使用自己的編譯器/預處理器,大多數ORM框架使用數據庫相關的數據類型等等。我喜歡使用ODB的編碼風格,但是現在,我不知道如何實現,而不需要自己的編譯器/預處理器。由於我們也需要查詢內部緩存,所以我們必須能夠將sql數據類型映射到相應的內部類型。可能是你。 –

+1

所以如果我們排除使用現有的框架,似乎最大的問題是查詢語法,是否正確?插入,更新和按ID檢索都可以由表,列等對象處理。如果你爲每個基本上運行「如果沒有在緩存中的表」執行「search_by 」方法,那麼執行sql select select * from field where field_name is blah「? –

+0

'search_by '聽起來不錯。今天晚上我會更深入地瞭解 –

0

我會做這樣的(它會在C++的觀點很好,如果它是說不上正確的數據庫的東西):

struct Handle { int id; } 
class DBI 
{ 
public: 
    virtual Handle select(int column_id)=0; 
    virtual Handle select(int column1, int column2)=0; 
    virtual Handle id(int id)=0; 
    virtual Handle join(Handle i1, Handle i2)=0; 
    virtual void execute_query(Handle i)=0; 
}; 

通常這些功能將這樣進行:

Handle select(int column_id) { 
    return new_handle(new SelectNode(column_id)); 
} 

其中new_handle函數只會將SelectNode插入到std :: vector或std :: map併爲其創建句柄。