Как отобразить код c в формат функции postgres c? - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь написать следующий код c в стиле функции postgres c - переданный аргумент является значением столбца таблицы типа varchar. Требуется некоторая помощь для отображения этого чистого кода C в формате postgres C типа-

Datum func_name (PG_FUNCTION_ARGS)

Может кто-нибудь помочь с отображением этого и вернуть соответствующее значение символа?

static uint32_t key = 0xOQ9426YP;
uint32_t tmpKey = 0x00000000;
int i = 0;
uint32_t *in = (uint32_t *) str;
uint32_t *out = (uint32_t *) malloc (256);
memset (out, 0, 256);
tmpKey = key;
for (i = 0; i < (256/sizeof (uint32_t));  i++)
{
    out[i] = tmpKey ^ in[i];
    tmpKey = out[i];
}
memcpy (output, (char *) out, 256);

Спасибо и С уважением, VJ

1 Ответ

0 голосов
/ 22 ноября 2018

Для данных PostgreSQL использует собственный внутренний формат и структуры, которые не должны быть совместимы с языком Си.Для строк используется формат varlena - в этом формате сначала N байтов кодируются длиной - и после этих байтов кодируются данные.Прямой доступ не рекомендуется - почти для всех работ есть макросы.

Например, небольшая функция hello может выглядеть так:

Datum
Hello(PG_FUNCTION_ARGS)
{
    text *txt = PG_GETARG_TEXT_PP(0);
    text *result;
    char *str;
    char *hello = "Hello, ";
    int   size;
    int   hello_size;

    -- conversion to c string
    str = text_to_cstring(txt);

    -- show it on debug console
    elog(NOTICE, "input string: %s", str);

    hello_size = strlen(hello); 
    size = hello_size + VARSIZE_ANY_EXHDR(txt) + VARHDRSZ;

    -- allocate memory for result, use palloc, not malloc!
    result = palloc(size);

    --set size of result varlena type
    SET_VARSIZE(result, size);

    -- set data
    memcpy(VARDATA(result), str, hello_size);
    memcpy(VARDATA(result) + hello_size, 
           VARDATA_ANY(txt), VARSIZE_ANY_EXHDR(txt));

    -- returns data
    PG_RETURN_TEXT_P(result);
}

Как видите, этоC и это не C. Существует много макросов, которые можно использовать a) для целей переносимости, b) для сокрытия сложности.Хорошо бы начать читать документацию или какую-либо презентацию.

Эта тема не является слишком сложной или слишком сложной, но она не интуитивна - вы не можете начать без чтения документации.

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