Help encode_timestamp/decode_timestamp

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

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

s
Сообщения: 12
Зарегистрирован: 05 апр 2008, 05:35

Help encode_timestamp/decode_timestamp

Сообщение s » 07 апр 2008, 09:05

Os ALTLinux.
Пишу UDF для работы со временем.
Во FreeBsd - все работает без проблем(Firebird 1.53).
В linux FirebirdSS2.0.3 вообще не работает - идет мгновенный дисконнект.
В FirebirdCS1.55- все работает.
FirebirdCS2.0.3 работает только с передаваемыми переменными,
т.е. даю к примеру myfunc(int,timestamp) isc_encode_timestamp ссылается на входной timestamp и его же возвращаю - работает.
Если же isc_encode делать с локальной переменной либо выделять память через MALLOC не работает ни в какую.
Возврат параметра timestamp by references.
И почему в SS вообще нельзя передать timestamp,date,time?
Где грабли?

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Сообщение Tonal » 07 апр 2008, 10:54

Минимальный исходник нужон однако. :-)

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

Сообщение kdv » 07 апр 2008, 11:05

Возврат параметра timestamp by references.
а это зачем?

s
Сообщения: 12
Зарегистрирован: 05 апр 2008, 05:35

Сообщение s » 07 апр 2008, 11:54

kdv писал(а):
Возврат параметра timestamp by references.
а это зачем?
А как еще вернуть результат в Firebird, если он не число?

Вот это работает на CS
/************************************/
ISC_TIMESTAMP * unix_date(unix_dt,udt)
long *unix_dt;
ISC_TIMESTAMP *udt;
{
struct tm *t;
t=gmtime(unix_dt);
isc_encode_timestamp(t, udt);
return udt;
}

А вот это только на CS1.55
/***********************************/
ISC_TIMESTAMP * unix_date(unix_dt)
long *unix_dt;
{
ISC_TIMESTAMP *udt;
struct tm *t;
t=gmtime(unix_dt);
isc_encode_timestamp(t, udt);
return udt;
}

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

Сообщение kdv » 07 апр 2008, 16:18

1. C не люблю
2. вместе с функцией надо приводить и ее декларацию в sql.

s
Сообщения: 12
Зарегистрирован: 05 апр 2008, 05:35

Сообщение s » 07 апр 2008, 17:32

kdv писал(а):1. C не люблю
2. вместе с функцией надо приводить и ее декларацию в sql.
в первом случае
------------------------------------------------------
DECLARE EXTERNAL FUNCTION UNIXTODATE
INTEGER,TIMESTAMP
RETURNS TIMESTAMP
ENTRY_POINT 'unix_date' MODULE_NAME 'proc6';
----------------------------------------------------------
во втором случае
DECLARE EXTERNAL FUNCTION UNIXTODATE
INTEGER
RETURNS TIMESTAMP
ENTRY_POINT 'unix_date' MODULE_NAME 'proc6';

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

Сообщение kdv » 07 апр 2008, 17:38


s
Сообщения: 12
Зарегистрирован: 05 апр 2008, 05:35

Сообщение s » 07 апр 2008, 18:25

kdv писал(а):www.ibase.ru/devinfo/udf_ok.htm ?
И к к чему это?
Там что написано как научиться писать udf за 21 минуту в линуксе на firebird2....?
Я это уже прочел и по диагонали.
В начале же написано в FreeBsd под CS и в линуксе CS1.55 все работает пучком.
А так носом ткните где там написано что я не прав.

s
Сообщения: 12
Зарегистрирован: 05 апр 2008, 05:35

Сообщение s » 07 апр 2008, 18:50

kdv писал(а):www.ibase.ru/devinfo/udf_ok.htm ?
Кстати я начинал с открытого исходника FreeUDFLib.
Так вот он тоже не работает с SS и CS2...
А с CS1.5.. OK!!!

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 07 апр 2008, 19:22

s писал(а):
kdv писал(а):www.ibase.ru/devinfo/udf_ok.htm ?
И к к чему это?
Там что написано как научиться писать udf за 21 минуту в линуксе на firebird2....?
Я это уже прочел и по диагонали.
В начале же написано в FreeBsd под CS и в линуксе CS1.55 все работает пучком.
А так носом ткните где там написано что я не прав.
Скока платишь за обучение азам C ? А то выёживаться все горазды...

s
Сообщения: 12
Зарегистрирован: 05 апр 2008, 05:35

Сообщение s » 07 апр 2008, 19:48

hvlad писал(а):
s писал(а):
kdv писал(а):www.ibase.ru/devinfo/udf_ok.htm ?
И к к чему это?
Там что написано как научиться писать udf за 21 минуту в линуксе на firebird2....?
Я это уже прочел и по диагонали.
В начале же написано в FreeBsd под CS и в линуксе CS1.55 все работает пучком.
А так носом ткните где там написано что я не прав.
Скока платишь за обучение азам C ? А то выёживаться все горазды...
Нискока!
Я обошелся без timestamp.
Использовал UnixTime.
И чтоже это за азы такие?
И вообще-то хотелось ответа по существу.А то выёживаться все горазды...

dostap
Сообщения: 14
Зарегистрирован: 23 фев 2008, 13:30

Сообщение dostap » 09 апр 2008, 10:27

Если тема не закрыта внесу свой 30 сребренников...

В обоих случаях проблема неинициализированного указателя.

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

