482cd8f6baaff31cfbfc99391f19d1e739e67114
tdreszer
  Mon Sep 27 11:59:41 2010 -0700
Moved mdb queries from hgTracks and hgApi to mdb.  Made sure the queries exclude files.
diff --git src/hg/lib/mdb.c src/hg/lib/mdb.c
index 921c863..f12a941 100644
--- src/hg/lib/mdb.c
+++ src/hg/lib/mdb.c
@@ -1996,3 +1996,62 @@
 return mdbObjFindValue(mdbObj,var);
 }
 
+struct slName *mdbObjSearch(struct sqlConnection *conn, char *var, char *val, char *op, int limit, boolean tables, boolean files)
+// Search the metaDb table for objs by var and val.  Can restrict by op "is" or "like" and accept (non-zero) limited string size
+// Search is via mysql, so it's case-insensitive.  Return is sorted on obj.
+{  // TODO: Change this to use normal mdb struct routines?
+if (!tables && !files)
+    errAbort("mdbObjSearch requests objects for neither tables or files.\n");
+
+char *tableName = mdbTableName(conn,TRUE); // Look for sandBox name first
+
+struct dyString *dyQuery = dyStringNew(512);
+dyStringPrintf(dyQuery,"select distinct obj from %s l1 where ",tableName);
+if (!tables || !files)
+    {
+    dyStringPrintf(dyQuery,"l1.var='objType' and l1.val='%s' ",tables?"table":"file");
+    dyStringPrintf(dyQuery,"and exists (select l2.obj from %s l2 where l2.obj = l1.obj and ",tableName);
+    }
+
+if(var != NULL)
+    dyStringPrintf(dyQuery,"l2.var = '%s' and l2.val ", var);
+if(sameString(op, "contains"))
+    dyStringPrintf(dyQuery,"like '%%%s%%'", val);
+else if (limit > 0 && strlen(val) == limit)
+    dyStringPrintf(dyQuery,"like '%s%%'", val);
+else
+    dyStringPrintf(dyQuery,"= '%s'", val);
+
+if (!tables || !files)
+    dyStringAppendC(dyQuery,')');
+dyStringAppend(dyQuery," order by obj");
+
+return sqlQuickList(conn, dyStringCannibalize(&dyQuery));
+}
+
+struct slName *mdbValSearch(struct sqlConnection *conn, char *var, int limit, boolean tables, boolean files)
+// Search the metaDb table for vals by var.  Can impose (non-zero) limit on returned string size of val
+// Search is via mysql, so it's case-insensitive.  Return is sorted on val.
+{  // TODO: Change this to use normal mdb struct routines?
+if (!tables && !files)
+    errAbort("mdbValSearch requests values for neither table nor file objects.\n");
+
+char *tableName = mdbTableName(conn,TRUE); // Look for sandBox name first
+
+struct dyString *dyQuery = dyStringNew(512);
+if (limit > 0)
+    dyStringPrintf(dyQuery,"select distinct distinct LEFT(val,%d)",limit);
+else
+    dyStringPrintf(dyQuery,"select distinct distinct val");
+
+dyStringPrintf(dyQuery," from %s l1 where l1.var='%s' ",tableName,var);
+
+if (!tables || !files)
+    dyStringPrintf(dyQuery,"and exists (select l2.obj from %s l2 where l2.obj = l1.obj and l2.var='objType' and l2.val='%s')",
+                   tableName,tables?"table":"file");
+
+dyStringAppend(dyQuery," order by val");
+
+return sqlQuickList(conn, dyStringCannibalize(&dyQuery));
+}
+