version 0.1.15
[fms.git] / src / freenet / periodicdbmaintenance.cpp
index 63863f8..dad043e 100644 (file)
@@ -36,8 +36,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