1 /* ---------------------------------------------------------------------------
2 * Copyright (C) 2008 Equinox Software, Inc
3 * Mike Rylander <miker@esilibrary.com>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * ---------------------------------------------------------------------------
17 if(!dojo._hasResource["openils.PermaCrud"]) {
19 dojo._hasResource["openils.PermaCrud"] = true;
20 dojo.provide("openils.PermaCrud");
21 dojo.require("openils.User");
23 dojo.declare('openils.PermaCrud', null, {
29 constructor : function ( kwargs ) {
30 kwargs = kwargs || {};
32 this.authtoken = kwargs.authtoken;
36 new OpenSRF.ClientSession('open-ils.pcrud');
40 this.session.state == OSRF_APP_SESSION_CONNECTED
41 ) this.connected = true;
44 auth : function (token) {
45 if (token) this.authtoken = token;
46 return this.authtoken || openils.User.authtoken;
49 connect : function ( onerror ) {
50 if (!this.connected && !this.session.connect()) {
51 this.connected = false;
52 if (onerror) onerror(this.session);
55 this.connected = true;
59 disconnect : function ( onerror ) {
60 if (!this.session.disconnect()) {
61 if (onerror) onerror(this.session);
68 retrieve : function ( fm_class /* Fieldmapper class hint */, id /* Fieldmapper object primary key value */, opts /* Option hash */) {
69 var req_hash = dojo.mixin(
71 { method : 'open-ils.pcrud.retrieve.' + fm_class,
72 params : [ this.auth(), id ]
77 var req = this.session.request( req_hash );
80 req.onerror = function (r) { throw js2JSON(r); };
83 req.oncomplete = function (r) { r.result = r.recv(); _pcrud.last_result = r.result; };
90 retrieveAll : function ( fm_class /* Fieldmapper class hint */, opts /* Option hash */) {
91 var pkey = fieldmapper[fm_class].Indentifier;
94 if (opts.order_by) order_by.order_by = opts.order_by;
95 if (opts.select) order_by.select = opts.select;
97 var req_hash = dojo.mixin(
99 { method : 'open-ils.pcrud.search.' + fm_class + '.atomic',
100 params : [ this.auth(), { fieldmapper[fm_class].Indentifier : { '!=' : null } }, order_by ]
105 var req = this.session.request( req_hash );
108 req.onerror = function (r) { throw js2JSON(r); };
111 req.oncomplete = function (r) { r.result = r.recv(); _pcrud.last_result = r.result; };
118 search : function ( fm_class /* Fieldmapper class hint */, search /* Fieldmapper query object */, opts /* Option hash */) {
119 var pkey = fieldmapper[fm_class].Indentifier;
122 if (opts.order_by) order_by.order_by = opts.order_by;
123 if (opts.select) order_by.select = opts.select;
125 var req_hash = dojo.mixin(
127 { method : 'open-ils.pcrud.search.' + fm_class + '.atomic',
128 params : [ this.auth(), search, order_by ]
133 var req = this.session.request( req_hash );
136 req.onerror = function (r) { throw js2JSON(r); };
139 req.oncomplete = function (r) { r.result = r.recv(); _pcrud.last_result = r.result; };
146 _CUD : function ( method /* 'create' or 'update' or 'delete' */ list /* Fieldmapper object */, opts /* Option hash */) {
148 if (dojo.isArray(list)) {
149 if (list.classname) list = [ list ];
154 if (!this.connected) this.connect();
157 var final_complete = opts.oncomplete;
158 var final_error = opts.onerror;
160 function _CUD_recursive ( obj_list, pos, final_complete ) {
161 var obj = obj_list[pos];
163 method : 'open-ils.pcrud.' + method + '.' + obj.classname,
164 params : [ _pcrud.auth(), obj ],
165 onerror : final_error || function (r) { _pcrud.disconnect(); throw '_CUD: Error creating, deleting or updating ' + js2JSON(obj); };
168 var req = _pcrud.session.request( req_hash );
170 if (++pos == all_objs.length) {
171 req.oncomplete = function (r) {
177 req.onerror = function (r) {
184 req._obj_list = obj_list;
185 req._final_complete = final_complete;
186 req.oncomplete = function (r) {
188 if ( res && res.content() ) {
189 _CUD_recursive( r._obj_list, r._pos, r._final_complete );
192 throw '_CUD: Error creating, deleting or updating ' + js2JSON(obj);
200 this.session.request({
201 method : 'open-ils.pcrud.transaction.commit',
203 params : [ ses, modified_ou ],
204 onerror : function (r) {
206 throw 'Transaction begin error';
208 oncomplete : function (r) {
210 if ( res && res.content() ) {
211 _CUD_recursive( list, 0 );
214 throw 'Transaction begin error';
220 create : function ( list, opts ) {
221 this._CUD( 'create', list, opts );
224 update : function ( list, opts ) {
225 this._CUD( 'update', list, opts );
228 delete : function ( list, opts ) {
229 this._CUD( 'delete', list, opts );
232 apply : function ( list, opts ) {
233 this._auto_CUD( list, opts );
236 _auto_CUD : function ( list /* Fieldmapper object */, opts /* Option hash */) {
238 if (dojo.isArray(list)) {
239 if (list.classname) list = [ list ];
244 if (!this.connected) this.connect();
247 var final_complete = opts.oncomplete;
248 var final_error = opts.onerror;
250 function _auto_CUD_recursive ( obj_list, pos, final_complete ) {
251 var obj = obj_list[pos];
254 if (obj.isnew) method = 'create';
255 if (obj.ischanged) method = 'update';
256 if (obj.isdeleted) method = 'delete';
257 if (!method) throw 'No action detected';
260 method : 'open-ils.pcrud.' + method + '.' + obj.classname,
261 params : [ _pcrud.auth(), obj ],
262 onerror : final_error || function (r) { _pcrud.disconnect(); throw '_auto_CUD: Error creating, deleting or updating ' + js2JSON(obj); };
265 var req = _pcrud.session.request( req_hash );
267 if (++pos == all_objs.length) {
268 req.oncomplete = function (r) {
274 req.onerror = function (r) {
281 req._obj_list = obj_list;
282 req._final_complete = final_complete;
283 req.oncomplete = function (r) {
285 if ( res && res.content() ) {
286 _auto_CUD_recursive( r._obj_list, r._pos, r._final_complete );
289 throw '_auto_CUD: Error creating, deleting or updating ' + js2JSON(obj);
297 this.session.request({
298 method : 'open-ils.pcrud.transaction.commit',
300 params : [ ses, modified_ou ],
301 onerror : function (r) {
303 throw 'Transaction begin error';
305 oncomplete : function (r) {
307 if ( res && res.content() ) {
308 _auto_CUD_recursive( list, 0 );
311 throw 'Transaction begin error';