cf21aab6c2e9db8c4a30488e96bbfafdf83b197e
[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 #include "../include/option.h"\r
7 \r
8 const bool ThreadBuilder::Build(const long messageid, const long boardid, const bool bydate)\r
9 {\r
10         int count=0;\r
11         int threadid=-1;\r
12         MessageThread mt;\r
13         std::vector<MessageThread::threadnode> m_threadmessages;\r
14 \r
15         std::string ll="";\r
16         Option::Instance()->Get("LogLevel",ll);\r
17 \r
18         // TODO - remove after corruption issue fixed\r
19         if(ll=="8")\r
20         {\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
27         }\r
28 \r
29         mt.Load(messageid,boardid,bydate);\r
30         m_threadmessages=mt.GetNodes();\r
31 \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
34         st.Bind(0,boardid);\r
35         st.Bind(1,messageid);\r
36 \r
37         st.Step();\r
38         if(st.RowReturned())\r
39         {\r
40                 st.ResultInt(0,threadid);\r
41         }\r
42         else\r
43         {\r
44                 st.Reset();\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
47                 {\r
48                         st.Bind(0,boardid);\r
49                         st.Bind(1,(*i).m_messageid);\r
50                         st.Step();\r
51 \r
52                         if(st.RowReturned())\r
53                         {\r
54                                 st.ResultInt(0,threadid);\r
55                         }\r
56 \r
57                         st.Reset();\r
58 \r
59                 }\r
60 \r
61                 // thread doesn't exist - create it\r
62                 if(threadid==-1)\r
63                 {\r
64                         st=m_db->Prepare("INSERT INTO tblThread(BoardID) VALUES(?);");\r
65                         st.Bind(0,boardid);\r
66                         st.Step(true);\r
67                         threadid=st.GetLastInsertRowID();\r
68                 }\r
69         }\r
70 \r
71         // TODO - remove after corruption issue fixed\r
72         if(ll=="8")\r
73         {\r
74                 std::string dbres=TestDBIntegrity();\r
75                 if(dbres!="ok")\r
76                 {\r
77                         m_log->trace("ThreadBuilder::Build middle TestDBIntegrity returned "+dbres);\r
78                 }\r
79         }\r
80 \r
81         if(m_threadmessages.size()>0)\r
82         {\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
87                 st2.Step();\r
88 \r
89                 // TODO - remove after corruption issue fixed\r
90                 if(ll=="8")\r
91                 {\r
92                         std::string dbres=TestDBIntegrity();\r
93                         if(dbres!="ok")\r
94                         {\r
95                                 m_log->trace("ThreadBuilder::Build after thread update TestDBIntegrity returned "+dbres);\r
96                         }\r
97                 }\r
98 \r
99                 SQLite3DB::Statement st3=m_db->Prepare("DELETE FROM tblThreadPost WHERE ThreadID=?;");\r
100                 st3.Bind(0,threadid);\r
101                 st3.Step();\r
102 \r
103                 // TODO - remove after corruption issue fixed\r
104                 if(ll=="8")\r
105                 {\r
106                         std::string dbres=TestDBIntegrity();\r
107                         if(dbres!="ok")\r
108                         {\r
109                                 m_log->trace("ThreadBuilder::Build after thread post delete TestDBIntegrity returned "+dbres);\r
110                         }\r
111                 }\r
112 \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
114 \r
115                 count=0;\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
118                 {\r
119                         deleteotherst.Bind(0,boardid);\r
120                         deleteotherst.Bind(1,(*i).m_messageid);\r
121                         deleteotherst.Step();\r
122                         deleteotherst.Reset();\r
123 \r
124                         st4.Bind(0,threadid);\r
125                         st4.Bind(1,(*i).m_messageid);\r
126                         st4.Bind(2,count);\r
127                         st4.Step();\r
128                         st4.Reset();\r
129                 }\r
130         }\r
131         else\r
132         {\r
133                 SQLite3DB::Statement st2=m_db->Prepare("DELETE FROM tblThread WHERE ThreadID=?;");\r
134                 st2.Bind(0,threadid);\r
135                 st2.Step();\r
136 \r
137                 m_log->trace("ThreadBuilder::Build deleted thread");\r
138         }\r
139 \r
140         // TODO - remove after corruption issue fixed\r
141         if(ll=="8")\r
142         {\r
143                 std::string dbres=TestDBIntegrity();\r
144                 m_log->trace("ThreadBuilder::Build end TestDBIntegrity returned "+dbres);\r
145         }\r
146 \r
147         return true;\r
148 \r
149 }\r