X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fglobal.cpp;h=8552db28565f05c91f67b8a66a7d8a84c44b7e12;hb=c7fcb4c4bc5012a584add81a9509fc1f84c3c688;hp=cf531de12b95b11430bcaeced84728a7cdf9f22b;hpb=6b896a9e1dc143bba86795be1e9336549db9b85f;p=fms.git diff --git a/src/global.cpp b/src/global.cpp index cf531de..8552db2 100644 --- a/src/global.cpp +++ b/src/global.cpp @@ -18,7 +18,8 @@ void SetupDB() { - SQLite3DB::DB *db=SQLite3DB::DB::instance(); + DateTime date; + SQLite3DB::DB *db=SQLite3DB::DB::Instance(); db->Open("fms.db3"); db->SetBusyTimeout(10000); // set timeout to 10 seconds @@ -83,7 +84,7 @@ void SetupDB() db->Execute("CREATE TABLE IF NOT EXISTS tblIdentity(\ IdentityID INTEGER PRIMARY KEY,\ - PublicKey TEXT,\ + PublicKey TEXT UNIQUE,\ Name TEXT,\ SingleUse BOOL CHECK(SingleUse IN('true','false')) DEFAULT 'false',\ PublishTrustList BOOL CHECK(PublishTrustList IN('true','false')) DEFAULT 'false',\ @@ -155,7 +156,7 @@ void SetupDB() db->Execute("CREATE TABLE IF NOT EXISTS tblMessageReplyTo(\ MessageID INTEGER,\ - ReplyToMessageUUID INTEGER,\ + ReplyToMessageUUID TEXT,\ ReplyOrder INTEGER\ );"); @@ -195,38 +196,47 @@ void SetupDB() Inserted BOOL CHECK(Inserted IN('true','false')) DEFAULT 'false'\ );"); + // MessageInserter will insert a record into this temp table which the MessageListInserter will query for and insert a MessageList when needed + db->Execute("CREATE TEMPORARY TABLE IF NOT EXISTS tmpMessageListInsert(\ + LocalIdentityID INTEGER,\ + Date DATETIME\ + );"); + // low / high / message count for each board - db->Execute("CREATE VIEW IF NOT EXISTS vwBoardStats AS \ + db->Execute("DROP VIEW IF EXISTS vwBoardStats; \ + CREATE VIEW IF NOT EXISTS vwBoardStats AS \ SELECT tblBoard.BoardID AS 'BoardID', IFNULL(MIN(MessageID),0) AS 'LowMessageID', IFNULL(MAX(MessageID),0) AS 'HighMessageID', COUNT(MessageID) AS 'MessageCount' \ FROM tblBoard LEFT JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID \ - WHERE MessageID>=0 \ + WHERE MessageID>=0 OR MessageID IS NULL \ GROUP BY tblBoard.BoardID;"); // calculates peer trust - db->Execute("CREATE VIEW IF NOT EXISTS vwCalculatedPeerTrust AS \ + db->Execute("DROP VIEW IF EXISTS vwCalculatedPeerTrust; \ + CREATE VIEW IF NOT EXISTS vwCalculatedPeerTrust AS \ SELECT TargetIdentityID, \ ROUND(SUM(MessageTrust*(LocalMessageTrust/100.0))/SUM(LocalMessageTrust/100.0),0) AS 'PeerMessageTrust', \ ROUND(SUM(TrustListTrust*(LocalTrustListTrust/100.0))/SUM(LocalTrustListTrust/100.0),0) AS 'PeerTrustListTrust' \ FROM tblPeerTrust INNER JOIN tblIdentity ON tblPeerTrust.IdentityID=tblIdentity.IdentityID \ WHERE LocalTrustListTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalTrustListTrust') \ + AND ( PeerTrustListTrust IS NULL OR PeerTrustListTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerTrustListTrust') ) \ GROUP BY TargetIdentityID;"); // update PeerTrustLevel when deleting a record from tblPeerTrust - db->Execute("CREATE TRIGGER trgDeleteOntblPeerTrust AFTER DELETE ON tblPeerTrust \ + db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteOntblPeerTrust AFTER DELETE ON tblPeerTrust \ FOR EACH ROW \ BEGIN \ 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;\ END;"); // update PeerTrustLevel when inserting a record into tblPeerTrust - db->Execute("CREATE TRIGGER trgInsertOntblPeerTrust AFTER INSERT ON tblPeerTrust \ + db->Execute("CREATE TRIGGER IF NOT EXISTS trgInsertOntblPeerTrust AFTER INSERT ON tblPeerTrust \ FOR EACH ROW \ BEGIN \ 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;\ END;"); // update PeerTrustLevel when updating a record in tblPeerTrust - db->Execute("CREATE TRIGGER trgUpdateOntblPeerTrust AFTER UPDATE ON tblPeerTrust \ + db->Execute("CREATE TRIGGER IF NOT EXISTS trgUpdateOntblPeerTrust AFTER UPDATE ON tblPeerTrust \ FOR EACH ROW \ BEGIN \ 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;\ @@ -234,15 +244,54 @@ void SetupDB() END;"); // 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. - db->Execute("CREATE TRIGGER trgUpdateLocalTrustLevels AFTER UPDATE OF LocalMessageTrust,LocalTrustListTrust ON tblIdentity \ + db->Execute("CREATE TRIGGER IF NOT EXISTS trgUpdateLocalTrustLevels AFTER UPDATE OF LocalMessageTrust,LocalTrustListTrust ON tblIdentity \ FOR EACH ROW \ BEGIN \ UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=IdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=IdentityID);\ END;"); + db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteMessage AFTER DELETE ON tblMessage \ + FOR EACH ROW \ + BEGIN \ + DELETE FROM tblMessageBoard WHERE tblMessageBoard.MessageID=old.MessageID;\ + DELETE FROM tblMessageReplyTo WHERE tblMessageReplyTo.MessageID=old.MessageID;\ + END;"); + + db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteIdentity AFTER DELETE ON tblIdentity \ + FOR EACH ROW \ + BEGIN \ + DELETE FROM tblIdentityRequests WHERE IdentityID=old.IdentityID;\ + DELETE FROM tblIntroductionPuzzleRequests WHERE IdentityID=old.IdentityID;\ + DELETE FROM tblMessageListRequests WHERE IdentityID=old.IdentityID;\ + DELETE FROM tblMessageRequests WHERE IdentityID=old.IdentityID;\ + DELETE FROM tblPeerTrust WHERE IdentityID=old.IdentityID;\ + DELETE FROM tblTrustListRequests WHERE IdentityID=old.IdentityID;\ + END;"); + + db->Execute("CREATE TRIGGER IF NOT EXISTS trgDeleteLocalIdentity AFTER DELETE ON tblLocalIdentity \ + FOR EACH ROW \ + BEGIN \ + DELETE FROM tblIdentityIntroductionInserts WHERE LocalIdentityID=old.LocalIdentityID;\ + DELETE FROM tblIntroductionPuzzleInserts WHERE LocalIdentityID=old.LocalIdentityID;\ + DELETE FROM tblLocalIdentityInserts WHERE LocalIdentityID=old.LocalIdentityID;\ + DELETE FROM tblMessageInserts WHERE LocalIdentityID=old.LocalIdentityID;\ + DELETE FROM tblMessageListInserts WHERE LocalIdentityID=old.LocalIdentityID;\ + DELETE FROM tblTrustListInserts WHERE LocalIdentityID=old.LocalIdentityID;\ + END;"); + // delete introduction puzzles that were half-way inserted db->Execute("DELETE FROM tblIntroductionPuzzleInserts WHERE Day IS NULL AND InsertIndex IS NULL;"); + // delete stale introduction puzzles (2 or more days old) + date.SetToGMTime(); + date.Add(0,0,0,-2); + db->Execute("DELETE FROM tblIntroductionPuzzleInserts WHERE Day<='"+date.Format("%Y-%m-%d")+"';"); + db->Execute("DELETE FROM tblIntroductionPuzzleRequests WHERE Day<='"+date.Format("%Y-%m-%d")+"';"); + + // insert SomeDude's public key + date.SetToGMTime(); +// db->Execute("INSERT INTO tblIdentity(PublicKey,DateAdded) VALUES('SSK@NuBL7aaJ6Cn4fB7GXFb9Zfi8w1FhPyW3oKgU9TweZMw,iXez4j3qCpd596TxXiJgZyTq9o-CElEuJxm~jNNZAuA,AQACAAE/','"+date.Format("%Y-%m-%d %H:%M:%S")+"');"); + } void SetupDefaultOptions() @@ -250,7 +299,7 @@ void SetupDefaultOptions() // 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 std::ostringstream tempstr; // must set tempstr to "" between db inserts - SQLite3DB::DB *db=SQLite3DB::DB::instance(); + SQLite3DB::DB *db=SQLite3DB::DB::Instance(); SQLite3DB::Statement st=db->Prepare("INSERT INTO tblOption(Option,OptionValue,OptionDescription) VALUES(?,?,?);"); // LogLevel @@ -358,12 +407,24 @@ void SetupDefaultOptions() st.Step(); st.Reset(); + st.Bind(0,"MinPeerMessageTrust"); + st.Bind(1,"25"); + st.Bind(2,"Specifies a peer message trust level that a peer must have before its messages will be downloaded."); + st.Step(); + st.Reset(); + st.Bind(0,"MinLocalTrustListTrust"); st.Bind(1,"50"); 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."); st.Step(); st.Reset(); + st.Bind(0,"MinPeerTrustListTrust"); + st.Bind(1,"25"); + 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."); + st.Step(); + st.Reset(); + st.Bind(0,"MessageDownloadMaxDaysBackward"); st.Bind(1,"3"); st.Bind(2,"The maximum number of days backward that messages will be downloaded from each identity"); @@ -386,23 +447,23 @@ void SetupLogFile() date.SetToGMTime(); - LogFile::instance()->SetFileName("fms-"+date.Format("%Y-%m-%d")+".log"); - LogFile::instance()->OpenFile(); - LogFile::instance()->SetWriteNewLine(true); - LogFile::instance()->SetWriteDate(true); - LogFile::instance()->SetWriteLogLevel(true); + LogFile::Instance()->SetFileName("fms-"+date.Format("%Y-%m-%d")+".log"); + LogFile::Instance()->OpenFile(); + LogFile::Instance()->SetWriteNewLine(true); + LogFile::Instance()->SetWriteDate(true); + LogFile::Instance()->SetWriteLogLevel(true); - if(Option::instance()->Get("LogLevel",configval)==false) + if(Option::Instance()->Get("LogLevel",configval)==false) { configval="4"; - Option::instance()->Set("LogLevel",configval); + Option::Instance()->Set("LogLevel",configval); } if(StringFunctions::Convert(configval,loglevel)==false) { loglevel=LogFile::LOGLEVEL_DEBUG; - Option::instance()->Set("LogLevel",loglevel); + Option::Instance()->Set("LogLevel",loglevel); } - LogFile::instance()->SetLogLevel((LogFile::LogLevel)loglevel); + LogFile::Instance()->SetLogLevel((LogFile::LogLevel)loglevel); } void SetupNetwork() @@ -420,12 +481,12 @@ void ShutdownNetwork() #endif } -void ShutdownThreads(std::vector &threads) +void ShutdownThreads(std::vector &threads) { - std::vector::iterator i; + std::vector::iterator i; for(i=threads.begin(); i!=threads.end(); i++) { - if((*i)->wait(1)==false) +/* if((*i)->wait(1)==false) { try { @@ -435,11 +496,15 @@ void ShutdownThreads(std::vector &threads) { } } + */ + (*i)->Cancel(); } for(i=threads.begin(); i!=threads.end(); i++) { - (*i)->wait(); + LogFile::Instance()->WriteLog(LogFile::LOGLEVEL_DEBUG,"ShutdownThreads waiting for thread to exit."); + //(*i)->wait(); + (*i)->Join(); delete (*i); } @@ -447,32 +512,32 @@ void ShutdownThreads(std::vector &threads) } -void StartThreads(std::vector &threads) +void StartThreads(std::vector &threads) { std::string startfreenet; std::string startnntp; - if(Option::instance()->Get("StartFreenetUpdater",startfreenet)==false) + if(Option::Instance()->Get("StartFreenetUpdater",startfreenet)==false) { startfreenet="true"; - Option::instance()->Set("StartFreenetUpdater","true"); + Option::Instance()->Set("StartFreenetUpdater","true"); } - if(Option::instance()->Get("StartNNTP",startnntp)==false) + if(Option::Instance()->Get("StartNNTP",startnntp)==false) { startnntp="true"; - Option::instance()->Set("StartNNTP","true"); + Option::Instance()->Set("StartNNTP","true"); } if(startfreenet=="true") { - ZThread::Thread *t=new ZThread::Thread(new FreenetMasterThread()); + PThread::Thread *t=new PThread::Thread(new FreenetMasterThread()); threads.push_back(t); } if(startnntp=="true") { - ZThread::Thread *t=new ZThread::Thread(new NNTPListener()); + PThread::Thread *t=new PThread::Thread(new NNTPListener()); threads.push_back(t); }