From 4dc7474fd5ac0e32dc991477564b704e1ed1ba46 Mon Sep 17 00:00:00 2001 From: Alan Kligman Date: Fri, 12 Oct 2012 18:54:12 -0400 Subject: [PATCH] Support for unlink(). --- examples/test.html | 6 ++- src/filesystem.js | 113 ++++++++++++++++++++++++++++++++------------- 2 files changed, 84 insertions(+), 35 deletions(-) diff --git a/examples/test.html b/examples/test.html index 9c3c549..8e47064 100644 --- a/examples/test.html +++ b/examples/test.html @@ -34,10 +34,12 @@ require(["src/filesystem"], function(IDBFS) { console.log("buffer:", buffer); } fs.close(fd, function(error) { - fs.dump(document.getElementById("stdout")); + fs.unlink("/tmp/0", function(error) { + fs.dump(document.getElementById("stdout")); + }); }); }); - }); + }); }); }); diff --git a/src/filesystem.js b/src/filesystem.js index 9da8baf..5971a43 100644 --- a/src/filesystem.js +++ b/src/filesystem.js @@ -33,8 +33,8 @@ define(function(require) { return { "parent": parent, "name": name, - "content-type": "application/directory", - "last-modified": modtime || Date.now() + "contenttype": "application/directory", + "lastmodified": modtime || Date.now() } } @@ -43,19 +43,21 @@ define(function(require) { return { "parent": parent, "name": name, - "content-type": "application/file", - "last-modified": modtime || Date.now(), + "contenttype": "application/file", + "lastmodified": modtime || Date.now(), "size": size || 0, - "object-id": oid || guid() + "oid": oid || guid() } } var METADATA_STORE_NAME = "metadata"; - var FILE_STORE_NAME = "files"; + var FILE_STORE_NAME = "files"; var NAME_INDEX = "name"; var NAME_INDEX_KEY_PATH = "name"; var PARENT_INDEX = "parent"; var PARENT_INDEX_KEY_PATH = "parent"; + var OBJECT_ID_INDEX = "oid"; + var OBJECT_ID_INDEX_KEY_PATH = "oid"; var MIME_DIRECTORY = "application/directory"; var MIME_FILE = "application/file"; @@ -74,6 +76,7 @@ define(function(require) { var T_RMDIR = 0x4; var T_CLOSE = 0x5; var T_READ = 0x6; + var T_UNLINK = 0x7; // Codes var E_EXIST = 0x0; var E_ISDIR = 0x1; @@ -139,10 +142,13 @@ define(function(require) { return; } transaction = db.transaction([FILE_STORE_NAME], IDB_RO); + transaction.oncomplete = function(e) { + end(); + } var store = transaction.objectStore(FILE_STORE_NAME); - if(MIME_FILE === ofd.entry["content-type"]) { - var oid = ofd.entry["object-id"]; + if(MIME_FILE === ofd.entry["contenttype"]) { + var oid = ofd.entry["oid"]; var getRequest = store.get(oid); getRequest.onsuccess = function(e) { var storedBuffer = e.target.result; @@ -160,7 +166,6 @@ define(function(require) { var storedBufferView = storedBuffer.subarray(ofd.pointer, ofd.pointer + bytes); buffer.set(storedBufferView); ofd.pointer += bytes; - end(); debug.info("read <--"); if(callback && "function" === typeof callback) { callback.call(undefined, undefined, bytes, buffer); @@ -168,7 +173,7 @@ define(function(require) { } }; getRequest.onerror = onerror; - } else if(MIME_DIRECTORY === ofd.entry["content-type"]) { + } else if(MIME_DIRECTORY === ofd.entry["contenttype"]) { // NOT IMPLEMENTED onerror(new IDBFSError(T_READ, E_NOT_IMPLEMENTED)) } @@ -176,19 +181,22 @@ define(function(require) { function write(buffer, callback) { debug.info("write -->"); - var onerror = genericIDBErrorHandler("write", callback); - if(!start()) { - onerror(new IDBFSError(T_READ, E_BADF)); - return; - } + var onerror = genericIDBErrorHandler("write", callback); if(OM_RO === ofd.mode) { onerror(new IDBFSError(T_READ, E_BADF)); return; } + if(!start()) { + onerror(new IDBFSError(T_READ, E_BADF)); + return; + } transaction = db.transaction([METADATA_STORE_NAME, FILE_STORE_NAME], IDB_RW); + transaction.oncomplete = function(e) { + end(); + } var metaStore = transaction.objectStore(METADATA_STORE_NAME); var fileStore = transaction.objectStore(FILE_STORE_NAME); - var oid = ofd.entry["object-id"]; + var oid = ofd.entry["oid"]; var getRequest = fileStore.get(oid); getRequest.onsuccess = function(e) { var storedBuffer = e.target.result; @@ -206,11 +214,10 @@ define(function(require) { var readMetadataRequest = metaStore.get(ofd.entry["name"]); readMetadataRequest.onsuccess = function(e) { var entry = e.target.result; - entry = makeFileEntry(entry["name"], entry["object-id"], size); + entry = makeFileEntry(entry["name"], entry["oid"], size); ofd.entry = entry; var writeMetadataRequest = metaStore.put(entry, entry["name"]); writeMetadataRequest.onsuccess = function(e) { - end(); debug.info("write <--"); if(callback && "function" === typeof callback) { callback.call(undefined, undefined, size, buffer); @@ -289,7 +296,7 @@ define(function(require) { createRequest.onerror = onerror; } } else { - if(entry["content-type"] === MIME_DIRECTORY && mode === OM_RW) { + if(entry["contenttype"] === MIME_DIRECTORY && mode === OM_RW) { onerror(new IDBFSError(T_OPEN, E_ISDIR)); return; } else { @@ -414,6 +421,7 @@ define(function(require) { } } }; + getRequest.onerror = onerror; } function link(oldpath, newpath, callback) { @@ -421,7 +429,38 @@ define(function(require) { } function unlink(pathname, callback) { + debug.info("unlink -->"); + pathname = path.normalize(pathname); + var transaction = db.transaction([METADATA_STORE_NAME], IDB_RW); + var metaStore = transaction.objectStore(METADATA_STORE_NAME); + var nameIndex = metaStore.index(NAME_INDEX); + var onerror = genericIDBErrorHandler("unlink", callback); + stat(transaction, pathname, function(error, entry) { + if(error) { + onerror(new IDBFSError(T_UNLINK, error)); + return; + } + if(MIME_DIRECTORY === entry["contenttype"]) { + onerror(new IDBFSError(T_UNLINK, E_ISDIR)); + return; + } + var unlinkRequest = metaStore.delete(entry["name"]); + unlinkRequest.onsuccess = function(e) { + // We don't support links, so this entry is the only entry for the file data + var transaction = db.transaction([FILE_STORE_NAME], IDB_RW); + var fileStore = transaction.objectStore(FILE_STORE_NAME); + var deleteRequest = fileStore.delete(entry["oid"]); + deleteRequest.onsuccess = function(e) { + debug.info("unlink <--"); + if(callback && "function" === typeof callback) { + callback.call(undefined, undefined); + } + }; + deleteRequest.onerror = onerror; + }; + unlinkRequest.onerror = onerror; + }); } function api() { @@ -442,25 +481,32 @@ define(function(require) { this.mkdir = mkdir; this.rmdir = rmdir; this.stat = stat; - this.link = link; + // this.link = link; this.unlink = unlink; this.api = api; // DEBUG function dump(element) { - element.innerHTML = ""; - var transaction = db.transaction([METADATA_STORE_NAME], IDB_RO); - var store = transaction.objectStore(METADATA_STORE_NAME); - var cursorRequest = store.openCursor(); - cursorRequest.onsuccess = function(e) { - var cursor = e.target.result; - if(cursor) { - var getRequest = store.get(cursor.key); - getRequest.onsuccess = function(e) { - var result = e.target.result; - element.innerHTML += JSON.stringify(result) + "
"; - cursor.continue(); - }; + element.innerHTML = "Metadata://
"; + var transaction = db.transaction([METADATA_STORE_NAME, FILE_STORE_NAME], IDB_RO); + var metaStore = transaction.objectStore(METADATA_STORE_NAME); + var fileStore = transaction.objectStore(FILE_STORE_NAME); + var metaRequest = metaStore.openCursor(); + metaRequest.onsuccess = function(e) { + var metaCursor = e.target.result; + if(metaCursor) { + element.innerHTML += JSON.stringify(metaCursor.value) + "
"; + metaCursor.continue(); + } else { + element.innerHTML += "Files://
" + fileRequest = fileStore.openCursor(); + fileRequest.onsuccess = function(e) { + var fileCursor = e.target.result; + if(fileCursor) { + element.innerHTML += JSON.stringify(fileCursor.key) + "
"; + fileCursor.continue(); + } + } } }; } @@ -483,6 +529,7 @@ define(function(require) { var metadata = db.createObjectStore(METADATA_STORE_NAME); metadata.createIndex(PARENT_INDEX, PARENT_INDEX_KEY_PATH, {unique: false}); metadata.createIndex(NAME_INDEX, NAME_INDEX_KEY_PATH, {unique: true}); + metadata.createIndex(OBJECT_ID_INDEX, OBJECT_ID_INDEX_KEY_PATH, {unique: false}); var files = db.createObjectStore(FILE_STORE_NAME); optFormat = true;