powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
25 сообщений из 61, страница 1 из 3
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670308
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поимел нужду и желание написать BLOB фильтр для базы, работающей под Firebird 3.0.2 (64, Windows).

Внимательно ознакомившись с

а) Руководством по языку SQL СУБД Firebird 3.0 (2017);

б) Набором fbudf.dll, fbudf.sql из поставки Firebird 3.0;

в) Статьей "Как научиться писать UDF на Delphi за 21 минуту?" (1996, Олег Кукарцев) на ibase.ru;

г) tbutil.pas (2002, Daniel Pereira Guimarаes and Anthony J. Caduto);

д) blobsaveload.dpr (2007, KDV);

e) ListUdf.dpr (2011, Мадорский Глеб Владимирович) - последнее по дате, что смог найти по теме UDF, кроме "Руководства",


понял, что не могу получить ответы на следующие вопросы:


1) Каков интерфейс функции, реализующей BLOB фильтр?

2) Возможно ли использование 32-разрядной dll (контейнера udf) для 64-разрядного сервера? Посмотрел на прилагающиеся к серверу fbudf.dll и ib_udf.dll - они 64-разрядные.

3) Как правильно работать с передачей параметров BY DESCRIPTOR? Увидел в примерах структуры TDSC и TBlob - идею понял, но не уверен, что правильно. Тем более, что в 64-разрядном случае структуры наверняка будут иные.

4) Как правильно выделять память? Неужели все тем же malloc? А при 64 разрядах?

Ответы на все эти, а так же на другие вопросы логично было бы найти в документе под названием "Спецификация интерфейса UDF и BLOB-фильтров для 32- и 64- разрядных серверов Firebird 3.0.2". Где бы его взять? Или хотя бы получить ответ на вопросы.
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670310
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyansky,

1. Такой же как и UDF вроде. Примеров фильтров не видал ни разу. Есть внутреннии, но где их искать и помогут ли они хз

2. Нет

3. Вот тут подробно

http://www.ibphoenix.com/files/Writing-External-Functions.pdf

4. ib_util_malloc

Главный вопрос зачем это потребовалось?
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670318
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyanskyОтветы на все эти, а так же на другие вопросы логично было бы найти в документе под
названием "Спецификация интерфейса UDF и BLOB-фильтров для 32- и 64- разрядных серверов
Firebird 3.0.2". Где бы его взять?

Ты не поверишь, но из комплекта документации Interbase. "Developer’s Guide" и далее по
ссылкам. Интерфейсы BLOB фильтров не менялись от начала времён.

PS: А что, что 32-х и 64-х разрядные модули несовместимы в принципе это вообще базовые
знания о функционировании компьютеров.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670322
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис1. Такой же как и UDF вроде


Так какой - такой же? Какие входные параметры, выходные, возвращаемое значение?

Спасибо за документ! Сейчас буду смотреть внимательно, но уже сейчас вижу - 64-разрядной специфики там нет. А её не может не быть. Как же тогда быть?

Симонов Денисib_util_malloc

Из 64-разрядной ib_util.dll? А где её взять?

Симонов ДенисГлавный вопрос зачем это потребовалось?

Есть здоровенный набор текстов, точнее, XML-файлов, упакованных в ZIP-файлы, которые лежат в файловой системе. Засовывать все это хозяйство в fdb смысла никакого нет, база и так толстая, она представляет собой разобранные эти самые XML-файлы, аккуратно разложенные по таблицам. Но иногда клиенту необходимо получить исходный файл.

Вот я и подумал использовать механизм BLOB фильтров, который увидел в "Руководстве". Было бы удобно: клиент обращается как бы к BLOB-полю, которое на самом деле пустое, отрабатывает фильтр, udf-функция идет в недалеко лежащий ZIP-файл, достает нужный XML, клиент получает "содержимое" BLOB. И не нужно создавать другой, кроме sql connect, механизм передачи данных клиенту.
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670324
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyanskyИз 64-разрядной ib_util.dll? А где её взять?

ты удивишься но входит в поставку 64-разрядного сервера Firebird
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670325
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТы не поверишь, но из комплекта документации Interbase. "Developer’s Guide" и далее по
ссылкам. Интерфейсы BLOB фильтров не менялись от начала времён.

PS: А что, что 32-х и 64-х разрядные модули несовместимы в принципе это вообще базовые
знания о функционировании компьютеров.


И где же взять интерфейсы именно для 64-разрядных модулей? Тоже из начала времен?

