src/hg/lib/mdb.c 1.4

1.4 2010/04/23 02:38:36 tdreszer
Handle '#' comments more gracefully and include quotes in non-RA style printing
Index: src/hg/lib/mdb.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/mdb.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -b -B -U 4 -r1.3 -r1.4
--- src/hg/lib/mdb.c	19 Apr 2010 18:57:45 -0000	1.3
+++ src/hg/lib/mdb.c	23 Apr 2010 02:38:36 -0000	1.4
@@ -244,9 +244,11 @@
 #include "ra.h"
 #include "hgConfig.h"
 #include "obscure.h"
 
+#define MDB_METADATA_KEY  "metadata"
 #define MDB_METAOBJ_RAKEY "metaObject"
+#define MDB_METAVAR_RAKEY "metaVariable"
 #define MDB_OBJ_TYPE "objType"
 
 // ------- (static) convert from autoSql -------
 static void mdbVarFree(struct mdbVar **mdbVarPtr)
@@ -491,8 +493,10 @@
 
     int ix;
     for(ix = 0;ix<count;ix++)
         {
+        if(*words[ix] == '#')
+            break;
         if(strchr(words[ix], '=') == NULL)
             errAbort("This is not formatted var=val pairs: '%s'\n\t%s\n",words[ix],varPairs);
 
         AllocVar(mdbVar);
@@ -599,9 +603,9 @@
 /* Parses a single formatted metadata line into mdbObj for updates or queries. */
 {
 char *fromTheTop = line;
 char*nibbledWord = cloneNextWordByDelimiter(&line,' ');
-if(nibbledWord == NULL || differentWord(nibbledWord,"metadata"))
+if(nibbledWord == NULL || differentWord(nibbledWord,MDB_METADATA_KEY))
     errAbort("This is not a formatted metadata line:\n\t%s\n",fromTheTop);
 freeMem(nibbledWord);
 
 struct mdbObj *mdbObj = NULL;
@@ -619,9 +623,9 @@
         {
         nibbledWord = cloneNextWordByDelimiter(&line,' ');;
         if(nibbledWord == NULL)
             errAbort("This is not a formatted metadata line:\n\t%s\n",fromTheTop);
-        if(strchr(nibbledWord, '=') != NULL) // If this is start of var=val pairs
+        if(*nibbledWord == '#' || strchr(nibbledWord, '=') != NULL) // IS commnet OR start of var=val pairs
             break;
 
         if(sameWord(nibbledWord,"delete"))
             mdbObj->deleteThis = TRUE;
@@ -630,9 +634,9 @@
         varPairs = line;
         freeMem(nibbledWord);
         }
     }
-if(strlen(varPairs) > 0)
+if(varPairs != NULL && strlen(varPairs) > 0 && *varPairs != '#')
         mdbObj = mdbObjAddVarPairs(mdbObj,varPairs);
 else if(mdbObj->deleteThis == FALSE)
     errAbort("This is not a formatted metadata line:\n\t%s\n",fromTheTop);
 return mdbObj;
@@ -795,8 +799,11 @@
 char *line;
 
 while (lineFileNext(lf, &line,NULL))
     {
+    char *start = skipLeadingSpaces(line);
+    if(start == NULL || *start == '#')
+        continue;
     if(startsWithWord(MDB_METAOBJ_RAKEY,line))
         {
         // This is the RA style file!!
         lineFileClose(&lf);
@@ -1155,9 +1162,9 @@
             dyStringPrintf(dy, " where (var ");
         else
             dyStringPrintf(dy, " OR (var ");
         if(rootVar->notEqual && rootVar->vals == NULL)
-            dyStringPrintf(dy, "NOT ");
+            dyStringPrintf(dy, "%s",strchr(rootVar->var,'%')?"NOT ":"!");
 
         dyStringPrintf(dy, "%s '%s'",
             (strchr(rootVar->var,'%')?"like":"="), rootVar->var);
 
@@ -1171,9 +1178,9 @@
             if(!multiVals)
                 {
                 dyStringPrintf(dy, " and val ");
                 if(rootVar->notEqual)
-                    dyStringPrintf(dy, "NOT ");
+                    dyStringPrintf(dy, "%s",strchr(limbVal->val,'%')?"NOT ":"!");
                 if(limbVal->next == NULL) // only one val
                     {
                     dyStringPrintf(dy, "%s '%s'",
                         (strchr(limbVal->val,'%')?"like":"="), sqlEscapeString(limbVal->val));
@@ -1243,9 +1250,9 @@
             dyStringPrintf(dy, " AND obj in ");
         dyStringPrintf(dy, "(select obj from %s where var ",table);
 
         if(rootVar->notEqual && rootVar->vals == NULL)
-            dyStringPrintf(dy, "NOT ");
+            dyStringPrintf(dy, "%s",strchr(rootVar->var,'%')?"NOT ":"!");
 
         dyStringPrintf(dy, "%s '%s'",
             (strchr(rootVar->var,'%')?"like":"="), rootVar->var);
 
@@ -1259,9 +1266,9 @@
             if(!multiVals)
                 {
                 dyStringPrintf(dy, " and val ");
                 if(rootVar->notEqual)
-                    dyStringPrintf(dy, "NOT ");
+                    dyStringPrintf(dy, "%s",strchr(limbVal->val,'%')?"NOT ":"!");
                 if(limbVal->next == NULL) // only one val
                     {
                     dyStringPrintf(dy, "%s '%s'",
                         (strchr(limbVal->val,'%')?"like":"="), sqlEscapeString(limbVal->val));
@@ -1303,8 +1310,10 @@
     if(mdbVar->val != NULL)
         {
         if(mdbVar->varType == vtBinary)
             printf("binary");
+        else if(!raStyle && strchr(mdbVar->val, ' ') != NULL) // Has blanks
+            printf("\"%s\"",mdbVar->val);
         else
             printf("%s",mdbVar->val);
         }
     }
@@ -1326,9 +1335,9 @@
     {
     if(mdbObj->obj == NULL)
         continue;
 
-    printf("%s %s",(raStyle?MDB_METAOBJ_RAKEY:"metadata"),mdbObj->obj);
+    printf("%s %s",(raStyle?MDB_METAOBJ_RAKEY:MDB_METADATA_KEY),mdbObj->obj);
     if(mdbObj->deleteThis)
         printf(" delete");
 
     struct mdbVar *mdbVar = NULL;
@@ -1356,49 +1365,52 @@
 // Single line:
 //   mdbVariable lucy=ethyl bestFriends lifePartners
 //   mdbVariable lucy=ricky iLoveLucy divorces
 // NOT QUITE ra style
-//   mdbVariable lucy
-//       ethyl
-//           bestFriends
-//           lifePartners
-//       ricky
-//           iLoveLucy
-//           divorces
-// TODO: Expand for mutilple var types; strip quotes from vals on ra style
+//   metadata Fred wife=Ethyl
+//   metadata Lucy wife=Ethyl
+// Results in:
+//   mdbVariable wife Ethyl
+//   metaObject Fred
+//   metaObject Lucy
 struct mdbByVar *rootVar = NULL;
 for(rootVar=mdbByVars;rootVar!=NULL;rootVar=rootVar->next)
     {
     if(rootVar->var == NULL)
         continue;
 
-    boolean first = TRUE;
     struct mdbLimbVal *limbVal = NULL;
     for(limbVal=rootVar->vals;limbVal!=NULL;limbVal=limbVal->next)
         {
         if(limbVal->val == NULL)
             continue;
 
-        if(first) // first val for this var
-            {
-            printf("mdbVariable %s",rootVar->var);
-            first = FALSE;
-            }
+        if(raStyle)
+            printf("%s %s ",MDB_METAVAR_RAKEY,rootVar->var);
+        else
+            printf("%s %s=",MDB_METAVAR_RAKEY,rootVar->var);
 
         if(rootVar->varType == vtBinary)
-            printf("%sbinary",(raStyle ? "\n    ":"="));
+            printf("binary");
+        else if(!raStyle && strchr(limbVal->val, ' ') != NULL) // Has blanks
+            printf("\"%s\"",limbVal->val);
         else
-            printf("%s%s",(raStyle ? "\n    ":"="),limbVal->val);
+            printf("%s",limbVal->val);
 
         struct mdbLeafObj *leafObj = NULL;
         for(leafObj=limbVal->objs;leafObj!=NULL;leafObj=leafObj->next)
             {
             if(leafObj->obj == NULL)
                 continue;
 
-            printf("%s%s",(raStyle?"\n        ":" "),leafObj->obj);
+            if(raStyle)
+                printf("\n%s %s",MDB_METAOBJ_RAKEY,leafObj->obj);
+            else
+                printf(" %s",leafObj->obj);
             }
         printf("\n");
+        if(raStyle)
+            printf("\n");
         }
     }
 }
 
@@ -1794,9 +1806,9 @@
 #define MDB_OBJ_KEY "mdbObj"
 static struct mdbObj *metadataForTableFromTdb(struct trackDb *tdb)
 // Returns the metadata for a table from a tdb setting.
 {
-char *setting = trackDbSetting(tdb, "metadata");
+char *setting = trackDbSetting(tdb, MDB_METADATA_KEY);
 if(setting == NULL)
     return NULL;
 struct mdbObj *mdbObj;
 AllocVar(mdbObj);