Жив ли IBPP?

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
andov
Сообщения: 1
Зарегистрирован: 03 мар 2008, 18:11

Жив ли IBPP?

Сообщение andov » 03 мар 2008, 19:28

В поисках библиотеки для работы с FB для VC набрел на библиотеку IBPP
www.ibpp.org (не сочтите за рекламу)
последний релиз который я нашел ibpp-2-5-3-1-src (от 21.02.2007)
На сайте есть упоминание о третьей версии, но ссылок что бы скачать не нашел.

Жив ли еще этот прокет?
И вообще хотелось бы услышать мнение людей об этой библиотеке.

Если не по теме, прошу извинить.

ArtDen
Сообщения: 53
Зарегистрирован: 25 ноя 2007, 10:54

Re: Жив ли IBPP?

Сообщение ArtDen » 07 мар 2008, 21:12

andov писал(а):И вообще хотелось бы услышать мнение людей об этой библиотеке.
Использую. Есть несколько небольших нареканий, но в целом нормально.

RiderV
Сообщения: 2
Зарегистрирован: 12 май 2008, 20:29

Re: Жив ли IBPP?

Сообщение RiderV » 12 май 2008, 20:40

ArtDen писал(а):
andov писал(а):И вообще хотелось бы услышать мнение людей об этой библиотеке.
Использую. Есть несколько небольших нареканий, но в целом нормально.
А что за нарекания? И можно узнать, как давно используете?
Как на счёт многопоточности? Что-то на сайте не нашёл упоминаний потоко-безопасна ли либа?
Закладываю новый проект, а инструмент неопробаванный.
Не хотелось бы жёстких граблей.

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Сообщение Tonal » 12 май 2008, 21:04


Serik
Сообщения: 2
Зарегистрирован: 16 янв 2008, 12:48

Re: Жив ли IBPP?

Сообщение Serik » 22 май 2008, 11:03

отличная библиотека, использую под Windows и Linux.
Из замеченных недостатков: автор активно использует exception, но сам их слабо отрабатывает :). В нештатных ситуациях, возможно, что часть деструкторов сработает, а часть нет. Я лично с этим не сталкивался. Нужно внимательно проверять ситуации, типа отключение сервера во время fetch и т.д.

Serik
Сообщения: 2
Зарегистрирован: 16 янв 2008, 12:48

Использование IPBB

Сообщение Serik » 30 янв 2009, 08:00

В связи с постоянно увеличивающимся интересом пользователей к альтернативным платформам, растет и интерес программистов к инструментам и библиотекам для разработки на этих платформах. В том числе у многих возникает вопрос: как работать с СУБД Firebird/Interbase ? Предлагаю Вашему вниманию небольшую обзорную статью.

Использование IPBB

Введение
В мире открытых исходников есть множество хороших мультиплатформенных инструментов. Сегодня мы рассмотрим один из них - IBPP, библиотеку для доступа к СУБД Firebird/Interbase.

Что такое IBPP

IBPP - это библиотека для доступа к СУБД Firebird/InterBase, набор С++ классов для работы со стандартной клиентской библиотекой.

Лицензия
IBPP распростроняется по лицензии IBPP License v1.1, которая разрешает использование, модификацию и распространение. Текст лицензии очень короткий, и желающие могут ознакомится с ним на сайте проекта или прочесть файл license.txt.

Установка IBPP
Есть несколько вариантов использования IBPP:
1. Самый простой вариант - включить в проект все .cpp файлы. Этот вариант ввиду простоты и очевидности мы рассматривать не будем.
2. Собрать библиотеку. Динамическую, статическую и т.д., вы выбираете сами. Компилируете тоже сами, никаких скриптов или make-файлов нет.
Я, под Windows собираю библиотеку статической линковки, под Linux - библиотеку динамической загрузки.
Для сборки под Windows воспользуйтесь вашей любимой IDE. Для Linux придется написать небольшой make-файл.

Код: Выделить всё

## Makefile
## Сборка IBPP в библиотеку

CC = g++

SOURCES = array.cpp blob.cpp database.cpp date.cpp dbkey.cpp _dpb.cpp events.cpp exception.cpp _ibpp.cpp _ibs.cpp _rb.cpp row.cpp service.cpp _spb.cpp statement.cpp time.cpp _tpb.cpp transaction.cpp user.cpp

OBJECTS = $(SOURCES:.cpp=.o)

CFLAGS  = -DIBPP_LINUX -fPIC
all: $(OBJECTS)
        $(CC) -shared -o libibpp.so -W1,-soname,libibpp.so $(OBJECTS) -lfbclient -lcrypt -lm -ldl -lpthread

$(OBJECTS): \
%.o: %.cpp ibase.h iberror.h _ibpp.h ibpp.h
        $(CC) $(CFLAGS) -c -o $@ $<

