view backends/file.js @ 35:6697f394301f

Replace util with fdsq to work around a stupid bug.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Wed, 10 Nov 2010 01:30:03 +0100
parents e007a6364bf0
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(file) {
	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);

	if (!file)
		file = 'save.json';

	fs.writeFile(file, require('sys').inspect(data, null, null));
}

backend.load = function(file) {
	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;
	}

	if (!file)
		file = 'save.json';

	fs.stat(file, function(err, stats) {
		if (err)
			fs.writeFileSync(file, '{}');
		else if (!stats.isFile()) {
			console.log('\033[1;41mThe file “' + file + '” isn’t a regular file. Exiting.\033[0m');
			process.exit(1);
		}

		var data = fs.readFileSync(file);
		var obj = eval('('+data+')');
		backend.list = endParsing(obj);

		for (var i in backend.list)
			for (var j in Node.prototype)
				backend.list[i][j] = Node.prototype[j];
	});
}