Index: /trunk/ippTools/src/chiptool.c
===================================================================
--- /trunk/ippTools/src/chiptool.c	(revision 11561)
+++ /trunk/ippTools/src/chiptool.c	(revision 11562)
@@ -29,4 +29,5 @@
 #include "p2tool.h"
 
+static bool queuerawexpMode(pxConfig *config);
 static bool pendingimfileMode(pxConfig *config);
 static bool addprocessedimfileMode(pxConfig *config);
@@ -55,4 +56,5 @@
 
     switch (config->mode) {
+        MODECASE(P2TOOL_MODE_QUEUERAWEXP,           queuerawexpMode);
         MODECASE(P2TOOL_MODE_PENDINGIMFILE,         pendingimfileMode);
         MODECASE(P2TOOL_MODE_ADDPROCESSEDIMFILE,    addprocessedimfileMode);
@@ -82,4 +84,122 @@
 }
 
+#define ADDPARAMSTR(from, to, name) \
+{ \
+    bool status = false; \
+    psString str = psMetadataLookupStr(&status, from, "-" name); \
+    if (!status) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -" name); \
+        return false; \
+    } \
+    if (str) { \
+        if (!psMetadataAddStr(to, PS_LIST_TAIL, name, 0, "==", str)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " name); \
+            psFree(to); \
+            return false; \
+        } \
+    } \
+}
+
+
+#define ADDPARAMF(from, to, type, name) \
+{ \
+    bool status = false; \
+    ps##type var = psMetadataLookup##type(&status, from, "-" #name); \
+    if (!status) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -" name); \
+        return false; \
+    } \
+    if (!isnan(var)) { \
+        if (!psMetadataAdd##type(to, PS_LIST_TAIL, #name, 0, "==", var)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+            psFree(to); \
+            return false; \
+        } \
+    } \
+}
+
+
+static bool queuerawexpMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, NULL);
+
+    psMetadata *where = psMetadataAlloc();
+    ADDPARAMSTR(config->args, where, "exp_tag");
+    ADDPARAMSTR(config->args, where, "exp_id");
+    ADDPARAMSTR(config->args, where, "inst");
+    ADDPARAMSTR(config->args, where, "telescope");
+    ADDPARAMSTR(config->args, where, "dateobs");
+    ADDPARAMSTR(config->args, where, "exp_type");
+    ADDPARAMSTR(config->args, where, "imfiles");
+    ADDPARAMSTR(config->args, where, "workdir");
+    ADDPARAMSTR(config->args, where, "filter");
+    ADDPARAMF(config->args, where, F32, "airmass");
+    ADDPARAMF(config->args, where, F32, "ra");
+    ADDPARAMF(config->args, where, F32, "decl");
+    ADDPARAMF(config->args, where, F32, "exp_time");
+    ADDPARAMF(config->args, where, F64, "bg");
+    ADDPARAMF(config->args, where, F64, "bg_stdev");
+    ADDPARAMF(config->args, where, F64, "bg_mean_stdev");
+    ADDPARAMF(config->args, where, F64, "alt");
+    ADDPARAMF(config->args, where, F64, "az");
+    ADDPARAMF(config->args, where, F32, "ccd_temp");
+    ADDPARAMF(config->args, where, F64, "posang");
+    ADDPARAMSTR(config->args, where, "object");
+
+    if (config->where->list->n < 1) {
+        psFree(config->where);
+        config->where = NULL;
+    }
+
+    bool status = false;
+    psString label = psMetadataLookupStr(&status, config->args, "-set_label");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_label");
+        return false;
+    }
+
+    // XXX this does not work!!!
+    psString query = psStringCopy(
+            "INSERT INTO p2PendingExp\n"
+            "   SElECT\n"
+            "       exp_tag,\n"
+            "       'my recipe',\n"  // recipe
+            "       255\n"         // p1_version
+            "       255\n"         // p2_version
+            "       %s\n"
+            "   FROM rawExp"
+            "   LEFT JOIN p2ProcessedExp"
+            "       USING(exp_tag)"
+            "   WHERE"
+            "       rawExp.fault = 0"
+        );
+
+    if (config->where) {
+        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "rawExp");
+        psStringAppend(&query, " AND %s", whereClause);
+        psFree(whereClause);
+    }
+
+    if (!p_psDBRunQuery(config->dbh, query, label ? label : "NULL")) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+    psFree(query);
+
+    psArray *output = p_psDBFetchResult(config->dbh);
+    if (!output) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+    if (!psArrayLength(output)) {
+        // XXX check psError here
+        psError(PS_ERR_UNKNOWN, false, "no p2PendingImfile rows found");
+        psFree(output);
+        return false;
+    }
+
+    return true;
+}
 
 static bool pendingimfileMode(pxConfig *config)
