Help encode_timestamp/decode_timestamp
Help encode_timestamp/decode_timestamp
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?
Где грабли?
Пишу 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?
Где грабли?
А как еще вернуть результат в Firebird, если он не число?kdv писал(а):а это зачем?Возврат параметра timestamp by references.
Вот это работает на 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 писал(а):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 писал(а):www.ibase.ru/devinfo/udf_ok.htm ?
Там что написано как научиться писать udf за 21 минуту в линуксе на firebird2....?
Я это уже прочел и по диагонали.
В начале же написано в FreeBsd под CS и в линуксе CS1.55 все работает пучком.
А так носом ткните где там написано что я не прав.
Кстати я начинал с открытого исходника FreeUDFLib.kdv писал(а):www.ibase.ru/devinfo/udf_ok.htm ?
Так вот он тоже не работает с SS и CS2...
А с CS1.5.. OK!!!
Скока платишь за обучение азам C ? А то выёживаться все горазды...s писал(а):И к к чему это?kdv писал(а):www.ibase.ru/devinfo/udf_ok.htm ?
Там что написано как научиться писать udf за 21 минуту в линуксе на firebird2....?
Я это уже прочел и по диагонали.
В начале же написано в FreeBsd под CS и в линуксе CS1.55 все работает пучком.
А так носом ткните где там написано что я не прав.
Нискока!hvlad писал(а):Скока платишь за обучение азам C ? А то выёживаться все горазды...s писал(а):И к к чему это?kdv писал(а):www.ibase.ru/devinfo/udf_ok.htm ?
Там что написано как научиться писать udf за 21 минуту в линуксе на firebird2....?
Я это уже прочел и по диагонали.
В начале же написано в FreeBsd под CS и в линуксе CS1.55 все работает пучком.
А так носом ткните где там написано что я не прав.
Я обошелся без timestamp.
Использовал UnixTime.
И чтоже это за азы такие?
И вообще-то хотелось ответа по существу.А то выёживаться все горазды...
Если тема не закрыта внесу свой 30 сребренников...
В обоих случаях проблема неинициализированного указателя.
Не плохо бы почитать K&R для начала
В обоих случаях проблема неинициализированного указателя.
Код: Выделить всё
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;
}
Спасибо!dostap писал(а):Если тема не закрыта внесу свой 30 сребренников...
В обоих случаях проблема неинициализированного указателя.Не плохо бы почитать K&R для началаКод: Выделить всё
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; }
Но всеравно это работает только в ClassicServer.
В Superserver не работает.
Причем выплнение функции на одном компьютере вызывает разрыв всех клиентов на других компьютерах
так тебе сказали что это не потокобезопасное решениеs писал(а): Но всеравно это работает только в ClassicServer.
как все запущено =) злобный птиц конектится к другим машинам и перерезает глотку другим конектам =)s писал(а): Причем выплнение функции на одном компьютере вызывает разрыв всех клиентов на других компьютерах
Я может не правильно понял потоко-безопасность.Attid писал(а):так тебе сказали что это не потокобезопасное решениеs писал(а): Но всеравно это работает только в ClassicServer.
как все запущено =) злобный птиц конектится к другим машинам и перерезает глотку другим конектам =)s писал(а): Причем выплнение функции на одном компьютере вызывает разрыв всех клиентов на других компьютерах
Если одновременно к этой функции обратятся более одного потока это может вызвать сбой.
Если этот поток один,он должен выполниться?
К этой функции обращается только один клиент.
Или в SS никак вернуть либо взять параметр TIMESTAMP,DATE,TIME из/в функцию нельзя?
Я чувствую вопрос повис в воздухе?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е
А как я себя вёл?hvlad писал(а):Для того, чтобы тебе помогли, нужно вести себя так, чтобы хотелось тебе помочь...s писал(а):Я чувствую вопрос повис в воздухе?
Не умные не знают а умные спрашивают Скока?
Тем более, когда вопрос элементарный и разжёван многократно
До вашего поста я только спрашивал.
А на ваш пост ответил взаимообразно(Мне давно уже не 15 лет).
Я никогда никому не хамлю, но обидно когда вместо помощи,тем более когда вопрос элементарный, получаешь вместо ответа поучения.
Так что прости если что не так.
Но для меня он (вопрос) решился только при компиляции udf под виндоус.
Линукс глотал безропотно но не работал а вин сразу ткнул меня носом.
Тебе показали, что читать, ты начал рассказывать про диагонали и про ткните носом. Ткнули. Не понравилось. Ещё вопросы есть ?А как я себя вёл?
Здесь не то место, где будут расказывать что 2х2==4 и что указатели не должны указывать в никуда.обидно когда вместо помощи,тем более когда вопрос элементарный, получаешь вместо ответа поучения.
Только совершенно безграмотный человек не отличает компилятор от ОС.Линукс глотал безропотно но не работал а вин сразу ткнул меня носом.