SC_TIMESTAMP * unix_date(unix_dt) 
long *unix_dt; 
{ 
ISC_TIMESTAMP * udt; // Куда указывает указатель? Неизвестно
// Надо  указатель проинициализировать
// ну хотябы так 
static ISC_TIMESTAMP instance_udt;
udt = & instance_udt;
/*Так будет работать везде но не потокобезопасное решение*/
struct tm *t; 
t=gmtime(unix_dt); 
isc_encode_timestamp(t, udt); 
return udt; 
}
Не плохо бы почитать K&R для начала

s
Сообщения: 12
Зарегистрирован: 05 апр 2008, 05:35

Сообщение s » 11 апр 2008, 11:26

dostap писал(а):Если тема не закрыта внесу свой 30 сребренников...

В обоих случаях проблема неинициализированного указателя.

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

SC_TIMESTAMP * unix_date(unix_dt) 
long *unix_dt; 
{ 
ISC_TIMESTAMP * udt; // Куда указывает указатель? Неизвестно
// Надо  указатель проинициализировать
// ну хотябы так 
static ISC_TIMESTAMP instance_udt;
udt = & instance_udt;
/*Так будет работать везде но не потокобезопасное решение*/
struct tm *t; 
t=gmtime(unix_dt); 
isc_encode_timestamp(t, udt); 
return udt; 
}
Не плохо бы почитать K&R для начала
Спасибо!
Но всеравно это работает только в ClassicServer.
В Superserver не работает.
Причем выплнение функции на одном компьютере вызывает разрыв всех клиентов на других компьютерах :(

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 11 апр 2008, 15:48

s писал(а): Но всеравно это работает только в ClassicServer.
так тебе сказали что это не потокобезопасное решение
s писал(а): Причем выплнение функции на одном компьютере вызывает разрыв всех клиентов на других компьютерах :(
как все запущено =) злобный птиц конектится к другим машинам и перерезает глотку другим конектам =)

s
Сообщения: 12
Зарегистрирован: 05 апр 2008, 05:35

Сообщение s » 11 апр 2008, 16:30

Attid писал(а):
s писал(а): Но всеравно это работает только в ClassicServer.
так тебе сказали что это не потокобезопасное решение
s писал(а): Причем выплнение функции на одном компьютере вызывает разрыв всех клиентов на других компьютерах :(
как все запущено =) злобный птиц конектится к другим машинам и перерезает глотку другим конектам =)
Я может не правильно понял потоко-безопасность.
Если одновременно к этой функции обратятся более одного потока это может вызвать сбой.
Если этот поток один,он должен выполниться?
К этой функции обращается только один клиент.
Или в SS никак вернуть либо взять параметр TIMESTAMP,DATE,TIME из/в функцию нельзя?

s
Сообщения: 12
Зарегистрирован: 05 апр 2008, 05:35

Сообщение s » 13 апр 2008, 00:51

s писал(а):
Attid писал(а):
s писал(а): Но всеравно это работает только в ClassicServer.
так тебе сказали что это не потокобезопасное решение
s писал(а):
Я может не правильно понял потоко-безопасность.
Если одновременно к этой функции обратятся более одного потока это может вызвать сбой.
Если этот поток один,он должен выполниться?
К этой функции обращается только один клиент.
Или в SS никак вернуть либо взять параметр TIMESTAMP,DATE,TIME из/в функцию нельзя?
Я чувствую вопрос повис в воздухе?
Не умные не знают а умные спрашивают Скока?
Я уже выделил память через ib_util_malloc.
В CS все прерасно работает, ф в SS йок. :(
Даже смешно:не работает не только с возвращаемым параметром,но и с входным параметром тоже не работает.
Может isc_decode_timestamp тоже не thread-save?
Тогда как это работает в WIN на SS?(udf на Delphi); или всеже дело в AltLinux? :? А не SuperServerе

s
Сообщения: 12
Зарегистрирован: 05 апр 2008, 05:35

Сообщение s » 13 апр 2008, 02:49

Всё работает! :D

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 13 апр 2008, 02:51

s писал(а):Я чувствую вопрос повис в воздухе?
Не умные не знают а умные спрашивают Скока?
Для того, чтобы тебе помогли, нужно вести себя так, чтобы хотелось тебе помочь...
Тем более, когда вопрос элементарный и разжёван многократно

s
Сообщения: 12
Зарегистрирован: 05 апр 2008, 05:35

Сообщение s » 13 апр 2008, 03:12

hvlad писал(а):
s писал(а):Я чувствую вопрос повис в воздухе?
Не умные не знают а умные спрашивают Скока?
Для того, чтобы тебе помогли, нужно вести себя так, чтобы хотелось тебе помочь...
Тем более, когда вопрос элементарный и разжёван многократно
А как я себя вёл?
До вашего поста я только спрашивал.
А на ваш пост ответил взаимообразно(Мне давно уже не 15 лет).
Я никогда никому не хамлю, но обидно когда вместо помощи,тем более когда вопрос элементарный, получаешь вместо ответа поучения.
Так что прости если что не так.
Но для меня он (вопрос) решился только при компиляции udf под виндоус.
Линукс глотал безропотно но не работал а вин сразу ткнул меня носом.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 13 апр 2008, 11:12

А как я себя вёл?
Тебе показали, что читать, ты начал рассказывать про диагонали и про ткните носом. Ткнули. Не понравилось. Ещё вопросы есть ?
обидно когда вместо помощи,тем более когда вопрос элементарный, получаешь вместо ответа поучения.
Здесь не то место, где будут расказывать что 2х2==4 и что указатели не должны указывать в никуда.
Линукс глотал безропотно но не работал а вин сразу ткнул меня носом.
Только совершенно безграмотный человек не отличает компилятор от ОС.

Ответить