Пользовательские типы Postgres и правильное распределение памяти - PullRequest
0 голосов
/ 13 января 2019

Я пишу расширение для postgres, которое включает создание нового базового типа переменной длины, однако у меня возникают трудности с пониманием семантики SET_VARSIZE.

Возьмите следующий пример кода, он точно не отражает мой вариант использования, но иллюстрирует суть.

typedef struct another_struct 
{
  char *a;
  char *b;
} another_struct;

typedef struct test_struct
{
  char vl_len_[4];
  another_struct *data;
} test_struct;

1) При выделении памяти для новых экземпляров test_struct, предположительно, я могу просто сделать следующее, и это будет учитывать размер элемента переменной длины vl_len _?

test_struct *t = palloc0(sizeof(struct test_struct));

2) Поскольку оба члена another_struct имеют переменные длины, я предполагаю, что мне также нужно отслеживать, сколько памяти было выделено для обоих полей, чтобы передать правильную длину в SET_VARSIZE?

3) Нужно ли также учитывать размер указателя another_struct при вызове SET_VARSIZE?

Я думаю, что последний вызов SET_VARSIZE будет выглядеть примерно так

SET_VARSIZE(t, sizeof(struct test_struct) + sizeof(struct another_struct) + a_and_b_length);

Это близко к правильности? Извиняюсь за любые ошибки, я довольно плохо знаком с программированием на C.

Спасибо

1 Ответ

0 голосов
/ 14 января 2019

Вы не можете сделать это с помощью обычного указателя. Вся память должна быть вместе после размера элемента.

typedef struct another_struct 
{
  char a[FLEXIBLE_ARRAY_MEMBER];
  char b[FLEXIBLE_ARRAY_MEMBER];
} another_struct;

typedef struct test_struct
{
  char vl_len_[4];
  another_struct data;
} test_struct;

и вы должны знать реальный размер ваших данных сейчас.

test_struct *t = palloc0(VARHDRSZ + size_of_a + size_of_b);
SET_VARSIZE(t, VARHDRSZ + size_of_a + size_of_b );
memcpy(t->data.a, src_a, size_of_a);
memcpy(t->data.b, src_b, size_of_b);

Пример в документации имеет только одно поле, поэтому я только предполагаю, что это работает таким образом. Могут быть другие проблемы с косвенностью. Источник: https://www.postgresql.org/docs/current/xfunc-c.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...