Line data Source code
1 : #include "postgres.h" 2 : 3 : #include "fmgr.h" 4 : #include "ltree/ltree.h" 5 : #include "plpy_util.h" 6 : 7 2 : PG_MODULE_MAGIC_EXT( 8 : .name = "ltree_plpython", 9 : .version = PG_VERSION 10 : ); 11 : 12 : /* Linkage to functions in plpython module */ 13 : typedef PyObject *(*PLyUnicode_FromStringAndSize_t) (const char *s, Py_ssize_t size); 14 : static PLyUnicode_FromStringAndSize_t PLyUnicode_FromStringAndSize_p; 15 : 16 : /* Static asserts verify that typedefs above match original declarations */ 17 : StaticAssertVariableIsOfType(&PLyUnicode_FromStringAndSize, PLyUnicode_FromStringAndSize_t); 18 : 19 : 20 : /* 21 : * Module initialize function: fetch function pointers for cross-module calls. 22 : */ 23 : void 24 2 : _PG_init(void) 25 : { 26 2 : PLyUnicode_FromStringAndSize_p = (PLyUnicode_FromStringAndSize_t) 27 2 : load_external_function("$libdir/" PLPYTHON_LIBNAME, "PLyUnicode_FromStringAndSize", 28 : true, NULL); 29 2 : } 30 : 31 : 32 : /* These defines must be after the module init function */ 33 : #define PLyUnicode_FromStringAndSize PLyUnicode_FromStringAndSize_p 34 : 35 : 36 4 : PG_FUNCTION_INFO_V1(ltree_to_plpython); 37 : 38 : Datum 39 4 : ltree_to_plpython(PG_FUNCTION_ARGS) 40 : { 41 4 : ltree *in = PG_GETARG_LTREE_P(0); 42 : int i; 43 : PyObject *list; 44 : ltree_level *curlevel; 45 : 46 4 : list = PyList_New(in->numlevel); 47 4 : if (!list) 48 0 : ereport(ERROR, 49 : (errcode(ERRCODE_OUT_OF_MEMORY), 50 : errmsg("out of memory"))); 51 : 52 4 : curlevel = LTREE_FIRST(in); 53 16 : for (i = 0; i < in->numlevel; i++) 54 : { 55 12 : PyList_SetItem(list, i, PLyUnicode_FromStringAndSize(curlevel->name, curlevel->len)); 56 12 : curlevel = LEVEL_NEXT(curlevel); 57 : } 58 : 59 4 : PG_FREE_IF_COPY(in, 0); 60 : 61 4 : return PointerGetDatum(list); 62 : }