version 0.3.23
[fms.git] / src / messagethread.cpp
diff --git a/src/messagethread.cpp b/src/messagethread.cpp
new file mode 100644 (file)
index 0000000..37e3693
--- /dev/null
@@ -0,0 +1,120 @@
+#include "../include/messagethread.h"\r
+#include "../include/stringfunctions.h"\r
+\r
+#include <algorithm>\r
+\r
+#ifdef XMEM\r
+       #include <xmem.h>\r
+#endif\r
+\r
+void MessageThread::AddChildren(const long messageid, const long level, const long boardid)\r
+{\r
+       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
+       st.Bind(0,messageid);\r
+       st.Bind(1,boardid);\r
+       st.Step();\r
+       while(st.RowReturned())\r
+       {\r
+               int childid=0;\r
+               std::string subject="";\r
+               std::string fromname="";\r
+               std::string datetime="";\r
+               st.ResultInt(0,childid);\r
+               st.ResultText(1,subject);\r
+               st.ResultText(2,fromname);\r
+               st.ResultText(3,datetime);\r
+               \r
+               threadnode node;\r
+               node.m_messageid=childid;\r
+               node.m_level=level;\r
+               node.m_subject=subject;\r
+               node.m_fromname=fromname;\r
+               node.m_date=datetime;\r
+               m_nodes.push_back(node);\r
+               \r
+               AddChildren(childid,level+1,boardid);\r
+               \r
+               st.Step();\r
+       }       \r
+}\r
+\r
+const MessageThread::threadnode MessageThread::GetOriginalMessageNode(const long messageid, const long boardid)\r
+{\r
+       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
+       st.Bind(0,messageid);\r
+       st.Bind(1,boardid);\r
+       st.Step();\r
+       if(st.RowReturned())\r
+       {\r
+               int id=0;\r
+               std::string subject="";\r
+               std::string fromname="";\r
+               std::string datetime="";\r
+               st.ResultInt(0,id);\r
+               st.ResultText(1,subject);\r
+               st.ResultText(2,fromname);\r
+               st.ResultText(3,datetime);\r
+\r
+               threadnode node;\r
+               node.m_messageid=id;\r
+               node.m_level=0;\r
+               node.m_subject=subject;\r
+               node.m_fromname=fromname;\r
+               node.m_date=datetime;\r
+\r
+               return GetOriginalMessageNode(node.m_messageid,boardid);\r
+       }\r
+       else\r
+       {\r
+               threadnode node;\r
+               node.m_messageid=-1;\r
+               node.m_level=0;\r
+               node.m_subject="";\r
+               node.m_fromname="";\r
+               node.m_date="";\r
+\r
+               SQLite3DB::Statement st2=m_db->Prepare("SELECT Subject, FromName, MessageDate || ' ' || MessageTime FROM tblMessage WHERE MessageID=?;");\r
+               st2.Bind(0,messageid);\r
+               st2.Step();\r
+\r
+               if(st2.RowReturned())\r
+               {\r
+                       node.m_messageid=messageid;\r
+                       st2.ResultText(0,node.m_subject);\r
+                       st2.ResultText(1,node.m_fromname);\r
+                       st2.ResultText(2,node.m_date);\r
+               }\r
+\r
+               return node;\r
+       }\r
+}\r
+\r
+const bool MessageThread::Load(const long messageid, const long boardid, const bool bydate)\r
+{\r
+       threadnode originalmessagenode=GetOriginalMessageNode(messageid,boardid);\r
+       \r
+       if(originalmessagenode.m_messageid>=0)\r
+       {\r
+               m_nodes.push_back(originalmessagenode);\r
+               \r
+               AddChildren(originalmessagenode.m_messageid,1,boardid);\r
+\r
+               if(bydate==true)\r
+               {\r
+                       std::sort(m_nodes.begin(),m_nodes.end(),datecompare());\r
+               }\r
+\r
+               return true;\r
+       }\r
+       else\r
+       {\r
+               return false;\r
+       }\r
+}\r
+\r
+const bool MessageThread::Load(const std::string &messageidstr, const long boardid, const bool bydate)\r
+{\r
+       long messageid=0;\r
+       StringFunctions::Convert(messageidstr,messageid);\r
+       return Load(messageid,boardid,bydate);\r
+}\r