fa9a4052cbc6e42d290560755e5f8302c267ce7e
tdreszer
  Mon Jun 28 16:15:42 2010 -0700
Added special features to mdbPrint to print SQL insert statements for expTable and spacial case extension for adding expIds to exisiting mdb objects.
diff --git src/hg/lib/mdb.c src/hg/lib/mdb.c
index 0e8a9a7..ffc8c7e 100644
--- src/hg/lib/mdb.c
+++ src/hg/lib/mdb.c
@@ -1532,6 +1532,13 @@
 char **updateVars = needMem(sizeof(char *) * updCount);
 updCount = chopByChar(varsToSet,',',updateVars,updCount);
 int ix=0;
+boolean updExpId = (updCount == 1 && startsWithWordByDelimiter("expId",'=',updateVars[0]));
+int startingId=0;
+if(updExpId)
+    {
+    startingId = sqlSigned(skipBeyondDelimit(updateVars[0],'='));
+    updateVars[0][strlen("expId")] = '\0';
+    }
 
 struct mdbObj *mdbObj = NULL;
 struct dyString *thisSelection = newDyString(256);
@@ -1545,11 +1552,11 @@
     dyStringClear(thisSelection);
     if(sameWord(varsToSelect,"obj"))
         {
-        dyStringPrintf(thisSelection,"obj=%s",mdbObj->obj);
+        dyStringPrintf(thisSelection,"-obj=%s",mdbObj->obj);
         }
     else
         {
-        dyStringPrintf(thisSelection,"vars=\"");
+        dyStringPrintf(thisSelection,"-vars=\"");
         for(ix = 0;ix < selCount; ix++)
             {
             char *val = mdbObjFindValue(mdbObj,selectVars[ix]);
@@ -1573,9 +1580,13 @@
     printf("mdbUpdate %s table=%s %s",dbToUpdate,tableToUpdate,dyStringContents(thisSelection));
 
     // Now look up the value of each var to update
-    printf(" setVars=\"");
+    printf(" -setVars=\"");
     for(ix = 0;ix < updCount; ix++)
         {
+        if(updExpId)
+            printf("expId=%u",startingId++);// FIXME: Need to make single quotes work since already within double quotes!
+        else
+            {
         char *val = mdbObjFindValue(mdbObj,updateVars[ix]);
         if(val != NULL) // What to do for NULLS? Ignore
             {
@@ -1586,12 +1597,84 @@
                 printf("%s ",val);
             }
         }
+        }
     printf("\" -test\n"); // Always test first
     }
 dyStringFree(&thisSelection);
 dyStringFree(&lastSelection);
 }
 
+void mdbObjPrintInsertToExperimentsTable(struct mdbObj **mdbObjs,char *expTableName, char *expDefiningVars)
+// prints insert statments for the experiments taable to backfile experiments submitted before the experiments table existed
+{
+if(expTableName == NULL || expDefiningVars == NULL)
+    errAbort("mdbObjPrintInsertToExpTbl is missing important parameter.\n");
+
+int varCount = 0;
+char **expVars = NULL;
+if(sameWord(expDefiningVars,"obj"))
+    errAbort("mdbObjPrintInsertToExpTbl 'obj' is an invalid experiment defining variable.\n");
+
+// Sort objs to avoid duplicate mdbUpdate statements
+mdbObjsSortOnVars(mdbObjs, expDefiningVars);
+
+// Parse list of selcting vars (could be simply expId or expId,replicate,view)
+varCount = chopByChar(expDefiningVars,',',NULL,0);
+if(varCount <= 0)
+    errAbort("mdbObjPrintInsertToExpTbl is missing experiment defining variables.\n");
+expVars = needMem(sizeof(char *) * varCount);
+varCount = chopByChar(expDefiningVars,',',expVars,varCount);
+int ix=0;
+
+struct mdbObj *mdbObj = NULL;
+struct dyString *varNames = newDyString(256);
+struct dyString *varVals = newDyString(256);
+struct dyString *lastVals = newDyString(256);
+for(mdbObj=*mdbObjs;mdbObj!=NULL;mdbObj=mdbObj->next)
+    {
+    if(mdbObj->obj == NULL || mdbObj->deleteThis)
+        continue;
+
+    // Build this selection string
+    dyStringClear(varNames);
+    dyStringClear(varVals);
+
+    boolean first=TRUE;
+    // "insert into expTable (cell,antibody) values ('GM12878','CTCF');
+    for(ix = 0;ix < varCount; ix++)
+        {
+        char *val = mdbObjFindValue(mdbObj,expVars[ix]);
+        if(val != NULL) // TODO what to do for NULLS?
+            {
+            if(first)
+                first=FALSE;
+            else
+                {
+                dyStringPrintf(varNames,",");
+                dyStringPrintf(varVals,",");
+                }
+            dyStringPrintf(varNames,"%s", expVars[ix]);
+            if(countLeadingDigits(val) == strlen(val))
+                dyStringPrintf(varVals,"%s",val);
+            else
+                dyStringPrintf(varVals,"'%s'",val);
+            }
+        }
+
+    // Don't bother making another mdpUpdate line if selection is the same.
+    if(sameString(dyStringContents(lastVals),dyStringContents(varVals)))
+        continue;
+    dyStringClear(lastVals);
+    dyStringAppend(lastVals,dyStringContents(varVals));
+
+    printf("INSERT INTO %s (%s) VALUES (%s);\n",expTableName,dyStringContents(varNames),dyStringContents(varVals));
+
+    }
+dyStringFree(&varNames);
+dyStringFree(&varVals);
+dyStringFree(&lastVals);
+}
+
 // ----------------- Utilities -----------------
 
 char *mdbObjFindValue(struct mdbObj *mdbObj, char *var)