Index: trunk/pstamp/src/pstamprequest.c
===================================================================
--- trunk/pstamp/src/pstamprequest.c	(revision 17894)
+++ trunk/pstamp/src/pstamprequest.c	(revision 18243)
@@ -13,4 +13,26 @@
 } psrOptions;
 
+char *str_columns[] = {
+    "PROJECT",
+    "JOB_TYPE",
+    "REQ_TYPE", // byid,  byexp,         bycoord
+    "ID",       // db id, exposure name, n/a
+    "CLASS_ID",
+    "CENTER_X",
+    "CENTER_Y",
+    "WIDTH",
+    "HEIGHT",
+    "FILTER",
+    "DATE_MIN",
+    "DATE_MAX",
+    "STAMP_NAME",
+    NULL
+};
+char *u32_columns[] = {
+    "COORD_MASK",
+    "OPTION_MASK", // bitmask or of PSTAMP_SELECT_IMAGE PSTAMP_SELECT_MASK PSTAMP_SELECT_WEIGHT
+    NULL
+};
+
 static void usage()
 {
@@ -19,4 +41,16 @@
 }
 
+static psMetadata *initializeTable()
+{
+    psMetadata *md = psMetadataAlloc();
+
+    for (char **col_name = str_columns; *col_name != NULL; col_name++) {
+        psMetadataAddStr(md, PS_LIST_TAIL, *col_name, PS_META_DEFAULT, "", "null");
+    }
+    for (char **col_name = u32_columns; *col_name != NULL; col_name++) {
+        psMetadataAddU32(md, PS_LIST_TAIL, *col_name, PS_META_DEFAULT, "", 0);
+    }
+    return md;
+}
 static void getId(char *idString, int argnum, int *pArgc, char *argv[], psrOptions *options)
 {
@@ -25,5 +59,11 @@
         usage();
     }
-    psMetadataAdd (options->md, PS_LIST_TAIL, idString, PS_DATA_STRING, "", argv[argnum]);
+    // catch common error
+    if (*argv[argnum] == '-') {
+        fprintf(stderr, "%s is not a valid %s\n", argv[argnum], idString);
+        usage();
+    }
+
+    psMetadataAddStr (options->md, PS_LIST_TAIL, idString, PS_META_REPLACE, "", argv[argnum]);
     psArgumentRemove(argnum, pArgc, argv);
 }
@@ -56,5 +96,5 @@
         usage();
     }
-    psMetadataAdd (options->md, PS_LIST_TAIL, "IMG_TYPE", PS_DATA_STRING, "", type);
+    psMetadataAddStr (options->md, PS_LIST_TAIL, "IMG_TYPE", PS_META_REPLACE, "", type);
 
     getId(paramName, argnum, pArgc, argv, options);
@@ -104,5 +144,5 @@
 {
     psrOptions *options = psAlloc(sizeof(psrOptions));
-    psMetadata *md = psMetadataAlloc();
+    psMetadata *md = initializeTable();
     int         argnum;
     bool        gotStyle  = false;
@@ -112,26 +152,29 @@
     bool        needROI   = false;
     bool        makeStamps= false;
+    unsigned    optionMask = PSTAMP_SELECT_IMAGE;
 
     options->md = md;
 
-    // Job type. This is normally "stamp" for postage stamp. 
-    // "get_image" requests that whole images to be retrieved (in PS case magic masked)
+    // Job type. 
+    // "stamp" for make postage stamps. 
+    // "get_image" requests that whole images to be retrieved (magic masked for gpc1)
     // "list_uri" results in a list of matching images
     if ((argnum = psArgumentGet(argc, argv, "-get_image"))) {
-        psMetadataAdd (md, PS_LIST_TAIL, "REQ_TYPE", PS_DATA_STRING, "", "get_image");
+        psMetadataAddStr (md, PS_LIST_TAIL, "JOB_TYPE", PS_META_REPLACE, "", "get_image");
         psArgumentRemove(argnum, &argc, argv);
     } else if ((argnum = psArgumentGet(argc, argv, "-list_uri"))) {
-        psMetadataAdd (md, PS_LIST_TAIL, "REQ_TYPE", PS_DATA_STRING, "", "get_image");
-        psArgumentRemove(argnum, &argc, argv);
-    } else {
-        psMetadataAdd (md, PS_LIST_TAIL, "REQ_TYPE", PS_DATA_STRING, "", "stamp");
+        psMetadataAddStr (md, PS_LIST_TAIL, "JOB_TYPE", PS_META_REPLACE, "", "list_uri");
+        psArgumentRemove(argnum, &argc, argv);
+    } else {
+        // default JOB_TYPE is stamp
+        psMetadataAddStr (md, PS_LIST_TAIL, "JOB_TYPE", PS_META_REPLACE, "", "stamp");
         needROI = true;
         makeStamps = true;
     }
 
-    if ((argnum = psArgumentGet(argc, argv, "-name"))) {
+    if ((argnum = psArgumentGet(argc, argv, "-request_name"))) {
         psArgumentRemove(argnum, &argc, argv);
         if (argc < 2) {
-            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "no request name specified");
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "value required for request name");
             usage();
         }
@@ -146,8 +189,8 @@
         psArgumentRemove(argnum, &argc, argv);
         if (argc < 2) {
-            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "no project name specified");
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "value required for project name");
             usage();
         }
