Postgresql&C(用户定义类型)-我可以在非PG函数中使用palloc吗?

时间:2018-08-28 10:22:58

标签: c postgresql malloc user-defined-functions user-defined-types

我目前正在实现一种用户定义的数据类型-一种链接列表,该列表模仿名为intList.c的文件中的一组整数,并希望与intList.source一起安装到我的Postgres服务器上。

所以我的问题如下:

1)我可以在我的代码中编写诸如(link newNode)和(link InsertEnd)之类的C函数,而这些C函数不是要在源文件中声明和创建的postgres函数吗?

2)我可以在从输入函数调用的函数中使用palloc吗? (在这种情况下,链接newNode)?还是应该在输入函数中执行此操作?

我对intList.c的代码如下:这些功能都可以在C语言中使用,但是我还没有在PostgreSQL服务器中安装它们,所以我不知道结果如何:

 // Defining struct for linked list
 typedef struct intSet *link;

 typedef struct intList {
    int num;
    link next;
 } intList;

 //  Create a new node
 link newNode(int item) {
     link n = (link) palloc(sizeof(*n));
     n->num = item;
     n->next = NULL;
     return n;
 }

 link insertEnd(link list, link n){
     link curr;
     // Empty list
     if(list == NULL){
         list = n;
         n->next = NULL;
     // If list not empty, iterate to end of list, then append
     } else {
         for(curr = list; curr->next != NULL; curr = curr->next) {
         }
         curr->next = n;
         n->next = NULL;
     }
     return list;
 }    

 PG_FUNCTION_INFO_V1(intList_in);

 Datum
 intList_in(PG_FUNCTION_ARGS)
 {
     char       *str = PG_GETARG_CSTRING(0);
     char       *token;

     // Create an empty linked list
     link newList;
     newList = NULL;

     // Get individual ints from a set e.g. {1, 2, 3, 4}
     token = strtok(str, ",{} ");

     // For each int, create a new node then
     // append to list
     while (token != NULL) {
         link a = NULL;
         a = newNode(atoi(token));
         newList = insertEnd(newList, a);
         token = strtok(NULL, ",{} ");
     }

     PG_RETURN_POINTER(newList);
 }

这只是我整个代码的一部分,我将实现运算符和其他函数,因此,任何技巧和指针将不胜感激。

0 个答案:

没有答案