Введение

Для тех кто не в курсе, ODBC позволяет абстрагироваться от интерфейса конкретной СУБД. Это некоторая прослойка, в которой вы можете настроить источник данных, дать ему имя и общаться с ним на уровне ODBC API. При замене движка СУБД вы меняете лишь файлы настройки ODBC, не меняя исходный код программы.

Основа ODBC нативный проект Windows, хотя его родитель CLI (Call Layer Interface) - открытый и ведется XOpen. Под *nix системы существует реализация unixODBC. Для общения с ODBC на языке C++ существует libodbc++.

Установка

В Windows всё должно работать из коробки. Рассмотрим установку в gentoo.

sudo emerge -av unixODBC
sudo emerge -av libodbc++

С PostgreSQL драйвером некоторые трудности... В портежах по умолчанию он отсутствует, а в дефолтных оверлеях старьё. Поэтому пришлось накорябать свой (git://github.com/hoxnox/hoxnox-portage-overlay.git).

echo "dev-db/psqlodbc ~amd64" | sudo tee -a /etc/portage/package.keywords
sudo emerge -av psqlodbc

Настройка ODBC

Существует GUI утилиты (unixODBC-GUI-Qt), но нормально собрать их из оверлея qt или из исходников у меня не получилось. Поэтому вручную поправим конфиги (/etc/unixODBC/odbcinst.ini и /etc/unixODBC/odbc.ini) соответственно:

[ODBC]
Trace=yes
TraceFile=/tmp/odbc_log.txt

[PostgreSQL]
driver=/usr/lib/psqlodbcw.so
setup=/usr/lib/psqlodbcw.so
[Test]
driver=PostgreSQL
Servername=localhost
Username=postgres
Password=********
Port=5432
Database=test

Пример на C++

#include <odbc++/drivermanager.h>
#include <odbc++/connection.h>
#include <odbc++/preparedstatement.h>
#include <odbc++/resultset.h>
#include <iostream>

using namespace std;
using namespace odbc;

int main(int argc, char **argv)
{
    //Get the Driver manager
    DriverManager *dm;
    //Open the connection, specifiying the DSN.
    Connection *c = dm->getConnection("DSN=Test;uid=postgresql;pwd=*********");
    //Create the Query
    PreparedStatement *s = c->prepareStatement(
                 ODBCXX_STRING_CONST("SELECT ip FROM ip LIMIT 5"));
    ResultSet *r;
    //Execute the Query
    s->execute();
    //Get initial ResultSet
    r = s->getResultSet();
    while(r->next())
    {
        //Extract column information
        cout << "Column (ip): " << r->getInt("ip") << endl;
    }

    //Clean everything
    delete r;
    delete s;
    delete c;

    return 0;
}

Производительность

TODO:

Полезные ссылки

  1. unixODBC : http://www.unixodbc.org/
  2. libodbc++ reference : http://libodbcxx.sourceforge.net/libodbc++/progref/namespaceodbc.html

Comments

comments powered by Disqus