summaryrefslogtreecommitdiff
path: root/includes/js/dojox/rpc/CouchDBRestStore.js
diff options
context:
space:
mode:
Diffstat (limited to 'includes/js/dojox/rpc/CouchDBRestStore.js')
-rw-r--r--includes/js/dojox/rpc/CouchDBRestStore.js87
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;
+}
+
+}