В настоящее время я реализую пользовательский тип данных - связанный список, который имитирует набор целых чисел в файле с именем intList.c и, надеюсь, используется вместе с intList.source для установки его на мой сервер Postgres.
Итак, мои вопросы следующие:
Могу ли я написать функции C, такие как (ссылка newNode) и (ссылка InsertEnd) в моем коде, где они не являются функциями postgres, которые должны быть объявлены и созданы в исходном файле?
Могу ли я использовать 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);
}
Это только часть всего моего кода, я буду реализовывать операторы и другие функции, поэтому любые советы и указатели будут с благодарностью.