2009-03-06 6 views
6

위해 PL/루비 설치이 포스트 그레스의 임베디드 루비 코드, 와 기능을 개발을 가능하게하는 것입니다하지만 난 그것을 구축 할 수 없었습니다.는 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 필요 구축을 위해 노력하고있다가 조언으로 내 로컬 포스트 그레스입니다 설정하고에 호출 조정 여기서 내가 그에 변화의 꽤 번호를 시도했습니다

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

을하지만, 성공적으로 을 할 수있을 것 같지 않습니다 그것을

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. 

그리고 여기 수동으로 GCC 줄을 실행할 때 내 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 */ 

에서 끝낼 것입니다 : 'conftest.c'파일

그것은이 말한다 '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] 

어떤 도움이나 조언을 주시면 감사하겠습니다.

-

답변

5

OK 마이크 Berrow, 나는 GCC 라인을 시작으로 의 로그 파일 성공적인 구축을 위해 인터넷 검색으로합니다 (깨지기 쉬운 extconf.rb와 메이크를 우회)이 구축 손 관리 거기서 보았을 때 gcc 컴파일러가 작동 할 때까지 플래그와 경로를 컴파일했습니다. 쉘 다음 링크

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 

찾는 동적 라이브러리 위에서 구축 '.so는'파일로부터 각 컴파일

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

아래와 같이

에서 plruby.h 0으로 변경 SAFE_LEVEL 경로 ($ libdir) [내 경우에는 /usr/postgresql-8.3.4/lib] pg_config --pkglibdir을 사용하여 결정

다른 복용 이 방법은 대부분 자신의 조정을 수행해야합니다.

이 기능들을 추가하십시오 ...

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

유형 '전환'을 가능하게이 다른 빌드 옵션이 있습니다 : 절차 언어

CREATE PROCEDURAL LANGUAGE 'plruby' HANDLER plruby_call_handler; 

테스트를 같은

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'. 위의 빌드는 가장 단순한 함수이며 모든 함수 매개 변수는 실제로 이 int4로 선언되었지만 문자열로 루비를 사용합니다. 따라서 여기에 'to_i'호출이 필요합니다.