74f1ce41ab30aa506ea6c1bd879e6d42ac596d55 hiram Wed Sep 25 12:24:12 2019 -0700 hard code a list of tables to check for protected data refs #24208 diff --git src/hg/hubApi/list.c src/hg/hubApi/list.c index f79a9ae..2a43517 100644 --- src/hg/hubApi/list.c +++ src/hg/hubApi/list.c @@ -300,31 +300,31 @@ fprintf(stderr, "%s", errCatch->message->string); errCatchFree(&errCatch); return itemCount; } static void outputTrackDbVars(struct jsonWrite *jw, struct trackDb *tdb, long long itemCount) /* JSON output the fundamental trackDb variables */ { if (NULL == tdb) /* might not be any trackDb */ return; boolean isContainer = tdbIsComposite(tdb) || tdbIsCompositeView(tdb); boolean protectedData = FALSE; -protectedData = protectedTrack(tdb); +protectedData = protectedTrack(tdb, tdb->track); jsonWriteString(jw, "shortLabel", tdb->shortLabel); jsonWriteString(jw, "type", tdb->type); jsonWriteString(jw, "longLabel", tdb->longLabel); if (! isContainer) /* containers do not have items to count */ jsonWriteNumber(jw, "itemCount", itemCount); if (tdb->parent) { jsonWriteString(jw, "parent", tdb->parent->track); if (tdb->parent->parent) jsonWriteString(jw, "parentParent", tdb->parent->parent->track); } if (tdb->settingsHash) { struct hashEl *hel; struct hashCookie hc = hashFirst(tdb->settingsHash); @@ -379,30 +379,32 @@ struct trackDb *thisTrack = findTrackDb(track, tdb); if (NULL == thisTrack) apiErrAbort(err400, err400Msg, "failed to find specified track=%s in genome=%s for endpoint '/list/schema' given hubUrl='%s'", track, genome, hubUrl); char *bigDataUrl = hReplaceGbdb(trackDbSetting(thisTrack, "bigDataUrl")); if (NULL == bigDataUrl) apiErrAbort(err400, err400Msg, "failed to find bigDataUrl for specified track=%s in genome=%s for endpoint '/list/schema' given hubUrl='%s'", track, genome, hubUrl); char *indexFileOrUrl = hReplaceGbdb(trackDbSetting(tdb, "bigDataIndex")); struct bbiFile *bbi = bigFileOpen(thisTrack->type, bigDataUrl); long long itemCount = bbiItemCount(bigDataUrl, thisTrack->type, indexFileOrUrl); outputTrackDbVars(jw, thisTrack, itemCount); struct asObject *as = bigBedAsOrDefault(bbi); +if (! as) + apiErrAbort(err500, err500Msg, "can not find schema definition for bigDataUrl '%s', track=%s genome: '%s' for endpoint '/list/schema' given hubUrl='%s'", bigDataUrl, track, genome, hubUrl); struct sqlFieldType *fiList = sqlFieldTypesFromAs(as); bigColumnTypes(jw, fiList, as); apiFinishOutput(0, NULL, jw); } /* static void hubSchemaJsonOutput(FILE *f, char *hubUrl, * char *genome, char *track) */ static char *bigDataUrlFromTable(struct sqlConnection *conn, char *table) /* perhaps there is a bigDataUrl in a database table */ { char *bigDataUrl = NULL; char query[4096]; char quickReturn[2048]; if (sqlColumnExists(conn, table, "fileName")) @@ -463,81 +465,85 @@ splitTableName = cloneString(fullTableName); } else { splitTableName = sqlTableName; } struct bbiFile *bbi = NULL; if (thisTrack && startsWith("big", thisTrack->type)) { if (isEmpty(bigDataUrl)) bigDataUrl = bigDataUrlFromTable(conn, splitTableName); if (bigDataUrl) bbi = bigFileOpen(thisTrack->type, bigDataUrl); if (NULL == bbi) - apiErrAbort(err400, err400Msg, "failed to find bigDataUrl=%s for track=%s in database=%s for endpoint '/getData/schema'", bigDataUrl, track, db); + apiErrAbort(err400, err400Msg, "failed to find bigDataUrl=%s for track=%s in database=%s for endpoint '/list/schema'", bigDataUrl, track, db); } char *dataTime = sqlTableUpdate(conn, splitTableName); time_t dataTimeStamp = sqlDateToUnixTime(dataTime); replaceChar(dataTime, ' ', 'T'); /* ISO 8601 */ struct jsonWrite *jw = apiStartOutput(); jsonWriteString(jw, "genome", db); jsonWriteString(jw, "track", track); jsonWriteString(jw, "dataTime", dataTime); jsonWriteNumber(jw, "dataTimeStamp", (long long)dataTimeStamp); freeMem(dataTime); char **columnNames = NULL; char **columnTypes = NULL; int *jsonTypes = NULL; int columnCount = 0; struct asObject *as = NULL; struct asColumn *columnEl = NULL; int asColumnCount = 0; long long itemCount = 0; if (bbi) { /* do not show itemCount for protected data */ - if (! protectedTrack(thisTrack)) + if (! protectedTrack(thisTrack, track)) { char *indexFileOrUrl = hReplaceGbdb(trackDbSetting(thisTrack, "bigDataIndex")); itemCount = bbiItemCount(bigDataUrl, thisTrack->type, indexFileOrUrl); } if (startsWith("bigWig", thisTrack->type)) { wigColumnTypes(jw); } else { as = bigBedAsOrDefault(bbi); + if (! as) + apiErrAbort(err500, err500Msg, "can not find schema definition for bigDataUrl '%s', track=%s genome: '%s' for endpoint '/list/schema'", bigDataUrl, track, db); struct sqlFieldType *fiList = sqlFieldTypesFromAs(as); bigColumnTypes(jw, fiList, as); } } else { columnCount = tableColumns(conn, splitTableName, &columnNames, &columnTypes, &jsonTypes); as = asForTable(conn, splitTableName, thisTrack); + if (! as) + apiErrAbort(err500, err500Msg, "can not find schema definition for table '%s', track=%s genome: '%s' for endpoint '/list/schema'", splitTableName, track, db); columnEl = as->columnList; asColumnCount = slCount(columnEl); /* do not show counts for protected data */ - if (! protectedTrack(thisTrack)) + if (! protectedTrack(thisTrack, track)) { char query[2048]; sqlSafef(query, sizeof(query), "select count(*) from %s", splitTableName); if (hti && hti->isSplit) /* punting on split table item count */ itemCount = 0; else { itemCount = sqlQuickNum(conn, query); } } hFreeConn(&conn); if (hti && (hti->isSplit || debug)) jsonWriteBoolean(jw, "splitTable", hti->isSplit); @@ -673,31 +679,31 @@ char **row; while ((row = sqlNextRow(sr)) != NULL) { itemCount += bbiItemCount(hReplaceGbdb(row[0]), type, NULL); } sqlFreeResult(&sr); return itemCount; } static long long dataItemCount(char *db, struct trackDb *tdb) /* determine how many items are in this data set */ { long long itemCount = 0; if (trackHasNoData(tdb)) /* container 'tracks' have no data items */ return itemCount; -if (protectedTrack(tdb)) /* private data */ +if (protectedTrack(tdb, tdb->track)) /* private data */ return itemCount; if (sameWord("downloadsOnly", tdb->type)) return itemCount; char *bigDataUrl = hReplaceGbdb(trackDbSetting(tdb, "bigDataUrl")); if (isNotEmpty(bigDataUrl)) { char *indexFileOrUrl = hReplaceGbdb(trackDbSetting(tdb, "bigDataIndex")); itemCount = bbiItemCount(bigDataUrl, tdb->type, indexFileOrUrl); } else { /* prepare for getting table row count, find table name */ /* the trackDb might have a specific table defined */ char *tableName = trackDbSetting(tdb, "table"); @@ -738,31 +744,31 @@ } /* static long long dataItemCount(char *db, struct trackDb *tdb) */ static void recursiveTrackList(struct jsonWrite *jw, struct trackDb *tdb, char *db) /* output trackDb tags only for real tracks, not containers, * recursive when subtracks exist */ { boolean isContainer = tdbIsComposite(tdb) || tdbIsCompositeView(tdb); /* do *NOT* print containers when 'trackLeavesOnly' requested */ if (! (trackLeavesOnly && isContainer) ) { long long itemCount = 0; /* do not show counts for protected data or continers (== no items)*/ - if (! (isContainer || protectedTrack(tdb))) + if (! (isContainer || protectedTrack(tdb, tdb->track))) itemCount = dataItemCount(db, tdb); jsonWriteObjectStart(jw, tdb->track); if (tdbIsComposite(tdb)) jsonWriteString(jw, "compositeContainer", "TRUE"); if (tdbIsCompositeView(tdb)) jsonWriteString(jw, "compositeViewContainer", "TRUE"); outputTrackDbVars(jw, tdb, itemCount); if (tdb->subtracks) { struct trackDb *el = NULL; for (el = tdb->subtracks; el != NULL; el = el->next ) recursiveTrackList(jw, el, db); }