Diff
Not logged in

Differences From:

File src/tagview.c part of check-in [2cb3290e67] - Fixed a memory leak in tagview_page_list_tags(). Minor other refactorings. by stephan on 2008-02-03 18:00:27. [view]

To:

File src/tagview.c part of check-in [9c01af2d22] - refactored some /tagview code into more generic bits. Added string_xform.c. by stephan on 2008-02-03 21:56:52. [view]

@@ -35,151 +35,8 @@
 #else
 #  define TAGVIEW_DEFAULT_FILTER
 #endif
 
-
-/**
-tagview_strxform_f is a typedef for funcs with the following policy:
-
-They accept a const string which they then transform into some other
-form. They return a transformed copy, which the caller is responsible
-for freeing.
-
-The intention of this is to provide a way for a generic query routine
-to format specific column data (e.g. transform an object ID into a
-link to that object).
-*/
-typedef char * (*tagview_strxform_f)( char const * );
-
-#if 0
-/** A no-op transformer which can be used as a placeholder. */
-static char * tagview_xf_copy( char const * uuid )
-{
-  int len = strlen(uuid) + 1;
-  char * ret = (char *) malloc( len );
-  ret[len] = '\0';
-  strncpy( ret, uuid, len-1 );
-  return ret;
-}
-#endif
-
-/** Returns a hyperlink to uuid. */
-static char * tagview_xf_link_to_uuid( char const * uuid )
-{
-  const int offset = 10;
-  char shortname[offset+1];
-  shortname[offset] = '\0';
-  memcpy( shortname, uuid, offset );
-  return mprintf( "<tt><a href='%s/vinfo/%s'><span style='font-size:1.5em'>%s</span>%s</a></tt>",
-                  g.zBaseURL, uuid, shortname, uuid+offset );
-}
-
-/** Returns a hyperlink to the given tag. */
-static char * tagview_xf_link_to_tagid( char const * tagid )
-{
-  return mprintf( "<a href='%s/tagview?tagid=%s'>%s</a>",
-                  g.zBaseURL, tagid, tagid );
-}
-
-/** Returns a hyperlink to the named tag. */
-static char * tagview_xf_link_to_tagname( char const * tagid )
-{
-  return mprintf( "<a href='%s/tagview/%s'>%s</a>",
-                  g.zBaseURL, tagid, tagid );
-}
-
-
-
-/**
-* tagview_run_query():
-*
-* A very primitive helper to run an SQL query and table-ize the
-* results.
-*
-* The sql parameter should be a single, complete SQL statement.
-*
-* The coln parameter is optional (it may be 0). If it is 0 then the
-* column names used in the output will be taken directly from the
-* SQL. If it is not null then it must have as many entries as the SQL
-* result has columns. Each entry is a column name for the SQL result
-* column of the same index. Any given entry may be 0, in which case
-* the column name from the SQL is used.
-*
-* The xform argument is an array of transformation functions (type
-* tagview_strxform_f). The array, or any single entry, may be 0, but
-* if the array is non-0 then it must have at least as many entries as
-* colnames does. Each index corresponds directly to an entry in
-* colnames and the SQL results.  Any given entry may be 0. If it has
-* fewer, undefined behaviour results.  If a column has an entry in
-* xform, then the xform function will be called to transform the
-* column data before rendering it. This function takes care of freeing
-* the strings created by the xform functions.
-*
-* Example:
-*
-*  char const * const colnames[] = {
-*   "Tag ID", "Tag Name", "Something Else", "UUID"
-*  };
-*  tagview_strxform_f xf[] = {
-*    tagview_xf_link_to_tagid,
-*    tagview_xf_link_to_tagname,
-*    0,
-*    tagview_xf_link_to_uuid
-*  };
-*  tagview_run_query( "select a,b,c,d from foo", colnames, xf );
-*
-*/
-static void tagview_run_query(
-  char const * sql,
-  char const * const * coln,
-  tagview_strxform_f * xform )
-{
-
-  Stmt st;
-  @ <table cellpadding='4px' border='1'><tbody>
-  int i = 0;
-  int rc = db_prepare( &st, sql );
-  /**
-    Achtung: makeheaders apparently can't pull the function
-    name from this:
-   if( SQLITE_OK != db_prepare( &st, sql ) )
-  */
-  if( SQLITE_OK != rc )
-  {
-    @ tagview_run_query(): Error processing SQL: [%s(sql)]
-    return;
-  }
-  int colc = db_column_count(&st);
-  @ <tr>
-  for( i = 0; i < colc; ++i ) {
-    if( coln )
-    {
-      @ <th>%s(coln[i] ? coln[i] : db_column_name(&st,i))</th>
-    }
-    else
-    {
-      @ <td>%s(db_column_name(&st,i))</td>
-    }
-  }
-  @ </tr>
-
-  while( SQLITE_ROW == db_step(&st) ){
-    @ <tr>
-      for( i = 0; i < colc; ++i ) {
-        char * xf = 0;
-        char const * xcf = 0;
-        xcf = (xform && xform[i])
-          ? (xf=(xform[i])(db_column_text(&st,i)))
-          : db_column_text(&st,i);
-        @ <td>%s(xcf)</td>
-        if( xf ) free( xf );
-      }
-    @ </tr>
-  }
-  db_finalize( &st );
-  @ </tbody></table>
-}
-
 /**
   Lists all tags matching the given LIKE clause (which
 may be 0).
 */
@@ -212,15 +69,15 @@
   if( likeclause ) free(likeclause);
   char const * const colnames[] = {
     "Tag ID", "Name", "Timestamp", "Version"
   };
-  tagview_strxform_f xf[] = {
-    tagview_xf_link_to_tagid,
-    tagview_xf_link_to_tagname,
+  string_unary_xform_f xf[] = {
+    strxform_link_to_tagid,
+    strxform_link_to_tagname,
     0,
-    tagview_xf_link_to_uuid
+    strxform_link_to_uuid
   };
-  tagview_run_query( sql, colnames, xf );
+  db_generic_query_view( sql, colnames, xf );
   free( sql );
 }
 
 /**
@@ -259,14 +116,14 @@
   tagid);
   char const * const colnames[] = {
       "Tag Name", "Timestamp", "Version"
   };
-  tagview_strxform_f xf[] = {
-      tagview_xf_link_to_tagname,
+  string_unary_xform_f xf[] = {
+      strxform_link_to_tagname,
       0,
-      tagview_xf_link_to_uuid
+      strxform_link_to_uuid
   };
-  tagview_run_query( sql, colnames, xf );
+  db_generic_query_view( sql, colnames, xf );
   free(sql);
 }
 
 /**
@@ -284,14 +141,14 @@
     tagname);
   char const * const colnames[] = {
       "Tag ID", "Timestamp", "Version"
   };
-  tagview_strxform_f xf[] = {
-      tagview_xf_link_to_tagid,
+  string_unary_xform_f xf[] = {
+      strxform_link_to_tagid,
       0,
-      tagview_xf_link_to_uuid
+      strxform_link_to_uuid
   };
-  tagview_run_query( sql, colnames, xf );
+  db_generic_query_view( sql, colnames, xf );
   free( sql );
 }