Почему Firebird при обращении к UDF закрывает соединение?!

Запросы, планы, оптимизация запросов, ...

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

Ответить
Сергей
Сообщения: 13
Зарегистрирован: 10 ноя 2004, 10:35

Почему Firebird при обращении к UDF закрывает соединение?!

Сообщение Сергей » 18 янв 2012, 00:39

Господа! Помогите разобраться.

Есть функция:

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

[user@myhost udf]$ cat str_simple.c
#include <string.h>
#include "/opt/firebird/include/ib_util.h"

char *str_simple(char *str) {

    char *result = ib_util_malloc(strlen(str) + 1);
    memcpy(result, str, strlen(str) + 1);
    return result;
}
Для сборки:

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

[user@myhost udf]$ cat makeudf 
#!/bin/bash

gcc -c -O -fpic $1.c &&
ld -G $1.o -lm -lc -o $1.so &&
rm $1.o &&
mv $1.so /opt/firebird/UDF
[user@myhost udf]$ ./makeudf  str_simple
[user@myhost udf]$
В базе функция объявлена так:

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

DECLARE EXTERNAL FUNCTION str_simple
CSTRING(256)
RETURNS CSTRING(256) FREE_IT
ENTRY_POINT 'str_simple' MODULE_NAME 'str_simple';
Дальше:

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

[user@myhost database]$ /opt/firebird/bin/isql base.gdb -USER sysdba -PASS masterkey
Database:  base.gdb, User: sysdba
SQL> SELECT STR_SIMPLE('Текст') FROM RDB$FIELDS;

STR_SIMPLE                                                                                                                                                                                                                                                             
=============================================================================== 
Statement failed, SQLSTATE = 08006
Error reading data from the connection.
С чего вдруг закрывается соединение?

Всё это в Linux 3.1.9-2-ARCH ... x86_64 и Firebird-SuperServer 2.5.1.26351_0-4

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

Re: Почему Firebird при обращении к UDF закрывает соединение

Сообщение kdv » 18 янв 2012, 10:47

соединение закрывается потому, что функция написана криво, и сервер в результате ее вызова падает.
вы функцию пишете по какому-то образцу? например fbudf, rfunc и т.п.?

Ответить