void tagStormCheck(char *schemaFile, char *tagStormFile) /* tagStormCheck - Check that a tagStorm conforms to a schema.. */ { /* Load up schema from file. Make a hash of all non-wildcard * tags, and a list of wildcard tags. */ struct tagSchema *schema, *schemaList = tagSchemaFromFile(schemaFile); struct slRef *wildSchemaList = NULL, *requiredSchemaList = NULL; /* Split up schemaList into hash and wildSchemaList. Calculate schemaSize */ struct hash *hash = hashNew(0); int schemaSize = 0; for (schema = schemaList; schema != NULL; schema = schema->next) { ++schemaSize; if (anyWild(schema->name)) { refAdd(&wildSchemaList, schema); } else hashAdd(hash, schema->name, schema); if (schema->required != 0) refAdd(&requiredSchemaList, schema); } slReverse(&wildSchemaList); schemaList = NULL; struct tagStorm *tagStorm = tagStormFromFile(tagStormFile); struct dyString *scratch = dyStringNew(0); rCheck(tagStorm->forest, tagStormFile, wildSchemaList, hash, requiredSchemaList, scratch); if (gErrCount > 0) noWarnAbort(); else verbose(1, "No problems detected.\n"); }
static struct genePos *associationAdvFilter(struct column *col, struct sqlConnection *conn, struct genePos *list) /* Do advanced filter on position. */ { char *terms = advFilterVal(col, "terms"); if (terms != NULL) { boolean orLogic = advFilterOrLogic(col, "logic", TRUE); struct slName *termList = stringToSlNames(terms); if (anyWild(terms)) list = wildAssociationFilter(termList, orLogic, col, conn, list); else list = tameAssociationFilter(termList, orLogic, col, conn, list); } return list; }
void rqlCheckFieldsExist(struct rqlStatement *rql, struct hash *fieldsThatExist, char *fieldSource) /* Check that all fields referenced in an rql statement actually exist. * fieldsThatExist is a hash of field names, and fieldSource is where they came from. */ { /* Do checks that tags are all legitimate and with correct types. */ struct slName *field; for (field = rql->fieldList; field != NULL; field = field->next) { if (!anyWild(field->name)) if (!hashLookupEvenInWilds(fieldsThatExist, field->name)) errAbort("Field %s in query doesn't exist in %s.", field->name, fieldSource); } struct slName *var; for (var = rql->whereVarList; var != NULL; var = var->next) { if (!hashLookupEvenInWilds(fieldsThatExist, var->name)) errAbort("Tag %s doesn't exist. Maybe you mispelled a variable or forgot to put quotes " "around\na word? Maybe %s is hosed?.", var->name, fieldSource); } }
static void searchAllColumns(struct sqlConnection *conn, struct column *colList, char *search) /* Call search on each column. */ { struct column *col; struct searchResult *srList, *sr; struct columnSearchResults *csrList = NULL, *csr; int totalCount = 0; struct searchResult *srOne = NULL; for (col = colList; col != NULL; col = col->next) { if (col->simpleSearch) { srList = col->simpleSearch(col, conn, search); if (showOnlyCanonical() && srList != NULL) { transformToCanonical(srList, conn); srList = removeDupes(srList); } if (srList != NULL) { srOne = srList; fillInMissingLabels(conn, colList, srList); AllocVar(csr); csr->label = columnSetting(col, "searchLabel", col->longLabel); csr->results = srList; slAddTail(&csrList, csr); totalCount += slCount(srList); } } } if (totalCount == 0) { displayData(conn, colList, NULL); if (anyWild(search)) warn("Sorry, the search box doesn't take wildcards, " "though in most cases it will find things without " "them. Try entering your search without * or ? " "characters."); else warn("Sorry, couldn't find '%s'", search); } else if (totalCount == 1 || allSame(csrList)) // else if (totalCount == 1) displayData(conn, colList, &srOne->gp); else { makeTitle("Simple Search Results", NULL); for (csr = csrList; csr != NULL; csr = csr->next) { hPrintf("<H2>%s</H2>\n", csr->label); slSort(&csr->results, searchResultCmpShortLabel); for (sr = csr->results; sr != NULL; sr = sr->next) { selfAnchorSearch(&sr->gp); if (sr->matchingId != NULL) hPrintf("%s (%s)", sr->matchingId, sr->shortLabel); else hPrintf("%s", sr->shortLabel); hPrintf("</A> - %s<BR>\n", sr->longLabel); } } } }
void webTableBuildQuery(struct cart *cart, char *from, char *initialWhere, char *varPrefix, char *fields, boolean withFilters, struct dyString **retQuery, struct dyString **retWhere) /* Construct select, from and where clauses in query, keeping an additional copy of where * Returns the SQL query and the SQL where expression as two dyStrings (need to be freed) */ { struct dyString *query = dyStringNew(0); struct dyString *where = dyStringNew(0); struct slName *field, *fieldList = commaSepToSlNames(fields); boolean gotWhere = FALSE; sqlDyStringPrintf(query, "%s", ""); // TODO check with Galt on how to get reasonable checking back. dyStringPrintf(query, "select %s from %s", fields, from); if (!isEmpty(initialWhere)) { dyStringPrintf(where, " where "); sqlSanityCheckWhere(initialWhere, where); gotWhere = TRUE; } /* If we're doing filters, have to loop through the row of filter controls */ if (withFilters) { for (field = fieldList; field != NULL; field = field->next) { char varName[128]; safef(varName, sizeof(varName), "%s_f_%s", varPrefix, field->name); char *val = trimSpaces(cartUsualString(cart, varName, "")); if (!isEmpty(val)) { if (gotWhere) dyStringPrintf(where, " and "); else { dyStringPrintf(where, " where "); gotWhere = TRUE; } if (anyWild(val)) { char *converted = sqlLikeFromWild(val); char *escaped = makeEscapedString(converted, '"'); dyStringPrintf(where, "%s like \"%s\"", field->name, escaped); freez(&escaped); freez(&converted); } else if (val[0] == '>' || val[0] == '<') { char *remaining = val+1; if (remaining[0] == '=') remaining += 1; remaining = skipLeadingSpaces(remaining); if (isNumericString(remaining)) dyStringPrintf(where, "%s %s", field->name, val); else { warn("Filter for %s doesn't parse: %s", field->name, val); dyStringPrintf(where, "%s is not null", field->name); // Let query continue } } else { char *escaped = makeEscapedString(val, '"'); dyStringPrintf(where, "%s = \"%s\"", field->name, escaped); freez(&escaped); } } } } dyStringAppend(query, where->string); /* We do order here so as to keep order when working with tables bigger than a page. */ char orderVar[256]; safef(orderVar, sizeof(orderVar), "%s_order", varPrefix); char *orderFields = cartUsualString(cart, orderVar, ""); if (!isEmpty(orderFields)) { if (orderFields[0] == '-') dyStringPrintf(query, " order by %s desc", orderFields+1); else dyStringPrintf(query, " order by %s", orderFields); } // return query and where expression *retQuery = query; *retWhere = where; }