version 0.3.32
[fms.git] / src / dbmaintenancethread.cpp
index 0b1349f..4d48786 100644 (file)
@@ -4,6 +4,8 @@
 #include "../include/threadbuilder.h"\r
 #include "../include/dbsetup.h"\r
 \r
+#include <vector>\r
+\r
 #include <Poco/Timestamp.h>\r
 #include <Poco/Timespan.h>\r
 #include <Poco/DateTimeFormatter.h>\r
@@ -21,40 +23,32 @@ DBMaintenanceThread::DBMaintenanceThread()
        m_last6hour-=Poco::Timespan(0,5,42,0,0);\r
        m_last1day=Poco::Timestamp();\r
        m_last1day-=Poco::Timespan(0,23,51,0,0);\r
-\r
-\r
-\r
 }\r
 \r
 \r
 void DBMaintenanceThread::Do10MinuteMaintenance()\r
 {\r
+       std::vector<std::pair<long,long> > m_unthreadedmessages;\r
        Option option(m_db);\r
        std::string ll("");\r
        option.Get("LogLevel",ll);\r
 \r
-       // TODO - remove after corruption issue fixed\r
-       if(ll=="8")\r
-       {\r
-               std::string dbres=TestDBIntegrity(m_db);\r
-               m_log->trace("DBMaintenanceThread::Do10MinuteMaintenance() start TestDBIntegrity returned "+dbres);\r
-       }\r
-\r
        ThreadBuilder tb(m_db);\r
        SQLite3DB::Statement boardst=m_db->Prepare("SELECT BoardID FROM tblBoard WHERE Forum='true';");\r
        // select messages for a board that aren't in a thread\r
+       // This query was causing the db to be locked and a journal file created.\r
+       // build a list of boards and messageids and then use that instead of keeping the query in use\r
        SQLite3DB::Statement selectst=m_db->Prepare("SELECT tblMessage.MessageID FROM tblMessage \\r
-                                                                                               INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID\\r
+                                                                                               INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID \\r
                                                                                                LEFT JOIN tblThreadPost ON tblMessage.MessageID=tblThreadPost.MessageID \\r
-                                                                                               LEFT JOIN tblThread ON tblThreadPost.ThreadID=tblThread.ThreadID\\r
-                                                                                               WHERE tblMessageBoard.BoardID=? AND tblThread.BoardID IS NULL;");\r
+                                                                                               WHERE tblMessageBoard.BoardID=? AND tblThreadPost.MessageID IS NULL;");\r
 \r
        boardst.Step();\r
        while(boardst.RowReturned())\r
        {\r
                int boardid=-1;\r
-\r
                boardst.ResultInt(0,boardid);\r
+               boardst.Step();\r
 \r
                selectst.Bind(0,boardid);\r
                selectst.Step();\r
@@ -65,27 +59,46 @@ void DBMaintenanceThread::Do10MinuteMaintenance()
 \r
                        selectst.ResultInt(0,messageid);\r
 \r
-                       tb.Build(messageid,boardid,true);\r
+                       m_unthreadedmessages.push_back(std::pair<long,long>(boardid,messageid));\r
 \r
                        selectst.Step();\r
                }\r
                selectst.Reset();\r
-\r
-               boardst.Step();\r
        }\r
+       selectst.Finalize();\r
+       boardst.Finalize();\r
 \r
-       // TODO - remove after corruption issue fixed\r
-       if(ll=="8")\r
+       for(std::vector<std::pair<long,long> >::iterator i=m_unthreadedmessages.begin(); i!=m_unthreadedmessages.end(); i++)\r
        {\r
-               std::string dbres=TestDBIntegrity(m_db);\r
-               m_log->trace("DBMaintenanceThread::Do10MinuteMaintenance() middle TestDBIntegrity returned "+dbres);\r
-               if(dbres!="ok")\r
+               tb.Build((*i).second,(*i).first,true);\r
+       }\r
+       \r
+       /*\r
+       while(boardst.RowReturned())\r
+       {\r
+               int boardid=-1;\r
+\r
+               boardst.ResultInt(0,boardid);\r
+\r
+               selectst.Bind(0,boardid);\r
+               selectst.Step();\r
+\r
+               while(selectst.RowReturned())\r
                {\r
-                       m_db->Execute("REINDEX;");\r
-                       dbres=TestDBIntegrity(m_db);\r
-                       m_log->trace("DBMaintenanceThread::Do10MinuteMaintenenace() middle after reindex returned "+dbres);\r
+                       int messageid=-1;\r
+\r
+                       selectst.ResultInt(0,messageid);\r
+\r
+                       tb.Build(messageid,boardid,true);\r
+\r
+                       selectst.Step();\r
                }\r
+               selectst.Reset();\r
+\r
+               boardst.Step();\r
+               boardst.Reset();\r
        }\r
+       */\r
 \r
        // now rebuild threads where the message has been deleted\r
        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;");\r
@@ -111,6 +124,12 @@ void DBMaintenanceThread::Do10MinuteMaintenance()
        {\r
                std::string dbres=TestDBIntegrity(m_db);\r
                m_log->trace("DBMaintenanceThread::Do10MinuteMaintenance() end TestDBIntegrity returned "+dbres);\r
+               if(dbres!="ok")\r
+               {\r
+                       m_db->Execute("REINDEX;");\r
+                       dbres=TestDBIntegrity(m_db);\r
+                       m_log->trace("DBMaintenanceThread::Do10MinuteMaintenenace() end after reindex returned "+dbres);\r
+               }\r
        }\r
 \r
        m_log->debug("PeriodicDBMaintenance::Do10MinuteMaintenance");\r