我目前正在实现一种用户定义的数据类型-一种链接列表,该列表模仿名为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);
}
这只是我整个代码的一部分,我将实现运算符和其他函数,因此,任何技巧和指针将不胜感激。