C / Postgres - Использование palloc в не-PG функции - PullRequest
0 голосов
/ 28 августа 2018

В настоящее время я реализую пользовательский тип данных - связанный список, который имитирует набор целых чисел в файле с именем intList.c и, надеюсь, используется вместе с intList.source для установки его на мой сервер Postgres.

Итак, мои вопросы следующие:

  1. Могу ли я написать функции C, такие как (ссылка newNode) и (ссылка InsertEnd) в моем коде, где они не являются функциями postgres, которые должны быть объявлены и созданы в исходном файле?

  2. Могу ли я использовать palloc в функции, вызываемой из моей функции ввода? (в этом случае ссылка newNode)? Или я должен сделать это в моей функции ввода?

Мой код для intList.c выглядит следующим образом: P.S. Все эти функции работают в 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 голосов
/ 29 августа 2018

Могу ли я написать функции C, такие как (ссылка newNode) и (ссылка InsertEnd), в моем коде, где они не являются функциями postgres, которые должны быть объявлены и созданы в исходном файле?

Полагаю, вы имеете в виду, что вы можете написать их без palloc. Что вы можете. Хотя это не рекомендуется. PostgreSQL переносит malloc для и по соображениям производительности и по соображениям целостности (убедитесь, что память освобождается в конце txn). Вам придется позаботиться об этом без palloc, и я не уверен, с какими проблемами вы столкнетесь.

Могу ли я использовать palloc в функции, вызываемой из моей функции ввода? (в этом случае ссылка newNode)? Или я должен сделать это в моей функции ввода?

Конечно, если вы работаете на сервере, это то, что вы должны делать. Всего #include <postres.h>

...