version 0.2.0
[fms.git] / src / freenet / periodicdbmaintenance.cpp
index c615d60..f6f501b 100644 (file)
@@ -1,5 +1,6 @@
 #include "../../include/freenet/periodicdbmaintenance.h"\r
 #include "../../include/stringfunctions.h"\r
+#include "../../include/option.h"\r
 \r
 #ifdef XMEM\r
        #include <xmem.h>\r
@@ -7,6 +8,8 @@
 \r
 PeriodicDBMaintenance::PeriodicDBMaintenance()\r
 {\r
+       std::string tempval;\r
+\r
        m_check10mins.SetToGMTime();\r
        m_check30mins.SetToGMTime();\r
        m_check1hour.SetToGMTime();\r
@@ -19,6 +22,10 @@ PeriodicDBMaintenance::PeriodicDBMaintenance()
        m_check6hours.Add(0,-1,-5);\r
        m_check1day.Add(0,0,-23);\r
 \r
+       tempval="180";\r
+       Option::Instance()->Get("DeleteMessagesOlderThan",tempval);\r
+       StringFunctions::Convert(tempval,m_deletemessagesolderthan);\r
+\r
 }\r
 \r
 void PeriodicDBMaintenance::Do10MinuteMaintenance()\r
@@ -36,8 +43,46 @@ void PeriodicDBMaintenance::Do30MinuteMaintenance()
 void PeriodicDBMaintenance::Do1HourMaintenance()\r
 {\r
        // recalculate all trust levels - this is CPU instensive\r
-       // TODO - will probably have to change this to do 1 identity at a time as this locks that database for the duration\r
-       m_db->Execute("UPDATE tblIdentity SET PeerMessageTrust=(SELECT PeerMessageTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=IdentityID), PeerTrustListTrust=(SELECT PeerTrustListTrust FROM vwCalculatedPeerTrust WHERE TargetIdentityID=IdentityID);");\r
+       // do 1 identity at a time as doing it with 1 UPDATE statement locks that database for the duration\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT TargetIdentityID,PeerMessageTrust,PeerTrustListTrust FROM vwCalculatedPeerTrust;");\r
+       SQLite3DB::Statement upd=m_db->Prepare("UPDATE tblIdentity SET PeerMessageTrust=?, PeerTrustListTrust=? WHERE IdentityID=?");\r
+       st.Step();\r
+       while(st.RowReturned())\r
+       {\r
+               int identityid=0;\r
+               int trust=0;\r
+               \r
+               st.ResultInt(0,identityid);\r
+\r
+               upd.Bind(0,identityid);\r
+               if(st.ResultNull(1)==false)\r
+               {\r
+                       trust=0;\r
+                       st.ResultInt(1,trust);\r
+                       upd.Bind(0,trust);\r
+               }\r
+               else\r
+               {\r
+                       upd.Bind(0);\r
+               }\r
+               if(st.ResultNull(2)==false)\r
+               {\r
+                       trust=0;\r
+                       st.ResultInt(2,trust);\r
+                       upd.Bind(1,trust);\r
+               }\r
+               else\r
+               {\r
+                       upd.Bind(1);\r
+               }\r
+               upd.Bind(2,identityid);\r
+               upd.Step();\r
+               upd.Reset();\r
+\r
+               st.Step();\r
+       }\r
+\r
+\r
 \r
        m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"PeriodicDBMaintenance::Do1HourMaintenance");\r
 }\r
@@ -133,6 +178,27 @@ void PeriodicDBMaintenance::Do1DayMaintenance()
                st.Step();\r
        }\r
 \r
+       // delete single use identities that are older than 7 days\r
+       date.SetToGMTime();\r
+       date.Add(0,0,0,-7);\r
+       st=m_db->Prepare("DELETE FROM tblIdentity WHERE SingleUse='true' AND DateAdded<?;");\r
+       st.Bind(0,date.Format("%Y-%m-%d %H:%M:%S"));\r
+       st.Step();\r
+\r
+       // delete local single use identities that are older than 7 days\r
+       date.SetToGMTime();\r
+       date.Add(0,0,0,-7);\r
+       st=m_db->Prepare("DELETE FROM tblLocalIdentity WHERE SingleUse='true' AND DateCreated<?;");\r
+       st.Bind(0,date.Format("%Y-%m-%d %H:%M:%S"));\r
+       st.Step();\r
+\r
+       // delete old messages\r
+       date.SetToGMTime();\r
+       date.Add(0,0,0,-m_deletemessagesolderthan);\r
+       st=m_db->Prepare("DELETE FROM tblMessage WHERE MessageDate<?;");\r
+       st.Bind(0,date.Format("%Y-%m-%d"));\r
+       st.Step();\r
+\r
 }\r
 \r
 void PeriodicDBMaintenance::Process()\r