version 0.3.31
[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(m_db);\r
13         std::vector<MessageThread::threadnode> m_threadmessages;\r
14         std::string logmessage("");     // temp var to help track down exactly when corruption occurrs\r
15         std::string ll("");\r
16         Option option(m_db);\r
17 \r
18         option.Get("LogLevel",ll);\r
19 \r
20         mt.Load(messageid,boardid,bydate);\r
21         m_threadmessages=mt.GetNodes();\r
22 \r
23         //m_db->Execute("BEGIN;");\r
24 \r
25         // find threadid of this mesage if it already exists in a thread\r
26         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
27         st.Bind(0,boardid);\r
28         st.Bind(1,messageid);\r
29 \r
30         if(ll=="8")\r
31         {\r
32                 std::string temp1("");\r
33                 std::string temp2("");\r
34                 StringFunctions::Convert(boardid,temp1);\r
35                 StringFunctions::Convert(messageid,temp2);\r
36 \r
37                 logmessage+="initial bound boardid=" + temp1 + " messageid=" + temp2 + " | ";\r
38         }\r
39 \r
40         st.Step();\r
41         if(st.RowReturned())\r
42         {\r
43                 st.ResultInt(0,threadid);\r
44 \r
45                 if(ll=="8")\r
46                 {\r
47                         std::string temp1("");\r
48                         StringFunctions::Convert(threadid,temp1);\r
49 \r
50                         logmessage+="result threadid=" + temp1 + " | ";\r
51                 }\r
52         }\r
53         else\r
54         {\r
55                 st.Reset();\r
56                 // message doesn't exist in a thread, try to find a message in the thread that is already in a thread\r
57                 for(std::vector<MessageThread::threadnode>::const_iterator i=m_threadmessages.begin(); i!=m_threadmessages.end() && threadid==-1; i++)\r
58                 {\r
59                         st.Bind(0,boardid);\r
60                         st.Bind(1,(*i).m_messageid);\r
61                         st.Step();\r
62 \r
63                         if(ll=="8")\r
64                         {\r
65                                 std::string temp1("");\r
66                                 std::string temp2("");\r
67                                 StringFunctions::Convert(boardid,temp1);\r
68                                 StringFunctions::Convert((*i).m_messageid,temp2);\r
69 \r
70                                 logmessage+="find bound boardid=" + temp1 + " messageid=" + temp2 + " | ";\r
71                         }\r
72 \r
73                         if(st.RowReturned())\r
74                         {\r
75                                 st.ResultInt(0,threadid);\r
76                                 if(ll=="8")\r
77                                 {\r
78                                         std::string temp1("");\r
79                                         StringFunctions::Convert(threadid,temp1);\r
80 \r
81                                         logmessage+="find result threadid=" + temp1 + " | ";\r
82                                 }\r
83                         }\r
84                         else\r
85                         {\r
86                                 if(ll=="8")\r
87                                 {\r
88                                         std::string temp1("");\r
89                                         StringFunctions::Convert(threadid,temp1);\r
90 \r
91                                         logmessage+="find not found | ";\r
92                                 }\r
93                         }\r
94 \r
95                         st.Reset();\r
96 \r
97                 }\r
98 \r
99                 // thread doesn't exist - create it\r
100                 if(threadid==-1)\r
101                 {\r
102                         st=m_db->Prepare("INSERT INTO tblThread(BoardID) VALUES(?);");\r
103                         st.Bind(0,boardid);\r
104                         st.Step(true);\r
105                         threadid=st.GetLastInsertRowID();\r
106 \r
107                         if(ll=="8")\r
108                         {\r
109                                 std::string temp1("");\r
110                                 std::string temp2("");\r
111                                 StringFunctions::Convert(boardid,temp1);\r
112                                 StringFunctions::Convert(threadid,temp2);\r
113 \r
114                                 logmessage+="insert thread bind boardid=" + temp1 + " result threadid=" + temp2 + " | ";\r
115                         }\r
116 \r
117                 }\r
118         }\r
119 \r
120         if(m_threadmessages.size()>0)\r
121         {\r
122                 SQLite3DB::Statement st2=m_db->Prepare("UPDATE tblThread SET FirstMessageID=?, LastMessageID=? WHERE ThreadID=?;");\r
123                 st2.Bind(0,m_threadmessages[0].m_messageid);\r
124                 st2.Bind(1,m_threadmessages[m_threadmessages.size()-1].m_messageid);\r
125                 st2.Bind(2,threadid);\r
126                 st2.Step();\r
127 \r
128                 if(ll=="8")\r
129                 {\r
130                         std::string temp1("");\r
131                         std::string temp2("");\r
132                         std::string temp3("");\r
133                         StringFunctions::Convert(m_threadmessages[0].m_messageid,temp1);\r
134                         StringFunctions::Convert(m_threadmessages[m_threadmessages.size()-1].m_messageid,temp2);\r
135                         StringFunctions::Convert(threadid,temp3);\r
136 \r
137                         logmessage+="update bind fmessageid=" + temp1 + " lmessageid=" + temp2 + " threadid=" + temp3 + " | ";\r
138                 }\r
139 \r
140                 SQLite3DB::Statement st3=m_db->Prepare("DELETE FROM tblThreadPost WHERE ThreadID=?;");\r
141                 st3.Bind(0,threadid);\r
142                 st3.Step();\r
143 \r
144                 if(ll=="8")\r
145                 {\r
146                         std::string temp1("");\r
147                         StringFunctions::Convert(threadid,temp1);\r
148 \r
149                         logmessage+="delete bind threadid=" + temp1 + " | ";\r
150                 }\r
151 \r
152                 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
153 \r
154                 count=0;\r
155                 SQLite3DB::Statement st4=m_db->Prepare("INSERT INTO tblThreadPost(ThreadID,MessageID,PostOrder) VALUES(?,?,?);");\r
156                 for(std::vector<MessageThread::threadnode>::const_iterator i=m_threadmessages.begin(); i!=m_threadmessages.end(); i++, count++)\r
157                 {\r
158                         deleteotherst.Bind(0,boardid);\r
159                         deleteotherst.Bind(1,(*i).m_messageid);\r
160                         deleteotherst.Step();\r
161                         deleteotherst.Reset();\r
162 \r
163                         if(ll=="8")\r
164                         {\r
165                                 std::string temp1("");\r
166                                 std::string temp2("");\r
167                                 StringFunctions::Convert(boardid,temp1);\r
168                                 StringFunctions::Convert((*i).m_messageid,temp2);\r
169 \r
170                                 logmessage+="deleteother bind boardid=" + temp1 + " messageid=" + temp2 + " | ";\r
171                         }\r
172 \r
173                         st4.Bind(0,threadid);\r
174                         st4.Bind(1,(*i).m_messageid);\r
175                         st4.Bind(2,count);\r
176                         st4.Step();\r
177                         st4.Reset();\r
178 \r
179                         if(ll=="8")\r
180                         {\r
181                                 std::string temp1("");\r
182                                 std::string temp2("");\r
183                                 std::string temp3("");\r
184                                 StringFunctions::Convert(threadid,temp1);\r
185                                 StringFunctions::Convert((*i).m_messageid,temp2);\r
186                                 StringFunctions::Convert(count,temp3);\r
187 \r
188                                 logmessage+="insertthreadpost bind threadid=" + temp1 + " messageid=" + temp2 + " count=" + temp3 + " | ";\r
189                         }\r
190 \r
191                 }\r
192         }\r
193         else\r
194         {\r
195                 SQLite3DB::Statement st2=m_db->Prepare("DELETE FROM tblThread WHERE ThreadID=?;");\r
196                 st2.Bind(0,threadid);\r
197                 st2.Step();\r
198 \r
199                 if(ll=="8")\r
200                 {\r
201                         std::string temp1("");\r
202                         StringFunctions::Convert(threadid,temp1);\r
203 \r
204                         logmessage+="delete thread bind threadid=" + temp1 + " | ";\r
205                 }\r
206 \r
207                 m_log->trace("ThreadBuilder::Build deleted thread");\r
208         }\r
209 \r
210         st.Finalize();\r
211 \r
212         //m_db->Execute("COMMIT;");\r
213 \r
214         if(ll=="8")\r
215         {\r
216                 m_log->trace(logmessage);\r
217         }\r
218 \r
219         return true;\r
220 \r
221 }\r