| | @@ -162,10 +162,108 @@ |
| 162 | 162 | */ |
| 163 | 163 | void search_sql_setup(Search *p){ |
| 164 | 164 | sqlite3_create_function(g.db, "score", 1, SQLITE_UTF8, p, |
| 165 | 165 | search_score_sqlfunc, 0, 0); |
| 166 | 166 | } |
| 167 | + |
| 168 | +/* |
| 169 | +** WEBPAGE: search |
| 170 | +** URL: /search |
| 171 | +*/ |
| 172 | +void search(void){ |
| 173 | + const char *zType; |
| 174 | + const char *zSrchType; |
| 175 | + const char *zTitle; |
| 176 | + const char *zContent; |
| 177 | + const char *zSrch; |
| 178 | + const char *zUuid; |
| 179 | + const char *zRid; |
| 180 | + char zrn[4]; |
| 181 | + char zshUuid[10]; |
| 182 | + int zScore; |
| 183 | + int zSrchTypeFlag; |
| 184 | + |
| 185 | + Search *zSrchpat; |
| 186 | + Stmt q; |
| 187 | + |
| 188 | + zSrch = PD("search", ""); |
| 189 | + zSrchType = PD("type", ""); |
| 190 | + zSrchpat = search_init(zSrch); |
| 191 | + search_sql_setup(zSrchpat); |
| 192 | + |
| 193 | + login_check_credentials(); |
| 194 | + |
| 195 | + if( !g.okHistory ){ login_needed(); return; } |
| 196 | + |
| 197 | + db_prepare(&q, "SELECT type, rid, title, content, score(content) AS score FROM " |
| 198 | + " " |
| 199 | + "(SELECT 'checkin' AS type, objid AS rid, coalesce(ecomment, comment) AS title, " |
| 200 | + "coalesce(ecomment, comment) AS content FROM event WHERE type='ci' UNION ALL " |
| 201 | + "SELECT 'code' AS type, rid, title, content FROM " |
| 202 | + "(SELECT title, rid, content_get(rid) as content FROM " |
| 203 | + "(SELECT name AS title, get_file_rid(fnid) AS rid FROM " |
| 204 | + "(SELECT name, fnid FROM filename))) UNION ALL " |
| 205 | + " " |
| 206 | + "SELECT 'ticket' AS type, tkt_uuid AS rid, title, coalesce(title, comment) AS content FROM ticket UNION ALL " |
| 207 | + "SELECT 'wiki' AS type, rid, SUBSTR(title, 6) AS title, content_get(rid) as content FROM " |
| 208 | + "(SELECT tagname AS title, get_wiki_rid(tagid) AS rid FROM " |
| 209 | + "(SELECT tagname, tagid FROM tag WHERE tagname LIKE 'wiki-%%')))" |
| 210 | + "ORDER BY score DESC;"); |
| 211 | + |
| 212 | + zSrchTypeFlag = 0; |
| 213 | + if (strcmp(zSrchType, "code") == 0) |
| 214 | + zSrchTypeFlag = 1; |
| 215 | + else if (strcmp(zSrchType, "tickets") == 0) |
| 216 | + zSrchTypeFlag = 2; |
| 217 | + else if (strcmp(zSrchType, "checkins") == 0) |
| 218 | + zSrchTypeFlag = 3; |
| 219 | + else if (strcmp(zSrchType, "wiki") == 0) |
| 220 | + zSrchTypeFlag = 4; |
| 221 | + |
| 222 | + style_header("Search"); |
| 223 | + style_submenu_element("Code", "Code", "search?search=%T&type=code", zSrch); |
| 224 | + style_submenu_element("Tickets", "Tickets", "search?search=%T&type=tickets", zSrch); |
| 225 | + style_submenu_element("Checkins", "Checkins", "search?search=%T&type=checkins", zSrch); |
| 226 | + style_submenu_element("Wiki", "Wiki", "search?search=%T&type=wiki", zSrch); |
| 227 | + @ <table border=1> |
| 228 | + @ <tr><td>link</td><td>relevance</td><td>title</td><td>type</td></tr> |
| 229 | + while (db_step(&q) == SQLITE_ROW){ |
| 230 | + zType = db_column_text(&q, 0); |
| 231 | + zRid = db_column_text(&q, 1); |
| 232 | + zTitle = db_column_text(&q, 2); |
| 233 | + zContent = db_column_text(&q, 3); |
| 234 | + zScore = db_column_int(&q, 4); |
| 235 | + |
| 236 | + sprintf(zrn, "%i", zScore); |
| 237 | + if (zScore > 0){ |
| 238 | + if (strcmp(zType, "code") == 0 && (zSrchTypeFlag == 0 || zSrchTypeFlag == 1)){ |
| 239 | + zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%h", zRid); |
| 240 | + strncpy(zshUuid, zUuid, 10); |
| 241 | + @ <tr><td><a href='/artifact?name=%h(zUuid)'>%h(zshUuid)</a></td><td>%h(zrn)</td> |
| 242 | + @ <td>%h(zTitle)</td><td>%h(zType)</td></tr> |
| 243 | + } |
| 244 | + else if (strcmp(zType, "ticket") == 0 && (zSrchTypeFlag == 0 || zSrchTypeFlag == 2)){ |
| 245 | + strncpy(zshUuid, zRid, 10); |
| 246 | + @ <tr><td><a href='/tktview?name=%h(zRid)'>%h(zshUuid)</a></td><td>%h(zrn)</td> |
| 247 | + @ <td>%h(zTitle)</td><td>%h(zType)</td></tr> |
| 248 | + } |
| 249 | + else if (strcmp(zType, "checkin") == 0 && (zSrchTypeFlag == 0 || zSrchTypeFlag == 3)){ |
| 250 | + zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%h", zRid); |
| 251 | + strncpy(zshUuid, zUuid, 10); |
| 252 | + @ <tr><td><a href='info/%h(zUuid)'>%h(zshUuid)</a></td><td>%h(zrn)</td> |
| 253 | + @ <td>%h(zTitle)</td><td>%h(zType)</td></tr> |
| 254 | + } |
| 255 | + else if (strcmp(zType, "wiki") == 0 && (zSrchTypeFlag == 0 || zSrchTypeFlag == 4)){ |
| 256 | + @ <tr><td><a href='/wiki?name=%h(zTitle)'>%h(zTitle)</a></td><td>%h(zrn)</td> |
| 257 | + @ <td>%h(zTitle)</td><td>%h(zType)</td></tr> |
| 258 | + } |
| 259 | + } |
| 260 | + } |
| 261 | + @ </table> |
| 262 | + db_finalize(&q); |
| 263 | + style_footer(); |
| 264 | +} |
| 167 | 265 | |
| 168 | 266 | /* |
| 169 | 267 | ** Testing the search function. |
| 170 | 268 | ** |
| 171 | 269 | ** COMMAND: search |
| 172 | 270 | |