version 0.3.23
[fms.git] / src / threadbuilder.cpp
diff --git a/src/threadbuilder.cpp b/src/threadbuilder.cpp
new file mode 100644 (file)
index 0000000..521cccc
--- /dev/null
@@ -0,0 +1,85 @@
+#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