88 lines
2.9 KiB
JavaScript
88 lines
2.9 KiB
JavaScript
|
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;
|
||
|
}
|
||
|
|
||
|
}
|