b5cd41df4b0f7113a4641a82973ddcd331df1c1b hiram Fri Feb 15 10:11:17 2019 -0800 ready to select table data refs #18869 diff --git src/hg/hubApi/getData.c src/hg/hubApi/getData.c index 2290138..8ad6160 100644 --- src/hg/hubApi/getData.c +++ src/hg/hubApi/getData.c @@ -1,22 +1,75 @@ /* manage endpoint /getData/ functions */ #include "dataApi.h" static void getTrackData() -/* return data from a track */ +/* return data from a track, optionally just one chrom data, + * optionally just one section of that chrom data + */ { +char *db = cgiOptionalString("db"); +char *chrom = cgiOptionalString("chrom"); +char *start = cgiOptionalString("start"); +char *end = cgiOptionalString("end"); +char *table = cgiOptionalString("track"); +/* 'track' name in trackDb refers to a SQL 'table' */ + +if (isEmpty(db)) + apiErrAbort("missing URL db= name for endpoint '/getData/track"); +if (isEmpty(table)) + apiErrAbort("missing URL track= name for endpoint '/getData/track"); +struct sqlConnection *conn = hAllocConn(db); +if (! sqlTableExists(conn, table)) + apiErrAbort("can not find specified 'track=%s' for endpoint: /getData/track?db=%s&track=%s", table, db, table); + +struct jsonWrite *jw = apiStartOutput(); +jsonWriteString(jw, "db", db); +jsonWriteString(jw, "track", table); +char *dataTime = sqlTableUpdate(conn, table); +time_t dataTimeStamp = sqlDateToUnixTime(dataTime); +replaceChar(dataTime, ' ', 'T'); +jsonWriteString(jw, "dataTime", dataTime); +jsonWriteNumber(jw, "dataTimeStamp", (long long)dataTimeStamp); + +/* no chrom specified, return entire table */ +if (isEmpty(chrom)) + { + tableColumns(conn, jw, table); + } +else if (isEmpty(start) || isEmpty(end)) + { + if (! sqlColumnExists(conn, table, "chrom")) + apiErrAbort("track '%s' is not a position track, request table without chrom specification, genome: '%s'", table, db); + jsonWriteString(jw, "chrom", chrom); + struct chromInfo *ci = hGetChromInfo(db, chrom); + jsonWriteNumber(jw, "start", (long long)0); + jsonWriteNumber(jw, "end", (long long)ci->size); + tableColumns(conn, jw, table); + } +else + { + if (! sqlColumnExists(conn, table, "chrom")) + apiErrAbort("track '%s' is not a position track, request table without chrom specification, genome: '%s'", table, db); + jsonWriteString(jw, "chrom", chrom); + jsonWriteNumber(jw, "start", (long long)sqlSigned(start)); + jsonWriteNumber(jw, "end", (long long)sqlSigned(end)); + tableColumns(conn, jw, table); + } +jsonWriteObjectEnd(jw); +fputs(jw->dy->string,stdout); +hFreeConn(&conn); } static void getSequenceData() /* return DNA sequence, given at least a db=name and chrom=chr, optionally start and end */ { char *db = cgiOptionalString("db"); char *chrom = cgiOptionalString("chrom"); char *start = cgiOptionalString("start"); char *end = cgiOptionalString("end"); if (isEmpty(db)) apiErrAbort("missing URL db= name for endpoint '/getData/sequence"); if (isEmpty(chrom)) apiErrAbort("missing URL chrom= for endpoint '/getData/sequence?db=%s", db);