version 0.3.23
[fms.git] / src / messagethread.cpp
1 #include "../include/messagethread.h"\r
2 #include "../include/stringfunctions.h"\r
3 \r
4 #include <algorithm>\r
5 \r
6 #ifdef XMEM\r
7         #include <xmem.h>\r
8 #endif\r
9 \r
10 void MessageThread::AddChildren(const long messageid, const long level, const long boardid)\r
11 {\r
12         SQLite3DB::Statement st=m_db->Prepare("SELECT tblMessageReplyTo.MessageID, tblMessage1.Subject, tblMessage1.FromName, tblMessage1.MessageDate || ' ' || tblMessage1.MessageTime FROM tblMessage INNER JOIN tblMessageReplyTo ON tblMessage.MessageUUID=tblMessageReplyTo.ReplyToMessageUUID INNER JOIN tblMessage AS 'tblMessage1' ON tblMessageReplyTo.MessageID=tblMessage1.MessageID INNER JOIN tblMessageBoard ON tblMessage1.MessageID=tblMessageBoard.MessageID WHERE tblMessage.MessageID=? AND tblMessageBoard.BoardID=? AND tblMessageReplyTo.ReplyOrder=0 ORDER BY tblMessage1.MessageDate || ' ' || tblMessage1.MessageTime;");\r
13         st.Bind(0,messageid);\r
14         st.Bind(1,boardid);\r
15         st.Step();\r
16         while(st.RowReturned())\r
17         {\r
18                 int childid=0;\r
19                 std::string subject="";\r
20                 std::string fromname="";\r
21                 std::string datetime="";\r
22                 st.ResultInt(0,childid);\r
23                 st.ResultText(1,subject);\r
24                 st.ResultText(2,fromname);\r
25                 st.ResultText(3,datetime);\r
26                 \r
27                 threadnode node;\r
28                 node.m_messageid=childid;\r
29                 node.m_level=level;\r
30                 node.m_subject=subject;\r
31                 node.m_fromname=fromname;\r
32                 node.m_date=datetime;\r
33                 m_nodes.push_back(node);\r
34                 \r
35                 AddChildren(childid,level+1,boardid);\r
36                 \r
37                 st.Step();\r
38         }       \r
39 }\r
40 \r
41 const MessageThread::threadnode MessageThread::GetOriginalMessageNode(const long messageid, const long boardid)\r
42 {\r
43         SQLite3DB::Statement st=m_db->Prepare("SELECT tblMessage.MessageID, tblMessage.Subject, tblMessage.FromName, tblMessage.MessageDate || ' ' || tblMessage.MessageTime FROM tblMessageReplyTo INNER JOIN tblMessage ON tblMessageReplyTo.ReplyToMessageUUID=tblMessage.MessageUUID INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID WHERE tblMessageReplyTo.ReplyOrder=0 AND tblMessageReplyTo.MessageID=? AND tblMessageBoard.BoardID=?;");\r
44         st.Bind(0,messageid);\r
45         st.Bind(1,boardid);\r
46         st.Step();\r
47         if(st.RowReturned())\r
48         {\r
49                 int id=0;\r
50                 std::string subject="";\r
51                 std::string fromname="";\r
52                 std::string datetime="";\r
53                 st.ResultInt(0,id);\r
54                 st.ResultText(1,subject);\r
55                 st.ResultText(2,fromname);\r
56                 st.ResultText(3,datetime);\r
57 \r
58                 threadnode node;\r
59                 node.m_messageid=id;\r
60                 node.m_level=0;\r
61                 node.m_subject=subject;\r
62                 node.m_fromname=fromname;\r
63                 node.m_date=datetime;\r
64 \r
65                 return GetOriginalMessageNode(node.m_messageid,boardid);\r
66         }\r
67         else\r
68         {\r
69                 threadnode node;\r
70                 node.m_messageid=-1;\r
71                 node.m_level=0;\r
72                 node.m_subject="";\r
73                 node.m_fromname="";\r
74                 node.m_date="";\r
75 \r
76                 SQLite3DB::Statement st2=m_db->Prepare("SELECT Subject, FromName, MessageDate || ' ' || MessageTime FROM tblMessage WHERE MessageID=?;");\r
77                 st2.Bind(0,messageid);\r
78                 st2.Step();\r
79 \r
80                 if(st2.RowReturned())\r
81                 {\r
82                         node.m_messageid=messageid;\r
83                         st2.ResultText(0,node.m_subject);\r
84                         st2.ResultText(1,node.m_fromname);\r
85                         st2.ResultText(2,node.m_date);\r
86                 }\r
87 \r
88                 return node;\r
89         }\r
90 }\r
91 \r
92 const bool MessageThread::Load(const long messageid, const long boardid, const bool bydate)\r
93 {\r
94         threadnode originalmessagenode=GetOriginalMessageNode(messageid,boardid);\r
95         \r
96         if(originalmessagenode.m_messageid>=0)\r
97         {\r
98                 m_nodes.push_back(originalmessagenode);\r
99                 \r
100                 AddChildren(originalmessagenode.m_messageid,1,boardid);\r
101 \r
102                 if(bydate==true)\r
103                 {\r
104                         std::sort(m_nodes.begin(),m_nodes.end(),datecompare());\r
105                 }\r
106 \r
107                 return true;\r
108         }\r
109         else\r
110         {\r
111                 return false;\r
112         }\r
113 }\r
114 \r
115 const bool MessageThread::Load(const std::string &messageidstr, const long boardid, const bool bydate)\r
116 {\r
117         long messageid=0;\r
118         StringFunctions::Convert(messageidstr,messageid);\r
119         return Load(messageid,boardid,bydate);\r
120 }\r