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("fieldmapper.Fieldmapper");
22 dojo.require("openils.User");
24 dojo.declare('openils.PermaCrud', null, {
30 constructor : function ( kwargs ) {
31 kwargs = kwargs || {};
33 this.authtoken = kwargs.authtoken;
37 new OpenSRF.ClientSession('open-ils.pcrud');
41 this.session.state == OSRF_APP_SESSION_CONNECTED
42 ) this.connected = true;
45 auth : function (token) {
46 if (token) this.authtoken = token;
47 return this.authtoken || openils.User.authtoken;
50 connect : function ( onerror ) {
51 if (!this.connected && !this.session.connect()) {
52 this.connected = false;
53 if (onerror) onerror(this.session);
56 this.connected = true;
60 disconnect : function ( onerror ) {
61 if (!this.session.disconnect()) {
62 if (onerror) onerror(this.session);
69 retrieve : function ( fm_class /* Fieldmapper class hint */, id /* Fieldmapper object primary key value */, opts /* Option hash */) {
70 var req_hash = dojo.mixin(
72 { method : 'open-ils.pcrud.retrieve.' + fm_class,
73 params : [ this.auth(), id ]
78 var req = this.session.request( req_hash );
81 req.onerror = function (r) { throw js2JSON(r); };
84 req.oncomplete = function (r) { r.result = r.recv(); _pcrud.last_result = r.result; };
91 retrieveAll : function ( fm_class /* Fieldmapper class hint */, opts /* Option hash */) {
92 var pkey = fieldmapper[fm_class].Identifier;
95 if (opts.order_by) order_by.order_by = opts.order_by;
96 if (opts.select) order_by.select = opts.select;
99 search[pkey] = { '!=' : null };
101 var req_hash = dojo.mixin(
103 { method : 'open-ils.pcrud.search.' + fm_class + '.atomic',
104 params : [ this.auth(), search, order_by ]
109 var req = this.session.request( req_hash );
112 req.onerror = function (r) { throw js2JSON(r); };
115 req.oncomplete = function (r) { r.result = r.recv(); _pcrud.last_result = r.result; };
122 search : function ( fm_class /* Fieldmapper class hint */, search /* Fieldmapper query object */, opts /* Option hash */) {
124 if (opts.order_by) order_by.order_by = opts.order_by;
125 if (opts.select) order_by.select = opts.select;
127 var req_hash = dojo.mixin(
129 { method : 'open-ils.pcrud.search.' + fm_class + '.atomic',
130 params : [ this.auth(), search, order_by ]
135 var req = this.session.request( req_hash );
138 req.onerror = function (r) { throw js2JSON(r); };
141 req.oncomplete = function (r) { r.result = r.recv(); _pcrud.last_result = r.result; };
148 _CUD : function ( method /* 'create' or 'update' or 'delete' */, list /* Fieldmapper object */, opts /* Option hash */) {
150 if (dojo.isArray(list)) {
151 if (list.classname) list = [ list ];
156 if (!this.connected) this.connect();
160 function _CUD_recursive ( obj_list, pos, final_complete, final_error ) {
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 );
169 req._final_complete = final_complete;
170 req._final_error = final_error;
172 if (++pos == obj_list.length) {
173 req.oncomplete = function (r) {
175 _pcrud.session.request({
176 method : 'open-ils.pcrud.transaction.commit',
179 onerror : function (r) {
181 throw 'Transaction commit error';
183 oncomplete : function (r) {
185 if ( res && res.content() ) {
186 _auto_CUD_recursive( list, 0 );
189 throw 'Transaction commit error';
194 if (r._final_complete) r._final_complete(r);
198 req.onerror = function (r) {
199 if (r._final_error) r._final_error(r);
205 req._obj_list = obj_list;
206 req.oncomplete = function (r) {
208 if ( res && res.content() ) {
209 _CUD_recursive( r._obj_list, r._pos, r._final_complete );
212 throw '_CUD: Error creating, deleting or updating ' + js2JSON(obj);
220 var f_complete = opts.oncomplete;
221 var f_error = opts.onerror;
223 this.session.request({
224 method : 'open-ils.pcrud.transaction.begin',
227 onerror : function (r) {
229 throw 'Transaction begin error';
231 oncomplete : function (r) {
233 if ( res && res.content() ) {
234 _CUD_recursive( list, 0, f_complete, f_error );
237 throw 'Transaction begin error';
243 create : function ( list, opts ) {
244 this._CUD( 'create', list, opts );
247 update : function ( list, opts ) {
248 this._CUD( 'update', list, opts );
251 delete : function ( list, opts ) {
252 this._CUD( 'delete', list, opts );
255 apply : function ( list, opts ) {
256 this._auto_CUD( list, opts );
259 _auto_CUD : function ( list /* Fieldmapper object */, opts /* Option hash */) {
261 if (dojo.isArray(list)) {
262 if (list.classname) list = [ list ];
267 if (!this.connected) this.connect();
271 function _auto_CUD_recursive ( obj_list, pos, final_complete, final_error ) {
272 var obj = obj_list[pos];
275 if (obj.ischanged()) method = 'update';
276 if (obj.isnew()) method = 'create';
277 if (obj.isdeleted()) method = 'delete';
278 if (!method) throw 'No action detected';
281 method : 'open-ils.pcrud.' + method + '.' + obj.classname,
283 params : [ _pcrud.auth(), obj ],
284 onerror : final_error || function (r) { _pcrud.disconnect(); throw '_auto_CUD: Error creating, deleting or updating ' + js2JSON(obj); }
287 var req = _pcrud.session.request( req_hash );
288 req._final_complete = final_complete;
289 req._final_error = final_error;
291 if (++pos == obj_list.length) {
292 req.oncomplete = function (r) {
294 _pcrud.session.request({
295 method : 'open-ils.pcrud.transaction.commit',
298 onerror : function (r) {
300 throw 'Transaction commit error';
302 oncomplete : function (r) {
304 if ( res && res.content() ) {
305 _auto_CUD_recursive( list, 0 );
308 throw 'Transaction commit error';
313 if (r._final_complete) r._final_complete(r);
317 req.onerror = function (r) {
318 if (r._final_error) r._final_error(r);
324 req._obj_list = obj_list;
325 req.oncomplete = function (r) {
327 if ( res && res.content() ) {
328 _auto_CUD_recursive( r._obj_list, r._pos, r._final_complete, r._final_error );
331 throw '_auto_CUD: Error creating, deleting or updating ' + js2JSON(obj);
339 var f_complete = opts.oncomplete;
340 var f_error = opts.onerror;
342 this.session.request({
343 method : 'open-ils.pcrud.transaction.begin',
346 onerror : function (r) {
348 throw 'Transaction begin error';
350 oncomplete : function (r) {
352 if ( res && res.content() ) {
353 _auto_CUD_recursive( list, 0, f_complete, f_error );
356 throw 'Transaction begin error';