| | @@ -78,11 +78,11 @@ |
| 78 | 78 | ** A small search form which forwards to ?like=SEARCH_STRING |
| 79 | 79 | */ |
| 80 | 80 | static void tagview_page_search_miniform(void){ |
| 81 | 81 | char const * like = P("like"); |
| 82 | 82 | @ <div style='font-size:smaller'> |
| 83 | | - @ <form action='/tagview' method='post'> |
| 83 | + @ <form action='tagview' method='post'> |
| 84 | 84 | @ Search for tags: |
| 85 | 85 | @ <input type='text' name='like' value='%h((like?like:""))' size='10'/> |
| 86 | 86 | @ <input type='submit'/> |
| 87 | 87 | @ </form> |
| 88 | 88 | @ </div> |
| | @@ -134,15 +134,40 @@ |
| 134 | 134 | tagname); |
| 135 | 135 | db_generic_query_view(zSql, 1); |
| 136 | 136 | free(zSql); |
| 137 | 137 | } |
| 138 | 138 | |
| 139 | +/* |
| 140 | +** Get the UUIDs for a tag |
| 141 | +*/ |
| 142 | +char *tag_query_for_www(const char *pName){ |
| 143 | + static const char zBaseSql[] = |
| 144 | + @ SELECT |
| 145 | + @ blob.rid, |
| 146 | + @ uuid, |
| 147 | + @ datetime(event.mtime,'localtime') AS timestamp, |
| 148 | + @ coalesce(ecomment, comment), |
| 149 | + @ coalesce(euser, user), |
| 150 | + @ (SELECT count(*) FROM plink WHERE pid=blob.rid AND isprim=1), |
| 151 | + @ (SELECT count(*) FROM plink WHERE cid=blob.rid), |
| 152 | + @ NOT EXISTS (SELECT 1 FROM plink WHERE pid=blob.rid), |
| 153 | + @ coalesce(bgcolor, brbgcolor), |
| 154 | + @ event.type |
| 155 | + @ FROM event JOIN blob JOIN tagxref |
| 156 | + @ WHERE blob.rid=event.objid |
| 157 | + @ AND tagxref.rid = event.objid |
| 158 | + @ AND tagxref.tagid = (SELECT tagid FROM tag |
| 159 | + @ WHERE tagname = 'sym-'||%Q) |
| 160 | + @ ORDER BY 3 desc |
| 161 | + ; |
| 162 | + return mprintf(zBaseSql,pName); |
| 163 | +} |
| 139 | 164 | |
| 140 | 165 | /* |
| 141 | | -** WEBPAGE: /tagview |
| 166 | +** WEBP AGE: /tagview |
| 142 | 167 | */ |
| 143 | | -void tagview_page(void){ |
| 168 | +void old_tagview_page(void){ |
| 144 | 169 | char const * check = 0; |
| 145 | 170 | login_check_credentials(); |
| 146 | 171 | if( !g.okRdWiki ){ |
| 147 | 172 | login_needed(); |
| 148 | 173 | } |
| | @@ -159,7 +184,61 @@ |
| 159 | 184 | }else{ |
| 160 | 185 | tagview_page_default(); |
| 161 | 186 | } |
| 162 | 187 | style_footer(); |
| 163 | 188 | } |
| 189 | + |
| 190 | +/* |
| 191 | +** WEBPAGE: /tagview |
| 192 | +*/ |
| 193 | +void tagview_page(void){ |
| 194 | + char const *zName = 0; |
| 195 | + login_check_credentials(); |
| 196 | + if( !g.okRead ){ |
| 197 | + login_needed(); |
| 198 | + } |
| 199 | + login_anonymous_available(); |
| 200 | + if( 0 != (zName = P("name")) ){ |
| 201 | + Blob uuid; |
| 202 | + char *zSql; |
| 203 | + Stmt q; |
| 204 | + if( sym_tag_to_uuid(zName, &uuid) > 0){ |
| 205 | + style_header("Tagged Baselines"); |
| 206 | + @ <h2>%s(zName):</h2> |
| 207 | + zSql = tag_query_for_www(zName); |
| 208 | + db_prepare(&q, zSql); |
| 209 | + free(zSql); |
| 210 | + www_print_timeline(&q); |
| 211 | + db_finalize(&q); |
| 212 | + }else{ |
| 213 | + style_header("TaggedBaselines"); |
| 214 | + @ <h2>%s(zName):</h2> |
| 215 | + @ There is no artifact with this tag. |
| 216 | + } |
| 217 | + }else{ |
| 218 | + Stmt q; |
| 219 | + const char *prefix = "sym-"; |
| 220 | + int preflen = strlen(prefix); |
| 221 | + style_header("Tags"); |
| 222 | + db_prepare(&q, |
| 223 | + "SELECT tagname" |
| 224 | + " FROM tag" |
| 225 | + " WHERE EXISTS(SELECT 1 FROM tagxref" |
| 226 | + " WHERE tagid=tag.tagid" |
| 227 | + " AND tagtype>0)" |
| 228 | + " ORDER BY tagname" |
| 229 | + ); |
| 230 | + @ <ul> |
| 231 | + while( db_step(&q)==SQLITE_ROW ){ |
| 232 | + const char *name = db_column_text(&q, 0); |
| 233 | + if( strncmp(name, prefix, preflen)==0 ){ |
| 234 | + @ <li><a href=%s(g.zBaseURL)/tagview?name=%s(name+preflen)> |
| 235 | + @ %s(name+preflen)</a></li> |
| 236 | + } |
| 237 | + } |
| 238 | + @ </ul> |
| 239 | + db_finalize(&q); |
| 240 | + } |
| 241 | + style_footer(); |
| 242 | +} |
| 164 | 243 | |
| 165 | 244 | #undef TAGVIEW_DEFAULT_FILTER |
| 166 | 245 | |