Кстати, теоретически разработчики могли бы сделать и переходник для загрузки 32-разрядных библиотек udf в 64-разрядный процесс. Но это чисто теоретически, конечно.
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670326
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyansky,

не надо нести чушь про переходники
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670328
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyanskyклиент обращается как бы к BLOB-полю, которое на самом деле пустое, отрабатывает фильтр, udf-функция идет в недалеко лежащий ZIP-файл, достает нужный XML, клиент получает "содержимое" BLOBЗачем здесь вообще BLOB не осилил понять я.
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670329
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyanskyИ где же взять интерфейсы именно для 64-разрядных модулей? Тоже из начала времен?А интерфейсы одинаковые.
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670330
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЗачем здесь вообще BLOB не осилил понять я.
Кстати, да... Можно и просто строку вернуть. Ну, чтобы в IBExpert'е красиво xml разглядывать :)
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670333
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyansky,

если реальная цель только XML разглядывать в IBE то лучше от этой затеи отказаться
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670336
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Да нет, реальная цель более серьезная, но Вы и YuRock правы, что-то я зря уперся в эти фильтры, можно и обычной udf обойтись, возвращающей строку.

Спасибо всем за подсказки!
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670338
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyansky,

ну тут свою UDF писал каждый второй в этой ветке. А вот имеющих дело с фильтрами я ещё не видел.
В руководстве по языку декларация фильтров описана, а вот где посмотреть пример живого фильтра я не знаю.
Знаю только что внутри Firebird использует встроенные BLOB-фильтры.
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670339
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял, терра инкогнита, на страх и риск первопроходца. На риск завалить сервер.
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670340
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyansky,

хочешь новый экспериментов пиши сразу UDR
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670374
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyansky,

блоб-фильтр преобразует один тип блоба в другой.
Например BLR в текст.
Для твоей задачи они не нужны.
UDF\UDR тебе в помощь.
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670487
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то давно реализовывал UDF библиотеку для FirebirdSQL v2.5, реализующую работу с "сырым" форматом и использующую, в т.ч., BLOb. Возможно, тебе помогут эти куски исходников:
кусок raw.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
#include "./firebird/ibase.h"
#include "./firebird/ib_util.h"

#ifdef FBUDF_EXPORTS
# ifdef __WINNT__
#   define FBUDF_API __declspec(dllexport) __cdecl
# else
#   define FBUDF_API __declspec(dllexport) __cdecl
# endif
#else
# ifdef __WINNT__
#   define FBUDF_API __cdecl
# else
#   define FBUDF_API __cdecl
# endif
#endif


typedef struct IB_BLOB {
    short __cdecl (* blob_get_segment)
        (
          void*       hnd,
          void*       buffer,
          ISC_USHORT  buf_size,
          ISC_USHORT  *result_len
        );
    void*		blob_handle;
    ISC_LONG	blob_number_segments;
    ISC_LONG	blob_max_segment;
    ISC_LONG	blob_total_length;
    void __cdecl (* blob_put_segment)
        (
          void*       hnd,
          const void* buffer,
          ISC_USHORT  buf_size
        );
    ISC_LONG __cdecl (* blob_lseek)
        (
          void* hnd,
          ISC_USHORT mode,
          ISC_LONG offset
        );
}  *LPIB_BLOB;

#define max_blob_segment_size 2048

#ifdef __cplusplus
extern "C" {
#endif

  DWORD FBUDF_API raw_init
      (
        DWORD * Mode,
        const DWORD * Handle
      );
  DWORD FBUDF_API raw_addblob
      (
        DWORD * Handle,
        const IB_BLOB* BLOb
      );
  DWORD FBUDF_API raw_add
      (
        DWORD * Handle,
        DWORD * Mode,
        const PARAMDSC* Param
      );
  DWORD FBUDF_API raw_rewrite
      (
        DWORD * Handle,
        __INT64 * Offset,
        const PARAMDSC* Param
      );
  DWORD FBUDF_API raw_free(DWORD * Handle);
  void  FBUDF_API raw_get
      (
        DWORD * Handle,
        DWORD * Mode,
        const IB_BLOB* BLOb
      );

#ifdef __cplusplus
}
#endif

