Страница 1 из 3

UDF для FireBird 1.5 i 2.0

Добавлено: 09 янв 2007, 12:12
SkyFox
UDF написаны на C, столкнулся с проблемой.
Ранее откомпилированный UDF работали под FireBird 1.5, на 2.0 - база падает.
переделал malloc на ib_util_malloc с include ib_util.h
откомпилировал под форточками на VC 6.0 - работает на FB 1.5 и FB 2.0

Теперь проблема под Linux и FreeBSD, UDF компилится:
gcc udf_name.c -shared -fPIC -o udf_name.so -I/usr/local/firebird/include -I/usr/local/firebird/lib

ошибок нет, UDF не работает.

Надо компилить с другими ключами?

Добавлено: 09 янв 2007, 12:34
kdv
UDF не работает.
как именно не работает?

Добавлено: 09 янв 2007, 12:55
SkyFox
рушится, где используется ib_util_malloc ,
есть предположение, что он не подключить ib_util_malloc

Добавлено: 09 янв 2007, 14:14
Dimitry Sibiryakov
А libib_util.so есть в путях ld (или как там зовется линуховый лоадер)?

Re: UDF для FireBird 1.5 i 2.0

Добавлено: 15 янв 2007, 12:37
Зореслав Гораль
SkyFox писал(а): переделал malloc на ib_util_malloc с include ib_util.h
А можна подробнее о malloc? А то у меня такая же проблема. FireBird2 просто теряет конект если идет запрос с полем, которое использует UDF. На Delphi для Firebird1.5 я делал так: function malloc(Size: Integer): Pointer; cdecl; external 'msvcrt.dll';

Re: UDF для FireBird 1.5 i 2.0

Добавлено: 15 янв 2007, 12:48
CyberMax
Зореслав Гораль писал(а):А можна подробнее о malloc?
http://forum.ibase.ru/phpBB2/viewtopic.php?t=2495
Остальное ищи через поисковики.

Re: UDF для FireBird 1.5 i 2.0

Добавлено: 15 янв 2007, 13:29
Dimitry Sibiryakov
Зореслав Гораль писал(а):external 'msvcrt.dll';
FB2 использует совсем другой malloc потому как собирается другим компилятором.

Добавлено: 16 янв 2007, 16:54
SkyFox
www (Client) Tue Jan 16 15:46:30 2007
/opt/firebird/bin/fbguard: bin/fbserver terminated abnormally (127)

падает, хоть тресни :(

Добавлено: 16 янв 2007, 17:02
SkyFox
Dimitry Sibiryakov писал(а):А libib_util.so есть в путях ld (или как там зовется линуховый лоадер)?
/opt/firebird/lib/libib_util.so

Добавлено: 16 янв 2007, 17:21
kdv
может функция "того"? очень часто бывает когда кривая функция в определенных условиях работает, и даже возвращает результат. Когда условия меняются - сервер начинает падать при вызове такой функции.

Добавлено: 16 янв 2007, 18:14
SkyFox
kdv писал(а):может функция "того"? очень часто бывает когда кривая функция в определенных условиях работает, и даже возвращает результат. Когда условия меняются - сервер начинает падать при вызове такой функции.

под Windows, на FB 1.5 и FB 2.0 работает!

нашел, может это:

Bug # 750659
fixed by Nickolay Samofatov
(1.5.1) The wrong soname for libib_util.so caused warnings in ldconfig and also meant that it
could not be loaded automatically by external function libraries using calls to ib_util_malloc().
That made such libraries unusable, unless a PRELOAD environment setting was added for fbserver/fb_inet_server.

Добавлено: 16 янв 2007, 18:39
kdv
"это" - это про то, что ib_util вообще не грузилась на линуксе.
А следовательно, и udf не работали, совсем. А не работали но приводили к падению на сервере.
под Windows, на FB 1.5 и FB 2.0 работает!
ну вот фиг знает. буквально на прошлой неделе было в саппорте, что люди перешли на более новую версию линукса на новой машине, и сервак стал падать. Нашли кривую udf.

Добавлено: 17 янв 2007, 11:38
SkyFox
меняю ib_util_malloc на malloc - компилирую udf сразу работает под Linux, проблем нет.

Добавлено: 17 янв 2007, 12:04
WildSery
SkyFox писал(а):меняю ib_util_malloc на malloc - компилирую udf сразу работает под Linux, проблем нет.
Это ещё не означает, что udf написана правильно, а только то, что сервер не скрючивает от такого распределения памяти.
rFunc у меня работает под линуксом с ib_util_malloc, проблем нет.

Добавлено: 17 янв 2007, 12:08
SkyFox
test.c

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

 
#include <stdio.h>
#include <stdlib.h>
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
#  include <sys/time.h>
# else
#  include <time.h>
# endif
#endif

#include <string.h>
#include <math.h>
#include <ibase.h>
#include "example.h"

#include "ib_util.h"

#ifdef  CPU386  /* Fast assembler version exists for 386/486 */
#pragma inline
#endif

char* EXPORT TEST_replace(char *source, char *replace_this, char *replacement){
  char *result = NULL;
  result = (char *)ib_util_malloc(strlen(source)+1);
  result=strcpy(result, source);
  *(result+strlen(source))='\0';
  return result;

}

main(){
}
 
test.def

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

IBRARY         test
DESCRIPTION     'test.dll'
DATA    READ WRITE
EXPORTS
    TEST_replace




Добавлено: 17 янв 2007, 12:45
Dimitry Sibiryakov
А теперь и объявление ее в базе - в студию!!!

Добавлено: 17 янв 2007, 12:58
SkyFox

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

DECLARE EXTERNAL FUNCTION REPLACEME
    CSTRING(5000) CHARACTER SET NONE,
    CSTRING(200) CHARACTER SET NONE,
    CSTRING(200) CHARACTER SET NONE
RETURNS CSTRING(5000) FREE_IT
ENTRY_POINT 'TEST_replace' MODULE_NAME 'test'


Добавлено: 17 янв 2007, 13:09
WildSery
Почему в коде нет EXPORT и зачем в объявлении CHARACTER SET NONE?

Добавлено: 17 янв 2007, 13:21
SkyFox
WildSery писал(а):Почему в коде нет EXPORT и зачем в объявлении CHARACTER SET NONE?
комманду для компилятора написать? :)

gcc test.c -shared -fPIC -o test.so -I/opt/firebird/include -I/opt/firebird/examples -I/opt/firebird/lib

Добавлено: 17 янв 2007, 13:25
kdv
может еще все функции выложить из кода?
может тебе еще и функцию удаленно поотлаживать?
ты не выпендривайся, а на вопросы отвечай.