diff options
Diffstat (limited to 'lib/sugar-web/datastore.js')
-rw-r--r-- | lib/sugar-web/datastore.js | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/lib/sugar-web/datastore.js b/lib/sugar-web/datastore.js new file mode 100644 index 0000000..9291779 --- /dev/null +++ b/lib/sugar-web/datastore.js @@ -0,0 +1,221 @@ +define(["sugar-web/bus", "sugar-web/env"], function (bus, env) { + var datastore = {}; + + function DatastoreObject(objectId) { + this.objectId = objectId; + this.newMetadata = {}; + + this.ensureObjectId = function (callback) { + var that = this; + + env.getEnvironment(function (error, environment) { + if (environment.objectId !== null) { + that.objectId = environment.objectId; + } + callback(); + }); + }; + + this.blobToText = function (blob, callback) { + var reader = new FileReader(); + reader.onload = function (e) { + callback(e.target.result); + }; + reader.readAsText(blob); + }; + + this.blobToArrayBuffer = function (blob, callback) { + var reader = new FileReader(); + reader.onload = function (e) { + callback(e.target.result); + }; + reader.readAsArrayBuffer(blob); + }; + + this.saveText = function (metadata, callback) { + var that = this; + + function onSaved(error, outputStream) { + var blob = new Blob([that.newDataAsText]); + + that.blobToArrayBuffer(blob, function (buffer) { + outputStream.write(buffer); + outputStream.close(callback); + }); + } + + datastore.save(this.objectId, metadata, onSaved); + }; + + this.applyChanges = function (metadata, callback) { + for (var key in this.newMetadata) { + metadata[key] = this.newMetadata[key]; + } + + if (this.newDataAsText !== undefined) { + this.saveText(metadata, callback); + } else { + datastore.setMetadata(this.objectId, metadata, callback); + } + }; + } + + DatastoreObject.prototype.getMetadata = function (callback) { + var that = this; + + this.ensureObjectId(function () { + datastore.getMetadata(that.objectId, callback); + }); + }; + + DatastoreObject.prototype.loadAsText = function (callback) { + var that = this; + var inputStream = null; + var arrayBuffers = []; + var metadata = null; + + function onRead(error, data) { + if (data.byteLength === 0) { + var blob = new Blob(arrayBuffers); + + that.blobToText(blob, function (text) { + callback(null, metadata, text); + }); + + inputStream.close(); + + return; + } + + arrayBuffers.push(data); + + inputStream.read(8192, onRead); + } + + function onLoad(error, loadedMetadata, loadedInputStream) { + metadata = loadedMetadata; + inputStream = loadedInputStream; + + inputStream.read(8192, onRead); + } + + this.ensureObjectId(function () { + datastore.load(that.objectId, onLoad); + }); + }; + + DatastoreObject.prototype.setMetadata = function (metadata) { + for (var key in metadata) { + this.newMetadata[key] = metadata[key]; + } + }; + + DatastoreObject.prototype.setDataAsText = function (text) { + this.newDataAsText = text; + }; + + DatastoreObject.prototype.save = function (callback) { + if (callback === undefined) { + callback = function () {}; + } + + var that = this; + + function onCreated(error, objectId) { + that.objectId = objectId; + that.applyChanges({}, callback); + } + + function onGotMetadata(error, metadata) { + that.applyChanges(metadata, callback); + } + + this.ensureObjectId(function () { + if (that.objectId === undefined) { + datastore.create(that.newMetadata, onCreated); + } else { + datastore.getMetadata(that.objectId, onGotMetadata); + } + }); + }; + + datastore.DatastoreObject = DatastoreObject; + + + datastore.setMetadata = function (objectId, metadata, callback) { + function onResponseReceived(error, result) { + if (callback) { + if (error === null) { + callback(null); + } else { + callback(error); + } + } + } + + var params = [objectId, metadata]; + bus.sendMessage("datastore.set_metadata", params, onResponseReceived); + }; + + datastore.getMetadata = function (objectId, callback) { + function onResponseReceived(error, result) { + if (error === null) { + callback(null, result[0]); + } else { + callback(error, null); + } + } + + var params = [objectId]; + bus.sendMessage("datastore.get_metadata", params, onResponseReceived); + }; + + datastore.load = function (objectId, callback) { + inputStream = bus.createInputStream(); + + inputStream.open(function (error) { + function onResponseReceived(responseError, result) { + if (responseError === null) { + callback(null, result[0], inputStream); + } else { + callback(responseError, null, null); + } + } + + var params = [objectId, inputStream.streamId]; + bus.sendMessage("datastore.load", params, onResponseReceived); + }); + }; + + datastore.create = function (metadata, callback) { + function onResponseReceived(responseError, result) { + if (responseError === null) { + callback(null, result[0]); + } else { + callback(responseError, null); + } + } + + var params = [metadata]; + bus.sendMessage("datastore.create", params, onResponseReceived); + }; + + datastore.save = function (objectId, metadata, callback) { + outputStream = bus.createOutputStream(); + + outputStream.open(function (error) { + function onResponseReceived(responseError, result) { + if (responseError === null) { + callback(null, outputStream); + } else { + callback(responseError, null); + } + } + + var params = [objectId, metadata, outputStream.streamId]; + bus.sendMessage("datastore.save", params, onResponseReceived); + }); + }; + + return datastore; +}); |