src/hg/lib/metaTbl.c 1.6

1.6 2010/03/25 21:53:43 tdreszer
Some adjustments recommened by Mark in code review
Index: src/hg/lib/metaTbl.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/metaTbl.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -b -B -U 4 -r1.5 -r1.6
--- src/hg/lib/metaTbl.c	24 Mar 2010 17:37:12 -0000	1.5
+++ src/hg/lib/metaTbl.c	25 Mar 2010 21:53:43 -0000	1.6
@@ -415,16 +415,17 @@
 // ------ Loading files and parsing lines ------
 struct metaObj *metadataLineParse(char *line)
 /* Parses a single formatted metadata line into metaObj for updates or queries. */
 {
-char *words[256]; // A lot!
 int thisWord = 0;
 struct metaObj *metaObj;
 struct metaVar *metaVar;
 char *cloneLine = cloneString(line);
 
     // initial chop and determine if this looks like metadata
-    int count = chopByWhiteRespectDoubleQuotes(cloneLine,words,ArraySize(words));
+    int count = chopByWhiteRespectDoubleQuotes(cloneLine,NULL,0);
+    char **words = needMem(sizeof(char *) * count);
+    count = chopByWhiteRespectDoubleQuotes(cloneLine,words,count);
     if(count < 3 || words[thisWord] == NULL || differentWord(words[thisWord],"metadata"))
         {
         errAbort("This is not formatted metadata:\n\t%s\n",line);
         }
@@ -487,8 +488,9 @@
             hashAdd(metaObj->varHash, metaVar->var, metaVar); // pointer to struct to resolve type
             slAddHead(&(metaObj->vars),metaVar);
             }
         }
+    freeMem(words);
 
     // Special for old style ENCODE metadata
     if(metaObj->objName == NULL)
         {
@@ -565,18 +567,19 @@
 
 struct metaByVar *metaByVarsLineParse(char *line)
 /* Parses a line of "var1=val1 var2=val2 into a metaByVar object for queries. */
 {
-char *words[256]; // A lot!
 int thisWord = 0;
 struct metaByVar   *metaByVars = NULL;
 struct metaByVar   *rootVar = NULL;
 struct metaLimbVal *limbVal = NULL;
 char *cloneLine = cloneString(line);
 struct hash* varHash;     // There must not be multiple occurrances of the same var
 
     // initial chop and determine if this looks like metadata
-    int count = chopByWhiteRespectDoubleQuotes(cloneLine,words,ArraySize(words));
+    int count = chopByWhiteRespectDoubleQuotes(cloneLine,NULL,0);
+    char **words = needMem(sizeof(char *) * count);
+    count = chopByWhiteRespectDoubleQuotes(cloneLine,words,count);
 
     verbose(3, "metaByVarsLineParse() word count:%d\n\t%s\n",count,line);
     // Get objName and figure out if this is a delete line
     varHash = hashNew(0);
@@ -611,8 +614,9 @@
             hashAdd(varHash, rootVar->var, rootVar);
             slAddHead(&metaByVars,rootVar);
             }
         }
+    freeMem(words);
     slReverse(&metaByVars);
     verbose(2, "metaByVarsLineParse() first: %s=%s\n",metaByVars->var,metaByVars->vals->val);
 return metaByVars;
 }
@@ -663,22 +667,19 @@
     return metaObjs;
 }
 
 // -------------- Updating the DB --------------
