From 185c05e7428a01690ef3a506da9dc8b8e2a0a016 Mon Sep 17 00:00:00 2001 From: David Humphrey Date: Thu, 22 May 2014 13:37:15 -0400 Subject: [PATCH 1/2] Fix issue #196: make memory provider DBs sharable --- src/providers/memory.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/providers/memory.js b/src/providers/memory.js index 38104e2..18c4ff9 100644 --- a/src/providers/memory.js +++ b/src/providers/memory.js @@ -1,8 +1,20 @@ define(function(require) { var FILE_SYSTEM_NAME = require('src/constants').FILE_SYSTEM_NAME; - var asyncCallback = require('async').nextTick; + /** + * Make shared in-memory DBs possible when using the same name. + */ + var createDB = (function() { + var pool = {}; + return function getOrCreate(name) { + if(!pool[name]) { + pool[name] = {}; + } + return pool[name]; + }; + }()); + function MemoryContext(db, readOnly) { this.readOnly = readOnly; this.objectStore = db; @@ -50,7 +62,7 @@ define(function(require) { function Memory(name) { this.name = name || FILE_SYSTEM_NAME; - this.db = {}; + this.db = createDB(this.name); } Memory.isSupported = function() { return true; From e37ba7142c609bee04f4828bf505c2f6b04646c0 Mon Sep 17 00:00:00 2001 From: David Humphrey Date: Thu, 22 May 2014 15:09:33 -0400 Subject: [PATCH 2/2] Fix review nit, add test --- src/providers/memory.js | 13 +++++--- tests/spec/providers/providers.memory.spec.js | 33 +++++++++++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/providers/memory.js b/src/providers/memory.js index 18c4ff9..3afdc83 100644 --- a/src/providers/memory.js +++ b/src/providers/memory.js @@ -8,10 +8,14 @@ define(function(require) { var createDB = (function() { var pool = {}; return function getOrCreate(name) { - if(!pool[name]) { + var firstAccess = !pool.hasOwnProperty(name); + if(firstAccess) { pool[name] = {}; } - return pool[name]; + return { + firstAccess: firstAccess, + db: pool[name] + }; }; }()); @@ -62,15 +66,16 @@ define(function(require) { function Memory(name) { this.name = name || FILE_SYSTEM_NAME; - this.db = createDB(this.name); } Memory.isSupported = function() { return true; }; Memory.prototype.open = function(callback) { + var result = createDB(this.name); + this.db = result.db; asyncCallback(function() { - callback(null, true); + callback(null, result.firstAccess); }); }; Memory.prototype.getReadOnlyContext = function() { diff --git a/tests/spec/providers/providers.memory.spec.js b/tests/spec/providers/providers.memory.spec.js index 76f5fc5..6718182 100644 --- a/tests/spec/providers/providers.memory.spec.js +++ b/tests/spec/providers/providers.memory.spec.js @@ -12,6 +12,39 @@ define(["Filer"], function(Filer) { expect(memoryProvider.getReadWriteContext).to.be.a('function'); }); + describe("Memory provider DBs are sharable", function() { + it("should share a single memory db when name is the same", function(done) { + var provider1; + var provider2; + var provider3; + var name1 = 'memory-db'; + var name2 = 'memory-db2'; + + provider1 = new Filer.FileSystem.providers.Memory(name1); + provider1.open(function(error, firstAccess) { + expect(error).not.to.exist; + expect(firstAccess).to.be.true; + + provider2 = new Filer.FileSystem.providers.Memory(name1); + provider2.open(function(error, firstAccess) { + expect(error).not.to.exist; + expect(firstAccess).to.be.false; + expect(provider1.db).to.equal(provider2.db); + + provider3 = new Filer.FileSystem.providers.Memory(name2); + provider3.open(function(error, firstAccess) { + expect(error).not.to.exist; + expect(firstAccess).to.be.true; + expect(provider3.db).not.to.equal(provider2.db); + + done(); + }); + }); + }); + }); + }); + }); + describe("open an Memory provider", function() { it("should open a new Memory database", function(done) { var provider = new Filer.FileSystem.providers.Memory();