Работа с Blob из UDF Firebird 2.5
В исходниках Firebird 2.5 есть пример fbudf.cpp В нем функция преобразования строки в Blob: FBUDF_API void string2blob(const paramdsc* v, blobcallback* outblob) Нужна обратная функция преобразования Blod в строку типа: FBUDF_API void blob2string(const blobcallback* outblob, paramdsc* v) Помогите с примером. Все мои попытки упираются в вызов EndOfBlob = inpblob->blob_get_segment(inpblob->blob_handle, text, len, res_len) который приводит к краху сервера. С уважением, Андрей Архангельский. -- View this message in context: http://firebird.1100200.n4.nabble.com/Blob-UDF-Firebird-2-5-tp2998810p2998810.html Sent from the firebird-russian mailing list archive at Nabble.com.
Re: Работа с Blob из UDF Firebird 2.5
Hello, AZDesign! AZDesign wrote: Все мои попытки упираются в вызов EndOfBlob = inpblob->blob_get_segment(inpblob->blob_handle, text, len, res_len) который приводит к краху сервера. похоже на кривое объявление blob_get_segment. Посмотри в www.ibase.ru/download/blobsaveload.zip там хоть для паскаля, но аналогию поймешь. -- Dmitri Kouzmenko, www.ibase.ru, (495) 953-13-34
Re: Работа с Blob из UDF Firebird 2.5
В письме от Mon, 18 Oct 2010 00:35:25 +0400, Dmitri Kuzmenko сообщал: Все мои попытки упираются в вызов EndOfBlob = inpblob->blob_get_segment(inpblob->blob_handle, text, len, res_len) который приводит к краху сервера. а кто выделяет и освобождает память под все эти char* ? Может у сервера и библиотеки не совпадают heap manager'ы ? -- Написано в почтовом клиенте браузера Opera: http://www.opera.com/mail/
Re: Работа с Blob из UDF Firebird 2.5
С нее и начинал. Но я тоже паскальщик, а требуется в MSVS, так как Delphi пока не дает 64-разрядный код библиотека blobsaveload опирается на определение Blob данное в fun.cpp А библиотека fbudf опирается на собственное определение typedef struct blobcallback { short (*blob_get_segment) (void* hnd, ISC_UCHAR* buffer, ISC_USHORT buf_size, ISC_USHORT* result_len); void* blob_handle; ISC_LONGblob_number_segments; ISC_LONGblob_max_segment; ISC_LONGblob_total_length; void (*blob_put_segment) (void* hnd, const ISC_UCHAR* buffer, ISC_USHORT buf_size); ISC_LONG (*blob_lseek) (void* hnd, ISC_USHORT mode, ISC_LONG offset); } *BLOBCALLBACK; #endif /* !defined(JRD_VAL_H) */ в ibase.h В чем принципиальное различие понять не могу. в любом случае спасибо, будем "колдовать" дальше -- View this message in context: http://firebird.1100200.n4.nabble.com/Blob-UDF-Firebird-2-5-tp2998810p2999582.html Sent from the firebird-russian mailing list archive at Nabble.com.
Re: Работа с Blob из UDF Firebird 2.5
Прошу прощения, (я в C++ новичок) - где и как? У меня MS VS2005 -- View this message in context: http://firebird.1100200.n4.nabble.com/Blob-UDF-Firebird-2-5-tp2998810p2999670.html Sent from the firebird-russian mailing list archive at Nabble.com.
Re: Работа с Blob из UDF Firebird 2.5
Задача не строку получить, а понять как из Blob взять содержимое и "поковыряться" в нем. Прямая функция string2blob делает очень просто - берет указатель на строку и пихает его Blob'у, сама никаких буферов (массивов) не создает. -- View this message in context: http://firebird.1100200.n4.nabble.com/Blob-UDF-Firebird-2-5-tp2998810p2999672.html Sent from the firebird-russian mailing list archive at Nabble.com.
Re: Работа с Blob из UDF Firebird 2.5
Евгений Килин wrote: > >> Все мои попытки упираются в вызов >> EndOfBlob = inpblob->blob_get_segment(inpblob->blob_handle, text, len, >> res_len) >> который приводит к краху сервера. > > Недавно воевали с похожей фигней. Проблема решилась установкой Struct > Member > Alignment в дефолтное значение. > Нашел, проверил, стоит default -- View this message in context: http://firebird.1100200.n4.nabble.com/Blob-UDF-Firebird-2-5-tp2998810p2999679.html Sent from the firebird-russian mailing list archive at Nabble.com.
Re: Работа с Blob из UDF Firebird 2.5
"AZDesign" ... В исходниках Firebird 2.5 есть пример fbudf.cpp ... Помогите с примером. Или я тупой, или... :) В чём проблемы-то ? Как пробовал ? -- Хорсун Влад
Re: Работа с Blob из UDF Firebird 2.5
Khorsun Vlad wrote: > > "AZDesign" ... > >> В исходниках Firebird 2.5 есть пример fbudf.cpp > ... >> Помогите с примером. > > Или я тупой, или... :) > > В чём проблемы-то ? Как пробовал ? > > Я в C++ разбираюсь плохо, подскажите, что делаю не так: FBUDF_API void blob2string(const blobcallback* inpblob, paramdsc* rc) { if ((inpblob->blob_handle == 0) || (inpblob->blob_total_length==0)) { internal::setnull(rc); return; } if (!inpblob || !inpblob->blob_handle) return; ISC_SHORT EndOfBlob = 0; ISC_USHORT* res_len = 0; const ISC_USHORT buf_siz = inpblob->blob_max_segment; ISC_UCHAR* pbuff = 0; pbuff = new ISC_UCHAR[buf_siz+1]; internal::set_any_string_type(rc, buf_siz, pbuff); EndOfBlob = inpblob->blob_get_segment(inpblob->blob_handle, pbuff, buf_siz, res_len); // эта строка вызывает крах delete [] pbuff; return; } -- View this message in context: http://firebird.1100200.n4.nabble.com/Blob-UDF-Firebird-2-5-tp2998810p2999702.html Sent from the firebird-russian mailing list archive at Nabble.com.
Re: Работа с Blob из UDF Firebird 2.5
"AZDesign" ... Я в C++ разбираюсь плохо, подскажите, что делаю не так: Где объявление blobcallback ? Где SQL декларация ? -- Хорсун Влад
Re: Работа с Blob из UDF Firebird 2.5
Khorsun Vlad wrote: > > > Где объявление blobcallback ? Где SQL декларация ? > > Прошу прощения: typedef struct blobcallback { short (*blob_get_segment) (void* hnd, ISC_UCHAR* buffer, ISC_USHORT buf_size, ISC_USHORT* result_len); void* blob_handle; ISC_LONGblob_number_segments; ISC_LONGblob_max_segment; ISC_LONGblob_total_length; void (*blob_put_segment) (void* hnd, const ISC_UCHAR* buffer, ISC_USHORT buf_size); ISC_LONG (*blob_lseek) (void* hnd, ISC_USHORT mode, ISC_LONG offset); } *BLOBCALLBACK; #endif /* !defined(JRD_VAL_H) */ Это из файла ibase.h --FBUDF_API void blob2string(const blobcallback* inpblob, paramdsc* rc) declare external function blob2string blob, varchar(32760) by descriptor returns parameter 2 entry_point 'blob2string' module_name 'az_blob'; -- View this message in context: http://firebird.1100200.n4.nabble.com/Blob-UDF-Firebird-2-5-tp2998810p2999722.html Sent from the firebird-russian mailing list archive at Nabble.com.
Re: Работа с Blob из UDF Firebird 2.5
"AZDesign" ... Я в C++ разбираюсь плохо, подскажите, что делаю не так: FBUDF_API void blob2string(const blobcallback* inpblob, paramdsc* rc) ... ISC_USHORT* res_len = 0; Нужно ISC_USHORT res_len = 0; ... EndOfBlob = inpblob->blob_get_segment(inpblob->blob_handle, pbuff, buf_siz, res_len); // эта строка вызывает крах &res_len); -- Хорсун Влад
Re: Работа с Blob из UDF Firebird 2.5
Khorsun Vlad wrote: > > Нужно > > ISC_USHORT res_len = 0; > > &res_len); > > Спасибо, заработало. -- View this message in context: http://firebird.1100200.n4.nabble.com/Blob-UDF-Firebird-2-5-tp2998810p2999788.html Sent from the firebird-russian mailing list archive at Nabble.com.
Re: Работа с Blob из UDF Firebird 2.5
В письме от Mon, 18 Oct 2010 05:35:49 +0400, AZDesign сообщал: так как Delphi пока не дает 64-разрядный код а Free Pascal или GNU Pascal ? Тебе же в UDF не нужны GUI -- Написано в почтовом клиенте браузера Opera: http://www.opera.com/mail/
Re: Работа с Blob из UDF Firebird 2.5
Arioch wrote: > > В письме от Mon, 18 Oct 2010 05:35:49 +0400, AZDesign > > а Free Pascal или GNU Pascal ? > Тебе же в UDF не нужны GUI > > Delphi - рабочий инструмент MSVS - то, что выбрали разработчики Firebird Все остальное будет 3-им, 4-им инструментом. Инструмент это не только язык, но управление проектом, и всякие мелочи, которые узнаешь на собственных шишках. Поэтому лучше работать на том, что развивается вместе с Firebird. А язык потихоньку освоим - не первый. -- View this message in context: http://firebird.1100200.n4.nabble.com/Blob-UDF-Firebird-2-5-tp2998810p3001419.html Sent from the firebird-russian mailing list archive at Nabble.com.