C / Postgres-在非PG函数中使用palloc

时间:2018-08-28 15:04:27

标签: postgresql postgresql-10

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

所以我的问题如下:

  1. 我可以在我的代码中编写(link newNode)和(link InsertEnd)这样的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);
 }

 Datum
 intList_out(PG_FUNCTION_ARGS)
 {
     // Start our string
     char* out = "{";
     char* num;
     // Retrieve our list from arg(0)
     link List = PG_GETARG_POINTER(0);
     link curr;
     // Traverse list till last node, add commas after each node
     for (curr = List; curr->next != NULL; curr = curr->next) {
         num = itoa(curr->num);
         strcat(num, ", "); 
         strcat(out, num);
     }
     // At last node, add closing bracket to close list
     num = itoa(curr->num);
     strcat(num, "}");
     strcat(out, num);

     // Psprintf to result then return it
     char *result;
     result = psprintf("%s", out);
     PG_RETURN_CSTRING(result);

 }

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

1 个答案:

答案 0 :(得分:0)

  

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

我认为您的意思是可以不用palloc来编写它们。你当然可以。虽然不建议这样做。出于性能原因和完整性方面的考虑,PostgreSQL将malloc包装起来(确保在txn末尾释放内存)。如果没有palloc,您将不得不解决这一问题,而且我不确定您会遇到什么样的挑战。

  

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

当然,如果您正在服务器上运行,那就应该这样做。只是#include <postres.h>