--- /dev/null
+#include "../include/threadbuilder.h"\r
+#include "../include/messagethread.h"\r
+\r
+const bool ThreadBuilder::Build(const long messageid, const long boardid, const bool bydate)\r
+{\r
+ int count=0;\r
+ int threadid=-1;\r
+ MessageThread mt;\r
+ std::vector<MessageThread::threadnode> m_threadmessages;\r
+\r
+ mt.Load(messageid,boardid,bydate);\r
+ m_threadmessages=mt.GetNodes();\r
+\r
+ // find threadid of this thread if it already exists in a thread\r
+ 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
+ st.Bind(0,boardid);\r
+ st.Bind(1,messageid);\r
+\r
+ st.Step();\r
+ if(st.RowReturned())\r
+ {\r
+ st.ResultInt(0,threadid);\r
+ }\r
+ else\r
+ {\r
+ st.Reset();\r
+ // message doesn't exist in a thread, try to find a message in the thread that is already in a thread\r
+ for(std::vector<MessageThread::threadnode>::const_iterator i=m_threadmessages.begin(); i!=m_threadmessages.end() && threadid==-1; i++)\r
+ {\r
+ st.Bind(0,boardid);\r
+ st.Bind(1,(*i).m_messageid);\r
+ st.Step();\r
+\r
+ if(st.RowReturned())\r
+ {\r
+ st.ResultInt(0,threadid);\r
+ }\r
+\r
+ st.Reset();\r
+\r
+ }\r
+\r
+ // thread doesn't exist - create it\r
+ if(threadid==-1)\r
+ {\r
+ st=m_db->Prepare("INSERT INTO tblThread(BoardID) VALUES(?);");\r
+ st.Bind(0,boardid);\r
+ st.Step(true);\r
+ threadid=st.GetLastInsertRowID();\r
+ }\r
+ }\r
+\r
+ if(m_threadmessages.size()>0)\r
+ {\r
+ st=m_db->Prepare("UPDATE tblThread SET FirstMessageID=?, LastMessageID=? WHERE ThreadID=?;");\r
+ st.Bind(0,m_threadmessages[0].m_messageid);\r
+ st.Bind(1,m_threadmessages[m_threadmessages.size()-1].m_messageid);\r
+ st.Bind(2,threadid);\r
+ st.Step();\r
+\r
+ st=m_db->Prepare("DELETE FROM tblThreadPost WHERE ThreadID=?;");\r
+ st.Bind(0,threadid);\r
+ st.Step();\r
+\r
+ count=0;\r
+ st=m_db->Prepare("INSERT INTO tblThreadPost(ThreadID,MessageID,PostOrder) VALUES(?,?,?);");\r
+ for(std::vector<MessageThread::threadnode>::const_iterator i=m_threadmessages.begin(); i!=m_threadmessages.end(); i++, count++)\r
+ {\r
+ st.Bind(0,threadid);\r
+ st.Bind(1,(*i).m_messageid);\r
+ st.Bind(2,count);\r
+ st.Step();\r
+ st.Reset();\r
+ }\r
+ }\r
+ else\r
+ {\r
+ st=m_db->Prepare("DELETE FROM tblThread WHERE ThreadID=?;");\r
+ st.Bind(0,threadid);\r
+ st.Step();\r
+ }\r
+\r
+ return true;\r
+\r
+}\r