PostgreSQL: kèo chấp bóng đá hôm nay | |||
---|---|---|---|
prev | UP | Chương 35. Mở rộngSQL | Tiếp theo |
tỷ lệ kèo bóng đá 88 hàm do người dùng xác định có thể được viết bằng C (hoặc ngôn ngữ có thể tương thích với C, chẳng hạn như C ++). tỷ lệ kèo bóng đá 88 chức năng như vậy được biên dịch thành tỷ lệ kèo bóng đá 88 đố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 tỷ lệ kèo bóng đá 88 ngữ"chức tỷ lệ kèo bóng đá 88 từ"Nội bộ"Hàm - tỷ lệ kèo bóng đá 88 quy ước mã hóa thực tế về cơ bản giống nhau cho cả hai. .
Hai quy ước gọi khác nhau hiện đang được sử dụng cho tỷ lệ kèo bóng đá 88 chức năng C. Mới hơn"Phiên bản 1"quy ước gọi được biểu thị bằng cách viết Apg_function_info_v1 ()Cuộc gọi macro cho chức tỷ lệ kèo bóng đá 88, như được minh họa dưới đây. Thiếu một macro như vậy cho thấy một kiểu cũ ("Phiên bản 0") tỷ lệ kèo bóng đá 88. Tên ngôn ngữ được chỉ định trongTạo chức tỷ lệ kèo bóng đá 88làCTrong cả hai trường hợp. tỷ lệ kèo bóng đá 88 chức năng kiểu cũ hiện không bị phản đối vì tỷ lệ kèo bóng đá 88 vấn đề về tính di động và thiếu chức năng, nhưng chúng vẫn được hỗ trợ vì lý do tương thích.
Lần đầu tiên một tỷ lệ kèo bóng đá 88 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 đá 88. TheTạo chức tỷ lệ kèo bóng đá 88Đố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 đá 88: 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 đá 88 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 đá 88 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 tỷ lệ kèo bóng đá 88Tạo chức tỷ lệ kèo bóng đá 88lệ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 tỷ lệ kèo bóng đá 88 đườ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 đá 88 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 đá 88 thư viện được chia sẻ liên quan đến$ libdirhoặ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 đá 88 vị trí khác.$ libdirViế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 đá 88 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 đá 88 sai lầm phổ biến.
tỷ lệ kèo bóng đá 88 mọi trường hợp, tên tệp được đưa ra tỷ lệ kèo bóng đá 88Tạo chức tỷ lệ kèo bóng đá 88Lệnh được ghi lại theo nghĩa đen tỷ lệ kèo bóng đá 88 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.
Lưu ý: PostgreSQLSẽ không tự động biên dịch chức tỷ lệ kèo bóng đá 88 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 tỷ lệ kèo bóng đá 88lệnh. Nhìn thấyPhần 35.9.6Để biết thêm thông tin.
Để đảm bảo rằng tỷ lệ kèo bóng đá 88 tệp đối tượng được tải động không được tải vào tỷ lệ kèo bóng đá 88 máy chủ không tương thích,PostgreSQLKiểm tra xem tệp có chứa"Khối ma thuật"Với tỷ lệ kèo bóng đá 88 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. tỷ lệ kèo bóng đá 88 khối ma thuật được yêu cầu kể từPostgreSQL8.2. Để 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 đá 88 tệp nguồn mô -đun, sau khi bao gồm tiêu đềfmgr.h:
#ifdef pg_module_magic
The#ifdefCó thể bỏ qua kiểm tra nếu mã không cần biên dịch với Pre-8.2PostgreSQLphát hành.
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 đá 88 cuộc gọi trong tương lai trong cùng một phiên đến (tỷ lệ kèo bóng đá 88) 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 tỷ lệ kèo bóng đá 88 chức năng khởi tạo và hoàn thiện. Nếu tệp bao gồm một hàm 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 đá 88 không nhận được thông số và nên trả lại void._pg_fini
, chức năng đó sẽ được gọi ngay lập tức trước khi dỡ tệp. Tương tự như vậy, tỷ lệ kèo bóng đá 88 không nhận được tham số và nên trả về void._pg_fini
sẽ chỉ được gọi tỷ lệ kèo bóng đá 88 quá trình dỡ tệp, không phải tỷ lệ kèo bóng đá 88 quá trình chấm dứt quá trình. (Hiện tại, dỡ tải bị vô hiệu hóa và sẽ không bao giờ xảy ra, nhưng điều này có thể thay đổi tỷ lệ kèo bóng đá 88 tương lai.)
Để biết cách viết tỷ lệ kèo bóng đá 88 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 đá 88 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 đá 88 chức năng. Trong nội bộ,PostgreSQLcoi loại cơ sở là"Blob of Memory". tỷ lệ kèo bóng đá 88 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 đá 88 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 đá 88 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 đá 88 loại giá trị 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 đá 88 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 đá 88 kiến trúc.LongLoạ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 đá 88 máy khác, trong khiintLoại là 4 byte trên hầu hết tỷ lệ kèo bóng đá 88 máy Unix. Một triển khai hợp lý củaINT4gõ trên máy Unix có thể là:
/ * số nguyên 4 byte, đượ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 đá 88 quy ước trong C màintXXcó nghĩa làXX bit. Do đó, lưu ý rằng loại cINT8có kích thước 1 byte. Loại SQLINT8được gọi làint64tỷ lệ kèo bóng đá 88 C. Xem thêmBảng 35-1.)
Mặt khác, tỷ lệ kèo bóng đá 88 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 tỷ lệ kèo bóng đá 88 con trỏ như vậy khi chuyển chúng vào và ra khỏiPostgreSQLchức tỷ lệ kèo bóng đá 88. Để trả về giá trị của một 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ả lại tỷ lệ kèo bóng đá 88 con trỏ cho nó. .PalloCVà 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 đá 88 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 đá 88 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 đá 88 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 đá 88 cấu trúc.
cảnh báo |
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ả tỷ lệ kèo bóng đá 88 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 35.10. |
Ví dụ, chúng ta có thể xác định loạiTextnhư sau:
Typedef Struct
Rõ ràng, trường dữ liệu được khai báo ở đây không đủ dài để giữ tất cả tỷ lệ kèo bóng đá 88 chuỗi có thể. Vì không thể khai báo cấu trúc kích thước biến trongC, 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 tỷ lệ kèo bóng đá 88 chỉ số mảng kiểm tra phạm vi. Chúng tôi chỉ phân bổ số lượng không gian cần thiết và sau đó truy cập mảng như thể nó được khai báo đúng chiều dài.
Khi thao tác tỷ lệ kèo bóng đá 88 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 trongTextCấu trúc, chúng ta có thể sử dụng tỷ lệ kèo bóng đá 88 đoạn mã như thế này:
#include "Postgres.h"
Varhdrszgiố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 đá 88 loại có độ dài thay đổi. Ngoài ra, trường chiều dàiphảiđược đặt bằngset_varsizeMacro, không phải bằng cách gán đơn giản.
Bảng 35-1Chỉ định loại C tương ứng với loại SQL khi viết tỷ lệ kèo bóng đá 88 ngôn ngữ C sử dụng loại tích hợpPostgreSQL. The"Được xác định tỷ lệ kèo bóng đá 88"Cộ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, vì nó tuyên bố tỷ lệ kèo bóng đá 88 số điều mà bạn sẽ cần.
Bảng 35-1. tỷ lệ kèo bóng đá 88 loại C tương đương cho tỷ lệ kèo bóng đá 88 loại SQL tích hợp
SQL Loại | C Loại | được xác định tỷ lệ kèo bóng đá 88 |
---|---|---|
Abstime | Absolutetime | Utils/nabstime.h |
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 |
SmallInt(int2) | INT16 | postgres.h |
int2Vector | int2Vector* | Postgres.h |
Số nguyên(INT4) | INT32 | Postgres.h |
Real(float4) | float4* | Postgres.h |
Double Precision(float8) | float8* | Postgres.h |
Khoảng | Khoảng* | DataType/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 |
point | đ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 | Timestamp* | DataType/Timestamp.h |
Tinterval | Timeinterval | Utils/nabstime.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 đá 88 cấu trúc có thể cho tỷ lệ kèo bóng đá 88 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 đá 88 chức năng thực.
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 không được chấp nhận, nhưng việc xử lý ban đầu sẽ dễ dàng hơn. Trong phương thức phiên bản-0, tỷ lệ kèo bóng đá 88 đối số và kết quả của hàm C chỉ được khai báo theo kiểu C bình thường, nhưng cẩn thận sử dụng biểu diễn C của từng loại dữ liệu SQL như được hiển thị ở trên.
Đây là tỷ lệ kèo bóng đá 88 số ví dụ:
#include "Postgres.h"
Giả sử rằng mã trên đã được chuẩn bị tỷ lệ kèo bóng đá 88 tệpfuncs.cvà đượ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 đá 88 chức năng thànhPostgreSQLVới tỷ lệ kèo bóng đá 88 lệnh như thế này:
Tạo tỷ lệ kèo bóng đá 88 add_one (số nguyên) Trả về số nguyênThư 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ụclà 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 đá 88 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'tỷ lệ kèo bóng đá 88ASmệnh đề, sau khi đã thêmThư mụcđến đường dẫn tìm kiếm. tỷ lệ kèo bóng đá 88 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à.sohoặc.SL.)
Lưu ý rằng chúng tôi đã chỉ định tỷ lệ kèo bóng đá 88 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 đá 88 đầu vào null trong mã chức năng.
Mặc dù quy ước gọi này rất đơn giản để sử dụng, nhưng nó không thể di động; Trên một số kiến trúc, có vấn đề với tỷ lệ kèo bóng đá 88 loại dữ liệu truyền nhỏ hơnintCách này. Ngoài ra, không có cách nào đơn giản để trả về một kết quả null, cũng không đối phó với tỷ lệ kèo bóng đá 88 đối số null theo bất kỳ cách nào khác ngoài việc làm cho chức năng nghiêm ngặt.
quy ước gọi phiên bản-1 dựa trên tỷ lệ kèo bóng đá 88 macro để đàn áp hầu hết sự phức tạp của việc truyền tỷ lệ kèo bóng đá 88 đối số và kết quả. 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 một tệp nguồn. (Thông thường, nó được viết ngay trước chính chức tỷ lệ kèo bóng đá 88.) Cuộc gọi macro này không cần thiết choNội bộ33124_33153POSTGRESQLGiả sử rằng tất cả tỷ lệ kèo bóng đá 88 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 đá 88 chức năng được tải động.
Trong tỷ lệ kèo bóng đá 88 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_xxx()
Macro tương ứng với kiểu dữ liệu của đối số và kết quả được trả về bằng cách sử dụngpg_return_xxx()
Macro cho loại trả về.pg_getarg_xxx()
lấy đối số của nó Số lượng đối số tỷ lệ kèo bóng đá 88 để tìm nạp, trong đó số lượng bắt đầu ở 0.pg_return_xxx()
lấy đối số của nó giá trị thực tế để trả về.
Ở đây chúng tôi hiển thị tỷ lệ kèo bóng đá 88 chức năng giống như trên, được mã hóa theo kiểu phiên bản-1:
#include "Postgres.h"
TheTạo chức tỷ lệ kèo bóng đá 88tỷ lệ kèo bóng đá 88 lệnh giống như đối với tỷ lệ kèo bóng đá 88 tương đương phiên bản-0.
Thoạt nhìn, tỷ lệ kèo bóng đá 88 quy ước mã hóa phiên bản-1 có thể chỉ là chủ nghĩa tối nghĩa vô nghĩa. Tuy nhiên, họ cung cấp một số cải tiến, bởi vì tỷ lệ kèo bóng đá 88 macro có thể che giấu chi tiết không cần thiết.add_one_float8
, chúng ta không còn cần phải biết rằngfloat8là loại tham chiếu qua. tỷ lệ kèo bóng đá 88 ví dụ khác làGetArgmacro cho tỷ lệ kèo bóng đá 88 loại có độ dài thay đổi cho phép tìm nạp hiệu quả hơn"Nướng"(nén hoặc ngoài dòng) giá trị.
Một cải tiến lớn trong tỷ lệ kèo bóng đá 88 chức năng phiên bản-1 là xử lý tốt hơn tỷ lệ kèo bóng đá 88 đầu vào và kết quả của null. Macropg_argisnull (n)
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 đá 88 chức năng không được khai báo"nghiêm ngặt".) Như vớipg_getarg_xxx()
macro, tỷ lệ kèo bóng đá 88 đối số đầu vào được tính bắt đầu ở 0. Lưu ý rằng người ta nên không thực thipg_getarg_xxx()
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 thipg_return_null ()
; Điều này hoạt động trong cả hai chức tỷ lệ kèo bóng đá 88 nghiêm ngặt và không thành công.
tỷ lệ kèo bóng đá 88 tùy chọn khác được cung cấp trong giao diện kiểu mới là hai biến thể củapg_getarg_xxx()
Macros. Cái đầu tiên tỷ lệ kèo bóng đá 88 số này,pg_getarg_xxx_copy ()
, Đảm bảo trả lại tỷ lệ kèo bóng đá 88 bản sao của đối số được chỉ định an toàn khi viết vào. .pg_getarg_xxx_copy ()
macro đảm bảo kết quả có thể ghi.) Biến thể thứ hai bao gồmpg_getarg_xxx_slice ()
Macro có ba đối số. Đầu tiên là số lượng đối số tỷ lệ kèo bóng đá 88 (như trên)."Bên ngoài". (Loại lưu trữ của tỷ lệ kèo bóng đá 88 cột có thể được chỉ định bằng cách sử dụngBảng thay đổiTableNameCột thay đổicolnameĐặt lưu trữStoragetype.StorAgetypelà tỷ lệ kèo bóng đá 88 trongtrơn,bên ngoài,mở rộnghoặcchính.)
Cuối cùng, tỷ lệ kèo bóng đá 88 quy ước gọi chức năng phiên bản-1 cho phép trả về kết quả SET (Phần 35.9.9) và thực hiện tỷ lệ kèo bóng đá 88 chức năng kích hoạt (Chương 36) và Trình xử lý cuộc gọi bằng tỷ lệ kèo bóng đá 88 ngữ thủ tục (Chương 52). Mã phiên bản-1 cũng có khả năng di động hơn phiên bản-0, vì nó không phá vỡ tỷ lệ kèo bóng đá 88 hạn chế đối với giao thức cuộc gọi chức năng trong tiêu chuẩn C.SRC/Backend/Utils/fmgr/readmetỷ lệ kèo bóng đá 88 phân phối nguồn.
Trước khi chúng ta chuyển sang tỷ lệ kèo bóng đá 88 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 đá 88 hàm ngôn ngữ C. Mặc dù có thể tải tỷ lệ kèo bóng đá 88 hàm được viết bằng tỷ lệ kèo bóng đá 88 ngôn ngữ khác với C thànhPostgreSQL, Điều này thường khó khăn (khi có thể) bởi vì tỷ lệ kèo bóng đá 88 ngôn ngữ khác, chẳng hạn như C ++, Fortran hoặc Pascal thường không tuân theo quy ước gọi giống như C. đó là tỷ lệ kèo bóng đá 88 ngôn ngữ khác không truyền đối số và trả về tỷ lệ kèo bóng đá 88 giá trị giữa tỷ lệ kèo bóng đá 88 hàm theo cùng một cách. Vì lý do này, chúng tôi sẽ cho rằng tỷ lệ kèo bóng đá 88 hàm ngôn ngữ C của bạn thực sự được viết bằng C.
tỷ lệ kèo bóng đá 88 quy tắc cơ bản để viết và xây dựng tỷ lệ kèo bóng đá 88 hàm C như sau:
sử dụngpg_config-in-includedir-serverĐể tìm ra nơiPostgreSQLtỷ lệ kèo bóng đá 88 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 35.9.6Để 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 A"Khối ma thuật"Đối với thư viện chia sẻ của bạn, như được mô tả tỷ lệ kèo bóng đá 88Phần 35.9.1.
Khi phân bổ bộ nhớ, hãy sử dụngPostgreSQLchức tỷ lệ kèo bóng đá 88PalloC
vàPFREE
Thay vì tỷ lệ kèo bóng đá 88 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 đá 88 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 đá 88 lỗ trong cấu trúc) có chứa tỷ lệ kèo bóng đá 88 giá trị rác.
Hầu hết tỷ lệ kèo bóng đá 88 bên trongPostgreSQLtỷ lệ kèo bóng đá 88 loại được khai báo trongPostgres.h, trong khi giao diện trình quản lý chức tỷ lệ kèo bóng đá 88 (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 đề hoặc hệ thống người dùng nào khác. Bao gồmPostgres.hcũng sẽ bao gồmELOG.Hvàpalloc.hcho bạn.
Tên biểu tượng được xác định trong tỷ lệ kèo bóng đá 88 tệp đối tượng không được xung đột với nhau hoặc với tỷ lệ kèo bóng đá 88 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 đá 88 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 đá 88 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 đá 88 trang thủ công cho trình biên dịch C,CCvà 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 đá 88 số ví dụ làm việc trongĐóng gópThư mục. Nếu bạn dựa vào tỷ lệ kèo bóng đá 88 ví dụ này, bạn sẽ làm cho tỷ lệ kèo bóng đá 88 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 đá 88 tệp thực thi: Đầu tiên tỷ lệ kèo bóng đá 88 tệp nguồn được biên dịch thành tỷ lệ kèo bóng đá 88 tệp đối tượng, sau đó tỷ lệ kèo bóng đá 88 tệp đối tượng được liên kết với nhau. tỷ lệ kèo bóng đá 88 tệp đối tượng cần được tạo dưới dạngMã độc lập vị trí(pic), có nghĩa là về mặt khái niệm rằng chúng có thể được đặt tại tỷ lệ kèo bóng đá 88 vị trí tùy ý trong bộ nhớ khi chúng được thực thi. .
Trong tỷ lệ kèo bóng đá 88 ví dụ sau, chúng tôi cho rằng mã nguồn của bạn nằm trong một tệpfoo.cVà chúng tôi sẽ tạo tỷ lệ kèo bóng đá 88 thư viện được chia sẻfoo.so. Tệp đối tượng trung gian sẽ được gọi làfoo.otrừ 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 đá 88 tệp đối tượng, nhưng chúng tôi chỉ sử dụng tỷ lệ kèo bóng đá 88 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.
GCC -FPIC -C FOO.C
Điều này được áp dụng kể từ 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 cho tỷ lệ kèo bóng đá 88 thư viện được chia sẻ là-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 tiện ích mở rộng.SLĐối với tỷ lệ kèo bóng đá 88 thư viện được chia sẻ, không giống như hầu hết tỷ lệ kèo bóng đá 88 hệ thống khác.
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 đá 88 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 đá 88 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 đá 88 thư viện được chia sẻ. Trên tỷ lệ kèo bóng đá 88 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 đá 88 thư viện được chia sẻ.
GCC -FPIC -C FOO.C
Cờ trình biên dịch để tạopiclà-KPICVới trình biên dịch mặt trời và-FPICvớiGCC. Để liên kết tỷ lệ kèo bóng đá 88 thư viện được chia sẻ, tùy chọn trình biên dịch là-gvới trình biên dịch hoặc thay thế-sharedvớiGCC.
cc -kpic -c foo.c
hoặc
GCC -FPIC -C FOO.C
piclà mặc định, vì vậy lệnh biên dịch là giao dịch thông thường.LDVới tỷ lệ kèo bóng đá 88 tùy chọn đặc biệt được sử dụng để thực hiện liên kết.
CC -C FOO.C
Quy trình tương tự được sử dụng với GCC thay vì trình biên dịch hệ thống; Không có tùy chọn đặc biệt nào được yêu cầu.
Cờ trình biên dịch để tạopiclà-K picVới trình biên dịch SCO và-FPICvớiGCC. Để liên kết tỷ lệ kèo bóng đá 88 thư viện được chia sẻ, tùy chọn trình biên dịch là-gVới trình biên dịch SCO và-sharedvớiGCC.
cc -k pic -c foo.c
hoặc
GCC -FPIC -C FOO.C
Tip: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 tỷ lệ kèo bóng đá 88Lệ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à.sohoặc.SL) có thể được bỏ qua từTạo chức tỷ lệ kèo bóng đá 88lệ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 35.9.1Giới thiệu về nơi máy chủ mong đợi tìm thấy tỷ lệ kèo bóng đá 88 tệp thư viện được chia sẻ.
tỷ lệ kèo bóng đá 88 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 đá 88 thể hiện của một loại tổng hợp có thể chứa tỷ lệ kèo bóng đá 88 trường null.PostgreSQLCung cấp giao diện chức năng để truy cập tỷ lệ kèo bóng đá 88 trường thuộc loại tổng hợp từ C.
Giả sử chúng ta muốn viết một chức tỷ lệ kèo bóng đá 88 để 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 quy ước gọi phiên bản 0, chúng ta có thể xác địnhc_overpaid
As:
#include "Postgres.h"
tỷ lệ kèo bóng đá 88 mã hóa phiên bản-1, ở trên sẽ trông như thế này:
#include "Postgres.h"
GetAttributionByName
làPostgreSQLHàm hệ thống trả về tỷ lệ kèo bóng đá 88 thuộc tính ra khỏi 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 đá 88, 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ề ADatumGiá 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ợpDatumgetxxx()
Macro. Lưu ý rằng giá trị trả về là vô nghĩa nếu cờ null được đặt;
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 đá 88c_overpaid
tỷ lệ kèo bóng đá 88 SQL:
Tạo chức tỷ lệ kèo bóng đá 88 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 đá 88 đối số đầu vào có vô hiệu 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 đá 88 macro và chức năng để ẩn hầu hết độ phức tạp của việc xây dựng tỷ lệ kèo bóng đá 88 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ừ đó A"Tuple"): Bạn có thể xây dựng nó từ một mảng tỷ lệ kèo bóng đá 88 giá trị mốc hoặc từ một mảng tỷ lệ kèo bóng đá 88 chuỗi C có thể được truyền đến tỷ lệ kèo bóng đá 88 hàm chuyển đổi đầu vào của tỷ lệ kèo bóng đá 88 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ộttupledescMô 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 đá 88 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 đá 88 bộ dữ liệu, tất cả tỷ lệ kèo bóng đá 88 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.
Một số chức tỷ lệ kèo bóng đá 88 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 đá 88 chức năng trả về tỷ lệ kèo bóng đá 88 giá trị tổng hợp là gọi:
55531_55709
Vượt qua cùng tỷ lệ kèo bóng đá 88fcinfoCấ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 đá 88 quy ước gọi phiên bản 1.)resulttypeidcó thể được chỉ định lànullhoặ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 đá 88 OID.resultTupledescnên là địa chỉ của tỷ lệ kèo bóng đá 88 địa phươngtupledescBiến. Kiểm tra xem kết quả làTypeFunc_Composite; 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 đá 88 dòng"tỷ lệ kèo bóng đá 88 trả về bản ghi được gọi trong ngữ cảnh không thể chấp nhận bản ghi loại".)
Tip:
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 đá 88 chức năng trả về kết quả đa hình vô hướng, không chỉ tỷ lệ kèo bóng đá 88 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 đá 88 chức năng quay lại vô hướng đa hình.
Lưu ý:
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 đá 88 đượ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 đá 88 chức năng này không thể xử lý tỷ lệ kèo bóng đá 88 chức năng được khai báo để trả vềRecordvàget_func_result_type
Không thể giải quyết tỷ lệ kèo bóng đá 88 loại đa hình, vì vậy bạn nên sử dụngget_call_result_type
.
tỷ lệ kèo bóng đá 88 chức năng cũ hơn, hiện đang được ghi nhận để có đượctupledescS là:
TUPLEDESC quan hệ
để nhậntupledescĐối với loại hàng của mối quan hệ được đặt tên và:
58088_58147
để nhậntupledescDựa trên tỷ lệ kèo bóng đá 88 loại oid. Điều này có thể được sử dụng để có được tỷ lệ kèo bóng đá 88tupledescĐố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 đá 88 trả vềRecordTuy nhiên, và nó không thể giải quyết tỷ lệ kèo bóng đá 88 loại đa hình.
tỷ lệ kèo bóng đá 88 khi bạn cótupledesc, gọi:
58548_58593
Nếu bạn có kế hoạch làm việc với tỷ lệ kèo bóng đá 88 mốc dữ liệu, hoặc:
58670_58731
Nếu bạn có kế hoạch làm việc với 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 đá 88 chức năng này trongfunccallcontextCấu trúc - Sử dụngTUPE_DESChoặcAttinMetatrường tương ứng.
Khi làm việc với Datums, sử dụng:
59107_59182
để 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 đá 88 chuỗi C, sử dụng:
59343_59418
Để xây dựng AHeaptupleĐã 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 đá 88 đầ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 tỷ lệ kèo bóng đá 88 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 một tuple để trở về từ chức tỷ lệ kèo bóng đá 88 của mình, nó phải được chuyển đổi thành ADatum. Sử dụng:
60110_60146
Để chuyển đổi Athành tỷ lệ kèo bóng đá 88 mốc thời gian hợp lệ. Cái nàyDatumCó 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 đá 88 hoàn trả lại.
tỷ lệ kèo bóng đá 88 ví dụ xuất hiện trong phần tiếp theo.
Ngoài ra còn có API đặc biệt cung cấp hỗ trợ cho tỷ lệ kèo bóng đá 88 bộ trả về (nhiều hàng) từ hàm ngôn ngữ C. Một chức năng trả lại được thiết lập phải tuân theo tỷ lệ kèo bóng đá 88 quy ước gọi phiên bản-1.funcapi.h, như trên.
tỷ lệ kèo bóng đá 88 hoàn trả SET (SRF) được gọi tỷ lệ kèo bóng đá 88 lần cho mỗi mục mà nó trả về. TheSRFDo đó, phải lưu đủ trạng thái để nhớ những gì nó đã làm và trả lại mục tiếp theo tỷ lệ kèo bóng đá 88 mỗi cuộc gọi. Cấu trúcfunccallcontextđược cung cấp để giúp kiểm soát quá trình này. Trong một tỷ lệ kèo bóng đá 88,fcinfo- flinfo- fn_extrađược sử dụng để giữ tỷ lệ kèo bóng đá 88 con trỏ tớifunccallcontexttrên tỷ lệ kèo bóng đá 88 cuộc gọi.
Cấu trúc typedef
ANSRFSử dụng một số chức tỷ lệ kèo bóng đá 88 và macro tự động thao tácfunccallcontextCấu trúc (và mong đợi tìm thấy nó quafn_extra). Sử dụng:
SRF_IS_FIRSTCALL ()
Để xác định xem chức tỷ lệ kèo bóng đá 88 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ỉ) sử dụng:
srf_firstcall_init ()
Để khởi tạofunccallcontext. Trên mọi cuộc gọi chức tỷ lệ kèo bóng đá 88, bao gồm đầu tiên, sử dụng:
srf_percall_setup ()
Để thiết lập đúng cách sử dụngfunccallcontextvà xóa bất kỳ dữ liệu nào đã trả lại trước đó từ vượt qua trước.
Nếu chức tỷ lệ kèo bóng đá 88 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. (resultphải thuộc loạiDatum64644_64771
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à bối cảnh thoáng qua sẽ được xóa giữa tỷ lệ kèo bóng đá 88 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_ctxlà tỷ lệ kèo bóng đá 88 vị trí phù hợp cho bất kỳ dữ liệu nào cần tồn tại cho đến khiSRFđược hoàn thành chạy. Trong hầu hết tỷ lệ kèo bóng đá 88 trường hợp, điều này có nghĩa là bạn nên chuyển thànhmulti_call_memory_ctxtỷ lệ kèo bóng đá 88 khi thực hiện thiết lập cuộc gọi đầu tiên.
tỷ lệ kèo bóng đá 88 ví dụ Pseudo-Code hoàn chỉnh trông giống như sau:
Datumkhai báo thêm khi cầnif (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ùngMemoryContextSwitchto (OldContext);Mã người dùngfuncctx = srf_percall_setup ();Mã người dùng/ * Đây chỉ là tỷ lệ kèo bóng đá 88 cách chúng tôi có thể kiểm tra xem chúng tôi đã hoàn thành: */Mã người dùng có được dữ liệu kết quảsrf_return_next (funcctx, result);Mã người dùngsrf_return_done (funcctx);
tỷ lệ kèo bóng đá 88 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);
Một cách để khai báo chức tỷ lệ kèo bóng đá 88 này trong SQL là:
Tạo loại __retComposite AS (Số nguyên F1, Số nguyên F2, Số nguyên F3);FileName',' retcposite '
Một cách khác là sử dụng tỷ lệ kèo bóng đá 88 tham số:
Tạo hoặc thay thế chức tỷ lệ kèo bóng đá 88 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 đá 88 chính thức là một ẩn danhRecordloại.
Thư mụcPRINT/TABLEFUNCMô-đun trong phân phối nguồn chứa nhiều ví dụ hơn về tỷ lệ kèo bóng đá 88 chức năng trả lại thiết lập.
tỷ lệ kèo bóng đá 88 hàm ngôn ngữ C có thể được khai báo để chấp nhận và trả về tỷ lệ kèo bóng đá 88 loại đa hìnhAnyEuity,AnyArray,Anynonarray,AnyenumvàAnyrange. Nhìn thấyPhần 35.2.5Để giải thích chi tiết hơn về tỷ lệ kèo bóng đá 88 hàm đa hình. Khi tỷ lệ kèo bóng đá 88 đối số chức năng hoặc loại trả về được định nghĩa là tỷ lệ kèo bóng đá 88 loại đa hình, tác giả chức năng không thể biết trước loại dữ liệu nào nó sẽ được gọi với hoặc cần quay lại.fmgr.hĐể cho phép chức năng phiên bản-1 C khám phá tỷ lệ kèo bóng đá 88 loại dữ liệu thực tế của tỷ lệ kèo bóng đá 88 đối số và loại nó dự kiến sẽ trả về. tỷ lệ kèo bóng đá 88 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úcflinfothường được truy cập làfcinfo- flinfo. Tham sốargnumbằ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 đá 88 đố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 đá 88 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 đá 88 hàm variadic Lấy tỷ lệ kèo bóng đá 88 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 đá 88 để 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 tỷ lệ kèo bóng đá 88make_array
tỷ lệ kèo bóng đá 88 SQL:
Tạo chức tỷ lệ kèo bóng đá 88 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 đá 88 hàm ngôn ngữ C: Chúng có thể được khai báo để lấy tỷ lệ kèo bóng đá 88 tham số loại"Any". (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 đá 88 từ dành riêng cho SQL.) Điều này hoạt động nhưAnyEuityNgoại trừ việc nó không hạn chế khác nhau"bất kỳ"Đối số là cùng loại, chúng cũng không giúp xác định loại kết quả của tỷ lệ kèo bóng đá 88. tỷ lệ kèo bóng đá 88 ngôn 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 đá 88 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 đá 88 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 đá 88 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 đá 88 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ụngVariadicTừ 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 đá 88 phần tử mảng là tỷ lệ kèo bóng đá 88 đố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.
Một số cuộc gọi chức năng có thể được đơn giản hóa trong quá trình lập kế hoạch dựa trên tỷ lệ kèo bóng đá 88 thuộc tính cụ thể cho chức năng. Ví dụ,int4mul (n, 1)có thể được đơn giản hóa thành chỉn. Để xác định tỷ lệ kèo bóng đá 88 tối ưu hóa cụ thể chức năng đó, hãy viết Atỷ lệ kèo bóng đá 88 biến đổivà đặt oid của nó vàoProtransformTrường của chức tỷ lệ kèo bóng đá 88 chínhPG_PROCmục nhập. Chức tỷ lệ kèo bóng đá 88 biến đổi phải có chữ ký SQLProtransform (nội bộ) Trả về nội bộ. Đối số, thực sựfuncexpr *, là một nút giả đại diện cho một cuộc gọi đến chức năng chính. Nếu nghiên cứu của chức năng biến đổi về cây biểu thức chứng minh rằng một cây biểu thức đơn giản có thể thay thế cho tất cả tỷ lệ kèo bóng đá 88 cuộc gọi cụ thể có thể được biểu thị do đó, việc xây dựng và trả về biểu thức đơn giản hóa đó.nullCon trỏ (khôngA SQL NULL).
Chúng tôi không đảm bảo rằngPOSTGRESQLSẽ không bao giờ gọi chức năng chính trong tỷ lệ kèo bóng đá 88 trường hợp chức năng biến đổi có thể đơn giản hóa. Đảm bảo sự tương đương nghiêm ngặt giữa biểu thức đơn giản hóa và cuộc gọi thực tế đến chức năng chính.
Hiện tại, cơ sở này không được tiếp xúc với người dùng ở cấp SQL vì những lo ngại về bảo mật, vì vậy việc sử dụng để tối ưu hóa tỷ lệ kèo bóng đá 88 chức năng tích hợp.
add-ins có thể bảo lưu LWLOCKS và phân bổ bộ nhớ chia sẻ 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ó tỷ lệ kèo bóng đá 88shared_preload_l Libries. Bộ nhớ chia sẻ được bảo lưu bằng cách gọi:
void requestAddInshmemSpace (int size)
từ của bạn_pg_init
chức tỷ lệ kèo bóng đá 88.
LWlocks được bảo lưu bằng cách gọi:
void requestAddInlWlocks (int n)
từ_pg_init
.
Để tránh điều kiện chủng tộc có thể, mỗi phụ trợ nên sử dụng LWLOCKaddinshmeminitlock
Khi kết nối và khởi tạo phân bổ bộ nhớ chia sẻ, như được hiển thị ở đây:
MyStruct static *ptr = null;
mặc dùPostgreSQLphụ trợ được viết bằng C, có thể ghi tỷ lệ kèo bóng đá 88 tiện ích mở rộng trong C ++ nếu tỷ lệ kèo bóng đá 88 hướng dẫn này được tuân thủ:
Tất cả tỷ lệ kèo bóng đá 88 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 đá 88 chức năng C này sau đó có thể gọi tỷ lệ kèo bóng đá 88 hàm C ++.Extern CLiên kết là cần thiết cho tỷ lệ kèo bóng đá 88 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 phân giải 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
tỷ lệ kèo bóng đá 88 những trường hợp như vậy sẽ thất bại.
Ngăn chặn tỷ lệ kèo bóng đá 88 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 Cchứ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 đá 88 sự kiện như ngoài bộ nhớ vẫn có thể đưa ra tỷ lệ kèo bóng đá 88 ngoại lệ.-FNO-EXCEPTIONĐể loại bỏ hoàn toàn 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 đá 88 lỗi trong mã C ++ của mình, ví dụ:new ()
.
Nếu gọi tỷ lệ kèo bóng đá 88 hàm 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 đá 88 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 đá 88 xalongjmp ()
80978_81049
Tóm lại, tốt nhất là đặt mã C ++ phía sau tỷ lệ kèo bóng đá 88 bức tườngExtern Ctỷ lệ kèo bóng đá 88 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.