snowl/modules/identity.js

256 строки
8.2 KiB
JavaScript
Исходник Обычный вид История

/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Snowl.
*
* The Initial Developer of the Original Code is Mozilla.
* Portions created by the Initial Developer are Copyright (C) 2008
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Myk Melez <myk@mozilla.org>
* alta88 <alta88@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
2008-07-15 10:45:49 +04:00
const EXPORTED_SYMBOLS = ["SnowlIdentity", "SnowlPerson"];
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cr = Components.results;
const Cu = Components.utils;
Cu.import("resource://snowl/modules/datastore.js");
Cu.import("resource://snowl/modules/source.js");
Cu.import("resource://snowl/modules/URI.js");
function SnowlIdentity(id, source, externalID, name) {
2008-07-15 10:45:49 +04:00
this.id = id;
this.source = source;
2008-07-15 10:45:49 +04:00
this.externalID = externalID;
this.person = new SnowlPerson(null, name);
2008-07-15 10:45:49 +04:00
}
SnowlIdentity.prototype = {
id: null,
source: null,
externalID: null,
person: null,
2008-07-15 10:45:49 +04:00
persist: function() {
this.person.persist(this.source.id);
2008-07-15 10:45:49 +04:00
let statement = SnowlDatastore.createStatement(
"INSERT INTO identities ( sourceID, externalID, personID) " +
"VALUES (:sourceID, :externalID, :personID)"
);
try {
statement.params.sourceID = this.source.id;
statement.params.externalID = this.externalID;
statement.params.personID = this.person.id;
statement.step();
this.id = SnowlDatastore.dbConnection.lastInsertRowID;
}
finally {
statement.reset();
2008-07-15 10:45:49 +04:00
}
}
};
function SnowlPerson(id, name, placeID, homeURL, iconURL) {
this.id = id;
this.name = name;
this.placeID = placeID;
}
SnowlPerson.prototype = {
name: null,
placeID: null,
homeURL: null,
iconURL: null,
persist: function(sourceID) {
let statement = SnowlDatastore.createStatement(
"INSERT INTO people ( name, homeURL, iconURL) " +
"VALUES (:name, :homeURL, :iconURL)"
);
try {
statement.params.name = this.name;
statement.params.homeURL = this.homeURL;
statement.params.iconURL = this.iconURL;
statement.step();
this.id = SnowlDatastore.dbConnection.lastInsertRowID;
// XXX lookup favicon in collections table rather than hardcoding
let iconURI =
this.iconURL ? URI.get(this.iconURL) :
this.homeURL ? SnowlSource.faviconSvc.getFaviconForPage(this.homeURL) :
URI.get("chrome://snowl/skin/person-16.png");
// Create places record, placeID stored into people table record.
//SnowlPlaces._log.info("Author name:iconURI.spec - " + name + " : " + iconURI.spec);
// FIXME: break the dependency on sourceID, since people should only be
// connected to sources through identities.
this.placeID = SnowlPlaces.persistPlace("people",
this.id,
name,
null, // homeURL,
externalID, // externalID,
iconURI,
sourceID);
// Store placeID back into messages for DB integrity.
SnowlDatastore.dbConnection.executeSimpleSQL(
"UPDATE people " +
"SET placeID = " + this.placeID +
" WHERE id = " + this.id);
}
finally {
statement.reset();
}
2008-07-15 10:45:49 +04:00
}
};
//SnowlIdentity.get = function(sourceID, externalID) {
// let identity;
//
// let statement = SnowlDatastore.createStatement(
// "SELECT id, personID " +
// "FROM identities " +
// "WHERE externalID = :externalID AND sourceID = :sourceID"
// );
//
// try {
// statement.params.sourceID = sourceID;
// statement.params.externalID = externalID;
// if (statement.step()) {
// identity = new SnowlIdentity(statement.row.id,
// sourceID,
// externalID,
// statement.row.personID);
// }
// }
// finally {
// statement.reset();
// }
//
// return identity;
//};
SnowlIdentity.create = function(sourceID, externalID, name, homeURL, iconURL) {
2008-07-15 10:45:49 +04:00
let identity;
let personStatement = SnowlDatastore.createStatement(
"INSERT INTO people (name, homeURL, iconURL, placeID) " +
"VALUES (:name, :homeURL, :iconURL, :placeID)"
2008-07-15 10:45:49 +04:00
);
let identityStatement = SnowlDatastore.createStatement(
"INSERT INTO identities (sourceID, externalID, personID) " +
"VALUES (:sourceID, :externalID, :personID)"
2008-07-15 10:45:49 +04:00
);
try {
personStatement.params.name = name;
personStatement.params.homeURL = homeURL || null;
personStatement.params.iconURL = iconURL || null;
2008-07-15 10:45:49 +04:00
personStatement.step();
let personID = SnowlDatastore.dbConnection.lastInsertRowID;
// XXX lookup favicon in collections table rather than hardcoding
let iconURI =
iconURL ? URI.get(iconURL) :
homeURL ? SnowlSource.faviconSvc.getFaviconForPage(homeURL) :
URI.get("chrome://snowl/skin/person-16.png");
// Create places record, placeID stored into people table record.
//SnowlPlaces._log.info("Author name:iconURI.spec - " + name + " : " + iconURI.spec);
let placeID = SnowlPlaces.persistPlace("people",
personID,
name,
null, // homeURL,
externalID, // externalID,
iconURI,
sourceID);
// Store placeID back into messages for db integrity
SnowlDatastore.dbConnection.executeSimpleSQL(
"UPDATE people " +
"SET placeID = " + placeID +
" WHERE id = " + personID);
2008-07-15 10:45:49 +04:00
identityStatement.params.sourceID = sourceID;
identityStatement.params.externalID = externalID;
identityStatement.params.personID = personID;
identityStatement.step();
let identityID = SnowlDatastore.dbConnection.lastInsertRowID;
identity = new SnowlIdentity(identityID, sourceID, externalID, personID);
}
finally {
personStatement.reset();
identityStatement.reset();
}
return identity;
};
SnowlPerson.__defineGetter__("_getAllStatement",
function() {
let statement = SnowlDatastore.createStatement(
"SELECT id, name, placeID FROM people ORDER BY name"
2008-07-15 10:45:49 +04:00
);
this.__defineGetter__("_getAllStatement", function() { return statement });
return this._getAllStatement;
}
);
SnowlPerson.getAll = function() {
let people = [];
let statement = this._getAllStatement;
try {
while (statement.step())
people.push(new SnowlPerson(statement.row.id,
statement.row.name,
statement.row.placeID));
2008-07-15 10:45:49 +04:00
}
finally {
statement.reset();
}
return people;
}