PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cài đặt PL / Ruby cho PostgreSQL 8.3

Được rồi, tôi đã cố gắng xây dựng thủ công điều này (bỏ qua mong manh extconf.rb và makefile) bằng cách truy cập vào một tệp nhật ký của một bản dựng thành công, bắt đầu với các dòng gcc mà tôi đã thấy ở đó, sau đó tìm hiểu các đường dẫn và thẻ biên dịch gcc cho đến khi nó hoạt động.

Trong plruby.h, thay đổi SAFE_LEVEL thành 0 như được hiển thị bên dưới

#ifndef SAFE_LEVEL
//#define SAFE_LEVEL 12
#define SAFE_LEVEL 0
#endif

Biên dịch từng từ shell rồi liên kết

gcc -I. -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -DHAVE_CATALOG_PG_PROC_H -DHAVE_RB_HASH_DELETE -DHAVE_ST_H -DHAVE_UTILS_ARRAY_H -I/usr/postgresql-8.3.4/include/server  -D_FILE_OFFSET_BITS=64  -fPIC -fno-strict-aliasing -g -g -O2  -fPIC  -DHAVE_RB_HASH_DELETE -DHAVE_RB_INITIALIZE_COPY -DPG_UTILS_ARRAY -DPG_PL_TRYCATCH -DPG_PL_VERSION=83 -DPLRUBY_CALL_HANDLER=plruby_call_handler -DPLRUBY_VALIDATOR=plruby_validator  -c plruby.c
gcc -I. -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -DHAVE_CATALOG_PG_PROC_H -DHAVE_RB_HASH_DELETE -DHAVE_ST_H -DHAVE_UTILS_ARRAY_H -I/usr/postgresql-8.3.4/include/server  -D_FILE_OFFSET_BITS=64  -fPIC -fno-strict-aliasing -g -g -O2  -fPIC  -DHAVE_RB_HASH_DELETE -DHAVE_RB_INITIALIZE_COPY -DPG_UTILS_ARRAY -DPG_PL_TRYCATCH -DPG_PL_VERSION=83 -DPLRUBY_CALL_HANDLER=plruby_call_handler -DPLRUBY_VALIDATOR=plruby_validator  -c plplan.c
gcc -I. -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -DHAVE_CATALOG_PG_PROC_H -DHAVE_RB_HASH_DELETE -DHAVE_ST_H -DHAVE_UTILS_ARRAY_H -I/usr/postgresql-8.3.4/include/server  -D_FILE_OFFSET_BITS=64  -fPIC -fno-strict-aliasing -g -g -O2  -fPIC  -DHAVE_RB_HASH_DELETE -DHAVE_RB_INITIALIZE_COPY -DPG_UTILS_ARRAY -DPG_PL_TRYCATCH -DPG_PL_VERSION=83 -DPLRUBY_CALL_HANDLER=plruby_call_handler -DPLRUBY_VALIDATOR=plruby_validator  -c plpl.c
gcc -I. -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -DHAVE_CATALOG_PG_PROC_H -DHAVE_RB_HASH_DELETE -DHAVE_ST_H -DHAVE_UTILS_ARRAY_H -I/usr/postgresql-8.3.4/include/server -D_FILE_OFFSET_BITS=64  -fPIC -fno-strict-aliasing -g -g -O2  -fPIC  -DHAVE_RB_HASH_DELETE -DHAVE_RB_INITIALIZE_COPY -DPG_UTILS_ARRAY -DPG_PL_TRYCATCH -DPG_PL_VERSION=83 -DPLRUBY_CALL_HANDLER=plruby_call_handler -DPLRUBY_VALIDATOR=plruby_validator  -c pltrans.c
gcc -shared -o plruby.so plruby.o plplan.o plpl.o pltrans.o -L. -L/usr/lib -L/usr/postgresql-8.3.4/lib -L. -Wl,-Bsymbolic -rdynamic -Wl,-export-dynamic -lruby  -lpthread -ldl -lcrypt -lm -lc

Đặt tệp '.so' được tạo ở trên vào đường dẫn thư viện động ($ libdir) [được xác định bằng cách sử dụng pg_config --pkglibdir tặng (trong trường hợp của tôi) /usr/postgresql-8.3.4/lib]

Những người khác áp dụng phương pháp này rất có thể sẽ phải tự điều chỉnh.

Thêm các chức năng này ...

CREATE OR REPLACE FUNCTION plruby_call_handler()
  RETURNS language_handler AS
'$libdir/plruby', 'plruby_call_handler'
  LANGUAGE 'c' VOLATILE
  COST 1;
ALTER FUNCTION plruby_call_handler() OWNER TO postgres;

CREATE OR REPLACE FUNCTION plruby_validator(oid)
  RETURNS void AS
'$libdir/plruby', 'plruby_validator'
  LANGUAGE 'c' VOLATILE
  COST 1;
ALTER FUNCTION plruby_validator(oid) OWNER TO postgres;

Thêm 'plruby' làm ngôn ngữ thủ tục

CREATE PROCEDURAL LANGUAGE 'plruby' HANDLER plruby_call_handler;

Kiểm tra nó:

CREATE FUNCTION ruby_max(int4, int4) RETURNS text AS '
    if args[0].to_i > args[1].to_i
        return "The one on the left is bigger"
    else
        return "The one on the right is bigger"
    end
' LANGUAGE 'plruby';

select ruby_max(8, 9);

Có các tùy chọn xây dựng khác cho điều này cho phép kiểu 'chuyển đổi'. Bản dựng trên là kiểu đơn giản nhất và tất cả các tham số hàm thực sự chuyển thành ruby ​​dưới dạng chuỗi (mặc dù chúng được khai báo là int4). .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách triển khai PostgreSQL để có tính khả dụng cao

  2. Làm cách nào để chèn một bản ghi có thể cập nhật với cột JSON trong PostgreSQL bằng JOOQ?

  3. Cách sqrt () hoạt động trong PostgreSQL

  4. Tại sao người dùng mới trong PostgreSQL có thể kết nối với tất cả các cơ sở dữ liệu?

  5. Cách cập nhật các hàng trong Cơ sở dữ liệu với các giá trị từ data.frame trong R theo điều kiện