version 0.3.24
[fms.git] / src / threadbuilder.cpp
1 #include "../include/threadbuilder.h"\r
2 #include "../include/messagethread.h"\r
3 \r
4 const bool ThreadBuilder::Build(const long messageid, const long boardid, const bool bydate)\r
5 {\r
6         int count=0;\r
7         int threadid=-1;\r
8         MessageThread mt;\r
9         std::vector<MessageThread::threadnode> m_threadmessages;\r
10 \r
11         mt.Load(messageid,boardid,bydate);\r
12         m_threadmessages=mt.GetNodes();\r
13 \r
14         // find threadid of this thread if it already exists in a thread\r
15         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
16         st.Bind(0,boardid);\r
17         st.Bind(1,messageid);\r
18 \r
19         st.Step();\r
20         if(st.RowReturned())\r
21         {\r
22                 st.ResultInt(0,threadid);\r
23         }\r
24         else\r
25         {\r
26                 st.Reset();\r
27                 // message doesn't exist in a thread, try to find a message in the thread that is already in a thread\r
28                 for(std::vector<MessageThread::threadnode>::const_iterator i=m_threadmessages.begin(); i!=m_threadmessages.end() && threadid==-1; i++)\r
29                 {\r
30                         st.Bind(0,boardid);\r
31                         st.Bind(1,(*i).m_messageid);\r
32                         st.Step();\r
33 \r
34                         if(st.RowReturned())\r
35                         {\r
36                                 st.ResultInt(0,threadid);\r
37                         }\r
38 \r
39                         st.Reset();\r
40 \r
41                 }\r
42 \r
43                 // thread doesn't exist - create it\r
44                 if(threadid==-1)\r
45                 {\r
46                         st=m_db->Prepare("INSERT INTO tblThread(BoardID) VALUES(?);");\r
47                         st.Bind(0,boardid);\r
48                         st.Step(true);\r
49                         threadid=st.GetLastInsertRowID();\r
50                 }\r
51         }\r
52 \r
53         if(m_threadmessages.size()>0)\r
54         {\r
55                 st=m_db->Prepare("UPDATE tblThread SET FirstMessageID=?, LastMessageID=? WHERE ThreadID=?;");\r
56                 st.Bind(0,m_threadmessages[0].m_messageid);\r
57                 st.Bind(1,m_threadmessages[m_threadmessages.size()-1].m_messageid);\r
58                 st.Bind(2,threadid);\r
59                 st.Step();\r
60 \r
61                 st=m_db->Prepare("DELETE FROM tblThreadPost WHERE ThreadID=?;");\r
62                 st.Bind(0,threadid);\r
63                 st.Step();\r
64 \r
65                 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
66 \r
67                 count=0;\r
68                 st=m_db->Prepare("INSERT INTO tblThreadPost(ThreadID,MessageID,PostOrder) VALUES(?,?,?);");\r
69                 for(std::vector<MessageThread::threadnode>::const_iterator i=m_threadmessages.begin(); i!=m_threadmessages.end(); i++, count++)\r
70                 {\r
71                         deleteotherst.Bind(0,boardid);\r
72                         deleteotherst.Bind(1,(*i).m_messageid);\r
73                         deleteotherst.Step();\r
74                         deleteotherst.Reset();\r
75 \r
76                         st.Bind(0,threadid);\r
77                         st.Bind(1,(*i).m_messageid);\r
78                         st.Bind(2,count);\r
79                         st.Step();\r
80                         st.Reset();\r
81                 }\r
82         }\r
83         else\r
84         {\r
85                 st=m_db->Prepare("DELETE FROM tblThread WHERE ThreadID=?;");\r
86                 st.Bind(0,threadid);\r
87                 st.Step();\r
88         }\r
89 \r
90         return true;\r
91 \r
92 }\r