powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Cache 5.0 Linux Odbc Driver
7 сообщений из 7, страница 1 из 1
Cache 5.0 Linux Odbc Driver
    #38583587
Stolb27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток. Столкнулся с такой проблемой. Потребовалось получить с сервера под Дебианом х64 доступ к Cache по ODBC. Поставил unixodbc, unixodbc-dev. Скачал крайний драйвер с официального сайта Интерсистемс (Cache.5.0.21.ODBC-6408-linuxamd64.tar.Z). Распаковал, запустил скрипт. Отредактировал файл cacheodbc.ini, сгенерированный в каталоге mgr:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
[ODBC Data Sources]
Samples = Samples
User = User
CacheDb = CacheDb

[Samples]
Driver          = /var/cacheodbc/bin/libcacheodbc.so
Description     = Cache 5.0 ODBC driver
Host            = <ip сервера>
Namespace       = SAMPLES
UID             = _SYSTEM
Password        = <password>
Port            = 1972
Protocol        = TCP
Query Timeout   = 1
Static Cursors  = 0
Trace           = off
TraceFile       = iodbctrace.log

[User]
Driver          = /var/cacheodbc/bin/libcacheodbc.so
Description     = Cache 5.0 ODBC driver
Host            = <ip сервера>
Namespace       = USER
UID             = _SYSTEM
Password        = <password>
Port            = 1972
Protocol        = TCP
Query Timeout   = 1
Static Cursors  = 0
Trace           = off
TraceFile       = iodbctrace.log

[CacheDb]
Driver                  = /var/cacheodbc/bin/libcacheodbc.so
Description             = Cache 5.0 ODBC driver
Host                    = <ip сервера>
Namespace               = <Наш CacheDbNameSpace>
UID                     = _SYSTEM
Password                = <password>
Port                    = 1972
Protocol                = TCP
Unicode SQLTypes        = 0
Query Timeout           = 1
Static Cursors          = 0
Trace                   = off
TraceFile               = iodbctrace.log


После этого тестовый скрипт из каталога dev/odbc/samples/select/ select.sh отлично работать. Я немного рихтую его до вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#!/bin/sh

ODBCINI=/var/cacheodbc/mgr/cacheodbc.ini
export ODBCINI
LD_LIBRARY_PATH=/var/cacheodbc/bin
export LD_LIBRARY_PATH

echo "select top 5 * from Sample" | ./select cachedb

И начинаются проблемы. Там есть несколько колонок, содержащих русские символы. Символы отображаются корректно. Но вот столбцы начинают склеиваться. Т.е. такое ощущение, что драйвер не видит конца поля записи и пишет следующее. Более того, зачастую слетает кодировка самой консоли (и русские, и английские буквы после выполнения скрипта отображаются некорректно). При попытке порабоать с соединением через библиотеку OTL наблюдается то же самое. Символы кодированы UTF8. Если есть русский, то поле заканчивается символами 0x03 0x01 (или другими служебными) и дальше в него попадает фрагмент следующего и т.д. Как следствие, библиотека постоянно падает с segmentation fault из-за некорректного определения конца строки, как мне кажется. Доводилось ли кому-либо работать с подобной связкой? Как заставить драйвер корректно отдавать данные?
...
Рейтинг: 0 / 0
Cache 5.0 Linux Odbc Driver
    #38583593
Stolb27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример вывода по одному стобцу с кириллицей:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
/var/cacheodbc/dev/odbc/samples/select$ ./intro.sh
Level 2 supported
NAME
--------------------------------------------------------------------------------
ЯРОСЛАВ ЯРОСЛ
ЯРОСЛАВ ЯРОСЛ
ЯРОСЛАВ ЯРОСЛ
ЯРОСЛАВ ЯРОСЛ
ЯРОСЛАВ
Done with execute
Done with everything except the final return
...
Рейтинг: 0 / 0
Cache 5.0 Linux Odbc Driver
    #38583600
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, похожа ли наша проблема на вашу, возможно это вам поможет.
Дело в том, что *nix-овые драйвера гораздо чувствительнее к спецификации данных. Если поле декларировано как String(MAXLEN=50), то столько символов драйвер и примет. А что дальше будет - непонятно. Может абракадарбра, может в другое поле залезет. Второй момент - из-за utf фактическая длина строки в два раза длиннее. Вы передаете строку 30 символов, фактически она превращается в 60, а что делать с тем, что идет после 50го символа - драйвер не понимает.
...
Рейтинг: 0 / 0
Cache 5.0 Linux Odbc Driver
    #38592526
Stolb27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, проблему решил костылем. Для OTL указывал предельное количество байт для char-полей, чтобы избежать segmentation fault при чтении:

Код: plaintext
otl_stream i(50, "select top 1 id:#1<int>, fam:#2<char[150]>, name:#3<char[120]>, otch:#4<char[240]>, ...

Со склеенными записями пришлось бороться поиском любых мусорных символов с кодами ниже 0x20 и заменой на 0x00.
После этих манипуляций строки стали пригодны для работы с ними стандартными функциями.
...
Рейтинг: 0 / 0
Cache 5.0 Linux Odbc Driver
    #38592610
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм, а правильно продекларировать поля не проще?
...
Рейтинг: 0 / 0
Cache 5.0 Linux Odbc Driver
    #38632683
Stolb27
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н., что вы имеете ввиду под правильной декларацией? Проблема была в том, что возвращаемые драйвером строки не имели \0 на конце, т.е. не были валидными Си-строками.

Более того, драйвер оказался крайне бажным. От ОТЛ пришлось отказаться, потому что select, возвращающий количество записей более одной вообще корректно не работал. Выглядело это так:
1) Запрашиваем набор данных, который должен вернуть 12 записей.
2) Вместо этого нам возвращается первые 6 из них, перемежающиеся пустыми записями:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Запись1
0
Запись2
0
Запись3
...
Запись5
0

Пришлось отказаться и использовать голый ODBC. В итоге уперся в то, что драйвер из базы преобразовывал cp866 в UTF8 без спросу, а при insert/update этого не делал, запихивая в cache utf-8. При этом однобайтовые кодировки нещадно резал, заменяя символами '?'. Проблемы решились использованием драйвера для версии 5.2 ссылко. Работает и с iODBC и с unixODBC. Пруф здесь .
...
Рейтинг: 0 / 0
Cache 5.0 Linux Odbc Driver
    #38632934
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В своё время приходилось возиться с subj, даже была написана статья . В моём случае результирующий набор всегда возвращался в кодировке cp1251, и для его правильной обработки в Linux требовалась установка локализации CP1251.

Для меня это дела давно минувших дней, (как говорится, всё что знал - написал), но может чем-то поможет в вашем случае.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Cache 5.0 Linux Odbc Driver
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]