1 #include "../include/threadbuilder.h"
\r
2 #include "../include/messagethread.h"
\r
4 #include "../include/dbsetup.h"
\r
5 #include "../include/stringfunctions.h"
\r
6 #include "../include/option.h"
\r
8 const bool ThreadBuilder::Build(const long messageid, const long boardid, const bool bydate)
\r
13 std::vector<MessageThread::threadnode> m_threadmessages;
\r
16 Option::Instance()->Get("LogLevel",ll);
\r
18 // TODO - remove after corruption issue fixed
\r
21 std::string dbres=TestDBIntegrity();
\r
22 std::string messageidstr="";
\r
23 std::string boardidstr="";
\r
24 StringFunctions::Convert(messageid,messageidstr);
\r
25 StringFunctions::Convert(boardid,boardidstr);
\r
26 m_log->trace("ThreadBuilder::Build start TestDBIntegrity("+messageidstr+","+boardidstr+") returned "+dbres);
\r
29 mt.Load(messageid,boardid,bydate);
\r
30 m_threadmessages=mt.GetNodes();
\r
32 // find threadid of this mesage if it already exists in a thread
\r
33 SQLite3DB::Statement st=m_db->Prepare("SELECT tblThread.ThreadID FROM tblThread INNER JOIN tblThreadPost ON tblThread.ThreadID=tblThreadPost.ThreadID WHERE tblThread.BoardID=? AND tblThreadPost.MessageID=?;");
\r
35 st.Bind(1,messageid);
\r
38 if(st.RowReturned())
\r
40 st.ResultInt(0,threadid);
\r
45 // message doesn't exist in a thread, try to find a message in the thread that is already in a thread
\r
46 for(std::vector<MessageThread::threadnode>::const_iterator i=m_threadmessages.begin(); i!=m_threadmessages.end() && threadid==-1; i++)
\r
49 st.Bind(1,(*i).m_messageid);
\r
52 if(st.RowReturned())
\r
54 st.ResultInt(0,threadid);
\r
61 // thread doesn't exist - create it
\r
64 st=m_db->Prepare("INSERT INTO tblThread(BoardID) VALUES(?);");
\r
67 threadid=st.GetLastInsertRowID();
\r
71 // TODO - remove after corruption issue fixed
\r
74 std::string dbres=TestDBIntegrity();
\r
77 m_log->trace("ThreadBuilder::Build middle TestDBIntegrity returned "+dbres);
\r
81 if(m_threadmessages.size()>0)
\r
83 SQLite3DB::Statement st2=m_db->Prepare("UPDATE tblThread SET FirstMessageID=?, LastMessageID=? WHERE ThreadID=?;");
\r
84 st2.Bind(0,m_threadmessages[0].m_messageid);
\r
85 st2.Bind(1,m_threadmessages[m_threadmessages.size()-1].m_messageid);
\r
86 st2.Bind(2,threadid);
\r
89 // TODO - remove after corruption issue fixed
\r
92 std::string dbres=TestDBIntegrity();
\r
95 m_log->trace("ThreadBuilder::Build after thread update TestDBIntegrity returned "+dbres);
\r
99 SQLite3DB::Statement st3=m_db->Prepare("DELETE FROM tblThreadPost WHERE ThreadID=?;");
\r
100 st3.Bind(0,threadid);
\r
103 // TODO - remove after corruption issue fixed
\r
106 std::string dbres=TestDBIntegrity();
\r
109 m_log->trace("ThreadBuilder::Build after thread post delete TestDBIntegrity returned "+dbres);
\r
113 SQLite3DB::Statement deleteotherst=m_db->Prepare("DELETE FROM tblThread WHERE ThreadID IN (SELECT tblThread.ThreadID FROM tblThreadPost INNER JOIN tblThread ON tblThreadPost.ThreadID=tblThread.ThreadID WHERE tblThread.BoardID=? AND tblThreadPost.MessageID=?);");
\r
116 SQLite3DB::Statement st4=m_db->Prepare("INSERT INTO tblThreadPost(ThreadID,MessageID,PostOrder) VALUES(?,?,?);");
\r
117 for(std::vector<MessageThread::threadnode>::const_iterator i=m_threadmessages.begin(); i!=m_threadmessages.end(); i++, count++)
\r
119 deleteotherst.Bind(0,boardid);
\r
120 deleteotherst.Bind(1,(*i).m_messageid);
\r
121 deleteotherst.Step();
\r
122 deleteotherst.Reset();
\r
124 st4.Bind(0,threadid);
\r
125 st4.Bind(1,(*i).m_messageid);
\r
133 SQLite3DB::Statement st2=m_db->Prepare("DELETE FROM tblThread WHERE ThreadID=?;");
\r
134 st2.Bind(0,threadid);
\r
137 m_log->trace("ThreadBuilder::Build deleted thread");
\r
140 // TODO - remove after corruption issue fixed
\r
143 std::string dbres=TestDBIntegrity();
\r
144 m_log->trace("ThreadBuilder::Build end TestDBIntegrity returned "+dbres);
\r