arraypoc.c
text/x-c
#include "postgres.h"
#include <string.h>
#include "utils/array.h"
#include "utils/builtins.h" /* text_to_cstring */
#include "catalog/pg_type.h"
#include "utils/lsyscache.h"
#include "fmgr.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
PG_FUNCTION_INFO_V1(arraypoc);
Datum arraypoc(PG_FUNCTION_ARGS) {
ArrayType *result;
Datum *result_data = NULL;
int16 o_typlen;
bool o_typbyval;
char o_typalign;
text *t,
*cpyt;
uint32 c;
int i, t_len;
t = (text *)PG_GETARG_TEXT_PP(0);
c = (uint32)PG_GETARG_INT32(1);
if(c>0) result_data = (Datum *)palloc(sizeof(Datum) * c);
for(i=0; i<c; ++i) {
t_len = VARSIZE_ANY_EXHDR(t);
cpyt = (text *)palloc(VARHDRSZ + t_len + 1 + 16);
SET_VARSIZE(cpyt, VARHDRSZ + t_len + 1 + 16);
memcpy((void *)VARDATA(cpyt), (void *)VARDATA(t), t_len);
memcpy((void *)VARDATA(cpyt) + t_len, ",", 1);
snprintf((void *)VARDATA(cpyt) + t_len + 1, 16, "%d", i);
result_data[i] = PointerGetDatum(cpyt);
}
if(result_data == NULL || c <= 0) {
PG_RETURN_NULL();
} else {
get_typlenbyvalalign(TEXTOID, &o_typlen, &o_typbyval, &o_typalign);
result = construct_array(result_data, c, TEXTOID, o_typlen, o_typbyval,
o_typalign);
PG_RETURN_ARRAYTYPE_P(result);
}
}