Куски raw.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
DWORD FBUDF_API raw_addblob(DWORD * Handle, const IB_BLOB* BLOb)
{
  DWORD result = false;
  my::CBuffer* raw = NULL;

  if (!(*Handle)
      || BLOb == NULL
      || BLOb->blob_handle == NULL
      || !BLOb->blob_total_length > 0)
    return result;

  my::CThreadContext* thread_context = my::get_thread_context();
  if (thread_context != NULL)
    raw = thread_context->getBuffers()->get(*Handle);

  if (raw != NULL)
  {
    void* buff = NULL;
    ISC_USHORT buff_size;
    if (!BLOb->blob_max_segment
        || BLOb->blob_max_segment > max_blob_segment_size)
      buff_size = max_blob_segment_size;
    else
      buff_size = BLOb->blob_max_segment;
    if (BLOb->blob_handle != NULL && buff_size)
      buff = ::malloc(buff_size);
    if (buff != NULL)
    {
      result++;
      ISC_USHORT length = 0;
      try
      {
        while ((*BLOb->blob_get_segment)
            (
              BLOb->blob_handle,
              buff,
              buff_size,
              &length
            ))
        {
          if (length)
            raw->add(buff, length);
          else
            break;
          length = 0;
        }
      }
      catch (...)
      {
        result = false;
      }
      ::free(buff);
    } // if (buff != NULL)
  }
  return result;
}

void FBUDF_API raw_get(DWORD * Handle, DWORD * Mode, const IB_BLOB* BLOb)
{
  DWORD result = false;
  DWORD mode = *Mode;
  DWORD free_mask = 1;
  my::CThreadContext * volatile thread_context = NULL;
  my::CThreadBuffers* buffs = NULL;
  my::CBuffer* raw = NULL;
  ISC_USHORT segment_size;

  thread_context = my::get_thread_context();
  if (thread_context != NULL
      && (*Handle)
      && BLOb != NULL && BLOb->blob_handle != NULL)
  {
    buffs = thread_context->getBuffers();
    if (buffs != NULL) raw = buffs->get(*Handle);

      if (!BLOb->blob_max_segment
        || BLOb->blob_max_segment > max_blob_segment_size)
      segment_size = max_blob_segment_size;
    else
      segment_size = BLOb->blob_max_segment;

    if (raw != NULL)
    {
      __INT64 buff_size = raw->size();
      if (buff_size)
      {
        void* buff = NULL;
        buff = ::malloc(buff_size);
        ::size_t length = raw->get(buff, buff_size);
        if (mode & 0x80000000)
        {
          mode = (~mode); mode++;
          if (mode & (~free_mask) == 64)
          {
            // -- decode Base64 to bin
            void* dst_buff = my::base64_decode
                (
                  reinterpret_cast<const char*>(buff),
                  &length
                );
            ::free(buff);
            buff = dst_buff;
          }
        }
        else
          if (mode & (~free_mask) == 64)
          {
            // -- encode bin to Base64
            char* dst_buff = my::base64_encode(buff, length);
            ::free(buff);
            buff = dst_buff;
            length = ::strlen(dst_buff);
          }
        char*      ptr = reinterpret_cast<char*>(buff);
        ISC_USHORT len = segment_size;
        if (length)
        {
          while (length > segment_size)
          {
            (*BLOb->blob_put_segment)(BLOb->blob_handle, ptr, len);
            ptr += len;
            length -= len;
          }
          len = length;
          (*BLOb->blob_put_segment)(BLOb->blob_handle, ptr, len);
        } // if (length)
        if (buff != NULL) ::free(buff);
      } // if (buff_size)
      if (mode & free_mask) ::free(raw);
      result++;
    } // if (raw != NULL)
  }
}

librawudf.sql
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
DECLARE EXTERNAL FUNCTION RAW_INIT
  INTEGER,
  INTEGER
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_init' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_FREE
  INTEGER
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_free' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_ADD_INT16
  INTEGER,
  INTEGER,
  SMALLINT BY DESCRIPTOR
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_add' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_ADD_INT32
  INTEGER,
  INTEGER,
  INTEGER BY DESCRIPTOR
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_add' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_ADD_INT64
  INTEGER,
  INTEGER,
  BIGINT BY DESCRIPTOR
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_add' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_ADD_CHAR
  INTEGER,
  INTEGER,
  CHAR(766) BY DESCRIPTOR
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_add' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_ADD_CSTR
  INTEGER,
  INTEGER,
  CSTRING(766) BY DESCRIPTOR
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_add' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_ADD_VCHAR
  INTEGER,
  INTEGER,
  VARCHAR(32765) BY DESCRIPTOR
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_add' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_ADD_BLOB
  INTEGER,
  BLOB
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_addblob' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_REWRITE_INT16
  INTEGER,
  BIGINT,
  SMALLINT BY DESCRIPTOR
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_rewrite' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_REWRITE_INT32
  INTEGER,
  BIGINT,
  INTEGER BY DESCRIPTOR
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_rewrite' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_REWRITE_INT64
  INTEGER,
  BIGINT,
  BIGINT BY DESCRIPTOR
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_rewrite' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_REWRITE_CHAR
  INTEGER,
  BIGINT,
  CHAR(766) BY DESCRIPTOR
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_rewrite' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_REWRITE_CSTR
  INTEGER,
  BIGINT,
  CSTRING(766) BY DESCRIPTOR
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_rewrite' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_REWRITE_VCHAR
  INTEGER,
  BIGINT,
  VARCHAR(32765) BY DESCRIPTOR
  RETURNS INTEGER BY VALUE
  ENTRY_POINT 'raw_rewrite' MODULE_NAME 'librawudf';

