Mercurial > psgxs
view backends/directory.js @ 36:26eb015a7c40
Really should learn that “hg addremove” is good.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Wed, 10 Nov 2010 01:43:25 +0100 |
parents | dcf1f09f8cee |
children | 023f767662d3 |
line wrap: on
line source
/* * Copyright (C) 2010 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> * * This file is part of PSĜS, a PubSub server written in JavaScript. * * PSĜS is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License. * * PSĜS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with PSĜS. If not, see <http://www.gnu.org/licenses/>. */ var fs = require('fs'); var Node = require('../nodes').Node; var backend = exports; backend.save = function(dir) { if (!dir) dir = 'storage'; fs.stat(dir, function(err, stats) { if (err) fs.mkdir(dir, 0755); else if (!stats.isDirectory()) { console.log('\033[1;41mThe file “' + dir + '” isn’t a directory. Exiting.\033[0m'); process.exit(1); } fs.readdir(dir, function(err, files) { function sanitize(o) { var n = {}; for (var i in o) { if (i == 'content' || o[i].setFromISO8601) n[i] = o[i].toString(); else if (o[i] instanceof Array) n[i] = o[i]; else if (typeof o[i] == 'object') n[i] = sanitize(o[i]); else if (typeof o[i] == 'function') ; else n[i] = o[i]; } return n; } var data = sanitize(backend.list); var inspect = require('sys').inspect; for (var nodeID in data) fs.writeFile(dir+'/'+nodeID+'.json', inspect(data[nodeID], false, null)); var toDelete = []; for (var i in files) { var file = files[i]; if (!(file.replace(/\.json$/, '') in data)) toDelete.push(file); } for (var nodeID in toDelete) fs.unlink(dir+'/'+toDelete[nodeID]); }); }); } backend.load = function(dir) { if (!dir) dir = 'storage'; fs.stat(dir, function(err, stats) { if (err) fs.mkdir(dir, 0755); else if (!stats.isDirectory()) { console.log('\033[1;41mThe file “' + dir + '” isn’t a directory. Exiting.\033[0m'); process.exit(1); } fs.readdir(dir, function(err, files) { var xmpp = require('xmpp'); function parseStanza(path, content) { var stanza = null; var stream = new xmpp.Stream({ stanza: function (stanza) { path[content] = stanza; } }); stream.opened = true; stream.data(path[content]); } function endParsing(o) { var regexp = /\d{4}-\d\d-\d\dT\d\d:\d\d:\d\dZ/; for (var i in o) { if (typeof o[i] == 'string' && i == 'content') parseStanza(o, i); else if (typeof o[i] == 'string' && regexp(o[i])) { var today = new Date(); today.setFromISO8601(o[i]); o[i] = today; } else if (typeof o[i] == 'object') endParsing(o[i]); } return o; } backend.list = {}; for (var i in files) { var file = files[i]; if (/^\./.test(file)) continue; var nodeID = file.replace(/\.json$/, ''); var data = fs.readFileSync(dir+'/'+file).toString(); var obj = eval('('+data+')'); backend.list[nodeID] = endParsing(obj); for (var j in Node.prototype) backend.list[nodeID][j] = Node.prototype[j]; } }); }); }