]> git.pond.sub.org Git - eow/blobdiff - static/dojo-release-1.1.1/dojox/rpc/CouchDBRestStore.js
add Dojo 1.1.1
[eow] / static / dojo-release-1.1.1 / dojox / rpc / CouchDBRestStore.js
diff --git a/static/dojo-release-1.1.1/dojox/rpc/CouchDBRestStore.js b/static/dojo-release-1.1.1/dojox/rpc/CouchDBRestStore.js
new file mode 100644 (file)
index 0000000..f61836c
--- /dev/null
@@ -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;
+}
+
+}