X-Git-Url: https://git.pterodactylus.net/?p=fms.git;a=blobdiff_plain;f=src%2Fdbmaintenancethread.cpp;h=0563e11556bdab1a0845805da370015b3d63cdd3;hp=0b1349f1c6f20930d019392a49e5fb72fa6a9efd;hb=HEAD;hpb=ed0732b2550c23c05fc9faf925620e87ee6dee12 diff --git a/src/dbmaintenancethread.cpp b/src/dbmaintenancethread.cpp index 0b1349f..0563e11 100644 --- a/src/dbmaintenancethread.cpp +++ b/src/dbmaintenancethread.cpp @@ -4,6 +4,8 @@ #include "../include/threadbuilder.h" #include "../include/dbsetup.h" +#include + #include #include #include @@ -21,42 +23,35 @@ DBMaintenanceThread::DBMaintenanceThread() m_last6hour-=Poco::Timespan(0,5,42,0,0); m_last1day=Poco::Timestamp(); m_last1day-=Poco::Timespan(0,23,51,0,0); - - - } void DBMaintenanceThread::Do10MinuteMaintenance() { + std::vector > m_unthreadedmessages; Option option(m_db); std::string ll(""); option.Get("LogLevel",ll); - // TODO - remove after corruption issue fixed - if(ll=="8") - { - std::string dbres=TestDBIntegrity(m_db); - m_log->trace("DBMaintenanceThread::Do10MinuteMaintenance() start TestDBIntegrity returned "+dbres); - } - ThreadBuilder tb(m_db); SQLite3DB::Statement boardst=m_db->Prepare("SELECT BoardID FROM tblBoard WHERE Forum='true';"); // select messages for a board that aren't in a thread + // This query was causing the db to be locked and a journal file created. + // build a list of boards and messageids and then use that instead of keeping the query in use SQLite3DB::Statement selectst=m_db->Prepare("SELECT tblMessage.MessageID FROM tblMessage \ - INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID\ - LEFT JOIN tblThreadPost ON tblMessage.MessageID=tblThreadPost.MessageID \ - LEFT JOIN tblThread ON tblThreadPost.ThreadID=tblThread.ThreadID\ - WHERE tblMessageBoard.BoardID=? AND tblThread.BoardID IS NULL;"); + INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID \ + LEFT JOIN (SELECT tblThread.BoardID, tblThreadPost.MessageID FROM tblThread INNER JOIN tblThreadPost ON tblThread.ThreadID=tblThreadPost.ThreadID WHERE tblThread.BoardID=?) AS temp1 ON tblMessage.MessageID=temp1.MessageID \ + WHERE tblMessageBoard.BoardID=? AND temp1.BoardID IS NULL;"); boardst.Step(); while(boardst.RowReturned()) { int boardid=-1; - boardst.ResultInt(0,boardid); + boardst.Step(); selectst.Bind(0,boardid); + selectst.Bind(1,boardid); selectst.Step(); while(selectst.RowReturned()) @@ -65,27 +60,46 @@ void DBMaintenanceThread::Do10MinuteMaintenance() selectst.ResultInt(0,messageid); - tb.Build(messageid,boardid,true); + m_unthreadedmessages.push_back(std::pair(boardid,messageid)); selectst.Step(); } selectst.Reset(); - - boardst.Step(); } + selectst.Finalize(); + boardst.Finalize(); - // TODO - remove after corruption issue fixed - if(ll=="8") + for(std::vector >::iterator i=m_unthreadedmessages.begin(); i!=m_unthreadedmessages.end(); i++) { - std::string dbres=TestDBIntegrity(m_db); - m_log->trace("DBMaintenanceThread::Do10MinuteMaintenance() middle TestDBIntegrity returned "+dbres); - if(dbres!="ok") + tb.Build((*i).second,(*i).first,true); + } + + /* + while(boardst.RowReturned()) + { + int boardid=-1; + + boardst.ResultInt(0,boardid); + + selectst.Bind(0,boardid); + selectst.Step(); + + while(selectst.RowReturned()) { - m_db->Execute("REINDEX;"); - dbres=TestDBIntegrity(m_db); - m_log->trace("DBMaintenanceThread::Do10MinuteMaintenenace() middle after reindex returned "+dbres); + int messageid=-1; + + selectst.ResultInt(0,messageid); + + tb.Build(messageid,boardid,true); + + selectst.Step(); } + selectst.Reset(); + + boardst.Step(); + boardst.Reset(); } + */ // now rebuild threads where the message has been deleted SQLite3DB::Statement st=m_db->Prepare("SELECT tblThreadPost.MessageID, tblThread.BoardID FROM tblThreadPost INNER JOIN tblThread ON tblThreadPost.ThreadID=tblThread.ThreadID LEFT JOIN tblMessage ON tblThreadPost.MessageID=tblMessage.MessageID WHERE tblMessage.MessageID IS NULL;"); @@ -111,6 +125,12 @@ void DBMaintenanceThread::Do10MinuteMaintenance() { std::string dbres=TestDBIntegrity(m_db); m_log->trace("DBMaintenanceThread::Do10MinuteMaintenance() end TestDBIntegrity returned "+dbres); + if(dbres!="ok") + { + m_db->Execute("REINDEX;"); + dbres=TestDBIntegrity(m_db); + m_log->trace("DBMaintenanceThread::Do10MinuteMaintenenace() end after reindex returned "+dbres); + } } m_log->debug("PeriodicDBMaintenance::Do10MinuteMaintenance"); @@ -365,14 +385,23 @@ void DBMaintenanceThread::Do1DayMaintenance() st.Bind(0,Poco::DateTimeFormatter::format(date,"%Y-%m-%d")); st.Step(); + // delete old frost message requests + date=Poco::Timestamp(); + date-=Poco::Timespan(m_frostmaxdaysbackward,0,0,0,0); + st=m_db->Prepare("DELETE FROM tblFrostMessageRequests WHERE DayExecute("DELETE FROM tblIdentityTrust WHERE LocalIdentityID NOT IN (SELECT LocalIdentityID FROM tblLocalIdentity);"); m_db->Execute("DELETE FROM tblIdentityTrust WHERE IdentityID NOT IN (SELECT IdentityID FROM tblIdentity);"); + // cap failure count + m_db->Execute("UPDATE tblIdentity SET FailureCount=(SELECT OptionValue FROM tblOption WHERE Option='MaxFailureCount') WHERE FailureCount>(SELECT OptionValue FROM tblOption WHERE Option='MaxFailureCount');"); // reduce failure count for each identity m_db->Execute("UPDATE tblIdentity SET FailureCount=0 WHERE FailureCount<(SELECT OptionValue FROM tblOption WHERE Option='FailureCountReduction');"); - m_db->Execute("UPDATE tblIdentity SET FailureCount=FailureCount-(SELECT OptionValue FROM tblOption WHERE OptionName='FailureCountReduction') WHERE FailureCount>=(SELECT OptionValue FROM tblOption WHERE Option='FailureCountReduction');"); + m_db->Execute("UPDATE tblIdentity SET FailureCount=FailureCount-(SELECT OptionValue FROM tblOption WHERE Option='FailureCountReduction') WHERE FailureCount>=(SELECT OptionValue FROM tblOption WHERE Option='FailureCountReduction');"); st.Finalize(); findst.Finalize(); @@ -401,6 +430,10 @@ void DBMaintenanceThread::run() option.Get("MessageDownloadMaxDaysBackward",tempval); StringFunctions::Convert(tempval,m_messagedownloadmaxdaysbackward); + m_frostmaxdaysbackward=5; + tempval="5"; + option.Get("FrostMessageMaxDaysBackward",tempval); + StringFunctions::Convert(tempval,m_frostmaxdaysbackward); Poco::DateTime now; int i=0;