jrec 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,38 @@
1
+ require "jrec/core_ext/kernel"
2
+ require 'pathname'
3
+
4
+ module Jrec
5
+
6
+ GEMFILE = "Gemfile"
7
+
8
+ module Paths
9
+
10
+ def self.included base
11
+ base.extend self
12
+ end
13
+
14
+ def root
15
+ @@root ||= find_root_with_flag(GEMFILE, Dir.pwd).to_s
16
+ end
17
+
18
+ private
19
+
20
+ # i steal this from rails
21
+ def find_root_with_flag(flag, default=nil)
22
+ root_path = self.called_from[0]
23
+
24
+ while root_path && ::File.directory?(root_path) && !::File.exist?("#{root_path}/#{flag}")
25
+ parent = ::File.dirname(root_path)
26
+ root_path = parent != root_path && parent
27
+ end
28
+
29
+ root = ::File.exist?("#{root_path}/#{flag}") ? root_path : default
30
+ raise "Could not find root path for #{self}" unless root
31
+
32
+ RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ ?
33
+ Pathname.new(root).expand_path : Pathname.new(root).realpath
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -0,0 +1,79 @@
1
+ require 'oj'
2
+ require 'uri'
3
+ require 'yaml'
4
+ require 'pg/em'
5
+ require 'pg/em/connection_pool'
6
+ require 'jrec/core_ext/hash'
7
+ require 'jrec/core_ext/string'
8
+
9
+
10
+ module Jrec
11
+ module PG
12
+
13
+ Oj.default_options = { time_format: :ruby, mode: :compat }
14
+
15
+
16
+ def exec_func func_name, *params
17
+ sql = "SELECT jrec_#{func_name}(#{ (params.length-1).times.inject("$1"){ |m,i| "#{m},$#{ i + 2 }"} })"
18
+ exec_params sql, params
19
+ end
20
+
21
+ def exec_params sql, params = []
22
+ result = pg.exec_params(sql, params)
23
+ json = result.values.flatten.first
24
+ result.clear
25
+ json
26
+ end
27
+
28
+ ##
29
+ # :singleton method
30
+ # holds db connection
31
+
32
+ def pg
33
+ @@connection_pool ||= ::PG::EM::ConnectionPool.new(config)
34
+ end
35
+
36
+
37
+ ##
38
+ # :singleton method
39
+ # parses database url
40
+
41
+ def config
42
+ @@config ||= begin
43
+
44
+ if File.exists?(config_file)
45
+ db = YAML.load(config_file)[env]
46
+ elsif ENV['DATABASE_URL']
47
+ db = URI.parse(ENV['DATABASE_URL'])
48
+ else
49
+ raise "Database configuration not found"
50
+ end
51
+
52
+ config = {
53
+ dbname: db.path[1..-1],
54
+ host: db.host,
55
+ port: db.port,
56
+ size: ENV['DB_POOL_SIZE'] || 5,
57
+ async_autoreconnect: ENV['DB_ASYNC_AUTO_RECONNECT'] || true,
58
+ connect_timeout: ENV['DB_CONN_TIMEOUT'] || 60,
59
+ query_timeout: ENV['DB_QUERY_TIMEOUT'] || 30,
60
+ on_autoreconnect: proc { |pg| pg.exec "SELECT plv8_startup();" rescue nil },
61
+ on_connect: proc { |pg| pg.exec "SELECT plv8_startup();" rescue nil }
62
+ }
63
+ config[:user] = db.user if db.user
64
+ config[:password] = db.password if db.password
65
+ config
66
+ end
67
+ end
68
+
69
+ def config_file
70
+ ENV['DATABASE_CONFIG_FILE'] || "#{Jrec.root}/config/database.yml"
71
+ end
72
+
73
+ def env
74
+ ENV['RACK_ENV'] || "development"
75
+ end
76
+
77
+ end
78
+
79
+ end
@@ -0,0 +1,727 @@
1
+ -- Extensions
2
+
3
+ CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
4
+ CREATE EXTENSION IF NOT EXISTS "plv8";
5
+
6
+ -- PLV8 Functions
7
+ CREATE OR REPLACE FUNCTION plv8_startup() RETURNS void AS $$
8
+
9
+ (function(){
10
+
11
+ (function(){var root=this;var previousUnderscore=root._;var ArrayProto=Array.prototype,ObjProto=Object.prototype,FuncProto=Function.prototype;var push=ArrayProto.push,slice=ArrayProto.slice,concat=ArrayProto.concat,toString=ObjProto.toString,hasOwnProperty=ObjProto.hasOwnProperty;var nativeIsArray=Array.isArray,nativeKeys=Object.keys,nativeBind=FuncProto.bind;var _=function(obj){if(obj instanceof _)return obj;if(!(this instanceof _))return new _(obj);this._wrapped=obj};if(typeof exports!=='undefined'){if(typeof module!=='undefined'&&module.exports){exports=module.exports=_}exports._=_}else{root._=_}_.VERSION='1.7.0';var createCallback=function(func,context,argCount){if(context===void 0)return func;switch(argCount==null?3:argCount){case 1:return function(value){return func.call(context,value)};case 2:return function(value,other){return func.call(context,value,other)};case 3:return function(value,index,collection){return func.call(context,value,index,collection)};case 4:return function(accumulator,value,index,collection){return func.call(context,accumulator,value,index,collection)}}return function(){return func.apply(context,arguments)}};_.iteratee=function(value,context,argCount){if(value==null)return _.identity;if(_.isFunction(value))return createCallback(value,context,argCount);if(_.isObject(value))return _.matches(value);return _.property(value)};_.each=_.forEach=function(obj,iteratee,context){if(obj==null)return obj;iteratee=createCallback(iteratee,context);var i,length=obj.length;if(length===+length){for(i=0;i<length;i++){iteratee(obj[i],i,obj)}}else{var keys=_.keys(obj);for(i=0,length=keys.length;i<length;i++){iteratee(obj[keys[i]],keys[i],obj)}}return obj};_.map=_.collect=function(obj,iteratee,context){if(obj==null)return[];iteratee=_.iteratee(iteratee,context);var keys=obj.length!==+obj.length&&_.keys(obj),length=(keys||obj).length,results=Array(length),currentKey;for(var index=0;index<length;index++){currentKey=keys?keys[index]:index;results[index]=iteratee(obj[currentKey],currentKey,obj)}return results};var reduceError='Reduce of empty array with no initial value';_.reduce=_.foldl=_.inject=function(obj,iteratee,memo,context){if(obj==null)obj=[];iteratee=createCallback(iteratee,context,4);var keys=obj.length!==+obj.length&&_.keys(obj),length=(keys||obj).length,index=0,currentKey;if(arguments.length<3){if(!length)throw new TypeError(reduceError);memo=obj[keys?keys[index++]:index++]}for(;index<length;index++){currentKey=keys?keys[index]:index;memo=iteratee(memo,obj[currentKey],currentKey,obj)}return memo};_.reduceRight=_.foldr=function(obj,iteratee,memo,context){if(obj==null)obj=[];iteratee=createCallback(iteratee,context,4);var keys=obj.length!==+obj.length&&_.keys(obj),index=(keys||obj).length,currentKey;if(arguments.length<3){if(!index)throw new TypeError(reduceError);memo=obj[keys?keys[--index]:--index]}while(index--){currentKey=keys?keys[index]:index;memo=iteratee(memo,obj[currentKey],currentKey,obj)}return memo};_.find=_.detect=function(obj,predicate,context){var result;predicate=_.iteratee(predicate,context);_.some(obj,function(value,index,list){if(predicate(value,index,list)){result=value;return true}});return result};_.filter=_.select=function(obj,predicate,context){var results=[];if(obj==null)return results;predicate=_.iteratee(predicate,context);_.each(obj,function(value,index,list){if(predicate(value,index,list))results.push(value)});return results};_.reject=function(obj,predicate,context){return _.filter(obj,_.negate(_.iteratee(predicate)),context)};_.every=_.all=function(obj,predicate,context){if(obj==null)return true;predicate=_.iteratee(predicate,context);var keys=obj.length!==+obj.length&&_.keys(obj),length=(keys||obj).length,index,currentKey;for(index=0;index<length;index++){currentKey=keys?keys[index]:index;if(!predicate(obj[currentKey],currentKey,obj))return false}return true};_.some=_.any=function(obj,predicate,context){if(obj==null)return false;predicate=_.iteratee(predicate,context);var keys=obj.length!==+obj.length&&_.keys(obj),length=(keys||obj).length,index,currentKey;for(index=0;index<length;index++){currentKey=keys?keys[index]:index;if(predicate(obj[currentKey],currentKey,obj))return true}return false};_.contains=_.include=function(obj,target){if(obj==null)return false;if(obj.length!==+obj.length)obj=_.values(obj);return _.indexOf(obj,target)>=0};_.invoke=function(obj,method){var args=slice.call(arguments,2);var isFunc=_.isFunction(method);return _.map(obj,function(value){return(isFunc?method:value[method]).apply(value,args)})};_.pluck=function(obj,key){return _.map(obj,_.property(key))};_.where=function(obj,attrs){return _.filter(obj,_.matches(attrs))};_.findWhere=function(obj,attrs){return _.find(obj,_.matches(attrs))};_.max=function(obj,iteratee,context){var result=-Infinity,lastComputed=-Infinity,value,computed;if(iteratee==null&&obj!=null){obj=obj.length===+obj.length?obj:_.values(obj);for(var i=0,length=obj.length;i<length;i++){value=obj[i];if(value>result){result=value}}}else{iteratee=_.iteratee(iteratee,context);_.each(obj,function(value,index,list){computed=iteratee(value,index,list);if(computed>lastComputed||computed===-Infinity&&result===-Infinity){result=value;lastComputed=computed}})}return result};_.min=function(obj,iteratee,context){var result=Infinity,lastComputed=Infinity,value,computed;if(iteratee==null&&obj!=null){obj=obj.length===+obj.length?obj:_.values(obj);for(var i=0,length=obj.length;i<length;i++){value=obj[i];if(value<result){result=value}}}else{iteratee=_.iteratee(iteratee,context);_.each(obj,function(value,index,list){computed=iteratee(value,index,list);if(computed<lastComputed||computed===Infinity&&result===Infinity){result=value;lastComputed=computed}})}return result};_.shuffle=function(obj){var set=obj&&obj.length===+obj.length?obj:_.values(obj);var length=set.length;var shuffled=Array(length);for(var index=0,rand;index<length;index++){rand=_.random(0,index);if(rand!==index)shuffled[index]=shuffled[rand];shuffled[rand]=set[index]}return shuffled};_.sample=function(obj,n,guard){if(n==null||guard){if(obj.length!==+obj.length)obj=_.values(obj);return obj[_.random(obj.length-1)]}return _.shuffle(obj).slice(0,Math.max(0,n))};_.sortBy=function(obj,iteratee,context){iteratee=_.iteratee(iteratee,context);return _.pluck(_.map(obj,function(value,index,list){return{value:value,index:index,criteria:iteratee(value,index,list)}}).sort(function(left,right){var a=left.criteria;var b=right.criteria;if(a!==b){if(a>b||a===void 0)return 1;if(a<b||b===void 0)return-1}return left.index-right.index}),'value')};var group=function(behavior){return function(obj,iteratee,context){var result={};iteratee=_.iteratee(iteratee,context);_.each(obj,function(value,index){var key=iteratee(value,index,obj);behavior(result,value,key)});return result}};_.groupBy=group(function(result,value,key){if(_.has(result,key))result[key].push(value);else result[key]=[value]});_.indexBy=group(function(result,value,key){result[key]=value});_.countBy=group(function(result,value,key){if(_.has(result,key))result[key]++;else result[key]=1});_.sortedIndex=function(array,obj,iteratee,context){iteratee=_.iteratee(iteratee,context,1);var value=iteratee(obj);var low=0,high=array.length;while(low<high){var mid=low+high>>>1;if(iteratee(array[mid])<value)low=mid+1;else high=mid}return low};_.toArray=function(obj){if(!obj)return[];if(_.isArray(obj))return slice.call(obj);if(obj.length===+obj.length)return _.map(obj,_.identity);return _.values(obj)};_.size=function(obj){if(obj==null)return 0;return obj.length===+obj.length?obj.length:_.keys(obj).length};_.partition=function(obj,predicate,context){predicate=_.iteratee(predicate,context);var pass=[],fail=[];_.each(obj,function(value,key,obj){(predicate(value,key,obj)?pass:fail).push(value)});return[pass,fail]};_.first=_.head=_.take=function(array,n,guard){if(array==null)return void 0;if(n==null||guard)return array[0];return _.initial(array,array.length-n)};_.initial=function(array,n,guard){return slice.call(array,0,Math.max(0,array.length-(n==null||guard?1:n)))};_.last=function(array,n,guard){if(array==null)return void 0;if(n==null||guard)return array[array.length-1];return _.rest(array,Math.max(0,array.length-n))};_.rest=_.tail=_.drop=function(array,n,guard){return slice.call(array,n==null||guard?1:n)};_.compact=function(array){return _.filter(array,_.identity)};var flatten=function(input,shallow,strict,output){if(shallow&&_.every(input,_.isArray)){return concat.apply(output,input)}for(var i=0,length=input.length;i<length;i++){var value=input[i];if(!_.isArray(value)&&!_.isArguments(value)){if(!strict)output.push(value)}else if(shallow){push.apply(output,value)}else{flatten(value,shallow,strict,output)}}return output};_.flatten=function(array,shallow){return flatten(array,shallow,false,[])};_.without=function(array){return _.difference(array,slice.call(arguments,1))};_.uniq=_.unique=function(array,isSorted,iteratee,context){if(array==null)return[];if(!_.isBoolean(isSorted)){context=iteratee;iteratee=isSorted;isSorted=false}if(iteratee!=null)iteratee=_.iteratee(iteratee,context);var result=[];var seen=[];for(var i=0,length=array.length;i<length;i++){var value=array[i];if(isSorted){if(!i||seen!==value)result.push(value);seen=value}else if(iteratee){var computed=iteratee(value,i,array);if(_.indexOf(seen,computed)<0){seen.push(computed);result.push(value)}}else if(_.indexOf(result,value)<0){result.push(value)}}return result};_.union=function(){return _.uniq(flatten(arguments,true,true,[]))};_.intersection=function(array){if(array==null)return[];var result=[];var argsLength=arguments.length;for(var i=0,length=array.length;i<length;i++){var item=array[i];if(_.contains(result,item))continue;for(var j=1;j<argsLength;j++){if(!_.contains(arguments[j],item))break}if(j===argsLength)result.push(item)}return result};_.difference=function(array){var rest=flatten(slice.call(arguments,1),true,true,[]);return _.filter(array,function(value){return!_.contains(rest,value)})};_.zip=function(array){if(array==null)return[];var length=_.max(arguments,'length').length;var results=Array(length);while(length-->0){results[length]=_.pluck(arguments,length)}return results};_.unzip=function(array){return _.zip.apply(null,array)};_.object=function(list,values){if(list==null)return{};var result={};for(var i=0,length=list.length;i<length;i++){if(values){result[list[i]]=values[i]}else{result[list[i][0]]=list[i][1]}}return result};_.indexOf=function(array,item,isSorted){if(array==null)return-1;var i=0,length=array.length;if(isSorted){if(typeof isSorted=='number'){i=isSorted<0?Math.max(0,length+isSorted):isSorted}else{i=_.sortedIndex(array,item);return array[i]===item?i:-1}}for(;i<length;i++)if(array[i]===item)return i;return-1};_.lastIndexOf=function(array,item,from){if(array==null)return-1;var idx=array.length;if(typeof from=='number'){idx=from<0?idx+from+1:Math.min(idx,from+1)}while(--idx>=0)if(array[idx]===item)return idx;return-1};_.range=function(start,stop,step){if(arguments.length<=1){stop=start||0;start=0}step=step||1;var length=Math.max(Math.ceil((stop-start)/step),0);var range=Array(length);for(var idx=0;idx<length;idx++,start+=step){range[idx]=start}return range};var Ctor=function(){};_.bind=function(func,context){var args,bound;if(nativeBind&&func.bind===nativeBind)return nativeBind.apply(func,slice.call(arguments,1));if(!_.isFunction(func))throw new TypeError('Bind must be called on a function');args=slice.call(arguments,2);bound=function(){if(!(this instanceof bound))return func.apply(context,args.concat(slice.call(arguments)));Ctor.prototype=func.prototype;var self=new Ctor;Ctor.prototype=null;var result=func.apply(self,args.concat(slice.call(arguments)));if(_.isObject(result))return result;return self};return bound};_.partial=function(func){var boundArgs=slice.call(arguments,1);return function(){var position=0;var args=boundArgs.slice();for(var i=0,length=args.length;i<length;i++){if(args[i]===_)args[i]=arguments[position++]}while(position<arguments.length)args.push(arguments[position++]);return func.apply(this,args)}};_.bindAll=function(obj){var i,length=arguments.length,key;if(length<=1)throw new Error('bindAll must be passed function names');for(i=1;i<length;i++){key=arguments[i];obj[key]=_.bind(obj[key],obj)}return obj};_.memoize=function(func,hasher){var memoize=function(key){var cache=memoize.cache;var address=''+(hasher?hasher.apply(this,arguments):key);if(!_.has(cache,address))cache[address]=func.apply(this,arguments);return cache[address]};memoize.cache={};return memoize};_.delay=function(func,wait){var args=slice.call(arguments,2);return setTimeout(function(){return func.apply(null,args)},wait)};_.defer=function(func){return _.delay.apply(_,[func,1].concat(slice.call(arguments,1)))};_.throttle=function(func,wait,options){var context,args,result;var timeout=null;var previous=0;if(!options)options={};var later=function(){previous=options.leading===false?0:_.now();timeout=null;result=func.apply(context,args);if(!timeout)context=args=null};return function(){var now=_.now();if(!previous&&options.leading===false)previous=now;var remaining=wait-(now-previous);context=this;args=arguments;if(remaining<=0||remaining>wait){if(timeout){clearTimeout(timeout);timeout=null}previous=now;result=func.apply(context,args);if(!timeout)context=args=null}else if(!timeout&&options.trailing!==false){timeout=setTimeout(later,remaining)}return result}};_.debounce=function(func,wait,immediate){var timeout,args,context,timestamp,result;var later=function(){var last=_.now()-timestamp;if(last<wait&&last>=0){timeout=setTimeout(later,wait-last)}else{timeout=null;if(!immediate){result=func.apply(context,args);if(!timeout)context=args=null}}};return function(){context=this;args=arguments;timestamp=_.now();var callNow=immediate&&!timeout;if(!timeout)timeout=setTimeout(later,wait);if(callNow){result=func.apply(context,args);context=args=null}return result}};_.wrap=function(func,wrapper){return _.partial(wrapper,func)};_.negate=function(predicate){return function(){return!predicate.apply(this,arguments)}};_.compose=function(){var args=arguments;var start=args.length-1;return function(){var i=start;var result=args[start].apply(this,arguments);while(i--)result=args[i].call(this,result);return result}};_.after=function(times,func){return function(){if(--times<1){return func.apply(this,arguments)}}};_.before=function(times,func){var memo;return function(){if(--times>0){memo=func.apply(this,arguments)}else{func=null}return memo}};_.once=_.partial(_.before,2);var hasEnumBug=!({toString:null}).propertyIsEnumerable('toString');var nonEnumerableProps=['constructor','valueOf','isPrototypeOf','toString','propertyIsEnumerable','hasOwnProperty','toLocaleString'];_.keys=function(obj){if(!_.isObject(obj))return[];if(nativeKeys)return nativeKeys(obj);var keys=[];for(var key in obj)if(_.has(obj,key))keys.push(key);if(hasEnumBug){var nonEnumIdx=nonEnumerableProps.length;while(nonEnumIdx--){var prop=nonEnumerableProps[nonEnumIdx];if(_.has(obj,prop)&&!_.contains(keys,prop))keys.push(prop)}}return keys};_.values=function(obj){var keys=_.keys(obj);var length=keys.length;var values=Array(length);for(var i=0;i<length;i++){values[i]=obj[keys[i]]}return values};_.pairs=function(obj){var keys=_.keys(obj);var length=keys.length;var pairs=Array(length);for(var i=0;i<length;i++){pairs[i]=[keys[i],obj[keys[i]]]}return pairs};_.invert=function(obj){var result={};var keys=_.keys(obj);for(var i=0,length=keys.length;i<length;i++){result[obj[keys[i]]]=keys[i]}return result};_.functions=_.methods=function(obj){var names=[];for(var key in obj){if(_.isFunction(obj[key]))names.push(key)}return names.sort()};_.extend=function(obj){if(!_.isObject(obj))return obj;var source,prop;for(var i=1,length=arguments.length;i<length;i++){source=arguments[i];for(prop in source){obj[prop]=source[prop]}}return obj};_.pick=function(obj,iteratee,context){var result={},key;if(obj==null)return result;if(_.isFunction(iteratee)){iteratee=createCallback(iteratee,context);for(key in obj){var value=obj[key];if(iteratee(value,key,obj))result[key]=value}}else{var keys=concat.apply([],slice.call(arguments,1));obj=new Object(obj);for(var i=0,length=keys.length;i<length;i++){key=keys[i];if(key in obj)result[key]=obj[key]}}return result};_.omit=function(obj,iteratee,context){if(_.isFunction(iteratee)){iteratee=_.negate(iteratee)}else{var keys=_.map(concat.apply([],slice.call(arguments,1)),String);iteratee=function(value,key){return!_.contains(keys,key)}}return _.pick(obj,iteratee,context)};_.defaults=function(obj){if(!_.isObject(obj))return obj;for(var i=1,length=arguments.length;i<length;i++){var source=arguments[i];for(var prop in source){if(obj[prop]===void 0)obj[prop]=source[prop]}}return obj};_.clone=function(obj){if(!_.isObject(obj))return obj;return _.isArray(obj)?obj.slice():_.extend({},obj)};_.tap=function(obj,interceptor){interceptor(obj);return obj};var eq=function(a,b,aStack,bStack){if(a===b)return a!==0||1/a===1/b;if(a==null||b==null)return a===b;if(a instanceof _)a=a._wrapped;if(b instanceof _)b=b._wrapped;var className=toString.call(a);if(className!==toString.call(b))return false;switch(className){case'[object RegExp]':case'[object String]':return''+a===''+b;case'[object Number]':if(+a!==+a)return+b!==+b;return+a===0?1/+a===1/b:+a===+b;case'[object Date]':case'[object Boolean]':return+a===+b}var areArrays=className==='[object Array]';if(!areArrays){if(typeof a!='object'||typeof b!='object')return false;var aCtor=a.constructor,bCtor=b.constructor;if(aCtor!==bCtor&&!(_.isFunction(aCtor)&&aCtor instanceof aCtor&&_.isFunction(bCtor)&&bCtor instanceof bCtor)&&('constructor'in a&&'constructor'in b)){return false}}var length=aStack.length;while(length--){if(aStack[length]===a)return bStack[length]===b}aStack.push(a);bStack.push(b);var size,result;if(areArrays){size=a.length;result=size===b.length;if(result){while(size--){if(!(result=eq(a[size],b[size],aStack,bStack)))break}}}else{var keys=_.keys(a),key;size=keys.length;result=_.keys(b).length===size;if(result){while(size--){key=keys[size];if(!(result=_.has(b,key)&&eq(a[key],b[key],aStack,bStack)))break}}}aStack.pop();bStack.pop();return result};_.isEqual=function(a,b){return eq(a,b,[],[])};_.isEmpty=function(obj){if(obj==null)return true;if(_.isArray(obj)||_.isString(obj)||_.isArguments(obj))return obj.length===0;for(var key in obj)if(_.has(obj,key))return false;return true};_.isElement=function(obj){return!!(obj&&obj.nodeType===1)};_.isArray=nativeIsArray||function(obj){return toString.call(obj)==='[object Array]'};_.isObject=function(obj){var type=typeof obj;return type==='function'||type==='object'&&!!obj};_.each(['Arguments','Function','String','Number','Date','RegExp','Error'],function(name){_['is'+name]=function(obj){return toString.call(obj)==='[object '+name+']'}});if(!_.isArguments(arguments)){_.isArguments=function(obj){return _.has(obj,'callee')}}if(typeof/./!=='function'){_.isFunction=function(obj){return typeof obj=='function'||false}}_.isFinite=function(obj){return isFinite(obj)&&!isNaN(parseFloat(obj))};_.isNaN=function(obj){return _.isNumber(obj)&&obj!==+obj};_.isBoolean=function(obj){return obj===true||obj===false||toString.call(obj)==='[object Boolean]'};_.isNull=function(obj){return obj===null};_.isUndefined=function(obj){return obj===void 0};_.has=function(obj,key){return obj!=null&&hasOwnProperty.call(obj,key)};_.noConflict=function(){root._=previousUnderscore;return this};_.identity=function(value){return value};_.constant=function(value){return function(){return value}};_.noop=function(){};_.property=function(key){return function(obj){return obj==null?void 0:obj[key]}};_.matches=function(attrs){var pairs=_.pairs(attrs),length=pairs.length;return function(obj){if(obj==null)return!length;obj=new Object(obj);for(var i=0;i<length;i++){var pair=pairs[i],key=pair[0];if(pair[1]!==obj[key]||!(key in obj))return false}return true}};_.times=function(n,iteratee,context){var accum=Array(Math.max(0,n));iteratee=createCallback(iteratee,context,1);for(var i=0;i<n;i++)accum[i]=iteratee(i);return accum};_.random=function(min,max){if(max==null){max=min;min=0}return min+Math.floor(Math.random()*(max-min+1))};_.now=Date.now||function(){return new Date().getTime()};var escapeMap={'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#x27;','`':'&#x60;'};var unescapeMap=_.invert(escapeMap);var createEscaper=function(map){var escaper=function(match){return map[match]};var source='(?:'+_.keys(map).join('|')+')';var testRegexp=RegExp(source);var replaceRegexp=RegExp(source,'g');return function(string){string=string==null?'':''+string;return testRegexp.test(string)?string.replace(replaceRegexp,escaper):string}};_.escape=createEscaper(escapeMap);_.unescape=createEscaper(unescapeMap);_.result=function(object,property,fallback){var value=object==null?void 0:object[property];if(value===void 0){return fallback}return _.isFunction(value)?object[property]():value};var idCounter=0;_.uniqueId=function(prefix){var id=++idCounter+'';return prefix?prefix+id:id};_.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var noMatch=/(.)^/;var escapes={"'":"'",'\\':'\\','\r':'r','\n':'n','\u2028':'u2028','\u2029':'u2029'};var escaper=/\\|'|\r|\n|\u2028|\u2029/g;var escapeChar=function(match){return'\\'+escapes[match]};_.template=function(text,settings,oldSettings){if(!settings&&oldSettings)settings=oldSettings;settings=_.defaults({},settings,_.templateSettings);var matcher=RegExp([(settings.escape||noMatch).source,(settings.interpolate||noMatch).source,(settings.evaluate||noMatch).source].join('|')+'|$','g');var index=0;var source="__p+='";text.replace(matcher,function(match,escape,interpolate,evaluate,offset){source+=text.slice(index,offset).replace(escaper,escapeChar);index=offset+match.length;if(escape){source+="'+\n((__t=("+escape+"))==null?'':_.escape(__t))+\n'"}else if(interpolate){source+="'+\n((__t=("+interpolate+"))==null?'':__t)+\n'"}else if(evaluate){source+="';\n"+evaluate+"\n__p+='"}return match});source+="';\n";if(!settings.variable)source='with(obj||{}){\n'+source+'}\n';source="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+source+'return __p;\n';try{var render=new Function(settings.variable||'obj','_',source)}catch(e){e.source=source;throw e}var template=function(data){return render.call(this,data,_)};var argument=settings.variable||'obj';template.source='function('+argument+'){\n'+source+'}';return template};_.chain=function(obj){var instance=_(obj);instance._chain=true;return instance};var result=function(instance,obj){return instance._chain?_(obj).chain():obj};_.mixin=function(obj){_.each(_.functions(obj),function(name){var func=_[name]=obj[name];_.prototype[name]=function(){var args=[this._wrapped];push.apply(args,arguments);return result(this,func.apply(_,args))}})};_.mixin(_);_.each(['pop','push','reverse','shift','sort','splice','unshift'],function(name){var method=ArrayProto[name];_.prototype[name]=function(){var obj=this._wrapped;method.apply(obj,arguments);if((name==='shift'||name==='splice')&&obj.length===0)delete obj[0];return result(this,obj)}});_.each(['concat','join','slice'],function(name){var method=ArrayProto[name];_.prototype[name]=function(){return result(this,method.apply(this._wrapped,arguments))}});_.prototype.value=function(){return this._wrapped};if(typeof define==='function'&&define.amd){define('underscore',[],function(){return _})}}.call(this));
12
+
13
+ (function(){
14
+ var
15
+ root=this,
16
+ Jrec = (function() {
17
+ function Jrec() {}
18
+
19
+ var Builder = (function() {
20
+ function Builder(schema_name, table_name, search_path, query) {
21
+ var _base;
22
+ this.schema_name = schema_name;
23
+ this.table_name = table_name;
24
+ this.search_path = search_path;
25
+ this.query = query;
26
+ if ((_base = this.query).select == null) {
27
+ _base.select = "*";
28
+ }
29
+ this.params = [];
30
+ this.i = 0;
31
+ }
32
+
33
+ Builder.prototype.qm = function() {
34
+ return "$" + (this.i += 1);
35
+ };
36
+
37
+ Builder.prototype.make_distinct = function() {
38
+ return _.map(this.query.distinct.split(","), function(f) {
39
+ return "data->>'" + f + "' AS " + f;
40
+ }).join(", ");
41
+ };
42
+
43
+ Builder.prototype.make_select = function() {
44
+ if (this.query.select === "*") {
45
+ return "data";
46
+ } else if (_.isArray(this.query.select)) {
47
+ this.params.push(this.query.select.join(","));
48
+ return "jrec_select(data, " + (this.qm()) + ") as data";
49
+ } else {
50
+ return this.query.select;
51
+ }
52
+ };
53
+
54
+ Builder.prototype.make_where = function(q, join_by) {
55
+ var comparisons, k, sql, subquery, symbol, value, _i, _len;
56
+ if (join_by == null) {
57
+ join_by = 'AND';
58
+ }
59
+ sql = [];
60
+ for (k in q) {
61
+ subquery = q[k];
62
+ switch (k) {
63
+ case 'and':
64
+ case 'AND':
65
+ case '&':
66
+ case '&&':
67
+ sql.push("(" + (this.make_where(subquery, 'AND')) + ")");
68
+ break;
69
+ case 'or':
70
+ case 'OR':
71
+ case '|':
72
+ case '||':
73
+ sql.push("(" + (this.make_where(subquery, 'OR')) + ")");
74
+ break;
75
+ case 'not':
76
+ case 'NOT':
77
+ case '!':
78
+ sql.push("NOT (" + (this.make_where(subquery, 'AND')) + ")");
79
+ break;
80
+ case 'raw':
81
+ sql.push(subquery);
82
+ break;
83
+ default:
84
+ if (_.isArray(subquery)) {
85
+ this.params.push(k);
86
+ this.params.push(subquery[1]);
87
+ sql.push("" + (this.plv8_key(subquery[1])) + " " + subquery[0] + " " + (this.plv8_qm(subquery[1])));
88
+ } else if (_.isObject(subquery)) {
89
+ comparisons = [];
90
+ for (value = _i = 0, _len = subquery.length; _i < _len; value = ++_i) {
91
+ symbol = subquery[value];
92
+ comparisons.push("" + symbol + " " + (this.plv8_qm(value)));
93
+ this.params.push(k);
94
+ this.params.push(value);
95
+ }
96
+ sql.push(_.map(comparisons, function(comparison) {
97
+ return "" + (this.plv8_key(value)) + " " + comparison;
98
+ }).join(" AND "));
99
+ } else {
100
+ this.params.push(k);
101
+ this.params.push(subquery);
102
+ sql.push("" + (this.plv8_key(subquery)) + " = " + (this.plv8_qm(subquery)));
103
+ }
104
+ }
105
+ }
106
+ return sql.join("\n" + join_by + " ");
107
+ };
108
+
109
+ Builder.prototype.make_order_by = function() {
110
+ var k, ord, str, v, _i, _len;
111
+ str = [];
112
+ ord = this.query.order_by;
113
+ if (_.isArray(ord)) {
114
+ this.params.push(ord[0]);
115
+ str.push("" + (this.plv8_key(ord[1])) + " " + (ord[1].toUpperCase()));
116
+ } else if (_.isObject(ord)) {
117
+ for (v = _i = 0, _len = ord.length; _i < _len; v = ++_i) {
118
+ k = ord[v];
119
+ this.params.push(v);
120
+ str.push("" + (this.plv8_key(k)) + " " + (k.toUpperCase()));
121
+ }
122
+ } else if (ord != null) {
123
+ str.push(ord);
124
+ }
125
+ return str.join(",");
126
+ };
127
+
128
+ Builder.prototype.make_group_by = function() {
129
+ var k, ord, str, v, _i, _len;
130
+ str = [];
131
+ ord = this.query.group_by;
132
+ if (this.query.distinct) {
133
+ str.push(_.map(this.query.distinct.split(","), function(f) {
134
+ return "data->>'" + f + "'";
135
+ }));
136
+ }
137
+ if (_.isArray(ord)) {
138
+ this.params.push(ord[0]);
139
+ str.push("" + (this.plv8_key(ord[1])) + " " + (ord[1].toUpperCase()));
140
+ } else if (_.isObject(ord)) {
141
+ for (v = _i = 0, _len = ord.length; _i < _len; v = ++_i) {
142
+ k = ord[v];
143
+ this.params.push(v);
144
+ str.push("" + (this.plv8_key(k)) + " " + (k.toUpperCase()));
145
+ }
146
+ } else if (ord != null) {
147
+ str.push(ord);
148
+ }
149
+ return _.flatten(str).join(",");
150
+ };
151
+
152
+ Builder.prototype.make_limit = function() {
153
+ this.params.push(this.query.limit);
154
+ return this.qm();
155
+ };
156
+
157
+ Builder.prototype.make_offset = function() {
158
+ this.params.push(this.query.offset);
159
+ return this.qm();
160
+ };
161
+
162
+ Builder.prototype.build_select = function() {
163
+ var sql;
164
+ sql = [];
165
+ sql.push("SET search_path TO " + this.search_path + ";");
166
+ sql.push("SELECT");
167
+ if (this.query.distinct != null) {
168
+ sql.push("DISTINCT " + (this.make_distinct()) + ",");
169
+ }
170
+ sql.push("" + (this.make_select()) + " FROM " + this.schema_name + "." + this.table_name);
171
+ if (!_.isEmpty(this.query.where)) {
172
+ sql.push("WHERE " + (this.make_where(this.query.where)));
173
+ }
174
+ if ((this.query.group_by != null) || (this.query.distinct != null)) {
175
+ sql.push("GROUP BY " + (this.make_group_by()));
176
+ }
177
+ if (this.query.order_by != null) {
178
+ sql.push("ORDER BY " + (this.make_order_by()));
179
+ }
180
+ if (this.query.limit != null) {
181
+ sql.push("LIMIT " + (this.make_limit()));
182
+ }
183
+ if (this.query.offset != null) {
184
+ sql.push("OFFSET " + (this.make_offset()));
185
+ }
186
+ return [sql.join("\n"), this.params];
187
+ };
188
+
189
+ Builder.prototype.build_delete = function() {
190
+ var sql;
191
+ sql = [];
192
+ sql.push("SET search_path TO " + this.search_path + ";");
193
+ sql.push("DELETE FROM " + this.schema_name + "." + this.table_name);
194
+ if (!_.isEmpty(this.query.where)) {
195
+ sql.push("WHERE " + (this.make_where(this.query.where)));
196
+ }
197
+ sql.push("RETURNING data::json;");
198
+ return [sql.join("\n"), this.params];
199
+ };
200
+
201
+ Builder.prototype.build_update = function(data, merge) {
202
+ var sql;
203
+ if (merge == null) {
204
+ merge = true;
205
+ }
206
+ this.params.push(data);
207
+ this.params.push(merge);
208
+ sql = [];
209
+ sql.push("SET search_path TO " + this.search_path + ";");
210
+ sql.push("UPDATE " + this.schema_name + "." + this.table_name + " SET data = jrec_patch(data," + (this.qm()) + "," + (this.qm()) + ")");
211
+ if (!_.isEmpty(this.query.where)) {
212
+ sql.push("WHERE " + (this.make_where(this.query.where)));
213
+ }
214
+ sql.push("RETURNING data::json;");
215
+ return [sql.join("\n"), this.params];
216
+ };
217
+
218
+ Builder.prototype.build_insert = function(data, merge) {
219
+ var sql;
220
+ if (merge == null) {
221
+ merge = true;
222
+ }
223
+ this.params.push(data);
224
+ this.params.push(merge);
225
+ sql = [];
226
+ sql.push("SET search_path TO " + this.search_path + ";");
227
+ sql.push("INSERT INTO " + this.schema_name + "." + this.table_name + " (data) VALUES (jrec_patch(jrec_defaults()," + (this.qm()) + "," + (this.qm()) + "))");
228
+ sql.push("RETURNING data::json;");
229
+ return [sql.join("\n"), this.params];
230
+ };
231
+
232
+ Builder.prototype.plv8_key = function(value) {
233
+ return "" + (this.typecast(value, true)) + "(data, " + (this.qm()) + "::text)";
234
+ };
235
+
236
+ Builder.prototype.plv8_qm = function(value) {
237
+ return "" + (this.qm()) + "::" + (this.typecast(value));
238
+ };
239
+
240
+ Builder.prototype.typecast = function(value, is_func) {
241
+ var type;
242
+ if (is_func == null) {
243
+ is_func = false;
244
+ }
245
+ type = is_func ? "jrec_" : "";
246
+ if (_.isBoolean(value)) {
247
+ type += "bool";
248
+ } else if (_.isDate(value)) {
249
+ type += "timestamp";
250
+ } else if (_.isNumber(value)) {
251
+ type += "integer";
252
+ } else if (_.isObject(value)) {
253
+ type += (is_func ? "text" : "json");
254
+ } else if (_.isArray(value)) {
255
+ type += (is_func ? "text" : "array");
256
+ } else {
257
+ type += (is_func ? "string" : "text");
258
+ }
259
+ return type;
260
+ };
261
+
262
+ return Builder;
263
+
264
+ })();
265
+
266
+ Jrec.prototype.json = function(_data, _key) {
267
+ var ret;
268
+ ret = valueAt(_data, _key);
269
+ if (ret == null) {
270
+ return null;
271
+ }
272
+ return JSON.stringify(ret);
273
+ };
274
+
275
+ Jrec.prototype.string = function(_data, _key) {
276
+ var ret;
277
+ ret = valueAt(_data, _key);
278
+ if (ret == null) {
279
+ return null;
280
+ }
281
+ return ret.toString();
282
+ };
283
+
284
+ Jrec.prototype.integer = function(_data, _key) {
285
+ var ret;
286
+ ret = valueAt(_data, _key);
287
+ if (ret == null) {
288
+ return null;
289
+ }
290
+ return parseInt(ret);
291
+ };
292
+
293
+ Jrec.prototype.integer_array = function(_data, _key) {
294
+ var ret;
295
+ ret = valueAt(_data, _key);
296
+ if (ret == null) {
297
+ return null;
298
+ }
299
+ return (ret instanceof Array ? ret : [ret]);
300
+ };
301
+
302
+ Jrec.prototype.float = function(_data, _key) {
303
+ var ret;
304
+ ret = valueAt(_data, _key);
305
+ if (ret == null) {
306
+ return null;
307
+ }
308
+ return parseFloat(ret);
309
+ };
310
+
311
+ Jrec.prototype.bool = function(_data, _key) {
312
+ var ret;
313
+ ret = valueAt(_data, _key);
314
+ if (ret == null) {
315
+ return null;
316
+ }
317
+ return !!ret;
318
+ };
319
+
320
+ Jrec.prototype.timestamp = function(_data, _key) {
321
+ var ret;
322
+ ret = valueAt(_data, _key);
323
+ if (ret == null) {
324
+ return null;
325
+ }
326
+ return new Date(ret);
327
+ };
328
+
329
+ Jrec.prototype.patch = function(_data, _value, _sync) {
330
+ var changes, data, defaults, isObject, k, sync;
331
+ data = _data;
332
+ changes = _value;
333
+ isObject = false;
334
+ sync = _sync != null ? _sync : true;
335
+ defaults = _.pick(data, _.keys(JSON.parse(this.defaults())));
336
+ for (k in changes) {
337
+ if (data.hasOwnProperty(k)) {
338
+ isObject = typeof data[k] === "object" && typeof changes[k] === "object";
339
+ data[k] = isObject && sync ? _.extend(data[k], changes[k]) : changes[k];
340
+ } else {
341
+ data[k] = changes[k];
342
+ }
343
+ }
344
+ if (!sync) {
345
+ for (k in data) {
346
+ if (changes[k] == null) {
347
+ delete data[k];
348
+ }
349
+ }
350
+ }
351
+ _.extend(data, defaults);
352
+ return JSON.stringify(data);
353
+ };
354
+
355
+ Jrec.prototype.select = function(_data, _fields) {
356
+ var data, fields, ret;
357
+ data = _data;
358
+ fields = _fields;
359
+ ret = _.pick(data, fields.split(","));
360
+ return JSON.stringify(ret);
361
+ };
362
+
363
+ Jrec.prototype.push = function(_data, _key, _value) {
364
+ var data, field, i, keys, last_field, len, value;
365
+ data = _data;
366
+ value = _value;
367
+ keys = _key.split(".");
368
+ len = keys.length;
369
+ last_field = data;
370
+ field = data;
371
+ i = 0;
372
+ while (i < len) {
373
+ last_field = field;
374
+ if (field) {
375
+ field = field[keys[i]];
376
+ }
377
+ ++i;
378
+ }
379
+ if (field) {
380
+ field.push(value);
381
+ } else {
382
+ if (!(value instanceof Array)) {
383
+ value = [value];
384
+ }
385
+ last_field[keys.pop()] = value;
386
+ }
387
+ return JSON.stringify(data);
388
+ };
389
+
390
+ Jrec.prototype.uuid = function() {
391
+ var ary;
392
+ ary = plv8.execute('SELECT uuid_generate_v4() as uuid;');
393
+ return JSON.stringify(ary[0]);
394
+ };
395
+
396
+ Jrec.prototype.defaults = function() {
397
+ var timestamp, uuid;
398
+ uuid = JSON.parse(this.uuid());
399
+ timestamp = new Date();
400
+ return JSON.stringify({
401
+ uuid: uuid.uuid,
402
+ created_at: timestamp,
403
+ updated_at: timestamp
404
+ });
405
+ };
406
+
407
+ Jrec.prototype.create_table = function(schema_name, table_name) {
408
+ plv8.execute(" CREATE TABLE " + schema_name + "." + table_name + " (\n id serial NOT NULL,\n data json DEFAULT jrec_uuid() NOT NULL,\n CONSTRAINT " + schema_name + "_" + table_name + "_pkey PRIMARY KEY (id));\n\n CREATE UNIQUE INDEX indx_" + schema_name + "_" + table_name + "_unique_uuid ON " + schema_name + "." + table_name + " (jrec_string(data,'uuid'));");
409
+ return JSON.stringify(table_name);
410
+ };
411
+
412
+ Jrec.prototype.drop_table = function(schema_name, table_name) {
413
+ plv8.execute("DROP TABLE IF EXISTS " + schema_name + "." + table_name + " CASCADE;");
414
+ return JSON.stringify(table_name);
415
+ };
416
+
417
+ Jrec.prototype.create_index = function(schema_name, table_name, optns) {
418
+ var cols, index_name, meth, name, sql, type, _ref, _ref1;
419
+ index_name = "indx_" + schema_name + "_" + table_name;
420
+ _ref = optns.cols;
421
+ for (name in _ref) {
422
+ type = _ref[name];
423
+ index_name += "_" + name;
424
+ }
425
+ sql = ["CREATE"];
426
+ if (optns.unique) {
427
+ sql.push("UNIQUE");
428
+ }
429
+ sql.push("INDEX");
430
+ if (optns.concurrently) {
431
+ sql.push("CONCURRENTLY");
432
+ }
433
+ sql.push("" + index_name + " on " + schema_name + "." + table_name);
434
+ sql.push("(");
435
+ cols = [];
436
+ _ref1 = optns.cols;
437
+ for (name in _ref1) {
438
+ type = _ref1[name];
439
+ meth = "jrec_" + (type === 'text' ? 'string' : type);
440
+ cols.push("" + meth + "(data,'" + name + "'::" + type + ")");
441
+ }
442
+ sql.push(cols.join(","));
443
+ sql.push(")");
444
+ sql = sql.join(" ");
445
+ plv8.execute("DROP INDEX IF EXISTS " + index_name);
446
+ plv8.execute(sql);
447
+ return JSON.stringify(index_name);
448
+ };
449
+
450
+ Jrec.prototype.drop_index = function(schema_name, table_name, optns) {
451
+ var index_name, name, type, _ref;
452
+ index_name = "indx_" + schema_name + "_" + table_name;
453
+ _ref = optns.cols;
454
+ for (name in _ref) {
455
+ type = _ref[name];
456
+ index_name += "_" + name;
457
+ }
458
+ plv8.execute("DROP INDEX IF EXISTS " + index_name);
459
+ return JSON.stringify(index_name);
460
+ };
461
+
462
+ Jrec.prototype.create_trigger = function(schema_name, table_name) {
463
+ var sql, trigger_name;
464
+ trigger_name = schema_name + "_" + table_name + "_trigger";
465
+ sql = "CREATE TRIGGER " + trigger_name + " " +
466
+ "AFTER INSERT OR UPDATE OR DELETE ON " + schema_name + "." + table_name + " " +
467
+ "FOR EACH ROW EXECUTE PROCEDURE jrec_collection_trigger();";
468
+ plv8.execute(sql);
469
+ return JSON.stringify(trigger_name);
470
+ };
471
+
472
+ Jrec.prototype.query = function(_schema_name, _table_name, _query) {
473
+ var builder, params, result, rows, search_path, sql, _ref;
474
+ search_path = _schema_name === "public" ? _schema_name : "" + _schema_name + ", public";
475
+ builder = new Builder(_schema_name, _table_name, search_path, _query);
476
+ _ref = builder.build_select(), sql = _ref[0], params = _ref[1];
477
+ rows = plv8.execute(sql, params);
478
+ builder = null;
479
+ if (_query.select === "*" || _.isArray(_query.select)) {
480
+ result = _.pluck(rows, 'data');
481
+ } else {
482
+ result = rows;
483
+ }
484
+ return JSON.stringify(result);
485
+ };
486
+
487
+ Jrec.prototype.upsert = function(_schema_name, _table_name, _data) {
488
+ var builder, data, params, query, result, rows, search_path, sql, sync, _ref, _ref1;
489
+
490
+ data = _data;
491
+ search_path = _schema_name === "public" ? _schema_name : "" + _schema_name + ",public";
492
+ if (data.uuid != null) {
493
+ query = {
494
+ where: {
495
+ uuid: data.uuid
496
+ }
497
+ };
498
+ builder = new Builder(_schema_name, _table_name, search_path, query);
499
+ sync = _data.__sync || true;
500
+ delete _data.__sync;
501
+ _ref = builder.build_update(data, sync), sql = _ref[0], params = _ref[1];
502
+ } else {
503
+ builder = new Builder(_schema_name, _table_name, search_path, {});
504
+ _ref1 = builder.build_insert(data), sql = _ref1[0], params = _ref1[1];
505
+ }
506
+ rows = plv8.execute(sql, params);
507
+ result = _.pluck(rows, 'data');
508
+ if (result.length === 1) {
509
+ result = result[0];
510
+ }
511
+ builder = null;
512
+ return JSON.stringify(result);
513
+ };
514
+
515
+ Jrec.prototype.update = function(_schema_name, _table_name, _data, _cond) {
516
+ var builder, params, result, rows, search_path, sql, sync, _ref;
517
+
518
+ search_path = _schema_name === "public" ? _schema_name : "" + _schema_name + ",public";
519
+ builder = new Builder(_schema_name, _table_name, search_path, {
520
+ where: _cond
521
+ });
522
+ sync = _data.__sync || true;
523
+ delete _data.__sync;
524
+ _ref = builder.build_update(_data, sync), sql = _ref[0], params = _ref[1];
525
+ rows = plv8.execute(sql, params);
526
+ result = _.pluck(rows, 'data');
527
+ if (result.length === 1) {
528
+ result = result[0];
529
+ }
530
+ builder = null;
531
+ return JSON.stringify(result);
532
+ };
533
+
534
+ Jrec.prototype.delete = function(_schema_name, _table_name, _cond) {
535
+ var builder, params, plan, result, rows, search_path, sql, _ref;
536
+ search_path = _schema_name === "public" ? _schema_name : "" + _schema_name + ",public";
537
+ builder = new Builder(_schema_name, _table_name, search_path, {
538
+ where: _cond
539
+ });
540
+ _ref = builder.build_delete(), sql = _ref[0], params = _ref[1];
541
+ plan = plv8.prepare(sql);
542
+ rows = plan.execute(params);
543
+ result = _.pluck(rows, 'data');
544
+ if (result.length === 1) {
545
+ result = result[0];
546
+ }
547
+ builder = null;
548
+ return JSON.stringify(result);
549
+ };
550
+
551
+ Jrec.prototype.collection_trigger = function(TG_TABLE_NAME, TG_OP, NEW, OLD) {
552
+ var live_data;
553
+ live_data = JSON.stringify({
554
+ table_name: TG_TABLE_NAME,
555
+ op: TG_OP,
556
+ data: (NEW || OLD).data
557
+ });
558
+ plv8.execute("SELECT pg_notify('live', $1);", [live_data]);
559
+ }
560
+
561
+ var valueAt = function(data, key) {
562
+ var i, keys;
563
+ keys = key.split(".");
564
+ for (i in keys) {
565
+ if (data != null) {
566
+ data = data[keys[i]];
567
+ }
568
+ }
569
+ return data;
570
+ };
571
+
572
+ return Jrec;
573
+
574
+ })();
575
+
576
+ return root.Jrec = new Jrec();
577
+
578
+ }.call(this));
579
+
580
+ })();
581
+
582
+
583
+ $$ LANGUAGE plv8 STABLE STRICT;
584
+
585
+ SELECT plv8_startup();
586
+
587
+ CREATE or REPLACE FUNCTION jrec_json(_data json, _key text) RETURNS JSON AS $$
588
+ return Jrec.json(_data, _key);
589
+ $$ LANGUAGE plv8 IMMUTABLE STRICT;
590
+
591
+
592
+
593
+ CREATE or REPLACE FUNCTION jrec_string(_data json, _key text) RETURNS TEXT AS $$
594
+ return Jrec.string(_data, _key);
595
+ $$ LANGUAGE plv8 IMMUTABLE STRICT;
596
+
597
+
598
+
599
+ CREATE or REPLACE FUNCTION jrec_integer(_data json, _key text) RETURNS INT AS $$
600
+ return Jrec.integer(_data, _key);
601
+ $$ LANGUAGE plv8 IMMUTABLE STRICT;
602
+
603
+
604
+
605
+ CREATE or REPLACE FUNCTION jrec_integer_array(_data json, _key text) RETURNS INT[] AS $$
606
+ return Jrec.integer_array(_data, _key);
607
+ $$ LANGUAGE plv8 IMMUTABLE STRICT;
608
+
609
+
610
+
611
+ CREATE or REPLACE FUNCTION jrec_float(_data json, _key text) RETURNS DOUBLE PRECISION AS $$
612
+ return Jrec.float(_data, _key);
613
+ $$ LANGUAGE plv8 IMMUTABLE STRICT;
614
+
615
+
616
+
617
+ CREATE or REPLACE FUNCTION jrec_bool(_data json, _key text) RETURNS BOOLEAN AS $$
618
+ return Jrec.bool(_data, _key);
619
+ $$ LANGUAGE plv8 IMMUTABLE STRICT;
620
+
621
+
622
+
623
+ CREATE or REPLACE FUNCTION jrec_timestamp(_data json, _key text) RETURNS TIMESTAMP AS $$
624
+ return Jrec.timestamp(_data, _key);
625
+ $$ LANGUAGE plv8 IMMUTABLE STRICT;
626
+
627
+
628
+
629
+ CREATE or REPLACE FUNCTION jrec_select(_data json, _fields text) RETURNS JSON AS $$
630
+ return Jrec.select(_data, _fields);
631
+ $$ LANGUAGE plv8 STABLE STRICT;
632
+
633
+
634
+
635
+ CREATE or REPLACE FUNCTION jrec_patch(_data json, _value json, _sync boolean) RETURNS JSON AS $$
636
+ return Jrec.patch(_data, _value, _sync);
637
+ $$ LANGUAGE plv8 VOLATILE STRICT;
638
+
639
+
640
+
641
+ CREATE or REPLACE FUNCTION jrec_push(_data json, _key text, _value json) RETURNS JSON AS $$
642
+ return Jrec.push(_data, _key, _value);
643
+ $$ LANGUAGE plv8 VOLATILE STRICT;
644
+
645
+
646
+
647
+ CREATE or REPLACE FUNCTION jrec_uuid() RETURNS JSON AS $$
648
+ return Jrec.uuid();
649
+ $$ LANGUAGE plv8 VOLATILE STRICT;
650
+
651
+
652
+
653
+ CREATE or REPLACE FUNCTION jrec_defaults() RETURNS JSON AS $$
654
+ return Jrec.defaults();
655
+ $$ LANGUAGE plv8 VOLATILE STRICT;
656
+
657
+
658
+
659
+ CREATE or REPLACE FUNCTION jrec_create_table(schema_name text, table_name text) RETURNS void AS $$
660
+ Jrec.create_table(schema_name, table_name);
661
+ $$ LANGUAGE plv8 VOLATILE STRICT;
662
+
663
+ CREATE or REPLACE FUNCTION jrec_create_trigger(schema_name text, table_name text) RETURNS void AS $$
664
+ Jrec.create_trigger(schema_name, table_name);
665
+ $$ LANGUAGE plv8 VOLATILE STRICT;
666
+
667
+ CREATE or REPLACE FUNCTION jrec_drop_table(schema_name text, table_name text) RETURNS void AS $$
668
+ Jrec.drop_table(schema_name, table_name);
669
+ $$ LANGUAGE plv8 VOLATILE STRICT;
670
+
671
+
672
+
673
+ CREATE or REPLACE FUNCTION jrec_create_index(schema_name text, table_name text, optns json) RETURNS void AS $$
674
+ Jrec.create_index(schema_name, table_name, optns);
675
+ $$ LANGUAGE plv8 VOLATILE STRICT;
676
+
677
+
678
+
679
+ CREATE or REPLACE FUNCTION jrec_drop_index(schema_name text, table_name text, optns json) RETURNS void AS $$
680
+ Jrec.drop_index(schema_name, table_name, optns);
681
+ $$ LANGUAGE plv8 VOLATILE STRICT;
682
+
683
+
684
+
685
+ -- ##
686
+ -- # Select data
687
+ -- # SELECT query(_schema_name, _table_name, {where: {uuid: "12345"}});
688
+
689
+ CREATE or REPLACE FUNCTION jrec_query(_schema_name text, _table_name text, _query json) RETURNS json AS $$
690
+ return Jrec.query(_schema_name, _table_name, _query);
691
+ $$ LANGUAGE plv8 STABLE STRICT;
692
+
693
+
694
+
695
+ -- ##
696
+ -- # Insert ot update row through validation!
697
+ -- # SELECT upsert('User', '{"name":"foo"}');
698
+
699
+ CREATE or REPLACE FUNCTION jrec_upsert(_schema_name text, _table_name text, _data json) RETURNS json AS $$
700
+ return Jrec.upsert(_schema_name, _table_name, _data);
701
+ $$ LANGUAGE plv8 VOLATILE STRICT;
702
+
703
+
704
+
705
+ -- ##
706
+ -- # Delete single row by uuid
707
+ -- # SELECT remove('users',uuid-1234567);
708
+
709
+ CREATE or REPLACE FUNCTION jrec_update(_schema_name text, _table_name text, _data json, _cond json) RETURNS json AS $$
710
+ return Jrec.update(_schema_name, _table_name, _data, _cond);
711
+ $$ LANGUAGE plv8 VOLATILE STRICT;
712
+
713
+
714
+
715
+ -- ##
716
+ -- # Delete single row by uuid
717
+ -- # SELECT remove('users',uuid-1234567);
718
+
719
+ CREATE or REPLACE FUNCTION jrec_delete(_schema_name text, _table_name text, _cond json) RETURNS json AS $$
720
+ return Jrec.delete(_schema_name, _table_name, _cond);
721
+ $$ LANGUAGE plv8 VOLATILE STRICT;
722
+
723
+
724
+
725
+ CREATE or REPLACE FUNCTION jrec_collection_trigger() RETURNS trigger AS $$
726
+ Jrec.collection_trigger(TG_TABLE_NAME, TG_OP, NEW, OLD)
727
+ $$ LANGUAGE plv8 STABLE STRICT;