1.在c函式中不檢查引數是否為null,null引數檢查在create function sql中設定strict實現.
2.當用pg_getarg_xx獲取引數後,根據需要檢查引數值是否有效.
3.如不能編譯是因為缺少標頭檔案,自己新增缺失的標頭檔案即可.
4.postgresql分配和釋放記憶體使用palloc,palloc0和pfree.palloc0分配後會將記憶體設定為0.其它和palloc一樣,在原始碼backend/utils/mmgr/mcxt.c中檢視.
5.palloc分配的記憶體無需再檢查是否分配成功(null==ptr),在palloc內部已經檢查.
6.記憶體使用原則是誰分配誰釋放(函式返回值除外),這點和c/c++一致.
7.當palloc分配的記憶體做為函式的返回值時,不需要pfree釋放記憶體,由postgresql自動釋放.
為更好說明問題,以下步驟比較繁瑣,
#include "postgres.h"
#include "fmgr.h"
#include "utils/builtins.h"
#ifdef pg_module_magic
pg_module_magic;
#endif
pgdllexport datum string_test(pg_function_args);
pg_function_info_v1(string_test);
datum string_test(pg_function_args)
函式cstring_to_text內部直接呼叫了cstring_to_text_with_len(const char *s, int len),cstring_to_text_with_len實現如下:
text* cstring_to_text_with_len(const char *s, int len)
datum string_test(pg_function_args)
當使用postgresql的text型別時要注意以幾點:
1.在text型別開頭用varhdrsz位元組說明字串的長度.
截止目前varhdrsz定義為4位元組,將來有可能變化 ,所以不要直接使用4,應該使用varhdrsz
2.因此分配記憶體時,記憶體大小必須包含varhdrsz.
size_t alloc_size = (src_size + 16 + varhdrsz);
src_size + 16是實際的資料儲存空間 ,varhdrsz位元組說明字串的長度
3.獲取分配的資料記憶體空間使用 vardata.
pbuf = vardata(result);
4.如果明確知道實際的記憶體大小,在palloc完成後,就立刻呼叫set_varsize設定記憶體的大小text *result = (text *)palloc(alloc_size);
set_varsize(result, all_size + varhdrsz);
5.如果在分配時不知道需要的記憶體大小,可以在palloc時分配足夠大的記憶體空間,然後計算實際的記憶體大小在返回前呼叫set_varsize設定記憶體的大小
例如: 28個utf-8格式的字元要返回,但是在生產字串之間我並不知道28個utf-8字元實際占用的記憶體大小,因些在分配前一次性分配足夠的空間
utf8單個字元最多使用6位元組
text *result = (text *)palloc(28 * 6 + varhdrsz);
現在生成28個utf-8字元,並在生成過程中或生成完成後計算實際的記憶體大小.
現在我們已經知道28個utf-8字元實際使用的記憶體大小,因此在函式返回前呼叫set_varsize設定實際使用的記憶體大小
set_varsize(result, all_size + varhdrsz);
pg_return_text_p(pointergetdatum(result));
set_varsize必須是實際使用的記憶體大小加上varhdrsz,否則postgresql不能正確顯示文字
set_varsize必須是實際使用的記憶體大小加上varhdrsz,否則postgresql不能正確顯示文字
set_varsize必須是實際使用的記憶體大小加上varhdrsz,否則postgresql不能正確顯示文字
6.postgresql的字串不是以null結尾的,在開頭有4位元組說明字串的長度,類似bstr的定義,所以不需要字元結束標記null
不需要這個
//buffer[all_size] = '\0';
在實踐使用過程中字串結束符有沒有都可以,如果為了和c函式相容,可以保留
7.postgresql的text操作函式總結
varhdrsz獲取text型別頭的大小
在分析記憶體和設定記憶體大小時一定要加上varhdrsz,主要是palloc,palloc0和set_varsize.
vardata獲取分配的資料記憶體空間
任意語言訪問PostgreSQL C語言介面
作為一名系統管理員,可能每天都要通過某段程式連線到資料庫。開源軟體的乙個好處是可以根據需要修改程式 如果程式後台使用postgresql資料庫,可以很容易用各種語言對其進行訪問。本文作為系列文章的第一篇,會陸續介紹c c php tcl python及perl等程式語言對postgresql的訪問方...
C語言編碼風格(四) 函式
每個函式都應該設計得盡可能簡單,簡單的函式才容易維護。應遵循以下原則 實現乙個函式只是為了做好一件事情,不要把函式設計成用途廣泛 面面俱到的,這樣的函式肯定會超長,而且往往不可重用,維護困難。函式內部的縮排層次不宜過多,一般以少於4層為宜。如果縮排層次太多就說明設計得太複雜了,應考慮分割成更小的函式...
舊式的C風格的函式定義
舊式的c風格的函式定義又叫k r式函式定義 void krfunc a,b definition int a char b 新式的c風格的寫法為 void ansifunc int a,char b k r式函式宣告,沒有型別表示預設是int 有時稱為 k r 的宣告的舊樣式宣告都有中的宣告是在括號...