not really known
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

224 lines
6.4 KiB

define(["sugar-web/bus", "sugar-web/env"], function (bus, env) {
'use strict';
var datastore = {};
function DatastoreObject(objectId) {
this.objectId = objectId;
this.newMetadata = {};
this.ensureObjectId = function (callback) {
var that = this;
env.getObjectId(function (objectId) {
if (objectId !== null && that.objectId === undefined) {
that.objectId = 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) {
var 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) {
var 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;
});