Функция расширения PostgreSQL C, возвращающая вектор пар или текстовый массив - PullRequest
0 голосов
/ 25 августа 2018

Я хочу вернуть вектор пар, используя расширение C. Это простой код у меня есть:

extern "C" { 
Datum pair(PG_FUNCTION_ARGS){ 

        // get the input
        text *t1 = PG_GETARG_TEXT_PP(0); 
        text *t2 = PG_GETARG_TEXT_PP(1); 
        std::string localT1 = text_to_cstring(t1); 
        std::string localT2 = text_to_cstring(t2); 

        // Return vector of pairs 
        std::vector<std::pair&lt;std::string, std::string>> ret; 
        ret.emplace_back(encodedLocalT1, encodedLocalT2); 
        PG_RETURN_ARRAYTYPE_P(ret); 

}; 
PG_FUNCTION_INFO_V1(pair); 
} 

Но это не работает так, как я, и я не знаю, возможно ли это вообще. Поэтому я попытался вернуть text[], но он тоже не работает:

extern "C" { 
Datum pair(PG_FUNCTION_ARGS){ 

        // Get the input 
        text *t1 = PG_GETARG_TEXT_PP(0); 
        text *t2 = PG_GETARG_TEXT_PP(1); 
        std::string localT1 = text_to_cstring(t1); 
        std::string localT2 = text_to_cstring(t2); 

        // Return array with 2 strings 
        ArrayType *array;
        Datum elements[2];
        int16 typlen;
        bool typbyval;
        char typalign;

        elements[0] = cstring_to_text(localT1.c_str());
        elements[1] = cstring_to_text(localT2.c_str());

        get_typlenbyvalalign(TEXTOID, &typlen, &typbyval, &typalign);
        array = construct_array(elements, 2, TEXTOID, typlen, typbyval, typalign);

        PG_RETURN_ARRAYTYPE_P(array);

}; 
PG_FUNCTION_INFO_V1(pair); 
} 

Я использую те, которые включены в расширение:

extern "C" { // C Headers must be inside exter "C" { } block.
#include <postgres.h>
#include <fmgr.h>
#include <utils/builtins.h>
#include <catalog/pg_type.h>
#include <utils/rel.h>
#include <utils/array.h>
#include <stdlib.h>
#include <stdint.h>
#include <utils/lsyscache.h>

PG_MODULE_MAGIC;
}

// CPP Header must be outside extern "C" { } block.
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iterator> // For the ostream_iterator
#include <chrono> // For some code benchmarking

// External projects c++ libraries compiled and linked on running 'make'.
#include <seal/seal.h>
#include <thread>
#include <cppcodec/base64_rfc4648.hpp>

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

Кажется, я не могу понять, как достичь своей цели, я предпочитаю возвращать text[] с двумя строками в качестве элементов.

1 Ответ

0 голосов
/ 25 августа 2018

Этот код работал для меня.

extern "C" { 
Datum text_array(PG_FUNCTION_ARGS){ 

        // Get the input 
        text *t1 = PG_GETARG_TEXT_PP(0); 
        text *t2 = PG_GETARG_TEXT_PP(1); 
        std::string localT1 = TextDatumGetCString(t1); 
        std::string localT2 = TextDatumGetCString(t2); 

        // Return a text array with 2 elemsnts
        ArrayType *array;
        Datum elements[2];
        int16 typlen;
        bool typbyval;
        char typalign;

        elements[0] = CStringGetTextDatum(localT1.c_str());
        elements[1] = CStringGetTextDatum(localT2.c_str());

        get_typlenbyvalalign(TEXTOID, &typlen, &typbyval, &typalign);
        array = construct_array(elements, 2, TEXTOID, typlen, typbyval, typalign);

        PG_RETURN_ARRAYTYPE_P(array);

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