File Annotation
Not logged in
02d1ed6ad2 2008-02-02   stephan: /*
02d1ed6ad2 2008-02-02   stephan: ** Copyright (c) 2007 D. Richard Hipp
2ab3a2f603 2008-02-03   stephan: ** Copyright (c) 2008 Stephan Beal
02d1ed6ad2 2008-02-02   stephan: **
02d1ed6ad2 2008-02-02   stephan: ** This program is free software; you can redistribute it and/or
02d1ed6ad2 2008-02-02   stephan: ** modify it under the terms of the GNU General Public
02d1ed6ad2 2008-02-02   stephan: ** License as published by the Free Software Foundation; either
02d1ed6ad2 2008-02-02   stephan: ** version 2 of the License, or (at your option) any later version.
02d1ed6ad2 2008-02-02   stephan: **
02d1ed6ad2 2008-02-02   stephan: ** This program is distributed in the hope that it will be useful,
02d1ed6ad2 2008-02-02   stephan: ** but WITHOUT ANY WARRANTY; without even the implied warranty of
02d1ed6ad2 2008-02-02   stephan: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
02d1ed6ad2 2008-02-02   stephan: ** General Public License for more details.
02d1ed6ad2 2008-02-02   stephan: **
02d1ed6ad2 2008-02-02   stephan: ** You should have received a copy of the GNU General Public
02d1ed6ad2 2008-02-02   stephan: ** License along with this library; if not, write to the
02d1ed6ad2 2008-02-02   stephan: ** Free Software Foundation, Inc., 59 Temple Place - Suite 330,
02d1ed6ad2 2008-02-02   stephan: ** Boston, MA  02111-1307, USA.
02d1ed6ad2 2008-02-02   stephan: **
02d1ed6ad2 2008-02-02   stephan: ** Author contact information:
02d1ed6ad2 2008-02-02   stephan: **   drh@hwaci.com
02d1ed6ad2 2008-02-02   stephan: **   http://www.hwaci.com/drh/
02d1ed6ad2 2008-02-02   stephan: **
02d1ed6ad2 2008-02-02   stephan: *******************************************************************************
02d1ed6ad2 2008-02-02   stephan: **
02d1ed6ad2 2008-02-02   stephan: ** Implementation of the Tag View page
02d1ed6ad2 2008-02-02   stephan: */
02d1ed6ad2 2008-02-02   stephan: #include <assert.h>
02d1ed6ad2 2008-02-02   stephan: #include "config.h"
02d1ed6ad2 2008-02-02   stephan: #include "tagview.h"
02d1ed6ad2 2008-02-02   stephan: 
02d1ed6ad2 2008-02-02   stephan: 
2cb3290e67 2008-02-03   stephan: #if 1
2cb3290e67 2008-02-03   stephan: #  define TAGVIEW_DEFAULT_FILTER "AND t.tagname NOT GLOB 'wiki-*' "
2cb3290e67 2008-02-03   stephan: #else
2cb3290e67 2008-02-03   stephan: #  define TAGVIEW_DEFAULT_FILTER
02a7c850b4 2008-02-03   stephan: #endif
02a7c850b4 2008-02-03   stephan: 
02d1ed6ad2 2008-02-02   stephan: /*
007d1ce44f 2008-02-07       drh: ** Lists all tags matching the given LIKE clause (which
007d1ce44f 2008-02-07       drh: ** may be 0).
02d1ed6ad2 2008-02-02   stephan: */
007d1ce44f 2008-02-07       drh: static void tagview_page_list_tags(const char *zLike){
007d1ce44f 2008-02-07       drh:   char *zLikeClause = 0;
9c01af2d22 2008-02-03   stephan:   const int limit = 10;
007d1ce44f 2008-02-07       drh:   char *zLimit = 0;
007d1ce44f 2008-02-07       drh:   char *zSql;
2ab3a2f603 2008-02-03   stephan: 
007d1ce44f 2008-02-07       drh:   if( zLike && zLike[0] ){
007d1ce44f 2008-02-07       drh:     zLikeClause = mprintf( "AND t.tagname LIKE '%%%q%%'", zLike );
007d1ce44f 2008-02-07       drh:     zLimit = "";
007d1ce44f 2008-02-07       drh:     @ <h2>Tags matching [%h(zLikeClause)]:</h2>
02d1ed6ad2 2008-02-02   stephan:   }else{
007d1ce44f 2008-02-07       drh:     zLimit = mprintf( "LIMIT %d", limit );
007d1ce44f 2008-02-07       drh:     zLikeClause = "";
2ab3a2f603 2008-02-03   stephan:     @ <h2>%d(limit) most recent tags:</h2>
02d1ed6ad2 2008-02-02   stephan:   }
007d1ce44f 2008-02-07       drh:   zSql = mprintf(
007d1ce44f 2008-02-07       drh:     "SELECT "
007d1ce44f 2008-02-07       drh:     "   linktagid(t.tagid) AS 'Tag ID',"
007d1ce44f 2008-02-07       drh:     "   linktagname(t.tagname) AS 'Name',"
007d1ce44f 2008-02-07       drh:     "   DATETIME(tx.mtime) AS 'Timestamp',"
007d1ce44f 2008-02-07       drh:     "   linkuuid(b.uuid) AS 'Version'"
007d1ce44f 2008-02-07       drh:     "  FROM tag t, tagxref tx, blob b "
007d1ce44f 2008-02-07       drh:     " WHERE t.tagid=tx.tagid AND tx.srcid=b.rid"
007d1ce44f 2008-02-07       drh:     "   AND tx.tagtype!=0 %s "
9c01af2d22 2008-02-03   stephan:     TAGVIEW_DEFAULT_FILTER
007d1ce44f 2008-02-07       drh:     " ORDER BY tx.mtime DESC %s",
007d1ce44f 2008-02-07       drh:     zLikeClause, zLimit
007d1ce44f 2008-02-07       drh:   );
007d1ce44f 2008-02-07       drh:   db_generic_query_view(zSql, 1);
007d1ce44f 2008-02-07       drh:   free(zSql);
6d67f3c7c7 2008-02-08   stephan:   if( zLikeClause[0] ) free(zLikeClause);
6d67f3c7c7 2008-02-08   stephan:   if( zLimit[0] ) free(zLimit);
2ab3a2f603 2008-02-03   stephan: }
2ab3a2f603 2008-02-03   stephan: 
007d1ce44f 2008-02-07       drh: /*
007d1ce44f 2008-02-07       drh: ** A small search form which forwards to ?like=SEARCH_STRING
9c01af2d22 2008-02-03   stephan: */
2ab3a2f603 2008-02-03   stephan: static void tagview_page_search_miniform(void){
2ab3a2f603 2008-02-03   stephan:   char const * like = P("like");
2ab3a2f603 2008-02-03   stephan:   @ <div style='font-size:smaller'>
2ab3a2f603 2008-02-03   stephan:   @ <form action='/tagview' method='post'>
2ab3a2f603 2008-02-03   stephan:   @ Search for tags:
007d1ce44f 2008-02-07       drh:   @ <input type='text' name='like' value='%h((like?like:""))' size='10'/>
2ab3a2f603 2008-02-03   stephan:   @ <input type='submit'/>
2ab3a2f603 2008-02-03   stephan:   @ </form>
2ab3a2f603 2008-02-03   stephan:   @ </div>
2ab3a2f603 2008-02-03   stephan: }
2ab3a2f603 2008-02-03   stephan: 
007d1ce44f 2008-02-07       drh: /*
007d1ce44f 2008-02-07       drh: ** tagview_page_default() renders the default page for tagview_page().
9c01af2d22 2008-02-03   stephan: */
2ab3a2f603 2008-02-03   stephan: static void tagview_page_default(void){
2ab3a2f603 2008-02-03   stephan:   tagview_page_list_tags( 0 );
2ab3a2f603 2008-02-03   stephan: }
2ab3a2f603 2008-02-03   stephan: 
007d1ce44f 2008-02-07       drh: /*
007d1ce44f 2008-02-07       drh: ** Lists all tags matching the given tagid.
9c01af2d22 2008-02-03   stephan: */
007d1ce44f 2008-02-07       drh: static void tagview_page_tag_by_id( int tagid ){
007d1ce44f 2008-02-07       drh:   char *zSql;
9c01af2d22 2008-02-03   stephan:   @ <h2>Tag #%d(tagid):</h2>
007d1ce44f 2008-02-07       drh:   zSql = mprintf(
007d1ce44f 2008-02-07       drh:     "SELECT DISTINCT"
007d1ce44f 2008-02-07       drh:     "       linktagname(t.tagname) AS 'Tag Name',"
007d1ce44f 2008-02-07       drh:     "       DATETIME(tx.mtime) AS 'Timestamp',"
007d1ce44f 2008-02-07       drh:     "       linkuuid(b.uuid) AS 'Version'"
007d1ce44f 2008-02-07       drh:     "  FROM tag t, tagxref tx, blob b"
007d1ce44f 2008-02-07       drh:     " WHERE t.tagid=%d AND t.tagid=tx.tagid AND tx.srcid=b.rid "
9c01af2d22 2008-02-03   stephan:     TAGVIEW_DEFAULT_FILTER
007d1ce44f 2008-02-07       drh:     " ORDER BY tx.mtime DESC",
007d1ce44f 2008-02-07       drh:     tagid
007d1ce44f 2008-02-07       drh:   );
007d1ce44f 2008-02-07       drh:   db_generic_query_view(zSql, 1);
007d1ce44f 2008-02-07       drh:   free(zSql);
2ab3a2f603 2008-02-03   stephan: }
2ab3a2f603 2008-02-03   stephan: 
007d1ce44f 2008-02-07       drh: /*
007d1ce44f 2008-02-07       drh: ** Lists all tags matching the given tag name.
b81e93f576 2008-02-03   stephan: */
007d1ce44f 2008-02-07       drh: static void tagview_page_tag_by_name( char const * tagname ){
007d1ce44f 2008-02-07       drh:   char *zSql;
2ab3a2f603 2008-02-03   stephan:   @ <h2>Tag '%s(tagname)':</h2>
007d1ce44f 2008-02-07       drh:   zSql = mprintf(
007d1ce44f 2008-02-07       drh:     "SELECT DISTINCT"
007d1ce44f 2008-02-07       drh:     "       linktagid(t.tagid) AS 'Tag ID',"
007d1ce44f 2008-02-07       drh:     "       DATETIME(tx.mtime) AS 'Timestamp',"
007d1ce44f 2008-02-07       drh:     "       linkuuid(b.uuid) AS 'Version'"
007d1ce44f 2008-02-07       drh:     "  FROM tag t, tagxref tx, blob b "
007d1ce44f 2008-02-07       drh:     " WHERE t.tagname='%q' AND t.tagid=tx.tagid AND tx.srcid=b.rid "
9c01af2d22 2008-02-03   stephan:     TAGVIEW_DEFAULT_FILTER
007d1ce44f 2008-02-07       drh:     " ORDER BY tx.mtime DESC",
9c01af2d22 2008-02-03   stephan:     tagname);
007d1ce44f 2008-02-07       drh:   db_generic_query_view(zSql, 1);
007d1ce44f 2008-02-07       drh:   free(zSql);
02d1ed6ad2 2008-02-02   stephan: }
2ab3a2f603 2008-02-03   stephan: 
02d1ed6ad2 2008-02-02   stephan: 
02d1ed6ad2 2008-02-02   stephan: /*
02d1ed6ad2 2008-02-02   stephan: ** WEBPAGE: /tagview
02d1ed6ad2 2008-02-02   stephan: */
02d1ed6ad2 2008-02-02   stephan: void tagview_page(void){
908009fdc4 2008-05-07       drh:   char const * check = 0;
02d1ed6ad2 2008-02-02   stephan:   login_check_credentials();
9c01af2d22 2008-02-03   stephan:   if( !g.okRdWiki ){
02d1ed6ad2 2008-02-02   stephan:     login_needed();
02d1ed6ad2 2008-02-02   stephan:   }
2ab3a2f603 2008-02-03   stephan:   style_header("Tags");
d57de28756 2008-05-05       drh:   login_anonymous_available();
2ab3a2f603 2008-02-03   stephan:   tagview_page_search_miniform();
2ab3a2f603 2008-02-03   stephan:   @ <hr/>
007d1ce44f 2008-02-07       drh:   if( 0 != (check = P("tagid")) ){
2ab3a2f603 2008-02-03   stephan:     tagview_page_tag_by_id( atoi(check) );
007d1ce44f 2008-02-07       drh:   }else if( 0 != (check = P("like")) ){
2ab3a2f603 2008-02-03   stephan:     tagview_page_list_tags( check );
007d1ce44f 2008-02-07       drh:   }else if( 0 != (check = P("name")) ){
2ab3a2f603 2008-02-03   stephan:     tagview_page_tag_by_name( check );
007d1ce44f 2008-02-07       drh:   }else{
2ab3a2f603 2008-02-03   stephan:     tagview_page_default();
10437374a7 2008-02-02       drh:   }
02d1ed6ad2 2008-02-02   stephan:   style_footer();
02d1ed6ad2 2008-02-02   stephan: }
02d1ed6ad2 2008-02-02   stephan: 
2cb3290e67 2008-02-03   stephan: #undef TAGVIEW_DEFAULT_FILTER