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
2cb3290e67 2008-02-03   stephan: #endif
2ab3a2f603 2008-02-03   stephan: 
02a7c850b4 2008-02-03   stephan: /**
02a7c850b4 2008-02-03   stephan:   Lists all tags matching the given LIKE clause (which
02a7c850b4 2008-02-03   stephan: may be 0).
02d1ed6ad2 2008-02-02   stephan: */
2ab3a2f603 2008-02-03   stephan: static void tagview_page_list_tags( char const * like )
2ab3a2f603 2008-02-03   stephan: {
2ab3a2f603 2008-02-03   stephan:   char * likeclause = 0;
2ab3a2f603 2008-02-03   stephan:   const int limit = 10;
2ab3a2f603 2008-02-03   stephan:   char * limitstr = 0;
2ab3a2f603 2008-02-03   stephan:   if( like && strlen(like) )
2ab3a2f603 2008-02-03   stephan:   {
2ab3a2f603 2008-02-03   stephan:     likeclause = mprintf( "AND t.tagname LIKE '%%%%%q%%%%'", like );
2ab3a2f603 2008-02-03   stephan:     @ <h2>Tags matching [%s(likeclause)]:</h2>
2ab3a2f603 2008-02-03   stephan:   }
2ab3a2f603 2008-02-03   stephan:   else
2ab3a2f603 2008-02-03   stephan:   {
2ab3a2f603 2008-02-03   stephan:     limitstr = mprintf( "LIMIT %d", limit );
2ab3a2f603 2008-02-03   stephan:     @ <h2>%d(limit) most recent tags:</h2>
02d1ed6ad2 2008-02-02   stephan:   }
2ab3a2f603 2008-02-03   stephan:   char * sql = mprintf(
2ab3a2f603 2008-02-03   stephan:     "SELECT t.tagid, t.tagname, DATETIME(tx.mtime), b.uuid "
2ab3a2f603 2008-02-03   stephan:     "FROM tag t, tagxref tx, blob b "
2ab3a2f603 2008-02-03   stephan:     "WHERE (t.tagid=tx.tagid) and (tx.srcid=b.rid) "
2ab3a2f603 2008-02-03   stephan:     "AND (tx.tagtype != 0) %s "
2cb3290e67 2008-02-03   stephan:     TAGVIEW_DEFAULT_FILTER
2ab3a2f603 2008-02-03   stephan:     "ORDER BY tx.mtime DESC %s",
2ab3a2f603 2008-02-03   stephan:     likeclause ? likeclause : " ",
2ab3a2f603 2008-02-03   stephan:     limitstr ? limitstr : " "
2ab3a2f603 2008-02-03   stephan:     );
2cb3290e67 2008-02-03   stephan:   if( limitstr ) free(limitstr);
2cb3290e67 2008-02-03   stephan:   if( likeclause ) free(likeclause);
02a7c850b4 2008-02-03   stephan:   char const * const colnames[] = {
02a7c850b4 2008-02-03   stephan:     "Tag ID", "Name", "Timestamp", "Version"
02a7c850b4 2008-02-03   stephan:   };
9c01af2d22 2008-02-03   stephan:   string_unary_xform_f xf[] = {
9c01af2d22 2008-02-03   stephan:     strxform_link_to_tagid,
9c01af2d22 2008-02-03   stephan:     strxform_link_to_tagname,
02a7c850b4 2008-02-03   stephan:     0,
9c01af2d22 2008-02-03   stephan:     strxform_link_to_uuid
02a7c850b4 2008-02-03   stephan:   };
9c01af2d22 2008-02-03   stephan:   db_generic_query_view( sql, colnames, xf );
02a7c850b4 2008-02-03   stephan:   free( sql );
2ab3a2f603 2008-02-03   stephan: }
2ab3a2f603 2008-02-03   stephan: 
02a7c850b4 2008-02-03   stephan: /**
02a7c850b4 2008-02-03   stephan: A small search form which forwards to ?like=SEARCH_STRING
02a7c850b4 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:
2ab3a2f603 2008-02-03   stephan:   @ <input type='text' name='like' value='%s((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: 
b81e93f576 2008-02-03   stephan: /**
b81e93f576 2008-02-03   stephan:  tagview_page_default() renders the default page for tagview_page().
b81e93f576 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: 
02a7c850b4 2008-02-03   stephan: /**
02a7c850b4 2008-02-03   stephan:   Lists all tags matching the given tagid.
02a7c850b4 2008-02-03   stephan: */
2ab3a2f603 2008-02-03   stephan: static void tagview_page_tag_by_id( int tagid )
2ab3a2f603 2008-02-03   stephan: {
02a7c850b4 2008-02-03   stephan:   @ <h2>Tag #%d(tagid):</h2>
2ab3a2f603 2008-02-03   stephan:   char * sql = mprintf(
2ab3a2f603 2008-02-03   stephan:     "SELECT DISTINCT (t.tagname), DATETIME(tx.mtime), b.uuid "
2ab3a2f603 2008-02-03   stephan:     "FROM tag t, tagxref tx, blob b "
2ab3a2f603 2008-02-03   stephan:     "WHERE (t.tagid=%d) AND (t.tagid=tx.tagid) AND (tx.srcid=b.rid) "
2cb3290e67 2008-02-03   stephan:     TAGVIEW_DEFAULT_FILTER
2ab3a2f603 2008-02-03   stephan:     "ORDER BY tx.mtime DESC",
2ab3a2f603 2008-02-03   stephan:   tagid);
02a7c850b4 2008-02-03   stephan:   char const * const colnames[] = {
02a7c850b4 2008-02-03   stephan:       "Tag Name", "Timestamp", "Version"
b81e93f576 2008-02-03   stephan:   };
9c01af2d22 2008-02-03   stephan:   string_unary_xform_f xf[] = {
9c01af2d22 2008-02-03   stephan:       strxform_link_to_tagname,
02a7c850b4 2008-02-03   stephan:       0,
9c01af2d22 2008-02-03   stephan:       strxform_link_to_uuid
b81e93f576 2008-02-03   stephan:   };
9c01af2d22 2008-02-03   stephan:   db_generic_query_view( sql, colnames, xf );
02a7c850b4 2008-02-03   stephan:   free(sql);
2ab3a2f603 2008-02-03   stephan: }
2ab3a2f603 2008-02-03   stephan: 
02a7c850b4 2008-02-03   stephan: /**
02a7c850b4 2008-02-03   stephan:   Lists all tags matching the given tag name.
02a7c850b4 2008-02-03   stephan: */
2ab3a2f603 2008-02-03   stephan: static void tagview_page_tag_by_name( char const * tagname )
2ab3a2f603 2008-02-03   stephan: {
02a7c850b4 2008-02-03   stephan:   @ <h2>Tag '%s(tagname)':</h2>
2ab3a2f603 2008-02-03   stephan:   char * sql = mprintf(
2ab3a2f603 2008-02-03   stephan:     "SELECT DISTINCT t.tagid, DATETIME(tx.mtime), b.uuid "
2ab3a2f603 2008-02-03   stephan:     "FROM tag t, tagxref tx, blob b "
2ab3a2f603 2008-02-03   stephan:     "WHERE (t.tagname='%q') AND (t.tagid=tx.tagid) AND (tx.srcid=b.rid) "
2cb3290e67 2008-02-03   stephan:     TAGVIEW_DEFAULT_FILTER
2ab3a2f603 2008-02-03   stephan:     "ORDER BY tx.mtime DESC",
2ab3a2f603 2008-02-03   stephan:     tagname);
02a7c850b4 2008-02-03   stephan:   char const * const colnames[] = {
02a7c850b4 2008-02-03   stephan:       "Tag ID", "Timestamp", "Version"
02a7c850b4 2008-02-03   stephan:   };
9c01af2d22 2008-02-03   stephan:   string_unary_xform_f xf[] = {
9c01af2d22 2008-02-03   stephan:       strxform_link_to_tagid,
02a7c850b4 2008-02-03   stephan:       0,
9c01af2d22 2008-02-03   stephan:       strxform_link_to_uuid
02a7c850b4 2008-02-03   stephan:   };
9c01af2d22 2008-02-03   stephan:   db_generic_query_view( sql, colnames, xf );
02a7c850b4 2008-02-03   stephan:   free( sql );
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){
02d1ed6ad2 2008-02-02   stephan:   login_check_credentials();
b81e93f576 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");
2ab3a2f603 2008-02-03   stephan:   tagview_page_search_miniform();
2ab3a2f603 2008-02-03   stephan:   @ <hr/>
2ab3a2f603 2008-02-03   stephan:   char const * check = 0;
2ab3a2f603 2008-02-03   stephan:   if( 0 != (check = P("tagid")) )
2ab3a2f603 2008-02-03   stephan:   {
2ab3a2f603 2008-02-03   stephan:     tagview_page_tag_by_id( atoi(check) );
2ab3a2f603 2008-02-03   stephan:   }
2ab3a2f603 2008-02-03   stephan:   else if( 0 != (check = P("like")) )
2ab3a2f603 2008-02-03   stephan:   {
2ab3a2f603 2008-02-03   stephan:     tagview_page_list_tags( check );
2ab3a2f603 2008-02-03   stephan:   }
2ab3a2f603 2008-02-03   stephan:   else if( 0 != (check = P("name")) )
2ab3a2f603 2008-02-03   stephan:   {
2ab3a2f603 2008-02-03   stephan:     tagview_page_tag_by_name( check );
10437374a7 2008-02-02       drh:   }
2ab3a2f603 2008-02-03   stephan:   else
02d1ed6ad2 2008-02-02   stephan:   {
2ab3a2f603 2008-02-03   stephan:     tagview_page_default();
2ab3a2f603 2008-02-03   stephan:   }
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