define([ 'dojo/_base/json', 'dojo/_base/lang', 'dojo/Deferred', 'dojo/request', 'dojox/lang/functional', './docs' ],function(json,lang,Deferred,request,func,docs){ var dbUrl = "http://localhost:5984/"; function serializeFunctions(value) { if ( value === null ) { return null; } else if ( lang.isArray(value) ) { return value; } else if ( lang.isFunction(value) ) { return value.toString(); } else if ( lang.isObject(value) ) { return func.mapIn(value,serializeFunctions); } else { return value; } } function req(method,path,body) { var args = { contentType: 'application/json', handleAs: 'json', data: json.toJson(body || {}) }; return request[method](dbUrl+path,args); } function asyncSeq(functions) { var d = new Deferred(); (function stepper(fs,arg) { if ( fs.length > 0 ) { try { var f = fs.shift(); var ret = f(arg); if ( ret && ret.then ) { ret.then(function(ret){ stepper(fs,ret); }); } else { stepper(fs,ret); } } catch(err) { d.reject(err); } } else { d.resolve(); } })(functions); return d.promise; } function asyncFor(list,callback,ctx) { var d = new Deferred(); (function stepper(list,idx){ if ( list.length > 0 ) { var el = list.shift(); var ret = callback.call(ctx,el,idx); if ( ret && ret.then ) { ret.then(function(){ stepper(list,idx+1); }); } else { stepper(list,idx+1); } } else { d.resolve(); } })(list,0); return d.promise; } asyncSeq([ function(){ console.log("Configuring CouchDB for RFT:"); }, function(){ console.log("Checking CouchDB version"); return req('get','') .then(function(res){ if (res.version !== "1.2.0" ) { console.log("Found "+res.version+", only tested with CouchDB 1.2.0") } else { console.log("CouchDB 1.2.0 found"); } }); },function(){ console.log("Checking database 'qed'"); return req('get','qed') .then(function(res){ if (res.error) { console.log("Creating database 'qed'"); return req('put','/qed'); } else { console.log("Database 'qed' found."); } },function(res){ console.log("Creating database 'qed'"); return req('put','/qed'); }); },function(){ return serializeFunctions(docs); },function(docs){ console.log("Putting documents in database."); return asyncFor(func.keys(docs),function(docUrl){ var doc = docs[docUrl]; var configAction = doc.__configAction; delete doc.__configAction; switch (configAction) { case "ignore": console.log(docUrl+" ignored."); case "update": console.log(docUrl+" updating."); return req('get',docUrl) .then(function(oldDoc){ lang.mixin(oldDoc,doc); return req('put',docUrl,oldDoc); },function(){ return req('put',docUrl,doc); }); case "replace": default: console.log(docUrl+" replacing."); return req('get',docUrl) .then(function(oldDoc){ doc['_rev'] = oldDoc['_rev']; return req('put',docUrl,doc); },function(){ return req('put',docUrl,doc); }); } }); },function(){ console.log("Done!"); } ]); });