refactoring to support additional backends
This commit is contained in:
parent
cfc63d80c1
commit
d8b225efbe
245
src/fs.js
245
src/fs.js
|
@ -794,70 +794,21 @@ define(function(require) {
|
||||||
* FileSystem
|
* FileSystem
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
function IndexedDBDatabase(db) {
|
||||||
|
this.db = db;
|
||||||
|
}
|
||||||
|
function transaction(stores, mode, callback) {
|
||||||
|
var tx = this.db.transaction(stores, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
function WebSQLDatabase(db) {
|
||||||
|
this.db = db;
|
||||||
|
}
|
||||||
|
function transaction() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
function FileSystem(name, flags) {
|
function FileSystem(name, flags) {
|
||||||
var format = _(flags).contains(FS_FORMAT);
|
|
||||||
var that = this;
|
|
||||||
|
|
||||||
var deferred = when.defer();
|
|
||||||
this.promise = deferred.promise;
|
|
||||||
|
|
||||||
var openRequest = indexedDB.open(name);
|
|
||||||
openRequest.onupgradeneeded = function onupgradeneeded(event) {
|
|
||||||
var db = event.target.result;
|
|
||||||
|
|
||||||
if(db.objectStoreNames.contains(FILE_STORE_NAME)) {
|
|
||||||
db.deleteObjectStore(FILE_STORE_NAME);
|
|
||||||
}
|
|
||||||
var files = db.createObjectStore(FILE_STORE_NAME);
|
|
||||||
|
|
||||||
if(db.objectStoreNames.contains(METADATA_STORE_NAME)) {
|
|
||||||
db.deleteObjectStore(METADATA_STORE_NAME);
|
|
||||||
}
|
|
||||||
var metadata = db.createObjectStore(METADATA_STORE_NAME);
|
|
||||||
|
|
||||||
format = true;
|
|
||||||
};
|
|
||||||
openRequest.onsuccess = function onsuccess(event) {
|
|
||||||
var db = event.target.result;
|
|
||||||
var transaction = db.transaction([FILE_STORE_NAME], IDB_RW);
|
|
||||||
var files = transaction.objectStore(FILE_STORE_NAME);
|
|
||||||
|
|
||||||
function complete(error) {
|
|
||||||
that.db = db;
|
|
||||||
if(error) {
|
|
||||||
that.readyState = FS_ERROR;
|
|
||||||
deferred.reject(error);
|
|
||||||
} else {
|
|
||||||
that.readyState = FS_READY;
|
|
||||||
deferred.resolve();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(format) {
|
|
||||||
var clearRequest = files.clear();
|
|
||||||
clearRequest.onsuccess = function onsuccess(event) {
|
|
||||||
make_root_directory(files, complete);
|
|
||||||
};
|
|
||||||
clearRequest.onerror = function onerror(error) {
|
|
||||||
complete(error);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
complete();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
openRequest.onerror = function onerror(error) {
|
|
||||||
this.readyState = FS_ERROR;
|
|
||||||
deferred.reject(error);
|
|
||||||
};
|
|
||||||
|
|
||||||
var nextDescriptor = 1;
|
|
||||||
var openFiles = {};
|
|
||||||
|
|
||||||
this.readyState = FS_PENDING;
|
|
||||||
this.db = null;
|
|
||||||
this.nextDescriptor = nextDescriptor;
|
|
||||||
this.openFiles = openFiles;
|
|
||||||
this.name = name;
|
|
||||||
}
|
}
|
||||||
FileSystem.prototype._allocate_descriptor = function _allocate_descriptor(openFileDescription) {
|
FileSystem.prototype._allocate_descriptor = function _allocate_descriptor(openFileDescription) {
|
||||||
var fd = this.nextDescriptor ++;
|
var fd = this.nextDescriptor ++;
|
||||||
|
@ -867,7 +818,7 @@ define(function(require) {
|
||||||
FileSystem.prototype._release_descriptor = function _release_descriptor(fd) {
|
FileSystem.prototype._release_descriptor = function _release_descriptor(fd) {
|
||||||
delete this.openFiles[fd];
|
delete this.openFiles[fd];
|
||||||
};
|
};
|
||||||
FileSystem.prototype.open = function open(path, flags, callback) {
|
FileSystem.prototype._open = function _open(path, flags, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -912,7 +863,7 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.close = function close(fd, callback) {
|
FileSystem.prototype._close = function _close(fd, callback) {
|
||||||
var deferred = when.defer();
|
var deferred = when.defer();
|
||||||
|
|
||||||
if(!_(this.openFiles).has(fd)) {
|
if(!_(this.openFiles).has(fd)) {
|
||||||
|
@ -931,7 +882,7 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.mkdir = function mkdir(path, callback) {
|
FileSystem.prototype._mkdir = function _mkdir(path, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -963,7 +914,7 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.rmdir = function rmdir(path, callback) {
|
FileSystem.prototype._rmdir = function _rmdir(path, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -995,7 +946,7 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.stat = function stat(path, callback) {
|
FileSystem.prototype._stat = function _stat(path, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -1029,7 +980,7 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.fstat = function fstat(fd, callback) {
|
FileSystem.prototype._fstat = function _fstat(fd, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -1069,7 +1020,7 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.link = function link(oldpath, newpath, callback) {
|
FileSystem.prototype._link = function _link(oldpath, newpath, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -1102,7 +1053,7 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.unlink = function unlink(path, callback) {
|
FileSystem.prototype._unlink = function _unlink(path, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -1135,7 +1086,7 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.read = function read(fd, buffer, offset, length, position, callback) {
|
FileSystem.prototype._read = function _read(fd, buffer, offset, length, position, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -1179,7 +1130,7 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.readFile = function readFile(path, options, callback) {
|
FileSystem.prototype._readFile = function _readFile(path, options, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -1252,7 +1203,7 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.write = function write(fd, buffer, offset, length, position, callback) {
|
FileSystem.prototype._write = function _write(fd, buffer, offset, length, position, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -1297,7 +1248,7 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.writeFile = function writeFile(path, data, options, callback) {
|
FileSystem.prototype._writeFile = function _writeFile(path, data, options, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -1355,13 +1306,13 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.getxattr = function getxattr(path, name, callback) {
|
FileSystem.prototype._getxattr = function _getxattr(path, name, callback) {
|
||||||
|
|
||||||
};
|
};
|
||||||
FileSystem.prototype.setxattr = function setxattr(path, name, value, callback) {
|
FileSystem.prototype._setxattr = function _setxattr(path, name, value, callback) {
|
||||||
|
|
||||||
};
|
};
|
||||||
FileSystem.prototype.lseek = function lseek(fd, offset, whence, callback) {
|
FileSystem.prototype._lseek = function _lseek(fd, offset, whence, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -1431,7 +1382,7 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.readdir = function readdir(path, callback) {
|
FileSystem.prototype._readdir = function _readdir(path, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -1464,10 +1415,10 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.utimes = function utimes(path, atime, mtime, callback) {
|
FileSystem.prototype._utimes = function _utimes(path, atime, mtime, callback) {
|
||||||
|
|
||||||
};
|
};
|
||||||
FileSystem.prototype.rename = function rename(oldpath, newpath, callback) {
|
FileSystem.prototype._rename = function _rename(oldpath, newpath, callback) {
|
||||||
var that = this;
|
var that = this;
|
||||||
this.promise.then(
|
this.promise.then(
|
||||||
function() {
|
function() {
|
||||||
|
@ -1509,28 +1460,146 @@ define(function(require) {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
FileSystem.prototype.truncate = function truncate(path, length, callback) {
|
FileSystem.prototype._truncate = function _truncate(path, length, callback) {
|
||||||
|
|
||||||
};
|
};
|
||||||
FileSystem.prototype.ftruncate = function ftruncate(fd, length, callback) {
|
FileSystem.prototype._ftruncate = function _ftruncate(fd, length, callback) {
|
||||||
|
|
||||||
};
|
};
|
||||||
FileSystem.prototype.symlink = function symlink(fd, length, callback) {
|
FileSystem.prototype._symlink = function _symlink(fd, length, callback) {
|
||||||
|
|
||||||
};
|
};
|
||||||
FileSystem.prototype.readlink = function readlink(fd, length, callback) {
|
FileSystem.prototype._readlink = function _readlink(fd, length, callback) {
|
||||||
|
|
||||||
};
|
};
|
||||||
FileSystem.prototype.realpath = function realpath(fd, length, callback) {
|
FileSystem.prototype._realpath = function _realpath(fd, length, callback) {
|
||||||
|
|
||||||
};
|
};
|
||||||
FileSystem.prototype.lstat = function lstat(fd, length, callback) {
|
FileSystem.prototype._lstat = function _lstat(fd, length, callback) {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function IndexedDBFileSystem(name, flags) {
|
||||||
|
var format = _(flags).contains(FS_FORMAT);
|
||||||
|
var that = this;
|
||||||
|
|
||||||
|
var deferred = when.defer();
|
||||||
|
this.promise = deferred.promise;
|
||||||
|
|
||||||
|
var openRequest = indexedDB.open(name);
|
||||||
|
openRequest.onupgradeneeded = function onupgradeneeded(event) {
|
||||||
|
var db = event.target.result;
|
||||||
|
|
||||||
|
if(db.objectStoreNames.contains(FILE_STORE_NAME)) {
|
||||||
|
db.deleteObjectStore(FILE_STORE_NAME);
|
||||||
|
}
|
||||||
|
var files = db.createObjectStore(FILE_STORE_NAME);
|
||||||
|
|
||||||
|
if(db.objectStoreNames.contains(METADATA_STORE_NAME)) {
|
||||||
|
db.deleteObjectStore(METADATA_STORE_NAME);
|
||||||
|
}
|
||||||
|
var metadata = db.createObjectStore(METADATA_STORE_NAME);
|
||||||
|
|
||||||
|
format = true;
|
||||||
|
};
|
||||||
|
openRequest.onsuccess = function onsuccess(event) {
|
||||||
|
var db = event.target.result;
|
||||||
|
var transaction = db.transaction([FILE_STORE_NAME], IDB_RW);
|
||||||
|
var files = transaction.objectStore(FILE_STORE_NAME);
|
||||||
|
|
||||||
|
function complete(error) {
|
||||||
|
that.db = db;
|
||||||
|
if(error) {
|
||||||
|
that.readyState = FS_ERROR;
|
||||||
|
deferred.reject(error);
|
||||||
|
} else {
|
||||||
|
that.readyState = FS_READY;
|
||||||
|
deferred.resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(format) {
|
||||||
|
var clearRequest = files.clear();
|
||||||
|
clearRequest.onsuccess = function onsuccess(event) {
|
||||||
|
make_root_directory(files, complete);
|
||||||
|
};
|
||||||
|
clearRequest.onerror = function onerror(error) {
|
||||||
|
complete(error);
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
complete();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
openRequest.onerror = function onerror(error) {
|
||||||
|
this.readyState = FS_ERROR;
|
||||||
|
deferred.reject(error);
|
||||||
|
};
|
||||||
|
|
||||||
|
var nextDescriptor = 1;
|
||||||
|
var openFiles = {};
|
||||||
|
|
||||||
|
this.readyState = FS_PENDING;
|
||||||
|
this.db = null;
|
||||||
|
this.nextDescriptor = nextDescriptor;
|
||||||
|
this.openFiles = openFiles;
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype = new FileSystem();
|
||||||
|
IndexedDBFileSystem.prototype.constructor = IndexedDBFileSystem;
|
||||||
|
IndexedDBFileSystem.prototype.open = function open(path, flags, callback) {
|
||||||
|
this._open(path, flags, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.close = function close(fd, callback) {
|
||||||
|
this._close(fd, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.mkdir = function mkdir(path, callback) {
|
||||||
|
this._mkdir(path, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.rmdir = function rmdir(path, callback) {
|
||||||
|
this._rmdir(path, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.stat = function stat(path, callback) {
|
||||||
|
this._stat(path, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.fstat = function fstat(fd, callback) {
|
||||||
|
this._fstat(fd, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.link = function link(oldpath, newpath, callback) {
|
||||||
|
this._link(oldpath, newpath, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.unlink = function unlink(path, callback) {
|
||||||
|
this._unlink(path, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.read = function read(fd, buffer, offset, length, position, callback) {
|
||||||
|
this._read(fd, buffer, offset, length, position, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.readFile = function readFile(path, options, callback) {
|
||||||
|
this._readFile(path, options, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.write = function write(fd, buffer, offset, length, position, callback) {
|
||||||
|
this._write(fd, buffer, offset, length, position, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.writeFile = function writeFile(path, data, options, callback) {
|
||||||
|
this._writeFile(path, data, options, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.lseek = function lseek(fd, offset, whence, callback) {
|
||||||
|
this._lseek(fd, offset, whence, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.readdir = function readdir(path, callback) {
|
||||||
|
this._readdir(path, callback);
|
||||||
|
}
|
||||||
|
IndexedDBFileSystem.prototype.rename = function rename(oldpath, newpath, callback) {
|
||||||
|
this._rename(oldpath, newpath, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
function WebSQLFileSystem(name, flags) {
|
||||||
|
// FIXME: NOT IMPLEMENTED
|
||||||
|
}
|
||||||
|
WebSQLFileSystem.prototype = new FileSystem();
|
||||||
|
IndexedDBFileSystem.prototype.constructor = WebSQLFileSystem;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
FileSystem: FileSystem
|
FileSystem: IndexedDBFileSystem
|
||||||
};
|
};
|
||||||
|
|
||||||
});
|
});
|
Loading…
Reference in New Issue