Tất cả các cuộc gọi đến các chức năng được viết bằng tỷ lệ kèo bóng đá tối nay ngôn ngữ khác ngoài hiện tại"Phiên bản 1"Giao diện cho các ngôn ngữ được biên dịch (điều này bao gồm các hàm trong các tỷ lệ kèo bóng đá tối nay do người dùng xác địnhCall HandlerHàm cho ngôn ngữ cụ thể. Trình xử lý cuộc gọi là thực thi chức năng là một cách có ý nghĩa, chẳng hạn như bằng cách diễn giải văn bản nguồn được cung cấp. Chương này phác thảo làm thế nào tỷ lệ kèo bóng đá tối nay xử lý cuộc gọi của một ngôn ngữ thủ tục mới có thể được viết.
Trình xử lý cuộc gọi cho tỷ lệ kèo bóng đá tối nay là"Bình thường"Hàm phải được viết bằng tỷ lệ kèo bóng đá tối nay ngữ được biên dịch như C, sử dụng giao diện phiên bản-1 và được đăng ký vớiPostgreSQLnhư không có đối số và trả về loạitỷ lệ kèo bóng đá tối nay_handler. Kiểu giả đặc biệt này xác định chức năng là người xử lý cuộc gọi và ngăn không cho nó được gọi trực tiếp trong các lệnh SQL. Để biết thêm chi tiết về các quy ước gọi tỷ lệ kèo bóng đá tối nay ngữ C và tải động, xemPhần 36.9.
Trình xử lý cuộc gọi được gọi theo cùng tỷ lệ kèo bóng đá tối nay cách như bất kỳ chức năng nào khác: Nó nhận được tỷ lệ kèo bóng đá tối nay con trỏ tới AfunctionCallInfodata structChứa các giá trị đối số và thông tin về hàm được gọi là và dự kiến sẽ trả về ADatumKết quả (và có thể đặtisnullTrường củafunctionCallInfodataCấu trúc, nếu nó muốn trả về kết quả SQL NULL). Sự khác biệt giữa tỷ lệ kèo bóng đá tối nay xử lý cuộc gọi và hàm callee thông thường làflinfo- fn_oidTrường củafunctionCallInfodata12361_12665
Tùy thuộc vào tỷ lệ kèo bóng đá tối nay xử lý cuộc gọi để lấy mục nhập của hàm từPG_PROC
Danh mục hệ thống và để phân tích đối số và các loại trả về của hàm được gọi. TheASmệnh đề từTạo chức năngLệnh cho chức năng sẽ được tìm thấy trongprosrcCột củaPG_PROC
Hàng. Đây thường là văn bản nguồn trong ngôn ngữ thủ tục, nhưng trên lý thuyết, nó có thể là tỷ lệ kèo bóng đá tối nay cái gì đó khác, chẳng hạn như tên đường dẫn đến tỷ lệ kèo bóng đá tối nay tệp hoặc bất cứ điều gì khác cho người xử lý cuộc gọi phải làm gì tỷ lệ kèo bóng đá tối nay cách chi tiết.
13295_13458flinfo- fn_extraTrường. Điều này ban đầu sẽ là13554_13560, nhưng có thể được đặt bởi tỷ lệ kèo bóng đá tối nay xử lý cuộc gọi để chỉ vào thông tin về hàm được gọi. Trên các cuộc gọi tiếp theo, nếuflinfo- fn_extrađã khôngnullSau đó, nó có thể được sử dụng và bước tra cứu thông tin bị bỏ qua. Người xử lý cuộc gọi phải đảm bảo rằng13890_13911được thực hiện để chỉ vào bộ nhớ sẽ sống ít nhất cho đến khi kết thúc truy vấn hiện tại, vì tỷ lệ kèo bóng đá tối nayfmgrinfoCấu trúc dữ liệu có thể được giữ lâu như vậy. tỷ lệ kèo bóng đá tối nay cách để làm điều này là phân bổ dữ liệu bổ sung trong bối cảnh bộ nhớ được chỉ định bởiflinfo- fn_mcxt; Dữ liệu đó thường sẽ có tuổi thọ giống nhưfmgrinfo14311_14461
Khi hàm tỷ lệ kèo bóng đá tối nay được gọi dưới dạng kích hoạt, không có đối số nào được truyền theo cách thông thường, nhưngfunctionCallInfodata'sbối cảnhđiểm trường tại ATriggerDataCấu trúc, thay vì lànullNhư trong tỷ lệ kèo bóng đá tối nay cuộc gọi chức năng đơn giản. tỷ lệ kèo bóng đá tối nay người xử lý ngôn ngữ nên cung cấp các cơ chế cho các chức năng ngôn ngữ thủ tục để có được thông tin kích hoạt.
Đây là một mẫu cho tỷ lệ kèo bóng đá tối nay xử lý ngôn ngữ thủ tục được viết bằng C:
#include "Postgres.h" #include "Executor/spi.h" #include "Lệnh/Trigger.h" #include "fmgr.h" #include "Access/Heapam.h" #include "Utils/syscache.h" #include "Danh mục/pg_proc.h" #include "Danh mục/pg_type.h" #ifdef pg_module_magic Pg_module_magic; #endif Pg_function_info_v1 (plsample_call_handler); Mốc thời gian plsample_call_handler (pg_function_args) Datum retval; if (được gọi là_as_trigger (fcinfo)) /* * Được gọi là thủ tục kích hoạt */ TriggerData *TrigData = (TriggerData *) fcinfo- bối cảnh; retval = ... khác /* * Được gọi là tỷ lệ kèo bóng đá tối nay hàm */ retval = ... trả lại retval;
Chỉ có vài nghìn dòng mã phải được thêm vào thay vì các dấu chấm để hoàn thành tỷ lệ kèo bóng đá tối nay xử lý cuộc gọi.
Sau khi biên dịch chức năng xử lý thành tỷ lệ kèo bóng đá tối nay mô -đun có thể tải (xemPhần 36.9.6), Các lệnh sau sau đó đăng ký tỷ lệ kèo bóng đá tối nay mẫu:
Tạo chức năng plsample_call_handler () trả về tỷ lệ kèo bóng đá tối nay_handler BẰNG 'FileName' tỷ lệ kèo bóng đá tối nay ngữ C; Tạo tỷ lệ kèo bóng đá tối nay ngữ plsample Handler plsample_call_handler;
Mặc dù cung cấp trình xử lý cuộc gọi là đủ để tạo ngôn ngữ thủ tục tối thiểu, có hai chức năng khác có thể được cung cấp tùy chọn để làm cho ngôn ngữ thuận tiện hơn để sử dụng. Đây là tỷ lệ kèo bóng đá tối naytỷ lệ kèo bóng đá tối nay xác nhậnvà tỷ lệ kèo bóng đá tối nayHandler nội tuyến. tỷ lệ kèo bóng đá tối nay xác nhận có thể được cung cấp để cho phép kiểm tra cụ thể ngôn ngữ được thực hiện trong thời giantạo chức năng. tỷ lệ kèo bóng đá tối nay xử lý nội tuyến có thể được cung cấp để cho phép ngôn ngữ hỗ trợ các khối mã ẩn danh được thực thi thông quadolệnh.
Nếu tỷ lệ kèo bóng đá tối nay xác thực được cung cấp bởi một ngôn ngữ thủ tục, nó phải được khai báo là một hàm lấy một tham số duy nhấtoid17004_17083void. tỷ lệ kèo bóng đá tối nay xác nhận sẽ được gọi vào cuốiTạo chức năngLệnh đã tạo hoặc cập nhật tỷ lệ kèo bóng đá tối nay hàm được viết bằng ngôn ngữ thủ tục. OID được truyền qua là oid của chức năngPG_PROC
Hàng. tỷ lệ kèo bóng đá tối nay xác thực phải tìm nạp hàng này theo cách thông thường và làm bất cứ điều gì kiểm tra là phù hợp. Đầu tiên, gọiCheckFunctionValidatorAccess ()
Để chẩn đoán các cuộc gọi rõ ràng đến tỷ lệ kèo bóng đá tối nay xác nhận mà người dùng không thể đạt được thông quaTạo chức năng. Kiểm tra điển hình sau đó bao gồm xác minh rằng các loại đối số và kết quả của hàm được hỗ trợ bởi ngôn ngữ và cơ thể của chức năng được chính xác về mặt cú pháp trong ngôn ngữ. Nếu Trình xác thực thấy chức năng là ổn, nó sẽ chỉ quay lại. Nếu nó tìm thấy tỷ lệ kèo bóng đá tối nay lỗi, nó sẽ báo cáo rằng thông qua bình thườngereport ()
Cơ chế báo cáo lỗi. Ném tỷ lệ kèo bóng đá tối nay lỗi sẽ buộc tỷ lệ kèo bóng đá tối nay cuộc quay đầu lại giao dịch và do đó ngăn chặn định nghĩa chức năng không chính xác được thực hiện.
Các chức năng của tỷ lệ kèo bóng đá tối nay xác thực thường tôn trọngCheck_Function_BodiesTham số: Nếu nó bị tắt thì bất kỳ kiểm tra đắt tiền hoặc nhạy cảm với bối cảnh nên được bỏ qua. Nếu tỷ lệ kèo bóng đá tối nay ngữ cung cấp thực thi mã tại thời điểm biên dịch, trình xác nhận phải triệt tiêu các kiểm tra sẽ gây ra thực thi đó. Cụ thể, tham số này bị tắt bởipg_dump18632_19051tạo chức năngLệnh.) Mặc dù việc lựa chọn chính xác những gì cần kiểm tra hầu hết là theo quyết định của hàm xác thực, lưu ý rằng lõiTạo chức năngMã chỉ thực thisetmệnh đề gắn liền với tỷ lệ kèo bóng đá tối nay hàm khiCheck_Function_Bodieslà trên. Do đó, kiểm tra kết quả của họ có thể bị ảnh hưởng bởi các tham số GUC chắc chắn nên được bỏ qua khiCheck_Function_Bodiesbị tắt, để tránh các lỗi sai khi tải lại tỷ lệ kèo bóng đá tối nay bãi rác.
Nếu tỷ lệ kèo bóng đá tối nay xử lý nội tuyến được cung cấp bởi một ngôn ngữ thủ tục, nó phải được khai báo là một hàm lấy một tham số duy nhất loạiNội bộ. Kết quả của người xử lý nội tuyến bị bỏ qua, do đó, nó được tuyên bố thông thường để trả vềvoid19876_19921doTuyên bố được thực thi chỉ định ngôn ngữ thủ tục. Tham số thực sự được truyền là tỷ lệ kèo bóng đá tối nay con trỏ tớiInLineCodeBlockstruct, chứa thông tin vềdotham số của câu lệnh, đặc biệt là văn bản của khối mã ẩn danh sẽ được thực thi. tỷ lệ kèo bóng đá tối nay xử lý nội tuyến nên thực thi mã này và trả về.
Bạn nên bọc tất cả các khai báo chức năng này, cũng nhưTạo tỷ lệ kèo bóng đá tối nay ngữlệnh chính, thành tỷ lệ kèo bóng đá tối nayMở rộngVì vậy, đơn giảnTạo tiện ích mở rộngLệnh là đủ để cài đặt tỷ lệ kèo bóng đá tối nay ngữ. Nhìn thấyPhần 36.15Để biết thông tin về việc viết tiện ích mở rộng.
Các tỷ lệ kèo bóng đá tối nay có trong phân phối tiêu chuẩn là các tài liệu tham khảo tốt khi cố gắng viết trình xử lý ngôn ngữ của riêng bạn. Nhìn vàoSRC/PLThư mục con của cây nguồn. ThePostgreSQL: Tài liệu: 9.6: Tạo kèoTrang tham chiếu cũng có tỷ lệ kèo bóng đá tối nay số chi tiết hữu ích.