DECLARE EXTERNAL FUNCTION RAW_GET
  INTEGER,
  INTEGER,
  BLOB RETURNS PARAMETER 3
  ENTRY_POINT 'raw_get' MODULE_NAME 'librawudf';
COMMIT WORK;

...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670595
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladUDF\UDR тебе в помощь.

На месте автора я бы тоже попытался найти обходные пути чтобы избежать создания временных
блобов в базе. С UDR их, наверное, можно выкинуть из основной базы во временный файл, но
всё равно это оверхэд.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670610
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

при чём тут блоб-фильтры ? Или ты опять о своём ?
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670616
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladпри чём тут блоб-фильтры ?

При том, что они выглядят как возможность формировать BLOB по кусками на лету и сразу
отдавать на клиента, без сохранения где-либо. Представь себе фильтр, преобразующий имя
файла в его содержимое.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670618
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

тут фильтр ни к чему, это можно и с помощью UDR сделать.
Фильтр тут скорее для прозрачного преобразования zip -> xml или xml -> zip, где zip и xml подтипы блоб зарегистрированные пользователем.
Вот только нужно ли это ещё большой вопрос.
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670628
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денистут фильтр ни к чему, это можно и с помощью UDR сделать.

Можно. Представь себе файл на пару гигов. UDR сначала перекачает его в базу, отдаст blob
id, а потом клиент будет его из базы выкачивать. В конце сервер этот мусор будет собирать.
Как тебе эта картинка?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670630
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovhvladпри чём тут блоб-фильтры ?

При том, что они выглядят как возможность формировать BLOB по кусками на лету и сразу
отдавать на клиента, без сохранения где-либо. Представь себе фильтр, преобразующий имя
файла в его содержимое.У блоб-фильтра на входе блоб. Предлагаешь имя файла в блоб засунуть ?
Ну, можно попробовать. Расскажешь :)
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670649
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

а куда он денется, если ему встретится XML, который размером больше 32KB и в VarChar тупо не лезет ?


P.S.

> идет в недалеко лежащий ZIP-файл, достает нужный XML

.....а я бы сразу ZIP передавал по сети, он же меньше, чем XML, значит по сети быстрее проскочит. Конечно, если на клиенте диск медленнее, чем скорость сети, то лучше распаковать на сервере.... Но все же едва ли.

Совершенно безумный вариант - поднять на сервере p2p (например uTorrent BTSync), в БД держать хэши ZIP'ов с исходным XML-документом. SHA1 или MD5. Запросили файл, из БД прочитал хэш, сформировал magnet-ссылку - и пожалуйста, тащи хоть гигабайтный документ, асихнронно, и вовне процессов сервера и аппликухи.
...
Рейтинг: 0 / 0
BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
    #39670652
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladПредлагаешь имя файла в блоб засунуть ?

Предлагаю.

В Windows максимальная длина имени файла - 4К. В Линуксе, кажется, 1К.
С учётом UTF-8 - это нужно VARCHAR(16KBytes) или, если запрещаем работу с Windows файлопомойками - VARCHAR(4Kbytes)

Учитывая, что на диске записи пакуются RLE и ничего уровня LZ до сих пор нету...
У меня сейчас нет под руками того старого документа о двоичном формате rows в FB и я не помню максимальной эффективности RLE... 64:1 ? 16:1 ? но в общем, не очевидно, что с блобами обязательно будет хуже.
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / BLOB фильтр и UDF для Firebird 3.0 (64) - где найти спецификацию?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]