jrec 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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;