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

Help encode_timestamp/decode_timestamp

Добавлено: 07 апр 2008, 09:05
s
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?
Где грабли?

Добавлено: 07 апр 2008, 10:54
Tonal
Минимальный исходник нужон однако. :-)

Добавлено: 07 апр 2008, 11:05
kdv
Возврат параметра timestamp by references.
а это зачем?

Добавлено: 07 апр 2008, 11:54
s
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;
}

Добавлено: 07 апр 2008, 16:18
kdv
1. C не люблю
2. вместе с функцией надо приводить и ее декларацию в sql.

Добавлено: 07 апр 2008, 17:32
s
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';

Добавлено: 07 апр 2008, 17:38
kdv

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

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

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

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

Добавлено: 09 апр 2008, 10:27
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 для начала

Добавлено: 11 апр 2008, 11:26
s
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 не работает.
Причем выплнение функции на одном компьютере вызывает разрыв всех клиентов на других компьютерах :(

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

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

Добавлено: 13 апр 2008, 00:51
s
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е

Добавлено: 13 апр 2008, 02:49
s
Всё работает! :D

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

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

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