version 0.3.23
[fms.git] / src / dbmaintenancethread.cpp
index f8c3357..3f4bdbc 100644 (file)
@@ -1,6 +1,7 @@
 #include "../include/dbmaintenancethread.h"\r
 #include "../include/stringfunctions.h"\r
 #include "../include/option.h"\r
+#include "../include/threadbuilder.h"\r
 \r
 #include <Poco/Timestamp.h>\r
 #include <Poco/Timespan.h>\r
@@ -36,12 +37,62 @@ DBMaintenanceThread::DBMaintenanceThread()
 void DBMaintenanceThread::Do10MinuteMaintenance()\r
 {\r
 \r
+       ThreadBuilder tb;\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
+       SQLite3DB::Statement selectst=m_db->Prepare("SELECT tblMessage.MessageID FROM tblMessage \\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
+\r
+       boardst.Step();\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
+                       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
+       }\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
+       st.Step();\r
+       while(st.RowReturned())\r
+       {\r
+               int messageid=-1;\r
+               int boardid=-1;\r
+\r
+               st.ResultInt(0,messageid);\r
+               st.ResultInt(1,boardid);\r
+\r
+               tb.Build(messageid,boardid,true);\r
+\r
+               st.Step();\r
+       }\r
+\r
        m_log->debug("PeriodicDBMaintenance::Do10MinuteMaintenance");\r
 }\r
 \r
 void DBMaintenanceThread::Do30MinuteMaintenance()\r
 {\r
-\r
+       // UNCOMMENT method in run when code is placed here\r
        m_log->debug("PeriodicDBMaintenance::Do30MinuteMaintenance");\r
 }\r
 \r
@@ -283,6 +334,7 @@ void DBMaintenanceThread::run()
        m_log->debug("DBMaintenanceThread::run thread started.");\r
 \r
        Poco::DateTime now;\r
+       int i=0;\r
 \r
        do\r
        {\r
@@ -293,11 +345,13 @@ void DBMaintenanceThread::run()
                        Do10MinuteMaintenance();\r
                        m_last10minute=Poco::Timestamp();\r
                }\r
+               /*\r
                if((m_last30minute+Poco::Timespan(0,0,30,0,0))<=now)\r
                {\r
                        Do30MinuteMaintenance();\r
                        m_last30minute=Poco::Timestamp();\r
                }\r
+               */\r
                if((m_last1hour+Poco::Timespan(0,1,0,0,0))<=now)\r
                {\r
                        Do1HourMaintenance();\r
@@ -314,7 +368,12 @@ void DBMaintenanceThread::run()
                        m_last1day=Poco::Timestamp();\r
                }\r
 \r
-               Poco::Thread::sleep(1000);\r
+               i=0;\r
+               while(i++<5 && !IsCancelled())\r
+               {\r
+                       Poco::Thread::sleep(1000);\r
+               }\r
+\r
        }while(!IsCancelled());\r
 \r
        m_log->debug("DBMaintenanceThread::run thread exiting.");\r