Bug 17392 - Немогу подключить uuidlib
Summary: Немогу подключить uuidlib
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: firebird-server-superserver (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P2 normal
Assignee: darktemplar@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-09-30 11:39 MSD by solo
Modified: 2008-10-06 19:00 MSD (History)
0 users

See Also:


Attachments
uuidlibv12.zip (110.79 KB, application/octet-stream)
2008-09-30 11:39 MSD, solo
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description solo 2008-09-30 11:39:28 MSD
Created attachment 2966 [details]
uuidlibv12.zip

Немогу подключить расширение uuidlib (zip архив с исходниками приложен). Максиум чего удалось достич на тестовой (пустой) базе:

$ fbsql.superserver -u SYSDBA -p masterkey localhost:/var/lib/firebird/example_db.fdb
Database:  localhost:/var/lib/firebird/example_db.fdb, User: SYSDBA
SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;
Statement failed, SQLCODE = -902
Access to UDF/BLOB-filter module "uuidlib" is denied by server administrator
SQL> exit;

  Настораживает следующие: результат приведённый выше получается только когда в /usr/lib64/firebird/UDF/ присутствуют uuidlib.so _и_ uuidlib (одно собственно файл библиотеки, другое -- на него ссылка, что именно что -- значение не имет), а в uuidUDF.sql прописан uuidlib. В других случаях, таких как:

1) присутствует только uuidlib (он-же приписан в uuidUDF.sql);

2) присутствует только uuidlib.so (он-же приписан в uuidUDF.sql);

3) присутствует только uuidlib.so (но в uuidUDF.sql приписан uuidlib);

диагностика тестового запроса другая:

$ fbsql.superserver -u SYSDBA -p masterkey localhost:/var/lib/firebird/example_db.fdb
Database:  localhost:/var/lib/firebird/example_db.fdb, User: SYSDBA
SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;

