PostgreSQL C風格函式TEXT優化

2021-08-09 18:28:34 字數 2529 閱讀 8898

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 的宣告的舊樣式宣告都有中的宣告是在括號...