#include "../include/db/sqlite3db.h"\r
#include "../include/freenet/freenetmasterthread.h"\r
#include "../include/nntp/nntplistener.h"\r
+#include "../include/http/httpthread.h"\r
+#include "../include/threadcontroller.h"\r
\r
#ifdef _WIN32\r
#include <winsock2.h>\r
#include <xmem.h>\r
#endif\r
\r
+bool wantshutdown=false;\r
+\r
void SetupDB()\r
{\r
\r
- SQLite3DB::DB *db=SQLite3DB::DB::instance();\r
+ DateTime date;\r
+ SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
\r
db->Open("fms.db3");\r
db->SetBusyTimeout(10000); // set timeout to 10 seconds\r
db->Execute("VACUUM;");\r
+ \r
+ // TODO remove this - temp fix for problem in 0.1.8\r
+ db->Execute("DELETE FROM tblMessageBoard WHERE MessageID NOT IN (SELECT MessageID FROM tblMessage);");\r
+\r
+ db->Execute("CREATE TABLE IF NOT EXISTS tblDBVersion(\\r
+ Major INTEGER,\\r
+ Minor INTEGER\\r
+ );");\r
+\r
+ SQLite3DB::Statement st=db->Prepare("SELECT Major,Minor FROM tblDBVersion;");\r
+ st.Step();\r
+ if(st.RowReturned())\r
+ {\r
+ int major;\r
+ int minor;\r
+ st.ResultInt(0,major);\r
+ st.ResultInt(1,minor);\r
+ st.Finalize();\r
+ if(major==1 && minor==0)\r
+ {\r
+ ConvertDB0100To0101();\r
+ major=1;\r
+ minor=1;\r
+ }\r
+ if(major==1 && (minor==1 || minor==2))\r
+ {\r
+ ConvertDB0101To0103();\r
+ major=1;\r
+ minor=3;\r
+ }\r
+ if(major==1 && minor==3)\r
+ {\r
+ ConvertDB0103To0104();\r
+ major=1;\r
+ minor=4;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ db->Execute("INSERT INTO tblDBVersion(Major,Minor) VALUES(1,4);");\r
+ }\r
+\r
+ db->Execute("UPDATE tblDBVersion SET Major=1, Minor=4;");\r
\r
db->Execute("CREATE TABLE IF NOT EXISTS tblOption(\\r
Option TEXT UNIQUE,\\r
db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentity(\\r
LocalIdentityID INTEGER PRIMARY KEY,\\r
Name TEXT,\\r
- PublicKey TEXT,\\r
- PrivateKey TEXT,\\r
+ PublicKey TEXT UNIQUE,\\r
+ PrivateKey TEXT UNIQUE,\\r
SingleUse BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
PublishTrustList BOOL CHECK(PublishTrustList IN('true','false')) DEFAULT 'false',\\r
PublishBoardList BOOL CHECK(PublishBoardList IN('true','false')) DEFAULT 'false',\\r
InsertingBoardList BOOL CHECK(InsertingBoardList IN('true','false')) DEFAULT 'false',\\r
LastInsertedBoardList DATETIME,\\r
InsertingMessageList BOOL CHECK(InsertingMessageList IN('true','false')) DEFAULT 'false',\\r
- LastInsertedMessageList DATETIME\\r
+ LastInsertedMessageList DATETIME,\\r
+ DateCreated DATETIME\\r
);");\r
\r
db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentityInserts(\\r
\r
db->Execute("CREATE TABLE IF NOT EXISTS tblIdentity(\\r
IdentityID INTEGER PRIMARY KEY,\\r
- PublicKey TEXT,\\r
+ PublicKey TEXT UNIQUE,\\r
Name TEXT,\\r
SingleUse BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
PublishTrustList BOOL CHECK(PublishTrustList IN('true','false')) DEFAULT 'false',\\r
PublishBoardList BOOL CHECK(PublishBoardList IN('true','false')) DEFAULT 'false',\\r
DateAdded DATETIME,\\r
LastSeen DATETIME,\\r
- LocalMessageTrust INTEGER CHECK(LocalMessageTrust BETWEEN 0 AND 100) DEFAULT 50,\\r
- PeerMessageTrust INTEGER CHECK(PeerMessageTrust BETWEEN 0 AND 100) DEFAULT 50,\\r
- LocalTrustListTrust INTEGER CHECK(LocalTrustListTrust BETWEEN 0 AND 100) DEFAULT 50,\\r
- PeerTrustListTrust INTEGER CHECK(PeerTrustListTrust BETWEEN 0 AND 100) DEFAULT 50\\r
+ LocalMessageTrust INTEGER CHECK(LocalMessageTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
+ PeerMessageTrust INTEGER CHECK(PeerMessageTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
+ LocalTrustListTrust INTEGER CHECK(LocalTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
+ PeerTrustListTrust INTEGER CHECK(PeerTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL\\r
);");\r
\r
db->Execute("CREATE TABLE IF NOT EXISTS tblIdentityRequests(\\r
);");\r
\r
db->Execute("CREATE TABLE IF NOT EXISTS tblBoard(\\r
- BoardID INTEGER PRIMARY KEY,\\r
- BoardName TEXT UNIQUE,\\r
- BoardDescription TEXT,\\r
- DateAdded DATETIME\\r
+ BoardID INTEGER PRIMARY KEY,\\r
+ BoardName TEXT UNIQUE,\\r
+ BoardDescription TEXT,\\r
+ DateAdded DATETIME,\\r
+ SaveReceivedMessages BOOL CHECK(SaveReceivedMessages IN('true','false')) DEFAULT 'true'\\r
);");\r
\r
- db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded) VALUES('fms','Freenet Message System','2007-12-01');");\r
- db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded) VALUES('freenet','Discussion about Freenet','2007-12-01');");\r
- db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded) VALUES('public','Public discussion','2007-12-01');");\r
- db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded) VALUES('test','Test board','2007-12-01');");\r
+ db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded) VALUES('fms','Freenet Message System','2007-12-01 12:00:00');");\r
+ db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded) VALUES('freenet','Discussion about Freenet','2007-12-01 12:00:00');");\r
+ db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded) VALUES('public','Public discussion','2007-12-01 12:00:00');");\r
+ db->Execute("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded) VALUES('test','Test board','2007-12-01 12:00:00');");\r
\r
db->Execute("CREATE TABLE IF NOT EXISTS tblMessage(\\r
MessageID INTEGER PRIMARY KEY,\\r
Subject TEXT,\\r
MessageUUID TEXT UNIQUE,\\r
ReplyBoardID INTEGER,\\r
- Body TEXT\\r
+ Body TEXT,\\r
+ MessageIndex INTEGER\\r
);");\r
\r
db->Execute("CREATE TABLE IF NOT EXISTS tblMessageReplyTo(\\r
MessageID INTEGER,\\r
- ReplyToMessageUUID INTEGER,\\r
+ ReplyToMessageUUID TEXT,\\r
ReplyOrder INTEGER\\r
);");\r
\r
Found BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
);");\r
\r
+ db->Execute("CREATE UNIQUE INDEX IF NOT EXISTS idxMessageRequest ON tblMessageRequests(IdentityID,Day,RequestIndex);");\r
+\r
db->Execute("CREATE TABLE IF NOT EXISTS tblMessageInserts(\\r
LocalIdentityID INTEGER,\\r
Day DATE,\\r
Inserted BOOL CHECK(Inserted IN('true','false')) DEFAULT 'false'\\r
);");\r
\r
+ db->Execute("CREATE TABLE IF NOT EXISTS tblAdministrationBoard(\\r
+ BoardID INTEGER UNIQUE,\\r
+ ModifyLocalMessageTrust INTEGER,\\r
+ ModifyLocalTrustListTrust INTEGER\\r
+ );");\r
+\r
+ db->Execute("CREATE TABLE IF NOT EXISTS tblBoardListInserts(\\r
+ LocalIdentityID INTEGER,\\r
+ Day DATE,\\r
+ InsertIndex INTEGER,\\r
+ Inserted BOOL CHECK(Inserted IN('true','false')) DEFAULT 'false'\\r
+ );");\r
+\r
+ db->Execute("CREATE TABLE IF NOT EXISTS tblBoardListRequests(\\r
+ IdentityID INTEGER,\\r
+ Day DATE,\\r
+ RequestIndex INTEGER,\\r
+ Found BOOL CHECK(Found IN('true','false')) DEFAULT 'false'\\r
+ );"); \r
+\r
+ // MessageInserter will insert a record into this temp table which the MessageListInserter will query for and insert a MessageList when needed\r
+ db->Execute("CREATE TEMPORARY TABLE IF NOT EXISTS tmpMessageListInsert(\\r
+ LocalIdentityID INTEGER,\\r
+ Date DATETIME\\r
+ );");\r
+\r
// low / high / message count for each board\r
db->Execute("CREATE VIEW IF NOT EXISTS vwBoardStats AS \\r
SELECT tblBoard.BoardID AS 'BoardID', IFNULL(MIN(MessageID),0) AS 'LowMessageID', IFNULL(MAX(MessageID),0) AS 'HighMessageID', COUNT(MessageID) AS 'MessageCount' \\r
FROM tblBoard LEFT JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID \\r
- WHERE MessageID>=0 \\r
+ WHERE MessageID>=0 OR MessageID IS NULL \\r
GROUP BY tblBoard.BoardID;");\r
\r
// calculates peer trust\r
+ // do the (MessageTrust+1)*LocalTrustListTrust/(MessageTrust+1)/100.0 - so it MessageTrust or TrustListTrust is NULL, the calc will be NULL and it won't be included at all in the average\r
+ // need the +1 so that when the values are 0 the result is not 0\r
+ db->Execute("DROP VIEW IF EXISTS vwCalculatedPeerTrust;");\r
db->Execute("CREATE VIEW IF NOT EXISTS vwCalculatedPeerTrust AS \\r
SELECT TargetIdentityID, \\r
- ROUND(SUM(MessageTrust*(LocalMessageTrust/100.0))/SUM(LocalMessageTrust/100.0),0) AS 'PeerMessageTrust', \\r
- ROUND(SUM(TrustListTrust*(LocalTrustListTrust/100.0))/SUM(LocalTrustListTrust/100.0),0) AS 'PeerTrustListTrust' \\r
+ ROUND(SUM(MessageTrust*(LocalTrustListTrust/100.0))/SUM(((MessageTrust+1)*LocalTrustListTrust/(MessageTrust+1))/100.0),0) AS 'PeerMessageTrust', \\r
+ ROUND(SUM(TrustListTrust*(LocalTrustListTrust/100.0))/SUM(((TrustListTrust+1)*LocalTrustListTrust/(TrustListTrust+1))/100.0),0) AS 'PeerTrustListTrust' \\r
FROM tblPeerTrust INNER JOIN tblIdentity ON tblPeerTrust.IdentityID=tblIdentity.IdentityID \\r
WHERE LocalTrustListTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalTrustListTrust') \\r
+ AND ( PeerTrustListTrust IS NULL OR PeerTrustListTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerTrustListTrust') ) \\r
GROUP BY TargetIdentityID;");\r
\r
+ /*\r
+ These peer trust calculations are too CPU intensive to be triggers - they were called every time a new trust list was processed\r
+ All trust levels will now be recalculated every hour in the PeriodicDBMaintenance class\r
+ */\r
+ // drop existing triggers\r
+ db->Execute("DROP TRIGGER IF EXISTS trgDeleteOntblPeerTrust;");\r
+ db->Execute("DROP TRIGGER IF EXISTS trgInsertOntblPeerTrust;");\r
+ db->Execute("DROP TRIGGER IF EXISTS trgUpdateOntblPeerTrust;");\r
+ db->Execute("DROP TRIGGER IF EXISTS trgUpdateLocalTrustLevels;");\r
+/*\r
// update PeerTrustLevel when deleting a record from tblPeerTrust\r
- db->Execute("CREATE TRIGGER trgDeleteOntblPeerTrust AFTER DELETE ON tblPeerTrust \\r
+ db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteOntblPeerTrust AFTER DELETE ON tblPeerTrust \\r
FOR EACH ROW \\r
BEGIN \\r
UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=old.TargetIdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=old.TargetIdentityID) WHERE IdentityID=old.TargetIdentityID;\\r
END;");\r
\r
// update PeerTrustLevel when inserting a record into tblPeerTrust\r
- db->Execute("CREATE TRIGGER trgInsertOntblPeerTrust AFTER INSERT ON tblPeerTrust \\r
+ db->Execute("CREATE TRIGGER IF NOT EXISTS trgInsertOntblPeerTrust AFTER INSERT ON tblPeerTrust \\r
FOR EACH ROW \\r
BEGIN \\r
UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=new.TargetIdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=new.TargetIdentityID) WHERE IdentityID=new.TargetIdentityID;\\r
END;");\r
\r
// update PeerTrustLevel when updating a record in tblPeerTrust\r
- db->Execute("CREATE TRIGGER trgUpdateOntblPeerTrust AFTER UPDATE ON tblPeerTrust \\r
+ db->Execute("CREATE TRIGGER IF NOT EXISTS trgUpdateOntblPeerTrust AFTER UPDATE ON tblPeerTrust \\r
FOR EACH ROW \\r
BEGIN \\r
UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=old.TargetIdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=old.TargetIdentityID) WHERE IdentityID=old.TargetIdentityID;\\r
END;");\r
\r
// recalculate all Peer TrustLevels when updating Local TrustLevels on tblIdentity - doesn't really need to be all, but rather all identities the updated identity has a trust level for. It's easier to update everyone for now.\r
- db->Execute("CREATE TRIGGER trgUpdateLocalTrustLevels AFTER UPDATE OF LocalMessageTrust,LocalTrustListTrust ON tblIdentity \\r
+ db->Execute("CREATE TRIGGER IF NOT EXISTS trgUpdateLocalTrustLevels AFTER UPDATE OF LocalMessageTrust,LocalTrustListTrust ON tblIdentity \\r
FOR EACH ROW \\r
BEGIN \\r
UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=IdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=IdentityID);\\r
END;");\r
+*/\r
+\r
+ db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteMessage AFTER DELETE ON tblMessage \\r
+ FOR EACH ROW \\r
+ BEGIN \\r
+ DELETE FROM tblMessageBoard WHERE tblMessageBoard.MessageID=old.MessageID;\\r
+ DELETE FROM tblMessageReplyTo WHERE tblMessageReplyTo.MessageID=old.MessageID;\\r
+ END;");\r
+\r
+ db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteIdentity AFTER DELETE ON tblIdentity \\r
+ FOR EACH ROW \\r
+ BEGIN \\r
+ DELETE FROM tblIdentityRequests WHERE IdentityID=old.IdentityID;\\r
+ DELETE FROM tblIntroductionPuzzleRequests WHERE IdentityID=old.IdentityID;\\r
+ DELETE FROM tblMessageListRequests WHERE IdentityID=old.IdentityID;\\r
+ DELETE FROM tblMessageRequests WHERE IdentityID=old.IdentityID;\\r
+ DELETE FROM tblPeerTrust WHERE IdentityID=old.IdentityID;\\r
+ DELETE FROM tblTrustListRequests WHERE IdentityID=old.IdentityID;\\r
+ END;");\r
+\r
+ db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteLocalIdentity AFTER DELETE ON tblLocalIdentity \\r
+ FOR EACH ROW \\r
+ BEGIN \\r
+ DELETE FROM tblIdentityIntroductionInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
+ DELETE FROM tblIntroductionPuzzleInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
+ DELETE FROM tblLocalIdentityInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
+ DELETE FROM tblMessageInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
+ DELETE FROM tblMessageListInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
+ DELETE FROM tblTrustListInserts WHERE LocalIdentityID=old.LocalIdentityID;\\r
+ END;");\r
+\r
+ db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteBoard AFTER DELETE ON tblBoard \\r
+ FOR EACH ROW \\r
+ BEGIN \\r
+ DELETE FROM tblMessageBoard WHERE BoardID=old.BoardID;\\r
+ END;");\r
\r
// delete introduction puzzles that were half-way inserted\r
db->Execute("DELETE FROM tblIntroductionPuzzleInserts WHERE Day IS NULL AND InsertIndex IS NULL;");\r
\r
+ // delete stale introduction puzzles (2 or more days old)\r
+ date.SetToGMTime();\r
+ date.Add(0,0,0,-2);\r
+ db->Execute("DELETE FROM tblIntroductionPuzzleInserts WHERE Day<='"+date.Format("%Y-%m-%d")+"';");\r
+ db->Execute("DELETE FROM tblIntroductionPuzzleRequests WHERE Day<='"+date.Format("%Y-%m-%d")+"';");\r
+\r
+ date.SetToGMTime();\r
+ // insert SomeDude's public key\r
+ db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded,LocalTrustListTrust) VALUES('SSK@NuBL7aaJ6Cn4fB7GXFb9Zfi8w1FhPyW3oKgU9TweZMw,iXez4j3qCpd596TxXiJgZyTq9o-CElEuJxm~jNNZAuA,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"',51);");\r
+ // insert Shadow Panther's public key\r
+ db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded) VALUES('SSK@~mimyB1kmH4f7Cgsd2wM2Qv2NxrZHRMM6IY8~7EWRVQ,fxTKkR0TYhgMYb-vEGAv55sMOxCGD2xhE4ZxWHxdPz4,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"');");\r
+ // insert garfield's public key\r
+ db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded) VALUES('SSK@T8l1IEGU4-PoASFzgc2GYhIgRzUvZsKdoQWeuLHuTmM,QLxAPfkGis8l5NafNpSCdbxzXhBlu9WL8svcqJw9Mpo,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"');");\r
+\r
+}\r
+\r
+void ConvertDB0100To0101()\r
+{\r
+ // added unique constraint to public and private key\r
+ SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
+ db->Execute("CREATE TEMPORARY TABLE tblLocalIdentityTemp AS SELECT * FROM tblLocalIdentity;");\r
+ db->Execute("DROP TABLE IF EXISTS tblLocalIdentity;");\r
+ db->Execute("CREATE TABLE IF NOT EXISTS tblLocalIdentity(\\r
+ LocalIdentityID INTEGER PRIMARY KEY,\\r
+ Name TEXT,\\r
+ PublicKey TEXT UNIQUE,\\r
+ PrivateKey TEXT UNIQUE,\\r
+ SingleUse BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
+ PublishTrustList BOOL CHECK(PublishTrustList IN('true','false')) DEFAULT 'false',\\r
+ PublishBoardList BOOL CHECK(PublishBoardList IN('true','false')) DEFAULT 'false',\\r
+ InsertingIdentity BOOL CHECK(InsertingIdentity IN('true','false')) DEFAULT 'false',\\r
+ LastInsertedIdentity DATETIME,\\r
+ InsertingPuzzle BOOL CHECK(InsertingPuzzle IN('true','false')) DEFAULT 'false',\\r
+ LastInsertedPuzzle DATETIME,\\r
+ InsertingTrustList BOOL CHECK(InsertingTrustList IN('true','false')) DEFAULT 'false',\\r
+ LastInsertedTrustList DATETIME,\\r
+ InsertingBoardList BOOL CHECK(InsertingBoardList IN('true','false')) DEFAULT 'false',\\r
+ LastInsertedBoardList DATETIME,\\r
+ InsertingMessageList BOOL CHECK(InsertingMessageList IN('true','false')) DEFAULT 'false',\\r
+ LastInsertedMessageList DATETIME\\r
+ );");\r
+ db->Execute("INSERT INTO tblLocalIdentity SELECT * FROM tblLocalIdentityTemp;");\r
+ db->Execute("DROP TABLE IF EXISTS tblLocalIdentityTemp;");\r
+ db->Execute("UPDATE tblDBVersion SET Major=1, Minor=1;");\r
+}\r
+\r
+void ConvertDB0101To0103()\r
+{\r
+ // remove default 50 from trust fields and set default to NULL\r
+ SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
+ db->Execute("CREATE TEMPORARY TABLE tblIdentityTemp AS SELECT * FROM tblIdentity;");\r
+ db->Execute("DROP TABLE IF EXISTS tblIdentity;");\r
+ db->Execute("CREATE TABLE IF NOT EXISTS tblIdentity(\\r
+ IdentityID INTEGER PRIMARY KEY,\\r
+ PublicKey TEXT UNIQUE,\\r
+ Name TEXT,\\r
+ SingleUse BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\\r
+ PublishTrustList BOOL CHECK(PublishTrustList IN('true','false')) DEFAULT 'false',\\r
+ PublishBoardList BOOL CHECK(PublishBoardList IN('true','false')) DEFAULT 'false',\\r
+ DateAdded DATETIME,\\r
+ LastSeen DATETIME,\\r
+ LocalMessageTrust INTEGER CHECK(LocalMessageTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
+ PeerMessageTrust INTEGER CHECK(PeerMessageTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
+ LocalTrustListTrust INTEGER CHECK(LocalTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL,\\r
+ PeerTrustListTrust INTEGER CHECK(PeerTrustListTrust BETWEEN 0 AND 100) DEFAULT NULL\\r
+ );");\r
+ db->Execute("INSERT INTO tblIdentity SELECT * FROM tblIdentityTemp;");\r
+ db->Execute("DROP TABLE IF EXISTS tblIdentityTemp;");\r
+\r
+ // add SaveReceivedMessages field to tblBoard\r
+ db->Execute("ALTER TABLE tblBoard ADD COLUMN SaveReceivedMessages BOOL CHECK(SaveReceivedMessages IN('true','false')) DEFAULT 'true';");\r
+\r
+ db->Execute("UPDATE tblDBVersion SET Major=1, Minor=3;");\r
+}\r
+\r
+void ConvertDB0103To0104()\r
+{\r
+ // add MessageIndex to tblMessage\r
+ DateTime date;\r
+ SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
+ db->Execute("ALTER TABLE tblMessage ADD COLUMN MessageIndex INTEGER;");\r
+ db->Execute("CREATE UNIQUE INDEX IF NOT EXISTS idxMessageRequest ON tblMessageRequests(IdentityID,Day,RequestIndex);");\r
+ db->Execute("ALTER TABLE tblLocalIdentity ADD COLUMN DateCreated DATETIME;");\r
+ date.SetToGMTime();\r
+ db->Execute("UPDATE tblLocalIdentity SET DateCreated='"+date.Format("%Y-%m-%d %H:%M:%S")+"' WHERE DateCreated IS NULL;");\r
+ db->Execute("UPDATE tblDBVersion SET Major=1, Minor=4;");\r
}\r
\r
void SetupDefaultOptions()\r
// OptionValue should always be inserted as a string, even if the option really isn't a string - just to keep the field data type consistent\r
\r
std::ostringstream tempstr; // must set tempstr to "" between db inserts\r
- SQLite3DB::DB *db=SQLite3DB::DB::instance();\r
+ SQLite3DB::DB *db=SQLite3DB::DB::Instance();\r
SQLite3DB::Statement st=db->Prepare("INSERT INTO tblOption(Option,OptionValue,OptionDescription) VALUES(?,?,?);");\r
\r
// LogLevel\r
// StartNNTP\r
st.Bind(0,"StartNNTP");\r
st.Bind(1,"true");\r
- st.Bind(2,"Start NNTP service.");\r
+ st.Bind(2,"Start NNTP server.");\r
+ st.Step();\r
+ st.Reset();\r
+\r
+ st.Bind(0,"StartHTTP");\r
+ st.Bind(1,"true");\r
+ st.Bind(2,"Start HTTP server.");\r
+ st.Step();\r
+ st.Reset();\r
+\r
+ st.Bind(0,"HTTPListenPort");\r
+ st.Bind(1,"8080");\r
+ st.Bind(2,"Port HTTP server will listen on.");\r
st.Step();\r
st.Reset();\r
\r
\r
// FCPHost\r
st.Bind(0,"FCPHost");\r
- st.Bind(1,"localhost");\r
+ st.Bind(1,"127.0.0.1");\r
st.Bind(2,"Host name or address of Freenet node.");\r
st.Step();\r
st.Reset();\r
st.Step();\r
st.Reset();\r
\r
+ st.Bind(0,"MinPeerMessageTrust");\r
+ st.Bind(1,"30");\r
+ st.Bind(2,"Specifies a peer message trust level that a peer must have before its messages will be downloaded.");\r
+ st.Step();\r
+ st.Reset();\r
+\r
st.Bind(0,"MinLocalTrustListTrust");\r
- st.Bind(1,"50");\r
+ st.Bind(1,"51");\r
st.Bind(2,"Specifies a local trust list trust level that a peer must have before its trust list will be included in the weighted average. Any peers below this number will be excluded from the results.");\r
st.Step();\r
st.Reset();\r
\r
+ st.Bind(0,"MinPeerTrustListTrust");\r
+ st.Bind(1,"30");\r
+ st.Bind(2,"Specifies a peer trust list trust level that a peer must have before its trust list will be included in the weighted average. Any peers below this number will be excluded from the results.");\r
+ st.Step();\r
+ st.Reset();\r
+\r
st.Bind(0,"MessageDownloadMaxDaysBackward");\r
- st.Bind(1,"3");\r
+ st.Bind(1,"5");\r
st.Bind(2,"The maximum number of days backward that messages will be downloaded from each identity");\r
st.Step();\r
st.Reset();\r
\r
st.Bind(0,"MessageListDaysBackward");\r
- st.Bind(1,"3");\r
+ st.Bind(1,"5");\r
st.Bind(2,"The number of days backward that messages you have inserted will appear in your MessageLists");\r
st.Step();\r
st.Reset();\r
\r
+ st.Bind(0,"MaxPeerMessagesPerDay");\r
+ st.Bind(1,"200");\r
+ st.Bind(2,"The maximum number of messages you will download from each peer on a given day.");\r
+ st.Step();\r
+ st.Reset();\r
+\r
+ st.Bind(0,"MaxBoardListRequests");\r
+ st.Bind(1,"5");\r
+ st.Bind(2,"The maximum number of concurrent requests for new Board Lists. Set to 0 to disable.");\r
+ st.Step();\r
+ st.Reset();\r
+\r
+ st.Bind(0,"MaxBoardsPerMessage");\r
+ st.Bind(1,"8");\r
+ st.Bind(2,"The maximum number of boards a received message may be sent to. Boards over this limit will be ignored.");\r
+ st.Step();\r
+ st.Reset();\r
+\r
+ st.Bind(0,"ChangeMessageTrustOnReply");\r
+ st.Bind(1,"0");\r
+ st.Bind(2,"How much the local message trust level of an identity should change when you reply to one of their messages.");\r
+ st.Step();\r
+ st.Reset();\r
+\r
+ st.Bind(0,"AddNewPostFromIdentities");\r
+ st.Bind(1,"false");\r
+ st.Bind(2,"Set to true to automatically create new identities when you send a message using a new name. If you set this to false, posting messages will fail until you manually create the identity.");\r
+ st.Step();\r
+ st.Reset();\r
+\r
}\r
\r
void SetupLogFile()\r
\r
date.SetToGMTime();\r
\r
- LogFile::instance()->SetFileName("fms-"+date.Format("%Y-%m-%d")+".log");\r
- LogFile::instance()->OpenFile();\r
- LogFile::instance()->SetWriteNewLine(true);\r
- LogFile::instance()->SetWriteDate(true);\r
- LogFile::instance()->SetWriteLogLevel(true);\r
+ LogFile::Instance()->SetFileName("fms-"+date.Format("%Y-%m-%d")+".log");\r
+ LogFile::Instance()->OpenFile();\r
+ LogFile::Instance()->SetWriteNewLine(true);\r
+ LogFile::Instance()->SetWriteDate(true);\r
+ LogFile::Instance()->SetWriteLogLevel(true);\r
\r
- if(Option::instance()->Get("LogLevel",configval)==false)\r
+ if(Option::Instance()->Get("LogLevel",configval)==false)\r
{\r
configval="4";\r
- Option::instance()->Set("LogLevel",configval);\r
+ Option::Instance()->Set("LogLevel",configval);\r
}\r
if(StringFunctions::Convert(configval,loglevel)==false)\r
{\r
loglevel=LogFile::LOGLEVEL_DEBUG;\r
- Option::instance()->Set("LogLevel",loglevel);\r
+ Option::Instance()->Set("LogLevel",loglevel);\r
}\r
- LogFile::instance()->SetLogLevel((LogFile::LogLevel)loglevel);\r
+ LogFile::Instance()->SetLogLevel((LogFile::LogLevel)loglevel);\r
}\r
\r
void SetupNetwork()\r
#endif\r
}\r
\r
+void Shutdown()\r
+{\r
+ ThreadController::Instance()->ShutdownThreads();\r
+\r
+ ShutdownNetwork();\r
+\r
+ LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_INFO,"FMS shutdown");\r
+ LogFile::Instance()->WriteNewLine();\r
+}\r
+\r
void ShutdownNetwork()\r
{\r
#ifdef _WIN32\r
#endif\r
}\r
\r
-void ShutdownThreads(std::vector<ZThread::Thread *> &threads)\r
+void SigHandler(int signum)\r
+{\r
+ Shutdown();\r
+ exit(0);\r
+}\r
+\r
+/*\r
+void ShutdownThreads(std::vector<PThread::Thread *> &threads)\r
{\r
- std::vector<ZThread::Thread *>::iterator i;\r
+ std::vector<PThread::Thread *>::iterator i;\r
for(i=threads.begin(); i!=threads.end(); i++)\r
{\r
- if((*i)->wait(1)==false)\r
- {\r
- try\r
- {\r
- (*i)->interrupt();\r
- }\r
- catch(...)\r
- {\r
- }\r
- }\r
+ (*i)->Cancel();\r
}\r
\r
for(i=threads.begin(); i!=threads.end(); i++)\r
{\r
- (*i)->wait();\r
+ LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"ShutdownThreads waiting for thread to exit.");\r
+ //(*i)->wait();\r
+ (*i)->Join();\r
delete (*i);\r
}\r
\r
\r
}\r
\r
-void StartThreads(std::vector<ZThread::Thread *> &threads)\r
+void StartThreads(std::vector<PThread::Thread *> &threads)\r
{\r
std::string startfreenet;\r
std::string startnntp;\r
+ std::string starthttp;\r
\r
- if(Option::instance()->Get("StartFreenetUpdater",startfreenet)==false)\r
+ if(Option::Instance()->Get("StartFreenetUpdater",startfreenet)==false)\r
{\r
startfreenet="true";\r
- Option::instance()->Set("StartFreenetUpdater","true");\r
+ Option::Instance()->Set("StartFreenetUpdater","true");\r
}\r
\r
- if(Option::instance()->Get("StartNNTP",startnntp)==false)\r
+ if(Option::Instance()->Get("StartNNTP",startnntp)==false)\r
{\r
startnntp="true";\r
- Option::instance()->Set("StartNNTP","true");\r
+ Option::Instance()->Set("StartNNTP","true");\r
+ }\r
+\r
+ if(Option::Instance()->Get("StartHTTP",starthttp)==false)\r
+ {\r
+ starthttp="true";\r
+ Option::Instance()->Set("StartHTTP","true");\r
}\r
\r
if(startfreenet=="true")\r
{\r
- ZThread::Thread *t=new ZThread::Thread(new FreenetMasterThread());\r
+ PThread::Thread *t=new PThread::Thread(new FreenetMasterThread());\r
threads.push_back(t);\r
}\r
\r
if(startnntp=="true")\r
{\r
- ZThread::Thread *t=new ZThread::Thread(new NNTPListener());\r
+ PThread::Thread *t=new PThread::Thread(new NNTPListener());\r
+ threads.push_back(t);\r
+ }\r
+\r
+ if(starthttp=="true")\r
+ {\r
+ PThread::Thread *t=new PThread::Thread(new HTTPThread());\r
threads.push_back(t);\r
}\r
\r
}\r
+*/\r