IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jan 20, 2008, 3:48:37 PM (18 years ago)
Author:
eugene
Message:

merging changes from JHs end_stage branch (new end_stage field and related features; substantial cleanup via macros)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ippTools/src/regtool.c

    r15778 r16170  
    4444static bool updateprocessedexpMode(pxConfig *config);
    4545
    46 
    47 // static guidePendingExpRow *newToP1PendingExp(newExpRow *newExp);
    48 //static chipPendingExpRow *newTochipPendingExp(pxConfig *config, newExpRow *newExp);
    49 //static chipInputImfileRow *rawImfileTochipInputImfile(pxConfig *config, psS64 chip_id, rawImfileRow *rawImfile);
    50 
    51 static rawExpRow *newToRawExp(pxConfig *config, newExpRow *exp);
    52 //static psU32 mapCodeStrToInt(const char *codeStr);
    53 
    54 
    5546# define MODECASE(caseName, func) \
    5647    case caseName: \
     
    109100    PS_ASSERT_PTR_NON_NULL(config, false);
    110101
    111     bool status = false;
    112     psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
    113     if (!status) {
    114         psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -limit");
    115         return false;
    116     }
     102    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     103    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
    117104
    118105    // select newImfiles that:
     
    163150    }
    164151
    165     bool simple = false;
    166     simple = psMetadataLookupBool(&status, config->args, "-simple");
    167     if (!status) {
    168         psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -simple");
    169         return false;
    170     }
    171 
    172152    // negate simple so the default is true
    173153    if (!ippdbPrintMetadatas(stdout, output, "regPendingImfile", !simple)) {
     
    187167    PS_ASSERT_PTR_NON_NULL(config, false);
    188168
    189     bool status = false;
    190169    // required
    191     psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
    192     if (!status) {
    193         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
    194         return false;
    195     }
    196     if (!exp_id) {
    197         psError(PS_ERR_UNKNOWN, true, "-exp_id is required");
    198         return false;
    199     }
    200 
    201     psString exp_name = psMetadataLookupStr(&status, config->args, "-exp_name");
    202     if (!status) {
    203         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_name");
    204         return false;
    205     }
    206     if (!exp_name) {
    207         psError(PS_ERR_UNKNOWN, true, "-exp_name is required");
    208         return false;
    209     }
    210 
    211     psString camera = psMetadataLookupStr(&status, config->args, "-inst");
    212     if (!status) {
    213         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
    214         return false;
    215     }
    216     if (!camera) {
    217         psError(PS_ERR_UNKNOWN, true, "-inst is required");
    218         return false;
    219     }
    220 
    221     psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
    222     if (!status) {
    223         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
    224         return false;
    225     }
    226     if (!telescope) {
    227         psError(PS_ERR_UNKNOWN, true, "-telescope is required");
    228         return false;
    229     }
    230 
    231     psString tmp_class_id = psMetadataLookupStr(&status, config->args, "-tmp_class_id");
    232     if (!status) {
    233         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -tmp_class_id");
    234         return false;
    235     }
    236     if (!tmp_class_id) {
    237         psError(PS_ERR_UNKNOWN, true, "-tmp_class_id is required");
    238     }
    239 
    240     psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
    241     if (!status) {
    242         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class_id");
    243         return false;
    244     }
    245     if (!class_id) {
    246         psError(PS_ERR_UNKNOWN, true, "-class_id is required");
    247         return false;
    248     }
    249 
    250     psString uri = psMetadataLookupStr(&status, config->args, "-uri");
    251     if (!status) {
    252         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -uri");
    253         return false;
    254     }
    255     if (!uri) {
    256         psError(PS_ERR_UNKNOWN, true, "-uri is required");
    257         return false;
    258     }
     170    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
     171    PXOPT_LOOKUP_STR(exp_name, config->args, "-exp_name", true, false);
     172    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
     173    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", true, false);
     174    PXOPT_LOOKUP_STR(tmp_class_id, config->args, "-tmp_class_id", true, false);
     175    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
     176    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
    259177
    260178    // optional
    261     psString exp_type = psMetadataLookupStr(&status, config->args, "-exp_type");
    262     if (!status) {
    263         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_type");
    264         return false;
    265     }
    266 
    267     psString filelevel = psMetadataLookupStr(&status, config->args, "-filelevel");
    268     if (!status) {
    269         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filelevel");
    270         return false;
    271     }
    272 
    273     psString filter = psMetadataLookupStr(&status, config->args, "-filter");
    274     if (!status) {
    275         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter");
    276         return false;
    277     }
    278 
    279     psString comment = psMetadataLookupStr(&status, config->args, "-comment");
    280     if (!status) {
    281         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -comment");
    282         return false;
    283     }
    284 
    285     psF32 airmass = psMetadataLookupF32(&status, config->args, "-airmass");
    286     if (!status) {
    287         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass");
    288         return false;
    289     }
    290 
    291     psF64 ra = psMetadataLookupF64(&status, config->args, "-ra");
    292     if (!status) {
    293         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ra");
    294         return false;
    295     }
    296 
    297     psF64 decl = psMetadataLookupF64(&status, config->args, "-decl");
    298     if (!status) {
    299         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -decl");
    300         return false;
    301     }
    302 
    303     psF32 exp_time = psMetadataLookupF32(&status, config->args, "-exp_time");
    304     if (!status) {
    305         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time");
    306         return false;
    307     }
    308 
    309     psF32 sat_pixel_frac = psMetadataLookupF32(&status, config->args, "-sat_pixel_frac");
    310     if (!status) {
    311         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -sat_pixel_frac");
    312         return false;
    313     }
    314 
    315     psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
    316     if (!status) {
    317         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
    318         return false;
    319     }
    320 
    321     psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
    322     if (!status) {
    323         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
    324         return false;
    325     }
    326 
    327     psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
    328     if (!status) {
    329         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
    330         return false;
    331     }
    332 
    333     psF64 alt = psMetadataLookupF64(&status, config->args, "-alt");
    334     if (!status) {
    335         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -alt");
    336         return false;
    337     }
    338 
    339     psF64 az = psMetadataLookupF64(&status, config->args, "-az");
    340     if (!status) {
    341         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -az");
    342         return false;
    343     }
    344 
    345     psF32 ccd_temp = psMetadataLookupF32(&status, config->args, "-ccd_temp");
    346     if (!status) {
    347         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp");
    348         return false;
    349     }
    350 
    351     psF64 posang = psMetadataLookupF32(&status, config->args, "-posang");
    352     if (!status) {
    353         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang");
    354         return false;
    355     }
    356 
    357     psF32 m1_x = psMetadataLookupF32(&status, config->args, "-m1_x");
    358     if (!status) {
    359         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_x");
    360         return false;
    361     }
    362     psF32 m1_y = psMetadataLookupF32(&status, config->args, "-m1_y");
    363     if (!status) {
    364         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_y");
    365         return false;
    366     }
    367     psF32 m1_z = psMetadataLookupF32(&status, config->args, "-m1_z");
    368     if (!status) {
    369         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_z");
    370         return false;
    371     }
    372     psF32 m1_tip = psMetadataLookupF32(&status, config->args, "-m1_tip");
    373     if (!status) {
    374         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_tip");
    375         return false;
    376     }
    377     psF32 m1_tilt = psMetadataLookupF32(&status, config->args, "-m1_tilt");
    378     if (!status) {
    379         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_tilt");
    380         return false;
    381     }
    382 
    383     psF32 m2_x = psMetadataLookupF32(&status, config->args, "-m2_x");
    384     if (!status) {
    385         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_x");
    386         return false;
    387     }
    388     psF32 m2_y = psMetadataLookupF32(&status, config->args, "-m2_y");
    389     if (!status) {
    390         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_y");
    391         return false;
    392     }
    393     psF32 m2_z = psMetadataLookupF32(&status, config->args, "-m2_z");
    394     if (!status) {
    395         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_z");
    396         return false;
    397     }
    398     psF32 m2_tip = psMetadataLookupF32(&status, config->args, "-m2_tip");
    399     if (!status) {
    400         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_tip");
    401         return false;
    402     }
    403     psF32 m2_tilt = psMetadataLookupF32(&status, config->args, "-m2_tilt");
    404     if (!status) {
    405         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_tilt");
    406         return false;
    407     }
    408 
    409     psF32 env_temp = psMetadataLookupF32(&status, config->args, "-env_temperature");
    410     if (!status) {
    411         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_temperature");
    412         return false;
    413     }
    414     psF32 env_humid = psMetadataLookupF32(&status, config->args, "-env_humidity");
    415     if (!status) {
    416         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_humidity");
    417         return false;
    418     }
    419     psF32 env_wind = psMetadataLookupF32(&status, config->args, "-env_wind_speed");
    420     if (!status) {
    421         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_wind_speed");
    422         return false;
    423     }
    424     psF32 env_dir = psMetadataLookupF32(&status, config->args, "-env_wind_dir");
    425     if (!status) {
    426         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_wind_dir");
    427         return false;
    428     }
    429 
    430     psF32 teltemp_m1 = psMetadataLookupF32(&status, config->args, "-teltemp_m1");
    431     if (!status) {
    432         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_m1");
    433         return false;
    434     }
    435     psF32 teltemp_m1cell = psMetadataLookupF32(&status, config->args, "-teltemp_m1cell");
    436     if (!status) {
    437         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_m1cell");
    438         return false;
    439     }
    440     psF32 teltemp_m2 = psMetadataLookupF32(&status, config->args, "-teltemp_m2");
    441     if (!status) {
    442         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_m2");
    443         return false;
    444     }
    445     psF32 teltemp_spider = psMetadataLookupF32(&status, config->args, "-teltemp_spider");
    446     if (!status) {
    447         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_spider");
    448         return false;
    449     }
    450     psF32 teltemp_truss = psMetadataLookupF32(&status, config->args, "-teltemp_truss");
    451     if (!status) {
    452         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_truss");
    453         return false;
    454     }
    455     psF32 teltemp_extra = psMetadataLookupF32(&status, config->args, "-teltemp_extra");
    456     if (!status) {
    457         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_extra");
    458         return false;
    459     }
    460 
    461     psF32 pon_time = psMetadataLookupF32(&status, config->args, "-pon_time");
    462     if (!status) {
    463         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -pon_time");
    464         return false;
    465     }
    466 
    467     psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
    468     if (!status) {
    469         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
    470         return false;
    471     }
    472     psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
    473     if (!status) {
    474         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
    475         return false;
    476     }
    477     psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
    478     if (!status) {
    479         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
    480         return false;
    481     }
    482     psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
    483     if (!status) {
    484         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
    485         return false;
    486     }
    487     psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
    488     if (!status) {
    489         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
    490         return false;
    491     }
    492 
    493     psString object = psMetadataLookupStr(&status, config->args, "-object");
    494     if (!status) {
    495         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -object");
    496         return false;
    497     }
    498 
    499     psTime *dateobs = NULL;
    500     {
    501         psString dateobsStr = psMetadataLookupStr(&status, config->args, "-dateobs");
    502         if (!status) {
    503             psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -dateobs");
    504             return false;
    505         }
    506         // pass through NULL as this is an optional field
    507         if (dateobsStr) {
    508             dateobs = psTimeFromISO(dateobsStr, PS_TIME_UTC);
    509         } else {
    510             dateobs = NULL;
    511         }
    512     }
    513 
    514     psS16 code = psMetadataLookupS16(&status, config->args, "-code");
    515     if (!status) {
    516         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
    517         return false;
    518     }
     179    PXOPT_LOOKUP_STR(exp_type, config->args, "-exp_type", false, false);
     180    PXOPT_LOOKUP_STR(filelevel, config->args, "-filelevel", false, false);
     181    PXOPT_LOOKUP_STR(filter, config->args, "-filter", false, false);
     182    PXOPT_LOOKUP_STR(comment, config->args, "-comment", false, false);
     183
     184    PXOPT_LOOKUP_F32(airmass, config->args, "-airmass", false, false);
     185    PXOPT_LOOKUP_F64(ra, config->args, "-ra", false, false);
     186    PXOPT_LOOKUP_F64(decl, config->args, "-decl", false, false);
     187    PXOPT_LOOKUP_F32(exp_time, config->args, "-exp_time", false, false);
     188    PXOPT_LOOKUP_F32(sat_pixel_frac, config->args, "-sat_pixel_frac", false, false);
     189    PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
     190    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
     191    PXOPT_LOOKUP_F64(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
     192    PXOPT_LOOKUP_F64(alt, config->args, "-alt", false, false);
     193    PXOPT_LOOKUP_F64(az, config->args, "-az", false, false);
     194    PXOPT_LOOKUP_F32(ccd_temp, config->args, "-ccd_temp", false, false);
     195    PXOPT_LOOKUP_F64(posang, config->args, "-posang", false, false);
     196    PXOPT_LOOKUP_F32(m1_x, config->args, "-m1_x", false, false);
     197    PXOPT_LOOKUP_F32(m1_y, config->args, "-m1_y", false, false);
     198    PXOPT_LOOKUP_F32(m1_z, config->args, "-m1_z", false, false);
     199    PXOPT_LOOKUP_F32(m1_tip, config->args, "-m1_tip", false, false);
     200    PXOPT_LOOKUP_F32(m1_tilt, config->args, "-m1_tilt", false, false);
     201    PXOPT_LOOKUP_F32(m2_x, config->args, "-m2_x", false, false);
     202    PXOPT_LOOKUP_F32(m2_y, config->args, "-m2_y", false, false);
     203    PXOPT_LOOKUP_F32(m2_z, config->args, "-m2_z", false, false);
     204    PXOPT_LOOKUP_F32(m2_tip, config->args, "-m2_tip", false, false);
     205    PXOPT_LOOKUP_F32(m2_tilt, config->args, "-m2_tilt", false, false);
     206
     207    PXOPT_LOOKUP_F32(env_temp, config->args, "-env_temperature", false, false);
     208    PXOPT_LOOKUP_F32(env_humid, config->args, "-env_humidity", false, false);
     209    PXOPT_LOOKUP_F32(env_wind, config->args, "-env_wind_speed", false, false);
     210    PXOPT_LOOKUP_F32(env_dir, config->args, "-env_wind_dir", false, false);
     211    PXOPT_LOOKUP_F32(teltemp_m1, config->args, "-teltemp_m1", false, false);
     212    PXOPT_LOOKUP_F32(teltemp_m1cell, config->args, "-teltemp_m1cell", false, false);
     213    PXOPT_LOOKUP_F32(teltemp_m2, config->args, "-teltemp_m2", false, false);
     214    PXOPT_LOOKUP_F32(teltemp_spider, config->args, "-teltemp_spider", false, false);
     215    PXOPT_LOOKUP_F32(teltemp_truss, config->args, "-teltemp_truss", false, false);
     216    PXOPT_LOOKUP_F32(teltemp_extra, config->args, "-teltemp_extra", false, false);
     217    PXOPT_LOOKUP_F32(pon_time, config->args, "-pon_time", false, false);
     218    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
     219    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
     220    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
     221    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
     222    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
     223    PXOPT_LOOKUP_STR(object, config->args, "-object", false, false);
     224    PXOPT_LOOKUP_TIME(dateobs, config->args, "-dateobs", false, false);
     225    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
    519226
    520227    if (!rawImfileInsert(
     
    574281    )) {
    575282        psError(PS_ERR_UNKNOWN, false, "database error");
    576         psFree(dateobs);
    577         return false;
    578     }
    579 
    580     psFree(dateobs);
     283        return false;
     284    }
    581285
    582286    return true;
     
    588292    PS_ASSERT_PTR_NON_NULL(config, false);
    589293
    590     bool status = false;
    591     psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
    592     if (!status) {
    593         psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -limit");
    594         return false;
    595     }
    596 
    597     bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
    598     if (!status) {
    599         psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -faulted");
    600         return false;
    601     }
     294    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     295    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     296    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
    602297
    603298    psString query = pxDataGet("regtool_processedimfile.sql");
     
    655350    }
    656351
    657     bool simple = false;
    658     {
    659         bool status = false;
    660         simple = psMetadataLookupBool(&status, config->args, "-simple");
    661         if (!status) {
    662             psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
    663             return false;
    664         }
    665     }
    666 
    667352    if (psArrayLength(output)) {
    668353        // negative simple so the default is true
     
    716401    PS_ASSERT_PTR_NON_NULL(config, false);
    717402
    718     bool status = false;
    719     psS16 code = psMetadataLookupS16(&status, config->args, "-code");
    720     if (!status) {
    721         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
    722         return false;
    723     }
    724     if (code == INT16_MAX) {
    725         psError(PS_ERR_UNKNOWN, true, "-code is required");
    726         return false;
    727     }
     403    PXOPT_LOOKUP_S16(code, config->args, "-code", true, false);
    728404
    729405    if (!pxSetFaultCode(config->dbh, "rawImfile", config->where, code)) {
     
    740416    PS_ASSERT_PTR_NON_NULL(config, false);
    741417
    742     bool status = false;
    743     psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
    744     if (!status) {
    745         psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -limit");
    746         return false;
    747     }
     418    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     419    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
    748420
    749421    // return only exps that:
     
    792464    }
    793465
    794     bool simple = false;
    795     simple = psMetadataLookupBool(&status, config->args, "-simple");
    796     if (!status) {
    797         psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -simple");
    798         return false;
    799     }
    800 
    801466    // negate simple so the default is true
    802467    if (!ippdbPrintMetadatas(stdout, output, "regPendingExp", !simple)) {
     
    821486    // that the correct count of imfiles is in rawImfile
    822487
    823     bool status = false;
    824     psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
    825     if (!status) {
    826         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
    827         return false;
    828     }
    829     if (!exp_id) {
    830         psError(PS_ERR_UNKNOWN, true, "-exp_id is required");
    831         return false;
    832     }
    833 
    834     bool detrend = psMetadataLookupBool(&status, config->args, "-detrend");
    835     if (!status) {
    836         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -detrend");
    837         return false;
    838     }
     488    // required
     489    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
     490    PXOPT_LOOKUP_STR(exp_name, config->args, "-exp_name", true, false);
     491    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
     492    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", true, false);
     493    PXOPT_LOOKUP_STR(exp_tag, config->args, "-exp_tag", true, false);
     494    PXOPT_LOOKUP_STR(filelevel, config->args, "-filelevel", true, false);
     495
     496    // optional
     497    PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
     498    PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", false, false);
     499    PXOPT_LOOKUP_STR(end_stage, config->args, "-end_stage", false, false);
     500    PXOPT_LOOKUP_STR(exp_type, config->args, "-exp_type", false, false);
     501    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", false, false);
     502    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false);
     503    PXOPT_LOOKUP_STR(filter, config->args, "-filter", false, false);
     504    PXOPT_LOOKUP_STR(comment, config->args, "-comment", false, false);
     505    PXOPT_LOOKUP_F32(airmass, config->args, "-airmass", false, false);
     506    PXOPT_LOOKUP_F64(ra, config->args, "-ra", false, false);
     507    PXOPT_LOOKUP_F64(decl, config->args, "-decl", false, false);
     508    PXOPT_LOOKUP_F32(exp_time, config->args, "-exp_time", false, false);
     509    PXOPT_LOOKUP_F32(sat_pixel_frac, config->args, "-sat_pixel_frac", false, false);
     510    PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
     511    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
     512    PXOPT_LOOKUP_F64(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
     513    PXOPT_LOOKUP_F64(alt, config->args, "-alt", false, false);
     514    PXOPT_LOOKUP_F64(az, config->args, "-az", false, false);
     515    PXOPT_LOOKUP_F32(ccd_temp, config->args, "-ccd_temp", false, false);
     516    PXOPT_LOOKUP_F64(posang, config->args, "-posang", false, false);
     517    PXOPT_LOOKUP_F32(m1_x, config->args, "-m1_x", false, false);
     518    PXOPT_LOOKUP_F32(m1_y, config->args, "-m1_y", false, false);
     519    PXOPT_LOOKUP_F32(m1_z, config->args, "-m1_z", false, false);
     520    PXOPT_LOOKUP_F32(m1_tip, config->args, "-m1_tip", false, false);
     521    PXOPT_LOOKUP_F32(m1_tilt, config->args, "-m1_tilt", false, false);
     522    PXOPT_LOOKUP_F32(m2_x, config->args, "-m2_x", false, false);
     523    PXOPT_LOOKUP_F32(m2_y, config->args, "-m2_y", false, false);
     524    PXOPT_LOOKUP_F32(m2_z, config->args, "-m2_z", false, false);
     525    PXOPT_LOOKUP_F32(m2_tip, config->args, "-m2_tip", false, false);
     526    PXOPT_LOOKUP_F32(m2_tilt, config->args, "-m2_tilt", false, false);
     527
     528    PXOPT_LOOKUP_F32(env_temp, config->args, "-env_temperature", false, false);
     529    PXOPT_LOOKUP_F32(env_humid, config->args, "-env_humidity", false, false);
     530    PXOPT_LOOKUP_F32(env_wind, config->args, "-env_wind_speed", false, false);
     531    PXOPT_LOOKUP_F32(env_dir, config->args, "-env_wind_dir", false, false);
     532    PXOPT_LOOKUP_F32(teltemp_m1, config->args, "-teltemp_m1", false, false);
     533    PXOPT_LOOKUP_F32(teltemp_m1cell, config->args, "-teltemp_m1cell", false, false);
     534    PXOPT_LOOKUP_F32(teltemp_m2, config->args, "-teltemp_m2", false, false);
     535    PXOPT_LOOKUP_F32(teltemp_spider, config->args, "-teltemp_spider", false, false);
     536    PXOPT_LOOKUP_F32(teltemp_truss, config->args, "-teltemp_truss", false, false);
     537    PXOPT_LOOKUP_F32(teltemp_extra, config->args, "-teltemp_extra", false, false);
     538    PXOPT_LOOKUP_F32(pon_time, config->args, "-pon_time", false, false);
     539    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
     540    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
     541    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
     542    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
     543    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
     544    PXOPT_LOOKUP_STR(object, config->args, "-object", false, false);
     545    PXOPT_LOOKUP_TIME(dateobs, config->args, "-dateobs", false, false);
     546
     547    // default
     548    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
    839549
    840550    psString query = pxDataGet("regtool_pendingexp.sql");
     
    847557        // build a query to search by exp_id
    848558        psMetadata *where = psMetadataAlloc();
    849         bool status = false;
    850         psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
    851         if (!status) {
    852             psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
     559        if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==", exp_id)) {
     560            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     561            psFree(where);
    853562            psFree(query);
    854563            return false;
    855564        }
    856         if (exp_id) {
    857             if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==", exp_id)) {
    858                 psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    859                 psFree(where);
    860                 psFree(query);
    861                 return false;
    862             }
    863         }
    864 
    865565
    866566        psString whereClause = psDBGenerateWhereSQL(where, NULL);
     
    898598        return false;
    899599    }
     600    // sanity check that we only got one row
     601    if (psArrayLength(output) != 1) {
     602        // rollback
     603        if (!psDBRollback(config->dbh)) {
     604            psError(PS_ERR_UNKNOWN, false, "database error");
     605        }
     606        psError(PS_ERR_UNKNOWN, false, "should have gotten 1 row but %lu rows were returned", psArrayLength(output));
     607        psFree(output);
     608        return NULL;
     609    }
    900610
    901611    if (!psDBTransaction(config->dbh)) {
     
    906616
    907617    // insert the exp into rawExp
    908     for (long i = 0; psArrayLength(output) > i; i++) {
    909         psMetadata *row = output->data[i];
    910         // convert metadata into a newExp object
    911         newExpRow *newExp = newExpObjectFromMetadata(row);
    912         // convert newExp object into a rawExp object
    913         rawExpRow *rawExp = newToRawExp(config, newExp);
    914         if (!rawExp) {
    915             // rollback
    916             if (!psDBRollback(config->dbh)) {
    917                 psError(PS_ERR_UNKNOWN, false, "database error");
    918             }
    919             psError(PS_ERR_UNKNOWN, false, "failed to convert newExp to rawExp");
    920             psFree(newExp);
    921             psFree(output);
    922             return false;
    923         }
    924         psFree(newExp);
    925 
    926         // insert the rawExp object into the database
    927         if (!rawExpInsertObject(config->dbh, rawExp)) {
    928             // rollback
    929             if (!psDBRollback(config->dbh)) {
    930                 psError(PS_ERR_UNKNOWN, false, "database error");
    931             }
    932             psError(PS_ERR_UNKNOWN, false, "database error");
    933             psFree(rawExp);
    934             psFree(output);
    935             return false;
    936         }
    937 
    938         // if this is a detrend image don't put it in the chip queue (and we're
    939         // done)
    940         if (detrend) {
    941             // set the state for the newExp to stop
    942             if (!pxnewExpSetState(config, exp_id, "stop")) {
    943                 // rollback
    944                 if (!psDBRollback(config->dbh)) {
    945                     psError(PS_ERR_UNKNOWN, false, "database error");
    946                 }
    947                 psError(PS_ERR_UNKNOWN, false, "failed to change newExp.state for exp_id: %s", exp_id);
    948                 psFree(rawExp);
    949                 psFree(output);
    950                 return false;
    951             }
    952             psFree(rawExp);
    953             continue;
    954         }
    955 
    956 
    957         // set the state for the newExp to stop
    958         if (!pxnewExpSetState(config, exp_id, "stop")) {
    959             // rollback
    960             if (!psDBRollback(config->dbh)) {
    961                 psError(PS_ERR_UNKNOWN, false, "database error");
    962             }
    963             psError(PS_ERR_UNKNOWN, false, "failed to change newExp.state for exp_id: %s", exp_id);
    964             psFree(rawExp);
    965             psFree(output);
    966             return false;
    967         }
    968 
    969         // insert an entry into the chipPendingExp table
    970         // this can only be run as the newExp's state has been set to stop
    971         if (!pxchipQueueByExpTag(config,
    972                     rawExp->exp_id,
    973                     rawExp->workdir,
    974                     NULL, // label
    975                     rawExp->reduction,
    976                     NULL, // expgroup
    977                     NULL  // dvodb
    978         )) {
    979             // rollback
    980             if (!psDBRollback(config->dbh)) {
    981                 psError(PS_ERR_UNKNOWN, false, "database error");
    982             }
    983             psError(PS_ERR_UNKNOWN, false, "failed to queue chipPendingExp");
    984             psFree(rawExp);
    985             psFree(output);
    986             return false;
    987         }
    988         psFree(rawExp);
    989     }
     618    psMetadata *row = output->data[0];
     619    // convert metadata into a newExp object
     620    newExpRow *newExp = newExpObjectFromMetadata(row);
    990621    psFree(output);
    991622
    992     if (!psDBCommit(config->dbh)) {
    993         psError(PS_ERR_UNKNOWN, false, "database error");
    994         return false;
    995     }
    996 
    997     return true;
    998 }
    999 
    1000 
    1001 static bool processedexpMode(pxConfig *config)
    1002 {
    1003     PS_ASSERT_PTR_NON_NULL(config, false);
    1004 
    1005     bool status = false;
    1006     psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
    1007     if (!status) {
    1008         psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -limit");
    1009         return false;
    1010     }
    1011 
    1012     bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
    1013     if (!status) {
    1014         psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -faulted");
    1015         return false;
    1016     }
    1017 
    1018     psString query = pxDataGet("regtool_processedexp.sql");
    1019     if (!query) {
    1020         psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
    1021         return false;
    1022     }
    1023 
    1024     if (config->where) {
    1025         psString whereClause = psDBGenerateWhereConditionSQL(config->where, "rawExp");
    1026         psStringAppend(&query, " AND %s", whereClause);
    1027         psFree(whereClause);
    1028     }
    1029 
    1030     if (faulted) {
    1031         // list only faulted rows
    1032         psStringAppend(&query, " %s", "AND rawExp.fault != 0");
    1033     } else {
    1034         // don't list faulted rows
    1035         psStringAppend(&query, " %s", "AND rawExp.fault = 0");
    1036     }
    1037 
    1038     // treat limit == 0 as "no limit"
    1039     if (limit) {
    1040         psString limitString = psDBGenerateLimitSQL(limit);
    1041         psStringAppend(&query, " %s", limitString);
    1042         psFree(limitString);
    1043     }
    1044 
    1045     if (!p_psDBRunQuery(config->dbh, query)) {
    1046         psError(PS_ERR_UNKNOWN, false, "database error");
    1047         return false;
    1048     }
    1049     psFree(query);
    1050 
    1051     psArray *output = p_psDBFetchResult(config->dbh);
    1052     if (!output) {
    1053         psErrorCode err = psErrorCodeLast();
    1054         switch (err) {
    1055             case PS_ERR_DB_CLIENT:
    1056                 psError(PXTOOLS_ERR_SYS, false, "database error");
    1057             case PS_ERR_DB_SERVER:
    1058                 psError(PXTOOLS_ERR_PROG, false, "database error");
    1059             default:
    1060                 psError(PXTOOLS_ERR_PROG, false, "unknown error");
    1061         }
    1062 
    1063         return false;
    1064     }
    1065     if (!psArrayLength(output)) {
    1066         psTrace("regtool", PS_LOG_INFO, "no rows found");
    1067         psFree(output);
    1068         return true;
    1069     }
    1070 
    1071     bool simple = false;
    1072     {
    1073         bool status = false;
    1074         simple = psMetadataLookupBool(&status, config->args, "-simple");
    1075         if (!status) {
    1076             psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
    1077             return false;
    1078         }
    1079     }
    1080 
    1081     if (psArrayLength(output)) {
    1082         // negative simple so the default is true
    1083         if (!ippdbPrintMetadatas(stdout, output, "rawExp", !simple)) {
    1084             psError(PS_ERR_UNKNOWN, false, "failed to print array");
    1085             psFree(output);
    1086             return false;
    1087         }
    1088     }
    1089 
    1090     psFree(output);
    1091 
    1092     return true;
    1093 }
    1094 
    1095 static bool revertprocessedexpMode(pxConfig *config)
    1096 {
    1097     PS_ASSERT_PTR_NON_NULL(config, false);
    1098 
    1099     psString query = pxDataGet("regtool_revertprocessedexp.sql");
    1100     if (!query) {
    1101         psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
    1102         return false;
    1103     }
    1104 
    1105     if (config->where) {
    1106         psString whereClause = psDBGenerateWhereConditionSQL(config->where, "rawExp");
    1107         psStringAppend(&query, " AND %s", whereClause);
    1108         psFree(whereClause);
    1109     }
    1110 
    1111     if (!p_psDBRunQuery(config->dbh, query)) {
    1112         psError(PS_ERR_UNKNOWN, false, "database error");
    1113         psFree(query);
    1114         return false;
    1115     }
    1116     psFree(query);
    1117 
    1118     if (psDBAffectedRows(config->dbh) < 1) {
    1119         psError(PS_ERR_UNKNOWN, false, "should have affected atleast 1 row");
    1120         return false;
    1121     }
    1122 
    1123     return true;
    1124 }
    1125 
    1126 
    1127 static bool updateprocessedexpMode(pxConfig *config)
    1128 {
    1129     bool status = false;
    1130     psS16 code = psMetadataLookupS16(&status, config->args, "-code");
    1131     if (!status) {
    1132         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
    1133         return false;
    1134     }
    1135     if (code == INT16_MAX) {
    1136         psError(PS_ERR_UNKNOWN, true, "-code is required");
    1137         return false;
    1138     }
    1139 
    1140     if (!pxSetFaultCode(config->dbh, "rawExp", config->where, code)) {
    1141         psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
    1142         return false;
    1143     }
    1144 
    1145     return true;
    1146 }
    1147 
    1148 
    1149 # if 0
    1150 static guidePendingExpRow *newToP1PendingExp(newExpRow *newExp)
    1151 {
    1152     return guidePendingExpRowAlloc(
    1153         newExp->exp_id,
    1154         newExp->camera,
    1155         newExp->telescope,
    1156         newExp->exp_type,
    1157         newExp->imfiles,
    1158         "my filter",
    1159         0.1, // airmass
    1160         0.2, // ra
    1161         0.3, // dec
    1162         0.4, // exp time
    1163         0.5, // background
    1164         "my recipe",
    1165         0xff // XXX calc version number
    1166     );
    1167 }
    1168 #endif
    1169 
    1170 
    1171 #if 0
    1172 static chipPendingExpRow *newTochipPendingExp(pxConfig *config, newExpRow *exp)
    1173 {
    1174     PS_ASSERT_PTR_NON_NULL(config, NULL);
    1175     PS_ASSERT_PTR_NON_NULL(exp, NULL);
    1176 
    1177     // optional
    1178     bool status = false;
    1179     psString label = psMetadataLookupStr(&status, config->args, "-label");
    1180     if (!status) {
    1181         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
    1182         return false;
    1183     }
    1184 
    1185     chipPendingExpRow *chipExp = chipPendingExpRowAlloc(
    1186             0,              // chip ID, assigned by db
    1187             exp->exp_id,
    1188             0xdeadbeef,     // guide version
    1189             label,
    1190             "my recipe",    // recipe
    1191             NULL,           // expgroup
    1192             NULL            // dvodb
    1193     );
    1194 
    1195     return chipExp;
    1196 }
    1197 
    1198 
    1199 static chipInputImfileRow *rawImfileTochipInputImfile(pxConfig *config, psS64 chip_id, rawImfileRow *rawImfile)
    1200 {
    1201     return chipInputImfileRowAlloc(
    1202             chip_id,
    1203             rawImfile->class_id,
    1204             rawImfile->uri
    1205     );
    1206 }
    1207 #endif
    1208 
    1209 
    1210 static rawExpRow *newToRawExp(pxConfig *config, newExpRow *exp)
    1211 {
    1212     PS_ASSERT_PTR_NON_NULL(config, NULL);
    1213     PS_ASSERT_PTR_NON_NULL(exp, NULL);
    1214 
    1215     bool status = false;
    1216     // required
    1217     psString exp_name = psMetadataLookupStr(&status, config->args, "-exp_name");
    1218     if (!status) {
    1219         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_name");
    1220         return false;
    1221     }
    1222     if (!exp_name) {
    1223         psError(PS_ERR_UNKNOWN, true, "-exp_name is required");
    1224         return false;
    1225     }
    1226 
    1227     psString camera = psMetadataLookupStr(&status, config->args, "-inst");
    1228     if (!status) {
    1229         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
    1230         return false;
    1231     }
    1232     if (!camera) {
    1233         psError(PS_ERR_UNKNOWN, true, "-inst is required");
    1234         return false;
    1235     }
    1236 
    1237     psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
    1238     if (!status) {
    1239         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
    1240         return false;
    1241     }
    1242     if (!telescope) {
    1243         psError(PS_ERR_UNKNOWN, true, "-telescope is required");
    1244         return false;
    1245     }
    1246 
    1247     psString exp_tag = psMetadataLookupStr(&status, config->args, "-exp_tag");
    1248     if (!status) {
    1249         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_tag");
    1250         return false;
    1251     }
    1252     if (!exp_tag) {
    1253         psError(PS_ERR_UNKNOWN, true, "-exp_tag is required");
    1254         return false;
    1255     }
    1256 
    1257     // optional
    1258     psString exp_type = psMetadataLookupStr(&status, config->args, "-exp_type");
    1259     if (!status) {
    1260         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_type");
    1261         return false;
    1262     }
    1263 
    1264     psString filelevel = psMetadataLookupStr(&status, config->args, "-filelevel");
    1265     if (!status) {
    1266         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filelevel");
    1267         return false;
    1268     }
    1269     if (!filelevel) {
    1270         psError(PS_ERR_UNKNOWN, true, "-filelevel is required");
    1271         return false;
    1272     }
    1273 
    1274     psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
    1275     if (!status) {
    1276         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
    1277         return false;
    1278     }
    1279 
    1280     psString reduction = psMetadataLookupStr(&status, config->args, "-reduction");
    1281     if (!status) {
    1282         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reduction");
    1283         return false;
    1284     }
    1285 
    1286     psString filter = psMetadataLookupStr(&status, config->args, "-filter");
    1287     if (!status) {
    1288         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter");
    1289         return false;
    1290     }
    1291 
    1292     psString comment = psMetadataLookupStr(&status, config->args, "-comment");
    1293     if (!status) {
    1294         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -comment");
    1295         return false;
    1296     }
    1297 
    1298     psF32 airmass = psMetadataLookupF32(&status, config->args, "-airmass");
    1299     if (!status) {
    1300         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass");
    1301         return false;
    1302     }
    1303 
    1304     psF64 ra = psMetadataLookupF64(&status, config->args, "-ra");
    1305     if (!status) {
    1306         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ra");
    1307         return false;
    1308     }
    1309 
    1310     psF64 decl = psMetadataLookupF64(&status, config->args, "-decl");
    1311     if (!status) {
    1312         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -decl");
    1313         return false;
    1314     }
    1315 
    1316     psF32 exp_time = psMetadataLookupF32(&status, config->args, "-exp_time");
    1317     if (!status) {
    1318         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time");
    1319         return false;
    1320     }
    1321 
    1322     psF32 sat_pixel_frac = psMetadataLookupF32(&status, config->args, "-sat_pixel_frac");
    1323     if (!status) {
    1324         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -sat_pixel_frac");
    1325         return false;
    1326     }
    1327 
    1328     psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
    1329     if (!status) {
    1330         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
    1331         return false;
    1332     }
    1333 
    1334     psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
    1335     if (!status) {
    1336         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
    1337         return false;
    1338     }
    1339 
    1340     psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
    1341     if (!status) {
    1342         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
    1343         return false;
    1344     }
    1345 
    1346     psF64 alt = psMetadataLookupF64(&status, config->args, "-alt");
    1347     if (!status) {
    1348         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -alt");
    1349         return false;
    1350     }
    1351 
    1352     psF64 az = psMetadataLookupF64(&status, config->args, "-az");
    1353     if (!status) {
    1354         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -az");
    1355         return false;
    1356     }
    1357 
    1358     psF32 ccd_temp = psMetadataLookupF32(&status, config->args, "-ccd_temp");
    1359     if (!status) {
    1360         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp");
    1361         return false;
    1362     }
    1363 
    1364     psF64 posang = psMetadataLookupF32(&status, config->args, "-posang");
    1365     if (!status) {
    1366         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang");
    1367         return false;
    1368     }
    1369 
    1370     psF32 m1_x = psMetadataLookupF32(&status, config->args, "-m1_x");
    1371     if (!status) {
    1372         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_x");
    1373         return false;
    1374     }
    1375     psF32 m1_y = psMetadataLookupF32(&status, config->args, "-m1_y");
    1376     if (!status) {
    1377         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_y");
    1378         return false;
    1379     }
    1380     psF32 m1_z = psMetadataLookupF32(&status, config->args, "-m1_z");
    1381     if (!status) {
    1382         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_z");
    1383         return false;
    1384     }
    1385     psF32 m1_tip = psMetadataLookupF32(&status, config->args, "-m1_tip");
    1386     if (!status) {
    1387         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_tip");
    1388         return false;
    1389     }
    1390     psF32 m1_tilt = psMetadataLookupF32(&status, config->args, "-m1_tilt");
    1391     if (!status) {
    1392         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_tilt");
    1393         return false;
    1394     }
    1395 
    1396     psF32 m2_x = psMetadataLookupF32(&status, config->args, "-m2_x");
    1397     if (!status) {
    1398         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_x");
    1399         return false;
    1400     }
    1401     psF32 m2_y = psMetadataLookupF32(&status, config->args, "-m2_y");
    1402     if (!status) {
    1403         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_y");
    1404         return false;
    1405     }
    1406     psF32 m2_z = psMetadataLookupF32(&status, config->args, "-m2_z");
    1407     if (!status) {
    1408         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_z");
    1409         return false;
    1410     }
    1411     psF32 m2_tip = psMetadataLookupF32(&status, config->args, "-m2_tip");
    1412     if (!status) {
    1413         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_tip");
    1414         return false;
    1415     }
    1416     psF32 m2_tilt = psMetadataLookupF32(&status, config->args, "-m2_tilt");
    1417     if (!status) {
    1418         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_tilt");
    1419         return false;
    1420     }
    1421 
    1422     psF32 env_temp = psMetadataLookupF32(&status, config->args, "-env_temperature");
    1423     if (!status) {
    1424         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_temperature");
    1425         return false;
    1426     }
    1427     psF32 env_humid = psMetadataLookupF32(&status, config->args, "-env_humidity");
    1428     if (!status) {
    1429         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_humidity");
    1430         return false;
    1431     }
    1432     psF32 env_wind = psMetadataLookupF32(&status, config->args, "-env_wind_speed");
    1433     if (!status) {
    1434         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_wind_speed");
    1435         return false;
    1436     }
    1437     psF32 env_dir = psMetadataLookupF32(&status, config->args, "-env_wind_dir");
    1438     if (!status) {
    1439         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_wind_dir");
    1440         return false;
    1441     }
    1442 
    1443     psF32 teltemp_m1 = psMetadataLookupF32(&status, config->args, "-teltemp_m1");
    1444     if (!status) {
    1445         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_m1");
    1446         return false;
    1447     }
    1448     psF32 teltemp_m1cell = psMetadataLookupF32(&status, config->args, "-teltemp_m1cell");
    1449     if (!status) {
    1450         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_m1cell");
    1451         return false;
    1452     }
    1453     psF32 teltemp_m2 = psMetadataLookupF32(&status, config->args, "-teltemp_m2");
    1454     if (!status) {
    1455         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_m2");
    1456         return false;
    1457     }
    1458     psF32 teltemp_spider = psMetadataLookupF32(&status, config->args, "-teltemp_spider");
    1459     if (!status) {
    1460         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_spider");
    1461         return false;
    1462     }
    1463     psF32 teltemp_truss = psMetadataLookupF32(&status, config->args, "-teltemp_truss");
    1464     if (!status) {
    1465         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_truss");
    1466         return false;
    1467     }
    1468     psF32 teltemp_extra = psMetadataLookupF32(&status, config->args, "-teltemp_extra");
    1469     if (!status) {
    1470         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_extra");
    1471         return false;
    1472     }
    1473 
    1474     psF32 pon_time = psMetadataLookupF32(&status, config->args, "-pon_time");
    1475     if (!status) {
    1476         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -pon_time");
    1477         return false;
    1478     }
    1479 
    1480     psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
    1481     if (!status) {
    1482         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
    1483         return false;
    1484     }
    1485     psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
    1486     if (!status) {
    1487         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
    1488         return false;
    1489     }
    1490     psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
    1491     if (!status) {
    1492         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
    1493         return false;
    1494     }
    1495     psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
    1496     if (!status) {
    1497         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
    1498         return false;
    1499     }
    1500     psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
    1501     if (!status) {
    1502         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
    1503         return false;
    1504     }
    1505 
    1506     psString object = psMetadataLookupStr(&status, config->args, "-object");
    1507     if (!status) {
    1508         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -object");
    1509         return false;
    1510     }
    1511 
    1512     psTime *dateobs = NULL;
    1513     {
    1514         psString dateobsStr = psMetadataLookupStr(&status, config->args, "-dateobs");
    1515         if (!status) {
    1516             psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -dateobs");
    1517             return false;
    1518         }
    1519         // pass through NULL as this is an optional field
    1520         if (dateobsStr) {
    1521             dateobs = psTimeFromISO(dateobsStr, PS_TIME_UTC);
    1522         } else {
    1523             dateobs = NULL;
    1524         }
    1525     }
    1526 
    1527     // default
    1528     psS16 code = psMetadataLookupS16(&status, config->args, "-code");
    1529     if (!status) {
    1530         psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
    1531         return false;
    1532     }
    1533 
    1534     rawExpRow *raw = rawExpRowAlloc(
    1535         exp->exp_id,
     623    // carry through these values
     624    // new CLI options overwrite existing values
     625    workdir   = workdir ? workdir : newExp->workdir;
     626    reduction = reduction ? reduction : newExp->reduction;
     627    dvodb     = dvodb ? dvodb : newExp->dvodb;
     628    tess_id   = tess_id ? tess_id : newExp->tess_id;
     629    end_stage = end_stage ? end_stage : newExp->end_stage;
     630
     631    psFree(newExp);
     632
     633    if (!rawExpInsert(config->dbh,
     634        (psS64)atoll(exp_id),
    1536635        exp_name,
    1537636        camera,
     
    1541640        exp_type,
    1542641        filelevel,
    1543         workdir ? workdir : exp->workdir,
    1544         reduction ? reduction : exp->reduction,
     642        workdir,
     643        reduction,
     644        dvodb,
     645        tess_id,
     646        end_stage,
    1545647        filter,
    1546         comment,
     648        comment,
    1547649        airmass,
    1548650        ra,
     
    1557659        ccd_temp,
    1558660        posang,
    1559         m1_x,
    1560         m1_y,
    1561         m1_z,
    1562         m1_tip,
    1563         m1_tilt,
    1564         m2_x,
    1565         m2_y,
    1566         m2_z,
    1567         m2_tip,
    1568         m2_tilt,
    1569         env_temp,
    1570         env_humid,
    1571         env_wind,
    1572         env_dir,
    1573         teltemp_m1,
    1574         teltemp_m1cell,
    1575         teltemp_m2,
    1576         teltemp_spider,
    1577         teltemp_truss,
    1578         teltemp_extra,
    1579         pon_time,
     661        m1_x,
     662        m1_y,
     663        m1_z,
     664        m1_tip,
     665        m1_tilt,
     666        m2_x,
     667        m2_y,
     668        m2_z,
     669        m2_tip,
     670        m2_tilt,
     671        env_temp,
     672        env_humid,
     673        env_wind,
     674        env_dir,
     675        teltemp_m1,
     676        teltemp_m1cell,
     677        teltemp_m2,
     678        teltemp_spider,
     679        teltemp_truss,
     680        teltemp_extra,
     681        pon_time,
    1580682        user_1,
    1581683        user_2,
     
    1586688        0.0,
    1587689        code
    1588     );
    1589 
    1590     if (dateobs) {
    1591         psFree(dateobs);
    1592     }
    1593 
    1594     return raw;
    1595 }
     690    )) {
     691        // rollback
     692        if (!psDBRollback(config->dbh)) {
     693            psError(PS_ERR_UNKNOWN, false, "database error");
     694        }
     695        psError(PS_ERR_UNKNOWN, false, "database error");
     696        return false;
     697    }
     698
     699    // set the state for the newExp to stop
     700    if (!pxnewExpSetState(config, exp_id, "stop")) {
     701        // rollback
     702        if (!psDBRollback(config->dbh)) {
     703            psError(PS_ERR_UNKNOWN, false, "database error");
     704        }
     705        psError(PS_ERR_UNKNOWN, false, "failed to change newExp.state for exp_id: %s", exp_id);
     706        return false;
     707    }
     708
     709    // should we stop here and proceed on to the chip stage?
     710    if (psStrcasestr(end_stage, "reg")) {
     711        // then we are done here
     712        if (!psDBCommit(config->dbh)) {
     713            psError(PS_ERR_UNKNOWN, false, "database error");
     714            return false;
     715        }
     716
     717        return true;
     718    }
     719    // else continue on...
     720
     721
     722    // insert an entry into the chipPendingExp table
     723    // this can only be run as the newExp's state has been set to stop
     724    if (!pxchipQueueByExpTag(config,
     725                (psS64)atoll(exp_id),
     726                workdir,
     727                NULL, // label
     728                reduction,
     729                NULL, // expgroup
     730                dvodb,
     731                tess_id,
     732                end_stage
     733    )) {
     734        // rollback
     735        if (!psDBRollback(config->dbh)) {
     736            psError(PS_ERR_UNKNOWN, false, "database error");
     737        }
     738        psError(PS_ERR_UNKNOWN, false, "failed to queue chipPendingExp");
     739        return false;
     740    }
     741
     742    if (!psDBCommit(config->dbh)) {
     743        psError(PS_ERR_UNKNOWN, false, "database error");
     744        return false;
     745    }
     746
     747    return true;
     748}
     749
     750
     751static bool processedexpMode(pxConfig *config)
     752{
     753    PS_ASSERT_PTR_NON_NULL(config, false);
     754
     755    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     756    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     757    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
     758
     759    psString query = pxDataGet("regtool_processedexp.sql");
     760    if (!query) {
     761        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
     762        return false;
     763    }
     764
     765    if (config->where) {
     766        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "rawExp");
     767        psStringAppend(&query, " AND %s", whereClause);
     768        psFree(whereClause);
     769    }
     770
     771    if (faulted) {
     772        // list only faulted rows
     773        psStringAppend(&query, " %s", "AND rawExp.fault != 0");
     774    } else {
     775        // don't list faulted rows
     776        psStringAppend(&query, " %s", "AND rawExp.fault = 0");
     777    }
     778
     779    // treat limit == 0 as "no limit"
     780    if (limit) {
     781        psString limitString = psDBGenerateLimitSQL(limit);
     782        psStringAppend(&query, " %s", limitString);
     783        psFree(limitString);
     784    }
     785
     786    if (!p_psDBRunQuery(config->dbh, query)) {
     787        psError(PS_ERR_UNKNOWN, false, "database error");
     788        return false;
     789    }
     790    psFree(query);
     791
     792    psArray *output = p_psDBFetchResult(config->dbh);
     793    if (!output) {
     794        psErrorCode err = psErrorCodeLast();
     795        switch (err) {
     796            case PS_ERR_DB_CLIENT:
     797                psError(PXTOOLS_ERR_SYS, false, "database error");
     798            case PS_ERR_DB_SERVER:
     799                psError(PXTOOLS_ERR_PROG, false, "database error");
     800            default:
     801                psError(PXTOOLS_ERR_PROG, false, "unknown error");
     802        }
     803
     804        return false;
     805    }
     806    if (!psArrayLength(output)) {
     807        psTrace("regtool", PS_LOG_INFO, "no rows found");
     808        psFree(output);
     809        return true;
     810    }
     811
     812    if (psArrayLength(output)) {
     813        // negative simple so the default is true
     814        if (!ippdbPrintMetadatas(stdout, output, "rawExp", !simple)) {
     815            psError(PS_ERR_UNKNOWN, false, "failed to print array");
     816            psFree(output);
     817            return false;
     818        }
     819    }
     820
     821    psFree(output);
     822
     823    return true;
     824}
     825
     826static bool revertprocessedexpMode(pxConfig *config)
     827{
     828    PS_ASSERT_PTR_NON_NULL(config, false);
     829
     830    psString query = pxDataGet("regtool_revertprocessedexp.sql");
     831    if (!query) {
     832        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
     833        return false;
     834    }
     835
     836    if (config->where) {
     837        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "rawExp");
     838        psStringAppend(&query, " AND %s", whereClause);
     839        psFree(whereClause);
     840    }
     841
     842    if (!p_psDBRunQuery(config->dbh, query)) {
     843        psError(PS_ERR_UNKNOWN, false, "database error");
     844        psFree(query);
     845        return false;
     846    }
     847    psFree(query);
     848
     849    if (psDBAffectedRows(config->dbh) < 1) {
     850        psError(PS_ERR_UNKNOWN, false, "should have affected atleast 1 row");
     851        return false;
     852    }
     853
     854    return true;
     855}
     856
     857
     858static bool updateprocessedexpMode(pxConfig *config)
     859{
     860    PS_ASSERT_PTR_NON_NULL(config, false);
     861
     862    PXOPT_LOOKUP_S16(code, config->args, "-code", true, false);
     863
     864    if (!pxSetFaultCode(config->dbh, "rawExp", config->where, code)) {
     865        psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
     866        return false;
     867    }
     868
     869    return true;
     870}
Note: See TracChangeset for help on using the changeset viewer.