-        psMetadataAdd(md, PS_LIST_TAIL, "PROJECT", PS_DATA_STRING, "", argv[argnum]);
+        psMetadataAddStr(md, PS_LIST_TAIL, "PROJECT", PS_META_REPLACE, "", argv[argnum]);
         psArgumentRemove(argnum, &argc, argv);
     } else {
@@ -157,23 +200,36 @@
 
     // user tag will be used as the base name for the postage stamp images
-    if ((argnum = psArgumentGet(argc, argv, "-user_tag"))) {
+    if ((argnum = psArgumentGet(argc, argv, "-stamp_name"))) {
         psArgumentRemove(argnum, &argc, argv);
         if (argc < 2) {
-            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "missing value for user_tag");
+            psError(PS_ERR_BAD_PARAMETER_VALUE, true, "missing value for stamp_name");
             usage();
         }
-        psMetadataAdd(md, PS_LIST_TAIL, "USER_TAG", PS_DATA_STRING, "", argv[argnum]);
-        psArgumentRemove(argnum, &argc, argv);
-    } else {
-        // default user tag to requestName
-        psMetadataAdd(md, PS_LIST_TAIL, "USER_TAG", PS_DATA_STRING, "", options->requestName);
-    }
+        psMetadataAddStr(md, PS_LIST_TAIL, "STAMP_NAME", PS_META_REPLACE, "", argv[argnum]);
+        psArgumentRemove(argnum, &argc, argv);
+    } else {
+        // if stamp name not specified use requestName
+        psMetadataAddStr(md, PS_LIST_TAIL, "STAMP_NAME", PS_META_REPLACE, "", options->requestName);
+    }
+
+    if ((argnum = psArgumentGet(argc, argv, "-mask"))) {
+        psArgumentRemove(argnum, &argc, argv);
+        optionMask |= PSTAMP_SELECT_MASK;
+    }
+    if ((argnum = psArgumentGet(argc, argv, "-weight"))) {
+        psArgumentRemove(argnum, &argc, argv);
+        optionMask |= PSTAMP_SELECT_WEIGHT;
+    }
+    psMetadataAddU32(md, PS_LIST_TAIL, "OPTION_MASK", PS_META_REPLACE, "", optionMask);
 
     // find style & image type
     if ((argnum = psArgumentGet(argc, argv, "-bycoord"))) {
+        fprintf(stderr, "-bycoord not implemented yet\n");
+        exit(1);
+
         gotStyle = true;
-        psMetadataAdd(md, PS_LIST_TAIL, "REQ_TYPE", PS_DATA_STRING, "", 1+argv[argnum]);
-        psArgumentRemove(argnum, &argc, argv);
-        needCoord = true;
+        psMetadataAddStr(md, PS_LIST_TAIL, "REQ_TYPE", PS_META_REPLACE, "", 1+argv[argnum]);
+
+        psArgumentRemove(argnum, &argc, argv); needCoord = true;
         needROI = true;
         // TODO: we need an IMG_TYPE too...
@@ -186,5 +242,5 @@
         }
         gotStyle = true;
-        psMetadataAdd(md, PS_LIST_TAIL, "REQ_TYPE", PS_DATA_STRING, "", 1+argv[argnum]);
+        psMetadataAddStr(md, PS_LIST_TAIL, "REQ_TYPE", PS_META_REPLACE, "", 1+argv[argnum]);
         psArgumentRemove(argnum, &argc, argv);
         doById(argnum, &argc, argv, options);
@@ -197,5 +253,5 @@
         }
         gotStyle = true;
-        psMetadataAdd(md, PS_LIST_TAIL, "REQ_TYPE", PS_DATA_STRING, "", 1+argv[argnum]);
+        psMetadataAddStr(md, PS_LIST_TAIL, "REQ_TYPE", PS_META_REPLACE, "", 1+argv[argnum]);
         psArgumentRemove(argnum, &argc, argv);
         doByExp(argnum, &argc, argv, options);
