d2429b17bb096f6c406a2ae03fb5593f27fa53c1
hiram
  Mon Mar 18 14:17:07 2019 -0700
hash up the output properly for hubPublic and dbDb outputs refs #18869

diff --git src/hg/hubApi/list.c src/hg/hubApi/list.c
index d6c04aa..5ee114d 100644
--- src/hg/hubApi/list.c
+++ src/hg/hubApi/list.c
@@ -1,110 +1,149 @@
 /* manage endpoint /list/ functions */
 
 #include "dataApi.h"
 
-static void hubPublicJsonData(struct jsonWrite *jw, struct hubPublic *el)
+static void hubPublicJsonData(struct jsonWrite *jw, struct hubPublic *el,
+  int columnCount, char **columnNames)
 /* Print array data for one row from hubPublic table, order here
  * must be same as was stated in the columnName header element
- *  TODO: need to figure out how to use the order of the columns as
- *        they are in the 'desc' request
  * This code should be in hg/lib/hubPublic.c (which does not exist)
  */
 {
+int i = 0;
+jsonWriteObjectStart(jw, NULL);
+jsonWriteString(jw, columnNames[i++], el->hubUrl);
+jsonWriteString(jw, columnNames[i++], el->shortLabel);
+jsonWriteString(jw, columnNames[i++], el->longLabel);
+jsonWriteString(jw, columnNames[i++], el->registrationTime);
+jsonWriteNumber(jw, columnNames[i++], (long long)el->dbCount);
+jsonWriteString(jw, columnNames[i++], el->dbList);
+jsonWriteString(jw, columnNames[i++], el->descriptionUrl);
+jsonWriteObjectEnd(jw);
+#ifdef NOT
 jsonWriteListStart(jw, NULL);
 jsonWriteString(jw, NULL, el->hubUrl);
 jsonWriteString(jw, NULL, el->shortLabel);
 jsonWriteString(jw, NULL, el->longLabel);
 jsonWriteString(jw, NULL, el->registrationTime);
 jsonWriteNumber(jw, NULL, (long long)el->dbCount);
 jsonWriteString(jw, NULL, el->dbList);
 jsonWriteString(jw, NULL, el->descriptionUrl);
 jsonWriteListEnd(jw);
+#endif
 }
 
 static void jsonPublicHubs()
 /* output the hubPublic SQL table */
 {
 struct sqlConnection *conn = hConnectCentral();
 char *dataTime = sqlTableUpdate(conn, hubPublicTableName());
 time_t dataTimeStamp = sqlDateToUnixTime(dataTime);
 replaceChar(dataTime, ' ', 'T');	/* ISO 8601 */
 struct hubPublic *el = hubPublicLoadAll();
 struct jsonWrite *jw = apiStartOutput();
 jsonWriteString(jw, "dataTime", dataTime);
 jsonWriteNumber(jw, "dataTimeStamp", (long long)dataTimeStamp);
 freeMem(dataTime);
-jsonWriteString(jw, "tableName", hubPublicTableName());
-(void) tableColumns(conn, jw, hubPublicTableName());
-jsonWriteListStart(jw, "publicHubData");
+// redundant: jsonWriteString(jw, "tableName", hubPublicTableName());
+char **columnNames = NULL;
+char **columnTypes = NULL;
+int columnCount = tableColumns(conn, jw, hubPublicTableName(), &columnNames, &columnTypes);
+jsonWriteListStart(jw, "publicHubs");
 for ( ; el != NULL; el = el->next )
     {
-    hubPublicJsonData(jw, el);
+    hubPublicJsonData(jw, el, columnCount, columnNames);
     }
 jsonWriteListEnd(jw);
 jsonWriteObjectEnd(jw);
 fputs(jw->dy->string,stdout);
 hDisconnectCentral(&conn);
 }
 
