Các chức năng do người dùng xác định có thể được viết bằng C (hoặc một kèo bóng đá hom nay ngữ mà"ckèo bóng đá hom nay năng từ"Nội bộ"kèo bóng đá hom nay năng --- mã hóa thực tế
Hai quy ước gọi khác nhau hiện đang được sử dụng cho c"Phiên bản 1"quy ước gọi được chỉ định bằng cách viết Apg_function_info_v1 ()Cuộc gọi macro cho kèo bóng đá hom nay năng,Tạo kèo bóng đá hom nay nănglàCin
Lần đầu tiên kèo bóng đá hom nay năng do người dùng định nghĩa trong một cụ thểTạoDo đó, cho kèo bóng đá hom nay năng C do người dùng xác định
Thuật toán sau được sử dụng để định vị đối tượng được chia sẻTạolệnh:
Nếu tên là đường dẫn tuyệt đối, tệp đã cho là
Nếu tên bắt đầu bằng chuỗi$ libdir, phần đó được thay thế bằngPostgreSQLThư viện gói
Nếu không (tệp không được tìm thấy trong đường dẫn hoặc nó
Nếu chuỗi này không hoạt động, phần dành riêng cho nền tảng được chia sẻ.so) được gắn vào tên đã cho và cái này
Lưu ý:ID người dùngPostgreSQLMáy chủ chạy như phải có khả kèo bóng đá hom nayPostgresNgười dùng là một sai lầm phổ biến.
Trong mọi trường hợp, tên tệp được đưa ra trongTạo kèo bóng đá hom nay nănglệnh được ghi lại theo nghĩa đen trong
Lưu ý: POSTGRESQLsẽ không tự động biên dịch kèo bóng đá hom nay năng C. Đối tượngTạo kèo bóng đá hom nay năngLệnh. Nhìn thấyPhần 9.5.8cho
Lưu ý:sau khi nó được sử dụng lần đầu tiên, aloadlệnh hoặc bắt đầu một phiên mới.
Nên định vị kèo bóng đá hom nay thư viện được chia sẻ$ libdirhoặc thông qua động lực$ libdircó thể tìm thấypg_config.
Lưu ý:trướcPostgreSQLPhát hành 7.2, chỉ chính xácTạo kèo bóng đá hom nay năng. Cách tiếp cận này là
Bảng 9-1Cung cấp loại C cần thiết cho kèo bóng đá hom nay tham số trong kèo bóng đá hom nay hàm CPostgreSQL. The"Được xác định trong"Cột đưa ra tệp tiêu đề màPostgres.hĐầu tiên trong bất kỳ tệp nguồn nào, vì nó
Bảng 9-1. kèo bóng đá hom nay loại C tương đương cho tích hợpPostgreSQLloại
SQL Loại | C Loại | được xác định trong |
---|---|---|
Abstime | Tuyệt đối | Utils/nabstime.h |
Boolean | bool | Postgres.h(có thể |
Box | Box* | UTILS/GEO_DECLS.H |
bytea | 18622_18630 | Postgres.h |
"Char" | Char | (trình biên dịch tích hợp) |
Nhân vật | bpchar* | Postgres.h |
CID | CommandID | Postgres.h |
ngày | dateadt | Utils/date.h |
SmallInt(INT2) | INT2hoặcINT16 | Postgres.h |
int2Vector | int2Vector* | Postgres.h |
Số nguyên(INT4) | INT4hoặcINT32 | Postgres.h |
Real(float4) | float4* | Postgres.h |
độ chính xác gấp đôi(float8) | float8* | Postgres.h |
Khoảng | Khoảng* | Utils/Timestamp.h |
LSEG | LSEG* | UTILS/GEO_DECLS.H |
tên | tên | Postgres.h |
OID | OID | Postgres.h |
oidvector | oidvector* | Postgres.h |
đường dẫn | đường dẫn* | UTILS/GEO_DECLS.H |
điểm | điểm* | UTILS/GEO_DECLS.H |
RegProc | RegProc | Postgres.h |
Relime | Relativetime | Utils/nabstime.h |
Text | Text* | Postgres.h |
TID | itempulum | Storage/itemptr.h |
thời gian | Timeadt | utils/date.h |
Thời gian với múi giờ | Timetzadt | Utils/date.h |
Dấu thời gian | dấu thời gian* | Utils/Timestamp.h |
Tinterval | Timeinterval | Utils/nabstime.h |
Varchar | Varchar* | Postgres.h |
XID | TranstercentID | Postgres.h |
nội bộ,PostgreSQLTrân trọng loại cơ sở là"Blob of. kèo bóng đá hom nay chức năng do người dùng xác định mà bạn xác địnhPostgreSQLcó thể hoạt động trên nó. Đó là,PostgreSQLsẽ chỉ lưu trữ và
Pass by giá trị, độ dài cố định
Pass by tham chiếu, độ dài cố định
Pass by tham chiếu, độ dài biến
kèo bóng đá hom nay loại giá trị chỉ có thể có chiều dài 1, 2 hoặc 4 byte (cũng là 8sizeof (mốc dữ liệu)là 8 trênLongLoại nguy hiểmintLoại là 4 byte trên hầu hết kèo bóng đá hom nay UnixINT4gõ trên máy Unix có thể là:
/ * 4 byte số nguyên, được truyền theo giá trị */
PostgreSQLtự động
Mặt khác, kèo bóng đá hom nay loại có độ dài cố định có thểPostgreSQLloại:
/ * Cấu trúc 16 byte, được truyền qua tham chiếu */
Chỉ có thể sử dụng kèo bóng đá hom nay gợi ý cho kèo bóng đá hom nay loại như vậy khi chuyển chúng vàoPostgreSQLkèo bóng đá hom nay năng. Để trả về giá trị của một loại như vậy, hãy phân bổ quyềnpalloc (), điền vàokhông bao giờSửa đổi nội dung của A
Cuối cùng, tất cả kèo bóng đá hom nay loại có độ dài thay đổi cũng phải được truyền qua
Typedef Struct
Rõ ràng, trường dữ liệu được khai báo ở đây không đủ dàiC, Chúng tôi dựa vào kiến thức rằngCTrình biên dịch sẽ không kiểm tra phạm viCSách giáo khoa lập trình trước khi đào sâuPostgreSQLMáy chủ
#include "Postgres.h"
Varhdrszgiống nhưsizeof (int4), nhưng nó được coi là phong cách tốt đểVarhdrszđể tham khảo
Bây giờ chúng tôi đã vượt qua tất cả kèo bóng đá hom nay cấu trúc có thể
Chúng tôi trình bày"Kiểu cũ"Gọi quy ước đầu tiên --- Mặc dù cách tiếp cận này hiện là
Đây là một số ví dụ:
#include "Postgres.h"
Giả sử rằng mã trên đã được chuẩn bị trong Tệpfuncs.cvà được biên dịch thành một chia sẻPostgreSQLvới kèo bóng đá hom nay lệnh như thế này:
Tạo kèo bóng đá hom nay năng add_one (int4) Trả về int4PGROOT/Hướng dẫn/kèo bóng đá hom nay ngữ của Funcs cPGROOT/Hướng dẫn/Funcs ',PGROOT/Hướng dẫn/kèo bóng đá hom nay ngữ của funcs cPGROOT/Hướng dẫn/kèo bóng đá hom nay ngữ 'funcs cPGROOT/Hướng dẫn/kèo bóng đá hom nay ngữ của funcs c
ở đâyPGROOTlà viết tắt củaPOSTGRESQLCây nguồn. (Phong cách tốt hơn sẽ là sử dụng chỉ'funcs'trongASmệnh đề, sau khi đã thêmPGROOT/Hướng dẫnđến đường dẫn tìm kiếm. Trong mọi trường hợp, chúng tôi có thể bỏ qua.sohoặc.SL.)
Lưu ý rằng chúng tôi đã chỉ định kèo bóng đá hom nay chức năng là"nghiêm ngặt", nghĩa là hệ thống nên
Mặc dù quy ước gọi này rất đơn giản, nhưng nó không phải là
Quy ước gọi phiên bản-1 dựa trên kèo bóng đá hom nay macro để
Datum funcname (pg_function_args)
Ngoài ra, cuộc gọi macro
pg_function_info_v1 (funcname);
phải xuất hiện trong cùng một tệp nguồn (thông thường là nóNội bộ-LanguagePostgreSQLHiện tại giả định tất cả kèo bóng đá hom nay chức năng nội bộ là phiên bản-1.Yêu cầucho được tải động
Trong hàm phiên bản-1, mỗi đối số thực tế được tìm nạppg_getarg_xxx()
Macro tương ứng vớipg_return_xxx()
Macro cho Return
Ở đây chúng tôi hiển thị kèo bóng đá hom nay chức năng giống như trên, được mã hóa trong phiên bản-1
#include "Postgres.h"
TheTạo kèo bóng đá hom nay năngkèo bóng đá hom nay lệnh là
Thoạt nhìn, kèo bóng đá hom nay quy ước mã hóa phiên bản-1 có thể xuất hiệnadd_one_float8
, chúng ta không còn cần phải biếtfloat8là loại tham chiếu qua.GetArgmacro cho kèo bóng đá hom nay loại có độ dài thay đổi cần phải đối phó với"Nướng"(nén hoặcCopyText
vàConcat_Text
kèo bóng đá hom nay chức năng hiển thị ở trên làpg_detoast_datum ()
trên
Một cải tiến lớn về kèo bóng đá hom nay chức năng phiên bản-1 tốt hơnpg_argisnull (n)
Cho phép một kèo bóng đá hom nay năng kiểm tra"nghiêm ngặt"). Như vớipg_getarg_xxx()
macro, đối số đầu vàopg_getarg_xxx()
Cho đến khi người ta xác minh rằngpg_return_null ()
; Điều này hoạt động trong
kèo bóng đá hom nay tùy chọn khác được cung cấp trong giao diện kiểu mới là haipg_getarg_xxx()
Macros. Cái đầu tiên trong số này,pg_getarg_xxx_copy ()
Đảm bảo trả lại aPG_GetArg_xxx_copy ()
macro đảm bảo a
Biến thể thứ hai bao gồmpg_getarg_xxx_slice ()
Macro lấyBẢNG ALTERTableNameCột thay đổicolnameĐặt lưu trữStorAgetype. Loại lưu trữ là một trongtrơn, bên ngoài, mở rộnghoặcchính.)
kèo bóng đá hom nay quy ước gọi chức năng phiên bản-1"SET"Kết quả và thực hiệnTrong nguồn
kèo bóng đá hom nay loại tổng hợp không có bố cục cố định như CPOSTGRESQLcung cấp aPostgreSQLxử lý một tập hợp kèo bóng đá hom nay hàng, mỗi hàng sẽ được chuyển vàotuple. Giả sử chúng ta muốn viết một kèo bóng đá hom nay năng để
Chọn Tên, C_OverPaid (EMP, 1500)
Trong truy vấn ở trên, chúng ta có thể xác địnhc_overpaid
As:
#include "Postgres.h"
GetAttributionByName
làPostgreSQLHàm hệ thốngtupletableslot*được chuyển vào kèo bóng đá hom nay năng, tênGetAttributionByName
Trả về ADatumGiá trị mà bạn có thể chuyển đổi sang dữ liệu phù hợpDatumgetxxx()
Macro.
lệnh sau cho phépPostgreSQLBiết vềc_overpaid
kèo bóng đá hom nay năng:
Tạo kèo bóng đá hom nay năng C_overPaid (EMP, INT4)PGROOT/Hướng dẫn/Funcs '
API kèo bóng đá hom nay năng bảng hỗ trợ trong việc tạo raPhần 9.7). kèo bóng đá hom nay năng bảngSRFs).
API chức năng bảng dựa trên kèo bóng đá hom nay macro và kèo bóng đá hom nay chức năng để
#include "funcapi.h"
Hỗ trợ API kèo bóng đá hom nay năng bảng để trả về tổng hợpAttinMetadataCấu trúc. Cấu trúc nàytupledesc. Thông tintupledesc, nhưng nó được lưu trữ ở đây để tránhAttinMetadataCấu trúc nên được tính toán
typedef struct attinmetadata
Để hỗ trợ bạn điền vào cấu trúc này, một số
46510_46569
để nhậntupledescDựa trên a
46709_46770
để nhậntupledescdựa trên atupledesccho một cơ sở (vô hướng) hoặc tổng hợp
47029_47092
Sẽ trả một con trỏ choAttinMetadata, khởi tạo dựa trêntupledesc. AttinMetadatacó thể được sử dụng cùng nhau
Để trả về một tuple, bạn phải tạo một khe cắm Tuple dựa trêntupledesc. Bạn có thể sử dụng
tupletableslot *tupledescgetslot (tupledesc tupdesc)
Để khởi tạo khe cắm này hoặc lấy cái này quaDatumđể trả về chức năng. kèo bóng đá hom nay
Sau khi xây dựngAttinMetadataCấu trúc,
48103_48180
Có thể được sử dụng để xây dựng AHeaptupleĐã cho dữ liệu người dùng ở dạng chuỗi C.Giá trị
Mảng phải được đặt thànhnull. kèo bóng đá hom nay năng này sẽ cần được gọi
Xây dựng một tuple quatupledescgetattinmetadata
vàbuildTupleFromCStrings
chỉ thuận tiệnthói quen đếnDatums trực tiếp vào Atupledescvà Atupletableslot, nhưng khôngAttinMetadata.
Một khi bạn đã xây dựng một tuple để trở về từ kèo bóng đá hom nay năng của mình,Datum. Sử dụng
49666_49722
để nhậnDatumCho một tuple và aDatumcó thể được trả về
Một ví dụ xuất hiện bên dưới.
Hàm hoàn trả SET (SRF) thường được gọi một lần cho mỗiSRFDo đó phải tiết kiệm đủ trạng thái để nhớ nó là gìfunccallcontextCấu trúc để giúp kiểm soátfcinfo- flinfo- fn_extrađược sử dụng để giữfunccallcontexttrên kèo bóng đá hom nay cuộc gọi.
Cấu trúc typedef
ANSRFSử dụng một sốfunccallcontextCấu trúc (vàfn_extra).
SRF_IS_FIRSTCALL ()
Để xác định xem kèo bóng đá hom nay năng của bạn có được gọi cho
srf_firstcall_init ()
Để khởi tạofunccallcontext. Trên mọi cuộc gọi kèo bóng đá hom nay năng,
srf_percall_setup ()
Để thiết lập đúng cách sử dụngfunccallcontextvà xóa bất kỳ trước đó
Nếu kèo bóng đá hom nay năng của bạn có dữ liệu để trả về, hãy sử dụng
srf_return_next (funcctx, result)
Để trả lại cho người gọi. (Theresultphải làDatum,,
srf_return_done (funcctx)
Để dọn dẹp và kết thúcSRF.
Bối cảnh bộ nhớ hiện tại khiSRFđược gọi là mộtPFREE
mọi thứ bạnPalloC
; Nó sẽ biến mất dù sao.multi_call_memory_ctxlà một phù hợpSRFđược hoàn thành chạy.multi_call_memory_ctxWHER
Một ví dụ giả giả hoàn chỉnh trông giống như
Datum
Một ví dụ hoàn chỉnh về đơn giảnSRFTrả lại một loại tổng hợp trông
pg_function_info_v1 (testPassbyVal);
Với mã SQL hỗ trợ
Tạo loại __TestPassByVal AS (F1 Int4, F2 Int4, F3 Int4);
xem59717_59736Để biết thêm
Bây giờ chúng tôi chuyển sang nhiệm vụ khó viết hơnC(bao gồm cả việc sử dụng con trỏ) trước khi cố gắng viếtCkèo bóng đá hom nay chức năng để sử dụng vớiPostgreSQL. Trong khi nó có thể làCthànhPostgreSQL, điều này thường khó khăn (khiFortranvàPascalthường không theo cùng mộtGọi quy ướcASC. Nghĩa là, các kèo bóng đá hom nay ngữ khác không quaC.
kèo bóng đá hom nay quy tắc cơ bản để xây dựngCkèo bóng đá hom nay chức năng như sau:
sử dụngpg_configĐể tìm ra nơiPostgreSQLkèo bóng đá hom nay tệp tiêu đề máy chủ làPOSTGRESQL7.2. VìPostgreSQL7.1 Bạn nên sử dụng--includedir
.PG_CONFIGsẽ thoát với một
Khi phân bổ bộ nhớ, hãy sử dụngPostgreSQLthói quenPalloC
vàPFREE
Thay vì tương ứngCThói quen thư việnmalloc
vàmiễn phí
. Bộ nhớ được phân bổ bởiPalloC
sẽ được giải phóng
Luôn luôn bằng không kèo bóng đá hom nay byte của cấu trúc của bạn bằng cách sử dụngMemset
hoặcBzero
. Một số thói quen (chẳng hạn như băm
Hầu hết kèo bóng đá hom nay bên trongPOSTGRESQLkèo bóng đá hom nay loại được khai báo trongPostgres.h, trong khi kèo bóng đá hom nay năngpg_function_args, v.v.)fmgr.h, vì vậy bạn sẽ cần phải bao gồm tạiPostgres.h Đầu tiên, trước bất kỳ ai khácPostgres.hcũng sẽ bao gồmELOG.Hvàpalloc.hcho bạn.
Tên biểu tượng được xác định trong kèo bóng đá hom nay tệp đối tượng không đượcPostgreSQLMáy chủ
biên dịch và liên kết mã đối tượng của bạn để có thểPostgreSQLLuôn yêu cầu đặc biệtPhần 9.5.8Để được giải thích chi tiết về cách làm cho bạn
Trước khi bạn có thể sử dụngPostgreSQLkèo bóng đá hom nay chức năng mở rộng được viết trongThư viện chia sẻCần phải có
Để biết thêm thông tin, bạn nên đọc tài liệu củaCCvà Trình chỉnh sửa liên kết,LD. Ngoài ra,PostgreSQLMã nguồn chứa một sốĐóng gópThư mục. Nếu bạn dựa vào những ví dụ này, bạn sẽ làmPOSTGRESQLMã nguồn, tuy nhiên.
Tạo chia sẻMã độc lập vị trí(pic), về mặt khái niệm
Trong kèo bóng đá hom nay ví dụ sau, chúng tôi cho rằng mã nguồn của bạn làfoo.cvà chúng tôi sẽ tạo mộtfoo.so. kèo bóng đá hom nayfoo.oTrừ khi có ghi chú khác. Một thư viện được chia sẻ
Cờ trình biên dịch để tạopiclà-FPIC
. Cờ trình liên kết để tạo chia sẻ-shared
.
GCC -FPIC -C FOO.C
Điều này được áp dụng kể từ phiên bản 4.0 củaBSD/OS.
Cờ trình biên dịch để tạopiclà-FPIC
. Để tạo kèo bóng đá hom nay thư viện được chia sẻ-shared
.
GCC -FPIC -C FOO.C
Điều này được áp dụng như phiên bản 3.0 củaFreeBSD.
Cờ trình biên dịch của trình biên dịch hệ thống để tạopiclà+Z
. Khi sử dụngGCCĐó là-FPIC
. Cờ liên kết để chia sẻ-B
. Vì thế
cc +z -c foo.c
hoặc
GCC -FPIC -C FOO.C
và sau đó
ld -b -o foo.sl foo.o
HP-UXSử dụng.SLđể chia sẻ
piclà mặc định,-shared
.
CC -C FOO.C
Cờ trình biên dịch để tạopiclà-FPIC
. Trên một số nền tảng trong một số-FPIC
phải được sử dụng-FPIC
Không hoạt động. Tham khảo-shared
. Một ví dụ hoàn chỉnh trông giống như
cc -fpic -c foo.c
Đây là một mẫu. Nó giả định kèo bóng đá hom nay công cụ nhà phát triển là
CC -C FOO.C
Cờ trình biên dịch để tạopiclà-FPIC
. VìelfHệ thống, trình biên dịch với-shared
được sử dụng để liên kếtld -bsharableđược sử dụng.
GCC -FPIC -C FOO.C
Cờ trình biên dịch để tạopiclà-FPIC
. Ldđược sử dụng để liên kết kèo bóng đá hom nay thư viện được chia sẻ.
GCC -FPIC -C FOO.C
Cờ trình biên dịch để tạopiclà-KPIC
Với trình biên dịch mặt trời và-FPIC
vớiGCC. Để liên kết kèo bóng đá hom nay thư viện chia sẻ,-g
với-shared
vớiGCC.
CC -KPIC -C FOO.C
hoặc
GCC -FPIC -C FOO.C
piclà mặc định,LDvới kèo bóng đá hom nay tùy chọn đặc biệt được sử dụng để thực hiện
CC -C FOO.C
Quy trình tương tự được sử dụng với GCC thay vì
Cờ trình biên dịch để tạopiclà-K
Với trình biên dịch SCO và-FPIC
vớiGCC. Để liên kết kèo bóng đá hom nay thư viện chia sẻ,-g
với-shared
vớiGCC.
cc -k pic -c foo.c
hoặc
GCC -FPIC -C FOO.C
Tip:Nếu bạn muốn đóng gói tiện ích mở rộng của mìnhgnu libtoolcho
Tệp thư viện chia sẻ kết quả sau đó có thể được tải vàoPostgreSQL. Khi chỉ địnhTạo kèo bóng đá hom nay năngLệnh, người ta phải đặt tên cho tệp thư viện được chia sẻ,.sohoặc.SL) có thểTạo kèo bóng đá hom nay năngLệnh và thông thường nên được bỏ qua để tốt nhất
Tham khảo lạiPhầnGiới thiệu về nơi máy chủ mong đợi tìm được chia sẻ