version 0.3.32
[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                 st.Finalize();\r
99 \r
100                 // thread doesn't exist - create it\r
101                 if(threadid==-1)\r
102                 {\r
103                         st=m_db->Prepare("INSERT INTO tblThread(BoardID) VALUES(?);");\r
104                         st.Bind(0,boardid);\r
105                         st.Step(true);\r
106                         threadid=st.GetLastInsertRowID();\r
107 \r
108                         if(ll=="8")\r
109                         {\r
110                                 std::string temp1("");\r
111                                 std::string temp2("");\r
112                                 StringFunctions::Convert(boardid,temp1);\r
113                                 StringFunctions::Convert(threadid,temp2);\r
114 \r
115                                 logmessage+="insert thread bind boardid=" + temp1 + " result threadid=" + temp2 + " | ";\r
116                         }\r
117 \r
118                 }\r
119         }\r
120 \r
121         if(m_threadmessages.size()>0)\r
122         {\r
123                 SQLite3DB::Statement st2=m_db->Prepare("UPDATE tblThread SET FirstMessageID=?, LastMessageID=? WHERE ThreadID=?;");\r
124                 st2.Bind(0,m_threadmessages[0].m_messageid);\r
125                 st2.Bind(1,m_threadmessages[m_threadmessages.size()-1].m_messageid);\r
126                 st2.Bind(2,threadid);\r
127                 st2.Step();\r
128 \r
129                 if(ll=="8")\r
130                 {\r
131                         std::string temp1("");\r
132                         std::string temp2("");\r
133                         std::string temp3("");\r
134                         StringFunctions::Convert(m_threadmessages[0].m_messageid,temp1);\r
135                         StringFunctions::Convert(m_threadmessages[m_threadmessages.size()-1].m_messageid,temp2);\r
136                         StringFunctions::Convert(threadid,temp3);\r
137 \r
138                         logmessage+="update bind fmessageid=" + temp1 + " lmessageid=" + temp2 + " threadid=" + temp3 + " | ";\r
139                 }\r
140 \r
141                 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.ThreadID<>? AND tblThread.BoardID=? AND tblThreadPost.MessageID=?);");\r
142 \r
143                 count=0;\r
144                 SQLite3DB::Statement st4=m_db->Prepare("INSERT OR REPLACE INTO tblThreadPost(ThreadID,MessageID,PostOrder) VALUES(?,?,?);");\r
145                 for(std::vector<MessageThread::threadnode>::const_iterator i=m_threadmessages.begin(); i!=m_threadmessages.end(); i++, count++)\r
146                 {\r
147                         deleteotherst.Bind(0,threadid);\r
148                         deleteotherst.Bind(1,boardid);\r
149                         deleteotherst.Bind(2,(*i).m_messageid);\r
150                         deleteotherst.Step();\r
151                         deleteotherst.Reset();\r
152 \r
153                         if(ll=="8")\r
154                         {\r
155                                 std::string temp1("");\r
156                                 std::string temp2("");\r
157                                 StringFunctions::Convert(boardid,temp1);\r
158                                 StringFunctions::Convert((*i).m_messageid,temp2);\r
159 \r
160                                 logmessage+="deleteother bind boardid=" + temp1 + " messageid=" + temp2 + " | ";\r
161                         }\r
162 \r
163                         st4.Bind(0,threadid);\r
164                         st4.Bind(1,(*i).m_messageid);\r
165                         st4.Bind(2,count);\r
166                         st4.Step();\r
167                         st4.Reset();\r
168 \r
169                         if(ll=="8")\r
170                         {\r
171                                 std::string temp1("");\r
172                                 std::string temp2("");\r
173                                 std::string temp3("");\r
174                                 StringFunctions::Convert(threadid,temp1);\r
175                                 StringFunctions::Convert((*i).m_messageid,temp2);\r
176                                 StringFunctions::Convert(count,temp3);\r
177 \r
178                                 logmessage+="insertthreadpost bind threadid=" + temp1 + " messageid=" + temp2 + " count=" + temp3 + " | ";\r
179                         }\r
180 \r
181                 }\r
182         }\r
183         else\r
184         {\r
185                 SQLite3DB::Statement st2=m_db->Prepare("DELETE FROM tblThread WHERE ThreadID=?;");\r
186                 st2.Bind(0,threadid);\r
187                 st2.Step();\r
188 \r
189                 if(ll=="8")\r
190                 {\r
191                         std::string temp1("");\r
192                         StringFunctions::Convert(threadid,temp1);\r
193 \r
194                         logmessage+="delete thread bind threadid=" + temp1 + " | ";\r
195                 }\r
196 \r
197                 m_log->trace("ThreadBuilder::Build deleted thread");\r
198         }\r
199 \r
200         st.Finalize();\r
201 \r
202         m_db->Execute("COMMIT;");\r
203 \r
204         if(ll=="8")\r
205         {\r
206                 m_log->trace(logmessage);\r
207         }\r
208 \r
209         return true;\r
210 \r
211 }\r