UDF для FireBird 1.5 i 2.0

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

SkyFox
Сообщения: 23
Зарегистрирован: 21 ноя 2006, 11:57

UDF для FireBird 1.5 i 2.0

Сообщение SkyFox » 09 янв 2007, 12:12

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 не работает.

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

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

Сообщение kdv » 09 янв 2007, 12:34

UDF не работает.
как именно не работает?

SkyFox
Сообщения: 23
Зарегистрирован: 21 ноя 2006, 11:57

Сообщение SkyFox » 09 янв 2007, 12:55

рушится, где используется ib_util_malloc ,
есть предположение, что он не подключить ib_util_malloc

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 09 янв 2007, 14:14

А libib_util.so есть в путях ld (или как там зовется линуховый лоадер)?

Зореслав Гораль
Сообщения: 1
Зарегистрирован: 15 янв 2007, 12:15

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';

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Re: UDF для FireBird 1.5 i 2.0

Сообщение CyberMax » 15 янв 2007, 12:48

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

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Re: UDF для FireBird 1.5 i 2.0

Сообщение Dimitry Sibiryakov » 15 янв 2007, 13:29

Зореслав Гораль писал(а):external 'msvcrt.dll';
FB2 использует совсем другой malloc потому как собирается другим компилятором.

SkyFox
Сообщения: 23
Зарегистрирован: 21 ноя 2006, 11:57

Сообщение SkyFox » 16 янв 2007, 16:54

www (Client) Tue Jan 16 15:46:30 2007
/opt/firebird/bin/fbguard: bin/fbserver terminated abnormally (127)

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

SkyFox
Сообщения: 23
Зарегистрирован: 21 ноя 2006, 11:57

Сообщение SkyFox » 16 янв 2007, 17:02

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

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

Сообщение kdv » 16 янв 2007, 17:21

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

SkyFox
Сообщения: 23
Зарегистрирован: 21 ноя 2006, 11:57

Сообщение SkyFox » 16 янв 2007, 18:14

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.

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

Сообщение kdv » 16 янв 2007, 18:39

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

SkyFox
Сообщения: 23
Зарегистрирован: 21 ноя 2006, 11:57

Сообщение SkyFox » 17 янв 2007, 11:38

меняю ib_util_malloc на malloc - компилирую udf сразу работает под Linux, проблем нет.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 17 янв 2007, 12:04

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

SkyFox
Сообщения: 23
Зарегистрирован: 21 ноя 2006, 11:57

Сообщение SkyFox » 17 янв 2007, 12:08

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



Последний раз редактировалось SkyFox 26 янв 2007, 10:33, всего редактировалось 4 раза.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 17 янв 2007, 12:45

А теперь и объявление ее в базе - в студию!!!

SkyFox
Сообщения: 23
Зарегистрирован: 21 ноя 2006, 11:57

Сообщение SkyFox » 17 янв 2007, 12:58

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

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'

Последний раз редактировалось SkyFox 17 янв 2007, 16:22, всего редактировалось 1 раз.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 17 янв 2007, 13:09

Почему в коде нет EXPORT и зачем в объявлении CHARACTER SET NONE?

SkyFox
Сообщения: 23
Зарегистрирован: 21 ноя 2006, 11:57

Сообщение SkyFox » 17 янв 2007, 13:21

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
Последний раз редактировалось SkyFox 17 янв 2007, 16:23, всего редактировалось 1 раз.

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

Сообщение kdv » 17 янв 2007, 13:25

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

Ответить