-static void dbDbJsonData(struct jsonWrite *jw, struct dbDb *el)
+static void dbDbJsonData(struct jsonWrite *jw, struct dbDb *el, int columnCount,
+  char **columnNames)
 /* Print out dbDb table element in JSON format.
  * must be same as was stated in the columnName header element
- *  TODO: need to figure out how to use the order of the columns as
- *        they are in the 'desc' request
  * This code should be over in hg/lib/dbDb.c
  */
 {
+int i = 0;
+jsonWriteObjectStart(jw, el->name);
+i++;
+// redundant: jsonWriteString(jw, NULL, el->name);
+jsonWriteString(jw, columnNames[i++], el->description);
+jsonWriteString(jw, columnNames[i++], el->nibPath);
+jsonWriteString(jw, columnNames[i++], el->organism);
+jsonWriteString(jw, columnNames[i++], el->defaultPos);
+jsonWriteNumber(jw, columnNames[i++], (long long)el->active);
+jsonWriteNumber(jw, columnNames[i++], (long long)el->orderKey);
+jsonWriteString(jw, columnNames[i++], el->genome);
+jsonWriteString(jw, columnNames[i++], el->scientificName);
+jsonWriteString(jw, columnNames[i++], el->htmlPath);
+jsonWriteNumber(jw, columnNames[i++], (long long)el->hgNearOk);
+jsonWriteNumber(jw, columnNames[i++], (long long)el->hgPbOk);
+jsonWriteString(jw, columnNames[i++], el->sourceName);
+jsonWriteNumber(jw, columnNames[i++], (long long)el->taxId);
+jsonWriteObjectEnd(jw);
+#ifdef NOT
 jsonWriteListStart(jw, NULL);
 jsonWriteString(jw, NULL, el->name);
 jsonWriteString(jw, NULL, el->description);
 jsonWriteString(jw, NULL, el->nibPath);
 jsonWriteString(jw, NULL, el->organism);
 jsonWriteString(jw, NULL, el->defaultPos);
 jsonWriteNumber(jw, NULL, (long long)el->active);
 jsonWriteNumber(jw, NULL, (long long)el->orderKey);
 jsonWriteString(jw, NULL, el->genome);
 jsonWriteString(jw, NULL, el->scientificName);
 jsonWriteString(jw, NULL, el->htmlPath);
 jsonWriteNumber(jw, NULL, (long long)el->hgNearOk);
 jsonWriteNumber(jw, NULL, (long long)el->hgPbOk);
 jsonWriteString(jw, NULL, el->sourceName);
 jsonWriteNumber(jw, NULL, (long long)el->taxId);
 jsonWriteListEnd(jw);
+#endif
 }
 
 static void jsonDbDb()
 /* output the dbDb SQL table */
 {
 struct sqlConnection *conn = hConnectCentral();
 char *dataTime = sqlTableUpdate(conn, "dbDb");
 time_t dataTimeStamp = sqlDateToUnixTime(dataTime);
 replaceChar(dataTime, ' ', 'T');	/* ISO 8601 */
 struct dbDb *dbList = ucscDbDb();
 struct dbDb *el;
 struct jsonWrite *jw = apiStartOutput();
 jsonWriteString(jw, "dataTime", dataTime);
 jsonWriteNumber(jw, "dataTimeStamp", (long long)dataTimeStamp);
 freeMem(dataTime);
-jsonWriteString(jw, "tableName", "dbDb");
-(void) tableColumns(conn, jw, "dbDb");
-jsonWriteListStart(jw, "ucscGenomes");
+// not needed: jsonWriteString(jw, "tableName", "dbDb");
+char **columnNames = NULL;
+char **columnTypes = NULL;
+int columnCount = tableColumns(conn, jw, "dbDb", &columnNames, &columnTypes);
+if (columnCount)
+    {
+    }
+// jsonWriteListStart(jw, "ucscGenomes");
+jsonWriteObjectStart(jw, "ucscGenomes");
 for ( el=dbList; el != NULL; el = el->next )
     {
-    dbDbJsonData(jw, el);
+    dbDbJsonData(jw, el, columnCount, columnNames);
     }
-jsonWriteListEnd(jw);
+// jsonWriteListEnd(jw);
+jsonWriteObjectEnd(jw);
 jsonWriteObjectEnd(jw);
 fputs(jw->dy->string,stdout);
 hDisconnectCentral(&conn);
 }
 
 static void chromInfoJsonOutput(FILE *f, char *db)
 /* for given db, if there is a track, list the chromosomes in that track,
  * for no track, simply list the chromosomes in the sequence
  */
 {
 char *table = cgiOptionalString("track");
 struct sqlConnection *conn = hAllocConn(db);
 /* in trackDb language: track == table */
 if (table)
     {