-int metaObjsSetToDb(char * db,char *tableName,struct metaObj *metaObjs,boolean replace)
+int metaObjsSetToDb(struct sqlConnection *conn,char *tableName,struct metaObj *metaObjs,boolean replace)
 // Adds or updates metadata obj/var pairs into the named table.  Returns total rows affected
 {
 char query[8192];
 struct metaObj *metaObj;
 struct metaVar *metaVar;
 int count = 0;
 
-    if(db == NULL)
-        db = METATBL_DEFAULT_DB;
     if(tableName == NULL)
         tableName = METATBL_DEFAULT_NAME;
 
-struct sqlConnection *conn = sqlConnect(db);
     if(!sqlTableExists(conn,tableName))
         errAbort("metaObjsSetToDb attempting to update non-existent table.\n");
 
 for(metaObj = metaObjs;metaObj != NULL; metaObj = metaObj->next)
@@ -740,9 +741,9 @@
         {
         // Be sure to check for var existence first, then update
         if (!replace)
             {
-            struct metaObj *objExists = metaObjQueryByObj(db,tableName,metaObj->objName,metaVar->var);
+            struct metaObj *objExists = metaObjQueryByObj(conn,tableName,metaObj->objName,metaVar->var);
             if(objExists)
                 {
                 if(differentString(metaVar->val,objExists->vars->val)
                 || metaVar->varType != objExists->vars->varType)
@@ -770,26 +771,26 @@
         sqlUpdate(conn, query);
         count++;
         }
     }
-sqlDisconnect(&conn);
 return count;
 }
 
 // ------------------ Querys -------------------
-struct metaObj *metaObjQuery(char * db,char *table,struct metaObj *metaObj)
+struct metaObj *metaObjQuery(struct sqlConnection *conn,char *table,struct metaObj *metaObj)
 // Query the metadata table by obj and optional vars and vals in metaObj struct.  If metaObj is NULL query all.
 // Returns new metaObj struct fully populated and sorted in obj,var order.
 {
 //  select obj,var,val where (var= [and val=]) or ([var= and] val=) order by obj,var
     boolean buildHash = TRUE;
-    struct dyString *dy = newDyString(4096);
 
-    if(db == NULL)
-        db = METATBL_DEFAULT_DB;
     if(table == NULL)
         table = METATBL_DEFAULT_NAME;
 
+    if(!sqlTableExists(conn,table))
+        return NULL;
+
+    struct dyString *dy = newDyString(4096);
     dyStringPrintf(dy, "select objName,objType,var,varType,val from %s", table);
     if(metaObj != NULL && metaObj->objName != NULL)
         {
         dyStringPrintf(dy, " where objName = '%s'", metaObj->objName);
@@ -816,45 +817,37 @@
         }
     dyStringPrintf(dy, " order by objName, var");
     verbose(2, "Query: %s\n",dyStringContents(dy));
 
-    struct sqlConnection *conn = sqlConnect(db);
-    if(!sqlTableExists(conn,table))
-        {
-        dyStringFree(&dy);
-        return NULL;
-        }
-
     struct metaTbl *metaTbl = metaTblLoadByQuery(conn, dyStringCannibalize(&dy));
-    sqlDisconnect(&conn);
     verbose(2, "rows returned: %d\n",slCount(metaTbl));
     return metaObjsLoadFromMemory(&metaTbl,buildHash);
 }
 
-struct metaObj *metaObjQueryByObj(char * db,char *table,char *objName,char *varName)
+struct metaObj *metaObjQueryByObj(struct sqlConnection *conn,char *table,char *objName,char *varName)
 // Query a single metadata object and optional var from a table (default metaTbl).
 {
 if(objName == NULL)
-    return metaObjQuery(db,table,NULL);
+    return metaObjQuery(conn,table,NULL);
 
 struct metaObj *queryObj  = metaObjCreate(objName,NULL,varName,NULL,NULL);
-struct metaObj *resultObj = metaObjQuery(db,table,queryObj);
+struct metaObj *resultObj = metaObjQuery(conn,table,queryObj);
 metaObjsFree(&queryObj);
 return resultObj;
 }
 
-struct metaByVar *metaByVarsQuery(char * db,char *table,struct metaByVar *metaByVars)
+struct metaByVar *metaByVarsQuery(struct sqlConnection *conn,char *table,struct metaByVar *metaByVars)
 // Query the metadata table by one or more var=val pairs to find the distinct set of objs that satisfy ANY conditions.
 // Returns new metaByVar struct fully populated and sorted in var,val,obj order.
 {
 //  select var,val,obj where (var= [and val in (val1,val2)]) or (var= [and val in (val1,val2)]) order by var,val,obj
-    struct dyString *dy = newDyString(4096);
 
-    if(db == NULL)
-        db = METATBL_DEFAULT_DB;
     if(table == NULL)
         table = METATBL_DEFAULT_NAME;
+    if(!sqlTableExists(conn,table))
+        return NULL;
 
+    struct dyString *dy = newDyString(4096);
     dyStringPrintf(dy, "select distinct objName,objType,var,varType,val from %s", table);
 
     struct metaByVar *rootVar;
     for(rootVar=metaByVars;rootVar!=NULL;rootVar=rootVar->next)
@@ -880,44 +873,37 @@
         }
     dyStringPrintf(dy, " order by var, val, objName");
     verbose(2, "Query: %s\n",dyStringContents(dy));
 
-    struct sqlConnection *conn = sqlConnect(db);
-    if(!sqlTableExists(conn,table))
-        {
-        dyStringFree(&dy);
-        return NULL;
-        }
     struct metaTbl *metaTbl = metaTblLoadByQuery(conn, dyStringCannibalize(&dy));
-    sqlDisconnect(&conn);
     verbose(2, "rows returned: %d\n",slCount(metaTbl));
     return metaByVarsLoadFromMemory(&metaTbl,TRUE);
 }
 