@@ -213,26 +269,29 @@
         if (needROI) {
             usage();
+        } else {
+            psErrorClear();
         }
     }
 
     if (needROI) {
-        if (roiParam.celestialCenter) {
-            psMetadataAdd (md, PS_LIST_TAIL, "RA", PS_DATA_STRING, "",  roiParam.center[0]);
-            psMetadataAdd (md, PS_LIST_TAIL, "DEC", PS_DATA_STRING, "", roiParam.center[1]);
-        } else {
+        unsigned coord_mask = 0;
+
+        if (!roiParam.celestialCenter) {
             if (needCoord) {
                 fprintf(stderr, "need to specify ROI in sky coordinates with -bycoord\n");
                 usage();
             }
-            psMetadataAdd (md, PS_LIST_TAIL, "CENTER_X", PS_DATA_STRING, "", roiParam.center[0]);
-            psMetadataAdd (md, PS_LIST_TAIL, "CENTER_Y", PS_DATA_STRING, "", roiParam.center[1]);
-        }
-        if (roiParam.celestialRange) {
-            psMetadataAdd (md, PS_LIST_TAIL, "D_RA", PS_DATA_STRING, "",  roiParam.range[0]);
-            psMetadataAdd (md, PS_LIST_TAIL, "D_DEC", PS_DATA_STRING, "", roiParam.range[1]);
-        } else {
-            psMetadataAdd (md, PS_LIST_TAIL, "WIDTH", PS_DATA_STRING, "",  roiParam.range[0]);
-            psMetadataAdd (md, PS_LIST_TAIL, "HEIGHT", PS_DATA_STRING, "", roiParam.range[1]);
-        }
+            coord_mask |= PSTAMP_CENTER_IN_PIXELS;
+        }
+        psMetadataAddStr (md, PS_LIST_TAIL, "CENTER_X", PS_META_REPLACE, "", roiParam.center[0]);
+        psMetadataAddStr (md, PS_LIST_TAIL, "CENTER_Y", PS_META_REPLACE, "", roiParam.center[1]);
+
+        if (!roiParam.celestialRange) {
+            coord_mask |= PSTAMP_RANGE_IN_PIXELS;
+        }
+        psMetadataAddStr (md, PS_LIST_TAIL, "WIDTH", PS_META_REPLACE, "",  roiParam.range[0]);
+        psMetadataAddStr (md, PS_LIST_TAIL, "HEIGHT", PS_META_REPLACE, "", roiParam.range[1]);
+
+        psMetadataAddU32(md, PS_LIST_TAIL, "COORD_MASK", PS_META_REPLACE, "", coord_mask);
     }
 
@@ -266,6 +325,6 @@
     psMetadata *header = psMetadataAlloc();
 
-    psMetadataAdd(header, PS_LIST_TAIL, "REQ_NAME", PS_DATA_STRING, "", options->requestName);
-    psMetadataAdd(header, PS_LIST_TAIL, "EXTVER",   PS_DATA_STRING, "", STAMP_REQUEST_VERSION);
+    psMetadataAddStr(header, PS_LIST_TAIL, "EXTVER",   PS_META_REPLACE, "", STAMP_REQUEST_VERSION);
+    psMetadataAddStr(header, PS_LIST_TAIL, "REQ_NAME", PS_META_REPLACE, "", options->requestName);
 
     psArray    *table = psArrayAlloc(1);
@@ -285,33 +344,4 @@
 }
 
-bool sampleTable(const char *fileName)
-{
-    psFits *fitsFile = psFitsOpen(fileName, "w");
-    int     numRows = 42;
-
-    if (fitsFile == NULL) {
-        psError(PS_ERR_IO, true, "failed to open %s for output\n", fileName);
-        return false;
-    }
-
-    psArray    *table = psArrayAlloc(numRows);
-
-    for (int i=0; i< numRows; i++) {
-        psMetadata *row = psMetadataAlloc();
-        psMetadataAdd (row, PS_LIST_TAIL, "ROW",   PS_DATA_S32,    "", i);
-        psMetadataAdd (row, PS_LIST_TAIL, "FROW",  PS_TYPE_F32,    "", 0.1*i);
-        psMetadataAdd (row, PS_LIST_TAIL, "DUMMY", PS_DATA_STRING, "", "test line");
-
-        table->data[i] = row;
-         
-    }
-
-    psFitsWriteTable(fitsFile, NULL, table, "BILLSEXT");
-
-    psFitsClose(fitsFile);
-
-    return true;
-}
-
 int main(int argc, char *argv[])
 {