clean:
        rm -f *.o libibpp.so
Для сборки IBPP необходимо иметь установленную библиотеку доступа libfbclient.

Работа с БД

Работа с БД, обычно состоит из следующих шагов:
- подключение к БД
- выполнение SQL-запроса
- получение результатов
- закрытие соединения с БД
Итак, перейдем от слов к делу. Подключение к существующей БД с помощью IBPP осуществляется очень просто.

Код: Выделить всё

#include <ibpp/ibpp.h>
...
try
{
    IBPP::Database db = IBPP::DatabaseFactory("myserver", "/data/db.fdb", "username", "password");
    db->Connect();
    ...
    db->Disconnect();
}
catch (IBPP::Exception& e)
{
    std::cout << e.ErrorMessage();
}
Для каждого соединения с БД нужен объект IBPP::Database, через него осуществляться вся работа. В первой строке мы создаем такой объект и инициализируем его минимально необходимыми данными: имя или ip-адрес сервера, название файла БД или алиас, имя пользователя, пароль. Также можно указать роль и кодировку. Суть методов connect()/Disconnect() думаю понятна :)
Проверить состояние соединения можно с помощью метода
bool Connected();
который возвращает true, если в данный момент объект имеет содинение с БД.
IBPP активно использует исключения для отработки ошибок, поэтому всю работу следует делать внутри блоков try/catch. Иерархию классов исключений можно посмотреть в исходниках.
Все рассматриваемые нами объекты IBPP являются "умными указателями", поэтому явное удаление не требуется.
При компиляции программы использующей IBPP нужно указывать, с какой платформой мы работаем. Делается это с помощью дерективы препроцессора IBPP_LINUX.

Для выполненения SQL-запроса нужно создать транзакцию. Сам SQL-запрос выполняется с помощью запроса(Statement), во как :)
Итак, пример:

Код: Выделить всё

...
IBPP::Transaction tr = IBPP::TransactionFactory(db);
tr->Start();
...
std::string fn;
std::string ln;
IBPP::Statement st = IBPP::StatementFactory(db, tr);
st->Execute("SELECT firstname, lastname FROM sometable ORDER BY lastname");
while (st->Fetch())
{
    st->Get(1, fn);
    st->Get(2, ln);
    std::cout << fn.c_str() << " - " << ln.c_str() << "\n";
}
...
tr->Commit();    // Or tr->Rollback();
...
В первой строке создается объект транзакции с параметрами по-умолчанию:
* способ доступа - WRITE (чтение/запись);
* уровень изоляции - ilConcurrency (близкое соответсвие Repeatable Read. Все операции в транзакции с данным уровнем изоляции видят только те данные, которые существовали (committed) на момент старта этой транзакции, даже если они впоследствии были изменены или удалены другими транзакциями);
* способ разрешения блокировок - WAIT (транзакция будет ожидать, пока заблокированные строки не будут освобождены)

Конечно, все параметры можно задать явно. Возможно одновременное существование нескольких транзакций в одном соединении.
Во второй строке транзакция запускается.
Далее создается запрос (Statement).
Метод Execute выполняет запрос. С помощью метода Fetch извлекаются строки результирующих данных. Метод Get ивлекает значения столбца.
После извлечения данных транзакцию нужно закрыть.

Вот и все ! SQL-запрос выполнен, данные из БД у вас в программе.
Однако, такие простые SQL-запросы в жизни мало применимы. Рассмотрим теперь, как использовать параметризированные запросы.
Все очень просто. В тексте SQL-запроса параметры обозначаются знаком вопроса. Потом запрос подготавливается (Prepare) и значения параметров подставляются методом Set(). Пример:

Код: Выделить всё

...
IBPP::Statement st = IBPP::StatementFactory(db, tr);
st->Prepare("SELECT firstname, lastname FROM sometable where id = ?");
st->Set(1, param);
st->Execute();
...
Строки
Если вы переходите с Windows на Linux, неприятным сюрпризом будет не совпадение кодировок. Обычно данные в Firebird хранятся в CP1251, а в клиентской программе они нужны в UTF-8. Для изменения кодировки существует стандартная библиотека iconv, функция перекодировки получается совсем не сложной и универсальной.

Итого
IBPP - очень удобная и легкая библиотека для разработки кроссплатформенных C++ классов для работы с СУБД Firebird.

Литература:
1) http://www.ibpp.org/reference/
2) Борри Х. Firebird: Руководство разработчика баз данных
3) Кузьменко Д. Транзакции в InterBase и Firebird http://www.ibase.ru/devinfo/ibtrans.htm

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: Жив ли IBPP?

Сообщение kdv » 02 фев 2009, 11:34

спасибо, добавил ссылки на пост со страниц Компоненты и Документация

Ответить