2009-03-06 81 views
6

安裝PL /紅寶石這是爲了使Postgres的發展功能嵌入紅寶石代碼, 但我一直無法建立它。對PostgreSQL 8.3

誠如通過 http://www.robbyonrails.com/articles/2005/08/22/installing-untrusted-pl-ruby-for-postgresql

我試圖建立從我整理出來的最新版本ftp://moulon.inra.fr/pub/ruby/

提供(plruby-0.5.3.tar.gz)所需的plruby.so在我的本地的Postgres設置的調整和調用到:

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

我試着對變化的相當數量,但它似乎並沒有能夠成功地使 的'conftest.c' 文件

它這樣說:

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. 

而且這裏是我結束了我的mkmf.log

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 */ 

當我手動運行一行gcc,它說沒有'conftest.c'(並且沒有,但是應該生成 )。

'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] 

任何幫助和/或建議,將不勝感激。

邁克 - Berrow

回答

5

OK,我設法手通過google搜索的 日誌文件創建成功,開始與海合會系列構建這(繞過脆弱 extconf.rb和Makefile)我看到那裏,然後擺弄gcc編譯 標誌和路徑,直到它工作。

在plruby.h改變SAFE_LEVEL至0 如下所示

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

每個從殼然後鏈接

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 

放置在上面的動態庫構建的「所以」文件編譯路徑($ libdir) [使用pg_config --pkglibdir給出(在我的情況下)/usr/postgresql-8.3.4/lib]

其他這種方法很可能不得不自己調整。

添加這些功能...

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; 

增加 'plruby' 作爲程序語言

CREATE PROCEDURAL LANGUAGE 'plruby' HANDLER plruby_call_handler; 

測試:

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); 

這有其他的編譯選項,使型 '轉換'。 上面的構建是最簡單的一個,實際上所有函數參數 都以字符串的形式進入ruby(儘管它們被聲明爲int4)。 因此需要'to_i'來電。