diff backends/file.js @ 27:a36a514e8be8

Learned that “hg addremove” can be good, sometimes.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Mon, 01 Nov 2010 02:41:04 +0100
parents
children 7cfcd7d5796c
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/backends/file.js
@@ -0,0 +1,96 @@
+/*
+ *  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 backend = exports;
+
+backend.save = function(file) {
+	function sanitize(o) {
+		var n = {};
+		for (var i in o) {
+			if (i == 'content' || o[i].setISO8601)
+				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.setISO8601(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];
+	});
+}