C ++ DBI Class - лучший / дружественный стиль для разработчиков - PullRequest
2 голосов
/ 01 июля 2011

В нашем текущем проекте нам нужен высокоуровневый DBI для разных баз данных.Он должен обеспечивать следующие функции:

  • в кэш-памяти - DBI должен иметь возможность кэшировать все чтения и обновлять кэш при записи вызовов (приложение, на котором мы кодируем)является многопоточным и требует быстрого доступа к текущим данным все время).Кэш памяти будет основан на boost::multi_index
  • автоматическом построении sql - Мы не хотим анализировать оператор sql для поиска в кэше памяти

Поскольку нам нужно предоставить функции для: определения макета таблицы, выбора, вставки, обновления, объединения, ..., интерфейс станет очень сложным.

Нам нужен хороший способ вызватьинтерфейсная функция.

Существует множество стилей, но мы не смогли найти ни одного полезного для нашего использования.

Вот несколько примеров:

SOCI

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

Нам не нужны некоторые операторы SQL, поэтому нам придется определять what и from по-другому.

pqxx

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

Интенсивное использование перегруженного operator() просто уродливо, но оно может работать и у нас.

Есть предложения, как проектировать интерфейс?

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Как насчет использования реляционного отображения объектов?Вот некоторые идеи фрагментов кода, которые мне не нравятся - я делал это только на Python, никогда на C ++ и только для довольно простых баз данных.В Википедии есть список фреймворков, которые должны избегать слишком большого количества 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.
};

Затем вы можете манипулировать записями как объектами, все реляционные вещи обрабатываются фреймворком.Запросы выполняются путем определения объекта запроса и последующего приведения итератора к результатам (пример кода см. на странице Википедии ODB ).

0 голосов
/ 05 июля 2011

Я бы сделал это так (и было бы неплохо с точки зрения 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 и создаст для него дескриптор.

...