Index: /trunk/ippTools/src/chiptool.h
===================================================================
--- /trunk/ippTools/src/chiptool.h	(revision 11561)
+++ /trunk/ippTools/src/chiptool.h	(revision 11562)
@@ -25,4 +25,5 @@
 typedef enum {
     P2TOOL_MODE_NONE      = 0x0,
+    P2TOOL_MODE_QUEUERAWEXP,
     P2TOOL_MODE_PENDINGIMFILE,
     P2TOOL_MODE_ADDPROCESSEDIMFILE,
Index: /trunk/ippTools/src/chiptoolConfig.c
===================================================================
--- /trunk/ippTools/src/chiptoolConfig.c	(revision 11561)
+++ /trunk/ippTools/src/chiptoolConfig.c	(revision 11562)
@@ -40,4 +40,52 @@
         goto FAIL;
     }
+
+    // -queuerawexp
+    psMetadata *queuerawexpArgs = psMetadataAlloc();
+    psMetadataAddStr(queuerawexpArgs, PS_LIST_TAIL, "-exp_tag",  0,
+            "search by exp_tag", NULL);
+    psMetadataAddStr(queuerawexpArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "search by exp_id", NULL);
+    psMetadataAddStr(queuerawexpArgs, PS_LIST_TAIL, "-inst",  0,
+            "search by camera", NULL);
+    psMetadataAddStr(queuerawexpArgs, PS_LIST_TAIL, "-telescope",  0,
+            "search by telescope", NULL);
+    psMetadataAddStr(queuerawexpArgs, PS_LIST_TAIL, "-dateobs",  0,
+            "search by observation time", NULL);
+    psMetadataAddStr(queuerawexpArgs, PS_LIST_TAIL, "-exp_type",  0,
+            "search by exposure type", NULL);
+    psMetadataAddStr(queuerawexpArgs, PS_LIST_TAIL, "-imfiles",  0,
+            "search by number of imfiles", NULL);
+    psMetadataAddStr(queuerawexpArgs, PS_LIST_TAIL, "-workdir",  0,
+            "search by workdir", NULL);
+    psMetadataAddStr(queuerawexpArgs, PS_LIST_TAIL, "-filter",  0,
+            "search by filter ", NULL);
+    psMetadataAddF32(queuerawexpArgs, PS_LIST_TAIL, "-airmass",  0,
+            "search by airmass", NAN);
+    psMetadataAddF64(queuerawexpArgs, PS_LIST_TAIL, "-ra",  0,
+            "search by RA", NAN);
+    psMetadataAddF64(queuerawexpArgs, PS_LIST_TAIL, "-decl",  0,
+            "search by DEC", NAN);
+    psMetadataAddF32(queuerawexpArgs, PS_LIST_TAIL, "-exp_time",  0,
+            "search by exposure time", NAN);
+    psMetadataAddF64(queuerawexpArgs, PS_LIST_TAIL, "-bg",  0,
+            "search by exposue background", NAN);
+    psMetadataAddF64(queuerawexpArgs, PS_LIST_TAIL, "-bg_stdev",  0,
+            "search by exposue background stdev", NAN);
+    psMetadataAddF64(queuerawexpArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,
+            "search by exposue background mean stdev", NAN);
+    psMetadataAddF64(queuerawexpArgs, PS_LIST_TAIL, "-alt",  0,
+            "search by altitute", NAN);
+    psMetadataAddF64(queuerawexpArgs, PS_LIST_TAIL, "-az",  0,
+            "search by azimuth", NAN);
+    psMetadataAddF32(queuerawexpArgs, PS_LIST_TAIL, "-ccd_temp",  0,
+            "search by ccd tempature", NAN);
+    psMetadataAddF64(queuerawexpArgs, PS_LIST_TAIL, "-posang",  0,
+            "search by rotator position angle", NAN);
+    psMetadataAddStr(queuerawexpArgs, PS_LIST_TAIL, "-object",  0,
+            "search by exposure object", NULL);
+    psMetadataAddStr(queuerawexpArgs, PS_LIST_TAIL, "-set_label",  0,
+            "define label for phase 2 processing (non-detrend data only)", NULL);
+
 
     // -pendingimfile
@@ -150,4 +198,5 @@
 
     psMetadata *argSets = psMetadataAlloc();
+    PXTOOL_MODE("-queuerawexp",     P2TOOL_MODE_QUEUERAWEXP,   queuerawexpArgs);
     PXTOOL_MODE("-pendingimfile",   P2TOOL_MODE_PENDINGIMFILE,  pendingimfileArgs);
     PXTOOL_MODE("-addprocessedimfile",P2TOOL_MODE_ADDPROCESSEDIMFILE,addprocessedimfileArgs);
