Index: /trunk/Ohana/src/opihi/dvo/avextract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/avextract.c	(revision 14190)
+++ /trunk/Ohana/src/opihi/dvo/avextract.c	(revision 14191)
@@ -13,5 +13,4 @@
   PhotCode *code;
   Vector **vec;
-
   dbField *fields;
   dbStack *stack;
@@ -23,4 +22,7 @@
   code = NULL;
   mode = MAG_AVE;
+  fields = NULL;
+  stack = NULL;
+
   dvo_catalog_init (&catalog, TRUE);
 
@@ -108,6 +110,6 @@
   }
 
-  // XXX free fields and stack 
-
+  dbFreeFields (fields, Nfields);
+  dbFreeStack (stack, Nstack);
   SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
   return (TRUE);
@@ -118,4 +120,6 @@
 
 escape:
+  dbFreeFields (fields, Nfields);
+  dbFreeStack (stack, Nstack);
   SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
   dvo_catalog_free (&catalog);
Index: /trunk/Ohana/src/opihi/dvo/dbCmdlineFields.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dbCmdlineFields.c	(revision 14190)
+++ /trunk/Ohana/src/opihi/dvo/dbCmdlineFields.c	(revision 14191)
@@ -39,8 +39,5 @@
 	gprint (GP_ERR, "unknown database field %s\n", field);
 	free (field);
-	for (j = 0; j <= Nfields; j++) {
-	  if (fields->name != NULL) free (fields->name);
-	}
-	free (fields);
+	dbFreeFields (fields, Nfields);
 	return (NULL);
       }
