かめのはこ

とあるエンジニアのメモ帳です

ubuntu12.04(x64)にplv8入れてみる

Postgresでjavascriptが書けるってやつを試してみました
 
まずは環境作りから
 
※postgresql9.1インストール済

V8 Engineインストール

sudo apt-get install python scons gcc g++ svn
cd /usr/local/src
svn checkout http://v8.googlecode.com/svn/trunk/ v8
cd v8
scons mode=release library=shared snapshot=on arch=x64
sudo cp libv8.so /lib/

 
PL/V8インストール

sudo apt-get install mercurial
sudo apt-get install postgresql-server-dev-9.1
cd /usr/local/src
wget https://plv8js.googlecode.com/files/plv8js-20120719.tar.gz
tar zxvf plv8js-20120719.tar.gz
cd plv8js
make
sudo make install
sudo cp -pR /usr/local/src/plv8js/sql /usr/share/postgresql/9.1/contrib/plv8js

 
インストールしたモジュールPostgresに追加

cp -p /etc/postgresql/9.1/main/postgresql.conf /etc/postgresql/9.1/main/postgresql.conf.org
sudo /etc/init.d/postgresql stop
vi /etc/postgresql/9.1/main/postgresql.conf
 >> custom_variable_classes = 'plv8'
sudo /etc/init.d/postgresql start

 
んじゃDBにも関数とか反映

sudo su - postgres
psql -c 'CREATE EXTENSION plv8' -d データベース名
psql -f /usr/share/postgresql/9.1/contrib/plv8js/plv8.sql -d データベース名

 
これで一通り準備は完了したのでJSしてみる
 
READMEにあったやつ

CREATE OR REPLACE FUNCTION plv8_test(keys text[], vals text[])
RETURNS text AS $$
 var o = {};
 for(var i=0; i<keys.length; i++){
  o[keys[i]] = vals[i];
 }
 return JSON.stringify(o);
$$ LANGUAGE plv8 IMMUTABLE STRICT;

SELECT plv8_test(ARRAY['name', 'age'], ARRAY['Tom', '29']);
plv8_test
---------------------------
{"name":"Tom","age":"29"}
(1 row)

 
とりあえずループ文

CREATE OR REPLACE FUNCTION plv8_test(startval integer, endval integer)
RETURNS integer AS $$
 var o = 0;
 for(var i=startval; i<=endval; i++){
  o += i;
 }
 return o;
$$ LANGUAGE plv8 IMMUTABLE STRICT;

SELECT plv8_test(1,10);
plv8_test
-----------
55
(1 row)

 
とりあえずJS関数

CREATE OR REPLACE FUNCTION plv8_test()
RETURNS text AS $$
 var dd = new Date();
 return dd.toLocaleString();
$$ LANGUAGE plv8 IMMUTABLE STRICT;

SELECT plv8_test();
plv8_test
-----------------------------------------
Tue Sep 18 2012 11:39:24 GMT+0900 (JST)
(1 row)

 
とりあえず自前関数

CREATE OR REPLACE FUNCTION plv8_test()
RETURNS text AS $$
  var aa = "first";
  sage();
  hoge();
  return aa;
  function hoge(){
    aa = "hoge";
  }
  function sage(){
    aa = "sage"
  }
$$ LANGUAGE plv8 IMMUTABLE STRICT;

SELECT plv8_test();
plv8_test
-----------
hoge
(1 row)

変数のスコープ回りを試してみる

CREATE OR REPLACE FUNCTION plv8_test()
RETURNS text AS $$
  var aa = "first";
  sage();
  hoge();
  return aa;
  function hoge(){
    var aa = "hoge";
  }
  function sage(){
    var aa = "sage"
  }
$$ LANGUAGE plv8 IMMUTABLE STRICT;

SELECT plv8_test();
plv8_test
-----------
first
(1 row)


生成結果

\df plv8_test
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+-----------+------------------+----------------------------------+--------
public | plv8_test | text | | normal
public | plv8_test | text | keys text[], vals text[] | normal
public | plv8_test | integer | startval integer, endval integer | normal
(3 rows)

 
 
個人的には配列周りが描きやすくなるかもねって感想です

※参考サイト(ここのWiki)
https://code.google.com/p/plv8js/