понедельник, 21 апреля 2008 г.

Потрошим Interbase .gdb файлы

Interbase поразил очевидностью своей эксплуатации.

Была задача извлечь из .gdb файла содержимое и перелить в другую БД. Сразу скажу, что с Interbase я вообще никогда не сталкивался, поэтому рассуждения, что называется, с нуля.

Может быь я действительно такой криворукий, но мне не удалось ни запустить JDBC драйвер, ни воспользоваться родным клиентом.

Не буду упоминать все исхоженные пути, просто изложу самый короткий и работающий:

# emerge firebird -v
# cp /path/to/your/database-file.gdb /usr/lib/firebird/

На любителя, можно еще для гарантии добавить:
# chmod 666 /usr/lib/firebird/database-file.gdb

$ fbsql -u SYSDBA -p masterkey /usr/lib/firebird/database-file.gdb -ch WIN1251
Database: /usr/lib/firebird/database-file.gdb, User: SYSDBA
SQL>

Ура! В этот момент мы имеем работающую БД и консольку, откликающуюся на запросы.

Почему базу скопировали в /usr/lib/firebird ?
Потому что иначе не будет работать нестандартная кодировка. Можно настроить т.н. embeded вариант, но он предполагает наличие ./intl/fbintl.so в папке с программой, т.е. fbsql.
Я пробовал добавить это в папку с файлом базы, т.к. в Windows это кажись работало (как это делают в программах от Борланда, прости, Господи):
$ mkdir ./intl
$ cp /usr/lib/firebird/fbintl.so ./intl/
однако нифига счастливого не произошло. Будет дешевле скопировать саму базу куда положено.

Проверим, все ли так, как нам надо:
SQL> show tables;
SQL> select * from any_table;

Ну, а дальше все банально:
$ echo "select * from any_table;" > query.sql
$ fbsql -u SYSDBA -p masterkey /usr/lib/firebird/database-file.gdb -ch WIN1251 -i query.sql -o result-1251.txt -pag 99999
$ iconv -f cp1251 -t utf8 result-1251.txt > result-utf.txt

Теперь в result-utf.txt имеем выковыренные запросом данные. Изменение их вида и перегон в другую БД оставлю читателю.

P.S. все вышенаписанное проделано на Gentoo.

2 комментария:

Сёмка Новиков комментирует...

Господи, какое же говнище, всё-таки этот интербейз.

Анонимный комментирует...

Возможно, но речь шла о фаербёрде, в отличии от которого все остальные открытые проекты уж точно говно(в т.ч. и МйСКЛ) . Что касается портажа, то лучшеб его не было(то же касается и FreeBSD).