From a647e844315c9904175ff8033f5c765410b31217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Fri, 8 Jul 2011 21:40:40 +0200 Subject: [PATCH] convert to eventemitter format with caching --- lib/mbtiles.js | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/lib/mbtiles.js b/lib/mbtiles.js index 2901488..ebdeac5 100644 --- a/lib/mbtiles.js +++ b/lib/mbtiles.js @@ -26,13 +26,14 @@ function hash(z, x, y) { module.exports = MBTiles; MBTiles.utils = require('./utils'); +var cache = {}; + // Provides access to an mbtiles database file. // - uri: A parsed URL hash, the only relevant part is `pathname`. // - callback: Will be called when the resources have been acquired // or acquisition failed. +require('util').inherits(MBTiles, require('events').EventEmitter) function MBTiles(uri, callback) { - var mbtiles = this; - if (typeof callback !== 'function') callback = noop; if (typeof uri === 'string') uri = url.parse(uri); if (!uri.pathname) { @@ -46,20 +47,42 @@ function MBTiles(uri, callback) { delete uri.host; } + if (!cache[uri.pathname]) { + cache[uri.pathname] = this; + this._open(uri); + } + + var mbtiles = cache[uri.pathname]; + if (!mbtiles.open) { + mbtiles.once('open', callback); + } else { + callback(null, mbtiles); + } + return undefined; +} + +MBTiles.prototype._open = function(uri) { + var mbtiles = this; + function error(err) { + process.nextTick(function() { + mbtiles.emit('open', err); + }); + } + this.filename = uri.pathname; Step(function() { mbtiles._db = new sqlite3.cached.Database(mbtiles.filename, this); }, function(err) { - if (err) return callback(err); + if (err) return error(err); mbtiles._setup(this); }, function(err) { - if (err) return callback(err); + if (err) return error(err); fs.stat(mbtiles.filename, this); }, function(err, stat) { - if (err) return callback(err); + if (err) return error(err); mbtiles._stat = stat; mbtiles.open = true; - return callback(null, mbtiles); + mbtiles.emit('open', null, mbtiles); }); return undefined;