diff options
Diffstat (limited to 'includes/js/dojox/rpc/CouchDBRestStore.js')
-rw-r--r-- | includes/js/dojox/rpc/CouchDBRestStore.js | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/includes/js/dojox/rpc/CouchDBRestStore.js b/includes/js/dojox/rpc/CouchDBRestStore.js new file mode 100644 index 0000000..f61836c --- /dev/null +++ b/includes/js/dojox/rpc/CouchDBRestStore.js @@ -0,0 +1,87 @@ +if(!dojo._hasResource["dojox.data.CouchDBRestStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.data.CouchDBRestStore"] = true; +dojo.provide("dojox.data.CouchDBRestStore"); +dojo.require("dojox.data.JsonRestStore"); +dojo.require("dojox.json.ref"); // TODO: Make it work without this dependency + +// A CouchDBRestStore is an extension of JsonRestStore to handle CouchDB's idiosyncrasies, special features, +// and deviations from standard HTTP Rest. +// NOTE: CouchDB is not designed to be run on a public facing network. There is no access control +// on database documents, and you should NOT rely on client side control to implement security. + + +dojo.declare("dojox.data.CouchDBRestStore", + dojox.data.JsonRestStore, + { + _commitAppend: function(listId,item) { + var deferred = this.service.post(listId,item); + var prefix = this.service.serviceName + '/'; + deferred.addCallback(function(result) { + item._id = prefix + result.id; // update the object with the results of the post + item._rev = result.rev; + return result; + //TODO: Need to go down the graph assigned _id based on path, so that sub items can be modified and properly reflected to the root item (being careful of circular references) + }); + return deferred; + }, + fetch: function(args) { + // summary: + // This only differs from JsonRestStore in that it, will put the query string the query part of the URL and it handles start and count + if (typeof args == 'string') { + args = {query: '_all_docs?' + args}; + } + else if (typeof args.query == 'string') { + args.query = '_all_docs?' + args.query; + } + else + args.query = '_all_docs?'; + if (args.start) { + args.query = (args.query ? (args.query + '&') : '') + 'skip=' + args.start; + delete args.start; + } + if (args.count) { + args.query = (args.query ? (args.query + '&') : '') + 'count=' + args.count; + delete args.count; + } + var prefix = this.service.serviceName + '/'; + var oldOnComplete = args.onComplete; + args.onComplete=function(results) { + if (results.rows) { + for (var i = 0; i < results.rows.length; i++) { + var row = results.rows[i]; // make it into a reference + row._id = prefix + (row.$ref = row.id); + } + } + if (oldOnComplete) + oldOnComplete.apply(this,arguments); + }; + return dojox.data.JsonRestStore.prototype.fetch.call(this,args); + } + } +); + + +dojox.data.CouchDBRestStore.generateSMD = function(couchServerUrl) { + var couchSMD = {contentType:"application/json", + transport:"REST", + envelope:"PATH", + services:{}, + target: couchServerUrl, + }; + var def = dojo.xhrGet({ + url: couchServerUrl+"_all_dbs", + handleAs: "json", + sync: true + }); + def.addCallback(function(dbs) { + for (var i = 0; i < dbs.length; i++) + couchSMD.services[dbs[i]] = { + target:dbs[i], + returns:{}, + parameters:[{type:"string"}] + } + }); + return couchSMD; +} + +} |