e759cd66254e6fedfb28380e4abeac4eeabd9c80
[fms.git] / src / http / pages / browseboardspage.cpp
1 #include "../../../include/http/pages/browseboardspage.h"\r
2 #include "../../../include/stringfunctions.h"\r
3 \r
4 #ifdef XMEM\r
5         #include <xmem.h>\r
6 #endif\r
7 \r
8 const std::string BrowseBoardsPage::BuildQueryString(const long startrow, const std::string &boardsearch, const std::string &sortby, const std::string &sortorder)\r
9 {\r
10         std::string returnval="";\r
11         std::string tempval="";\r
12 \r
13         if(startrow>=0)\r
14         {\r
15                 StringFunctions::Convert(startrow,tempval);\r
16                 returnval+="startrow="+tempval;\r
17         }\r
18 \r
19         if(boardsearch!="")\r
20         {\r
21                 if(returnval!="")\r
22                 {\r
23                         returnval+="&";\r
24                 }\r
25                 returnval+="boardsearch="+boardsearch;\r
26         }\r
27 \r
28         if(sortby!="")\r
29         {\r
30                 if(returnval!="")\r
31                 {\r
32                         returnval+="&";\r
33                 }\r
34                 returnval+="sortby="+sortby;\r
35                 if(sortorder=="ASC" || sortorder=="DESC")\r
36                 {\r
37                         if(returnval!="")\r
38                         {\r
39                                 returnval+="&";\r
40                         }\r
41                         returnval+="sortorder="+sortorder;\r
42                 }\r
43                 else\r
44                 {\r
45                         if(returnval!="")\r
46                         {\r
47                                 returnval+="&";\r
48                         }\r
49                         returnval+="sortorder=ASC";\r
50                 }\r
51         }\r
52 \r
53         return returnval;\r
54 \r
55 }\r
56 \r
57 const std::string BrowseBoardsPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
58 {\r
59         std::string content="";\r
60         std::string sql="";\r
61         std::string boardname="";\r
62         int rowsperpage=25;\r
63         std::string rowsperpagestr="26";        // 1 more than rowsperpage so we know if there are more boards\r
64         long startrow=0;\r
65         std::string startrowstr="0";\r
66         int messagecount=0;\r
67         std::string messagecountstr="0";\r
68         std::string lastdate="";\r
69         int count=0;\r
70         std::string boardsearch="";\r
71         std::string sortby="";\r
72         std::string sortorder="";\r
73 \r
74         // if startrow is specified\r
75         if(queryvars.find("startrow")!=queryvars.end())\r
76         {\r
77                 startrowstr=(*queryvars.find("startrow")).second;\r
78                 // convert back and forth, just in case a number wasn't passed in startrow\r
79                 StringFunctions::Convert(startrowstr,startrow);\r
80                 if(startrow<0)\r
81                 {\r
82                         startrow=0;\r
83                 }\r
84                 StringFunctions::Convert(startrow,startrowstr);\r
85         }\r
86         if(queryvars.find("boardsearch")!=queryvars.end())\r
87         {\r
88                 boardsearch=(*queryvars.find("boardsearch")).second;\r
89         }\r
90         if(queryvars.find("sortby")!=queryvars.end() && queryvars.find("sortorder")!=queryvars.end())\r
91         {\r
92                 sortby=(*queryvars.find("sortby")).second;\r
93                 sortorder=(*queryvars.find("sortorder")).second;\r
94                 if(sortby!="BoardName" && sortby!="MessageCount" && sortby!="LastMessage")\r
95                 {\r
96                         sortby="BoardName";\r
97                 }\r
98                 if(sortorder!="ASC" && sortorder!="DESC")\r
99                 {\r
100                         sortorder="ASC";\r
101                 }\r
102         }\r
103         else\r
104         {\r
105                 sortby="BoardName";\r
106                 sortorder="ASC";\r
107         }\r
108 \r
109         content="<h2>Browse Messages</h2>";\r
110         content+="<form name=\"frmfilter\" method=\"post\" action=\""+m_pagename+"\">";\r
111         content+="<input type=\"text\" name=\"boardsearch\" value=\""+SanitizeOutput(boardsearch)+"\">";\r
112         content+="<input type=\"submit\" value=\"Filter\">";\r
113         content+="</form>";\r
114 \r
115         content+="<table class=\"small90\">";\r
116         content+="<tr>";\r
117         content+="<th><a href=\""+m_pagename+"?"+BuildQueryString(startrow,boardsearch,"BoardName",ReverseSort("BoardName",sortby,sortorder))+"\">Board</a></th>";\r
118         content+="<th><a href=\""+m_pagename+"?"+BuildQueryString(startrow,boardsearch,"MessageCount",ReverseSort("MessageCount",sortby,sortorder))+"\">Message Count</a></th>";\r
119         content+="<th><a href=\""+m_pagename+"?"+BuildQueryString(startrow,boardsearch,"LastMessage",ReverseSort("LastMessage",sortby,sortorder))+"\">Last Message</a></th>";\r
120         content+="</tr>";\r
121 \r
122         sql="SELECT tblBoard.BoardID, tblBoard.BoardName, COUNT(tblMessageBoard.MessageID) AS 'MessageCount', MAX(tblMessage.MessageDate || ' ' || tblMessage.MessageTime) AS 'LastMessage'";\r
123         sql+="FROM tblBoard LEFT JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID ";\r
124         sql+="LEFT JOIN tblMessage ON tblMessageBoard.MessageID=tblMessage.MessageID ";\r
125         sql+="WHERE (tblMessageBoard.MessageID>=0 OR tblMessageBoard.MessageID IS NULL) ";\r
126         if(boardsearch!="")\r
127         {\r
128                 sql+="AND tblBoard.BoardName LIKE '%' || ? || '%' ";\r
129         }\r
130         sql+="GROUP BY tblBoard.BoardID ";\r
131         sql+="ORDER BY "+sortby+" COLLATE NOCASE "+sortorder+" ";\r
132         sql+="LIMIT "+startrowstr+","+rowsperpagestr+";";\r
133         \r
134         SQLite3DB::Statement st=m_db->Prepare(sql);\r
135         if(boardsearch!="")\r
136         {\r
137                 st.Bind(0,boardsearch);\r
138         }\r
139         \r
140         st.Step();\r
141         while(st.RowReturned() && count++<rowsperpage)\r
142         {\r
143                 boardname="";\r
144                 messagecount=0;\r
145                 lastdate="";\r
146                 std::string boardidstr="0";\r
147                 st.ResultText(0,boardidstr);\r
148                 st.ResultText(1,boardname);\r
149                 st.ResultInt(2,messagecount);\r
150                 st.ResultText(3,lastdate);\r
151 \r
152                 StringFunctions::Convert(messagecount,messagecountstr);\r
153 \r
154                 content+="<tr>";\r
155                 content+="<td><a href=\"browsemessages.htm?boardid="+boardidstr+"\">"+SanitizeOutput(boardname)+"</a></td>";\r
156                 content+="<td>"+SanitizeOutput(messagecountstr)+"</td>";\r
157                 content+="<td>"+SanitizeOutput(lastdate)+"</td>";\r
158                 content+="</tr>\r\n";\r
159                 st.Step();\r
160         }\r
161 \r
162         if(startrow>0 || st.RowReturned())\r
163         {\r
164                 content+="<tr>";\r
165 \r
166                 if(startrow>0)\r
167                 {\r
168                         int thisstartrow=startrow-rowsperpage;\r
169                         if(thisstartrow<0)\r
170                         {\r
171                                 thisstartrow=0;\r
172                         }\r
173                         content+="<td><a href=\"boardsbrowse.htm?"+BuildQueryString(thisstartrow,boardsearch,sortby,sortorder)+"\">&lt;--</a></td>";\r
174                 }\r
175                 else\r
176                 {\r
177                         content+="<td></td>";\r
178                 }\r
179 \r
180                 content+="<td></td>";\r
181 \r
182                 if(st.RowReturned())\r
183                 {\r
184                         int thisstartrow=startrow+rowsperpage;\r
185                         content+="<td><a href=\"boardsbrowse.htm?"+BuildQueryString(thisstartrow,boardsearch,sortby,sortorder)+"\">--&gt;</a></td>";\r
186                 }\r
187 \r
188                 content+="</tr>";\r
189         }\r
190         content+="</table>";\r
191         \r
192         return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
193 }\r
194 \r
195 const std::string BrowseBoardsPage::ReverseSort(const std::string &sortname, const std::string &currentsortby, const std::string &currentsortorder)\r
196 {\r
197         if(sortname==currentsortby)\r
198         {\r
199                 if(currentsortorder=="ASC")\r
200                 {\r
201                         return "DESC";\r
202                 }\r
203                 else\r
204                 {\r
205                         return "ASC";\r
206                 }\r
207         }\r
208         else\r
209         {\r
210                 return currentsortorder;\r
211         }\r
212 }\r