CONCATENATION                          
====================================== 
Statement failed, SQLCODE = -902
Unable to complete network request to host "localhost".
-Error reading data from the connection.
SQL> exit;
Comment 1 Boris Savelev 2008-10-01 18:42:51 MSD
(In reply to comment #0)
> Created an attachment (id=2966) [details]
> uuidlibv12.zip
> 
> Немогу подключить расширение uuidlib (zip архив с исходниками приложен). Максиум
> чего удалось достич на тестовой (пустой) базе:
> 
> $ fbsql.superserver -u SYSDBA -p masterkey localhost:/var/lib/firebird/example_db.fdb
> Database:  localhost:/var/lib/firebird/example_db.fdb, User: SYSDBA
> SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;
> Statement failed, SQLCODE = -902
> Access to UDF/BLOB-filter module "uuidlib" is denied by server administrator
> SQL> exit;
еще не проверял у себя, но думаю надо разрешить доступ к external functions в firebird.conf
хотя с FB я пока не очень дружу...
Comment 2 solo 2008-10-01 19:09:25 MSD
(In reply to comment #1)
...
> еще не проверял у себя, но думаю надо разрешить доступ к external functions в firebird.conf
> хотя с FB я пока не очень дружу...

  Возможно, но я непонимаю как это сделать.

PS: Больше всего меня настараживает необходимость наличия uuidlib.so и uuidlib в UDF/ -- как-то оно подозрительно выглядит.

Comment 3 Boris Savelev 2008-10-01 20:18:39 MSD
> PS: Больше всего меня настараживает необходимость наличия uuidlib.so и uuidlib в UDF/ --
> как-то оно подозрительно выглядит.

потому что UDF -- это User-Defined Function (UDF) ?-)

попробуйте
#UdfAccess = Restrict UDF
поменять на
UdfAccess = Full UDF
Comment 4 solo 2008-10-01 20:42:54 MSD
(In reply to comment #3)
> > PS: Больше всего меня настараживает необходимость наличия uuidlib.so и uuidlib в UDF/ --
> > как-то оно подозрительно выглядит.
> 
> потому что UDF -- это User-Defined Function (UDF) ?-)

  Какя связь?

  Судя по найденым ссылкам и по коду makefile (см. https://bugzilla.altlinux.org/attachment.cgi?id=2966) для win файл с функциями должен называться <имя>.dll, а для linux -- просто <имя>... Требование называть файл <имя>.so -- я понимаю, а требования иметь идентичные <имя> и <имя>.so -- уже нет.

> 
> попробуйте
> #UdfAccess = Restrict UDF
> поменять на
> UdfAccess = Full UDF

  Так наблюдаю:

$ fbsql.superserver -u SYSDBA -p masterkey localhost:/var/lib/firebird/example_db.fdb
Database:  localhost:/var/lib/firebird/example_db.fdb, User: SYSDBA
SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;
Statement failed, SQLCODE = -104
invalid request BLR at offset 73
-function GUID_CREATE is not defined
-module name or entrypoint could not be found
SQL> exit;

  Указание полного пути а библиотеке

$ sudo -H sed -i 's:uuidlib:/usr/lib64/firebird/UDF/uuidlib:' /usr/lib64/firebird/UDF/uuidUDF.sql

непомогло...
Comment 5 Boris Savelev 2008-10-01 21:12:15 MSD
(In reply to comment #4)
> $ fbsql.superserver -u SYSDBA -p masterkey localhost:/var/lib/firebird/example_db.fdb
> Database:  localhost:/var/lib/firebird/example_db.fdb, User: SYSDBA
> SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;
> Statement failed, SQLCODE = -104
> invalid request BLR at offset 73
> -function GUID_CREATE is not defined
> -module name or entrypoint could not be found
> SQL> exit;
> 
по аналогии с PgSQL: надо выполнить SQL конкретного UDF для конкретной базы.
как это сделать в FB, не подскажу.
Смысл в том, что в базе не присутствуют SQL-функции из uuidUDF.sql, описанные в библиотеке uuidlib.
Comment 6 solo 2008-10-01 21:32:51 MSD
(In reply to comment #5)
> (In reply to comment #4)
> > $ fbsql.superserver -u SYSDBA -p masterkey localhost:/var/lib/firebird/example_db.fdb
> > Database:  localhost:/var/lib/firebird/example_db.fdb, User: SYSDBA
> > SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;
> > Statement failed, SQLCODE = -104
> > invalid request BLR at offset 73
> > -function GUID_CREATE is not defined
> > -module name or entrypoint could not be found
> > SQL> exit;
> > 
> по аналогии с PgSQL: надо выполнить SQL конкретного UDF для конкретной базы.
> как это сделать в FB, не подскажу.
> Смысл в том, что в базе не присутствуют SQL-функции из uuidUDF.sql, описанные в
> библиотеке uuidlib.

  Но в конфигурации по умолчанию (при закоментированной/раскоментированной строке с UdfAccess = Restrict UDF) он похоже выполняется, т. к. ругонь идёт именно на модуль uuidlib, а не на функцию его содержащую...
Comment 7 Boris Savelev 2008-10-01 21:51:22 MSD
>   Но в конфигурации по умолчанию (при закоментированной/раскоментированной
> строке с UdfAccess = Restrict UDF) он похоже выполняется, т. к. ругонь идёт именно на
> модуль uuidlib, а не на функцию его содержащую...
> 
Access to UDF/BLOB-filter module "uuidlib" is denied by server administrator
тут явно дело в правах-) когда все разрешили всплыла ошибка
мне кажется логично... а есть какой-нибудь модуль, который известно как подключается и 100% работает?-))
Comment 8 solo 2008-10-01 22:31:10 MSD
(In reply to comment #7)
> >   Но в конфигурации по умолчанию (при закоментированной/раскоментированной
> > строке с UdfAccess = Restrict UDF) он похоже выполняется, т. к. ругонь идёт именно на
> > модуль uuidlib, а не на функцию его содержащую...
> > 
> Access to UDF/BLOB-filter module "uuidlib" is denied by server administrator
> тут явно дело в правах-)

  Похоже... Но в каких именно, и где именно настраивающихся -- я не знаю.

> когда все разрешили всплыла ошибка
> мне кажется логично... а есть какой-нибудь модуль, который известно как
> подключается и 100% работает?-))

  Мне -- нет.