-struct metaByVar *metaByVarQueryByVar(char * db,char *table,char *varName,char *val)
+struct metaByVar *metaByVarQueryByVar(struct sqlConnection *conn,char *table,char *varName,char *val)
 // Query a single metadata variable and optional val from a table (default metaTbl) for searching val->obj.
 {
 if(varName == NULL)
-    return metaByVarsQuery(db,table,NULL);
+    return metaByVarsQuery(conn,table,NULL);
 
 struct metaByVar *queryVar  = metaByVarCreate(varName,NULL,val);
-struct metaByVar *resultVar = metaByVarsQuery(db,table,queryVar);
+struct metaByVar *resultVar = metaByVarsQuery(conn,table,queryVar);
 metaByVarsFree(&queryVar);
 return resultVar;
 }
 
-struct metaObj *metaObjsQueryByVars(char * db,char *table,struct metaByVar *metaByVars)
+struct metaObj *metaObjsQueryByVars(struct sqlConnection *conn,char *table,struct metaByVar *metaByVars)
 // Query the metadata table by one or more var=val pairs to find the distinct set of objs that satisfy ALL conditions.
 // Returns new metaObj struct fully populated and sorted in obj,var order.
 {
 //  select var,val,obj where (var= [and val in (val1,val2)]) or (var= [and val in (val1,val2)]) order by var,val,obj
-    struct dyString *dy = newDyString(4096);
 
-    if(db == NULL)
-        db = METATBL_DEFAULT_DB;
     if(table == NULL)
         table = METATBL_DEFAULT_NAME;
+    if(!sqlTableExists(conn,table))
+        return NULL;
 
+    struct dyString *dy = newDyString(4096);
     dyStringPrintf(dy, "select distinct objName,objType,var,varType,val from %s", table);
 
     struct metaByVar *rootVar;
     for(rootVar=metaByVars;rootVar!=NULL;rootVar=rootVar->next)
@@ -943,16 +929,9 @@
         }
     dyStringPrintf(dy, " order by objName, var");
     verbose(2, "Query: %s\n",dyStringContents(dy));
 
-    struct sqlConnection *conn = sqlConnect(db);
-    if(!sqlTableExists(conn,table))
-        {
-        dyStringFree(&dy);
-        return NULL;
-        }
     struct metaTbl *metaTbl = metaTblLoadByQuery(conn, dyStringCannibalize(&dy));
-    sqlDisconnect(&conn);
     verbose(2, "rows returned: %d\n",slCount(metaTbl));
     return metaObjsLoadFromMemory(&metaTbl,TRUE);
 }
 
@@ -1119,20 +1098,21 @@
 
 void metaObjReorderVars(struct metaObj *metaObjs, char *vars,boolean back)
 // Reorders vars list based upon list of vars "cell antibody treatment".  Send to front or back.
 {
-char *words[48];
+//char *words[48];
 char *cloneLine = cloneString(vars);
-int count = chopLine(cloneLine,words);
+int count = chopByWhite(cloneLine,NULL,0);
+char **words = needMem(sizeof(char *) * count);
+count = chopByWhite(cloneLine,words,count);
+//int count = chopLine(cloneLine,words);
 
 struct metaObj *metaObj = NULL;
 for( metaObj=metaObjs; metaObj!=NULL; metaObj=metaObj->next )
     {
     int ix;
     struct metaVar *orderedVars = NULL;
-    struct metaVar *varsToReorder[48];
-    for( ix=0; ix<count; ix++ )
-        varsToReorder[ix] = NULL; // Be certain
+    struct metaVar **varsToReorder = needMem(sizeof(struct metaVar *) * count);
 
     struct metaVar *metaVar = NULL;
     while((metaVar = slPopHead(&(metaObj->vars))) != NULL)
         {
@@ -1162,17 +1142,22 @@
             }
         }
 
     metaObj->vars = orderedVars;
+    freeMem(varsToReorder);
     }
+    freeMem(words);
 }
 
 void metaObjRemoveVars(struct metaObj *metaObjs, char *vars)
 // Prunes list of vars for an object, freeing the memory.  Doesn't touch DB.
 {
-char *words[48];
+//char *words[48];
 char *cloneLine = cloneString(vars);
-int count = chopLine(cloneLine,words);
+int count = chopByWhite(cloneLine,NULL,0);
+char **words = needMem(sizeof(char *) * count);
+count = chopByWhite(cloneLine,words,count);
+//int count = chopLine(cloneLine,words);
 
 struct metaObj *metaObj = NULL;
 for( metaObj=metaObjs; metaObj!=NULL; metaObj=metaObj->next )
     {
@@ -1189,8 +1174,9 @@
 
     slReverse(&keepTheseVars);
     metaObj->vars = keepTheseVars;
     }
+    freeMem(words);
 }
 
 // --------------- Free at last ----------------
 void metaObjsFree(struct metaObj **metaObjsPtr)