// Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. // A simple class to represent a database. Uses XMLHttpRequest to interface with // the CouchDB server. function CouchDB(name, httpHeaders) { this.name = name; this.uri = "/" + encodeURIComponent(name) + "/"; // The XMLHttpRequest object from the most recent request. Callers can // use this to check result http status and headers. this.last_req = null; this.request = function(method, uri, requestOptions) { requestOptions = requestOptions || {}; requestOptions.headers = combine(requestOptions.headers, httpHeaders); return CouchDB.request(method, uri, requestOptions); }; // Creates the database on the server this.createDb = function() { this.last_req = this.request("PUT", this.uri); CouchDB.maybeThrowError(this.last_req); return JSON.parse(this.last_req.responseText); }; // Deletes the database on the server this.deleteDb = function() { this.last_req = this.request("DELETE", this.uri); if (this.last_req.status == 404) { return false; } CouchDB.maybeThrowError(this.last_req); return JSON.parse(this.last_req.responseText); }; // Save a document to the database this.save = function(doc, options) { if (doc._id == undefined) { doc._id = CouchDB.newUuids(1)[0]; } this.last_req = this.request("PUT", this.uri + encodeURIComponent(doc._id) + encodeOptions(options), {body: JSON.stringify(doc)}); CouchDB.maybeThrowError(this.last_req); var result = JSON.parse(this.last_req.responseText); doc._rev = result.rev; return result; }; // Open a document from the database this.open = function(docId, options) { this.last_req = this.request("GET", this.uri + encodeURIComponent(docId) + encodeOptions(options)); if (this.last_req.status == 404) { return null; } CouchDB.maybeThrowError(this.last_req); return JSON.parse(this.last_req.responseText); }; // Deletes a document from the database this.deleteDoc = function(doc) { this.last_req = this.request("DELETE", this.uri + encodeURIComponent(doc._id) + "?rev=" + doc._rev); CouchDB.maybeThrowError(this.last_req); var result = JSON.parse(this.last_req.responseText); doc._rev = result.rev; //record rev in input document doc._deleted = true; return result; }; // Deletes an attachment from a document this.deleteDocAttachment = function(doc, attachment_name) { this.last_req = this.request("DELETE", this.uri + encodeURIComponent(doc._id) + "/" + attachment_name + "?rev=" + doc._rev); CouchDB.maybeThrowError(this.last_req); var result = JSON.parse(this.last_req.responseText); doc._rev = result.rev; //record rev in input document return result; }; this.bulkSave = function(docs, options) { // first prepoulate the UUIDs for new documents var newCount = 0; for (var i=0; i= n) { var uuids = CouchDB.uuids_cache.slice(CouchDB.uuids_cache.length - n); if(CouchDB.uuids_cache.length - n == 0) { CouchDB.uuids_cache = []; } else { CouchDB.uuids_cache = CouchDB.uuids_cache.slice(0, CouchDB.uuids_cache.length - n); } return uuids; } else { CouchDB.last_req = CouchDB.request("GET", "/_uuids?count=" + (buf + n)); CouchDB.maybeThrowError(CouchDB.last_req); var result = JSON.parse(CouchDB.last_req.responseText); CouchDB.uuids_cache = CouchDB.uuids_cache.concat(result.uuids.slice(0, buf)); return result.uuids.slice(buf); } }; CouchDB.maybeThrowError = function(req) { if (req.status >= 400) { try { var result = JSON.parse(req.responseText); } catch (ParseError) { var result = {error:"unknown", reason:req.responseText}; } throw result; } }; CouchDB.params = function(options) { options = options || {}; var returnArray = []; for(var key in options) { var value = options[key]; returnArray.push(key + "=" + value); } return returnArray.join("&"); };