PS: Я с firebird`ом первый раз столкнулся (заказчику нежно базу под ним для специфической системы создать).
Comment 9 Boris Savelev 2008-10-01 22:42:57 MSD
ок. тогда я буду пытаться разбираться. завтра расскажу о достигнутом
Comment 10 Boris Savelev 2008-10-04 11:04:26 MSD
Что получилось у меня
Как мне кажется первое что надо сделать это инициализировать SQL функции
fbsql.superserver -u SYSDBA -p masterkey localhost:test
Database:  localhost:test, User: SYSDBA
SQL> DECLARE EXTERNAL FUNCTION UUID_CREATE
CON>   CSTRING(22)
CON>   RETURNS PARAMETER 1
CON>   ENTRY_POINT 'fn_uuid_create' MODULE_NAME 'uuidlib';
SQL> DECLARE EXTERNAL FUNCTION GUID_CREATE
CON>   CSTRING(36)
CON>   RETURNS PARAMETER 1
CON>   ENTRY_POINT 'fn_guid_create' MODULE_NAME 'uuidlib';
SQL> DECLARE EXTERNAL FUNCTION UUID_TO_GUID
CON>   CSTRING(22)
CON>   CSTRING(36)
CON>   RETURNS PARAMETER 2
CON>   ENTRY_POINT 'fn_expand_uuid' MODULE_NAME 'uuidlib';
Statement failed, SQLCODE = -104
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 3, column 3
-CSTRING

Это подозрительно, но ладно-)
SQL> show function GUID_CREATE;

Function GUID_CREATE:
Function library is uuidlib
Entry point is fn_guid_create
Returns  CSTRING(36) CHARACTER SET NONE
функция есть.

Второе пробовать их использовать
SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;
Statement failed, SQLCODE = -104
invalid request BLR at offset 73
-function GUID_CREATE is not defined
-module name or entrypoint could not be found
вот тут я пока не знаю что делать-(
советы такие:
Have you put rfunc.dll in correct subdirectory ?
Has Firebird allowed access to this directory (in firebird.conf) ?
Have you used correct entrypoint names (they are case sensitive) ?
Have you verified that Firebird is really trying open correct dll (e.g. using FileMon from Sysinternals tools) ?
Comment 11 solo 2008-10-05 05:00:03 MSD
Вот что получилось у меня...

Исходные данные:

1. sudo -H rm -f /usr/lib64/firebird/UDF/uuidUDF.sql (для исключения конфликтов)

2. UdfAccess = Full UDF в /etc/firebird/firebird.conf

$ fbsql.superserver -u SYSDBA -p masterkey localhost:/var/lib/firebird/example_db.fdb
Database:  localhost:/var/lib/firebird/example_db.fdb, User: SYSDBA
SQL> show function ;
There are no user-defined functions in this database
SQL> DECLARE EXTERNAL FUNCTION GUID_CREATE
CON>   CSTRING(36)
CON>   RETURNS PARAMETER 1
CON>   ENTRY_POINT 'fn_guid_create' MODULE_NAME '/usr/lib64/firebird/UDF/uuidlib';
SQL> show function ;
       GUID_CREATE                     
SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;
Statement failed, SQLCODE = -902
Access to UDF/BLOB-filter module "/usr/lib64/firebird/UDF/uuidlib" is denied by server administrator
SQL> DROP EXTERNAL FUNCTION GUID_CREATE;
SQL> show function ;
There are no user-defined functions in this database
SQL> DECLARE EXTERNAL FUNCTION GUID_CREATE
CON>   CSTRING(36)
CON>   RETURNS PARAMETER 1
CON>   ENTRY_POINT 'fn_guid_create' MODULE_NAME 'uuidlib';
SQL> show function ;
       GUID_CREATE                     
SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;
Statement failed, SQLCODE = -104
invalid request BLR at offset 73
-function GUID_CREATE is not defined
-module name or entrypoint could not be found
SQL> exit;

Неполучилось... Выставляю UdfAccess = Restrict UDF и перезапускаю сервер:

$ fbsql.superserver -u SYSDBA -p masterkey localhost:/var/lib/firebird/example_db.fdb
Database:  localhost:/var/lib/firebird/example_db.fdb, User: SYSDBA
SQL> show function ;
       GUID_CREATE                     
SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;
Statement failed, SQLCODE = -902
Access to UDF/BLOB-filter module "uuidlib" is denied by server administrator
SQL> DROP EXTERNAL FUNCTION GUID_CREATE;
SQL> show function ;
There are no user-defined functions in this database
SQL> DECLARE EXTERNAL FUNCTION GUID_CREATE
CON>   CSTRING(36)
CON>   RETURNS PARAMETER 1
CON>   ENTRY_POINT 'fn_guid_create' MODULE_NAME '/usr/lib64/firebird/UDF/uuidlib';
SQL> show function ;
       GUID_CREATE                     
SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;
Statement failed, SQLCODE = -902
Access to UDF/BLOB-filter module "/usr/lib64/firebird/UDF/uuidlib" is denied by server administrator
SQL> exit;
Comment 12 Boris Savelev 2008-10-05 12:00:59 MSD
> Неполучилось... Выставляю UdfAccess = Restrict UDF и перезапускаю сервер:
вот тут я обманул.
надо
UdfAccess = Full
для проверки (разрешает использовать UDF в любом месте)

UdfAccess = Restrict UDF
этот вариант в теории разрешает использовать UDF из директории FBROOT/UDF
Comment 13 solo 2008-10-06 15:25:55 MSD
(In reply to comment #12)
> > Неполучилось... Выставляю UdfAccess = Restrict UDF и перезапускаю сервер:
> вот тут я обманул.
> надо
> UdfAccess = Full
> для проверки (разрешает использовать UDF в любом месте)

  Не исключено, что не всё в порядке с данной библиотекой (выстовлено UdfAccess = Full):

$ fbsql.superserver -u SYSDBA -p masterkey localhost:/var/lib/firebird/example_db.fdb
Database:  localhost:/var/lib/firebird/example_db.fdb, User: SYSDBA
SQL> show function;
       GUID_CREATE                     
SQL> DROP EXTERNAL FUNCTION GUID_CREATE;
SQL> DECLARE EXTERNAL FUNCTION GUID_CREATE
CON>   CSTRING(36)
CON>   RETURNS PARAMETER 1
CON>   ENTRY_POINT 'fn_guid_create' MODULE_NAME '/usr/lib64/firebird/UDF/uuidlib';
SQL> show function GUID_CREATE;

Function GUID_CREATE:
Function library is /usr/lib64/firebird/UDF/uuidlib
Entry point is fn_guid_create
Returns  CSTRING(36) CHARACTER SET NONE
SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;

CONCATENATION                          
====================================== 
Statement failed, SQLCODE = -902
Unable to complete network request to host "localhost".
-Error reading data from the connection.
SQL> DROP EXTERNAL FUNCTION GUID_CREATE;
Statement failed, SQLCODE = -902
Unable to complete network request to host "localhost".
-Error reading data from the connection.
SQL> exit;
Statement failed, SQLCODE = -902
Unable to complete network request to host "localhost".
-Error writing data to the connection.
-Broken pipe
Statement failed, SQLCODE = -902
Unable to complete network request to host "localhost".
-Error writing data to the connection.
-Broken pipe

  Вторая попытка:

$ fbsql.superserver -u SYSDBA -p masterkey localhost:/var/lib/firebird/example_db.fdb
Database:  localhost:/var/lib/firebird/example_db.fdb, User: SYSDBA
SQL> show function GUID_CREATE;

Function GUID_CREATE:
Function library is /usr/lib64/firebird/UDF/uuidlib
Entry point is fn_guid_create
Returns  CSTRING(36) CHARACTER SET NONE
SQL> DROP EXTERNAL FUNCTION GUID_CREATE;
SQL> DECLARE EXTERNAL FUNCTION GUID_CREATE
CON>   CSTRING(36)
CON>   RETURNS PARAMETER 1
CON>   ENTRY_POINT 'fn_guid_create' MODULE_NAME '/usr/lib64/firebird/UDF/uuidlib.so';
SQL> show function GUID_CREATE;

Function GUID_CREATE:
Function library is /usr/lib64/firebird/UDF/uuidlib.so
Entry point is fn_guid_create
Returns  CSTRING(36) CHARACTER SET NONE
SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;

CONCATENATION                          
====================================== 
Statement failed, SQLCODE = -902
Unable to complete network request to host "localhost".
-Error reading data from the connection.
SQL> show function GUID_CREATE;
Statement failed, SQLCODE = -902
Unable to complete network request to host "localhost".
-Error reading data from the connection.
SQL> exit;
Statement failed, SQLCODE = -902
Unable to complete network request to host "localhost".
-Error writing data to the connection.
-Broken pipe
Statement failed, SQLCODE = -902
Unable to complete network request to host "localhost".
-Error writing data to the connection.
-Broken pipe

  При этом в /var/log/firebird/firebird.log:

xxx.lan (Client)   Mon Oct  6 15:19:56 2008
        /usr/lib64/firebird/../../../usr/bin/fbguard: /usr/lib64/firebird/../../../usr/bin/fbserver terminated abnormally (-1)


xxx.lan (Client)   Mon Oct  6 15:19:56 2008
        /usr/lib64/firebird/../../../usr/bin/fbguard: guardian starting ../../../usr/bin/fbserver

  Можно ли добиться от сервера болие внятной диогностики?
Comment 14 Boris Savelev 2008-10-06 16:05:24 MSD
большей информативности мне добится не удалось
strace -p<pid>
-)
ps: что на счет провайда для mod_php5?
Comment 15 solo 2008-10-06 16:57:12 MSD
(In reply to comment #14)
> большей информативности мне добится не удалось
> strace -p<pid>
> -)
> ps: что на счет провайда для mod_php5?

  В работе: до конца недели думаю будет.
Comment 16 solo 2008-10-06 17:17:06 MSD
  Похоже дело в самой uuidlibv12. Сделал успешную попытку заменить её на FreeadhocUDF (http://www.udf.adhoc-data.de/index_eng.html):

1. Выкачал ftp://ftp.adhoc-data.de/FreeAdhocUDF/adhoc20080303/source/FreeAdhocUDFsource20080303.tar.gz

2. Собрал (Makefile пришлось править)

3. sudo -H ln -f FreeAdhocUDF_fb2x64.so /usr/lib64/firebird/UDF/FreeAdhocUDF.so

  Установил UdfAccess = Restrict UDF и перезапустил сервер.

$ fbsql.superserver -u SYSDBA -p masterkey localhost:/var/lib/firebird/example_db.fdb
Database:  localhost:/var/lib/firebird/example_db.fdb, User: SYSDBA
SQL> DROP EXTERNAL FUNCTION GUID_CREATE;
SQL> DECLARE EXTERNAL FUNCTION GUID_CREATE
CON>   RETURNS CSTRING(36) FREE_IT
CON>   ENTRY_POINT 'uuid4' MODULE_NAME 'FreeAdhocUDF';
SQL> select  '{' || UPPER(GUID_CREATE()) || '}' from rdb$database;

CONCATENATION                          
====================================== 
{35917C9C-B7EC-4B7B-AAF3-F8247A65ECDE} 

SQL> exit;


Comment 17 Boris Savelev 2008-10-06 17:22:27 MSD
тогда не бага
Comment 18 solo 2008-10-06 17:43:47 MSD
(In reply to comment #17)
> тогда не бага
 
  Да

Comment 19 solo 2008-10-06 19:00:28 MSD
  Возможная причина неработоспасобности uuidlib -- отсутстаие определения переменных окружения TMP/TEMP для пользователя firebird (см. http://tech.groups.yahoo.com/group/firebird-support/message/93932).

  Различия по коду данные переменные использующему:

1. файл uuid.c у uuidlib (та, что валится):

...
char * tmp = getenv("TMP");
if (!tmp) {
    tmp = getenv("TEMP");
}
char * tmpStr;
tmpStr = (char *) malloc(strlen(tmp) + 20);
...

2. файл uuid.c у FreeAdhocUDF (та, что работает):

...
char *tmpStr;
char *tmp = getenv("TMP");
if (!tmp) {
    tmp = getenv("TEMP");
    if (!tmp) {
        tmp = "/tmp";
    }
}
tmpStr = (char *) malloc(strlen(tmp) + 20);
...