Index: /trunk/Ohana/src/opihi/dvo/dbExtractMeasures.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dbExtractMeasures.c	(revision 14190)
+++ /trunk/Ohana/src/opihi/dvo/dbExtractMeasures.c	(revision 14191)
@@ -22,6 +22,10 @@
 
   switch (field->ID) {
-    // XXX not sure how to apply the photcode here....
     case MEAS_MAG: /* magnitudes are already determined above */
+      // if user has requested a photcode, supply the value only if we match (else NO_MAG)
+      if ((field->photcode->type != PHOT_MAG) && 
+	  (measure[0].photcode != field->photcode->code)) {
+	  break;
+      }
       switch (field->magMode) {
 	case MAG_INST:
Index: /trunk/Ohana/src/opihi/dvo/dbFields.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dbFields.c	(revision 14190)
+++ /trunk/Ohana/src/opihi/dvo/dbFields.c	(revision 14191)
@@ -1,5 +1,22 @@
 # include "dvoshell.h"
 
-dbInitField (dbField *field) {
+void dbFreeFields (dbField *fields, int Nfields) {
+
+  int i;
+
+  if (fields == NULL) return;
+
+  for (i = 0; i <= Nfields; i++) {
+    if (fields[i].name != NULL) free (fields[i].name);
+    if (fields[i].photcode != NULL) {
+      if (fields[i].photcode[0].type == PHOT_MAG) {
+	free (fields[i].photcode);
+      }
+    }
+  }
+  free (fields);
+}
+
+void dbInitField (dbField *field) {
   field->name = NULL;
   field->extract = FALSE;
@@ -26,12 +43,15 @@
 PhotCode *ParsePhotcodeField (char *field, int *mode, int defMode) {
 
+  int useDefault;
   char *tmpstring, *p;
   PhotCode *code;
 
   *mode = defMode;
+  useDefault = TRUE;
 
   p = strchr (field, ':');
   if (p != NULL) {
     *mode = GetMagMode (p + 1);
+    useDefault = FALSE;
     if (*mode == MAG_NONE) return (NULL);
     tmpstring = strncreate (field, p - field);
@@ -39,7 +59,30 @@
     tmpstring = strcreate (field);
   }
+  if (!strcasecmp (tmpstring, "MAG")) {
+    ALLOCATE (code, PhotCode, 1);
+    code[0].code = 0;
+    strcpy (code[0].name, "MAG");
+    code[0].type = PHOT_MAG;
+    free (tmpstring);
+    return (code);
+  }
   code = GetPhotcodebyName (tmpstring);
+
+  // enforce compatibility
+  // XXX this is kind of poorly done
+  if ((code[0].type == PHOT_REF) && (*mode != MAG_ERR)) {
+    *mode = MAG_CAT;
+  }
+  if (code[0].type == PHOT_DEP) {
+    if (useDefault) {
+      *mode = MAG_REL;
+    } else {
+      if ((*mode == MAG_AVE) || (*mode == MAG_REF)) {
+	// XXX error;
+	*mode = MAG_REL;
+      }
+    }
+  } 
   free (tmpstring);
-
   return (code);
 }
@@ -112,6 +155,6 @@
   if (!strcasecmp (fieldName, "PAR"))   ESCAPE (AVE_PAR,       MAG_NONE);
   if (!strcasecmp (fieldName, "dPAR"))  ESCAPE (AVE_PAR_ERR,   MAG_NONE);
-  if (!strcasecmp (fieldName, "MAG"))   ESCAPE (AVE_MAG,       MAG_AVE);
-  if (!strcasecmp (fieldName, "dMAG"))  ESCAPE (AVE_dMAG,      MAG_ERR);
+  // if (!strcasecmp (fieldName, "MAG"))   ESCAPE (AVE_MAG,       MAG_AVE);
+  // if (!strcasecmp (fieldName, "dMAG"))  ESCAPE (AVE_dMAG,      MAG_ERR);
   if (!strcasecmp (fieldName, "NMEAS")) ESCAPE (AVE_NMEAS,     MAG_NONE);
   if (!strcasecmp (fieldName, "NMISS")) ESCAPE (AVE_NMISS,     MAG_NONE);
@@ -129,4 +172,9 @@
   code = ParsePhotcodeField (fieldName, &mode, MAG_AVE);
   if (code == NULL) return (FALSE);
+  if (code[0].type == PHOT_MAG) {
+    gprint (GP_ERR, "'mag' is ambiguous for avextract\n");
+    free (code);
+    return (FALSE);
+  }
 
   // need to distinguish phot, sys errors and scatter
Index: /trunk/Ohana/src/opihi/dvo/dbStackOps.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/dbStackOps.c	(revision 14190)
+++ /trunk/Ohana/src/opihi/dvo/dbStackOps.c	(revision 14191)
@@ -10,4 +10,6 @@
 
   int i;
+
+  if (stack == NULL) return;
 
   for (i = 0; i < Nstack; i++) {
Index: /trunk/Ohana/src/opihi/dvo/mextract.c
===================================================================
--- /trunk/Ohana/src/opihi/dvo/mextract.c	(revision 14190)
+++ /trunk/Ohana/src/opihi/dvo/mextract.c	(revision 14191)
@@ -14,5 +14,4 @@
   PhotCode *code;
   Vector **vec;
-
   dbField *fields;
   dbStack *stack;
@@ -24,4 +23,7 @@
   code = NULL;
   mode = MAG_REL;
+  fields = NULL;
+  stack = NULL;
+
   dvo_catalog_init (&catalog, TRUE);
 
@@ -120,6 +122,6 @@
   }
 
-  // XXX free fields and stack 
-
+  dbFreeFields (fields, Nfields);
+  dbFreeStack (stack, Nstack);
   FreeImageSelection ();
   SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
@@ -134,4 +136,6 @@
 
 escape:
+  dbFreeFields (fields, Nfields);
+  dbFreeStack (stack, Nstack);
   FreeImageSelection ();
   SkyListFree (skylist, ((RegionName != NULL) || (RegionList != NULL)));
Index: /trunk/Ohana/src/opihi/include/dvoshell.h
===================================================================
--- /trunk/Ohana/src/opihi/include/dvoshell.h	(revision 14190)
+++ /trunk/Ohana/src/opihi/include/dvoshell.h	(revision 14191)
@@ -137,3 +137,6 @@
 void         dbExtractMeasuresInit  PROTO(());
 
+void 	     dbInitField            PROTO((dbField *field));
+void 	     dbFreeFields           PROTO((dbField *fields, int Nfields));
+
 # endif
