2009-03-06 27 views
6

này là cho phép sự phát triển của postgres chức năng với nhúng ruby ​​ mã, nhưng tôi đã không thể xây dựng nó.Cài đặt PL/Ruby cho PostgreSQL 8.3

Là cố vấn bởi http://www.robbyonrails.com/articles/2005/08/22/installing-untrusted-pl-ruby-for-postgresql

tôi đang cố gắng để xây dựng cần thiết plruby.so từ phiên bản mới nhất (plruby-0.5.3.tar.gz) cung cấp tại ftp://moulon.inra.fr/pub/ruby/

Tôi đã sắp xếp ra nơi postgres địa phương của tôi thiết lập được và điều chỉnh gọi đến:

ruby extconf.rb --with-pgsql-include=/usr/postgresql-8.3.4/include/server --enable-shared --disable-conversion --with-pgsql-version=83 

tôi đã cố gắng số khá của các biến thể trên đó, nhưng nó dường như không có khả năng thực hiện thành công các tập tin 'conftest.c'

Nó nói này:

checking for catalog/pg_proc.h... yes 
*** extconf.rb failed *** 
Could not create Makefile due to some reason, probably lack of 
necessary libraries and/or headers. Check the mkmf.log file for more 
details. You may need configuration options. 

Và đây là những gì tôi kết thúc với trong mkmf.log tôi

have_header: checking for catalog/pg_proc.h... -------------------- yes 
"gcc -E -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -I/usr/postgresql-8.3.4/include/server -g -O2 -fPIC conftest.c -o conftest.i" 
checked program was: 
/* begin */ 
1: #include <catalog/pg_proc.h> 
/* end */ 

Khi tôi chạy dòng gcc bằng tay, nó nói rằng không có 'conftest.c' (và không có, nhưng nó được cho là được tạo ra).

'uname -a' ... gives 
Linux vdev1 2.6.18.8-xen #2 SMP Thu May 8 11:52:29 PDT 2008 x86_64 x86_64 x86_64 GNU/Linux 
'ruby -v' ... gives 
ruby 1.8.6 (2008-08-11 patchlevel 287) [x86_64-linux] 

Bất kỳ sự giúp đỡ và/hoặc tư vấn sẽ được đánh giá.

- Mike Berrow

Trả lời

5

OK, tôi quản lý để tay xây dựng này (bỏ qua các mong manh extconf.rb và makefile) bởi googling cho một logfile của một xây dựng thành công, bắt đầu với các dòng gcc Tôi đã thấy ở đó, sau đó không quan tâm đến việc biên dịch gcc cờ và đường dẫn cho đến khi nó hoạt động.

Trong plruby.h thay đổi SAFE_LEVEL 0 như hình dưới đây

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

Biên dịch từng từ vỏ sau đó 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 '.so' tập tin được xây dựng ở trên trong thư viện động đường dẫn ($ libdir) [được xác định bằng cách sử dụng pg_config --pkglibdir cho (trong trường hợp của tôi) /usr/postgresql-8.3.4/lib]

Khác cách tiếp cận này rất có thể sẽ phải thực hiện tinh chỉnh riêng của họ.

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; 

Add 'plruby' như một ngôn ngữ thủ tục

CREATE PROCEDURAL LANGUAGE 'plruby' HANDLER plruby_call_handler; 

thử nghiệm 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ó những lựa chọn xây dựng khác cho việc này cho phép gõ 'chuyển đổi'. Việc xây dựng ở trên là một trong những đơn giản nhất và tất cả các thông số chức năng thực sự đi vào ruby ​​như chuỗi (mặc dù chúng được khai báo là int4). Vì vậy, nhu cầu gọi 'to_i' ở đây.

Các vấn đề liên quan