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