tỷ lệ kèo bóng đá chức năng do người dùng xác định có thể được viết bằng C (hoặc một ngôn ngữ có thể được thực hiện tương thích với C, chẳng hạn như C ++). tỷ lệ kèo bóng đá chức năng như vậy được biên dịch thành tỷ lệ kèo bóng đá đối tượng có thể tải động (còn được gọi là thư viện được chia sẻ) và được tải bởi máy chủ theo yêu cầu.C Ngôn ngữchức năng từHồiNội bộHàm - tỷ lệ kèo bóng đá quy ước mã hóa thực tế về cơ bản giống nhau cho cả hai. .
Hiện tại chỉ có một quy ước gọi được sử dụng cho tỷ lệ kèo bóng đá hàm C (Phiên bản 1”). Hỗ trợ cho quy ước gọi đó được biểu thị bằng cách viết tỷ lệ kèo bóng đápg_function_info_v1 ()
Cuộc gọi macro cho chức năng, như được minh họa bên dưới.
Lần đầu tiên một tỷ lệ kèo bóng đá do người dùng xác định trong một tệp đối tượng có thể tải cụ thể được gọi trong phiên, trình tải động tải tệp đối tượng đó vào bộ nhớ để có thể gọi tỷ lệ kèo bóng đá. TheTạo chức năng
Đối với chức năng C do người dùng xác định phải chỉ định hai phần thông tin cho tỷ lệ kèo bóng đá: tên của tệp đối tượng có thể tải và tên C (ký hiệu liên kết) của tỷ lệ kèo bóng đá cụ thể để gọi trong tệp đối tượng đó. Nếu tên C không được chỉ định rõ ràng thì nó được coi là giống như tên tỷ lệ kèo bóng đá SQL.
Thuật toán sau được sử dụng để định vị tệp đối tượng được chia sẻ dựa trên tên được đưa ra trongTạo chức năng
lệnh:
Nếu tên là đường dẫn tuyệt đối, tệp đã cho được tải.
Nếu tên bắt đầu bằng chuỗi$ libdir
, phần đó được thay thế bằngPostgreSQLTên thư mục thư viện gói, được xác định tại thời điểm xây dựng.
Nếu tên không chứa phần thư mục, tệp được tìm kiếm trong đường dẫn được chỉ định bởi biến cấu hìnhDynamic_l Library_path.
Nếu không (tệp không được tìm thấy trong đường dẫn hoặc nó chứa tỷ lệ kèo bóng đá phần thư mục không Absolute), trình tải động sẽ cố gắng lấy tên như đã đưa ra, rất có thể sẽ thất bại. (Không đáng tin cậy khi phụ thuộc vào thư mục làm việc hiện tại.)
Nếu chuỗi này không hoạt động, phần mở rộng tên tệp thư viện chia sẻ dành riêng cho nền tảng (thường là.so
) được thêm vào tên đã cho và chuỗi này được thử lại. Nếu điều đó cũng thất bại, tải sẽ không thành công.
Nên định vị tỷ lệ kèo bóng đá thư viện được chia sẻ liên quan đến$ libdir
hoặc thông qua đường dẫn thư viện động. Điều này đơn giản hóa phiên bản nâng cấp nếu cài đặt mới ở tỷ lệ kèo bóng đá vị trí khác.$ libdir
Viết tắt có thể được tìm thấy với lệnhpg_config - -pkglibdir
.
ID người dùngPostgreSQLMáy chủ chạy vì phải có thể đi qua đường dẫn đến tệp bạn định tải. Làm cho tệp hoặc tỷ lệ kèo bóng đá thư mục cấp cao hơn không thể đọc được và/hoặc không thể thực thi bởiPostgresNgười dùng là tỷ lệ kèo bóng đá sai lầm phổ biến.
Trong mọi trường hợp, tên tệp được đưa ra trongTạo chức năng
Lệnh được ghi lại theo nghĩa đen trong danh mục hệ thống, vì vậy nếu tệp cần được tải lại, quy trình tương tự được áp dụng.
PostgreSQLsẽ không tự động biên dịch chức năng C. Tệp đối tượng phải được biên dịch trước khi nó được tham chiếu trongTạo chức năng
Lệnh. Nhìn thấyPhần 36.10.5Để biết thêm thông tin.
Để đảm bảo rằng tỷ lệ kèo bóng đá tệp đối tượng được tải động không được tải vào tỷ lệ kèo bóng đá máy chủ không tương thích,PostgreSQLKiểm tra xem tệp có chứaHồiKhối ma thuậtHồiVới tỷ lệ kèo bóng đá nội dung thích hợp. Điều này cho phép máy chủ phát hiện sự không tương thích rõ ràng, chẳng hạn như mã được biên dịch cho một phiên bản chính khác củaPostgreSQL. Để bao gồm một khối ma thuật, hãy viết nó vào một (và chỉ một) của tỷ lệ kèo bóng đá tệp nguồn mô -đun, sau khi bao gồm tiêu đềfmgr.h
:
pg_module_magic;
Sau khi nó được sử dụng lần đầu tiên, một tệp đối tượng được tải động được giữ lại trong bộ nhớ. tỷ lệ kèo bóng đá cuộc gọi trong tương lai trong cùng một phiên đến (tỷ lệ kèo bóng đá) hàm trong tệp đó sẽ chỉ phải chịu chi phí nhỏ của tra cứu bảng ký hiệu.
Tùy chọn, một tệp được tải động có thể chứa chức năng khởi tạo. Nếu tệp bao gồm một tỷ lệ kèo bóng đá có tên_pg_init
, chức năng đó sẽ được gọi ngay sau khi tải tệp. tỷ lệ kèo bóng đá không nhận được thông số và nên trả lại void.
Để biết cách viết tỷ lệ kèo bóng đá chức năng ngôn ngữ C, bạn cần biết làm thế nàoPostgreSQLnội bộ đại diện cho tỷ lệ kèo bóng đá loại dữ liệu cơ sở và cách chúng có thể được truyền đến và từ tỷ lệ kèo bóng đá chức năng. Trong nội bộ,PostgreSQLTrân trọng loại cơ sở làHồiBlob of MemoryHồi. tỷ lệ kèo bóng đá chức năng do người dùng xác định mà bạn xác định qua một loại lần lượt xác định cáchPostgreSQLcó thể hoạt động trên nó. Đó là,PostgreSQLSẽ chỉ lưu trữ và truy xuất dữ liệu từ đĩa và sử dụng tỷ lệ kèo bóng đá chức năng do người dùng xác định của bạn vào đầu vào, xử lý và xuất dữ liệu.
tỷ lệ kèo bóng đá loại cơ sở có thể có một trong ba định dạng nội bộ:
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
tỷ lệ kèo bóng đá loại giá trị phụ chỉ có thể là 1, 2 hoặc 4 byte theo chiều dài (cũng là 8 byte, nếusizeof (mốc dữ liệu)
là 8 trên máy của bạn). Bạn nên cẩn thận để xác định tỷ lệ kèo bóng đá loại của bạn sao cho chúng sẽ có cùng kích thước (tính bằng byte) trên tất cả tỷ lệ kèo bóng đá kiến trúc.Long
Loại nguy hiểm vì nó là 4 byte trên một số máy và 8 byte trên tỷ lệ kèo bóng đá máy khác, trong khiint
Loại là 4 byte trên hầu hết tỷ lệ kèo bóng đá máy Unix. Một triển khai hợp lý củaINT4
gõ trên máy Unix có thể là:
/ * 4 byte số nguyên, được truyền theo giá trị */
(Mã PostgreSQL C thực tế gọi loại nàyINT32
, bởi vì đó là tỷ lệ kèo bóng đá quy ước trong c màint
có nghĩa làXX
XX
bit. Do đó, lưu ý rằng loại cINT8
có kích thước 1 byte. Loại SQLINT8
được gọi làint64
Trong C. Xem thêmBảng 36.2.)
Mặt khác, tỷ lệ kèo bóng đá loại có độ dài cố định có thể được truyền theo tham chiếu. Ví dụ: đây là việc triển khai mẫu củaPostgreSQLloại:
/ * cấu trúc 16 byte, được truyền qua tham chiếu */
Chỉ có thể sử dụng con trỏ đến tỷ lệ kèo bóng đá loại như vậy khi chuyển chúng vào và ra khỏiPostgreSQLchức năng. Để trả về giá trị của tỷ lệ kèo bóng đá loại như vậy, hãy phân bổ đúng lượng bộ nhớ vớiPalloC
, điền vào bộ nhớ được phân bổ và trả về tỷ lệ kèo bóng đá con trỏ cho nó. .PalloC
Và chỉ cần trả con trỏ về giá trị đầu vào.)
Cuối cùng, tất cả tỷ lệ kèo bóng đá loại có độ dài thay đổi cũng phải được truyền bằng tham chiếu. Tất cả tỷ lệ kèo bóng đá loại có độ dài thay đổi phải bắt đầu bằng trường chiều dài mờ có chính xác 4 byte, sẽ được đặt bởiset_varsize
; Không bao giờ đặt trường này trực tiếp!
Một điểm quan trọng khác là tránh để lại bất kỳ bit không chính xác nào trong tỷ lệ kèo bóng đá giá trị kiểu dữ liệu; Ví dụ, hãy cẩn thận với bất kỳ byte đệm căn chỉnh nào có thể có trong tỷ lệ kèo bóng đá cấu trúc.
không bao giờSửa đổi nội dung của giá trị đầu vào ngang qua. Nếu bạn làm như vậy, bạn có khả năng tham nhũng dữ liệu trên đĩa, vì con trỏ bạn được cung cấp có thể chỉ trực tiếp vào bộ đệm đĩa.Phần 36.12.
Ví dụ, chúng ta có thể xác định loạiText
như sau:
Typedef Struct
TheKý hiệu có nghĩa là độ dài thực tế của phần dữ liệu không được chỉ định bởi Tuyên bố này.
Khi thao tác tỷ lệ kèo bóng đá loại có độ dài biến, chúng ta phải cẩn thận để phân bổ số lượng bộ nhớ chính xác và đặt trường độ dài một cách chính xác. Ví dụ: nếu chúng tôi muốn lưu trữ 40 byte trongText
Cấu trúc, chúng ta có thể sử dụng tỷ lệ kèo bóng đá đoạn mã như thế này:
#include "Postgres.h"
Varhdrsz
giống nhưsizeof (int32)
, nhưng nó được coi là phong cách tốt để sử dụng macroVarhdrsz
để chỉ kích thước của chi phí cho tỷ lệ kèo bóng đá loại có độ dài thay đổi. Ngoài ra, trường chiều dàiphảiđược đặt bằngset_varsize
Macro, không phải bằng cách gán đơn giản.
Bảng 36.2Hiển thị tỷ lệ kèo bóng đá loại C tương ứng với nhiều loại dữ liệu SQL tích hợp củaPostgreSQL. Theđược xác định trongCột cung cấp tệp tiêu đề cần được đưa vào để có được định nghĩa loại. .Postgres.h
Đầu tiên trong bất kỳ tệp nguồn nào của mã máy chủ, vì nó tuyên bố một số điều mà bạn sẽ cần và vì bao gồm tỷ lệ kèo bóng đá tiêu đề khác trước tiên có thể gây ra tỷ lệ kèo bóng đá vấn đề về tính di động.
Bảng 36.2. tỷ lệ kèo bóng đá loại C tương đương cho tỷ lệ kèo bóng đá loại SQL tích hợp
SQL Loại | C Loại | được xác định trong |
---|---|---|
Boolean |
bool |
Postgres.h (có thể trình biên dịch tích hợp) |
Box |
Box* |
UTILS/GEO_DECLS.H |
bytea |
bytea* |
Postgres.h |
"Char" |
Char |
(trình biên dịch tích hợp) |
ký tự |
bpchar* |
Postgres.h |
CID |
CommandID |
Postgres.h |
ngày |
dateadt |
Utils/date.h |
float4 (Real ) |
float4 |
Postgres.h |
float8 (Double Precision ) |
float8 |
Postgres.h |
INT2 (smallint ) |
INT16 |
Postgres.h |
INT4 (Số nguyên ) |
INT32 |
Postgres.h |
INT8 (Bigint ) |
int64 |
Postgres.h |
Khoảng |
Khoảng* |
DataType/Timestamp.h |
LSEG |
lseg* |
UTILS/GEO_DECLS.H |
tên |
tên |
Postgres.h |
Số |
Số |
Utils/Numeric.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 |
RegProcedure |
Postgres.h |
Text |
Text* |
Postgres.h |
tid |
itemPulum |
lưu trữ/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 |
DataType/Timestamp.h |
dấu thời gian với múi giờ |
TIMESTAMPTZ |
DataType/Timestamp.h |
Varchar |
Varchar* |
Postgres.h |
XID |
Giao dịchID |
Postgres.h |
Bây giờ chúng tôi đã vượt qua tất cả tỷ lệ kèo bóng đá cấu trúc có thể có cho tỷ lệ kèo bóng đá loại cơ sở, chúng tôi có thể hiển thị một số ví dụ về tỷ lệ kèo bóng đá chức năng thực sự.
quy ước gọi phiên bản-1 dựa trên tỷ lệ kèo bóng đá macro để đàn áp hầu hết sự phức tạp của tỷ lệ kèo bóng đá đối số và kết quả truyền. Tuyên bố C của hàm phiên bản-1 luôn luôn:
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 tỷ lệ kèo bóng đá tệp nguồn. (Thông thường, nó được viết ngay trước chính chức năng.) Cuộc gọi macro này không cần thiết choNội bộ
33849_33878POSTGRESQLGiả sử rằng tất cả tỷ lệ kèo bóng đá chức năng nội bộ đều sử dụng quy ước phiên bản-1. Tuy nhiên, nó được yêu cầu cho tỷ lệ kèo bóng đá chức năng được tải động.
Trong tỷ lệ kèo bóng đá phiên bản-1, mỗi đối số thực tế được tìm nạp bằng cách sử dụngpg_getarg_
Macro tương ứng với kiểu dữ liệu của đối số. .xxx
()pg_argisnull ()
; xem bên dưới.) Kết quả được trả về bằngpg_return_
Macro cho loại trả về.xxx
()pg_getarg_
lấy đối số của nó số lượng đối số tỷ lệ kèo bóng đá để tìm nạp, trong đó số lượng bắt đầu ở 0.xxx
()pg_return_
lấy đối số của nó giá trị thực tế để trả về.xxx
()
Dưới đây là tỷ lệ kèo bóng đá số ví dụ sử dụng quy ước gọi phiên bản-1:
#include "Postgres.h"
Giả sử rằng mã trên đã được chuẩn bị trong tệpfuncs.c
và được biên dịch thành một đối tượng được chia sẻ, chúng ta có thể xác định tỷ lệ kèo bóng đá chức năng thànhPostgreSQLVới tỷ lệ kèo bóng đá lệnh như thế này:
Tạo tỷ lệ kèo bóng đá add_one (số nguyên) Trả về IntegerThư mục
/funcs ',' add_one 'Thư mục
/funcs ',' add_one_float8 'Thư mục
/funcs ',' makepoint 'Thư mục
/funcs ',' copytext 'Thư mục
/funcs ',' concat_text '
ở đây,Thư mục
là viết tắt của thư mục của tệp thư viện được chia sẻ (ví dụPOSTGRESQLThư mục hướng dẫn, chứa mã cho tỷ lệ kèo bóng đá ví dụ được sử dụng trong phần này). (Phong cách tốt hơn sẽ là sử dụng chỉ'funcs'
trongAS
mệnh đề, sau khi đã thêmThư mục
đến đường dẫn tìm kiếm. Trong mọi trường hợp, chúng tôi có thể bỏ qua tiện ích mở rộng dành riêng cho hệ thống cho thư viện được chia sẻ, thường là.so
.)
Lưu ý rằng chúng tôi đã chỉ định tỷ lệ kèo bóng đá chức năng lànghiêm ngặt, có nghĩa là hệ thống sẽ tự động giả định kết quả null nếu bất kỳ giá trị đầu vào nào là null. Bằng cách này, chúng tôi tránh phải kiểm tra tỷ lệ kèo bóng đá đầu vào null trong mã chức năng.pg_argisnull ()
.
Macropg_argisnull (
Cho phép một hàm kiểm tra xem mỗi đầu vào có phải là null hay không. (Tất nhiên, làm điều này chỉ cần thiết trong tỷ lệ kèo bóng đá chức năng không được khai báoHồinghiêm ngặt.) Như vớin
)pg_getarg_
macro, tỷ lệ kèo bóng đá đối số đầu vào được tính bắt đầu ở mức 0. Lưu ý rằng người ta nên không thực thixxx
()pg_getarg_
Cho đến khi người ta xác minh rằng đối số không phải là null. Để trả về kết quả null, thực thixxx
()pg_return_null ()
; Điều này hoạt động trong cả hai chức năng nghiêm ngặt và không thành công.
Thoạt nhìn, tỷ lệ kèo bóng đá quy ước mã hóa phiên bản-1 có thể chỉ là chủ nghĩa tối nghĩa vô nghĩa, so với sử dụng đơn giảnC
Gọi quy ước. Tuy nhiên, họ cho phép chúng tôi đối phó vớinull
tỷ lệ kèo bóng đá đối số/giá trị trả về có thể vàHồiTOASTEDHồi(nén hoặc ngoài dòng) giá trị.
tỷ lệ kèo bóng đá tùy chọn khác được cung cấp bởi giao diện phiên bản-1 là hai biến thể củapg_getarg_
Macros. Cái đầu tiên trong số này,xxx
()pg_getarg_
, Đảm bảo trả lại tỷ lệ kèo bóng đá bản sao của đối số được chỉ định an toàn khi viết vào. .xxx
_copy ()pg_getarg_
macro đảm bảo kết quả có thể ghi.) Biến thể thứ hai bao gồmxxx
_copy ()pg_getarg_
Macro có ba đối số. Đầu tiên là số lượng đối số tỷ lệ kèo bóng đá (như trên).bên ngoàiKhăn. (Loại lưu trữ của tỷ lệ kèo bóng đá cột có thể được chỉ định bằng cách sử dụngxxx
_slice ()BẢNG ALTER
. TableName
Cột thay đổicolname
Đặt lưu trữStorAgetype
StorAgetype
là tỷ lệ kèo bóng đá trongtrơn
, bên ngoài
, mở rộng
hoặcchính
.)
Cuối cùng, tỷ lệ kèo bóng đá quy ước gọi chức năng phiên bản-1 có thể trả về kết quả tập hợp (Phần 36.10.8) và thực hiện tỷ lệ kèo bóng đá hàm kích hoạt (Chương 37) và Trình xử lý cuộc gọi bằng ngôn ngữ thủ tục (Chương 56). Để biết thêm chi tiết, xemSRC/Backend/Utils/fmgr/readme
Trong phân phối nguồn.
Trước khi chúng ta chuyển sang tỷ lệ kèo bóng đá chủ đề nâng cao hơn, chúng ta nên thảo luận về một số quy tắc mã hóa choPostgreSQLtỷ lệ kèo bóng đá ngữ c. Mặc dù có thể tải các hàm được viết bằng các ngôn ngữ khác với C thànhPostgreSQL43520_43878
tỷ lệ kèo bóng đá quy tắc cơ bản để viết và xây dựng tỷ lệ kèo bóng đá hàm C như sau:
Sử dụngPG_CONFIG--includedir-server
Để tìm ra nơiPostgreSQLtỷ lệ kèo bóng đá tệp tiêu đề máy chủ được cài đặt trên hệ thống của bạn (hoặc hệ thống mà người dùng của bạn sẽ chạy).
biên dịch và liên kết mã của bạn để nó có thể được tải động vàoPOSTGRESQLLuôn yêu cầu cờ đặc biệt. Nhìn thấyPhần 36.10.5Để được giải thích chi tiết về cách thực hiện cho hệ điều hành cụ thể của bạn.
Hãy nhớ xác định AKhối ma thuậtKhănĐối với thư viện chia sẻ của bạn, như được mô tả trongPhần 36.10.1.
Khi phân bổ bộ nhớ, hãy sử dụngPOSTGRESQLChức năngPalloC
vàPFREE
Thay vì tỷ lệ kèo bóng đá chức năng thư viện C tương ứngmalloc
vàmiễn phí
. Bộ nhớ được phân bổ bởiPalloC
sẽ tự động được giải phóng vào cuối mỗi giao dịch, ngăn chặn rò rỉ bộ nhớ.
Luôn luôn không tỷ lệ kèo bóng đá byte của cấu trúc của bạn bằng cách sử dụngmemset
(hoặc phân bổ chúng bằngPalloC0
Ở nơi đầu tiên). Ngay cả khi bạn gán cho từng trường cấu trúc của bạn, có thể có phần đệm căn chỉnh (tỷ lệ kèo bóng đá lỗ trong cấu trúc) có chứa tỷ lệ kèo bóng đá giá trị rác.
Hầu hết tỷ lệ kèo bóng đá bên trongPostgreSQLtỷ lệ kèo bóng đá loại được khai báo trongPostgres.h
, trong khi giao diện trình quản lý chức năng (pg_function_args
, v.v.)fmgr.h
, vì vậy bạn sẽ cần bao gồm ít nhất hai tệp này. Vì lý do tính di động, tốt nhất là bao gồmPostgres.h
Đầu tiên, trước bất kỳ tệp tiêu đề hệ thống hoặc người dùng nào khác. Bao gồmPostgres.h
cũng sẽ bao gồmELOG.H
vàpalloc.h
cho bạn.
Tên biểu tượng được xác định trong tỷ lệ kèo bóng đá tệp đối tượng không được xung đột với nhau hoặc với tỷ lệ kèo bóng đá ký hiệu được xác định trongPOSTGRESQLCó thể thực thi máy chủ. Bạn sẽ phải đổi tên tỷ lệ kèo bóng đá chức năng hoặc biến của mình nếu bạn nhận được thông báo lỗi thành hiệu ứng này.
Trước khi bạn có thể sử dụngPostgreSQLtỷ lệ kèo bóng đá chức năng mở rộng được viết bằng C, chúng phải được biên dịch và liên kết theo cách đặc biệt để tạo một tệp có thể được máy chủ tải động. Để chính xác, AThư viện chia sẻcần được tạo.
Để biết thông tin ngoài những gì có trong phần này, bạn nên đọc tài liệu của hệ điều hành của mình, đặc biệt là tỷ lệ kèo bóng đá trang thủ công cho trình biên dịch C,CC
và Trình chỉnh sửa liên kết,LD
. Ngoài ra,POSTGRESQLMã nguồn chứa tỷ lệ kèo bóng đá số ví dụ làm việc trongĐóng góp
Thư mục. Nếu bạn dựa vào tỷ lệ kèo bóng đá ví dụ này, bạn sẽ làm cho tỷ lệ kèo bóng đá mô -đun của mình phụ thuộc vào tính khả dụng củaPostgreSQLTuy nhiên, mã nguồn.
Tạo thư viện chia sẻ thường tương tự như liên kết tỷ lệ kèo bóng đá tệp thực thi: Đầu tiên tỷ lệ kèo bóng đá tệp nguồn được biên dịch thành tỷ lệ kèo bóng đá tệp đối tượng, sau đó tỷ lệ kèo bóng đá tệp đối tượng được liên kết với nhau. tỷ lệ kèo bóng đá tệp đối tượng cần được tạo dưới dạngMã độc lập vị trí(pic),Điều này có nghĩa là chúng có thể được đặt tại tỷ lệ kèo bóng đá vị trí tùy ý trong bộ nhớ khi chúng được thực thi. .
Trong tỷ lệ kèo bóng đá ví dụ sau, chúng tôi cho rằng mã nguồn của bạn nằm trong một tệpfoo.c
Và chúng tôi sẽ tạo tỷ lệ kèo bóng đá thư viện chia sẻfoo.so
. Tệp đối tượng trung gian sẽ được gọi làfoo.o
trừ khi có ghi chú khác. Thư viện được chia sẻ có thể chứa nhiều hơn tỷ lệ kèo bóng đá tệp đối tượng, nhưng chúng tôi chỉ sử dụng tỷ lệ kèo bóng đá tệp ở đây.
Cờ trình biên dịch để tạopiclà-FPIC
. Để tạo thư viện được chia sẻ, cờ trình biên dịch là-shared
.
cc -fpic -c foo.c
Điều này được áp dụng kể từ phiên bản 13.0 củaFreeBSD, tỷ lệ kèo bóng đá phiên bản cũ hơn đã sử dụngGCC
trình biên dịch.
Cờ trình biên dịch để tạopiclà-FPIC
. Cờ trình biên dịch để tạo thư viện chia sẻ là-shared
. tỷ lệ kèo bóng đá ví dụ hoàn chỉnh trông như thế này:
cc -fpic -c foo.c
Đây là một ví dụ. Nó giả định tỷ lệ kèo bóng đá công cụ nhà phát triển được cài đặt.
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 cờ-shared
được sử dụng để liên kết tỷ lệ kèo bóng đá thư viện được chia sẻ. Trên tỷ lệ kèo bóng đá hệ thống không phải là cũ,ld -bsharable
được sử dụng.
gcc -fpic -c foo.c
Cờ trình biên dịch để tạopiclà-FPIC
. ld -bsharable
được sử dụng để liên kết tỷ lệ kèo bóng đá 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 tỷ lệ kèo bóng đá thư viện được chia sẻ, tùy chọn trình biên dịch là-g
với trình biên dịch hoặc thay thế-shared
vớiGCC.
cc -kpic -c foo.c
hoặc
GCC -FPIC -C FOO.C
Nếu điều này quá phức tạp đối với bạn, bạn nên xem xét sử dụnggnu libtool, che giấu sự khác biệt của nền tảng đằng sau giao diện thống nhất.
Tệp thư viện chia sẻ kết quả sau đó có thể được tải vàoPostgreSQL. Khi chỉ định tên tệp thànhTạo chức năng
Lệnh, người ta phải đặt tên cho tệp thư viện được chia sẻ, không phải tệp đối tượng trung gian. Lưu ý rằng tiện ích mở rộng thư viện chia sẻ tiêu chuẩn của hệ thống (thường là.so
hoặc.SL
) có thể được bỏ qua từTạo chức năng
Lệnh và thông thường nên được bỏ qua để có tính di động tốt nhất.
Tham khảo lạiPhần 36.10.1Giới thiệu về nơi máy chủ mong đợi tìm thấy tỷ lệ kèo bóng đá tệp thư viện được chia sẻ.
tỷ lệ kèo bóng đá loại tổng hợp không có bố cục cố định như cấu trúc C. tỷ lệ kèo bóng đá thể hiện của một loại tổng hợp có thể chứa tỷ lệ kèo bóng đá trường null.PostgreSQLCung cấp giao diện chức năng để truy cập tỷ lệ kèo bóng đá trường của tỷ lệ kèo bóng đá loại tổng hợp từ C.
Giả sử chúng ta muốn viết tỷ lệ kèo bóng đá chức năng để trả lời truy vấn:
Chọn Tên, C_OverPaid (EMP, 1500) làm trả quá nhiều tiền
Sử dụng tỷ lệ kèo bóng đá quy ước gọi phiên bản-1, chúng ta có thể xác địnhc_overpaid
As:
#include "Postgres.h"
GetAttributionByName
làPostgreSQLHàm hệ thống trả về tỷ lệ kèo bóng đá thuộc tính từ hàng được chỉ định. Nó có ba đối số: đối số của loạiHeaptupleHeader
được chuyển vào tỷ lệ kèo bóng đá, tên của thuộc tính mong muốn và tham số trả về cho biết thuộc tính có phải là null hay không.GetAttributionByName
Trả về ADatum
Giá trị mà bạn có thể chuyển đổi sang kiểu dữ liệu phù hợp bằng cách sử dụng thích hợpDatumget
tỷ lệ kèo bóng đá. Lưu ý rằng giá trị trả về là vô nghĩa nếu cờ null được đặt;xxx
()
Ngoài ra còn cóGetAttributionByNum
, chọn thuộc tính đích theo số cột thay vì tên.
Lệnh sau tuyên bố tỷ lệ kèo bóng đác_overpaid
Trong SQL:
Tạo chức năng C_overpaid (EMP, Integer) Trả về BooleanThư mục
/funcs ',' c_overpaid '
Thông báo chúng tôi đã sử dụngnghiêm ngặt
để chúng tôi không phải kiểm tra xem tỷ lệ kèo bóng đá đối số đầu vào có vô giá trị không.
Để trả lại giá trị loại hoặc loại tổng hợp từ hàm ngôn ngữ C, bạn có thể sử dụng API đặc biệt cung cấp tỷ lệ kèo bóng đá macro và tỷ lệ kèo bóng đá hàm để ẩn hầu hết độ phức tạp của việc xây dựng tỷ lệ kèo bóng đá loại dữ liệu tổng hợp. Để sử dụng API này, tệp nguồn phải bao gồm:
#include "funcapi.h"
Có hai cách bạn có thể xây dựng giá trị dữ liệu tổng hợp (từ đó ATuple): Bạn có thể xây dựng nó từ một mảng tỷ lệ kèo bóng đá giá trị mốc hoặc từ một mảng tỷ lệ kèo bóng đá chuỗi C có thể được truyền đến tỷ lệ kèo bóng đá hàm chuyển đổi đầu vào của tỷ lệ kèo bóng đá loại dữ liệu cột của Tuple. Trong cả hai trường hợp, trước tiên bạn cần phải có được hoặc xây dựng mộttupledesc
Mô tả cho cấu trúc tuple. Khi làm việc với Datums, bạn vượt quatupledesc
đếnBlesstupledesc
, rồi gọiheap_form_tuple
cho mỗi hàng. Khi làm việc với tỷ lệ kèo bóng đá chuỗi C, bạn vượt quatupledesc
đếntupledescgetattinmetadata
, rồi gọibuildTupleFromCStrings
cho mỗi hàng. Trong trường hợp của một hàm trả về một tập hợp tỷ lệ kèo bóng đá bộ dữ liệu, tất cả tỷ lệ kèo bóng đá bước thiết lập đều có thể được thực hiện một lần trong cuộc gọi đầu tiên của hàm.
tỷ lệ kèo bóng đá số chức năng trợ giúp có sẵn để thiết lập cần thiếttupledesc
. Cách được đề xuất để thực hiện điều này trong hầu hết tỷ lệ kèo bóng đá chức năng trả về tỷ lệ kèo bóng đá giá trị tổng hợp là gọi:
59524_59704
Vượt qua cùng tỷ lệ kèo bóng đáfcinfo
Cấu trúc được chuyển đến chính chức năng gọi. (Tất nhiên điều này yêu cầu bạn sử dụng tỷ lệ kèo bóng đá quy ước gọi phiên bản 1.)resultTypeID
có thể được chỉ định làNULL
hoặc là địa chỉ của biến cục bộ để nhận loại kết quả của tỷ lệ kèo bóng đá OID.resulttupledesc
nên là địa chỉ của tỷ lệ kèo bóng đá địa phươngtupledesc
Biến. Kiểm tra xem kết quả làTYPEFUNC_COMPISE
; Nếu vậy,resulttupledesc
đã được lấp đầy với cần thiếttupledesc
. (Nếu không, bạn có thể báo cáo lỗi dọc theo tỷ lệ kèo bóng đá dòngBản ghi trả về chức năng được gọi trong ngữ cảnh không thể chấp nhận bản ghi loạiHồi.)
get_call_result_type
có thể giải quyết loại thực tế của kết quả hàm đa hình; Vì vậy, nó rất hữu ích trong tỷ lệ kèo bóng đá chức năng trả về kết quả đa hình vô hướng, không chỉ tỷ lệ kèo bóng đá chức năng trả về vật liệu tổng hợp.resultTypeID
đầu ra chủ yếu hữu ích cho tỷ lệ kèo bóng đá chức năng quay lại vô hướng đa hình.
get_call_result_type
có anh chị emGET_EXPR_RESULT_TYPE
, có thể được sử dụng để giải quyết loại đầu ra dự kiến cho một cuộc gọi tỷ lệ kèo bóng đá được biểu thị bằng cây biểu thức. Điều này có thể được sử dụng khi cố gắng xác định loại kết quả từ bên ngoài chức năng.GET_FUNC_RESULT_TYPE
, có thể được sử dụng khi chỉ có OID của hàm. Tuy nhiên, tỷ lệ kèo bóng đá chức năng này không thể xử lý tỷ lệ kèo bóng đá chức năng được khai báo để trả vềRecord
vàget_func_result_type
Không thể giải quyết tỷ lệ kèo bóng đá loại đa hình, vì vậy bạn nên sử dụngGET_CALL_RESULT_TYPE
.
tỷ lệ kèo bóng đá chức năng cũ hơn, hiện đang được ghi nhận để có đượctupledesc
S là:
61970_62029
để nhậntupledesc
Đối với loại hàng của mối quan hệ được đặt tên và:
62171_62232
để nhậntupledesc
Dựa trên loại oid. Điều này có thể được sử dụng để có được tỷ lệ kèo bóng đátupledesc
Đối với loại cơ sở hoặc loại tổng hợp. Nó sẽ không hoạt động cho một tỷ lệ kèo bóng đá trả vềRecord
Tuy nhiên, và nó không thể giải quyết tỷ lệ kèo bóng đá loại đa hình.
tỷ lệ kèo bóng đá khi bạn cótupledesc
, gọi:
62661_62708
Nếu bạn có kế hoạch làm việc với tỷ lệ kèo bóng đá mốc dữ liệu, hoặc:
62793_62856
Nếu bạn có kế hoạch làm việc với tỷ lệ kèo bóng đá chuỗi C. Nếu bạn đang viết một bộ trả lại chức năng, bạn có thể lưu kết quả của tỷ lệ kèo bóng đá chức năng này trongfunccallcontext
Cấu trúc - Sử dụngTUPE_DESC
hoặcAttinMeta
trường tương ứng.
Khi làm việc với Datums, sử dụng:
63256_63333
Để xây dựng AHeaptuple
Đã cho dữ liệu người dùng ở dạng mốc dữ liệu.
Khi làm việc với tỷ lệ kèo bóng đá chuỗi C, sử dụng:
63510_63587
Để xây dựng AĐã cho dữ liệu người dùng ở dạng chuỗi C.
Giá trị
là một mảng chuỗi C, một cho mỗi thuộc tính của hàng trả lại. Mỗi chuỗi C phải ở dạng dự kiến bởi tỷ lệ kèo bóng đá đầu vào của kiểu dữ liệu thuộc tính.giá trị
Mảng phải được đặt thànhnull
. Chức năng này sẽ cần được gọi lại cho mỗi hàng bạn trở lại.
Khi bạn đã xây dựng tỷ lệ kèo bóng đá tuple để trở về từ chức năng của mình, nó phải được chuyển đổi thành ADatum
. Sử dụng:
64331_64369
Để chuyển đổi Athành tỷ lệ kèo bóng đá mốc thời gian hợp lệ. Cái này
Datum
Có thể được trả về trực tiếp nếu bạn có ý định trả về chỉ một hàng hoặc nó có thể được sử dụng làm giá trị trả về hiện tại trong tỷ lệ kèo bóng đá hoàn trả lại.
tỷ lệ kèo bóng đá ví dụ xuất hiện trong phần tiếp theo.
tỷ lệ kèo bóng đá ngữ C có hai tùy chọn để trả về các bộ (nhiều hàng). Trong một phương thức, được gọi làValuePercallMODE, Hàm hoàn trả đã được gọi là lặp đi lặp lại (chuyển tỷ lệ kèo bóng đá đối số giống nhau mỗi lần) và nó trả về một hàng mới trong mỗi cuộc gọi, cho đến khi nó không còn hàng để trả về và tín hiệu bằng cách trả về NULL. Chức năng trả lại thiết lập (SRF) Do đó, phải lưu đủ trạng thái qua tỷ lệ kèo bóng đá cuộc gọi để nhớ những gì nó đã làm và trả về mục tiếp theo chính xác trên mỗi cuộc gọi. Trong phương thức khác, được gọi làvật chất hóachế độ, SRF điền và trả về tỷ lệ kèo bóng đá đối tượng tuplestore chứa toàn bộ kết quả của nó; sau đó chỉ có tỷ lệ kèo bóng đá cuộc gọi xảy ra cho toàn bộ kết quả và không cần trạng thái liên hệ.
Khi sử dụng chế độ ValuePerCall, điều quan trọng cần nhớ là truy vấn không được đảm bảo sẽ được chạy để hoàn thành; nghĩa là, do tỷ lệ kèo bóng đá tùy chọn nhưGiới hạn
, Người thực thi có thể ngừng thực hiện tỷ lệ kèo bóng đá cuộc gọi đến chức năng trả lại trước khi tất cả tỷ lệ kèo bóng đá hàng đã được tìm nạp. Điều này có nghĩa là không an toàn khi thực hiện tỷ lệ kèo bóng đá hoạt động dọn dẹp trong cuộc gọi cuối cùng, bởi vì điều đó có thể không bao giờ xảy ra.
Phần còn lại của phần này ghi lại một tập hợp tỷ lệ kèo bóng đá macro trợ giúp thường được sử dụng (mặc dù không bắt buộc phải được sử dụng) cho SRF bằng chế độ ValuePercall. Chi tiết bổ sung về chế độ vật chất hóa có thể được tìm thấy trongsrc/backend/utils/fmgr/readme
. Ngoài ra,Đóng góp
Mô -đun trongPostgreSQLPhân phối nguồn chứa nhiều ví dụ về SRF sử dụng cả chế độ ValuePercall và Mật vật.
Để sử dụng tỷ lệ kèo bóng đá macro hỗ trợ ValuePercall được mô tả ở đây, bao gồmfuncapi.h
. tỷ lệ kèo bóng đá macro này hoạt động với một cấu trúcfunccallcontext
chứa trạng thái cần được lưu qua tỷ lệ kèo bóng đá cuộc gọi. Trong cuộc gọi SRF,fcinfo- flinfo- fn_extra
được sử dụng để giữ tỷ lệ kèo bóng đá con trỏ tớifunccallcontext
qua tỷ lệ kèo bóng đá cuộc gọi. tỷ lệ kèo bóng đá macro tự động điền vào trường đó khi sử dụng đầu tiên và mong đợi tìm thấy cùng một con trỏ ở đó trên tỷ lệ kèo bóng đá mục đích sử dụng tiếp theo.
typedef struct funccallcontext
Macro được sử dụng bởi tỷ lệ kèo bóng đáSRFSử dụng cơ sở hạ tầng này là:
srf_is_firstcall ()
Sử dụng điều này để xác định xem chức năng của bạn có được gọi cho lần đầu tiên hay lần tiếp theo không. Trong cuộc gọi đầu tiên (chỉ), cuộc gọi:
srf_firstcall_init ()
Để khởi tạofunccallcontext
. Trên mọi cuộc gọi chức năng, bao gồm cuộc gọi đầu tiên, cuộc gọi:
srf_percall_setup ()
Để thiết lập để sử dụngfunccallcontext
.
Nếu chức năng của bạn có dữ liệu để trả về trong cuộc gọi hiện tại, hãy sử dụng:
srf_return_next (funcctx, result)
Để trả lại cho người gọi. (result
phải loạiDatum
70230_70357
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ột bối cảnh thoáng qua sẽ được xóa giữa tỷ lệ kèo bóng đá cuộc gọi. Điều này có nghĩa là bạn không cần gọiPFREE
Trên mọi thứ bạn đã phân bổ bằng cách sử dụngPalloC
; Nó sẽ biến mất dù sao.multi_call_memory_ctx
là tỷ lệ kèo bóng đá vị trí phù hợp cho bất kỳ dữ liệu nào cần tồn tại cho đến khiSRFĐã hoàn thành chạy. Trong hầu hết tỷ lệ kèo bóng đá trường hợp, điều này có nghĩa là bạn nên chuyển thànhmulti_call_memory_ctx
Trong khi thực hiện thiết lập cuộc gọi đầu tiên. Sử dụngfuncctx- user_fctx
Để giữ tỷ lệ kèo bóng đá con trỏ đến bất kỳ cấu trúc dữ liệu gọi chéo nào như vậy. (Dữ liệu bạn phân bổ trongmulti_call_memory_ctx
Sẽ tự động biến mất khi truy vấn kết thúc, do đó, không cần thiết phải giải phóng dữ liệu đó theo cách thủ công.)
Trong khi tỷ lệ kèo bóng đá đối số thực tế cho hàm vẫn không thay đổi giữa tỷ lệ kèo bóng đá cuộc gọi, nếu bạn detoast tỷ lệ kèo bóng đá giá trị đối số (thường được thực hiện trong suốt bởipg_getarg_
Macro) trong bối cảnh thoáng qua sau đó tỷ lệ kèo bóng đá bản sao bị detoast sẽ được giải phóng trên mỗi chu kỳ. Theo đó, nếu bạn tiếp tục tham chiếu đến tỷ lệ kèo bóng đá giá trị đó trong của bạnxxx
user_fctx
, bạn phải sao chép chúng vàoMulti_call_memory_ctx
Sau khi detoasting hoặc đảm bảo rằng bạn chỉ định tỷ lệ kèo bóng đá giá trị trong bối cảnh đó.
tỷ lệ kèo bóng đá ví dụ Pseudo-Code hoàn chỉnh trông giống như sau:
DatumKhai báo tiếp theo khi cần
if (srf_is_firstcall ()))Mã người dùng
Nếu trả về composite
Build tupledesc và có lẽ là attinmetadata
endif trả về composite
Mã người dùng
MemoryContextSwitchto (OldContext);Mã người dùng
funcctx = srf_percall_setup ();Mã người dùng
/ * Đây chỉ là tỷ lệ kèo bóng đá cách chúng ta có thể kiểm tra xem chúng ta có xong không: */Mã người dùng
có được dữ liệu kết quả
srf_return_next (funcctx, result);
tỷ lệ kèo bóng đá ví dụ hoàn chỉnh về đơn giảnSRFTrả về loại tổng hợp trông giống như:
pg_function_info_v1 (retcposite);
tỷ lệ kèo bóng đá cách để khai báo chức năng này trong SQL là:
Tạo loại __retComposite AS (F1 Integer, F2 Integer, F3 Integer);FileName
',' retcposite '
Một cách khác là sử dụng tỷ lệ kèo bóng đá tham số:
Tạo hoặc thay thế chức năng retcposite (in Integer, in Integer,FileName
',' retcposite '
Lưu ý rằng trong phương pháp này, loại đầu ra của tỷ lệ kèo bóng đá chính thức là một ẩn danhRecord
loại.
tỷ lệ kèo bóng đá ngữ C có thể được khai báo để chấp nhận và trả về các loại đa hình được mô tả trongPhần 36.2.5. Khi tỷ lệ kèo bóng đá đối số hoặc loại trả về của hàm được định nghĩa là tỷ lệ kèo bóng đá loại đa hình, tác giả chức năng không thể biết trước kiểu dữ liệu nào sẽ được gọi với hoặc cần quay lại.fmgr.h
Để cho phép hàm phiên bản-1 C khám phá tỷ lệ kèo bóng đá loại dữ liệu thực tế của tỷ lệ kèo bóng đá đối số và loại nó dự kiến sẽ trả về. tỷ lệ kèo bóng đá thói quen được gọi làget_fn_expr_rettype (fmgrinfo *flinfo)
vàget_fn_expr_argtype (fmgrinfo *flinfo, int argnum)
. Họ trả về kết quả hoặc loại đối số oid hoặckhông hợp lệ
Nếu thông tin không có sẵn. Cấu trúcflinfo
thường được truy cập dưới dạngfcinfo- flinfo
. Tham sốargnum
bằng không.get_call_result_type
cũng có thể được sử dụng thay thế choget_fn_expr_rettype
. Ngoài ra còn cóGET_FN_EXPR_VARIADIC
, có thể được sử dụng để tìm hiểu xem tỷ lệ kèo bóng đá đối số variadic đã được hợp nhất thành một mảng. Điều này chủ yếu hữu ích choVariadic "Any"
tỷ lệ kèo bóng đá chức năng, vì sự hợp nhất đó sẽ luôn xảy ra đối với tỷ lệ kèo bóng đá hàm variadic Lấy tỷ lệ kèo bóng đá loại mảng thông thường.
Ví dụ: giả sử chúng ta muốn viết một tỷ lệ kèo bóng đá để chấp nhận một yếu tố duy nhất thuộc bất kỳ loại nào và trả về một mảng một chiều thuộc loại đó:
pg_function_info_v1 (make_array);
Lệnh sau tuyên bố chức năngmake_array
Trong SQL:
Tạo chức năng Make_array (AnyEuity) trả về AnyArrayThư mục
/funcs ',' make_array '
Có một biến thể đa hình chỉ có sẵn cho tỷ lệ kèo bóng đá ngữ C."bất kỳ"
. (Lưu ý rằng tên loại này phải được trích dẫn kép, vì nó cũng là tỷ lệ kèo bóng đá từ dành riêng cho SQL.) Điều này hoạt động nhưAnyEuity
Ngoại trừ việc nó không hạn chế khác nhau"bất kỳ"
Đối số là cùng loại, cũng không giúp xác định loại kết quả của hàm. tỷ lệ kèo bóng đá ngữ C cũng có thể khai báo tham số cuối cùng của nó làVariadic "Any"
. Điều này sẽ phù hợp với tỷ lệ kèo bóng đá hoặc nhiều đối số thực tế thuộc bất kỳ loại nào (không nhất thiết phải cùng loại).khôngđược thu thập thành một mảng như xảy ra với tỷ lệ kèo bóng đá hàm variadic bình thường; Chúng sẽ được chuyển cho chức năng riêng biệt.pg_nargs ()
Macro và tỷ lệ kèo bóng đá phương thức được mô tả ở trên phải được sử dụng để xác định số lượng đối số thực tế và tỷ lệ kèo bóng đá loại của chúng khi sử dụng tính năng này. Ngoài ra, người dùng của một chức năng như vậy có thể muốn sử dụngVariadic
Từ khóa trong cuộc gọi chức năng của họ, với kỳ vọng rằng hàm sẽ coi tỷ lệ kèo bóng đá phần tử mảng là đối số riêng biệt. Bản thân chức năng phải thực hiện hành vi đó nếu muốn, sau khi sử dụngGET_FN_EXPR_VARIADIC
Để phát hiện ra rằng đối số thực tế được đánh dấu bằngVariadic
.
add-in có thể đặt trước bộ nhớ chia sẻ khi khởi động máy chủ. Để làm như vậy, thư viện chia sẻ của bổ trợ phải được tải trước bằng cách chỉ định nó trongshared_preload_l Libries. Thư viện chia sẻ cũng sẽ đăng ký tỷ lệ kèo bóng đáshmem_request_hook
Trong nó_pg_init
tỷ lệ kèo bóng đá. Cái nàySHMEM_REQUEST_HOOK
Có thể dự trữ bộ nhớ chia sẻ bằng cách gọi:
void requestaddinshmemspace (kích thước kích thước)
Mỗi phụ trợ sẽ có được tỷ lệ kèo bóng đá con trỏ tới bộ nhớ chia sẻ dành riêng bằng cách gọi:
84217_84287
Nếu tỷ lệ kèo bóng đá này đặtFoundPtr
đếnSai
, người gọi nên tiến hành khởi tạo nội dung của bộ nhớ chia sẻ dành riêng. Nếu nhưFoundPtr
được đặt thànhTRUE
, bộ nhớ chia sẻ đã được khởi tạo bởi tỷ lệ kèo bóng đá phụ trợ khác và người gọi không cần khởi tạo thêm.
Để tránh tỷ lệ kèo bóng đá điều kiện chủng tộc, mỗi phụ trợ nên sử dụng LWLOCKaddinshmeminitlock
Khi khởi tạo phân bổ bộ nhớ chia sẻ, như được hiển thị ở đây:
MyStruct static *ptr = null;
shmem_startup_hook
Cung cấp một vị trí thuận tiện cho mã khởi tạo, nhưng không yêu cầu hoàn toàn là tất cả tỷ lệ kèo bóng đá mã đó được đặt trong móc này. Mỗi phụ trợ sẽ thực thi đã đăng kýshmem_startup_hook
Ngay sau khi nó gắn vào bộ nhớ chia sẻ. Lưu ý rằng tỷ lệ kèo bóng đá tiện ích bổ sung vẫn sẽ có đượcaddinshmeminitlock
Trong cái móc này, như được hiển thị trong ví dụ trên.
tỷ lệ kèo bóng đá ví dụ về ASHMEM_REQUEST_HOOK
vàshmem_startup_hook
có thể được tìm thấy trong85857_85906
TrongPOSTGRESQLCây nguồn.
86324_86444shmem_request_hook
. Để làm như vậy, mỗi phụ trợ sẽ sử dụng bộ nhớ chia sẻ sẽ có được tỷ lệ kèo bóng đá con trỏ cho nó bằng cách gọi:
VOID *
Nếu tỷ lệ kèo bóng đá phân đoạn bộ nhớ chia sẻ động với tên đã cho chưa tồn tại, chức năng này sẽ phân bổ nó và khởi tạo nó với được cung cấpinit_callback
tỷ lệ kèo bóng đá gọi lại. Nếu phân đoạn đã được phân bổ và khởi tạo bởi một phụ trợ khác, chức năng này chỉ cần gắn phân đoạn bộ nhớ chia sẻ động hiện có vào phần phụ trợ hiện tại.
Không giống như bộ nhớ chia sẻ được dành riêng khi khởi động máy chủ, không cần phải có đượcAddInshmeminitLock
hoặc hành động khác để tránh tỷ lệ kèo bóng đá điều kiện chủng tộc khi bảo lưu bộ nhớ chia sẻ vớigetNamedDSMSegment
. Hàm này đảm bảo rằng chỉ có một phụ trợ phân bổ và khởi tạo phân đoạn và tất cả tỷ lệ kèo bóng đá phụ trợ khác nhận được một con trỏ tới phân đoạn được phân bổ và khởi tạo đầy đủ.
tỷ lệ kèo bóng đá ví dụ sử dụng hoàn chỉnh củaGetNamedDSMSegment
có thể được tìm thấy trongsrc/test/modules/test_dsm_registry/test_dsm_registry.c
trongPOSTGRESQLCây nguồn.
add-ins có thể bảo lưu lwlocks khi khởi động máy chủ. Như với bộ nhớ được chia sẻ được dành riêng khi khởi động máy chủ, thư viện chia sẻ của bổ trợ phải được tải trước bằng cách chỉ định nó trongshared_preload_l Libriesvà Thư viện được chia sẻ nên đăng kýSHMEM_REQUEST_HOOK
Trong_pg_init
tỷ lệ kèo bóng đá. Cái nàyshmem_request_hook
có thể đặt trước LWLOCKS bằng cách gọi:
void requestNamedLwlockTranche (const char *tranche_name, int num_lwlocks)
Điều này đảm bảo rằng tỷ lệ kèo bóng đá mảngnum_lwlocks
lwlocks có sẵn dưới tênTranche_name
. tỷ lệ kèo bóng đá con trỏ đến mảng này có thể được lấy bằng cách gọi:
lwlockpadded *getNamedLwlockTranche (const char *tranche_name)
Có tỷ lệ kèo bóng đá phương pháp khác, linh hoạt hơn để có được LWlocks có thể được thực hiện sau khi khởi động máy chủ và bên ngoài ASHMEM_REQUEST_HOOK
. Để làm như vậy, đầu tiên phân bổ ATranche_id
bằng cách gọi:
int lwlocknewtrancheid (void)
Tiếp theo, khởi tạo từng LWLOCK, chuyển giao mớitranche_id
như tỷ lệ kèo bóng đá đối số:
void lwlockinitialize (lwlock *khóa, int tranche_id)
Tương tự như bộ nhớ chia sẻ, mỗi phụ trợ phải đảm bảo rằng chỉ tỷ lệ kèo bóng đá quy trình phân bổ mớiTranche_id
và khởi tạo từng lwlock mới. Một cách để làm điều này là chỉ gọi tỷ lệ kèo bóng đá chức năng này trong mã khởi tạo bộ nhớ được chia sẻ của bạn vớiaddinshmeminitlock
Được tổ chức độc quyền. Nếu sử dụngGetNamedDSMSegment
, Gọi tỷ lệ kèo bóng đá chức năng này tronginit_callback
Hàm gọi lại là đủ để tránh tỷ lệ kèo bóng đá điều kiện chủng tộc.
Cuối cùng, mỗi phụ trợ sử dụngTranche_id
nên liên kết nó vớitranche_name
bằng cách gọi:
void lwlockregistertranche (int tranche_id, const char *tranche_name)
tỷ lệ kèo bóng đá ví dụ sử dụng hoàn chỉnh củalwlocknewtrancheid
, lwlockinitialize
vàlwlockregistertranche
Có thể tìm thấy trong91403_91437
trongPOSTGRESQLCây nguồn.
add-in có thể xác định tỷ lệ kèo bóng đá sự kiện chờ tùy chỉnh theo loại sự kiện chờCông nhân
bằng cách gọi:
91957_92018
Sự kiện chờ được liên kết với chuỗi tùy chỉnh hướng tới người dùng. tỷ lệ kèo bóng đá ví dụ có thể được tìm thấy trongsrc/test/modules/worker_spi
Trong cây nguồn PostgreSQL.
Sự kiện chờ tùy chỉnh có thể được xem trongpg_stat_activity
:
=# Chọn Wait_Event_Type, Wait_Event từ pg_stat_activity
tỷ lệ kèo bóng đá điểm tiêm với đã chotên
được khai báo bằng macro:
injection_point (tên);
Có một vài điểm tiêm đã được khai báo tại tỷ lệ kèo bóng đá điểm chiến lược trong mã máy chủ. Sau khi thêm một điểm tiêm mới, mã cần được biên dịch để điểm tiêm đó có sẵn trong nhị phân.
add-in có thể gắn lại tỷ lệ kèo bóng đá cuộc gọi lại vào điểm tiêm đã được khai báo bằng cách gọi:
93573_93852
tên
là tên của điểm tiêm, khi đạt được trong quá trình thực thi sẽ thực thifunction
được tải từThư viện
. private_data
là tỷ lệ kèo bóng đá khu vực riêng tư có kích thướcprivate_data_size
Được đưa ra như đối số cho cuộc gọi lại khi được thực thi.
Đây là tỷ lệ kèo bóng đá ví dụ về cuộc gọi lại choInfectionPointCallback
:
Vốc tĩnh
Cuộc gọi lại này in thông báo vào nhật ký lỗi máy chủ với mức độ nghiêm trọngThông báo
, nhưng tỷ lệ kèo bóng đá cuộc gọi lại có thể thực hiện logic phức tạp hơn.
Tùy chọn, có thể tách tỷ lệ kèo bóng đá điểm tiêm bằng cách gọi:
extern bool injectionPointDetach (const char *name);
Khi thành công,TRUE
được trả về,Sai
nếu không.
Một cuộc gọi lại được gắn vào một điểm tiêm có sẵn trên tất cả tỷ lệ kèo bóng đá phụ trợ bao gồm tỷ lệ kèo bóng đá phụ trợ bắt đầu sauInfectionPointattach
được gọi. Nó vẫn được gắn trong khi máy chủ đang chạy hoặc cho đến khi điểm tiêm được tách ra bằng cách sử dụngInfectionPointDetach
.
tỷ lệ kèo bóng đá ví dụ có thể được tìm thấy trongsrc/test/modules/inf
Trong cây nguồn PostgreSQL.
cho phép tỷ lệ kèo bóng đá điểm tiêm yêu cầuvới
Cấu hình
hoặc-dinjection_points = true
vớiMeson.
mặc dùPostgreSQLphụ trợ được viết bằng C, có thể ghi tỷ lệ kèo bóng đá phần mở rộng trong C ++ nếu tỷ lệ kèo bóng đá hướng dẫn này được tuân thủ:
Tất cả tỷ lệ kèo bóng đá chức năng được truy cập bởi phần phụ trợ phải trình bày giao diện C cho phần phụ trợ; tỷ lệ kèo bóng đá chức năng C này sau đó có thể gọi tỷ lệ kèo bóng đá hàm C ++.Extern C
Liên kết là cần thiết cho tỷ lệ kèo bóng đá chức năng được truy cập phụ trợ. Điều này cũng cần thiết cho bất kỳ chức năng nào được truyền dưới dạng con trỏ giữa mã phụ trợ và mã C ++.
Bộ nhớ miễn phí bằng cách sử dụng phương pháp giải quyết thích hợp. Ví dụ: hầu hết bộ nhớ phụ trợ được phân bổ bằng cách sử dụngpalloc ()
, vì vậy hãy sử dụngpfree ()
Để giải phóng nó. Sử dụng C ++Xóa
Trong những trường hợp như vậy sẽ thất bại.
Ngăn chặn tỷ lệ kèo bóng đá ngoại lệ truyền vào mã C (sử dụng khối bắt tất cả ở cấp cao nhất của tất cảExtern C
chức năng). Điều này là cần thiết ngay cả khi mã C ++ không ném rõ ràng bất kỳ ngoại lệ nào, bởi vì tỷ lệ kèo bóng đá sự kiện như ngoài bộ nhớ vẫn có thể đưa ra tỷ lệ kèo bóng đá ngoại lệ.-FNO-EXCEPTION
Để loại bỏ hoàn toàn tỷ lệ kèo bóng đá ngoại lệ; Trong những trường hợp như vậy, bạn phải kiểm tra tỷ lệ kèo bóng đá lỗi trong mã C ++ của mình, ví dụ: kiểm tra null được trả về bởinew ()
.
Nếu gọi tỷ lệ kèo bóng đá chức năng phụ trợ từ mã C ++, hãy chắc chắn rằng ngăn xếp cuộc gọi C ++ chỉ chứa tỷ lệ kèo bóng đá cấu trúc dữ liệu cũ đơn giản (Pod). Điều này là cần thiết bởi vì lỗi phụ trợ tạo ra tỷ lệ kèo bóng đá xalongjmp ()
98136_98207
Tóm lại, tốt nhất là đặt mã C ++ phía sau tỷ lệ kèo bóng đá bức tường củaExtern C
tỷ lệ kèo bóng đá chức năng giao diện với phần phụ trợ và tránh ngoại lệ, bộ nhớ và gọi rò rỉ ngăn xếp.
Nếu bạn thấy bất cứ điều gì trong tài liệu không chính xác, không khớpMẫu nàyĐể báo cáo vấn đề tài liệu.