IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jul 6, 2007, 4:55:04 PM (19 years ago)
Author:
jhoblitt
Message:

ippdb 1.2.24

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ippdb/src/ippdb.c

    r13937 r14061  
    3131#include "ippdb.h"
    3232
    33 #define EXPTAGCOUNTER_TABLE_NAME "expTagCounter"
    3433#define SUMMITEXP_TABLE_NAME "summitExp"
    3534#define SUMMITIMFILE_TABLE_NAME "summitImfile"
     
    4342#define RAWIMFILE_TABLE_NAME "rawImfile"
    4443#define GUIDEPENDINGEXP_TABLE_NAME "guidePendingExp"
    45 #define CHIPPENDINGEXP_TABLE_NAME "chipPendingExp"
    46 #define CHIPPENDINGIMFILE_TABLE_NAME "chipPendingImfile"
    47 #define CHIPPROCESSEDEXP_TABLE_NAME "chipProcessedExp"
     44#define CHIPRUN_TABLE_NAME "chipRun"
     45#define CHIPINPUTIMFILE_TABLE_NAME "chipInputImfile"
     46#define CHIPPROCESSEDIMFILE_TABLE_NAME "chipProcessedImfile"
    4847#define CHIPMASK_TABLE_NAME "chipMask"
    49 #define CHIPPROCESSEDIMFILE_TABLE_NAME "chipProcessedImfile"
    50 #define CAMPENDINGEXP_TABLE_NAME "camPendingExp"
     48#define CAMRUN_TABLE_NAME "camRun"
    5149#define CAMPROCESSEDEXP_TABLE_NAME "camProcessedExp"
    5250#define CAMMASK_TABLE_NAME "camMask"
     
    248246}
    249247
    250 static void expTagCounterRowFree(expTagCounterRow *object);
    251 
    252 expTagCounterRow *expTagCounterRowAlloc(psU64 counter)
    253 {
    254     expTagCounterRow *_object;
    255 
    256     _object = psAlloc(sizeof(expTagCounterRow));
    257     psMemSetDeallocator(_object, (psFreeFunc)expTagCounterRowFree);
    258 
    259     _object->counter = counter;
    260 
    261     return _object;
    262 }
    263 
    264 static void expTagCounterRowFree(expTagCounterRow *object)
    265 {
    266 }
    267 
    268 bool expTagCounterCreateTable(psDB *dbh)
    269 {
    270     psMetadata *md = psMetadataAlloc();
    271     if (!psMetadataAdd(md, PS_LIST_TAIL, "counter", PS_DATA_U64, NULL, 0)) {
    272         psError(PS_ERR_UNKNOWN, false, "failed to add item counter");
    273         psFree(md);
    274         return false;
    275     }
    276 
    277     bool status = psDBCreateTable(dbh, EXPTAGCOUNTER_TABLE_NAME, md);
    278 
    279     psFree(md);
    280 
    281     return status;
    282 }
    283 
    284 bool expTagCounterDropTable(psDB *dbh)
    285 {
    286     return psDBDropTable(dbh, EXPTAGCOUNTER_TABLE_NAME);
    287 }
    288 
    289 bool expTagCounterInsert(psDB * dbh, psU64 counter)
    290 {
    291     psMetadata *md = psMetadataAlloc();
    292     if (!psMetadataAdd(md, PS_LIST_TAIL, "counter", PS_DATA_U64, NULL, counter)) {
    293         psError(PS_ERR_UNKNOWN, false, "failed to add item counter");
    294         psFree(md);
    295         return false;
    296     }
    297 
    298     bool status = psDBInsertOneRow(dbh, EXPTAGCOUNTER_TABLE_NAME, md);
    299     psFree(md);
    300 
    301     return status;
    302 }
    303 
    304 long long expTagCounterDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    305 {
    306     long long       deleted = 0;
    307 
    308     long long count = psDBDeleteRows(dbh, EXPTAGCOUNTER_TABLE_NAME, where, limit);
    309     if (count < 0) {
    310         psError(PS_ERR_UNKNOWN, true, "failed to delete row from expTagCounter");
    311         return count;
    312 
    313         deleted += count;
    314     }
    315 
    316     return deleted;
    317 }
    318 bool expTagCounterInsertObject(psDB *dbh, expTagCounterRow *object)
    319 {
    320     return expTagCounterInsert(dbh, object->counter);
    321 }
    322 
    323 bool expTagCounterInsertObjects(psDB *dbh, psArray *objects)
    324 {
    325     for (long i = 0; i < psArrayLength(objects); i++) {
    326         if (!expTagCounterInsertObject(dbh, objects->data[i])) {
    327             return false;
    328         }
    329     }
    330 
    331     return true;
    332 }
    333 
    334 bool expTagCounterInsertFits(psDB *dbh, const psFits *fits)
    335 {
    336     psArray         *rowSet;
    337 
    338     // move to (the first?) extension named  EXPTAGCOUNTER_TABLE_NAME
    339     if (!psFitsMoveExtName(fits, EXPTAGCOUNTER_TABLE_NAME)) {
    340         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", EXPTAGCOUNTER_TABLE_NAME);
    341         return false;
    342     }
    343 
    344     // check HDU type
    345     if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
    346         psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
    347         return false;
    348     }
    349 
    350     // read fits table
    351     rowSet = psFitsReadTable(fits);
    352     if (!rowSet) {
    353         psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
    354         psFree(rowSet);
    355         return false;
    356     }
    357 
    358     if (!psDBInsertRows(dbh, EXPTAGCOUNTER_TABLE_NAME, rowSet)) {
    359         psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    360         psFree(rowSet);
    361         return false;
    362     }
    363 
    364     psFree(rowSet);
    365 
    366     return true;
    367 }
    368 
    369 bool expTagCounterSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    370 {
    371     psArray         *rowSet;
    372 
    373     rowSet = psDBSelectRows(dbh, EXPTAGCOUNTER_TABLE_NAME, where, limit);
    374     if (!rowSet) {
    375         return false;
    376     }
    377 
    378     // output to fits
    379     if (!psFitsWriteTable(fits, NULL, rowSet, EXPTAGCOUNTER_TABLE_NAME)) {
    380         psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    381         psFree(rowSet);
    382         return false;
    383     }
    384 
    385     psFree(rowSet);
    386 
    387     return true;
    388 }
    389 
    390 psMetadata *expTagCounterMetadataFromObject(const expTagCounterRow *object)
    391 {
    392     psMetadata *md = psMetadataAlloc();
    393     if (!psMetadataAdd(md, PS_LIST_TAIL, "counter", PS_DATA_U64, NULL, object->counter)) {
    394         psError(PS_ERR_UNKNOWN, false, "failed to add item counter");
    395         psFree(md);
    396         return false;
    397     }
    398 
    399 
    400     return md;
    401 }
    402 
    403 expTagCounterRow *expTagCounterObjectFromMetadata(psMetadata *md)
    404 {
    405 
    406 bool status = false;
    407     psU64 counter = psMetadataLookupU64(&status, md, "counter");
    408     if (!status) {
    409         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item counter");
    410         return false;
    411     }
    412 
    413     return expTagCounterRowAlloc(counter);
    414 }
    415 psArray *expTagCounterSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    416 {
    417     psArray         *rowSet;
    418     psArray         *returnSet;
    419     psU64           i;
    420 
    421     rowSet = psDBSelectRows(dbh, EXPTAGCOUNTER_TABLE_NAME, where, limit);
    422     if (!rowSet) {
    423         return NULL;
    424     }
    425 
    426     // convert psMetadata rows to row objects
    427 
    428     returnSet = psArrayAllocEmpty(rowSet->n);
    429 
    430     for (i = 0; i < rowSet->n; i++) {
    431         expTagCounterRow *object = expTagCounterObjectFromMetadata(rowSet->data[i]);
    432         psArrayAdd(returnSet, 0, object);
    433         psFree(object);
    434     }
    435 
    436     psFree(rowSet);
    437 
    438     return returnSet;
    439 }
    440 bool expTagCounterDeleteObject(psDB *dbh, const expTagCounterRow *object)
    441 {
    442     psMetadata *where = expTagCounterMetadataFromObject(object);
    443     long long count = psDBDeleteRows(dbh, EXPTAGCOUNTER_TABLE_NAME, where, 0);
    444     psFree(where);
    445     if (count < 0) {
    446         psError(PS_ERR_UNKNOWN, true, "failed to delete row from expTagCounter");
    447         return false;
    448     }
    449     if (count > 1) {
    450         // XXX should this be a psAbort() instead?  It is possible that
    451         // having an object match multiple rows was by design.
    452         psError(PS_ERR_UNKNOWN, true, "expTagCounterRow object matched more then one row.  Check your database schema");
    453         return false;
    454     }
    455 
    456     return true;
    457 }
    458 long long expTagCounterDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    459 {
    460     long long       deleted = 0;
    461 
    462     for (long long i = 0; i < objects->n; i++) {
    463         expTagCounterRow *object = objects->data[i];
    464         psMetadata *where = expTagCounterMetadataFromObject(object);
    465         long long count = psDBDeleteRows(dbh, EXPTAGCOUNTER_TABLE_NAME, where, limit);
    466         psFree(where);
    467         if (count < 0) {
    468             psError(PS_ERR_UNKNOWN, true, "failed to delete row from expTagCounter");
    469             return count;
    470         }
    471 
    472         deleted += count;
    473     }
    474 
    475     return deleted;
    476 }
    477 bool expTagCounterPrintObjects(FILE *stream, psArray *objects, bool mdcf)
    478 {
    479     PS_ASSERT_PTR_NON_NULL(objects, false);
    480 
    481     psMetadata *output = psMetadataAlloc();
    482     for (long i = 0; i < psArrayLength(objects); i++) {
    483         psMetadata *md = expTagCounterMetadataFromObject(objects->data[i]);
    484         if (!psMetadataAddMetadata(
    485             output,
    486             PS_LIST_TAIL,
    487             EXPTAGCOUNTER_TABLE_NAME,
    488             PS_META_DUPLICATE_OK,
    489             NULL,
    490             md
    491         )) {
    492             psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
    493             psFree(md);
    494             psFree(output);
    495             return false;
    496         }
    497         psFree(md);
    498     }
    499 
    500     if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
    501         psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
    502         psFree(output);
    503     }
    504     psFree(output);
    505 
    506     return true;
    507 }
    508 bool expTagCounterPrintObject(FILE *stream, expTagCounterRow *object, bool mdcf)
    509 {
    510     PS_ASSERT_PTR_NON_NULL(object, false);
    511 
    512     psMetadata *md = expTagCounterMetadataFromObject(object);
    513 
    514     if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
    515         psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
    516         psFree(md);
    517     }
    518 
    519     psFree(md);
    520 
    521     return true;
    522 }
    523248static void summitExpRowFree(summitExpRow *object);
    524249
    525 summitExpRow *summitExpRowAlloc(const char *exp_id, const char *camera, const char *telescope, psTime* dateobs, const char *exp_type, const char *uri, psS32 imfiles)
     250summitExpRow *summitExpRowAlloc(const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *exp_type, const char *uri, psS32 imfiles)
    526251{
    527252    summitExpRow    *_object;
     
    530255    psMemSetDeallocator(_object, (psFreeFunc)summitExpRowFree);
    531256
    532     _object->exp_id = psStringCopy(exp_id);
     257    _object->exp_name = psStringCopy(exp_name);
    533258    _object->camera = psStringCopy(camera);
    534259    _object->telescope = psStringCopy(telescope);
     
    543268static void summitExpRowFree(summitExpRow *object)
    544269{
    545     psFree(object->exp_id);
     270    psFree(object->exp_name);
    546271    psFree(object->camera);
    547272    psFree(object->telescope);
     
    554279{
    555280    psMetadata *md = psMetadataAlloc();
    556     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, "Primary Key", "64")) {
    557         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     281    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, "Primary Key", "64")) {
     282        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    558283        psFree(md);
    559284        return false;
     
    602327}
    603328
    604 bool summitExpInsert(psDB * dbh, const char *exp_id, const char *camera, const char *telescope, psTime* dateobs, const char *exp_type, const char *uri, psS32 imfiles)
     329bool summitExpInsert(psDB * dbh, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *exp_type, const char *uri, psS32 imfiles)
    605330{
    606331    psMetadata *md = psMetadataAlloc();
    607     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, exp_id)) {
    608         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     332    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, exp_name)) {
     333        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    609334        psFree(md);
    610335        return false;
     
    663388bool summitExpInsertObject(psDB *dbh, summitExpRow *object)
    664389{
    665     return summitExpInsert(dbh, object->exp_id, object->camera, object->telescope, object->dateobs, object->exp_type, object->uri, object->imfiles);
     390    return summitExpInsert(dbh, object->exp_name, object->camera, object->telescope, object->dateobs, object->exp_type, object->uri, object->imfiles);
    666391}
    667392
     
    736461{
    737462    psMetadata *md = psMetadataAlloc();
    738     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, object->exp_id)) {
    739         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     463    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, object->exp_name)) {
     464        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    740465        psFree(md);
    741466        return false;
     
    780505
    781506bool status = false;
    782     char* exp_id = psMetadataLookupPtr(&status, md, "exp_id");
    783     if (!status) {
    784         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
     507    char* exp_name = psMetadataLookupPtr(&status, md, "exp_name");
     508    if (!status) {
     509        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_name");
    785510        return false;
    786511    }
     
    816541    }
    817542
    818     return summitExpRowAlloc(exp_id, camera, telescope, dateobs, exp_type, uri, imfiles);
     543    return summitExpRowAlloc(exp_name, camera, telescope, dateobs, exp_type, uri, imfiles);
    819544}
    820545psArray *summitExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    928653static void summitImfileRowFree(summitImfileRow *object);
    929654
    930 summitImfileRow *summitImfileRowAlloc(const char *exp_id, const char *camera, const char *telescope, const char *file_id, psS32 bytes, const char *md5sum, const char *class, const char *class_id, const char *uri)
     655summitImfileRow *summitImfileRowAlloc(const char *exp_name, const char *camera, const char *telescope, const char *file_id, psS32 bytes, const char *md5sum, const char *class, const char *class_id, const char *uri)
    931656{
    932657    summitImfileRow *_object;
     
    935660    psMemSetDeallocator(_object, (psFreeFunc)summitImfileRowFree);
    936661
    937     _object->exp_id = psStringCopy(exp_id);
     662    _object->exp_name = psStringCopy(exp_name);
    938663    _object->camera = psStringCopy(camera);
    939664    _object->telescope = psStringCopy(telescope);
     
    950675static void summitImfileRowFree(summitImfileRow *object)
    951676{
    952     psFree(object->exp_id);
     677    psFree(object->exp_name);
    953678    psFree(object->camera);
    954679    psFree(object->telescope);
     
    963688{
    964689    psMetadata *md = psMetadataAlloc();
    965     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, "Primary Key", "64")) {
    966         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     690    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, "Primary Key", "64")) {
     691        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    967692        psFree(md);
    968693        return false;
     
    1021746}
    1022747
    1023 bool summitImfileInsert(psDB * dbh, const char *exp_id, const char *camera, const char *telescope, const char *file_id, psS32 bytes, const char *md5sum, const char *class, const char *class_id, const char *uri)
     748bool summitImfileInsert(psDB * dbh, const char *exp_name, const char *camera, const char *telescope, const char *file_id, psS32 bytes, const char *md5sum, const char *class, const char *class_id, const char *uri)
    1024749{
    1025750    psMetadata *md = psMetadataAlloc();
    1026     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, exp_id)) {
    1027         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     751    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, exp_name)) {
     752        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    1028753        psFree(md);
    1029754        return false;
     
    1092817bool summitImfileInsertObject(psDB *dbh, summitImfileRow *object)
    1093818{
    1094     return summitImfileInsert(dbh, object->exp_id, object->camera, object->telescope, object->file_id, object->bytes, object->md5sum, object->class, object->class_id, object->uri);
     819    return summitImfileInsert(dbh, object->exp_name, object->camera, object->telescope, object->file_id, object->bytes, object->md5sum, object->class, object->class_id, object->uri);
    1095820}
    1096821
     
    1165890{
    1166891    psMetadata *md = psMetadataAlloc();
    1167     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, object->exp_id)) {
    1168         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     892    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, object->exp_name)) {
     893        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    1169894        psFree(md);
    1170895        return false;
     
    1219944
    1220945bool status = false;
    1221     char* exp_id = psMetadataLookupPtr(&status, md, "exp_id");
    1222     if (!status) {
    1223         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
     946    char* exp_name = psMetadataLookupPtr(&status, md, "exp_name");
     947    if (!status) {
     948        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_name");
    1224949        return false;
    1225950    }
     
    1265990    }
    1266991
    1267     return summitImfileRowAlloc(exp_id, camera, telescope, file_id, bytes, md5sum, class, class_id, uri);
     992    return summitImfileRowAlloc(exp_name, camera, telescope, file_id, bytes, md5sum, class, class_id, uri);
    1268993}
    1269994psArray *summitImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    13771102static void pzPendingExpRowFree(pzPendingExpRow *object);
    13781103
    1379 pzPendingExpRow *pzPendingExpRowAlloc(const char *exp_id, const char *camera, const char *telescope)
     1104pzPendingExpRow *pzPendingExpRowAlloc(const char *exp_name, const char *camera, const char *telescope)
    13801105{
    13811106    pzPendingExpRow *_object;
     
    13841109    psMemSetDeallocator(_object, (psFreeFunc)pzPendingExpRowFree);
    13851110
    1386     _object->exp_id = psStringCopy(exp_id);
     1111    _object->exp_name = psStringCopy(exp_name);
    13871112    _object->camera = psStringCopy(camera);
    13881113    _object->telescope = psStringCopy(telescope);
     
    13931118static void pzPendingExpRowFree(pzPendingExpRow *object)
    13941119{
    1395     psFree(object->exp_id);
     1120    psFree(object->exp_name);
    13961121    psFree(object->camera);
    13971122    psFree(object->telescope);
     
    14011126{
    14021127    psMetadata *md = psMetadataAlloc();
    1403     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, "Primary Key", "64")) {
    1404         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     1128    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, "Primary Key", "64")) {
     1129        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    14051130        psFree(md);
    14061131        return false;
     
    14291154}
    14301155
    1431 bool pzPendingExpInsert(psDB * dbh, const char *exp_id, const char *camera, const char *telescope)
     1156bool pzPendingExpInsert(psDB * dbh, const char *exp_name, const char *camera, const char *telescope)
    14321157{
    14331158    psMetadata *md = psMetadataAlloc();
    1434     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, exp_id)) {
    1435         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     1159    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, exp_name)) {
     1160        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    14361161        psFree(md);
    14371162        return false;
     
    14701195bool pzPendingExpInsertObject(psDB *dbh, pzPendingExpRow *object)
    14711196{
    1472     return pzPendingExpInsert(dbh, object->exp_id, object->camera, object->telescope);
     1197    return pzPendingExpInsert(dbh, object->exp_name, object->camera, object->telescope);
    14731198}
    14741199
     
    15431268{
    15441269    psMetadata *md = psMetadataAlloc();
    1545     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, object->exp_id)) {
    1546         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     1270    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, object->exp_name)) {
     1271        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    15471272        psFree(md);
    15481273        return false;
     
    15671292
    15681293bool status = false;
    1569     char* exp_id = psMetadataLookupPtr(&status, md, "exp_id");
    1570     if (!status) {
    1571         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
     1294    char* exp_name = psMetadataLookupPtr(&status, md, "exp_name");
     1295    if (!status) {
     1296        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_name");
    15721297        return false;
    15731298    }
     
    15831308    }
    15841309
    1585     return pzPendingExpRowAlloc(exp_id, camera, telescope);
     1310    return pzPendingExpRowAlloc(exp_name, camera, telescope);
    15861311}
    15871312psArray *pzPendingExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    16951420static void pzPendingImfileRowFree(pzPendingImfileRow *object);
    16961421
    1697 pzPendingImfileRow *pzPendingImfileRowAlloc(const char *exp_id, const char *camera, const char *telescope, const char *class, const char *class_id, const char *exp_tag)
     1422pzPendingImfileRow *pzPendingImfileRowAlloc(const char *exp_name, const char *camera, const char *telescope, const char *class, const char *class_id, psS64 exp_id)
    16981423{
    16991424    pzPendingImfileRow *_object;
     
    17021427    psMemSetDeallocator(_object, (psFreeFunc)pzPendingImfileRowFree);
    17031428
    1704     _object->exp_id = psStringCopy(exp_id);
     1429    _object->exp_name = psStringCopy(exp_name);
    17051430    _object->camera = psStringCopy(camera);
    17061431    _object->telescope = psStringCopy(telescope);
    17071432    _object->class = psStringCopy(class);
    17081433    _object->class_id = psStringCopy(class_id);
    1709     _object->exp_tag = psStringCopy(exp_tag);
     1434    _object->exp_id = exp_id;
    17101435
    17111436    return _object;
     
    17141439static void pzPendingImfileRowFree(pzPendingImfileRow *object)
    17151440{
    1716     psFree(object->exp_id);
     1441    psFree(object->exp_name);
    17171442    psFree(object->camera);
    17181443    psFree(object->telescope);
    17191444    psFree(object->class);
    17201445    psFree(object->class_id);
    1721     psFree(object->exp_tag);
    17221446}
    17231447
     
    17251449{
    17261450    psMetadata *md = psMetadataAlloc();
    1727     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, "Primary Key", "64")) {
    1728         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     1451    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, "Primary Key", "64")) {
     1452        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    17291453        psFree(md);
    17301454        return false;
     
    17501474        return false;
    17511475    }
    1752     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Unique Key", "64")) {
    1753         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     1476    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Unique Key", 64)) {
     1477        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    17541478        psFree(md);
    17551479        return false;
     
    17681492}
    17691493
    1770 bool pzPendingImfileInsert(psDB * dbh, const char *exp_id, const char *camera, const char *telescope, const char *class, const char *class_id, const char *exp_tag)
     1494bool pzPendingImfileInsert(psDB * dbh, const char *exp_name, const char *camera, const char *telescope, const char *class, const char *class_id, psS64 exp_id)
    17711495{
    17721496    psMetadata *md = psMetadataAlloc();
    1773     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, exp_id)) {
    1774         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     1497    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, exp_name)) {
     1498        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    17751499        psFree(md);
    17761500        return false;
     
    17961520        return false;
    17971521    }
    1798     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    1799         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     1522    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     1523        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    18001524        psFree(md);
    18011525        return false;
     
    18241548bool pzPendingImfileInsertObject(psDB *dbh, pzPendingImfileRow *object)
    18251549{
    1826     return pzPendingImfileInsert(dbh, object->exp_id, object->camera, object->telescope, object->class, object->class_id, object->exp_tag);
     1550    return pzPendingImfileInsert(dbh, object->exp_name, object->camera, object->telescope, object->class, object->class_id, object->exp_id);
    18271551}
    18281552
     
    18971621{
    18981622    psMetadata *md = psMetadataAlloc();
    1899     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, object->exp_id)) {
    1900         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     1623    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, object->exp_name)) {
     1624        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    19011625        psFree(md);
    19021626        return false;
     
    19221646        return false;
    19231647    }
    1924     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    1925         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     1648    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     1649        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    19261650        psFree(md);
    19271651        return false;
     
    19361660
    19371661bool status = false;
    1938     char* exp_id = psMetadataLookupPtr(&status, md, "exp_id");
     1662    char* exp_name = psMetadataLookupPtr(&status, md, "exp_name");
     1663    if (!status) {
     1664        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_name");
     1665        return false;
     1666    }
     1667    char* camera = psMetadataLookupPtr(&status, md, "camera");
     1668    if (!status) {
     1669        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item camera");
     1670        return false;
     1671    }
     1672    char* telescope = psMetadataLookupPtr(&status, md, "telescope");
     1673    if (!status) {
     1674        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item telescope");
     1675        return false;
     1676    }
     1677    char* class = psMetadataLookupPtr(&status, md, "class");
     1678    if (!status) {
     1679        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class");
     1680        return false;
     1681    }
     1682    char* class_id = psMetadataLookupPtr(&status, md, "class_id");
     1683    if (!status) {
     1684        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class_id");
     1685        return false;
     1686    }
     1687    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
    19391688    if (!status) {
    19401689        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
    19411690        return false;
    19421691    }
    1943     char* camera = psMetadataLookupPtr(&status, md, "camera");
    1944     if (!status) {
    1945         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item camera");
    1946         return false;
    1947     }
    1948     char* telescope = psMetadataLookupPtr(&status, md, "telescope");
    1949     if (!status) {
    1950         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item telescope");
    1951         return false;
    1952     }
    1953     char* class = psMetadataLookupPtr(&status, md, "class");
    1954     if (!status) {
    1955         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class");
    1956         return false;
    1957     }
    1958     char* class_id = psMetadataLookupPtr(&status, md, "class_id");
    1959     if (!status) {
    1960         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class_id");
    1961         return false;
    1962     }
    1963     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    1964     if (!status) {
    1965         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
    1966         return false;
    1967     }
    1968 
    1969     return pzPendingImfileRowAlloc(exp_id, camera, telescope, class, class_id, exp_tag);
     1692
     1693    return pzPendingImfileRowAlloc(exp_name, camera, telescope, class, class_id, exp_id);
    19701694}
    19711695psArray *pzPendingImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    20791803static void pzDoneExpRowFree(pzDoneExpRow *object);
    20801804
    2081 pzDoneExpRow *pzDoneExpRowAlloc(const char *exp_id, const char *camera, const char *telescope)
     1805pzDoneExpRow *pzDoneExpRowAlloc(const char *exp_name, const char *camera, const char *telescope)
    20821806{
    20831807    pzDoneExpRow    *_object;
     
    20861810    psMemSetDeallocator(_object, (psFreeFunc)pzDoneExpRowFree);
    20871811
    2088     _object->exp_id = psStringCopy(exp_id);
     1812    _object->exp_name = psStringCopy(exp_name);
    20891813    _object->camera = psStringCopy(camera);
    20901814    _object->telescope = psStringCopy(telescope);
     
    20951819static void pzDoneExpRowFree(pzDoneExpRow *object)
    20961820{
    2097     psFree(object->exp_id);
     1821    psFree(object->exp_name);
    20981822    psFree(object->camera);
    20991823    psFree(object->telescope);
     
    21031827{
    21041828    psMetadata *md = psMetadataAlloc();
    2105     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, "Primary Key", "64")) {
    2106         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     1829    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, "Primary Key", "64")) {
     1830        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    21071831        psFree(md);
    21081832        return false;
     
    21311855}
    21321856
    2133 bool pzDoneExpInsert(psDB * dbh, const char *exp_id, const char *camera, const char *telescope)
     1857bool pzDoneExpInsert(psDB * dbh, const char *exp_name, const char *camera, const char *telescope)
    21341858{
    21351859    psMetadata *md = psMetadataAlloc();
    2136     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, exp_id)) {
    2137         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     1860    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, exp_name)) {
     1861        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    21381862        psFree(md);
    21391863        return false;
     
    21721896bool pzDoneExpInsertObject(psDB *dbh, pzDoneExpRow *object)
    21731897{
    2174     return pzDoneExpInsert(dbh, object->exp_id, object->camera, object->telescope);
     1898    return pzDoneExpInsert(dbh, object->exp_name, object->camera, object->telescope);
    21751899}
    21761900
     
    22451969{
    22461970    psMetadata *md = psMetadataAlloc();
    2247     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, object->exp_id)) {
    2248         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     1971    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, object->exp_name)) {
     1972        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    22491973        psFree(md);
    22501974        return false;
     
    22691993
    22701994bool status = false;
    2271     char* exp_id = psMetadataLookupPtr(&status, md, "exp_id");
    2272     if (!status) {
    2273         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
     1995    char* exp_name = psMetadataLookupPtr(&status, md, "exp_name");
     1996    if (!status) {
     1997        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_name");
    22741998        return false;
    22751999    }
     
    22852009    }
    22862010
    2287     return pzDoneExpRowAlloc(exp_id, camera, telescope);
     2011    return pzDoneExpRowAlloc(exp_name, camera, telescope);
    22882012}
    22892013psArray *pzDoneExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    23972121static void pzDoneImfileRowFree(pzDoneImfileRow *object);
    23982122
    2399 pzDoneImfileRow *pzDoneImfileRowAlloc(const char *exp_id, const char *camera, const char *telescope, const char *class, const char *class_id, const char *exp_tag, const char *uri)
     2123pzDoneImfileRow *pzDoneImfileRowAlloc(const char *exp_name, const char *camera, const char *telescope, const char *class, const char *class_id, psS64 exp_id, const char *uri)
    24002124{
    24012125    pzDoneImfileRow *_object;
     
    24042128    psMemSetDeallocator(_object, (psFreeFunc)pzDoneImfileRowFree);
    24052129
    2406     _object->exp_id = psStringCopy(exp_id);
     2130    _object->exp_name = psStringCopy(exp_name);
    24072131    _object->camera = psStringCopy(camera);
    24082132    _object->telescope = psStringCopy(telescope);
    24092133    _object->class = psStringCopy(class);
    24102134    _object->class_id = psStringCopy(class_id);
    2411     _object->exp_tag = psStringCopy(exp_tag);
     2135    _object->exp_id = exp_id;
    24122136    _object->uri = psStringCopy(uri);
    24132137
     
    24172141static void pzDoneImfileRowFree(pzDoneImfileRow *object)
    24182142{
    2419     psFree(object->exp_id);
     2143    psFree(object->exp_name);
    24202144    psFree(object->camera);
    24212145    psFree(object->telescope);
    24222146    psFree(object->class);
    24232147    psFree(object->class_id);
    2424     psFree(object->exp_tag);
    24252148    psFree(object->uri);
    24262149}
     
    24292152{
    24302153    psMetadata *md = psMetadataAlloc();
    2431     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, "Primary Key", "64")) {
    2432         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     2154    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, "Primary Key", "64")) {
     2155        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    24332156        psFree(md);
    24342157        return false;
     
    24542177        return false;
    24552178    }
    2456     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Unique Key", "64")) {
    2457         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     2179    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Unique Key", 64)) {
     2180        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    24582181        psFree(md);
    24592182        return false;
     
    24772200}
    24782201
    2479 bool pzDoneImfileInsert(psDB * dbh, const char *exp_id, const char *camera, const char *telescope, const char *class, const char *class_id, const char *exp_tag, const char *uri)
     2202bool pzDoneImfileInsert(psDB * dbh, const char *exp_name, const char *camera, const char *telescope, const char *class, const char *class_id, psS64 exp_id, const char *uri)
    24802203{
    24812204    psMetadata *md = psMetadataAlloc();
    2482     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, exp_id)) {
    2483         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     2205    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, exp_name)) {
     2206        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    24842207        psFree(md);
    24852208        return false;
     
    25052228        return false;
    25062229    }
    2507     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    2508         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     2230    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     2231        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    25092232        psFree(md);
    25102233        return false;
     
    25382261bool pzDoneImfileInsertObject(psDB *dbh, pzDoneImfileRow *object)
    25392262{
    2540     return pzDoneImfileInsert(dbh, object->exp_id, object->camera, object->telescope, object->class, object->class_id, object->exp_tag, object->uri);
     2263    return pzDoneImfileInsert(dbh, object->exp_name, object->camera, object->telescope, object->class, object->class_id, object->exp_id, object->uri);
    25412264}
    25422265
     
    26112334{
    26122335    psMetadata *md = psMetadataAlloc();
    2613     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, object->exp_id)) {
    2614         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     2336    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, object->exp_name)) {
     2337        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    26152338        psFree(md);
    26162339        return false;
     
    26362359        return false;
    26372360    }
    2638     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    2639         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     2361    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     2362        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    26402363        psFree(md);
    26412364        return false;
     
    26552378
    26562379bool status = false;
    2657     char* exp_id = psMetadataLookupPtr(&status, md, "exp_id");
     2380    char* exp_name = psMetadataLookupPtr(&status, md, "exp_name");
     2381    if (!status) {
     2382        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_name");
     2383        return false;
     2384    }
     2385    char* camera = psMetadataLookupPtr(&status, md, "camera");
     2386    if (!status) {
     2387        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item camera");
     2388        return false;
     2389    }
     2390    char* telescope = psMetadataLookupPtr(&status, md, "telescope");
     2391    if (!status) {
     2392        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item telescope");
     2393        return false;
     2394    }
     2395    char* class = psMetadataLookupPtr(&status, md, "class");
     2396    if (!status) {
     2397        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class");
     2398        return false;
     2399    }
     2400    char* class_id = psMetadataLookupPtr(&status, md, "class_id");
     2401    if (!status) {
     2402        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class_id");
     2403        return false;
     2404    }
     2405    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
    26582406    if (!status) {
    26592407        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
    26602408        return false;
    26612409    }
    2662     char* camera = psMetadataLookupPtr(&status, md, "camera");
    2663     if (!status) {
    2664         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item camera");
    2665         return false;
    2666     }
    2667     char* telescope = psMetadataLookupPtr(&status, md, "telescope");
    2668     if (!status) {
    2669         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item telescope");
    2670         return false;
    2671     }
    2672     char* class = psMetadataLookupPtr(&status, md, "class");
    2673     if (!status) {
    2674         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class");
    2675         return false;
    2676     }
    2677     char* class_id = psMetadataLookupPtr(&status, md, "class_id");
    2678     if (!status) {
    2679         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class_id");
    2680         return false;
    2681     }
    2682     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    2683     if (!status) {
    2684         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
    2685         return false;
    2686     }
    26872410    char* uri = psMetadataLookupPtr(&status, md, "uri");
    26882411    if (!status) {
     
    26912414    }
    26922415
    2693     return pzDoneImfileRowAlloc(exp_id, camera, telescope, class, class_id, exp_tag, uri);
     2416    return pzDoneImfileRowAlloc(exp_name, camera, telescope, class, class_id, exp_id, uri);
    26942417}
    26952418psArray *pzDoneImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    28032526static void newExpRowFree(newExpRow *object);
    28042527
    2805 newExpRow *newExpRowAlloc(const char *exp_tag, const char *exp_id, const char *camera, const char *telescope, psS32 imfiles, const char *workdir)
     2528newExpRow *newExpRowAlloc(psS64 exp_id, const char *tmp_exp_name, const char *tmp_camera, const char *tmp_telescope, const char *state, const char *workdir, const char *workdir_state)
    28062529{
    28072530    newExpRow       *_object;
     
    28102533    psMemSetDeallocator(_object, (psFreeFunc)newExpRowFree);
    28112534
    2812     _object->exp_tag = psStringCopy(exp_tag);
    2813     _object->exp_id = psStringCopy(exp_id);
    2814     _object->camera = psStringCopy(camera);
    2815     _object->telescope = psStringCopy(telescope);
    2816     _object->imfiles = imfiles;
     2535    _object->exp_id = exp_id;
     2536    _object->tmp_exp_name = psStringCopy(tmp_exp_name);
     2537    _object->tmp_camera = psStringCopy(tmp_camera);
     2538    _object->tmp_telescope = psStringCopy(tmp_telescope);
     2539    _object->state = psStringCopy(state);
    28172540    _object->workdir = psStringCopy(workdir);
     2541    _object->workdir_state = psStringCopy(workdir_state);
    28182542
    28192543    return _object;
     
    28222546static void newExpRowFree(newExpRow *object)
    28232547{
    2824     psFree(object->exp_tag);
    2825     psFree(object->exp_id);
    2826     psFree(object->camera);
    2827     psFree(object->telescope);
     2548    psFree(object->tmp_exp_name);
     2549    psFree(object->tmp_camera);
     2550    psFree(object->tmp_telescope);
     2551    psFree(object->state);
    28282552    psFree(object->workdir);
     2553    psFree(object->workdir_state);
    28292554}
    28302555
     
    28322557{
    28332558    psMetadata *md = psMetadataAlloc();
    2834     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
    2835         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    2836         psFree(md);
    2837         return false;
    2838     }
    2839     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, "Key", "64")) {
     2559    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key AUTO_INCREMENT", 0)) {
    28402560        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    28412561        psFree(md);
    28422562        return false;
    28432563    }
    2844     if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, "Key", "64")) {
    2845         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
    2846         psFree(md);
    2847         return false;
    2848     }
    2849     if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, "Key", "64")) {
    2850         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
    2851         psFree(md);
    2852         return false;
    2853     }
    2854     if (!psMetadataAdd(md, PS_LIST_TAIL, "imfiles", PS_DATA_S32, NULL, 0)) {
    2855         psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles");
     2564    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_exp_name", PS_DATA_STRING, "Key", "64")) {
     2565        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_exp_name");
     2566        psFree(md);
     2567        return false;
     2568    }
     2569    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_camera", PS_DATA_STRING, "Key", "64")) {
     2570        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_camera");
     2571        psFree(md);
     2572        return false;
     2573    }
     2574    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_telescope", PS_DATA_STRING, "Key", "64")) {
     2575        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_telescope");
     2576        psFree(md);
     2577        return false;
     2578    }
     2579    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, "Key", "64")) {
     2580        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
    28562581        psFree(md);
    28572582        return false;
     
    28622587        return false;
    28632588    }
     2589    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, "key", "64")) {
     2590        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state");
     2591        psFree(md);
     2592        return false;
     2593    }
    28642594
    28652595    bool status = psDBCreateTable(dbh, NEWEXP_TABLE_NAME, md);
     
    28752605}
    28762606
    2877 bool newExpInsert(psDB * dbh, const char *exp_tag, const char *exp_id, const char *camera, const char *telescope, psS32 imfiles, const char *workdir)
     2607bool newExpInsert(psDB * dbh, psS64 exp_id, const char *tmp_exp_name, const char *tmp_camera, const char *tmp_telescope, const char *state, const char *workdir, const char *workdir_state)
    28782608{
    28792609    psMetadata *md = psMetadataAlloc();
    2880     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    2881         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    2882         psFree(md);
    2883         return false;
    2884     }
    2885     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, exp_id)) {
     2610    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
    28862611        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    28872612        psFree(md);
    28882613        return false;
    28892614    }
    2890     if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, camera)) {
    2891         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
    2892         psFree(md);
    2893         return false;
    2894     }
    2895     if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, telescope)) {
    2896         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
    2897         psFree(md);
    2898         return false;
    2899     }
    2900     if (!psMetadataAdd(md, PS_LIST_TAIL, "imfiles", PS_DATA_S32, NULL, imfiles)) {
    2901         psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles");
     2615    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_exp_name", PS_DATA_STRING, NULL, tmp_exp_name)) {
     2616        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_exp_name");
     2617        psFree(md);
     2618        return false;
     2619    }
     2620    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_camera", PS_DATA_STRING, NULL, tmp_camera)) {
     2621        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_camera");
     2622        psFree(md);
     2623        return false;
     2624    }
     2625    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_telescope", PS_DATA_STRING, NULL, tmp_telescope)) {
     2626        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_telescope");
     2627        psFree(md);
     2628        return false;
     2629    }
     2630    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, state)) {
     2631        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
    29022632        psFree(md);
    29032633        return false;
     
    29052635    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) {
    29062636        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
     2637        psFree(md);
     2638        return false;
     2639    }
     2640    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, NULL, workdir_state)) {
     2641        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state");
    29072642        psFree(md);
    29082643        return false;
     
    29312666bool newExpInsertObject(psDB *dbh, newExpRow *object)
    29322667{
    2933     return newExpInsert(dbh, object->exp_tag, object->exp_id, object->camera, object->telescope, object->imfiles, object->workdir);
     2668    return newExpInsert(dbh, object->exp_id, object->tmp_exp_name, object->tmp_camera, object->tmp_telescope, object->state, object->workdir, object->workdir_state);
    29342669}
    29352670
     
    30042739{
    30052740    psMetadata *md = psMetadataAlloc();
    3006     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    3007         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    3008         psFree(md);
    3009         return false;
    3010     }
    3011     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, object->exp_id)) {
     2741    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
    30122742        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    30132743        psFree(md);
    30142744        return false;
    30152745    }
    3016     if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, object->camera)) {
    3017         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
    3018         psFree(md);
    3019         return false;
    3020     }
    3021     if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, object->telescope)) {
    3022         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
    3023         psFree(md);
    3024         return false;
    3025     }
    3026     if (!psMetadataAdd(md, PS_LIST_TAIL, "imfiles", PS_DATA_S32, NULL, object->imfiles)) {
    3027         psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles");
     2746    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_exp_name", PS_DATA_STRING, NULL, object->tmp_exp_name)) {
     2747        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_exp_name");
     2748        psFree(md);
     2749        return false;
     2750    }
     2751    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_camera", PS_DATA_STRING, NULL, object->tmp_camera)) {
     2752        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_camera");
     2753        psFree(md);
     2754        return false;
     2755    }
     2756    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_telescope", PS_DATA_STRING, NULL, object->tmp_telescope)) {
     2757        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_telescope");
     2758        psFree(md);
     2759        return false;
     2760    }
     2761    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, object->state)) {
     2762        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
    30282763        psFree(md);
    30292764        return false;
     
    30342769        return false;
    30352770    }
     2771    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, NULL, object->workdir_state)) {
     2772        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state");
     2773        psFree(md);
     2774        return false;
     2775    }
    30362776
    30372777
     
    30432783
    30442784bool status = false;
    3045     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    3046     if (!status) {
    3047         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
    3048         return false;
    3049     }
    3050     char* exp_id = psMetadataLookupPtr(&status, md, "exp_id");
     2785    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
    30512786    if (!status) {
    30522787        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
    30532788        return false;
    30542789    }
    3055     char* camera = psMetadataLookupPtr(&status, md, "camera");
    3056     if (!status) {
    3057         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item camera");
    3058         return false;
    3059     }
    3060     char* telescope = psMetadataLookupPtr(&status, md, "telescope");
    3061     if (!status) {
    3062         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item telescope");
    3063         return false;
    3064     }
    3065     psS32 imfiles = psMetadataLookupS32(&status, md, "imfiles");
    3066     if (!status) {
    3067         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item imfiles");
     2790    char* tmp_exp_name = psMetadataLookupPtr(&status, md, "tmp_exp_name");
     2791    if (!status) {
     2792        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item tmp_exp_name");
     2793        return false;
     2794    }
     2795    char* tmp_camera = psMetadataLookupPtr(&status, md, "tmp_camera");
     2796    if (!status) {
     2797        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item tmp_camera");
     2798        return false;
     2799    }
     2800    char* tmp_telescope = psMetadataLookupPtr(&status, md, "tmp_telescope");
     2801    if (!status) {
     2802        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item tmp_telescope");
     2803        return false;
     2804    }
     2805    char* state = psMetadataLookupPtr(&status, md, "state");
     2806    if (!status) {
     2807        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item state");
    30682808        return false;
    30692809    }
     
    30732813        return false;
    30742814    }
    3075 
    3076     return newExpRowAlloc(exp_tag, exp_id, camera, telescope, imfiles, workdir);
     2815    char* workdir_state = psMetadataLookupPtr(&status, md, "workdir_state");
     2816    if (!status) {
     2817        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item workdir_state");
     2818        return false;
     2819    }
     2820
     2821    return newExpRowAlloc(exp_id, tmp_exp_name, tmp_camera, tmp_telescope, state, workdir, workdir_state);
    30772822}
    30782823psArray *newExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    31862931static void newImfileRowFree(newImfileRow *object);
    31872932
    3188 newImfileRow *newImfileRowAlloc(const char *exp_tag, const char *class, const char *class_id, const char *uri)
     2933newImfileRow *newImfileRowAlloc(psS64 exp_id, const char *tmp_class_id, const char *uri)
    31892934{
    31902935    newImfileRow    *_object;
     
    31932938    psMemSetDeallocator(_object, (psFreeFunc)newImfileRowFree);
    31942939
    3195     _object->exp_tag = psStringCopy(exp_tag);
    3196     _object->class = psStringCopy(class);
    3197     _object->class_id = psStringCopy(class_id);
     2940    _object->exp_id = exp_id;
     2941    _object->tmp_class_id = psStringCopy(tmp_class_id);
    31982942    _object->uri = psStringCopy(uri);
    31992943
     
    32032947static void newImfileRowFree(newImfileRow *object)
    32042948{
    3205     psFree(object->exp_tag);
    3206     psFree(object->class);
    3207     psFree(object->class_id);
     2949    psFree(object->tmp_class_id);
    32082950    psFree(object->uri);
    32092951}
     
    32122954{
    32132955    psMetadata *md = psMetadataAlloc();
    3214     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
    3215         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    3216         psFree(md);
    3217         return false;
    3218     }
    3219     if (!psMetadataAdd(md, PS_LIST_TAIL, "class", PS_DATA_STRING, "Primary Key", "64")) {
    3220         psError(PS_ERR_UNKNOWN, false, "failed to add item class");
    3221         psFree(md);
    3222         return false;
    3223     }
    3224     if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, "Primary Key", "64")) {
    3225         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
     2956    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key fkey(exp_id) ref newExp(exp_id)", 64)) {
     2957        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     2958        psFree(md);
     2959        return false;
     2960    }
     2961    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_class_id", PS_DATA_STRING, "Primary Key", "64")) {
     2962        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_class_id");
    32262963        psFree(md);
    32272964        return false;
     
    32452982}
    32462983
    3247 bool newImfileInsert(psDB * dbh, const char *exp_tag, const char *class, const char *class_id, const char *uri)
     2984bool newImfileInsert(psDB * dbh, psS64 exp_id, const char *tmp_class_id, const char *uri)
    32482985{
    32492986    psMetadata *md = psMetadataAlloc();
    3250     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    3251         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    3252         psFree(md);
    3253         return false;
    3254     }
    3255     if (!psMetadataAdd(md, PS_LIST_TAIL, "class", PS_DATA_STRING, NULL, class)) {
    3256         psError(PS_ERR_UNKNOWN, false, "failed to add item class");
    3257         psFree(md);
    3258         return false;
    3259     }
    3260     if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, class_id)) {
    3261         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
     2987    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     2988        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     2989        psFree(md);
     2990        return false;
     2991    }
     2992    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_class_id", PS_DATA_STRING, NULL, tmp_class_id)) {
     2993        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_class_id");
    32622994        psFree(md);
    32632995        return false;
     
    32913023bool newImfileInsertObject(psDB *dbh, newImfileRow *object)
    32923024{
    3293     return newImfileInsert(dbh, object->exp_tag, object->class, object->class_id, object->uri);
     3025    return newImfileInsert(dbh, object->exp_id, object->tmp_class_id, object->uri);
    32943026}
    32953027
     
    33643096{
    33653097    psMetadata *md = psMetadataAlloc();
    3366     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    3367         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    3368         psFree(md);
    3369         return false;
    3370     }
    3371     if (!psMetadataAdd(md, PS_LIST_TAIL, "class", PS_DATA_STRING, NULL, object->class)) {
    3372         psError(PS_ERR_UNKNOWN, false, "failed to add item class");
    3373         psFree(md);
    3374         return false;
    3375     }
    3376     if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, object->class_id)) {
    3377         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
     3098    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     3099        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     3100        psFree(md);
     3101        return false;
     3102    }
     3103    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_class_id", PS_DATA_STRING, NULL, object->tmp_class_id)) {
     3104        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_class_id");
    33783105        psFree(md);
    33793106        return false;
     
    33933120
    33943121bool status = false;
    3395     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    3396     if (!status) {
    3397         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
    3398         return false;
    3399     }
    3400     char* class = psMetadataLookupPtr(&status, md, "class");
    3401     if (!status) {
    3402         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class");
    3403         return false;
    3404     }
    3405     char* class_id = psMetadataLookupPtr(&status, md, "class_id");
    3406     if (!status) {
    3407         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class_id");
     3122    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     3123    if (!status) {
     3124        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
     3125        return false;
     3126    }
     3127    char* tmp_class_id = psMetadataLookupPtr(&status, md, "tmp_class_id");
     3128    if (!status) {
     3129        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item tmp_class_id");
    34083130        return false;
    34093131    }
     
    34143136    }
    34153137
    3416     return newImfileRowAlloc(exp_tag, class, class_id, uri);
     3138    return newImfileRowAlloc(exp_id, tmp_class_id, uri);
    34173139}
    34183140psArray *newImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    35263248static void rawExpRowFree(rawExpRow *object);
    35273249
    3528 rawExpRow *rawExpRowAlloc(const char *exp_tag, const char *exp_id, const char *camera, const char *telescope, psTime* dateobs, const char *exp_type, psS32 imfiles, const char *filelevel, const char *workdir, const char *filter, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 solang, psS16 fault)
     3250rawExpRow *rawExpRowAlloc(psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *exp_tag, const char *exp_type, const char *filelevel, const char *workdir, const char *filter, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 solang, psS16 fault)
    35293251{
    35303252    rawExpRow       *_object;
     
    35333255    psMemSetDeallocator(_object, (psFreeFunc)rawExpRowFree);
    35343256
    3535     _object->exp_tag = psStringCopy(exp_tag);
    3536     _object->exp_id = psStringCopy(exp_id);
     3257    _object->exp_id = exp_id;
     3258    _object->exp_name = psStringCopy(exp_name);
    35373259    _object->camera = psStringCopy(camera);
    35383260    _object->telescope = psStringCopy(telescope);
    35393261    _object->dateobs = psTimeCopy(dateobs);
     3262    _object->exp_tag = psStringCopy(exp_tag);
    35403263    _object->exp_type = psStringCopy(exp_type);
    3541     _object->imfiles = imfiles;
    35423264    _object->filelevel = psStringCopy(filelevel);
    35433265    _object->workdir = psStringCopy(workdir);
     
    35693291static void rawExpRowFree(rawExpRow *object)
    35703292{
    3571     psFree(object->exp_tag);
    3572     psFree(object->exp_id);
     3293    psFree(object->exp_name);
    35733294    psFree(object->camera);
    35743295    psFree(object->telescope);
    35753296    psFree(object->dateobs);
     3297    psFree(object->exp_tag);
    35763298    psFree(object->exp_type);
    35773299    psFree(object->filelevel);
     
    35843306{
    35853307    psMetadata *md = psMetadataAlloc();
    3586     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
    3587         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    3588         psFree(md);
    3589         return false;
    3590     }
    3591     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, "Key", "64")) {
     3308    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key fkey(exp_id) ref newExp(exp_id)", 64)) {
    35923309        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     3310        psFree(md);
     3311        return false;
     3312    }
     3313    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, "64")) {
     3314        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
    35933315        psFree(md);
    35943316        return false;
     
    36093331        return false;
    36103332    }
     3333    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, "255")) {
     3334        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     3335        psFree(md);
     3336        return false;
     3337    }
    36113338    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_type", PS_DATA_STRING, NULL, "64")) {
    36123339        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
     
    36143341        return false;
    36153342    }
    3616     if (!psMetadataAdd(md, PS_LIST_TAIL, "imfiles", PS_DATA_S32, NULL, 0)) {
    3617         psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles");
    3618         psFree(md);
    3619         return false;
    3620     }
    36213343    if (!psMetadataAdd(md, PS_LIST_TAIL, "filelevel", PS_DATA_STRING, NULL, "64")) {
    36223344        psError(PS_ERR_UNKNOWN, false, "failed to add item filelevel");
     
    37473469}
    37483470
    3749 bool rawExpInsert(psDB * dbh, const char *exp_tag, const char *exp_id, const char *camera, const char *telescope, psTime* dateobs, const char *exp_type, psS32 imfiles, const char *filelevel, const char *workdir, const char *filter, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 solang, psS16 fault)
     3471bool rawExpInsert(psDB * dbh, psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *exp_tag, const char *exp_type, const char *filelevel, const char *workdir, const char *filter, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psF32 solang, psS16 fault)
    37503472{
    37513473    psMetadata *md = psMetadataAlloc();
     3474    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     3475        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     3476        psFree(md);
     3477        return false;
     3478    }
     3479    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, exp_name)) {
     3480        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
     3481        psFree(md);
     3482        return false;
     3483    }
     3484    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, camera)) {
     3485        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
     3486        psFree(md);
     3487        return false;
     3488    }
     3489    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, telescope)) {
     3490        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
     3491        psFree(md);
     3492        return false;
     3493    }
     3494    if (!psMetadataAdd(md, PS_LIST_TAIL, "dateobs", PS_DATA_TIME, NULL, dateobs)) {
     3495        psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
     3496        psFree(md);
     3497        return false;
     3498    }
    37523499    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    37533500        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     
    37553502        return false;
    37563503    }
    3757     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, exp_id)) {
    3758         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    3759         psFree(md);
    3760         return false;
    3761     }
    3762     if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, camera)) {
    3763         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
    3764         psFree(md);
    3765         return false;
    3766     }
    3767     if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, telescope)) {
    3768         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
    3769         psFree(md);
    3770         return false;
    3771     }
    3772     if (!psMetadataAdd(md, PS_LIST_TAIL, "dateobs", PS_DATA_TIME, NULL, dateobs)) {
    3773         psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
    3774         psFree(md);
    3775         return false;
    3776     }
    37773504    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_type", PS_DATA_STRING, NULL, exp_type)) {
    37783505        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
    3779         psFree(md);
    3780         return false;
    3781     }
    3782     if (!psMetadataAdd(md, PS_LIST_TAIL, "imfiles", PS_DATA_S32, NULL, imfiles)) {
    3783         psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles");
    37843506        psFree(md);
    37853507        return false;
     
    39233645bool rawExpInsertObject(psDB *dbh, rawExpRow *object)
    39243646{
    3925     return rawExpInsert(dbh, object->exp_tag, object->exp_id, object->camera, object->telescope, object->dateobs, object->exp_type, object->imfiles, object->filelevel, object->workdir, object->filter, object->airmass, object->ra, object->decl, object->exp_time, object->sat_pixel_frac, object->bg, object->bg_stdev, object->bg_mean_stdev, object->alt, object->az, object->ccd_temp, object->posang, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->object, object->solang, object->fault);
     3647    return rawExpInsert(dbh, object->exp_id, object->exp_name, object->camera, object->telescope, object->dateobs, object->exp_tag, object->exp_type, object->filelevel, object->workdir, object->filter, object->airmass, object->ra, object->decl, object->exp_time, object->sat_pixel_frac, object->bg, object->bg_stdev, object->bg_mean_stdev, object->alt, object->az, object->ccd_temp, object->posang, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->object, object->solang, object->fault);
    39263648}
    39273649
     
    39963718{
    39973719    psMetadata *md = psMetadataAlloc();
     3720    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     3721        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     3722        psFree(md);
     3723        return false;
     3724    }
     3725    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, object->exp_name)) {
     3726        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
     3727        psFree(md);
     3728        return false;
     3729    }
     3730    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, object->camera)) {
     3731        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
     3732        psFree(md);
     3733        return false;
     3734    }
     3735    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, object->telescope)) {
     3736        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
     3737        psFree(md);
     3738        return false;
     3739    }
     3740    if (!psMetadataAdd(md, PS_LIST_TAIL, "dateobs", PS_DATA_TIME, NULL, object->dateobs)) {
     3741        psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
     3742        psFree(md);
     3743        return false;
     3744    }
    39983745    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    39993746        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     
    40013748        return false;
    40023749    }
    4003     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_STRING, NULL, object->exp_id)) {
    4004         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    4005         psFree(md);
    4006         return false;
    4007     }
    4008     if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, object->camera)) {
    4009         psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
    4010         psFree(md);
    4011         return false;
    4012     }
    4013     if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, object->telescope)) {
    4014         psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
    4015         psFree(md);
    4016         return false;
    4017     }
    4018     if (!psMetadataAdd(md, PS_LIST_TAIL, "dateobs", PS_DATA_TIME, NULL, object->dateobs)) {
    4019         psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
    4020         psFree(md);
    4021         return false;
    4022     }
    40233750    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_type", PS_DATA_STRING, NULL, object->exp_type)) {
    40243751        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
     
    40263753        return false;
    40273754    }
    4028     if (!psMetadataAdd(md, PS_LIST_TAIL, "imfiles", PS_DATA_S32, NULL, object->imfiles)) {
    4029         psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles");
    4030         psFree(md);
    4031         return false;
    4032     }
    40333755    if (!psMetadataAdd(md, PS_LIST_TAIL, "filelevel", PS_DATA_STRING, NULL, object->filelevel)) {
    40343756        psError(PS_ERR_UNKNOWN, false, "failed to add item filelevel");
     
    41553877
    41563878bool status = false;
     3879    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     3880    if (!status) {
     3881        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
     3882        return false;
     3883    }
     3884    char* exp_name = psMetadataLookupPtr(&status, md, "exp_name");
     3885    if (!status) {
     3886        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_name");
     3887        return false;
     3888    }
     3889    char* camera = psMetadataLookupPtr(&status, md, "camera");
     3890    if (!status) {
     3891        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item camera");
     3892        return false;
     3893    }
     3894    char* telescope = psMetadataLookupPtr(&status, md, "telescope");
     3895    if (!status) {
     3896        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item telescope");
     3897        return false;
     3898    }
     3899    psTime* dateobs = psMetadataLookupPtr(&status, md, "dateobs");
     3900    if (!status) {
     3901        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dateobs");
     3902        return false;
     3903    }
    41573904    char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    41583905    if (!status) {
     
    41603907        return false;
    41613908    }
    4162     char* exp_id = psMetadataLookupPtr(&status, md, "exp_id");
    4163     if (!status) {
    4164         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
    4165         return false;
    4166     }
    4167     char* camera = psMetadataLookupPtr(&status, md, "camera");
    4168     if (!status) {
    4169         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item camera");
    4170         return false;
    4171     }
    4172     char* telescope = psMetadataLookupPtr(&status, md, "telescope");
    4173     if (!status) {
    4174         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item telescope");
    4175         return false;
    4176     }
    4177     psTime* dateobs = psMetadataLookupPtr(&status, md, "dateobs");
    4178     if (!status) {
    4179         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dateobs");
    4180         return false;
    4181     }
    41823909    char* exp_type = psMetadataLookupPtr(&status, md, "exp_type");
    41833910    if (!status) {
     
    41853912        return false;
    41863913    }
    4187     psS32 imfiles = psMetadataLookupS32(&status, md, "imfiles");
    4188     if (!status) {
    4189         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item imfiles");
    4190         return false;
    4191     }
    41923914    char* filelevel = psMetadataLookupPtr(&status, md, "filelevel");
    41933915    if (!status) {
     
    43064028    }
    43074029
    4308     return rawExpRowAlloc(exp_tag, exp_id, camera, telescope, dateobs, exp_type, imfiles, filelevel, workdir, filter, airmass, ra, decl, exp_time, sat_pixel_frac, bg, bg_stdev, bg_mean_stdev, alt, az, ccd_temp, posang, user_1, user_2, user_3, user_4, user_5, object, solang, fault);
     4030    return rawExpRowAlloc(exp_id, exp_name, camera, telescope, dateobs, exp_tag, exp_type, filelevel, workdir, filter, airmass, ra, decl, exp_time, sat_pixel_frac, bg, bg_stdev, bg_mean_stdev, alt, az, ccd_temp, posang, user_1, user_2, user_3, user_4, user_5, object, solang, fault);
    43094031}
    43104032psArray *rawExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    44184140static void rawImfileRowFree(rawImfileRow *object);
    44194141
    4420 rawImfileRow *rawImfileRowAlloc(const char *exp_tag, const char *class_id, const char *uri, const char *exp_type, const char *filelevel, const char *filter, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psTime* dateobs, psS16 fault)
     4142rawImfileRow *rawImfileRowAlloc(psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *tmp_class_id, const char *class_id, const char *uri, const char *exp_type, const char *filelevel, const char *filter, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psS16 fault)
    44214143{
    44224144    rawImfileRow    *_object;
     
    44254147    psMemSetDeallocator(_object, (psFreeFunc)rawImfileRowFree);
    44264148
    4427     _object->exp_tag = psStringCopy(exp_tag);
     4149    _object->exp_id = exp_id;
     4150    _object->exp_name = psStringCopy(exp_name);
     4151    _object->camera = psStringCopy(camera);
     4152    _object->telescope = psStringCopy(telescope);
     4153    _object->dateobs = psTimeCopy(dateobs);
     4154    _object->tmp_class_id = psStringCopy(tmp_class_id);
    44284155    _object->class_id = psStringCopy(class_id);
    44294156    _object->uri = psStringCopy(uri);
     
    44494176    _object->user_5 = user_5;
    44504177    _object->object = psStringCopy(object);
    4451     _object->dateobs = psTimeCopy(dateobs);
    44524178    _object->fault = fault;
    44534179
     
    44574183static void rawImfileRowFree(rawImfileRow *object)
    44584184{
    4459     psFree(object->exp_tag);
     4185    psFree(object->exp_name);
     4186    psFree(object->camera);
     4187    psFree(object->telescope);
     4188    psFree(object->dateobs);
     4189    psFree(object->tmp_class_id);
    44604190    psFree(object->class_id);
    44614191    psFree(object->uri);
     
    44644194    psFree(object->filter);
    44654195    psFree(object->object);
    4466     psFree(object->dateobs);
    44674196}
    44684197
     
    44704199{
    44714200    psMetadata *md = psMetadataAlloc();
    4472     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
    4473         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     4201    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key fkey(exp_id, tmp_class_id) ref newImfile(exp_id, tmp_class_id)", 64)) {
     4202        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     4203        psFree(md);
     4204        return false;
     4205    }
     4206    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, "64")) {
     4207        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
     4208        psFree(md);
     4209        return false;
     4210    }
     4211    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, "64")) {
     4212        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
     4213        psFree(md);
     4214        return false;
     4215    }
     4216    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, "64")) {
     4217        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
     4218        psFree(md);
     4219        return false;
     4220    }
     4221    if (!psMetadataAdd(md, PS_LIST_TAIL, "dateobs", PS_DATA_TIME, NULL, NULL)) {
     4222        psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
     4223        psFree(md);
     4224        return false;
     4225    }
     4226    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_class_id", PS_DATA_STRING, "Key", "64")) {
     4227        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_class_id");
    44744228        psFree(md);
    44754229        return false;
     
    45904344        return false;
    45914345    }
    4592     if (!psMetadataAdd(md, PS_LIST_TAIL, "dateobs", PS_DATA_TIME, NULL, NULL)) {
    4593         psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
    4594         psFree(md);
    4595         return false;
    4596     }
    45974346    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
    45984347        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    46134362}
    46144363
    4615 bool rawImfileInsert(psDB * dbh, const char *exp_tag, const char *class_id, const char *uri, const char *exp_type, const char *filelevel, const char *filter, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psTime* dateobs, psS16 fault)
     4364bool rawImfileInsert(psDB * dbh, psS64 exp_id, const char *exp_name, const char *camera, const char *telescope, psTime* dateobs, const char *tmp_class_id, const char *class_id, const char *uri, const char *exp_type, const char *filelevel, const char *filter, psF32 airmass, psF64 ra, psF64 decl, psF32 exp_time, psF32 sat_pixel_frac, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 alt, psF64 az, psF32 ccd_temp, psF64 posang, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *object, psS16 fault)
    46164365{
    46174366    psMetadata *md = psMetadataAlloc();
    4618     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    4619         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     4367    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     4368        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     4369        psFree(md);
     4370        return false;
     4371    }
     4372    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, exp_name)) {
     4373        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
     4374        psFree(md);
     4375        return false;
     4376    }
     4377    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, camera)) {
     4378        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
     4379        psFree(md);
     4380        return false;
     4381    }
     4382    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, telescope)) {
     4383        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
     4384        psFree(md);
     4385        return false;
     4386    }
     4387    if (!psMetadataAdd(md, PS_LIST_TAIL, "dateobs", PS_DATA_TIME, NULL, dateobs)) {
     4388        psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
     4389        psFree(md);
     4390        return false;
     4391    }
     4392    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_class_id", PS_DATA_STRING, NULL, tmp_class_id)) {
     4393        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_class_id");
    46204394        psFree(md);
    46214395        return false;
     
    47334507    if (!psMetadataAdd(md, PS_LIST_TAIL, "object", PS_DATA_STRING, NULL, object)) {
    47344508        psError(PS_ERR_UNKNOWN, false, "failed to add item object");
    4735         psFree(md);
    4736         return false;
    4737     }
    4738     if (!psMetadataAdd(md, PS_LIST_TAIL, "dateobs", PS_DATA_TIME, NULL, dateobs)) {
    4739         psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
    47404509        psFree(md);
    47414510        return false;
     
    47694538bool rawImfileInsertObject(psDB *dbh, rawImfileRow *object)
    47704539{
    4771     return rawImfileInsert(dbh, object->exp_tag, object->class_id, object->uri, object->exp_type, object->filelevel, object->filter, object->airmass, object->ra, object->decl, object->exp_time, object->sat_pixel_frac, object->bg, object->bg_stdev, object->bg_mean_stdev, object->alt, object->az, object->ccd_temp, object->posang, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->object, object->dateobs, object->fault);
     4540    return rawImfileInsert(dbh, object->exp_id, object->exp_name, object->camera, object->telescope, object->dateobs, object->tmp_class_id, object->class_id, object->uri, object->exp_type, object->filelevel, object->filter, object->airmass, object->ra, object->decl, object->exp_time, object->sat_pixel_frac, object->bg, object->bg_stdev, object->bg_mean_stdev, object->alt, object->az, object->ccd_temp, object->posang, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->object, object->fault);
    47724541}
    47734542
     
    48424611{
    48434612    psMetadata *md = psMetadataAlloc();
    4844     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    4845         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     4613    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     4614        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     4615        psFree(md);
     4616        return false;
     4617    }
     4618    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_name", PS_DATA_STRING, NULL, object->exp_name)) {
     4619        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_name");
     4620        psFree(md);
     4621        return false;
     4622    }
     4623    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, object->camera)) {
     4624        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
     4625        psFree(md);
     4626        return false;
     4627    }
     4628    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, object->telescope)) {
     4629        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
     4630        psFree(md);
     4631        return false;
     4632    }
     4633    if (!psMetadataAdd(md, PS_LIST_TAIL, "dateobs", PS_DATA_TIME, NULL, object->dateobs)) {
     4634        psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
     4635        psFree(md);
     4636        return false;
     4637    }
     4638    if (!psMetadataAdd(md, PS_LIST_TAIL, "tmp_class_id", PS_DATA_STRING, NULL, object->tmp_class_id)) {
     4639        psError(PS_ERR_UNKNOWN, false, "failed to add item tmp_class_id");
    48464640        psFree(md);
    48474641        return false;
     
    49624756        return false;
    49634757    }
    4964     if (!psMetadataAdd(md, PS_LIST_TAIL, "dateobs", PS_DATA_TIME, NULL, object->dateobs)) {
    4965         psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
    4966         psFree(md);
    4967         return false;
    4968     }
    49694758    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
    49704759        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     
    49814770
    49824771bool status = false;
    4983     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    4984     if (!status) {
    4985         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
     4772    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     4773    if (!status) {
     4774        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
     4775        return false;
     4776    }
     4777    char* exp_name = psMetadataLookupPtr(&status, md, "exp_name");
     4778    if (!status) {
     4779        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_name");
     4780        return false;
     4781    }
     4782    char* camera = psMetadataLookupPtr(&status, md, "camera");
     4783    if (!status) {
     4784        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item camera");
     4785        return false;
     4786    }
     4787    char* telescope = psMetadataLookupPtr(&status, md, "telescope");
     4788    if (!status) {
     4789        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item telescope");
     4790        return false;
     4791    }
     4792    psTime* dateobs = psMetadataLookupPtr(&status, md, "dateobs");
     4793    if (!status) {
     4794        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dateobs");
     4795        return false;
     4796    }
     4797    char* tmp_class_id = psMetadataLookupPtr(&status, md, "tmp_class_id");
     4798    if (!status) {
     4799        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item tmp_class_id");
    49864800        return false;
    49874801    }
     
    51014915        return false;
    51024916    }
    5103     psTime* dateobs = psMetadataLookupPtr(&status, md, "dateobs");
    5104     if (!status) {
    5105         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dateobs");
    5106         return false;
    5107     }
    51084917    psS16 fault = psMetadataLookupS16(&status, md, "fault");
    51094918    if (!status) {
     
    51124921    }
    51134922
    5114     return rawImfileRowAlloc(exp_tag, class_id, uri, exp_type, filelevel, filter, airmass, ra, decl, exp_time, sat_pixel_frac, bg, bg_stdev, bg_mean_stdev, alt, az, ccd_temp, posang, user_1, user_2, user_3, user_4, user_5, object, dateobs, fault);
     4923    return rawImfileRowAlloc(exp_id, exp_name, camera, telescope, dateobs, tmp_class_id, class_id, uri, exp_type, filelevel, filter, airmass, ra, decl, exp_time, sat_pixel_frac, bg, bg_stdev, bg_mean_stdev, alt, az, ccd_temp, posang, user_1, user_2, user_3, user_4, user_5, object, fault);
    51154924}
    51164925psArray *rawImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    52245033static void guidePendingExpRowFree(guidePendingExpRow *object);
    52255034
    5226 guidePendingExpRow *guidePendingExpRowAlloc(psS64 guide_id, const char *exp_tag, const char *recipe)
     5035guidePendingExpRow *guidePendingExpRowAlloc(psS64 guide_id, psS64 exp_id, const char *recipe)
    52275036{
    52285037    guidePendingExpRow *_object;
     
    52325041
    52335042    _object->guide_id = guide_id;
    5234     _object->exp_tag = psStringCopy(exp_tag);
     5043    _object->exp_id = exp_id;
    52355044    _object->recipe = psStringCopy(recipe);
    52365045
     
    52405049static void guidePendingExpRowFree(guidePendingExpRow *object)
    52415050{
    5242     psFree(object->exp_tag);
    52435051    psFree(object->recipe);
    52445052}
     
    52525060        return false;
    52535061    }
    5254     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Key", "64")) {
    5255         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     5062    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Key", 64)) {
     5063        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    52565064        psFree(md);
    52575065        return false;
     
    52755083}
    52765084
    5277 bool guidePendingExpInsert(psDB * dbh, psS64 guide_id, const char *exp_tag, const char *recipe)
     5085bool guidePendingExpInsert(psDB * dbh, psS64 guide_id, psS64 exp_id, const char *recipe)
    52785086{
    52795087    psMetadata *md = psMetadataAlloc();
     
    52835091        return false;
    52845092    }
    5285     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    5286         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     5093    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     5094        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    52875095        psFree(md);
    52885096        return false;
     
    53165124bool guidePendingExpInsertObject(psDB *dbh, guidePendingExpRow *object)
    53175125{
    5318     return guidePendingExpInsert(dbh, object->guide_id, object->exp_tag, object->recipe);
     5126    return guidePendingExpInsert(dbh, object->guide_id, object->exp_id, object->recipe);
    53195127}
    53205128
     
    53945202        return false;
    53955203    }
    5396     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    5397         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     5204    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     5205        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    53985206        psFree(md);
    53995207        return false;
     
    54185226        return false;
    54195227    }
    5420     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    5421     if (!status) {
    5422         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
     5228    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     5229    if (!status) {
     5230        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
    54235231        return false;
    54245232    }
     
    54295237    }
    54305238
    5431     return guidePendingExpRowAlloc(guide_id, exp_tag, recipe);
     5239    return guidePendingExpRowAlloc(guide_id, exp_id, recipe);
    54325240}
    54335241psArray *guidePendingExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    55395347    return true;
    55405348}
    5541 static void chipPendingExpRowFree(chipPendingExpRow *object);
    5542 
    5543 chipPendingExpRow *chipPendingExpRowAlloc(psS64 chip_id, const char *exp_tag, psS64 guide_id, const char *workdir, const char *label, const char *reduction, const char *expgroup, const char *dvodb)
    5544 {
    5545     chipPendingExpRow *_object;
    5546 
    5547     _object = psAlloc(sizeof(chipPendingExpRow));
    5548     psMemSetDeallocator(_object, (psFreeFunc)chipPendingExpRowFree);
     5349static void chipRunRowFree(chipRunRow *object);
     5350
     5351chipRunRow *chipRunRowAlloc(psS64 chip_id, const char *state, const char *workdir, const char *workdir_state, const char *label, const char *reduction, const char *expgroup, const char *dvodb)
     5352{
     5353    chipRunRow      *_object;
     5354
     5355    _object = psAlloc(sizeof(chipRunRow));
     5356    psMemSetDeallocator(_object, (psFreeFunc)chipRunRowFree);
    55495357
    55505358    _object->chip_id = chip_id;
    5551     _object->exp_tag = psStringCopy(exp_tag);
    5552     _object->guide_id = guide_id;
     5359    _object->state = psStringCopy(state);
    55535360    _object->workdir = psStringCopy(workdir);
     5361    _object->workdir_state = psStringCopy(workdir_state);
    55545362    _object->label = psStringCopy(label);
    55555363    _object->reduction = psStringCopy(reduction);
     
    55605368}
    55615369
    5562 static void chipPendingExpRowFree(chipPendingExpRow *object)
    5563 {
    5564     psFree(object->exp_tag);
     5370static void chipRunRowFree(chipRunRow *object)
     5371{
     5372    psFree(object->state);
    55655373    psFree(object->workdir);
     5374    psFree(object->workdir_state);
    55665375    psFree(object->label);
    55675376    psFree(object->reduction);
     
    55705379}
    55715380
    5572 bool chipPendingExpCreateTable(psDB *dbh)
     5381bool chipRunCreateTable(psDB *dbh)
    55735382{
    55745383    psMetadata *md = psMetadataAlloc();
     
    55785387        return false;
    55795388    }
    5580     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
    5581         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    5582         psFree(md);
    5583         return false;
    5584     }
    5585     if (!psMetadataAdd(md, PS_LIST_TAIL, "guide_id", PS_DATA_S64, "Not NULL", 0)) {
    5586         psError(PS_ERR_UNKNOWN, false, "failed to add item guide_id");
     5389    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, "key", "64")) {
     5390        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
    55875391        psFree(md);
    55885392        return false;
     
    55935397        return false;
    55945398    }
     5399    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, "key", "64")) {
     5400        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state");
     5401        psFree(md);
     5402        return false;
     5403    }
    55955404    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "key", "64")) {
    55965405        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     
    56145423    }
    56155424
    5616     bool status = psDBCreateTable(dbh, CHIPPENDINGEXP_TABLE_NAME, md);
     5425    bool status = psDBCreateTable(dbh, CHIPRUN_TABLE_NAME, md);
    56175426
    56185427    psFree(md);
     
    56215430}
    56225431
    5623 bool chipPendingExpDropTable(psDB *dbh)
    5624 {
    5625     return psDBDropTable(dbh, CHIPPENDINGEXP_TABLE_NAME);
    5626 }
    5627 
    5628 bool chipPendingExpInsert(psDB * dbh, psS64 chip_id, const char *exp_tag, psS64 guide_id, const char *workdir, const char *label, const char *reduction, const char *expgroup, const char *dvodb)
     5432bool chipRunDropTable(psDB *dbh)
     5433{
     5434    return psDBDropTable(dbh, CHIPRUN_TABLE_NAME);
     5435}
     5436
     5437bool chipRunInsert(psDB * dbh, psS64 chip_id, const char *state, const char *workdir, const char *workdir_state, const char *label, const char *reduction, const char *expgroup, const char *dvodb)
    56295438{
    56305439    psMetadata *md = psMetadataAlloc();
     
    56345443        return false;
    56355444    }
    5636     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    5637         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    5638         psFree(md);
    5639         return false;
    5640     }
    5641     if (!psMetadataAdd(md, PS_LIST_TAIL, "guide_id", PS_DATA_S64, NULL, guide_id)) {
    5642         psError(PS_ERR_UNKNOWN, false, "failed to add item guide_id");
     5445    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, state)) {
     5446        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
    56435447        psFree(md);
    56445448        return false;
     
    56495453        return false;
    56505454    }
     5455    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, NULL, workdir_state)) {
     5456        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state");
     5457        psFree(md);
     5458        return false;
     5459    }
    56515460    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, label)) {
    56525461        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     
    56705479    }
    56715480
    5672     bool status = psDBInsertOneRow(dbh, CHIPPENDINGEXP_TABLE_NAME, md);
     5481    bool status = psDBInsertOneRow(dbh, CHIPRUN_TABLE_NAME, md);
    56735482    psFree(md);
    56745483
     
    56765485}
    56775486
    5678 long long chipPendingExpDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     5487long long chipRunDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    56795488{
    56805489    long long       deleted = 0;
    56815490
    5682     long long count = psDBDeleteRows(dbh, CHIPPENDINGEXP_TABLE_NAME, where, limit);
     5491    long long count = psDBDeleteRows(dbh, CHIPRUN_TABLE_NAME, where, limit);
    56835492    if (count < 0) {
    5684         psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipPendingExp");
     5493        psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipRun");
    56855494        return count;
    56865495
     
    56905499    return deleted;
    56915500}
    5692 bool chipPendingExpInsertObject(psDB *dbh, chipPendingExpRow *object)
    5693 {
    5694     return chipPendingExpInsert(dbh, object->chip_id, object->exp_tag, object->guide_id, object->workdir, object->label, object->reduction, object->expgroup, object->dvodb);
    5695 }
    5696 
    5697 bool chipPendingExpInsertObjects(psDB *dbh, psArray *objects)
     5501bool chipRunInsertObject(psDB *dbh, chipRunRow *object)
     5502{
     5503    return chipRunInsert(dbh, object->chip_id, object->state, object->workdir, object->workdir_state, object->label, object->reduction, object->expgroup, object->dvodb);
     5504}
     5505
     5506bool chipRunInsertObjects(psDB *dbh, psArray *objects)
    56985507{
    56995508    for (long i = 0; i < psArrayLength(objects); i++) {
    5700         if (!chipPendingExpInsertObject(dbh, objects->data[i])) {
     5509        if (!chipRunInsertObject(dbh, objects->data[i])) {
    57015510            return false;
    57025511        }
     
    57065515}
    57075516
    5708 bool chipPendingExpInsertFits(psDB *dbh, const psFits *fits)
     5517bool chipRunInsertFits(psDB *dbh, const psFits *fits)
    57095518{
    57105519    psArray         *rowSet;
    57115520
    5712     // move to (the first?) extension named  CHIPPENDINGEXP_TABLE_NAME
    5713     if (!psFitsMoveExtName(fits, CHIPPENDINGEXP_TABLE_NAME)) {
    5714         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", CHIPPENDINGEXP_TABLE_NAME);
     5521    // move to (the first?) extension named  CHIPRUN_TABLE_NAME
     5522    if (!psFitsMoveExtName(fits, CHIPRUN_TABLE_NAME)) {
     5523        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", CHIPRUN_TABLE_NAME);
    57155524        return false;
    57165525    }
     
    57305539    }
    57315540
    5732     if (!psDBInsertRows(dbh, CHIPPENDINGEXP_TABLE_NAME, rowSet)) {
     5541    if (!psDBInsertRows(dbh, CHIPRUN_TABLE_NAME, rowSet)) {
    57335542        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    57345543        psFree(rowSet);
     
    57415550}
    57425551
    5743 bool chipPendingExpSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     5552bool chipRunSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    57445553{
    57455554    psArray         *rowSet;
    57465555
    5747     rowSet = psDBSelectRows(dbh, CHIPPENDINGEXP_TABLE_NAME, where, limit);
     5556    rowSet = psDBSelectRows(dbh, CHIPRUN_TABLE_NAME, where, limit);
    57485557    if (!rowSet) {
    57495558        return false;
     
    57515560
    57525561    // output to fits
    5753     if (!psFitsWriteTable(fits, NULL, rowSet, CHIPPENDINGEXP_TABLE_NAME)) {
     5562    if (!psFitsWriteTable(fits, NULL, rowSet, CHIPRUN_TABLE_NAME)) {
    57545563        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    57555564        psFree(rowSet);
     
    57625571}
    57635572
    5764 psMetadata *chipPendingExpMetadataFromObject(const chipPendingExpRow *object)
     5573psMetadata *chipRunMetadataFromObject(const chipRunRow *object)
    57655574{
    57665575    psMetadata *md = psMetadataAlloc();
     
    57705579        return false;
    57715580    }
    5772     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    5773         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    5774         psFree(md);
    5775         return false;
    5776     }
    5777     if (!psMetadataAdd(md, PS_LIST_TAIL, "guide_id", PS_DATA_S64, NULL, object->guide_id)) {
    5778         psError(PS_ERR_UNKNOWN, false, "failed to add item guide_id");
     5581    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, object->state)) {
     5582        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
    57795583        psFree(md);
    57805584        return false;
     
    57855589        return false;
    57865590    }
     5591    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, NULL, object->workdir_state)) {
     5592        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state");
     5593        psFree(md);
     5594        return false;
     5595    }
    57875596    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, object->label)) {
    57885597        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     
    58105619}
    58115620
    5812 chipPendingExpRow *chipPendingExpObjectFromMetadata(psMetadata *md)
     5621chipRunRow *chipRunObjectFromMetadata(psMetadata *md)
    58135622{
    58145623
     
    58195628        return false;
    58205629    }
    5821     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    5822     if (!status) {
    5823         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
    5824         return false;
    5825     }
    5826     psS64 guide_id = psMetadataLookupS64(&status, md, "guide_id");
    5827     if (!status) {
    5828         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item guide_id");
     5630    char* state = psMetadataLookupPtr(&status, md, "state");
     5631    if (!status) {
     5632        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item state");
    58295633        return false;
    58305634    }
     
    58345638        return false;
    58355639    }
     5640    char* workdir_state = psMetadataLookupPtr(&status, md, "workdir_state");
     5641    if (!status) {
     5642        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item workdir_state");
     5643        return false;
     5644    }
    58365645    char* label = psMetadataLookupPtr(&status, md, "label");
    58375646    if (!status) {
     
    58555664    }
    58565665
    5857     return chipPendingExpRowAlloc(chip_id, exp_tag, guide_id, workdir, label, reduction, expgroup, dvodb);
    5858 }
    5859 psArray *chipPendingExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     5666    return chipRunRowAlloc(chip_id, state, workdir, workdir_state, label, reduction, expgroup, dvodb);
     5667}
     5668psArray *chipRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    58605669{
    58615670    psArray         *rowSet;
     
    58635672    psU64           i;
    58645673
    5865     rowSet = psDBSelectRows(dbh, CHIPPENDINGEXP_TABLE_NAME, where, limit);
     5674    rowSet = psDBSelectRows(dbh, CHIPRUN_TABLE_NAME, where, limit);
    58665675    if (!rowSet) {
    58675676        return NULL;
     
    58735682
    58745683    for (i = 0; i < rowSet->n; i++) {
    5875         chipPendingExpRow *object = chipPendingExpObjectFromMetadata(rowSet->data[i]);
     5684        chipRunRow *object = chipRunObjectFromMetadata(rowSet->data[i]);
    58765685        psArrayAdd(returnSet, 0, object);
    58775686        psFree(object);
     
    58825691    return returnSet;
    58835692}
    5884 bool chipPendingExpDeleteObject(psDB *dbh, const chipPendingExpRow *object)
    5885 {
    5886     psMetadata *where = chipPendingExpMetadataFromObject(object);
    5887     long long count = psDBDeleteRows(dbh, CHIPPENDINGEXP_TABLE_NAME, where, 0);
     5693bool chipRunDeleteObject(psDB *dbh, const chipRunRow *object)
     5694{
     5695    psMetadata *where = chipRunMetadataFromObject(object);
     5696    long long count = psDBDeleteRows(dbh, CHIPRUN_TABLE_NAME, where, 0);
    58885697    psFree(where);
    58895698    if (count < 0) {
    5890         psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipPendingExp");
     5699        psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipRun");
    58915700        return false;
    58925701    }
     
    58945703        // XXX should this be a psAbort() instead?  It is possible that
    58955704        // having an object match multiple rows was by design.
    5896         psError(PS_ERR_UNKNOWN, true, "chipPendingExpRow object matched more then one row.  Check your database schema");
    5897         return false;
    5898     }
    5899 
    5900     return true;
    5901 }
    5902 long long chipPendingExpDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     5705        psError(PS_ERR_UNKNOWN, true, "chipRunRow object matched more then one row.  Check your database schema");
     5706        return false;
     5707    }
     5708
     5709    return true;
     5710}
     5711long long chipRunDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    59035712{
    59045713    long long       deleted = 0;
    59055714
    59065715    for (long long i = 0; i < objects->n; i++) {
    5907         chipPendingExpRow *object = objects->data[i];
    5908         psMetadata *where = chipPendingExpMetadataFromObject(object);
    5909         long long count = psDBDeleteRows(dbh, CHIPPENDINGEXP_TABLE_NAME, where, limit);
     5716        chipRunRow *object = objects->data[i];
     5717        psMetadata *where = chipRunMetadataFromObject(object);
     5718        long long count = psDBDeleteRows(dbh, CHIPRUN_TABLE_NAME, where, limit);
    59105719        psFree(where);
    59115720        if (count < 0) {
    5912             psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipPendingExp");
     5721            psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipRun");
    59135722            return count;
    59145723        }
     
    59195728    return deleted;
    59205729}
    5921 bool chipPendingExpPrintObjects(FILE *stream, psArray *objects, bool mdcf)
     5730bool chipRunPrintObjects(FILE *stream, psArray *objects, bool mdcf)
    59225731{
    59235732    PS_ASSERT_PTR_NON_NULL(objects, false);
     
    59255734    psMetadata *output = psMetadataAlloc();
    59265735    for (long i = 0; i < psArrayLength(objects); i++) {
    5927         psMetadata *md = chipPendingExpMetadataFromObject(objects->data[i]);
     5736        psMetadata *md = chipRunMetadataFromObject(objects->data[i]);
    59285737        if (!psMetadataAddMetadata(
    59295738            output,
    59305739            PS_LIST_TAIL,
    5931             CHIPPENDINGEXP_TABLE_NAME,
     5740            CHIPRUN_TABLE_NAME,
    59325741            PS_META_DUPLICATE_OK,
    59335742            NULL,
     
    59505759    return true;
    59515760}
    5952 bool chipPendingExpPrintObject(FILE *stream, chipPendingExpRow *object, bool mdcf)
     5761bool chipRunPrintObject(FILE *stream, chipRunRow *object, bool mdcf)
    59535762{
    59545763    PS_ASSERT_PTR_NON_NULL(object, false);
    59555764
    5956     psMetadata *md = chipPendingExpMetadataFromObject(object);
     5765    psMetadata *md = chipRunMetadataFromObject(object);
    59575766
    59585767    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     
    59655774    return true;
    59665775}
    5967 static void chipPendingImfileRowFree(chipPendingImfileRow *object);
    5968 
    5969 chipPendingImfileRow *chipPendingImfileRowAlloc(psS64 chip_id, const char *class_id, const char *uri)
    5970 {
    5971     chipPendingImfileRow *_object;
    5972 
    5973     _object = psAlloc(sizeof(chipPendingImfileRow));
    5974     psMemSetDeallocator(_object, (psFreeFunc)chipPendingImfileRowFree);
     5776static void chipInputImfileRowFree(chipInputImfileRow *object);
     5777
     5778chipInputImfileRow *chipInputImfileRowAlloc(psS64 chip_id, psS64 exp_id, const char *class_id)
     5779{
     5780    chipInputImfileRow *_object;
     5781
     5782    _object = psAlloc(sizeof(chipInputImfileRow));
     5783    psMemSetDeallocator(_object, (psFreeFunc)chipInputImfileRowFree);
    59755784
    59765785    _object->chip_id = chip_id;
     5786    _object->exp_id = exp_id;
    59775787    _object->class_id = psStringCopy(class_id);
    5978     _object->uri = psStringCopy(uri);
    59795788
    59805789    return _object;
    59815790}
    59825791
    5983 static void chipPendingImfileRowFree(chipPendingImfileRow *object)
     5792static void chipInputImfileRowFree(chipInputImfileRow *object)
    59845793{
    59855794    psFree(object->class_id);
    5986     psFree(object->uri);
    5987 }
    5988 
    5989 bool chipPendingImfileCreateTable(psDB *dbh)
     5795}
     5796
     5797bool chipInputImfileCreateTable(psDB *dbh)
    59905798{
    59915799    psMetadata *md = psMetadataAlloc();
    5992     if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key", 0)) {
     5800    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey (chip_id) ref chipRun(chip_id)", 0)) {
    59935801        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
     5802        psFree(md);
     5803        return false;
     5804    }
     5805    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key fkey (exp_id, class_id) ref rawImfile (exp_id, class_id)", 64)) {
     5806        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    59945807        psFree(md);
    59955808        return false;
     
    60005813        return false;
    60015814    }
    6002     if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) {
    6003         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
    6004         psFree(md);
    6005         return false;
    6006     }
    6007 
    6008     bool status = psDBCreateTable(dbh, CHIPPENDINGIMFILE_TABLE_NAME, md);
     5815
     5816    bool status = psDBCreateTable(dbh, CHIPINPUTIMFILE_TABLE_NAME, md);
    60095817
    60105818    psFree(md);
     
    60135821}
    60145822
    6015 bool chipPendingImfileDropTable(psDB *dbh)
    6016 {
    6017     return psDBDropTable(dbh, CHIPPENDINGIMFILE_TABLE_NAME);
    6018 }
    6019 
    6020 bool chipPendingImfileInsert(psDB * dbh, psS64 chip_id, const char *class_id, const char *uri)
     5823bool chipInputImfileDropTable(psDB *dbh)
     5824{
     5825    return psDBDropTable(dbh, CHIPINPUTIMFILE_TABLE_NAME);
     5826}
     5827
     5828bool chipInputImfileInsert(psDB * dbh, psS64 chip_id, psS64 exp_id, const char *class_id)
    60215829{
    60225830    psMetadata *md = psMetadataAlloc();
     
    60265834        return false;
    60275835    }
     5836    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     5837        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     5838        psFree(md);
     5839        return false;
     5840    }
    60285841    if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, class_id)) {
    60295842        psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
     
    60315844        return false;
    60325845    }
    6033     if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {
    6034         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
    6035         psFree(md);
    6036         return false;
    6037     }
    6038 
    6039     bool status = psDBInsertOneRow(dbh, CHIPPENDINGIMFILE_TABLE_NAME, md);
     5846
     5847    bool status = psDBInsertOneRow(dbh, CHIPINPUTIMFILE_TABLE_NAME, md);
    60405848    psFree(md);
    60415849
     
    60435851}
    60445852
    6045 long long chipPendingImfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     5853long long chipInputImfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    60465854{
    60475855    long long       deleted = 0;
    60485856
    6049     long long count = psDBDeleteRows(dbh, CHIPPENDINGIMFILE_TABLE_NAME, where, limit);
     5857    long long count = psDBDeleteRows(dbh, CHIPINPUTIMFILE_TABLE_NAME, where, limit);
    60505858    if (count < 0) {
    6051         psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipPendingImfile");
     5859        psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipInputImfile");
    60525860        return count;
    60535861
     
    60575865    return deleted;
    60585866}
    6059 bool chipPendingImfileInsertObject(psDB *dbh, chipPendingImfileRow *object)
    6060 {
    6061     return chipPendingImfileInsert(dbh, object->chip_id, object->class_id, object->uri);
    6062 }
    6063 
    6064 bool chipPendingImfileInsertObjects(psDB *dbh, psArray *objects)
     5867bool chipInputImfileInsertObject(psDB *dbh, chipInputImfileRow *object)
     5868{
     5869    return chipInputImfileInsert(dbh, object->chip_id, object->exp_id, object->class_id);
     5870}
     5871
     5872bool chipInputImfileInsertObjects(psDB *dbh, psArray *objects)
    60655873{
    60665874    for (long i = 0; i < psArrayLength(objects); i++) {
    6067         if (!chipPendingImfileInsertObject(dbh, objects->data[i])) {
     5875        if (!chipInputImfileInsertObject(dbh, objects->data[i])) {
    60685876            return false;
    60695877        }
     
    60735881}
    60745882
    6075 bool chipPendingImfileInsertFits(psDB *dbh, const psFits *fits)
     5883bool chipInputImfileInsertFits(psDB *dbh, const psFits *fits)
    60765884{
    60775885    psArray         *rowSet;
    60785886
    6079     // move to (the first?) extension named  CHIPPENDINGIMFILE_TABLE_NAME
    6080     if (!psFitsMoveExtName(fits, CHIPPENDINGIMFILE_TABLE_NAME)) {
    6081         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", CHIPPENDINGIMFILE_TABLE_NAME);
     5887    // move to (the first?) extension named  CHIPINPUTIMFILE_TABLE_NAME
     5888    if (!psFitsMoveExtName(fits, CHIPINPUTIMFILE_TABLE_NAME)) {
     5889        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", CHIPINPUTIMFILE_TABLE_NAME);
    60825890        return false;
    60835891    }
     
    60975905    }
    60985906
    6099     if (!psDBInsertRows(dbh, CHIPPENDINGIMFILE_TABLE_NAME, rowSet)) {
     5907    if (!psDBInsertRows(dbh, CHIPINPUTIMFILE_TABLE_NAME, rowSet)) {
    61005908        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    61015909        psFree(rowSet);
     
    61085916}
    61095917
    6110 bool chipPendingImfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     5918bool chipInputImfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    61115919{
    61125920    psArray         *rowSet;
    61135921
    6114     rowSet = psDBSelectRows(dbh, CHIPPENDINGIMFILE_TABLE_NAME, where, limit);
     5922    rowSet = psDBSelectRows(dbh, CHIPINPUTIMFILE_TABLE_NAME, where, limit);
    61155923    if (!rowSet) {
    61165924        return false;
     
    61185926
    61195927    // output to fits
    6120     if (!psFitsWriteTable(fits, NULL, rowSet, CHIPPENDINGIMFILE_TABLE_NAME)) {
     5928    if (!psFitsWriteTable(fits, NULL, rowSet, CHIPINPUTIMFILE_TABLE_NAME)) {
    61215929        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    61225930        psFree(rowSet);
     
    61295937}
    61305938
    6131 psMetadata *chipPendingImfileMetadataFromObject(const chipPendingImfileRow *object)
     5939psMetadata *chipInputImfileMetadataFromObject(const chipInputImfileRow *object)
    61325940{
    61335941    psMetadata *md = psMetadataAlloc();
     
    61375945        return false;
    61385946    }
     5947    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     5948        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     5949        psFree(md);
     5950        return false;
     5951    }
    61395952    if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, object->class_id)) {
    61405953        psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
     
    61425955        return false;
    61435956    }
    6144     if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {
    6145         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
    6146         psFree(md);
    6147         return false;
    6148     }
    61495957
    61505958
     
    61525960}
    61535961
    6154 chipPendingImfileRow *chipPendingImfileObjectFromMetadata(psMetadata *md)
     5962chipInputImfileRow *chipInputImfileObjectFromMetadata(psMetadata *md)
    61555963{
    61565964
     
    61615969        return false;
    61625970    }
     5971    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     5972    if (!status) {
     5973        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
     5974        return false;
     5975    }
    61635976    char* class_id = psMetadataLookupPtr(&status, md, "class_id");
    61645977    if (!status) {
     
    61665979        return false;
    61675980    }
    6168     char* uri = psMetadataLookupPtr(&status, md, "uri");
    6169     if (!status) {
    6170         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri");
    6171         return false;
    6172     }
    6173 
    6174     return chipPendingImfileRowAlloc(chip_id, class_id, uri);
    6175 }
    6176 psArray *chipPendingImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     5981
     5982    return chipInputImfileRowAlloc(chip_id, exp_id, class_id);
     5983}
     5984psArray *chipInputImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    61775985{
    61785986    psArray         *rowSet;
     
    61805988    psU64           i;
    61815989
    6182     rowSet = psDBSelectRows(dbh, CHIPPENDINGIMFILE_TABLE_NAME, where, limit);
     5990    rowSet = psDBSelectRows(dbh, CHIPINPUTIMFILE_TABLE_NAME, where, limit);
    61835991    if (!rowSet) {
    61845992        return NULL;
     
    61905998
    61915999    for (i = 0; i < rowSet->n; i++) {
    6192         chipPendingImfileRow *object = chipPendingImfileObjectFromMetadata(rowSet->data[i]);
     6000        chipInputImfileRow *object = chipInputImfileObjectFromMetadata(rowSet->data[i]);
    61936001        psArrayAdd(returnSet, 0, object);
    61946002        psFree(object);
     
    61996007    return returnSet;
    62006008}
    6201 bool chipPendingImfileDeleteObject(psDB *dbh, const chipPendingImfileRow *object)
    6202 {
    6203     psMetadata *where = chipPendingImfileMetadataFromObject(object);
    6204     long long count = psDBDeleteRows(dbh, CHIPPENDINGIMFILE_TABLE_NAME, where, 0);
     6009bool chipInputImfileDeleteObject(psDB *dbh, const chipInputImfileRow *object)
     6010{
     6011    psMetadata *where = chipInputImfileMetadataFromObject(object);
     6012    long long count = psDBDeleteRows(dbh, CHIPINPUTIMFILE_TABLE_NAME, where, 0);
    62056013    psFree(where);
    62066014    if (count < 0) {
    6207         psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipPendingImfile");
     6015        psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipInputImfile");
    62086016        return false;
    62096017    }
     
    62116019        // XXX should this be a psAbort() instead?  It is possible that
    62126020        // having an object match multiple rows was by design.
    6213         psError(PS_ERR_UNKNOWN, true, "chipPendingImfileRow object matched more then one row.  Check your database schema");
    6214         return false;
    6215     }
    6216 
    6217     return true;
    6218 }
    6219 long long chipPendingImfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     6021        psError(PS_ERR_UNKNOWN, true, "chipInputImfileRow object matched more then one row.  Check your database schema");
     6022        return false;
     6023    }
     6024
     6025    return true;
     6026}
     6027long long chipInputImfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    62206028{
    62216029    long long       deleted = 0;
    62226030
    62236031    for (long long i = 0; i < objects->n; i++) {
    6224         chipPendingImfileRow *object = objects->data[i];
    6225         psMetadata *where = chipPendingImfileMetadataFromObject(object);
    6226         long long count = psDBDeleteRows(dbh, CHIPPENDINGIMFILE_TABLE_NAME, where, limit);
     6032        chipInputImfileRow *object = objects->data[i];
     6033        psMetadata *where = chipInputImfileMetadataFromObject(object);
     6034        long long count = psDBDeleteRows(dbh, CHIPINPUTIMFILE_TABLE_NAME, where, limit);
    62276035        psFree(where);
    62286036        if (count < 0) {
    6229             psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipPendingImfile");
     6037            psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipInputImfile");
    62306038            return count;
    62316039        }
     
    62366044    return deleted;
    62376045}
    6238 bool chipPendingImfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
     6046bool chipInputImfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
    62396047{
    62406048    PS_ASSERT_PTR_NON_NULL(objects, false);
     
    62426050    psMetadata *output = psMetadataAlloc();
    62436051    for (long i = 0; i < psArrayLength(objects); i++) {
    6244         psMetadata *md = chipPendingImfileMetadataFromObject(objects->data[i]);
     6052        psMetadata *md = chipInputImfileMetadataFromObject(objects->data[i]);
    62456053        if (!psMetadataAddMetadata(
    62466054            output,
    62476055            PS_LIST_TAIL,
    6248             CHIPPENDINGIMFILE_TABLE_NAME,
     6056            CHIPINPUTIMFILE_TABLE_NAME,
    62496057            PS_META_DUPLICATE_OK,
    62506058            NULL,
     
    62676075    return true;
    62686076}
    6269 bool chipPendingImfilePrintObject(FILE *stream, chipPendingImfileRow *object, bool mdcf)
     6077bool chipInputImfilePrintObject(FILE *stream, chipInputImfileRow *object, bool mdcf)
    62706078{
    62716079    PS_ASSERT_PTR_NON_NULL(object, false);
    62726080
    6273     psMetadata *md = chipPendingImfileMetadataFromObject(object);
     6081    psMetadata *md = chipInputImfileMetadataFromObject(object);
    62746082
    62756083    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     
    62826090    return true;
    62836091}
    6284 static void chipProcessedExpRowFree(chipProcessedExpRow *object);
    6285 
    6286 chipProcessedExpRow *chipProcessedExpRowAlloc(psS64 chip_id, const char *exp_tag, psS64 guide_id, const char *workdir, const char *label, const char *reduction, const char *expgroup, const char *dvodb)
    6287 {
    6288     chipProcessedExpRow *_object;
    6289 
    6290     _object = psAlloc(sizeof(chipProcessedExpRow));
    6291     psMemSetDeallocator(_object, (psFreeFunc)chipProcessedExpRowFree);
    6292 
    6293     _object->chip_id = chip_id;
    6294     _object->exp_tag = psStringCopy(exp_tag);
    6295     _object->guide_id = guide_id;
    6296     _object->workdir = psStringCopy(workdir);
    6297     _object->label = psStringCopy(label);
    6298     _object->reduction = psStringCopy(reduction);
    6299     _object->expgroup = psStringCopy(expgroup);
    6300     _object->dvodb = psStringCopy(dvodb);
    6301 
    6302     return _object;
    6303 }
    6304 
    6305 static void chipProcessedExpRowFree(chipProcessedExpRow *object)
    6306 {
    6307     psFree(object->exp_tag);
    6308     psFree(object->workdir);
    6309     psFree(object->label);
    6310     psFree(object->reduction);
    6311     psFree(object->expgroup);
    6312     psFree(object->dvodb);
    6313 }
    6314 
    6315 bool chipProcessedExpCreateTable(psDB *dbh)
    6316 {
    6317     psMetadata *md = psMetadataAlloc();
    6318     if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key", 0)) {
    6319         psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
    6320         psFree(md);
    6321         return false;
    6322     }
    6323     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
    6324         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    6325         psFree(md);
    6326         return false;
    6327     }
    6328     if (!psMetadataAdd(md, PS_LIST_TAIL, "guide_id", PS_DATA_S64, "Not NULL", 0)) {
    6329         psError(PS_ERR_UNKNOWN, false, "failed to add item guide_id");
    6330         psFree(md);
    6331         return false;
    6332     }
    6333     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, "255")) {
    6334         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    6335         psFree(md);
    6336         return false;
    6337     }
    6338     if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "key", "64")) {
    6339         psError(PS_ERR_UNKNOWN, false, "failed to add item label");
    6340         psFree(md);
    6341         return false;
    6342     }
    6343     if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, "64")) {
    6344         psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
    6345         psFree(md);
    6346         return false;
    6347     }
    6348     if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, "key", "64")) {
    6349         psError(PS_ERR_UNKNOWN, false, "failed to add item expgroup");
    6350         psFree(md);
    6351         return false;
    6352     }
    6353     if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, "255")) {
    6354         psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
    6355         psFree(md);
    6356         return false;
    6357     }
    6358 
    6359     bool status = psDBCreateTable(dbh, CHIPPROCESSEDEXP_TABLE_NAME, md);
    6360 
    6361     psFree(md);
    6362 
    6363     return status;
    6364 }
    6365 
    6366 bool chipProcessedExpDropTable(psDB *dbh)
    6367 {
    6368     return psDBDropTable(dbh, CHIPPROCESSEDEXP_TABLE_NAME);
    6369 }
    6370 
    6371 bool chipProcessedExpInsert(psDB * dbh, psS64 chip_id, const char *exp_tag, psS64 guide_id, const char *workdir, const char *label, const char *reduction, const char *expgroup, const char *dvodb)
    6372 {
    6373     psMetadata *md = psMetadataAlloc();
    6374     if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, chip_id)) {
    6375         psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
    6376         psFree(md);
    6377         return false;
    6378     }
    6379     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    6380         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    6381         psFree(md);
    6382         return false;
    6383     }
    6384     if (!psMetadataAdd(md, PS_LIST_TAIL, "guide_id", PS_DATA_S64, NULL, guide_id)) {
    6385         psError(PS_ERR_UNKNOWN, false, "failed to add item guide_id");
    6386         psFree(md);
    6387         return false;
    6388     }
    6389     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) {
    6390         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    6391         psFree(md);
    6392         return false;
    6393     }
    6394     if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, label)) {
    6395         psError(PS_ERR_UNKNOWN, false, "failed to add item label");
    6396         psFree(md);
    6397         return false;
    6398     }
    6399     if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, reduction)) {
    6400         psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
    6401         psFree(md);
    6402         return false;
    6403     }
    6404     if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, NULL, expgroup)) {
    6405         psError(PS_ERR_UNKNOWN, false, "failed to add item expgroup");
    6406         psFree(md);
    6407         return false;
    6408     }
    6409     if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, dvodb)) {
    6410         psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
    6411         psFree(md);
    6412         return false;
    6413     }
    6414 
    6415     bool status = psDBInsertOneRow(dbh, CHIPPROCESSEDEXP_TABLE_NAME, md);
    6416     psFree(md);
    6417 
    6418     return status;
    6419 }
    6420 
    6421 long long chipProcessedExpDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    6422 {
    6423     long long       deleted = 0;
    6424 
    6425     long long count = psDBDeleteRows(dbh, CHIPPROCESSEDEXP_TABLE_NAME, where, limit);
    6426     if (count < 0) {
    6427         psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipProcessedExp");
    6428         return count;
    6429 
    6430         deleted += count;
    6431     }
    6432 
    6433     return deleted;
    6434 }
    6435 bool chipProcessedExpInsertObject(psDB *dbh, chipProcessedExpRow *object)
    6436 {
    6437     return chipProcessedExpInsert(dbh, object->chip_id, object->exp_tag, object->guide_id, object->workdir, object->label, object->reduction, object->expgroup, object->dvodb);
    6438 }
    6439 
    6440 bool chipProcessedExpInsertObjects(psDB *dbh, psArray *objects)
    6441 {
    6442     for (long i = 0; i < psArrayLength(objects); i++) {
    6443         if (!chipProcessedExpInsertObject(dbh, objects->data[i])) {
    6444             return false;
    6445         }
    6446     }
    6447 
    6448     return true;
    6449 }
    6450 
    6451 bool chipProcessedExpInsertFits(psDB *dbh, const psFits *fits)
    6452 {
    6453     psArray         *rowSet;
    6454 
    6455     // move to (the first?) extension named  CHIPPROCESSEDEXP_TABLE_NAME
    6456     if (!psFitsMoveExtName(fits, CHIPPROCESSEDEXP_TABLE_NAME)) {
    6457         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", CHIPPROCESSEDEXP_TABLE_NAME);
    6458         return false;
    6459     }
    6460 
    6461     // check HDU type
    6462     if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
    6463         psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
    6464         return false;
    6465     }
    6466 
    6467     // read fits table
    6468     rowSet = psFitsReadTable(fits);
    6469     if (!rowSet) {
    6470         psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
    6471         psFree(rowSet);
    6472         return false;
    6473     }
    6474 
    6475     if (!psDBInsertRows(dbh, CHIPPROCESSEDEXP_TABLE_NAME, rowSet)) {
    6476         psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    6477         psFree(rowSet);
    6478         return false;
    6479     }
    6480 
    6481     psFree(rowSet);
    6482 
    6483     return true;
    6484 }
    6485 
    6486 bool chipProcessedExpSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    6487 {
    6488     psArray         *rowSet;
    6489 
    6490     rowSet = psDBSelectRows(dbh, CHIPPROCESSEDEXP_TABLE_NAME, where, limit);
    6491     if (!rowSet) {
    6492         return false;
    6493     }
    6494 
    6495     // output to fits
    6496     if (!psFitsWriteTable(fits, NULL, rowSet, CHIPPROCESSEDEXP_TABLE_NAME)) {
    6497         psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    6498         psFree(rowSet);
    6499         return false;
    6500     }
    6501 
    6502     psFree(rowSet);
    6503 
    6504     return true;
    6505 }
    6506 
    6507 psMetadata *chipProcessedExpMetadataFromObject(const chipProcessedExpRow *object)
    6508 {
    6509     psMetadata *md = psMetadataAlloc();
    6510     if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, object->chip_id)) {
    6511         psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
    6512         psFree(md);
    6513         return false;
    6514     }
    6515     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    6516         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    6517         psFree(md);
    6518         return false;
    6519     }
    6520     if (!psMetadataAdd(md, PS_LIST_TAIL, "guide_id", PS_DATA_S64, NULL, object->guide_id)) {
    6521         psError(PS_ERR_UNKNOWN, false, "failed to add item guide_id");
    6522         psFree(md);
    6523         return false;
    6524     }
    6525     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, object->workdir)) {
    6526         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    6527         psFree(md);
    6528         return false;
    6529     }
    6530     if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, object->label)) {
    6531         psError(PS_ERR_UNKNOWN, false, "failed to add item label");
    6532         psFree(md);
    6533         return false;
    6534     }
    6535     if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, object->reduction)) {
    6536         psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
    6537         psFree(md);
    6538         return false;
    6539     }
    6540     if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, NULL, object->expgroup)) {
    6541         psError(PS_ERR_UNKNOWN, false, "failed to add item expgroup");
    6542         psFree(md);
    6543         return false;
    6544     }
    6545     if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, object->dvodb)) {
    6546         psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
    6547         psFree(md);
    6548         return false;
    6549     }
    6550 
    6551 
    6552     return md;
    6553 }
    6554 
    6555 chipProcessedExpRow *chipProcessedExpObjectFromMetadata(psMetadata *md)
    6556 {
    6557 
    6558 bool status = false;
    6559     psS64 chip_id = psMetadataLookupS64(&status, md, "chip_id");
    6560     if (!status) {
    6561         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item chip_id");
    6562         return false;
    6563     }
    6564     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    6565     if (!status) {
    6566         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
    6567         return false;
    6568     }
    6569     psS64 guide_id = psMetadataLookupS64(&status, md, "guide_id");
    6570     if (!status) {
    6571         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item guide_id");
    6572         return false;
    6573     }
    6574     char* workdir = psMetadataLookupPtr(&status, md, "workdir");
    6575     if (!status) {
    6576         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item workdir");
    6577         return false;
    6578     }
    6579     char* label = psMetadataLookupPtr(&status, md, "label");
    6580     if (!status) {
    6581         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item label");
    6582         return false;
    6583     }
    6584     char* reduction = psMetadataLookupPtr(&status, md, "reduction");
    6585     if (!status) {
    6586         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reduction");
    6587         return false;
    6588     }
    6589     char* expgroup = psMetadataLookupPtr(&status, md, "expgroup");
    6590     if (!status) {
    6591         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item expgroup");
    6592         return false;
    6593     }
    6594     char* dvodb = psMetadataLookupPtr(&status, md, "dvodb");
    6595     if (!status) {
    6596         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dvodb");
    6597         return false;
    6598     }
    6599 
    6600     return chipProcessedExpRowAlloc(chip_id, exp_tag, guide_id, workdir, label, reduction, expgroup, dvodb);
    6601 }
    6602 psArray *chipProcessedExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    6603 {
    6604     psArray         *rowSet;
    6605     psArray         *returnSet;
    6606     psU64           i;
    6607 
    6608     rowSet = psDBSelectRows(dbh, CHIPPROCESSEDEXP_TABLE_NAME, where, limit);
    6609     if (!rowSet) {
    6610         return NULL;
    6611     }
    6612 
    6613     // convert psMetadata rows to row objects
    6614 
    6615     returnSet = psArrayAllocEmpty(rowSet->n);
    6616 
    6617     for (i = 0; i < rowSet->n; i++) {
    6618         chipProcessedExpRow *object = chipProcessedExpObjectFromMetadata(rowSet->data[i]);
    6619         psArrayAdd(returnSet, 0, object);
    6620         psFree(object);
    6621     }
    6622 
    6623     psFree(rowSet);
    6624 
    6625     return returnSet;
    6626 }
    6627 bool chipProcessedExpDeleteObject(psDB *dbh, const chipProcessedExpRow *object)
    6628 {
    6629     psMetadata *where = chipProcessedExpMetadataFromObject(object);
    6630     long long count = psDBDeleteRows(dbh, CHIPPROCESSEDEXP_TABLE_NAME, where, 0);
    6631     psFree(where);
    6632     if (count < 0) {
    6633         psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipProcessedExp");
    6634         return false;
    6635     }
    6636     if (count > 1) {
    6637         // XXX should this be a psAbort() instead?  It is possible that
    6638         // having an object match multiple rows was by design.
    6639         psError(PS_ERR_UNKNOWN, true, "chipProcessedExpRow object matched more then one row.  Check your database schema");
    6640         return false;
    6641     }
    6642 
    6643     return true;
    6644 }
    6645 long long chipProcessedExpDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    6646 {
    6647     long long       deleted = 0;
    6648 
    6649     for (long long i = 0; i < objects->n; i++) {
    6650         chipProcessedExpRow *object = objects->data[i];
    6651         psMetadata *where = chipProcessedExpMetadataFromObject(object);
    6652         long long count = psDBDeleteRows(dbh, CHIPPROCESSEDEXP_TABLE_NAME, where, limit);
    6653         psFree(where);
    6654         if (count < 0) {
    6655             psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipProcessedExp");
    6656             return count;
    6657         }
    6658 
    6659         deleted += count;
    6660     }
    6661 
    6662     return deleted;
    6663 }
    6664 bool chipProcessedExpPrintObjects(FILE *stream, psArray *objects, bool mdcf)
    6665 {
    6666     PS_ASSERT_PTR_NON_NULL(objects, false);
    6667 
    6668     psMetadata *output = psMetadataAlloc();
    6669     for (long i = 0; i < psArrayLength(objects); i++) {
    6670         psMetadata *md = chipProcessedExpMetadataFromObject(objects->data[i]);
    6671         if (!psMetadataAddMetadata(
    6672             output,
    6673             PS_LIST_TAIL,
    6674             CHIPPROCESSEDEXP_TABLE_NAME,
    6675             PS_META_DUPLICATE_OK,
    6676             NULL,
    6677             md
    6678         )) {
    6679             psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
    6680             psFree(md);
    6681             psFree(output);
    6682             return false;
    6683         }
    6684         psFree(md);
    6685     }
    6686 
    6687     if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
    6688         psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
    6689         psFree(output);
    6690     }
    6691     psFree(output);
    6692 
    6693     return true;
    6694 }
    6695 bool chipProcessedExpPrintObject(FILE *stream, chipProcessedExpRow *object, bool mdcf)
    6696 {
    6697     PS_ASSERT_PTR_NON_NULL(object, false);
    6698 
    6699     psMetadata *md = chipProcessedExpMetadataFromObject(object);
    6700 
    6701     if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
    6702         psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
    6703         psFree(md);
    6704     }
    6705 
    6706     psFree(md);
    6707 
    6708     return true;
    6709 }
    6710 static void chipMaskRowFree(chipMaskRow *object);
    6711 
    6712 chipMaskRow *chipMaskRowAlloc(const char *label)
    6713 {
    6714     chipMaskRow     *_object;
    6715 
    6716     _object = psAlloc(sizeof(chipMaskRow));
    6717     psMemSetDeallocator(_object, (psFreeFunc)chipMaskRowFree);
    6718 
    6719     _object->label = psStringCopy(label);
    6720 
    6721     return _object;
    6722 }
    6723 
    6724 static void chipMaskRowFree(chipMaskRow *object)
    6725 {
    6726     psFree(object->label);
    6727 }
    6728 
    6729 bool chipMaskCreateTable(psDB *dbh)
    6730 {
    6731     psMetadata *md = psMetadataAlloc();
    6732     if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "Primary Key", "64")) {
    6733         psError(PS_ERR_UNKNOWN, false, "failed to add item label");
    6734         psFree(md);
    6735         return false;
    6736     }
    6737 
    6738     bool status = psDBCreateTable(dbh, CHIPMASK_TABLE_NAME, md);
    6739 
    6740     psFree(md);
    6741 
    6742     return status;
    6743 }
    6744 
    6745 bool chipMaskDropTable(psDB *dbh)
    6746 {
    6747     return psDBDropTable(dbh, CHIPMASK_TABLE_NAME);
    6748 }
    6749 
    6750 bool chipMaskInsert(psDB * dbh, const char *label)
    6751 {
    6752     psMetadata *md = psMetadataAlloc();
    6753     if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, label)) {
    6754         psError(PS_ERR_UNKNOWN, false, "failed to add item label");
    6755         psFree(md);
    6756         return false;
    6757     }
    6758 
    6759     bool status = psDBInsertOneRow(dbh, CHIPMASK_TABLE_NAME, md);
    6760     psFree(md);
    6761 
    6762     return status;
    6763 }
    6764 
    6765 long long chipMaskDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    6766 {
    6767     long long       deleted = 0;
    6768 
    6769     long long count = psDBDeleteRows(dbh, CHIPMASK_TABLE_NAME, where, limit);
    6770     if (count < 0) {
    6771         psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipMask");
    6772         return count;
    6773 
    6774         deleted += count;
    6775     }
    6776 
    6777     return deleted;
    6778 }
    6779 bool chipMaskInsertObject(psDB *dbh, chipMaskRow *object)
    6780 {
    6781     return chipMaskInsert(dbh, object->label);
    6782 }
    6783 
    6784 bool chipMaskInsertObjects(psDB *dbh, psArray *objects)
    6785 {
    6786     for (long i = 0; i < psArrayLength(objects); i++) {
    6787         if (!chipMaskInsertObject(dbh, objects->data[i])) {
    6788             return false;
    6789         }
    6790     }
    6791 
    6792     return true;
    6793 }
    6794 
    6795 bool chipMaskInsertFits(psDB *dbh, const psFits *fits)
    6796 {
    6797     psArray         *rowSet;
    6798 
    6799     // move to (the first?) extension named  CHIPMASK_TABLE_NAME
    6800     if (!psFitsMoveExtName(fits, CHIPMASK_TABLE_NAME)) {
    6801         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", CHIPMASK_TABLE_NAME);
    6802         return false;
    6803     }
    6804 
    6805     // check HDU type
    6806     if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
    6807         psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
    6808         return false;
    6809     }
    6810 
    6811     // read fits table
    6812     rowSet = psFitsReadTable(fits);
    6813     if (!rowSet) {
    6814         psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
    6815         psFree(rowSet);
    6816         return false;
    6817     }
    6818 
    6819     if (!psDBInsertRows(dbh, CHIPMASK_TABLE_NAME, rowSet)) {
    6820         psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    6821         psFree(rowSet);
    6822         return false;
    6823     }
    6824 
    6825     psFree(rowSet);
    6826 
    6827     return true;
    6828 }
    6829 
    6830 bool chipMaskSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    6831 {
    6832     psArray         *rowSet;
    6833 
    6834     rowSet = psDBSelectRows(dbh, CHIPMASK_TABLE_NAME, where, limit);
    6835     if (!rowSet) {
    6836         return false;
    6837     }
    6838 
    6839     // output to fits
    6840     if (!psFitsWriteTable(fits, NULL, rowSet, CHIPMASK_TABLE_NAME)) {
    6841         psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    6842         psFree(rowSet);
    6843         return false;
    6844     }
    6845 
    6846     psFree(rowSet);
    6847 
    6848     return true;
    6849 }
    6850 
    6851 psMetadata *chipMaskMetadataFromObject(const chipMaskRow *object)
    6852 {
    6853     psMetadata *md = psMetadataAlloc();
    6854     if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, object->label)) {
    6855         psError(PS_ERR_UNKNOWN, false, "failed to add item label");
    6856         psFree(md);
    6857         return false;
    6858     }
    6859 
    6860 
    6861     return md;
    6862 }
    6863 
    6864 chipMaskRow *chipMaskObjectFromMetadata(psMetadata *md)
    6865 {
    6866 
    6867 bool status = false;
    6868     char* label = psMetadataLookupPtr(&status, md, "label");
    6869     if (!status) {
    6870         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item label");
    6871         return false;
    6872     }
    6873 
    6874     return chipMaskRowAlloc(label);
    6875 }
    6876 psArray *chipMaskSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    6877 {
    6878     psArray         *rowSet;
    6879     psArray         *returnSet;
    6880     psU64           i;
    6881 
    6882     rowSet = psDBSelectRows(dbh, CHIPMASK_TABLE_NAME, where, limit);
    6883     if (!rowSet) {
    6884         return NULL;
    6885     }
    6886 
    6887     // convert psMetadata rows to row objects
    6888 
    6889     returnSet = psArrayAllocEmpty(rowSet->n);
    6890 
    6891     for (i = 0; i < rowSet->n; i++) {
    6892         chipMaskRow *object = chipMaskObjectFromMetadata(rowSet->data[i]);
    6893         psArrayAdd(returnSet, 0, object);
    6894         psFree(object);
    6895     }
    6896 
    6897     psFree(rowSet);
    6898 
    6899     return returnSet;
    6900 }
    6901 bool chipMaskDeleteObject(psDB *dbh, const chipMaskRow *object)
    6902 {
    6903     psMetadata *where = chipMaskMetadataFromObject(object);
    6904     long long count = psDBDeleteRows(dbh, CHIPMASK_TABLE_NAME, where, 0);
    6905     psFree(where);
    6906     if (count < 0) {
    6907         psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipMask");
    6908         return false;
    6909     }
    6910     if (count > 1) {
    6911         // XXX should this be a psAbort() instead?  It is possible that
    6912         // having an object match multiple rows was by design.
    6913         psError(PS_ERR_UNKNOWN, true, "chipMaskRow object matched more then one row.  Check your database schema");
    6914         return false;
    6915     }
    6916 
    6917     return true;
    6918 }
    6919 long long chipMaskDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    6920 {
    6921     long long       deleted = 0;
    6922 
    6923     for (long long i = 0; i < objects->n; i++) {
    6924         chipMaskRow *object = objects->data[i];
    6925         psMetadata *where = chipMaskMetadataFromObject(object);
    6926         long long count = psDBDeleteRows(dbh, CHIPMASK_TABLE_NAME, where, limit);
    6927         psFree(where);
    6928         if (count < 0) {
    6929             psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipMask");
    6930             return count;
    6931         }
    6932 
    6933         deleted += count;
    6934     }
    6935 
    6936     return deleted;
    6937 }
    6938 bool chipMaskPrintObjects(FILE *stream, psArray *objects, bool mdcf)
    6939 {
    6940     PS_ASSERT_PTR_NON_NULL(objects, false);
    6941 
    6942     psMetadata *output = psMetadataAlloc();
    6943     for (long i = 0; i < psArrayLength(objects); i++) {
    6944         psMetadata *md = chipMaskMetadataFromObject(objects->data[i]);
    6945         if (!psMetadataAddMetadata(
    6946             output,
    6947             PS_LIST_TAIL,
    6948             CHIPMASK_TABLE_NAME,
    6949             PS_META_DUPLICATE_OK,
    6950             NULL,
    6951             md
    6952         )) {
    6953             psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
    6954             psFree(md);
    6955             psFree(output);
    6956             return false;
    6957         }
    6958         psFree(md);
    6959     }
    6960 
    6961     if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
    6962         psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
    6963         psFree(output);
    6964     }
    6965     psFree(output);
    6966 
    6967     return true;
    6968 }
    6969 bool chipMaskPrintObject(FILE *stream, chipMaskRow *object, bool mdcf)
    6970 {
    6971     PS_ASSERT_PTR_NON_NULL(object, false);
    6972 
    6973     psMetadata *md = chipMaskMetadataFromObject(object);
    6974 
    6975     if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
    6976         psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
    6977         psFree(md);
    6978     }
    6979 
    6980     psFree(md);
    6981 
    6982     return true;
    6983 }
    69846092static void chipProcessedImfileRowFree(chipProcessedImfileRow *object);
    69856093
    6986 chipProcessedImfileRow *chipProcessedImfileRowAlloc(psS64 chip_id, const char *class_id, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 bias, psF32 bias_stdev, psF32 fringe_0, psF32 fringe_1, psF32 fringe_2, psF32 sigma_ra, psF32 sigma_dec, psF32 ap_resid, psF32 ap_resid_stdev, psF32 fwhm, psF32 fwhm_range, psS32 n_stars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
     6094chipProcessedImfileRow *chipProcessedImfileRowAlloc(psS64 chip_id, psS64 exp_id, const char *class_id, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 bias, psF32 bias_stdev, psF32 fringe_0, psF32 fringe_1, psF32 fringe_2, psF32 sigma_ra, psF32 sigma_dec, psF32 ap_resid, psF32 ap_resid_stdev, psF32 fwhm, psF32 fwhm_range, psS32 n_stars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
    69876095{
    69886096    chipProcessedImfileRow *_object;
     
    69926100
    69936101    _object->chip_id = chip_id;
     6102    _object->exp_id = exp_id;
    69946103    _object->class_id = psStringCopy(class_id);
    69956104    _object->uri = psStringCopy(uri);
     
    70286137{
    70296138    psMetadata *md = psMetadataAlloc();
    7030     if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key", 0)) {
     6139    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey (chip_id, exp_id, class_id) ref chipInputImfile(chip_id, exp_id, class_id)", 0)) {
    70316140        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
     6141        psFree(md);
     6142        return false;
     6143    }
     6144    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key", 64)) {
     6145        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    70326146        psFree(md);
    70336147        return false;
     
    71566270}
    71576271
    7158 bool chipProcessedImfileInsert(psDB * dbh, psS64 chip_id, const char *class_id, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 bias, psF32 bias_stdev, psF32 fringe_0, psF32 fringe_1, psF32 fringe_2, psF32 sigma_ra, psF32 sigma_dec, psF32 ap_resid, psF32 ap_resid_stdev, psF32 fwhm, psF32 fwhm_range, psS32 n_stars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
     6272bool chipProcessedImfileInsert(psDB * dbh, psS64 chip_id, psS64 exp_id, const char *class_id, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 bias, psF32 bias_stdev, psF32 fringe_0, psF32 fringe_1, psF32 fringe_2, psF32 sigma_ra, psF32 sigma_dec, psF32 ap_resid, psF32 ap_resid_stdev, psF32 fwhm, psF32 fwhm_range, psS32 n_stars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
    71596273{
    71606274    psMetadata *md = psMetadataAlloc();
    71616275    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, chip_id)) {
    71626276        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
     6277        psFree(md);
     6278        return false;
     6279    }
     6280    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     6281        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    71636282        psFree(md);
    71646283        return false;
     
    72976416bool chipProcessedImfileInsertObject(psDB *dbh, chipProcessedImfileRow *object)
    72986417{
    7299     return chipProcessedImfileInsert(dbh, object->chip_id, object->class_id, object->uri, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bias, object->bias_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->sigma_ra, object->sigma_dec, object->ap_resid, object->ap_resid_stdev, object->fwhm, object->fwhm_range, object->n_stars, object->n_extended, object->n_cr, object->n_astrom, object->path_base, object->fault);
     6418    return chipProcessedImfileInsert(dbh, object->chip_id, object->exp_id, object->class_id, object->uri, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bias, object->bias_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->sigma_ra, object->sigma_dec, object->ap_resid, object->ap_resid_stdev, object->fwhm, object->fwhm_range, object->n_stars, object->n_extended, object->n_cr, object->n_astrom, object->path_base, object->fault);
    73006419}
    73016420
     
    73756494        return false;
    73766495    }
     6496    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     6497        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     6498        psFree(md);
     6499        return false;
     6500    }
    73776501    if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, object->class_id)) {
    73786502        psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
     
    74996623        return false;
    75006624    }
     6625    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     6626    if (!status) {
     6627        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
     6628        return false;
     6629    }
    75016630    char* class_id = psMetadataLookupPtr(&status, md, "class_id");
    75026631    if (!status) {
     
    76106739    }
    76116740
    7612     return chipProcessedImfileRowAlloc(chip_id, class_id, uri, bg, bg_stdev, bg_mean_stdev, bias, bias_stdev, fringe_0, fringe_1, fringe_2, sigma_ra, sigma_dec, ap_resid, ap_resid_stdev, fwhm, fwhm_range, n_stars, n_extended, n_cr, n_astrom, path_base, fault);
     6741    return chipProcessedImfileRowAlloc(chip_id, exp_id, class_id, uri, bg, bg_stdev, bg_mean_stdev, bias, bias_stdev, fringe_0, fringe_1, fringe_2, sigma_ra, sigma_dec, ap_resid, ap_resid_stdev, fwhm, fwhm_range, n_stars, n_extended, n_cr, n_astrom, path_base, fault);
    76136742}
    76146743psArray *chipProcessedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    77206849    return true;
    77216850}
    7722 static void camPendingExpRowFree(camPendingExpRow *object);
    7723 
    7724 camPendingExpRow *camPendingExpRowAlloc(psS64 cam_id, psS64 chip_id, const char *workdir, const char *label, const char *reduction, const char *expgroup, const char *dvodb)
    7725 {
    7726     camPendingExpRow *_object;
    7727 
    7728     _object = psAlloc(sizeof(camPendingExpRow));
    7729     psMemSetDeallocator(_object, (psFreeFunc)camPendingExpRowFree);
    7730 
    7731     _object->cam_id = cam_id;
    7732     _object->chip_id = chip_id;
    7733     _object->workdir = psStringCopy(workdir);
     6851static void chipMaskRowFree(chipMaskRow *object);
     6852
     6853chipMaskRow *chipMaskRowAlloc(const char *label)
     6854{
     6855    chipMaskRow     *_object;
     6856
     6857    _object = psAlloc(sizeof(chipMaskRow));
     6858    psMemSetDeallocator(_object, (psFreeFunc)chipMaskRowFree);
     6859
    77346860    _object->label = psStringCopy(label);
    7735     _object->reduction = psStringCopy(reduction);
    7736     _object->expgroup = psStringCopy(expgroup);
    7737     _object->dvodb = psStringCopy(dvodb);
    77386861
    77396862    return _object;
    77406863}
    77416864
    7742 static void camPendingExpRowFree(camPendingExpRow *object)
    7743 {
    7744     psFree(object->workdir);
     6865static void chipMaskRowFree(chipMaskRow *object)
     6866{
    77456867    psFree(object->label);
    7746     psFree(object->reduction);
    7747     psFree(object->expgroup);
    7748     psFree(object->dvodb);
    7749 }
    7750 
    7751 bool camPendingExpCreateTable(psDB *dbh)
     6868}
     6869
     6870bool chipMaskCreateTable(psDB *dbh)
    77526871{
    77536872    psMetadata *md = psMetadataAlloc();
    7754     if (!psMetadataAdd(md, PS_LIST_TAIL, "cam_id", PS_DATA_S64, "Primary Key AUTO_INCREMENT", 0)) {
    7755         psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
    7756         psFree(md);
    7757         return false;
    7758     }
    7759     if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey(chip_id) ref chipProcessedExp(chip_id)", 0)) {
    7760         psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
    7761         psFree(md);
    7762         return false;
    7763     }
    7764     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, "255")) {
    7765         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    7766         psFree(md);
    7767         return false;
    7768     }
    7769     if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "key", "64")) {
     6873    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "Primary Key", "64")) {
    77706874        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
    77716875        psFree(md);
    77726876        return false;
    77736877    }
    7774     if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, "64")) {
    7775         psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
    7776         psFree(md);
    7777         return false;
    7778     }
    7779     if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, "key", "64")) {
    7780         psError(PS_ERR_UNKNOWN, false, "failed to add item expgroup");
    7781         psFree(md);
    7782         return false;
    7783     }
    7784     if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, "255")) {
    7785         psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
    7786         psFree(md);
    7787         return false;
    7788     }
    7789 
    7790     bool status = psDBCreateTable(dbh, CAMPENDINGEXP_TABLE_NAME, md);
     6878
     6879    bool status = psDBCreateTable(dbh, CHIPMASK_TABLE_NAME, md);
    77916880
    77926881    psFree(md);
     
    77956884}
    77966885
    7797 bool camPendingExpDropTable(psDB *dbh)
    7798 {
    7799     return psDBDropTable(dbh, CAMPENDINGEXP_TABLE_NAME);
    7800 }
    7801 
    7802 bool camPendingExpInsert(psDB * dbh, psS64 cam_id, psS64 chip_id, const char *workdir, const char *label, const char *reduction, const char *expgroup, const char *dvodb)
     6886bool chipMaskDropTable(psDB *dbh)
     6887{
     6888    return psDBDropTable(dbh, CHIPMASK_TABLE_NAME);
     6889}
     6890
     6891bool chipMaskInsert(psDB * dbh, const char *label)
    78036892{
    78046893    psMetadata *md = psMetadataAlloc();
    7805     if (!psMetadataAdd(md, PS_LIST_TAIL, "cam_id", PS_DATA_S64, NULL, cam_id)) {
    7806         psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
    7807         psFree(md);
    7808         return false;
    7809     }
    7810     if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, chip_id)) {
    7811         psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
    7812         psFree(md);
    7813         return false;
    7814     }
    7815     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) {
    7816         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    7817         psFree(md);
    7818         return false;
    7819     }
    78206894    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, label)) {
    78216895        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     
    78236897        return false;
    78246898    }
    7825     if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, reduction)) {
    7826         psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
    7827         psFree(md);
    7828         return false;
    7829     }
    7830     if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, NULL, expgroup)) {
    7831         psError(PS_ERR_UNKNOWN, false, "failed to add item expgroup");
    7832         psFree(md);
    7833         return false;
    7834     }
    7835     if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, dvodb)) {
    7836         psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
    7837         psFree(md);
    7838         return false;
    7839     }
    7840 
    7841     bool status = psDBInsertOneRow(dbh, CAMPENDINGEXP_TABLE_NAME, md);
     6899
     6900    bool status = psDBInsertOneRow(dbh, CHIPMASK_TABLE_NAME, md);
    78426901    psFree(md);
    78436902
     
    78456904}
    78466905
    7847 long long camPendingExpDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     6906long long chipMaskDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    78486907{
    78496908    long long       deleted = 0;
    78506909
    7851     long long count = psDBDeleteRows(dbh, CAMPENDINGEXP_TABLE_NAME, where, limit);
     6910    long long count = psDBDeleteRows(dbh, CHIPMASK_TABLE_NAME, where, limit);
    78526911    if (count < 0) {
    7853         psError(PS_ERR_UNKNOWN, true, "failed to delete row from camPendingExp");
     6912        psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipMask");
    78546913        return count;
    78556914
     
    78596918    return deleted;
    78606919}
    7861 bool camPendingExpInsertObject(psDB *dbh, camPendingExpRow *object)
    7862 {
    7863     return camPendingExpInsert(dbh, object->cam_id, object->chip_id, object->workdir, object->label, object->reduction, object->expgroup, object->dvodb);
    7864 }
    7865 
    7866 bool camPendingExpInsertObjects(psDB *dbh, psArray *objects)
     6920bool chipMaskInsertObject(psDB *dbh, chipMaskRow *object)
     6921{
     6922    return chipMaskInsert(dbh, object->label);
     6923}
     6924
     6925bool chipMaskInsertObjects(psDB *dbh, psArray *objects)
    78676926{
    78686927    for (long i = 0; i < psArrayLength(objects); i++) {
    7869         if (!camPendingExpInsertObject(dbh, objects->data[i])) {
     6928        if (!chipMaskInsertObject(dbh, objects->data[i])) {
    78706929            return false;
    78716930        }
     
    78756934}
    78766935
    7877 bool camPendingExpInsertFits(psDB *dbh, const psFits *fits)
     6936bool chipMaskInsertFits(psDB *dbh, const psFits *fits)
    78786937{
    78796938    psArray         *rowSet;
    78806939
    7881     // move to (the first?) extension named  CAMPENDINGEXP_TABLE_NAME
    7882     if (!psFitsMoveExtName(fits, CAMPENDINGEXP_TABLE_NAME)) {
    7883         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", CAMPENDINGEXP_TABLE_NAME);
     6940    // move to (the first?) extension named  CHIPMASK_TABLE_NAME
     6941    if (!psFitsMoveExtName(fits, CHIPMASK_TABLE_NAME)) {
     6942        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", CHIPMASK_TABLE_NAME);
    78846943        return false;
    78856944    }
     
    78996958    }
    79006959
    7901     if (!psDBInsertRows(dbh, CAMPENDINGEXP_TABLE_NAME, rowSet)) {
     6960    if (!psDBInsertRows(dbh, CHIPMASK_TABLE_NAME, rowSet)) {
    79026961        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    79036962        psFree(rowSet);
     
    79106969}
    79116970
    7912 bool camPendingExpSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     6971bool chipMaskSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    79136972{
    79146973    psArray         *rowSet;
    79156974
    7916     rowSet = psDBSelectRows(dbh, CAMPENDINGEXP_TABLE_NAME, where, limit);
     6975    rowSet = psDBSelectRows(dbh, CHIPMASK_TABLE_NAME, where, limit);
    79176976    if (!rowSet) {
    79186977        return false;
     
    79206979
    79216980    // output to fits
    7922     if (!psFitsWriteTable(fits, NULL, rowSet, CAMPENDINGEXP_TABLE_NAME)) {
     6981    if (!psFitsWriteTable(fits, NULL, rowSet, CHIPMASK_TABLE_NAME)) {
    79236982        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    79246983        psFree(rowSet);
     
    79316990}
    79326991
    7933 psMetadata *camPendingExpMetadataFromObject(const camPendingExpRow *object)
     6992psMetadata *chipMaskMetadataFromObject(const chipMaskRow *object)
    79346993{
    79356994    psMetadata *md = psMetadataAlloc();
    7936     if (!psMetadataAdd(md, PS_LIST_TAIL, "cam_id", PS_DATA_S64, NULL, object->cam_id)) {
    7937         psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
    7938         psFree(md);
    7939         return false;
    7940     }
    7941     if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, object->chip_id)) {
    7942         psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
    7943         psFree(md);
    7944         return false;
    7945     }
    7946     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, object->workdir)) {
    7947         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    7948         psFree(md);
    7949         return false;
    7950     }
    79516995    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, object->label)) {
    79526996        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     
    79546998        return false;
    79556999    }
    7956     if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, object->reduction)) {
    7957         psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
    7958         psFree(md);
    7959         return false;
    7960     }
    7961     if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, NULL, object->expgroup)) {
    7962         psError(PS_ERR_UNKNOWN, false, "failed to add item expgroup");
    7963         psFree(md);
    7964         return false;
    7965     }
    7966     if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, object->dvodb)) {
    7967         psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
    7968         psFree(md);
    7969         return false;
    7970     }
    79717000
    79727001
     
    79747003}
    79757004
    7976 camPendingExpRow *camPendingExpObjectFromMetadata(psMetadata *md)
     7005chipMaskRow *chipMaskObjectFromMetadata(psMetadata *md)
    79777006{
    79787007
    79797008bool status = false;
    7980     psS64 cam_id = psMetadataLookupS64(&status, md, "cam_id");
    7981     if (!status) {
    7982         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item cam_id");
    7983         return false;
    7984     }
    7985     psS64 chip_id = psMetadataLookupS64(&status, md, "chip_id");
    7986     if (!status) {
    7987         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item chip_id");
    7988         return false;
    7989     }
    7990     char* workdir = psMetadataLookupPtr(&status, md, "workdir");
    7991     if (!status) {
    7992         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item workdir");
    7993         return false;
    7994     }
    79957009    char* label = psMetadataLookupPtr(&status, md, "label");
    79967010    if (!status) {
     
    79987012        return false;
    79997013    }
    8000     char* reduction = psMetadataLookupPtr(&status, md, "reduction");
    8001     if (!status) {
    8002         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reduction");
    8003         return false;
    8004     }
    8005     char* expgroup = psMetadataLookupPtr(&status, md, "expgroup");
    8006     if (!status) {
    8007         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item expgroup");
    8008         return false;
    8009     }
    8010     char* dvodb = psMetadataLookupPtr(&status, md, "dvodb");
    8011     if (!status) {
    8012         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dvodb");
    8013         return false;
    8014     }
    8015 
    8016     return camPendingExpRowAlloc(cam_id, chip_id, workdir, label, reduction, expgroup, dvodb);
    8017 }
    8018 psArray *camPendingExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     7014
     7015    return chipMaskRowAlloc(label);
     7016}
     7017psArray *chipMaskSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    80197018{
    80207019    psArray         *rowSet;
     
    80227021    psU64           i;
    80237022
    8024     rowSet = psDBSelectRows(dbh, CAMPENDINGEXP_TABLE_NAME, where, limit);
     7023    rowSet = psDBSelectRows(dbh, CHIPMASK_TABLE_NAME, where, limit);
    80257024    if (!rowSet) {
    80267025        return NULL;
     
    80327031
    80337032    for (i = 0; i < rowSet->n; i++) {
    8034         camPendingExpRow *object = camPendingExpObjectFromMetadata(rowSet->data[i]);
     7033        chipMaskRow *object = chipMaskObjectFromMetadata(rowSet->data[i]);
    80357034        psArrayAdd(returnSet, 0, object);
    80367035        psFree(object);
     
    80417040    return returnSet;
    80427041}
    8043 bool camPendingExpDeleteObject(psDB *dbh, const camPendingExpRow *object)
    8044 {
    8045     psMetadata *where = camPendingExpMetadataFromObject(object);
    8046     long long count = psDBDeleteRows(dbh, CAMPENDINGEXP_TABLE_NAME, where, 0);
     7042bool chipMaskDeleteObject(psDB *dbh, const chipMaskRow *object)
     7043{
     7044    psMetadata *where = chipMaskMetadataFromObject(object);
     7045    long long count = psDBDeleteRows(dbh, CHIPMASK_TABLE_NAME, where, 0);
    80477046    psFree(where);
    80487047    if (count < 0) {
    8049         psError(PS_ERR_UNKNOWN, true, "failed to delete row from camPendingExp");
     7048        psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipMask");
    80507049        return false;
    80517050    }
     
    80537052        // XXX should this be a psAbort() instead?  It is possible that
    80547053        // having an object match multiple rows was by design.
    8055         psError(PS_ERR_UNKNOWN, true, "camPendingExpRow object matched more then one row.  Check your database schema");
    8056         return false;
    8057     }
    8058 
    8059     return true;
    8060 }
    8061 long long camPendingExpDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     7054        psError(PS_ERR_UNKNOWN, true, "chipMaskRow object matched more then one row.  Check your database schema");
     7055        return false;
     7056    }
     7057
     7058    return true;
     7059}
     7060long long chipMaskDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    80627061{
    80637062    long long       deleted = 0;
    80647063
    80657064    for (long long i = 0; i < objects->n; i++) {
    8066         camPendingExpRow *object = objects->data[i];
    8067         psMetadata *where = camPendingExpMetadataFromObject(object);
    8068         long long count = psDBDeleteRows(dbh, CAMPENDINGEXP_TABLE_NAME, where, limit);
     7065        chipMaskRow *object = objects->data[i];
     7066        psMetadata *where = chipMaskMetadataFromObject(object);
     7067        long long count = psDBDeleteRows(dbh, CHIPMASK_TABLE_NAME, where, limit);
    80697068        psFree(where);
    80707069        if (count < 0) {
    8071             psError(PS_ERR_UNKNOWN, true, "failed to delete row from camPendingExp");
     7070            psError(PS_ERR_UNKNOWN, true, "failed to delete row from chipMask");
    80727071            return count;
    80737072        }
     
    80787077    return deleted;
    80797078}
    8080 bool camPendingExpPrintObjects(FILE *stream, psArray *objects, bool mdcf)
     7079bool chipMaskPrintObjects(FILE *stream, psArray *objects, bool mdcf)
    80817080{
    80827081    PS_ASSERT_PTR_NON_NULL(objects, false);
     
    80847083    psMetadata *output = psMetadataAlloc();
    80857084    for (long i = 0; i < psArrayLength(objects); i++) {
    8086         psMetadata *md = camPendingExpMetadataFromObject(objects->data[i]);
     7085        psMetadata *md = chipMaskMetadataFromObject(objects->data[i]);
    80877086        if (!psMetadataAddMetadata(
    80887087            output,
    80897088            PS_LIST_TAIL,
    8090             CAMPENDINGEXP_TABLE_NAME,
     7089            CHIPMASK_TABLE_NAME,
    80917090            PS_META_DUPLICATE_OK,
    80927091            NULL,
     
    81097108    return true;
    81107109}
    8111 bool camPendingExpPrintObject(FILE *stream, camPendingExpRow *object, bool mdcf)
     7110bool chipMaskPrintObject(FILE *stream, chipMaskRow *object, bool mdcf)
    81127111{
    81137112    PS_ASSERT_PTR_NON_NULL(object, false);
    81147113
    8115     psMetadata *md = camPendingExpMetadataFromObject(object);
     7114    psMetadata *md = chipMaskMetadataFromObject(object);
    81167115
    81177116    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     
    81247123    return true;
    81257124}
    8126 static void camProcessedExpRowFree(camProcessedExpRow *object);
    8127 
    8128 camProcessedExpRow *camProcessedExpRowAlloc(psS64 cam_id, psS64 chip_id, const char *workdir, const char *label, const char *reduction, const char *expgroup, const char *dvodb, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 sigma_ra, psF32 sigma_dec, psF32 zp_mean, psF32 zp_stdev, psF32 fwhm, psF32 fwhm_range, psS32 n_stars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
    8129 {
    8130     camProcessedExpRow *_object;
    8131 
    8132     _object = psAlloc(sizeof(camProcessedExpRow));
    8133     psMemSetDeallocator(_object, (psFreeFunc)camProcessedExpRowFree);
     7125static void camRunRowFree(camRunRow *object);
     7126
     7127camRunRow *camRunRowAlloc(psS64 cam_id, psS64 chip_id, const char *state, const char *workdir, const char *workdir_state, const char *label, const char *reduction, const char *expgroup, const char *dvodb)
     7128{
     7129    camRunRow      *_object;
     7130
     7131    _object = psAlloc(sizeof(camRunRow));
     7132    psMemSetDeallocator(_object, (psFreeFunc)camRunRowFree);
    81347133
    81357134    _object->cam_id = cam_id;
    81367135    _object->chip_id = chip_id;
     7136    _object->state = psStringCopy(state);
    81377137    _object->workdir = psStringCopy(workdir);
     7138    _object->workdir_state = psStringCopy(workdir_state);
    81387139    _object->label = psStringCopy(label);
    81397140    _object->reduction = psStringCopy(reduction);
    81407141    _object->expgroup = psStringCopy(expgroup);
    81417142    _object->dvodb = psStringCopy(dvodb);
     7143
     7144    return _object;
     7145}
     7146
     7147static void camRunRowFree(camRunRow *object)
     7148{
     7149    psFree(object->state);
     7150    psFree(object->workdir);
     7151    psFree(object->workdir_state);
     7152    psFree(object->label);
     7153    psFree(object->reduction);
     7154    psFree(object->expgroup);
     7155    psFree(object->dvodb);
     7156}
     7157
     7158bool camRunCreateTable(psDB *dbh)
     7159{
     7160    psMetadata *md = psMetadataAlloc();
     7161    if (!psMetadataAdd(md, PS_LIST_TAIL, "cam_id", PS_DATA_S64, "Primary Key AUTO_INCREMENT", 0)) {
     7162        psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
     7163        psFree(md);
     7164        return false;
     7165    }
     7166    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey(chip_id) ref chipRun(chip_id)", 0)) {
     7167        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
     7168        psFree(md);
     7169        return false;
     7170    }
     7171    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, "key", "64")) {
     7172        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
     7173        psFree(md);
     7174        return false;
     7175    }
     7176    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, "255")) {
     7177        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
     7178        psFree(md);
     7179        return false;
     7180    }
     7181    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, "key", "64")) {
     7182        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state");
     7183        psFree(md);
     7184        return false;
     7185    }
     7186    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "key", "64")) {
     7187        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     7188        psFree(md);
     7189        return false;
     7190    }
     7191    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, "64")) {
     7192        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
     7193        psFree(md);
     7194        return false;
     7195    }
     7196    if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, "key", "64")) {
     7197        psError(PS_ERR_UNKNOWN, false, "failed to add item expgroup");
     7198        psFree(md);
     7199        return false;
     7200    }
     7201    if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, "255")) {
     7202        psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
     7203        psFree(md);
     7204        return false;
     7205    }
     7206
     7207    bool status = psDBCreateTable(dbh, CAMRUN_TABLE_NAME, md);
     7208
     7209    psFree(md);
     7210
     7211    return status;
     7212}
     7213
     7214bool camRunDropTable(psDB *dbh)
     7215{
     7216    return psDBDropTable(dbh, CAMRUN_TABLE_NAME);
     7217}
     7218
     7219bool camRunInsert(psDB * dbh, psS64 cam_id, psS64 chip_id, const char *state, const char *workdir, const char *workdir_state, const char *label, const char *reduction, const char *expgroup, const char *dvodb)
     7220{
     7221    psMetadata *md = psMetadataAlloc();
     7222    if (!psMetadataAdd(md, PS_LIST_TAIL, "cam_id", PS_DATA_S64, NULL, cam_id)) {
     7223        psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
     7224        psFree(md);
     7225        return false;
     7226    }
     7227    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, chip_id)) {
     7228        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
     7229        psFree(md);
     7230        return false;
     7231    }
     7232    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, state)) {
     7233        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
     7234        psFree(md);
     7235        return false;
     7236    }
     7237    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) {
     7238        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
     7239        psFree(md);
     7240        return false;
     7241    }
     7242    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, NULL, workdir_state)) {
     7243        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state");
     7244        psFree(md);
     7245        return false;
     7246    }
     7247    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, label)) {
     7248        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     7249        psFree(md);
     7250        return false;
     7251    }
     7252    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, reduction)) {
     7253        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
     7254        psFree(md);
     7255        return false;
     7256    }
     7257    if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, NULL, expgroup)) {
     7258        psError(PS_ERR_UNKNOWN, false, "failed to add item expgroup");
     7259        psFree(md);
     7260        return false;
     7261    }
     7262    if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, dvodb)) {
     7263        psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
     7264        psFree(md);
     7265        return false;
     7266    }
     7267
     7268    bool status = psDBInsertOneRow(dbh, CAMRUN_TABLE_NAME, md);
     7269    psFree(md);
     7270
     7271    return status;
     7272}
     7273
     7274long long camRunDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     7275{
     7276    long long       deleted = 0;
     7277
     7278    long long count = psDBDeleteRows(dbh, CAMRUN_TABLE_NAME, where, limit);
     7279    if (count < 0) {
     7280        psError(PS_ERR_UNKNOWN, true, "failed to delete row from camRun");
     7281        return count;
     7282
     7283        deleted += count;
     7284    }
     7285
     7286    return deleted;
     7287}
     7288bool camRunInsertObject(psDB *dbh, camRunRow *object)
     7289{
     7290    return camRunInsert(dbh, object->cam_id, object->chip_id, object->state, object->workdir, object->workdir_state, object->label, object->reduction, object->expgroup, object->dvodb);
     7291}
     7292
     7293bool camRunInsertObjects(psDB *dbh, psArray *objects)
     7294{
     7295    for (long i = 0; i < psArrayLength(objects); i++) {
     7296        if (!camRunInsertObject(dbh, objects->data[i])) {
     7297            return false;
     7298        }
     7299    }
     7300
     7301    return true;
     7302}
     7303
     7304bool camRunInsertFits(psDB *dbh, const psFits *fits)
     7305{
     7306    psArray         *rowSet;
     7307
     7308    // move to (the first?) extension named  CAMRUN_TABLE_NAME
     7309    if (!psFitsMoveExtName(fits, CAMRUN_TABLE_NAME)) {
     7310        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", CAMRUN_TABLE_NAME);
     7311        return false;
     7312    }
     7313
     7314    // check HDU type
     7315    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
     7316        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
     7317        return false;
     7318    }
     7319
     7320    // read fits table
     7321    rowSet = psFitsReadTable(fits);
     7322    if (!rowSet) {
     7323        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
     7324        psFree(rowSet);
     7325        return false;
     7326    }
     7327
     7328    if (!psDBInsertRows(dbh, CAMRUN_TABLE_NAME, rowSet)) {
     7329        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
     7330        psFree(rowSet);
     7331        return false;
     7332    }
     7333
     7334    psFree(rowSet);
     7335
     7336    return true;
     7337}
     7338
     7339bool camRunSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     7340{
     7341    psArray         *rowSet;
     7342
     7343    rowSet = psDBSelectRows(dbh, CAMRUN_TABLE_NAME, where, limit);
     7344    if (!rowSet) {
     7345        return false;
     7346    }
     7347
     7348    // output to fits
     7349    if (!psFitsWriteTable(fits, NULL, rowSet, CAMRUN_TABLE_NAME)) {
     7350        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
     7351        psFree(rowSet);
     7352        return false;
     7353    }
     7354
     7355    psFree(rowSet);
     7356
     7357    return true;
     7358}
     7359
     7360psMetadata *camRunMetadataFromObject(const camRunRow *object)
     7361{
     7362    psMetadata *md = psMetadataAlloc();
     7363    if (!psMetadataAdd(md, PS_LIST_TAIL, "cam_id", PS_DATA_S64, NULL, object->cam_id)) {
     7364        psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
     7365        psFree(md);
     7366        return false;
     7367    }
     7368    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, object->chip_id)) {
     7369        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
     7370        psFree(md);
     7371        return false;
     7372    }
     7373    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, object->state)) {
     7374        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
     7375        psFree(md);
     7376        return false;
     7377    }
     7378    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, object->workdir)) {
     7379        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
     7380        psFree(md);
     7381        return false;
     7382    }
     7383    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir_state", PS_DATA_STRING, NULL, object->workdir_state)) {
     7384        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir_state");
     7385        psFree(md);
     7386        return false;
     7387    }
     7388    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, object->label)) {
     7389        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     7390        psFree(md);
     7391        return false;
     7392    }
     7393    if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, object->reduction)) {
     7394        psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
     7395        psFree(md);
     7396        return false;
     7397    }
     7398    if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, NULL, object->expgroup)) {
     7399        psError(PS_ERR_UNKNOWN, false, "failed to add item expgroup");
     7400        psFree(md);
     7401        return false;
     7402    }
     7403    if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, object->dvodb)) {
     7404        psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
     7405        psFree(md);
     7406        return false;
     7407    }
     7408
     7409
     7410    return md;
     7411}
     7412
     7413camRunRow *camRunObjectFromMetadata(psMetadata *md)
     7414{
     7415
     7416bool status = false;
     7417    psS64 cam_id = psMetadataLookupS64(&status, md, "cam_id");
     7418    if (!status) {
     7419        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item cam_id");
     7420        return false;
     7421    }
     7422    psS64 chip_id = psMetadataLookupS64(&status, md, "chip_id");
     7423    if (!status) {
     7424        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item chip_id");
     7425        return false;
     7426    }
     7427    char* state = psMetadataLookupPtr(&status, md, "state");
     7428    if (!status) {
     7429        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item state");
     7430        return false;
     7431    }
     7432    char* workdir = psMetadataLookupPtr(&status, md, "workdir");
     7433    if (!status) {
     7434        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item workdir");
     7435        return false;
     7436    }
     7437    char* workdir_state = psMetadataLookupPtr(&status, md, "workdir_state");
     7438    if (!status) {
     7439        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item workdir_state");
     7440        return false;
     7441    }
     7442    char* label = psMetadataLookupPtr(&status, md, "label");
     7443    if (!status) {
     7444        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item label");
     7445        return false;
     7446    }
     7447    char* reduction = psMetadataLookupPtr(&status, md, "reduction");
     7448    if (!status) {
     7449        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reduction");
     7450        return false;
     7451    }
     7452    char* expgroup = psMetadataLookupPtr(&status, md, "expgroup");
     7453    if (!status) {
     7454        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item expgroup");
     7455        return false;
     7456    }
     7457    char* dvodb = psMetadataLookupPtr(&status, md, "dvodb");
     7458    if (!status) {
     7459        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dvodb");
     7460        return false;
     7461    }
     7462
     7463    return camRunRowAlloc(cam_id, chip_id, state, workdir, workdir_state, label, reduction, expgroup, dvodb);
     7464}
     7465psArray *camRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     7466{
     7467    psArray         *rowSet;
     7468    psArray         *returnSet;
     7469    psU64           i;
     7470
     7471    rowSet = psDBSelectRows(dbh, CAMRUN_TABLE_NAME, where, limit);
     7472    if (!rowSet) {
     7473        return NULL;
     7474    }
     7475
     7476    // convert psMetadata rows to row objects
     7477
     7478    returnSet = psArrayAllocEmpty(rowSet->n);
     7479
     7480    for (i = 0; i < rowSet->n; i++) {
     7481        camRunRow *object = camRunObjectFromMetadata(rowSet->data[i]);
     7482        psArrayAdd(returnSet, 0, object);
     7483        psFree(object);
     7484    }
     7485
     7486    psFree(rowSet);
     7487
     7488    return returnSet;
     7489}
     7490bool camRunDeleteObject(psDB *dbh, const camRunRow *object)
     7491{
     7492    psMetadata *where = camRunMetadataFromObject(object);
     7493    long long count = psDBDeleteRows(dbh, CAMRUN_TABLE_NAME, where, 0);
     7494    psFree(where);
     7495    if (count < 0) {
     7496        psError(PS_ERR_UNKNOWN, true, "failed to delete row from camRun");
     7497        return false;
     7498    }
     7499    if (count > 1) {
     7500        // XXX should this be a psAbort() instead?  It is possible that
     7501        // having an object match multiple rows was by design.
     7502        psError(PS_ERR_UNKNOWN, true, "camRunRow object matched more then one row.  Check your database schema");
     7503        return false;
     7504    }
     7505
     7506    return true;
     7507}
     7508long long camRunDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     7509{
     7510    long long       deleted = 0;
     7511
     7512    for (long long i = 0; i < objects->n; i++) {
     7513        camRunRow *object = objects->data[i];
     7514        psMetadata *where = camRunMetadataFromObject(object);
     7515        long long count = psDBDeleteRows(dbh, CAMRUN_TABLE_NAME, where, limit);
     7516        psFree(where);
     7517        if (count < 0) {
     7518            psError(PS_ERR_UNKNOWN, true, "failed to delete row from camRun");
     7519            return count;
     7520        }
     7521
     7522        deleted += count;
     7523    }
     7524
     7525    return deleted;
     7526}
     7527bool camRunPrintObjects(FILE *stream, psArray *objects, bool mdcf)
     7528{
     7529    PS_ASSERT_PTR_NON_NULL(objects, false);
     7530
     7531    psMetadata *output = psMetadataAlloc();
     7532    for (long i = 0; i < psArrayLength(objects); i++) {
     7533        psMetadata *md = camRunMetadataFromObject(objects->data[i]);
     7534        if (!psMetadataAddMetadata(
     7535            output,
     7536            PS_LIST_TAIL,
     7537            CAMRUN_TABLE_NAME,
     7538            PS_META_DUPLICATE_OK,
     7539            NULL,
     7540            md
     7541        )) {
     7542            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
     7543            psFree(md);
     7544            psFree(output);
     7545            return false;
     7546        }
     7547        psFree(md);
     7548    }
     7549
     7550    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
     7551        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     7552        psFree(output);
     7553    }
     7554    psFree(output);
     7555
     7556    return true;
     7557}
     7558bool camRunPrintObject(FILE *stream, camRunRow *object, bool mdcf)
     7559{
     7560    PS_ASSERT_PTR_NON_NULL(object, false);
     7561
     7562    psMetadata *md = camRunMetadataFromObject(object);
     7563
     7564    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     7565        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     7566        psFree(md);
     7567    }
     7568
     7569    psFree(md);
     7570
     7571    return true;
     7572}
     7573static void camProcessedExpRowFree(camProcessedExpRow *object);
     7574
     7575camProcessedExpRow *camProcessedExpRowAlloc(psS64 cam_id, psS64 chip_id, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 sigma_ra, psF32 sigma_dec, psF32 zp_mean, psF32 zp_stdev, psF32 fwhm, psF32 fwhm_range, psS32 n_stars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
     7576{
     7577    camProcessedExpRow *_object;
     7578
     7579    _object = psAlloc(sizeof(camProcessedExpRow));
     7580    psMemSetDeallocator(_object, (psFreeFunc)camProcessedExpRowFree);
     7581
     7582    _object->cam_id = cam_id;
     7583    _object->chip_id = chip_id;
    81427584    _object->uri = psStringCopy(uri);
    81437585    _object->bg = bg;
     
    81627604static void camProcessedExpRowFree(camProcessedExpRow *object)
    81637605{
    8164     psFree(object->workdir);
    8165     psFree(object->label);
    8166     psFree(object->reduction);
    8167     psFree(object->expgroup);
    8168     psFree(object->dvodb);
    81697606    psFree(object->uri);
    81707607    psFree(object->path_base);
     
    81797616        return false;
    81807617    }
    8181     if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey(chip_id) ref chipProcessedExp(chip_id)", 0)) {
     7618    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, "Primary Key fkey(cam_id, chip_id) ref camRun(cam_id, chip_id)", 0)) {
    81827619        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
    8183         psFree(md);
    8184         return false;
    8185     }
    8186     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, "255")) {
    8187         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    8188         psFree(md);
    8189         return false;
    8190     }
    8191     if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "key", "64")) {
    8192         psError(PS_ERR_UNKNOWN, false, "failed to add item label");
    8193         psFree(md);
    8194         return false;
    8195     }
    8196     if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, "64")) {
    8197         psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
    8198         psFree(md);
    8199         return false;
    8200     }
    8201     if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, "key", "64")) {
    8202         psError(PS_ERR_UNKNOWN, false, "failed to add item expgroup");
    8203         psFree(md);
    8204         return false;
    8205     }
    8206     if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, "255")) {
    8207         psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
    82087620        psFree(md);
    82097621        return false;
     
    83027714}
    83037715
    8304 bool camProcessedExpInsert(psDB * dbh, psS64 cam_id, psS64 chip_id, const char *workdir, const char *label, const char *reduction, const char *expgroup, const char *dvodb, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 sigma_ra, psF32 sigma_dec, psF32 zp_mean, psF32 zp_stdev, psF32 fwhm, psF32 fwhm_range, psS32 n_stars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
     7716bool camProcessedExpInsert(psDB * dbh, psS64 cam_id, psS64 chip_id, const char *uri, psF32 bg, psF32 bg_stdev, psF32 bg_mean_stdev, psF32 sigma_ra, psF32 sigma_dec, psF32 zp_mean, psF32 zp_stdev, psF32 fwhm, psF32 fwhm_range, psS32 n_stars, psS32 n_extended, psS32 n_cr, psS32 n_astrom, const char *path_base, psS16 fault)
    83057717{
    83067718    psMetadata *md = psMetadataAlloc();
     
    83127724    if (!psMetadataAdd(md, PS_LIST_TAIL, "chip_id", PS_DATA_S64, NULL, chip_id)) {
    83137725        psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
    8314         psFree(md);
    8315         return false;
    8316     }
    8317     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) {
    8318         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    8319         psFree(md);
    8320         return false;
    8321     }
    8322     if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, label)) {
    8323         psError(PS_ERR_UNKNOWN, false, "failed to add item label");
    8324         psFree(md);
    8325         return false;
    8326     }
    8327     if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, reduction)) {
    8328         psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
    8329         psFree(md);
    8330         return false;
    8331     }
    8332     if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, NULL, expgroup)) {
    8333         psError(PS_ERR_UNKNOWN, false, "failed to add item expgroup");
    8334         psFree(md);
    8335         return false;
    8336     }
    8337     if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, dvodb)) {
    8338         psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
    83397726        psFree(md);
    83407727        return false;
     
    84437830bool camProcessedExpInsertObject(psDB *dbh, camProcessedExpRow *object)
    84447831{
    8445     return camProcessedExpInsert(dbh, object->cam_id, object->chip_id, object->workdir, object->label, object->reduction, object->expgroup, object->dvodb, object->uri, object->bg, object->bg_stdev, object->bg_mean_stdev, object->sigma_ra, object->sigma_dec, object->zp_mean, object->zp_stdev, object->fwhm, object->fwhm_range, object->n_stars, object->n_extended, object->n_cr, object->n_astrom, object->path_base, object->fault);
     7832    return camProcessedExpInsert(dbh, object->cam_id, object->chip_id, object->uri, object->bg, object->bg_stdev, object->bg_mean_stdev, object->sigma_ra, object->sigma_dec, object->zp_mean, object->zp_stdev, object->fwhm, object->fwhm_range, object->n_stars, object->n_extended, object->n_cr, object->n_astrom, object->path_base, object->fault);
    84467833}
    84477834
     
    85267913        return false;
    85277914    }
    8528     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, object->workdir)) {
    8529         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    8530         psFree(md);
    8531         return false;
    8532     }
    8533     if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, object->label)) {
    8534         psError(PS_ERR_UNKNOWN, false, "failed to add item label");
    8535         psFree(md);
    8536         return false;
    8537     }
    8538     if (!psMetadataAdd(md, PS_LIST_TAIL, "reduction", PS_DATA_STRING, NULL, object->reduction)) {
    8539         psError(PS_ERR_UNKNOWN, false, "failed to add item reduction");
    8540         psFree(md);
    8541         return false;
    8542     }
    8543     if (!psMetadataAdd(md, PS_LIST_TAIL, "expgroup", PS_DATA_STRING, NULL, object->expgroup)) {
    8544         psError(PS_ERR_UNKNOWN, false, "failed to add item expgroup");
    8545         psFree(md);
    8546         return false;
    8547     }
    8548     if (!psMetadataAdd(md, PS_LIST_TAIL, "dvodb", PS_DATA_STRING, NULL, object->dvodb)) {
    8549         psError(PS_ERR_UNKNOWN, false, "failed to add item dvodb");
    8550         psFree(md);
    8551         return false;
    8552     }
    85537915    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {
    85547916        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     
    86508012        return false;
    86518013    }
    8652     char* workdir = psMetadataLookupPtr(&status, md, "workdir");
    8653     if (!status) {
    8654         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item workdir");
    8655         return false;
    8656     }
    8657     char* label = psMetadataLookupPtr(&status, md, "label");
    8658     if (!status) {
    8659         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item label");
    8660         return false;
    8661     }
    8662     char* reduction = psMetadataLookupPtr(&status, md, "reduction");
    8663     if (!status) {
    8664         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item reduction");
    8665         return false;
    8666     }
    8667     char* expgroup = psMetadataLookupPtr(&status, md, "expgroup");
    8668     if (!status) {
    8669         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item expgroup");
    8670         return false;
    8671     }
    8672     char* dvodb = psMetadataLookupPtr(&status, md, "dvodb");
    8673     if (!status) {
    8674         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item dvodb");
    8675         return false;
    8676     }
    86778014    char* uri = psMetadataLookupPtr(&status, md, "uri");
    86788015    if (!status) {
     
    87568093    }
    87578094
    8758     return camProcessedExpRowAlloc(cam_id, chip_id, workdir, label, reduction, expgroup, dvodb, uri, bg, bg_stdev, bg_mean_stdev, sigma_ra, sigma_dec, zp_mean, zp_stdev, fwhm, fwhm_range, n_stars, n_extended, n_cr, n_astrom, path_base, fault);
     8095    return camProcessedExpRowAlloc(cam_id, chip_id, uri, bg, bg_stdev, bg_mean_stdev, sigma_ra, sigma_dec, zp_mean, zp_stdev, fwhm, fwhm_range, n_stars, n_extended, n_cr, n_astrom, path_base, fault);
    87598096}
    87608097psArray *camProcessedExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1370413041static void detInputExpRowFree(detInputExpRow *object);
    1370513042
    13706 detInputExpRow *detInputExpRowAlloc(psS64 det_id, psS32 iteration, const char *exp_tag, bool include)
     13043detInputExpRow *detInputExpRowAlloc(psS64 det_id, psS32 iteration, psS64 exp_id, bool include)
    1370713044{
    1370813045    detInputExpRow  *_object;
     
    1371313050    _object->det_id = det_id;
    1371413051    _object->iteration = iteration;
    13715     _object->exp_tag = psStringCopy(exp_tag);
     13052    _object->exp_id = exp_id;
    1371613053    _object->include = include;
    1371713054
     
    1372113058static void detInputExpRowFree(detInputExpRow *object)
    1372213059{
    13723     psFree(object->exp_tag);
    1372413060}
    1372513061
     
    1373713073        return false;
    1373813074    }
    13739     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
    13740         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     13075    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key", 64)) {
     13076        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1374113077        psFree(md);
    1374213078        return false;
     
    1376013096}
    1376113097
    13762 bool detInputExpInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *exp_tag, bool include)
     13098bool detInputExpInsert(psDB * dbh, psS64 det_id, psS32 iteration, psS64 exp_id, bool include)
    1376313099{
    1376413100    psMetadata *md = psMetadataAlloc();
     
    1377313109        return false;
    1377413110    }
    13775     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    13776         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     13111    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     13112        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1377713113        psFree(md);
    1377813114        return false;
     
    1380613142bool detInputExpInsertObject(psDB *dbh, detInputExpRow *object)
    1380713143{
    13808     return detInputExpInsert(dbh, object->det_id, object->iteration, object->exp_tag, object->include);
     13144    return detInputExpInsert(dbh, object->det_id, object->iteration, object->exp_id, object->include);
    1380913145}
    1381013146
     
    1388913225        return false;
    1389013226    }
    13891     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    13892         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     13227    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     13228        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1389313229        psFree(md);
    1389413230        return false;
     
    1391813254        return false;
    1391913255    }
    13920     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    13921     if (!status) {
    13922         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
     13256    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     13257    if (!status) {
     13258        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
    1392313259        return false;
    1392413260    }
     
    1392913265    }
    1393013266
    13931     return detInputExpRowAlloc(det_id, iteration, exp_tag, include);
     13267    return detInputExpRowAlloc(det_id, iteration, exp_id, include);
    1393213268}
    1393313269psArray *detInputExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1404113377static void detProcessedImfileRowFree(detProcessedImfileRow *object);
    1404213378
    14043 detProcessedImfileRow *detProcessedImfileRowAlloc(psS64 det_id, const char *exp_tag, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
     13379detProcessedImfileRow *detProcessedImfileRowAlloc(psS64 det_id, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
    1404413380{
    1404513381    detProcessedImfileRow *_object;
     
    1404913385
    1405013386    _object->det_id = det_id;
    14051     _object->exp_tag = psStringCopy(exp_tag);
     13387    _object->exp_id = exp_id;
    1405213388    _object->class_id = psStringCopy(class_id);
    1405313389    _object->uri = psStringCopy(uri);
     
    1407213408static void detProcessedImfileRowFree(detProcessedImfileRow *object)
    1407313409{
    14074     psFree(object->exp_tag);
    1407513410    psFree(object->class_id);
    1407613411    psFree(object->uri);
     
    1408713422        return false;
    1408813423    }
    14089     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
    14090         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     13424    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key", 64)) {
     13425        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1409113426        psFree(md);
    1409213427        return false;
     
    1418513520}
    1418613521
    14187 bool detProcessedImfileInsert(psDB * dbh, psS64 det_id, const char *exp_tag, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
     13522bool detProcessedImfileInsert(psDB * dbh, psS64 det_id, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
    1418813523{
    1418913524    psMetadata *md = psMetadataAlloc();
     
    1419313528        return false;
    1419413529    }
    14195     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    14196         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     13530    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     13531        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1419713532        psFree(md);
    1419813533        return false;
     
    1430113636bool detProcessedImfileInsertObject(psDB *dbh, detProcessedImfileRow *object)
    1430213637{
    14303     return detProcessedImfileInsert(dbh, object->det_id, object->exp_tag, object->class_id, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);
     13638    return detProcessedImfileInsert(dbh, object->det_id, object->exp_id, object->class_id, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);
    1430413639}
    1430513640
     
    1437913714        return false;
    1438013715    }
    14381     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    14382         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     13716    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     13717        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1438313718        psFree(md);
    1438413719        return false;
     
    1447813813        return false;
    1447913814    }
    14480     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    14481     if (!status) {
    14482         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
     13815    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     13816    if (!status) {
     13817        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
    1448313818        return false;
    1448413819    }
     
    1456413899    }
    1456513900
    14566     return detProcessedImfileRowAlloc(det_id, exp_tag, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, fault);
     13901    return detProcessedImfileRowAlloc(det_id, exp_id, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, fault);
    1456713902}
    1456813903psArray *detProcessedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1467614011static void detProcessedExpRowFree(detProcessedExpRow *object);
    1467714012
    14678 detProcessedExpRow *detProcessedExpRowAlloc(psS64 det_id, const char *exp_tag, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
     14013detProcessedExpRow *detProcessedExpRowAlloc(psS64 det_id, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
    1467914014{
    1468014015    detProcessedExpRow *_object;
     
    1468414019
    1468514020    _object->det_id = det_id;
    14686     _object->exp_tag = psStringCopy(exp_tag);
     14021    _object->exp_id = exp_id;
    1468714022    _object->recipe = psStringCopy(recipe);
    1468814023    _object->bg = bg;
     
    1470514040static void detProcessedExpRowFree(detProcessedExpRow *object)
    1470614041{
    14707     psFree(object->exp_tag);
    1470814042    psFree(object->recipe);
    1470914043    psFree(object->path_base);
     
    1471814052        return false;
    1471914053    }
    14720     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
    14721         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     14054    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key", 64)) {
     14055        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1472214056        psFree(md);
    1472314057        return false;
     
    1480614140}
    1480714141
    14808 bool detProcessedExpInsert(psDB * dbh, psS64 det_id, const char *exp_tag, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
     14142bool detProcessedExpInsert(psDB * dbh, psS64 det_id, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
    1480914143{
    1481014144    psMetadata *md = psMetadataAlloc();
     
    1481414148        return false;
    1481514149    }
    14816     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    14817         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     14150    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     14151        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1481814152        psFree(md);
    1481914153        return false;
     
    1491214246bool detProcessedExpInsertObject(psDB *dbh, detProcessedExpRow *object)
    1491314247{
    14914     return detProcessedExpInsert(dbh, object->det_id, object->exp_tag, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);
     14248    return detProcessedExpInsert(dbh, object->det_id, object->exp_id, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);
    1491514249}
    1491614250
     
    1499014324        return false;
    1499114325    }
    14992     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    14993         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     14326    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     14327        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1499414328        psFree(md);
    1499514329        return false;
     
    1507914413        return false;
    1508014414    }
    15081     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    15082     if (!status) {
    15083         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
     14415    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     14416    if (!status) {
     14417        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
    1508414418        return false;
    1508514419    }
     
    1515514489    }
    1515614490
    15157     return detProcessedExpRowAlloc(det_id, exp_tag, recipe, bg, bg_stdev, bg_mean_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, fault);
     14491    return detProcessedExpRowAlloc(det_id, exp_id, recipe, bg, bg_stdev, bg_mean_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, fault);
    1515814492}
    1515914493psArray *detProcessedExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1725016584static void detResidImfileRowFree(detResidImfileRow *object);
    1725116585
    17252 detResidImfileRow *detResidImfileRowAlloc(psS64 det_id, psS32 iteration, const char *exp_tag, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
     16586detResidImfileRow *detResidImfileRowAlloc(psS64 det_id, psS32 iteration, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
    1725316587{
    1725416588    detResidImfileRow *_object;
     
    1725916593    _object->det_id = det_id;
    1726016594    _object->iteration = iteration;
    17261     _object->exp_tag = psStringCopy(exp_tag);
     16595    _object->exp_id = exp_id;
    1726216596    _object->class_id = psStringCopy(class_id);
    1726316597    _object->uri = psStringCopy(uri);
     
    1728316617static void detResidImfileRowFree(detResidImfileRow *object)
    1728416618{
    17285     psFree(object->exp_tag);
    1728616619    psFree(object->class_id);
    1728716620    psFree(object->uri);
     
    1730316636        return false;
    1730416637    }
    17305     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
    17306         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     16638    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key", 64)) {
     16639        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1730716640        psFree(md);
    1730816641        return false;
     
    1740616739}
    1740716740
    17408 bool detResidImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *exp_tag, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
     16741bool detResidImfileInsert(psDB * dbh, psS64 det_id, psS32 iteration, psS64 exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, psS16 fault)
    1740916742{
    1741016743    psMetadata *md = psMetadataAlloc();
     
    1741916752        return false;
    1742016753    }
    17421     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    17422         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     16754    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     16755        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1742316756        psFree(md);
    1742416757        return false;
     
    1753216865bool detResidImfileInsertObject(psDB *dbh, detResidImfileRow *object)
    1753316866{
    17534     return detResidImfileInsert(dbh, object->det_id, object->iteration, object->exp_tag, object->class_id, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bin_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);
     16867    return detResidImfileInsert(dbh, object->det_id, object->iteration, object->exp_id, object->class_id, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bin_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->fault);
    1753516868}
    1753616869
     
    1761516948        return false;
    1761616949    }
    17617     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    17618         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     16950    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     16951        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1761916952        psFree(md);
    1762016953        return false;
     
    1772417057        return false;
    1772517058    }
    17726     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    17727     if (!status) {
    17728         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
     17059    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     17060    if (!status) {
     17061        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
    1772917062        return false;
    1773017063    }
     
    1781517148    }
    1781617149
    17817     return detResidImfileRowAlloc(det_id, iteration, exp_tag, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, bin_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, fault);
     17150    return detResidImfileRowAlloc(det_id, iteration, exp_id, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, bin_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, fault);
    1781817151}
    1781917152psArray *detResidImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     
    1792717260static void detResidExpRowFree(detResidExpRow *object);
    1792817261
    17929 detResidExpRow *detResidExpRowAlloc(psS64 det_id, psS32 iteration, const char *exp_tag, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, bool accept, psS16 fault)
     17262detResidExpRow *detResidExpRowAlloc(psS64 det_id, psS32 iteration, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, bool accept, psS16 fault)
    1793017263{
    1793117264    detResidExpRow  *_object;
     
    1793617269    _object->det_id = det_id;
    1793717270    _object->iteration = iteration;
    17938     _object->exp_tag = psStringCopy(exp_tag);
     17271    _object->exp_id = exp_id;
    1793917272    _object->recipe = psStringCopy(recipe);
    1794017273    _object->bg = bg;
     
    1795917292static void detResidExpRowFree(detResidExpRow *object)
    1796017293{
    17961     psFree(object->exp_tag);
    1796217294    psFree(object->recipe);
    1796317295    psFree(object->path_base);
     
    1797717309        return false;
    1797817310    }
    17979     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
    17980         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     17311    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key", 64)) {
     17312        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1798117313        psFree(md);
    1798217314        return false;
     
    1807517407}
    1807617408
    18077 bool detResidExpInsert(psDB * dbh, psS64 det_id, psS32 iteration, const char *exp_tag, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, bool accept, psS16 fault)
     17409bool detResidExpInsert(psDB * dbh, psS64 det_id, psS32 iteration, psS64 exp_id, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, psF64 bin_stdev, psF64 fringe_0, psF64 fringe_1, psF64 fringe_2, psF64 user_1, psF64 user_2, psF64 user_3, psF64 user_4, psF64 user_5, const char *path_base, bool accept, psS16 fault)
    1807817410{
    1807917411    psMetadata *md = psMetadataAlloc();
     
    1808817420        return false;
    1808917421    }
    18090     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    18091         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     17422    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     17423        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1809217424        psFree(md);
    1809317425        return false;
     
    1819617528bool detResidExpInsertObject(psDB *dbh, detResidExpRow *object)
    1819717529{
    18198     return detResidExpInsert(dbh, object->det_id, object->iteration, object->exp_tag, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bin_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->accept, object->fault);
     17530    return detResidExpInsert(dbh, object->det_id, object->iteration, object->exp_id, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->bin_stdev, object->fringe_0, object->fringe_1, object->fringe_2, object->user_1, object->user_2, object->user_3, object->user_4, object->user_5, object->path_base, object->accept, object->fault);
    1819917531}
    1820017532
     
    1827917611        return false;
    1828017612    }
    18281     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    18282         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     17613    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     17614        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
    1828317615        psFree(md);
    1828417616        return false;
     
    1838317715        return false;
    1838417716    }
    18385     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    18386     if (!status) {
    18387         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
     17717    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     17718    if (!status) {
     17719        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
    1838817720        return false;
    1838917721    }
     
    1846917801    }
    1847017802
    18471     return detResidExpRowAlloc(det_id, iteration, exp_tag, recipe, bg, bg_stdev, bg_mean_stdev, bin_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, accept, fault);
     17803    return detResidExpRowAlloc(det_id, iteration, exp_id, recipe, bg, bg_stdev, bg_mean_stdev, bin_stdev, fringe_0, fringe_1, fringe_2, user_1, user_2, user_3, user_4, user_5, path_base, accept, fault);
    1847217804}
    1847317805psArray *detResidExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
Note: See TracChangeset for help on using the changeset viewer.