From 2e58bd108cc0065a653d9af695ea07acedd12a8c Mon Sep 17 00:00:00 2001 From: Johan Nordberg Date: Thu, 4 Apr 2013 14:29:17 +0200 Subject: [PATCH] Levelup db model --- scraper/model.coffee | 56 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 scraper/model.coffee diff --git a/scraper/model.coffee b/scraper/model.coffee new file mode 100644 index 0000000..082797a --- /dev/null +++ b/scraper/model.coffee @@ -0,0 +1,56 @@ + +levelup = require 'levelup' +path = require 'path' + +throwop = (error) -> throw error if error? + +safeGet = (db, key, callback) -> + db.get key, (error, result) -> + if error? and error.name isnt 'NotFoundError' + callback error + else + callback null, result or null + +class Model + + constructor: (@id) -> + + serialize: -> {@id} + + save: (callback) -> + db = @constructor.db() + db.put @id, @serialize(), callback + +Model.dblocation = path.join __dirname, './data' + +Model.db = -> + if not @_db? + dbpath = path.join this.dblocation, this.name.toLowerCase() + console.log "Opening database at #{ dbpath }" + @_db = levelup dbpath, + keyEncoding: 'utf8' + valueEncoding: 'json' + process.on 'exit', => @_db.close() + return @_db + +Model.load = (id, ignoreCache, callback) -> + if arguments.length isnt 3 + callback = arguments[1] or throwop + ignoreCache = false + + safeGet @db(), id, (error, result) => + return callback error if error? + if not result? or ignoreCache + this.new id, (error, result) -> + return callback error, result if error? or not result? + result.save (error) -> callback error, result + else + this.deserialize id, result, callback + +Model.deserialize = (id, data, callback) -> + throw new Error 'Not implemented' + +Model.new = (id, callback) -> + throw new Error 'Not implemented' + +module.exports = {Model}