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