IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Feb 8, 2007, 3:18:04 PM (19 years ago)
Author:
jhoblitt
Message:

VERSION 1.1.3

File:
1 edited

Legend:

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

    r11679 r11720  
    2020/*
    2121 *
    22  * This file was generated by glueforge 0.36
     22 * This file was generated by glueforge 1.00
    2323 *
    2424 * Do NOT directly edit this file.
     
    6262#define DETRESIDEXP_TABLE_NAME "detResidExp"
    6363#define DETRUNSUMMARY_TABLE_NAME "detRunSummary"
    64 #define P4ARUN_TABLE_NAME "p4aRun"
    65 #define P4AINPUTEXP_TABLE_NAME "p4aInputExp"
    66 #define P4ASCFILE_TABLE_NAME "p4aScfile"
    67 #define P4BRUN_TABLE_NAME "p4bRun"
    68 #define P4BINPUTSCFILE_TABLE_NAME "p4bInputScfile"
    69 #define P4BDIFFSCFILE_TABLE_NAME "p4bDiffScfile"
    70 #define P4CRUN_TABLE_NAME "p4cRun"
    71 #define P4CINPUTEXP_TABLE_NAME "p4cInputExp"
     64#define P4RUN_TABLE_NAME "p4Run"
     65#define P4INPUTEXP_TABLE_NAME "p4InputExp"
     66#define P4SCFILE_TABLE_NAME "p4Scfile"
     67#define P4INPUTSCFILE_TABLE_NAME "p4InputScfile"
     68#define P4DIFFSCFILE_TABLE_NAME "p4DiffScfile"
    7269#define P4MAGICMASKIMFILE_TABLE_NAME "p4MagicMaskImfile"
    7370#define SKYCELL_TABLE_NAME "skyCell"
     
    1346313460    return true;
    1346413461}
    13465 static void p4aRunRowFree(p4aRunRow *object);
    13466 
    13467 p4aRunRow *p4aRunRowAlloc(psS32 p4a_id, const char *state, const char *workdir, bool magic)
    13468 {
    13469     p4aRunRow       *_object;
    13470 
    13471     _object = psAlloc(sizeof(p4aRunRow));
    13472     psMemSetDeallocator(_object, (psFreeFunc)p4aRunRowFree);
     13462static void p4RunRowFree(p4RunRow *object);
     13463
     13464p4RunRow *p4RunRowAlloc(psS32 p4a_id, const char *mode, const char *state, const char *workdir, psTime* registered)
     13465{
     13466    p4RunRow        *_object;
     13467
     13468    _object = psAlloc(sizeof(p4RunRow));
     13469    psMemSetDeallocator(_object, (psFreeFunc)p4RunRowFree);
    1347313470
    1347413471    _object->p4a_id = p4a_id;
     13472    _object->mode = psStringCopy(mode);
    1347513473    _object->state = psStringCopy(state);
    1347613474    _object->workdir = psStringCopy(workdir);
    13477     _object->magic = magic;
     13475    _object->registered = psTimeCopy(registered);
    1347813476
    1347913477    return _object;
    1348013478}
    1348113479
    13482 static void p4aRunRowFree(p4aRunRow *object)
    13483 {
     13480static void p4RunRowFree(p4RunRow *object)
     13481{
     13482    psFree(object->mode);
    1348413483    psFree(object->state);
    1348513484    psFree(object->workdir);
    13486 }
    13487 
    13488 bool p4aRunCreateTable(psDB *dbh)
     13485    psFree(object->registered);
     13486}
     13487
     13488bool p4RunCreateTable(psDB *dbh)
    1348913489{
    1349013490    psMetadata *md = psMetadataAlloc();
     
    1349413494        return false;
    1349513495    }
     13496    if (!psMetadataAdd(md, PS_LIST_TAIL, "mode", PS_DATA_STRING, "Key", "64")) {
     13497        psError(PS_ERR_UNKNOWN, false, "failed to add item mode");
     13498        psFree(md);
     13499        return false;
     13500    }
    1349613501    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, "Key", "64")) {
    1349713502        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
     
    1350413509        return false;
    1350513510    }
    13506     if (!psMetadataAdd(md, PS_LIST_TAIL, "magic", PS_DATA_BOOL, "Primary Key", 0)) {
    13507         psError(PS_ERR_UNKNOWN, false, "failed to add item magic");
    13508         psFree(md);
    13509         return false;
    13510     }
    13511 
    13512     bool status = psDBCreateTable(dbh, P4ARUN_TABLE_NAME, md);
     13511    if (!psMetadataAdd(md, PS_LIST_TAIL, "registered", PS_DATA_TIME, NULL, NULL)) {
     13512        psError(PS_ERR_UNKNOWN, false, "failed to add item registered");
     13513        psFree(md);
     13514        return false;
     13515    }
     13516
     13517    bool status = psDBCreateTable(dbh, P4RUN_TABLE_NAME, md);
    1351313518
    1351413519    psFree(md);
     
    1351713522}
    1351813523
    13519 bool p4aRunDropTable(psDB *dbh)
    13520 {
    13521     return psDBDropTable(dbh, P4ARUN_TABLE_NAME);
    13522 }
    13523 
    13524 bool p4aRunInsert(psDB * dbh, psS32 p4a_id, const char *state, const char *workdir, bool magic)
     13524bool p4RunDropTable(psDB *dbh)
     13525{
     13526    return psDBDropTable(dbh, P4RUN_TABLE_NAME);
     13527}
     13528
     13529bool p4RunInsert(psDB * dbh, psS32 p4a_id, const char *mode, const char *state, const char *workdir, psTime* registered)
    1352513530{
    1352613531    psMetadata *md = psMetadataAlloc();
     
    1353013535        return false;
    1353113536    }
     13537    if (!psMetadataAdd(md, PS_LIST_TAIL, "mode", PS_DATA_STRING, NULL, mode)) {
     13538        psError(PS_ERR_UNKNOWN, false, "failed to add item mode");
     13539        psFree(md);
     13540        return false;
     13541    }
    1353213542    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, state)) {
    1353313543        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
     
    1354013550        return false;
    1354113551    }
    13542     if (!psMetadataAdd(md, PS_LIST_TAIL, "magic", PS_DATA_BOOL, NULL, magic)) {
    13543         psError(PS_ERR_UNKNOWN, false, "failed to add item magic");
    13544         psFree(md);
    13545         return false;
    13546     }
    13547 
    13548     bool status = psDBInsertOneRow(dbh, P4ARUN_TABLE_NAME, md);
     13552    if (!psMetadataAdd(md, PS_LIST_TAIL, "registered", PS_DATA_TIME, NULL, registered)) {
     13553        psError(PS_ERR_UNKNOWN, false, "failed to add item registered");
     13554        psFree(md);
     13555        return false;
     13556    }
     13557
     13558    bool status = psDBInsertOneRow(dbh, P4RUN_TABLE_NAME, md);
    1354913559    psFree(md);
    1355013560
     
    1355213562}
    1355313563
    13554 long long p4aRunDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     13564long long p4RunDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    1355513565{
    1355613566    long long       deleted = 0;
    1355713567
    13558     long long count = psDBDeleteRows(dbh, P4ARUN_TABLE_NAME, where, limit);
     13568    long long count = psDBDeleteRows(dbh, P4RUN_TABLE_NAME, where, limit);
    1355913569    if (count < 0) {
    13560         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4aRun");
     13570        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4Run");
    1356113571        return count;
    1356213572
     
    1356613576    return deleted;
    1356713577}
    13568 bool p4aRunInsertObject(psDB *dbh, p4aRunRow *object)
    13569 {
    13570     return p4aRunInsert(dbh, object->p4a_id, object->state, object->workdir, object->magic);
    13571 }
    13572 
    13573 bool p4aRunInsertObjects(psDB *dbh, psArray *objects)
     13578bool p4RunInsertObject(psDB *dbh, p4RunRow *object)
     13579{
     13580    return p4RunInsert(dbh, object->p4a_id, object->mode, object->state, object->workdir, object->registered);
     13581}
     13582
     13583bool p4RunInsertObjects(psDB *dbh, psArray *objects)
    1357413584{
    1357513585    for (long i = 0; i < psArrayLength(objects); i++) {
    13576         if (!p4aRunInsertObject(dbh, objects->data[i])) {
     13586        if (!p4RunInsertObject(dbh, objects->data[i])) {
    1357713587            return false;
    1357813588        }
     
    1358213592}
    1358313593
    13584 bool p4aRunInsertFits(psDB *dbh, const psFits *fits)
     13594bool p4RunInsertFits(psDB *dbh, const psFits *fits)
    1358513595{
    1358613596    psArray         *rowSet;
    1358713597
    13588     // move to (the first?) extension named  P4ARUN_TABLE_NAME
    13589     if (!psFitsMoveExtName(fits, P4ARUN_TABLE_NAME)) {
    13590         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P4ARUN_TABLE_NAME);
     13598    // move to (the first?) extension named  P4RUN_TABLE_NAME
     13599    if (!psFitsMoveExtName(fits, P4RUN_TABLE_NAME)) {
     13600        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P4RUN_TABLE_NAME);
    1359113601        return false;
    1359213602    }
     
    1360613616    }
    1360713617
    13608     if (!psDBInsertRows(dbh, P4ARUN_TABLE_NAME, rowSet)) {
     13618    if (!psDBInsertRows(dbh, P4RUN_TABLE_NAME, rowSet)) {
    1360913619        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    1361013620        psFree(rowSet);
     
    1361713627}
    1361813628
    13619 bool p4aRunSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     13629bool p4RunSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    1362013630{
    1362113631    psArray         *rowSet;
    1362213632
    13623     rowSet = psDBSelectRows(dbh, P4ARUN_TABLE_NAME, where, limit);
     13633    rowSet = psDBSelectRows(dbh, P4RUN_TABLE_NAME, where, limit);
    1362413634    if (!rowSet) {
    1362513635        return false;
     
    1362713637
    1362813638    // output to fits
    13629     if (!psFitsWriteTable(fits, NULL, rowSet, P4ARUN_TABLE_NAME)) {
     13639    if (!psFitsWriteTable(fits, NULL, rowSet, P4RUN_TABLE_NAME)) {
    1363013640        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    1363113641        psFree(rowSet);
     
    1363813648}
    1363913649
    13640 psMetadata *p4aRunMetadataFromObject(const p4aRunRow *object)
     13650psMetadata *p4RunMetadataFromObject(const p4RunRow *object)
    1364113651{
    1364213652    psMetadata *md = psMetadataAlloc();
     
    1364613656        return false;
    1364713657    }
     13658    if (!psMetadataAdd(md, PS_LIST_TAIL, "mode", PS_DATA_STRING, NULL, object->mode)) {
     13659        psError(PS_ERR_UNKNOWN, false, "failed to add item mode");
     13660        psFree(md);
     13661        return false;
     13662    }
    1364813663    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, object->state)) {
    1364913664        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
     
    1365613671        return false;
    1365713672    }
    13658     if (!psMetadataAdd(md, PS_LIST_TAIL, "magic", PS_DATA_BOOL, NULL, object->magic)) {
    13659         psError(PS_ERR_UNKNOWN, false, "failed to add item magic");
     13673    if (!psMetadataAdd(md, PS_LIST_TAIL, "registered", PS_DATA_TIME, NULL, object->registered)) {
     13674        psError(PS_ERR_UNKNOWN, false, "failed to add item registered");
    1366013675        psFree(md);
    1366113676        return false;
     
    1366613681}
    1366713682
    13668 p4aRunRow *p4aRunObjectFromMetadata(psMetadata *md)
     13683p4RunRow *p4RunObjectFromMetadata(psMetadata *md)
    1366913684{
    1367013685
     
    1367513690        return false;
    1367613691    }
     13692    char* mode = psMetadataLookupPtr(&status, md, "mode");
     13693    if (!status) {
     13694        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item mode");
     13695        return false;
     13696    }
    1367713697    char* state = psMetadataLookupPtr(&status, md, "state");
    1367813698    if (!status) {
     
    1368513705        return false;
    1368613706    }
    13687     bool magic = psMetadataLookupBool(&status, md, "magic");
    13688     if (!status) {
    13689         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item magic");
    13690         return false;
    13691     }
    13692 
    13693     return p4aRunRowAlloc(p4a_id, state, workdir, magic);
    13694 }
    13695 psArray *p4aRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     13707    psTime* registered = psMetadataLookupPtr(&status, md, "registered");
     13708    if (!status) {
     13709        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item registered");
     13710        return false;
     13711    }
     13712
     13713    return p4RunRowAlloc(p4a_id, mode, state, workdir, registered);
     13714}
     13715psArray *p4RunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    1369613716{
    1369713717    psArray         *rowSet;
     
    1369913719    psU64           i;
    1370013720
    13701     rowSet = psDBSelectRows(dbh, P4ARUN_TABLE_NAME, where, limit);
     13721    rowSet = psDBSelectRows(dbh, P4RUN_TABLE_NAME, where, limit);
    1370213722    if (!rowSet) {
    1370313723        return NULL;
     
    1370913729
    1371013730    for (i = 0; i < rowSet->n; i++) {
    13711         p4aRunRow *object = p4aRunObjectFromMetadata(rowSet->data[i]);
     13731        p4RunRow *object = p4RunObjectFromMetadata(rowSet->data[i]);
    1371213732        psArrayAdd(returnSet, 0, object);
    1371313733        psFree(object);
     
    1371813738    return returnSet;
    1371913739}
    13720 bool p4aRunDeleteObject(psDB *dbh, const p4aRunRow *object)
    13721 {
    13722     psMetadata *where = p4aRunMetadataFromObject(object);
    13723     long long count = psDBDeleteRows(dbh, P4ARUN_TABLE_NAME, where, 0);
     13740bool p4RunDeleteObject(psDB *dbh, const p4RunRow *object)
     13741{
     13742    psMetadata *where = p4RunMetadataFromObject(object);
     13743    long long count = psDBDeleteRows(dbh, P4RUN_TABLE_NAME, where, 0);
    1372413744    psFree(where);
    1372513745    if (count < 0) {
    13726         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4aRun");
     13746        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4Run");
    1372713747        return false;
    1372813748    }
     
    1373013750        // XXX should this be a psAbort() instead?  It is possible that
    1373113751        // having an object match multiple rows was by design.
    13732         psError(PS_ERR_UNKNOWN, true, "p4aRunRow object matched more then one row.  Check your database schema");
    13733         return false;
    13734     }
    13735 
    13736     return true;
    13737 }
    13738 long long p4aRunDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     13752        psError(PS_ERR_UNKNOWN, true, "p4RunRow object matched more then one row.  Check your database schema");
     13753        return false;
     13754    }
     13755
     13756    return true;
     13757}
     13758long long p4RunDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    1373913759{
    1374013760    long long       deleted = 0;
    1374113761
    1374213762    for (long long i = 0; i < objects->n; i++) {
    13743         p4aRunRow *object = objects->data[i];
    13744         psMetadata *where = p4aRunMetadataFromObject(object);
    13745         long long count = psDBDeleteRows(dbh, P4ARUN_TABLE_NAME, where, limit);
     13763        p4RunRow *object = objects->data[i];
     13764        psMetadata *where = p4RunMetadataFromObject(object);
     13765        long long count = psDBDeleteRows(dbh, P4RUN_TABLE_NAME, where, limit);
    1374613766        psFree(where);
    1374713767        if (count < 0) {
    13748             psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4aRun");
     13768            psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4Run");
    1374913769            return count;
    1375013770        }
     
    1375513775    return deleted;
    1375613776}
    13757 bool p4aRunPrintObjects(FILE *stream, psArray *objects, bool mdcf)
     13777bool p4RunPrintObjects(FILE *stream, psArray *objects, bool mdcf)
    1375813778{
    1375913779    PS_ASSERT_PTR_NON_NULL(objects, false);
     
    1376113781    psMetadata *output = psMetadataAlloc();
    1376213782    for (long i = 0; i < psArrayLength(objects); i++) {
    13763         psMetadata *md = p4aRunMetadataFromObject(objects->data[i]);
     13783        psMetadata *md = p4RunMetadataFromObject(objects->data[i]);
    1376413784        if (!psMetadataAddMetadata(
    1376513785            output,
    1376613786            PS_LIST_TAIL,
    13767             P4ARUN_TABLE_NAME,
     13787            P4RUN_TABLE_NAME,
    1376813788            PS_META_DUPLICATE_OK,
    1376913789            NULL,
     
    1378613806    return true;
    1378713807}
    13788 bool p4aRunPrintObject(FILE *stream, p4aRunRow *object, bool mdcf)
     13808bool p4RunPrintObject(FILE *stream, p4RunRow *object, bool mdcf)
    1378913809{
    1379013810    PS_ASSERT_PTR_NON_NULL(object, false);
    1379113811
    13792     psMetadata *md = p4aRunMetadataFromObject(object);
     13812    psMetadata *md = p4RunMetadataFromObject(object);
    1379313813
    1379413814    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     
    1380113821    return true;
    1380213822}
    13803 static void p4aInputExpRowFree(p4aInputExpRow *object);
    13804 
    13805 p4aInputExpRow *p4aInputExpRowAlloc(psS32 p4a_id, const char *exp_tag, psS32 p3_version)
    13806 {
    13807     p4aInputExpRow  *_object;
    13808 
    13809     _object = psAlloc(sizeof(p4aInputExpRow));
    13810     psMemSetDeallocator(_object, (psFreeFunc)p4aInputExpRowFree);
     13823static void p4InputExpRowFree(p4InputExpRow *object);
     13824
     13825p4InputExpRow *p4InputExpRowAlloc(psS32 p4a_id, const char *exp_tag, psS32 p3_version, bool magiced)
     13826{
     13827    p4InputExpRow   *_object;
     13828
     13829    _object = psAlloc(sizeof(p4InputExpRow));
     13830    psMemSetDeallocator(_object, (psFreeFunc)p4InputExpRowFree);
    1381113831
    1381213832    _object->p4a_id = p4a_id;
    1381313833    _object->exp_tag = psStringCopy(exp_tag);
    1381413834    _object->p3_version = p3_version;
     13835    _object->magiced = magiced;
    1381513836
    1381613837    return _object;
    1381713838}
    1381813839
    13819 static void p4aInputExpRowFree(p4aInputExpRow *object)
     13840static void p4InputExpRowFree(p4InputExpRow *object)
    1382013841{
    1382113842    psFree(object->exp_tag);
    1382213843}
    1382313844
    13824 bool p4aInputExpCreateTable(psDB *dbh)
     13845bool p4InputExpCreateTable(psDB *dbh)
    1382513846{
    1382613847    psMetadata *md = psMetadataAlloc();
     
    1384013861        return false;
    1384113862    }
    13842 
    13843     bool status = psDBCreateTable(dbh, P4AINPUTEXP_TABLE_NAME, md);
     13863    if (!psMetadataAdd(md, PS_LIST_TAIL, "magiced", PS_DATA_BOOL, "Primary Key", 0)) {
     13864        psError(PS_ERR_UNKNOWN, false, "failed to add item magiced");
     13865        psFree(md);
     13866        return false;
     13867    }
     13868
     13869    bool status = psDBCreateTable(dbh, P4INPUTEXP_TABLE_NAME, md);
    1384413870
    1384513871    psFree(md);
     
    1384813874}
    1384913875
    13850 bool p4aInputExpDropTable(psDB *dbh)
    13851 {
    13852     return psDBDropTable(dbh, P4AINPUTEXP_TABLE_NAME);
    13853 }
    13854 
    13855 bool p4aInputExpInsert(psDB * dbh, psS32 p4a_id, const char *exp_tag, psS32 p3_version)
     13876bool p4InputExpDropTable(psDB *dbh)
     13877{
     13878    return psDBDropTable(dbh, P4INPUTEXP_TABLE_NAME);
     13879}
     13880
     13881bool p4InputExpInsert(psDB * dbh, psS32 p4a_id, const char *exp_tag, psS32 p3_version, bool magiced)
    1385613882{
    1385713883    psMetadata *md = psMetadataAlloc();
     
    1387113897        return false;
    1387213898    }
    13873 
    13874     bool status = psDBInsertOneRow(dbh, P4AINPUTEXP_TABLE_NAME, md);
     13899    if (!psMetadataAdd(md, PS_LIST_TAIL, "magiced", PS_DATA_BOOL, NULL, magiced)) {
     13900        psError(PS_ERR_UNKNOWN, false, "failed to add item magiced");
     13901        psFree(md);
     13902        return false;
     13903    }
     13904
     13905    bool status = psDBInsertOneRow(dbh, P4INPUTEXP_TABLE_NAME, md);
    1387513906    psFree(md);
    1387613907
     
    1387813909}
    1387913910
    13880 long long p4aInputExpDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     13911long long p4InputExpDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    1388113912{
    1388213913    long long       deleted = 0;
    1388313914
    13884     long long count = psDBDeleteRows(dbh, P4AINPUTEXP_TABLE_NAME, where, limit);
     13915    long long count = psDBDeleteRows(dbh, P4INPUTEXP_TABLE_NAME, where, limit);
    1388513916    if (count < 0) {
    13886         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4aInputExp");
     13917        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4InputExp");
    1388713918        return count;
    1388813919
     
    1389213923    return deleted;
    1389313924}
    13894 bool p4aInputExpInsertObject(psDB *dbh, p4aInputExpRow *object)
    13895 {
    13896     return p4aInputExpInsert(dbh, object->p4a_id, object->exp_tag, object->p3_version);
    13897 }
    13898 
    13899 bool p4aInputExpInsertObjects(psDB *dbh, psArray *objects)
     13925bool p4InputExpInsertObject(psDB *dbh, p4InputExpRow *object)
     13926{
     13927    return p4InputExpInsert(dbh, object->p4a_id, object->exp_tag, object->p3_version, object->magiced);
     13928}
     13929
     13930bool p4InputExpInsertObjects(psDB *dbh, psArray *objects)
    1390013931{
    1390113932    for (long i = 0; i < psArrayLength(objects); i++) {
    13902         if (!p4aInputExpInsertObject(dbh, objects->data[i])) {
     13933        if (!p4InputExpInsertObject(dbh, objects->data[i])) {
    1390313934            return false;
    1390413935        }
     
    1390813939}
    1390913940
    13910 bool p4aInputExpInsertFits(psDB *dbh, const psFits *fits)
     13941bool p4InputExpInsertFits(psDB *dbh, const psFits *fits)
    1391113942{
    1391213943    psArray         *rowSet;
    1391313944
    13914     // move to (the first?) extension named  P4AINPUTEXP_TABLE_NAME
    13915     if (!psFitsMoveExtName(fits, P4AINPUTEXP_TABLE_NAME)) {
    13916         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P4AINPUTEXP_TABLE_NAME);
     13945    // move to (the first?) extension named  P4INPUTEXP_TABLE_NAME
     13946    if (!psFitsMoveExtName(fits, P4INPUTEXP_TABLE_NAME)) {
     13947        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P4INPUTEXP_TABLE_NAME);
    1391713948        return false;
    1391813949    }
     
    1393213963    }
    1393313964
    13934     if (!psDBInsertRows(dbh, P4AINPUTEXP_TABLE_NAME, rowSet)) {
     13965    if (!psDBInsertRows(dbh, P4INPUTEXP_TABLE_NAME, rowSet)) {
    1393513966        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    1393613967        psFree(rowSet);
     
    1394313974}
    1394413975
    13945 bool p4aInputExpSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     13976bool p4InputExpSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    1394613977{
    1394713978    psArray         *rowSet;
    1394813979
    13949     rowSet = psDBSelectRows(dbh, P4AINPUTEXP_TABLE_NAME, where, limit);
     13980    rowSet = psDBSelectRows(dbh, P4INPUTEXP_TABLE_NAME, where, limit);
    1395013981    if (!rowSet) {
    1395113982        return false;
     
    1395313984
    1395413985    // output to fits
    13955     if (!psFitsWriteTable(fits, NULL, rowSet, P4AINPUTEXP_TABLE_NAME)) {
     13986    if (!psFitsWriteTable(fits, NULL, rowSet, P4INPUTEXP_TABLE_NAME)) {
    1395613987        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    1395713988        psFree(rowSet);
     
    1396413995}
    1396513996
    13966 psMetadata *p4aInputExpMetadataFromObject(const p4aInputExpRow *object)
     13997psMetadata *p4InputExpMetadataFromObject(const p4InputExpRow *object)
    1396713998{
    1396813999    psMetadata *md = psMetadataAlloc();
     
    1398214013        return false;
    1398314014    }
     14015    if (!psMetadataAdd(md, PS_LIST_TAIL, "magiced", PS_DATA_BOOL, NULL, object->magiced)) {
     14016        psError(PS_ERR_UNKNOWN, false, "failed to add item magiced");
     14017        psFree(md);
     14018        return false;
     14019    }
    1398414020
    1398514021
     
    1398714023}
    1398814024
    13989 p4aInputExpRow *p4aInputExpObjectFromMetadata(psMetadata *md)
     14025p4InputExpRow *p4InputExpObjectFromMetadata(psMetadata *md)
    1399014026{
    1399114027
     
    1400614042        return false;
    1400714043    }
    14008 
    14009     return p4aInputExpRowAlloc(p4a_id, exp_tag, p3_version);
    14010 }
    14011 psArray *p4aInputExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     14044    bool magiced = psMetadataLookupBool(&status, md, "magiced");
     14045    if (!status) {
     14046        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item magiced");
     14047        return false;
     14048    }
     14049
     14050    return p4InputExpRowAlloc(p4a_id, exp_tag, p3_version, magiced);
     14051}
     14052psArray *p4InputExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    1401214053{
    1401314054    psArray         *rowSet;
     
    1401514056    psU64           i;
    1401614057
    14017     rowSet = psDBSelectRows(dbh, P4AINPUTEXP_TABLE_NAME, where, limit);
     14058    rowSet = psDBSelectRows(dbh, P4INPUTEXP_TABLE_NAME, where, limit);
    1401814059    if (!rowSet) {
    1401914060        return NULL;
     
    1402514066
    1402614067    for (i = 0; i < rowSet->n; i++) {
    14027         p4aInputExpRow *object = p4aInputExpObjectFromMetadata(rowSet->data[i]);
     14068        p4InputExpRow *object = p4InputExpObjectFromMetadata(rowSet->data[i]);
    1402814069        psArrayAdd(returnSet, 0, object);
    1402914070        psFree(object);
     
    1403414075    return returnSet;
    1403514076}
    14036 bool p4aInputExpDeleteObject(psDB *dbh, const p4aInputExpRow *object)
    14037 {
    14038     psMetadata *where = p4aInputExpMetadataFromObject(object);
    14039     long long count = psDBDeleteRows(dbh, P4AINPUTEXP_TABLE_NAME, where, 0);
     14077bool p4InputExpDeleteObject(psDB *dbh, const p4InputExpRow *object)
     14078{
     14079    psMetadata *where = p4InputExpMetadataFromObject(object);
     14080    long long count = psDBDeleteRows(dbh, P4INPUTEXP_TABLE_NAME, where, 0);
    1404014081    psFree(where);
    1404114082    if (count < 0) {
    14042         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4aInputExp");
     14083        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4InputExp");
    1404314084        return false;
    1404414085    }
     
    1404614087        // XXX should this be a psAbort() instead?  It is possible that
    1404714088        // having an object match multiple rows was by design.
    14048         psError(PS_ERR_UNKNOWN, true, "p4aInputExpRow object matched more then one row.  Check your database schema");
    14049         return false;
    14050     }
    14051 
    14052     return true;
    14053 }
    14054 long long p4aInputExpDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     14089        psError(PS_ERR_UNKNOWN, true, "p4InputExpRow object matched more then one row.  Check your database schema");
     14090        return false;
     14091    }
     14092
     14093    return true;
     14094}
     14095long long p4InputExpDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    1405514096{
    1405614097    long long       deleted = 0;
    1405714098
    1405814099    for (long long i = 0; i < objects->n; i++) {
    14059         p4aInputExpRow *object = objects->data[i];
    14060         psMetadata *where = p4aInputExpMetadataFromObject(object);
    14061         long long count = psDBDeleteRows(dbh, P4AINPUTEXP_TABLE_NAME, where, limit);
     14100        p4InputExpRow *object = objects->data[i];
     14101        psMetadata *where = p4InputExpMetadataFromObject(object);
     14102        long long count = psDBDeleteRows(dbh, P4INPUTEXP_TABLE_NAME, where, limit);
    1406214103        psFree(where);
    1406314104        if (count < 0) {
    14064             psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4aInputExp");
     14105            psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4InputExp");
    1406514106            return count;
    1406614107        }
     
    1407114112    return deleted;
    1407214113}
    14073 bool p4aInputExpPrintObjects(FILE *stream, psArray *objects, bool mdcf)
     14114bool p4InputExpPrintObjects(FILE *stream, psArray *objects, bool mdcf)
    1407414115{
    1407514116    PS_ASSERT_PTR_NON_NULL(objects, false);
     
    1407714118    psMetadata *output = psMetadataAlloc();
    1407814119    for (long i = 0; i < psArrayLength(objects); i++) {
    14079         psMetadata *md = p4aInputExpMetadataFromObject(objects->data[i]);
     14120        psMetadata *md = p4InputExpMetadataFromObject(objects->data[i]);
    1408014121        if (!psMetadataAddMetadata(
    1408114122            output,
    1408214123            PS_LIST_TAIL,
    14083             P4AINPUTEXP_TABLE_NAME,
     14124            P4INPUTEXP_TABLE_NAME,
    1408414125            PS_META_DUPLICATE_OK,
    1408514126            NULL,
     
    1410214143    return true;
    1410314144}
    14104 bool p4aInputExpPrintObject(FILE *stream, p4aInputExpRow *object, bool mdcf)
     14145bool p4InputExpPrintObject(FILE *stream, p4InputExpRow *object, bool mdcf)
    1410514146{
    1410614147    PS_ASSERT_PTR_NON_NULL(object, false);
    1410714148
    14108     psMetadata *md = p4aInputExpMetadataFromObject(object);
     14149    psMetadata *md = p4InputExpMetadataFromObject(object);
    1410914150
    1411014151    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     
    1411714158    return true;
    1411814159}
    14119 static void p4aScfileRowFree(p4aScfileRow *object);
    14120 
    14121 p4aScfileRow *p4aScfileRowAlloc(psS32 p4a_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *uri, psF64 bg, psF64 bg_mean_stdev)
    14122 {
    14123     p4aScfileRow    *_object;
    14124 
    14125     _object = psAlloc(sizeof(p4aScfileRow));
    14126     psMemSetDeallocator(_object, (psFreeFunc)p4aScfileRowFree);
     14160static void p4ScfileRowFree(p4ScfileRow *object);
     14161
     14162p4ScfileRow *p4ScfileRowAlloc(psS32 p4a_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *uri, psF64 bg, psF64 bg_mean_stdev)
     14163{
     14164    p4ScfileRow     *_object;
     14165
     14166    _object = psAlloc(sizeof(p4ScfileRow));
     14167    psMemSetDeallocator(_object, (psFreeFunc)p4ScfileRowFree);
    1412714168
    1412814169    _object->p4a_id = p4a_id;
     
    1413814179}
    1413914180
    14140 static void p4aScfileRowFree(p4aScfileRow *object)
     14181static void p4ScfileRowFree(p4ScfileRow *object)
    1414114182{
    1414214183    psFree(object->skycell_id);
     
    1414614187}
    1414714188
    14148 bool p4aScfileCreateTable(psDB *dbh)
     14189bool p4ScfileCreateTable(psDB *dbh)
    1414914190{
    1415014191    psMetadata *md = psMetadataAlloc();
     
    1419014231    }
    1419114232
    14192     bool status = psDBCreateTable(dbh, P4ASCFILE_TABLE_NAME, md);
     14233    bool status = psDBCreateTable(dbh, P4SCFILE_TABLE_NAME, md);
    1419314234
    1419414235    psFree(md);
     
    1419714238}
    1419814239
    14199 bool p4aScfileDropTable(psDB *dbh)
    14200 {
    14201     return psDBDropTable(dbh, P4ASCFILE_TABLE_NAME);
    14202 }
    14203 
    14204 bool p4aScfileInsert(psDB * dbh, psS32 p4a_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *uri, psF64 bg, psF64 bg_mean_stdev)
     14240bool p4ScfileDropTable(psDB *dbh)
     14241{
     14242    return psDBDropTable(dbh, P4SCFILE_TABLE_NAME);
     14243}
     14244
     14245bool p4ScfileInsert(psDB * dbh, psS32 p4a_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *uri, psF64 bg, psF64 bg_mean_stdev)
    1420514246{
    1420614247    psMetadata *md = psMetadataAlloc();
     
    1424614287    }
    1424714288
    14248     bool status = psDBInsertOneRow(dbh, P4ASCFILE_TABLE_NAME, md);
     14289    bool status = psDBInsertOneRow(dbh, P4SCFILE_TABLE_NAME, md);
    1424914290    psFree(md);
    1425014291
     
    1425214293}
    1425314294
    14254 long long p4aScfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     14295long long p4ScfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    1425514296{
    1425614297    long long       deleted = 0;
    1425714298
    14258     long long count = psDBDeleteRows(dbh, P4ASCFILE_TABLE_NAME, where, limit);
     14299    long long count = psDBDeleteRows(dbh, P4SCFILE_TABLE_NAME, where, limit);
    1425914300    if (count < 0) {
    14260         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4aScfile");
     14301        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4Scfile");
    1426114302        return count;
    1426214303
     
    1426614307    return deleted;
    1426714308}
    14268 bool p4aScfileInsertObject(psDB *dbh, p4aScfileRow *object)
    14269 {
    14270     return p4aScfileInsert(dbh, object->p4a_id, object->skycell_id, object->tess_id, object->exp_tag, object->p3_version, object->uri, object->bg, object->bg_mean_stdev);
    14271 }
    14272 
    14273 bool p4aScfileInsertObjects(psDB *dbh, psArray *objects)
     14309bool p4ScfileInsertObject(psDB *dbh, p4ScfileRow *object)
     14310{
     14311    return p4ScfileInsert(dbh, object->p4a_id, object->skycell_id, object->tess_id, object->exp_tag, object->p3_version, object->uri, object->bg, object->bg_mean_stdev);
     14312}
     14313
     14314bool p4ScfileInsertObjects(psDB *dbh, psArray *objects)
    1427414315{
    1427514316    for (long i = 0; i < psArrayLength(objects); i++) {
    14276         if (!p4aScfileInsertObject(dbh, objects->data[i])) {
     14317        if (!p4ScfileInsertObject(dbh, objects->data[i])) {
    1427714318            return false;
    1427814319        }
     
    1428214323}
    1428314324
    14284 bool p4aScfileInsertFits(psDB *dbh, const psFits *fits)
     14325bool p4ScfileInsertFits(psDB *dbh, const psFits *fits)
    1428514326{
    1428614327    psArray         *rowSet;
    1428714328
    14288     // move to (the first?) extension named  P4ASCFILE_TABLE_NAME
    14289     if (!psFitsMoveExtName(fits, P4ASCFILE_TABLE_NAME)) {
    14290         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P4ASCFILE_TABLE_NAME);
     14329    // move to (the first?) extension named  P4SCFILE_TABLE_NAME
     14330    if (!psFitsMoveExtName(fits, P4SCFILE_TABLE_NAME)) {
     14331        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P4SCFILE_TABLE_NAME);
    1429114332        return false;
    1429214333    }
     
    1430614347    }
    1430714348
    14308     if (!psDBInsertRows(dbh, P4ASCFILE_TABLE_NAME, rowSet)) {
     14349    if (!psDBInsertRows(dbh, P4SCFILE_TABLE_NAME, rowSet)) {
    1430914350        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    1431014351        psFree(rowSet);
     
    1431714358}
    1431814359
    14319 bool p4aScfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     14360bool p4ScfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    1432014361{
    1432114362    psArray         *rowSet;
    1432214363
    14323     rowSet = psDBSelectRows(dbh, P4ASCFILE_TABLE_NAME, where, limit);
     14364    rowSet = psDBSelectRows(dbh, P4SCFILE_TABLE_NAME, where, limit);
    1432414365    if (!rowSet) {
    1432514366        return false;
     
    1432714368
    1432814369    // output to fits
    14329     if (!psFitsWriteTable(fits, NULL, rowSet, P4ASCFILE_TABLE_NAME)) {
     14370    if (!psFitsWriteTable(fits, NULL, rowSet, P4SCFILE_TABLE_NAME)) {
    1433014371        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    1433114372        psFree(rowSet);
     
    1433814379}
    1433914380
    14340 psMetadata *p4aScfileMetadataFromObject(const p4aScfileRow *object)
     14381psMetadata *p4ScfileMetadataFromObject(const p4ScfileRow *object)
    1434114382{
    1434214383    psMetadata *md = psMetadataAlloc();
     
    1438614427}
    1438714428
    14388 p4aScfileRow *p4aScfileObjectFromMetadata(psMetadata *md)
     14429p4ScfileRow *p4ScfileObjectFromMetadata(psMetadata *md)
    1438914430{
    1439014431
     
    1443114472    }
    1443214473
    14433     return p4aScfileRowAlloc(p4a_id, skycell_id, tess_id, exp_tag, p3_version, uri, bg, bg_mean_stdev);
    14434 }
    14435 psArray *p4aScfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     14474    return p4ScfileRowAlloc(p4a_id, skycell_id, tess_id, exp_tag, p3_version, uri, bg, bg_mean_stdev);
     14475}
     14476psArray *p4ScfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    1443614477{
    1443714478    psArray         *rowSet;
     
    1443914480    psU64           i;
    1444014481
    14441     rowSet = psDBSelectRows(dbh, P4ASCFILE_TABLE_NAME, where, limit);
     14482    rowSet = psDBSelectRows(dbh, P4SCFILE_TABLE_NAME, where, limit);
    1444214483    if (!rowSet) {
    1444314484        return NULL;
     
    1444914490
    1445014491    for (i = 0; i < rowSet->n; i++) {
    14451         p4aScfileRow *object = p4aScfileObjectFromMetadata(rowSet->data[i]);
     14492        p4ScfileRow *object = p4ScfileObjectFromMetadata(rowSet->data[i]);
    1445214493        psArrayAdd(returnSet, 0, object);
    1445314494        psFree(object);
     
    1445814499    return returnSet;
    1445914500}
    14460 bool p4aScfileDeleteObject(psDB *dbh, const p4aScfileRow *object)
    14461 {
    14462     psMetadata *where = p4aScfileMetadataFromObject(object);
    14463     long long count = psDBDeleteRows(dbh, P4ASCFILE_TABLE_NAME, where, 0);
     14501bool p4ScfileDeleteObject(psDB *dbh, const p4ScfileRow *object)
     14502{
     14503    psMetadata *where = p4ScfileMetadataFromObject(object);
     14504    long long count = psDBDeleteRows(dbh, P4SCFILE_TABLE_NAME, where, 0);
    1446414505    psFree(where);
    1446514506    if (count < 0) {
    14466         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4aScfile");
     14507        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4Scfile");
    1446714508        return false;
    1446814509    }
     
    1447014511        // XXX should this be a psAbort() instead?  It is possible that
    1447114512        // having an object match multiple rows was by design.
    14472         psError(PS_ERR_UNKNOWN, true, "p4aScfileRow object matched more then one row.  Check your database schema");
    14473         return false;
    14474     }
    14475 
    14476     return true;
    14477 }
    14478 long long p4aScfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     14513        psError(PS_ERR_UNKNOWN, true, "p4ScfileRow object matched more then one row.  Check your database schema");
     14514        return false;
     14515    }
     14516
     14517    return true;
     14518}
     14519long long p4ScfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    1447914520{
    1448014521    long long       deleted = 0;
    1448114522
    1448214523    for (long long i = 0; i < objects->n; i++) {
    14483         p4aScfileRow *object = objects->data[i];
    14484         psMetadata *where = p4aScfileMetadataFromObject(object);
    14485         long long count = psDBDeleteRows(dbh, P4ASCFILE_TABLE_NAME, where, limit);
     14524        p4ScfileRow *object = objects->data[i];
     14525        psMetadata *where = p4ScfileMetadataFromObject(object);
     14526        long long count = psDBDeleteRows(dbh, P4SCFILE_TABLE_NAME, where, limit);
    1448614527        psFree(where);
    1448714528        if (count < 0) {
    14488             psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4aScfile");
     14529            psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4Scfile");
    1448914530            return count;
    1449014531        }
     
    1449514536    return deleted;
    1449614537}
    14497 bool p4aScfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
     14538bool p4ScfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
    1449814539{
    1449914540    PS_ASSERT_PTR_NON_NULL(objects, false);
     
    1450114542    psMetadata *output = psMetadataAlloc();
    1450214543    for (long i = 0; i < psArrayLength(objects); i++) {
    14503         psMetadata *md = p4aScfileMetadataFromObject(objects->data[i]);
     14544        psMetadata *md = p4ScfileMetadataFromObject(objects->data[i]);
    1450414545        if (!psMetadataAddMetadata(
    1450514546            output,
    1450614547            PS_LIST_TAIL,
    14507             P4ASCFILE_TABLE_NAME,
     14548            P4SCFILE_TABLE_NAME,
    1450814549            PS_META_DUPLICATE_OK,
    1450914550            NULL,
     
    1452614567    return true;
    1452714568}
    14528 bool p4aScfilePrintObject(FILE *stream, p4aScfileRow *object, bool mdcf)
     14569bool p4ScfilePrintObject(FILE *stream, p4ScfileRow *object, bool mdcf)
    1452914570{
    1453014571    PS_ASSERT_PTR_NON_NULL(object, false);
    1453114572
    14532     psMetadata *md = p4aScfileMetadataFromObject(object);
     14573    psMetadata *md = p4ScfileMetadataFromObject(object);
    1453314574
    1453414575    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     
    1454114582    return true;
    1454214583}
    14543 static void p4bRunRowFree(p4bRunRow *object);
    14544 
    14545 p4bRunRow *p4bRunRowAlloc(psS32 p4b_id, const char *state, const char *workdir, bool magic)
    14546 {
    14547     p4bRunRow      *_object;
    14548 
    14549     _object = psAlloc(sizeof(p4bRunRow));
    14550     psMemSetDeallocator(_object, (psFreeFunc)p4bRunRowFree);
     14584static void p4InputScfileRowFree(p4InputScfileRow *object);
     14585
     14586p4InputScfileRow *p4InputScfileRowAlloc(psS32 p4b_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *kind)
     14587{
     14588    p4InputScfileRow *_object;
     14589
     14590    _object = psAlloc(sizeof(p4InputScfileRow));
     14591    psMemSetDeallocator(_object, (psFreeFunc)p4InputScfileRowFree);
    1455114592
    1455214593    _object->p4b_id = p4b_id;
    14553     _object->state = psStringCopy(state);
    14554     _object->workdir = psStringCopy(workdir);
    14555     _object->magic = magic;
     14594    _object->skycell_id = psStringCopy(skycell_id);
     14595    _object->tess_id = psStringCopy(tess_id);
     14596    _object->exp_tag = psStringCopy(exp_tag);
     14597    _object->p3_version = p3_version;
     14598    _object->kind = psStringCopy(kind);
    1455614599
    1455714600    return _object;
    1455814601}
    1455914602
    14560 static void p4bRunRowFree(p4bRunRow *object)
    14561 {
    14562     psFree(object->state);
    14563     psFree(object->workdir);
    14564 }
    14565 
    14566 bool p4bRunCreateTable(psDB *dbh)
     14603static void p4InputScfileRowFree(p4InputScfileRow *object)
     14604{
     14605    psFree(object->skycell_id);
     14606    psFree(object->tess_id);
     14607    psFree(object->exp_tag);
     14608    psFree(object->kind);
     14609}
     14610
     14611bool p4InputScfileCreateTable(psDB *dbh)
    1456714612{
    1456814613    psMetadata *md = psMetadataAlloc();
    14569     if (!psMetadataAdd(md, PS_LIST_TAIL, "p4b_id", PS_DATA_S32, "Primary Key AUTO_INCREMENT", 0)) {
     14614    if (!psMetadataAdd(md, PS_LIST_TAIL, "p4b_id", PS_DATA_S32, "Primary Key", 0)) {
    1457014615        psError(PS_ERR_UNKNOWN, false, "failed to add item p4b_id");
    1457114616        psFree(md);
    1457214617        return false;
    1457314618    }
    14574     if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, "Key", "64")) {
    14575         psError(PS_ERR_UNKNOWN, false, "failed to add item state");
    14576         psFree(md);
    14577         return false;
    14578     }
    14579     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, "255")) {
    14580         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    14581         psFree(md);
    14582         return false;
    14583     }
    14584     if (!psMetadataAdd(md, PS_LIST_TAIL, "magic", PS_DATA_BOOL, "Primary Key", 0)) {
    14585         psError(PS_ERR_UNKNOWN, false, "failed to add item magic");
    14586         psFree(md);
    14587         return false;
    14588     }
    14589 
    14590     bool status = psDBCreateTable(dbh, P4BRUN_TABLE_NAME, md);
     14619    if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, "Primary Key", "64")) {
     14620        psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");
     14621        psFree(md);
     14622        return false;
     14623    }
     14624    if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, "Primary Key", "64")) {
     14625        psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");
     14626        psFree(md);
     14627        return false;
     14628    }
     14629    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
     14630        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     14631        psFree(md);
     14632        return false;
     14633    }
     14634    if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, "Primary Key", 0)) {
     14635        psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version");
     14636        psFree(md);
     14637        return false;
     14638    }
     14639    if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, "Key", "64")) {
     14640        psError(PS_ERR_UNKNOWN, false, "failed to add item kind");
     14641        psFree(md);
     14642        return false;
     14643    }
     14644
     14645    bool status = psDBCreateTable(dbh, P4INPUTSCFILE_TABLE_NAME, md);
    1459114646
    1459214647    psFree(md);
     
    1459514650}
    1459614651
    14597 bool p4bRunDropTable(psDB *dbh)
    14598 {
    14599     return psDBDropTable(dbh, P4BRUN_TABLE_NAME);
    14600 }
    14601 
    14602 bool p4bRunInsert(psDB * dbh, psS32 p4b_id, const char *state, const char *workdir, bool magic)
     14652bool p4InputScfileDropTable(psDB *dbh)
     14653{
     14654    return psDBDropTable(dbh, P4INPUTSCFILE_TABLE_NAME);
     14655}
     14656
     14657bool p4InputScfileInsert(psDB * dbh, psS32 p4b_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *kind)
    1460314658{
    1460414659    psMetadata *md = psMetadataAlloc();
     
    1460814663        return false;
    1460914664    }
    14610     if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, state)) {
    14611         psError(PS_ERR_UNKNOWN, false, "failed to add item state");
    14612         psFree(md);
    14613         return false;
    14614     }
    14615     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) {
    14616         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    14617         psFree(md);
    14618         return false;
    14619     }
    14620     if (!psMetadataAdd(md, PS_LIST_TAIL, "magic", PS_DATA_BOOL, NULL, magic)) {
    14621         psError(PS_ERR_UNKNOWN, false, "failed to add item magic");
    14622         psFree(md);
    14623         return false;
    14624     }
    14625 
    14626     bool status = psDBInsertOneRow(dbh, P4BRUN_TABLE_NAME, md);
     14665    if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, skycell_id)) {
     14666        psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");
     14667        psFree(md);
     14668        return false;
     14669    }
     14670    if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, tess_id)) {
     14671        psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");
     14672        psFree(md);
     14673        return false;
     14674    }
     14675    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
     14676        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     14677        psFree(md);
     14678        return false;
     14679    }
     14680    if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, NULL, p3_version)) {
     14681        psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version");
     14682        psFree(md);
     14683        return false;
     14684    }
     14685    if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, NULL, kind)) {
     14686        psError(PS_ERR_UNKNOWN, false, "failed to add item kind");
     14687        psFree(md);
     14688        return false;
     14689    }
     14690
     14691    bool status = psDBInsertOneRow(dbh, P4INPUTSCFILE_TABLE_NAME, md);
    1462714692    psFree(md);
    1462814693
     
    1463014695}
    1463114696
    14632 long long p4bRunDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     14697long long p4InputScfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    1463314698{
    1463414699    long long       deleted = 0;
    1463514700
    14636     long long count = psDBDeleteRows(dbh, P4BRUN_TABLE_NAME, where, limit);
     14701    long long count = psDBDeleteRows(dbh, P4INPUTSCFILE_TABLE_NAME, where, limit);
    1463714702    if (count < 0) {
    14638         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4bRun");
     14703        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4InputScfile");
    1463914704        return count;
    1464014705
     
    1464414709    return deleted;
    1464514710}
    14646 bool p4bRunInsertObject(psDB *dbh, p4bRunRow *object)
    14647 {
    14648     return p4bRunInsert(dbh, object->p4b_id, object->state, object->workdir, object->magic);
    14649 }
    14650 
    14651 bool p4bRunInsertObjects(psDB *dbh, psArray *objects)
     14711bool p4InputScfileInsertObject(psDB *dbh, p4InputScfileRow *object)
     14712{
     14713    return p4InputScfileInsert(dbh, object->p4b_id, object->skycell_id, object->tess_id, object->exp_tag, object->p3_version, object->kind);
     14714}
     14715
     14716bool p4InputScfileInsertObjects(psDB *dbh, psArray *objects)
    1465214717{
    1465314718    for (long i = 0; i < psArrayLength(objects); i++) {
    14654         if (!p4bRunInsertObject(dbh, objects->data[i])) {
     14719        if (!p4InputScfileInsertObject(dbh, objects->data[i])) {
    1465514720            return false;
    1465614721        }
     
    1466014725}
    1466114726
    14662 bool p4bRunInsertFits(psDB *dbh, const psFits *fits)
     14727bool p4InputScfileInsertFits(psDB *dbh, const psFits *fits)
    1466314728{
    1466414729    psArray         *rowSet;
    1466514730
    14666     // move to (the first?) extension named  P4BRUN_TABLE_NAME
    14667     if (!psFitsMoveExtName(fits, P4BRUN_TABLE_NAME)) {
    14668         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P4BRUN_TABLE_NAME);
     14731    // move to (the first?) extension named  P4INPUTSCFILE_TABLE_NAME
     14732    if (!psFitsMoveExtName(fits, P4INPUTSCFILE_TABLE_NAME)) {
     14733        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P4INPUTSCFILE_TABLE_NAME);
    1466914734        return false;
    1467014735    }
     
    1468414749    }
    1468514750
    14686     if (!psDBInsertRows(dbh, P4BRUN_TABLE_NAME, rowSet)) {
     14751    if (!psDBInsertRows(dbh, P4INPUTSCFILE_TABLE_NAME, rowSet)) {
    1468714752        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    1468814753        psFree(rowSet);
     
    1469514760}
    1469614761
    14697 bool p4bRunSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     14762bool p4InputScfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    1469814763{
    1469914764    psArray         *rowSet;
    1470014765
    14701     rowSet = psDBSelectRows(dbh, P4BRUN_TABLE_NAME, where, limit);
     14766    rowSet = psDBSelectRows(dbh, P4INPUTSCFILE_TABLE_NAME, where, limit);
    1470214767    if (!rowSet) {
    1470314768        return false;
     
    1470514770
    1470614771    // output to fits
    14707     if (!psFitsWriteTable(fits, NULL, rowSet, P4BRUN_TABLE_NAME)) {
     14772    if (!psFitsWriteTable(fits, NULL, rowSet, P4INPUTSCFILE_TABLE_NAME)) {
    1470814773        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    1470914774        psFree(rowSet);
     
    1471614781}
    1471714782
    14718 psMetadata *p4bRunMetadataFromObject(const p4bRunRow *object)
     14783psMetadata *p4InputScfileMetadataFromObject(const p4InputScfileRow *object)
    1471914784{
    1472014785    psMetadata *md = psMetadataAlloc();
     
    1472414789        return false;
    1472514790    }
    14726     if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, object->state)) {
    14727         psError(PS_ERR_UNKNOWN, false, "failed to add item state");
    14728         psFree(md);
    14729         return false;
    14730     }
    14731     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, object->workdir)) {
    14732         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    14733         psFree(md);
    14734         return false;
    14735     }
    14736     if (!psMetadataAdd(md, PS_LIST_TAIL, "magic", PS_DATA_BOOL, NULL, object->magic)) {
    14737         psError(PS_ERR_UNKNOWN, false, "failed to add item magic");
     14791    if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, object->skycell_id)) {
     14792        psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");
     14793        psFree(md);
     14794        return false;
     14795    }
     14796    if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, object->tess_id)) {
     14797        psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");
     14798        psFree(md);
     14799        return false;
     14800    }
     14801    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
     14802        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     14803        psFree(md);
     14804        return false;
     14805    }
     14806    if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, NULL, object->p3_version)) {
     14807        psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version");
     14808        psFree(md);
     14809        return false;
     14810    }
     14811    if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, NULL, object->kind)) {
     14812        psError(PS_ERR_UNKNOWN, false, "failed to add item kind");
    1473814813        psFree(md);
    1473914814        return false;
     
    1474414819}
    1474514820
    14746 p4bRunRow *p4bRunObjectFromMetadata(psMetadata *md)
     14821p4InputScfileRow *p4InputScfileObjectFromMetadata(psMetadata *md)
    1474714822{
    1474814823
     
    1475314828        return false;
    1475414829    }
    14755     char* state = psMetadataLookupPtr(&status, md, "state");
    14756     if (!status) {
    14757         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item state");
    14758         return false;
    14759     }
    14760     char* workdir = psMetadataLookupPtr(&status, md, "workdir");
    14761     if (!status) {
    14762         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item workdir");
    14763         return false;
    14764     }
    14765     bool magic = psMetadataLookupBool(&status, md, "magic");
    14766     if (!status) {
    14767         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item magic");
    14768         return false;
    14769     }
    14770 
    14771     return p4bRunRowAlloc(p4b_id, state, workdir, magic);
    14772 }
    14773 psArray *p4bRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     14830    char* skycell_id = psMetadataLookupPtr(&status, md, "skycell_id");
     14831    if (!status) {
     14832        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item skycell_id");
     14833        return false;
     14834    }
     14835    char* tess_id = psMetadataLookupPtr(&status, md, "tess_id");
     14836    if (!status) {
     14837        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item tess_id");
     14838        return false;
     14839    }
     14840    char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
     14841    if (!status) {
     14842        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
     14843        return false;
     14844    }
     14845    psS32 p3_version = psMetadataLookupS32(&status, md, "p3_version");
     14846    if (!status) {
     14847        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p3_version");
     14848        return false;
     14849    }
     14850    char* kind = psMetadataLookupPtr(&status, md, "kind");
     14851    if (!status) {
     14852        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kind");
     14853        return false;
     14854    }
     14855
     14856    return p4InputScfileRowAlloc(p4b_id, skycell_id, tess_id, exp_tag, p3_version, kind);
     14857}
     14858psArray *p4InputScfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    1477414859{
    1477514860    psArray         *rowSet;
     
    1477714862    psU64           i;
    1477814863
    14779     rowSet = psDBSelectRows(dbh, P4BRUN_TABLE_NAME, where, limit);
     14864    rowSet = psDBSelectRows(dbh, P4INPUTSCFILE_TABLE_NAME, where, limit);
    1478014865    if (!rowSet) {
    1478114866        return NULL;
     
    1478714872
    1478814873    for (i = 0; i < rowSet->n; i++) {
    14789         p4bRunRow *object = p4bRunObjectFromMetadata(rowSet->data[i]);
     14874        p4InputScfileRow *object = p4InputScfileObjectFromMetadata(rowSet->data[i]);
    1479014875        psArrayAdd(returnSet, 0, object);
    1479114876        psFree(object);
     
    1479614881    return returnSet;
    1479714882}
    14798 bool p4bRunDeleteObject(psDB *dbh, const p4bRunRow *object)
    14799 {
    14800     psMetadata *where = p4bRunMetadataFromObject(object);
    14801     long long count = psDBDeleteRows(dbh, P4BRUN_TABLE_NAME, where, 0);
     14883bool p4InputScfileDeleteObject(psDB *dbh, const p4InputScfileRow *object)
     14884{
     14885    psMetadata *where = p4InputScfileMetadataFromObject(object);
     14886    long long count = psDBDeleteRows(dbh, P4INPUTSCFILE_TABLE_NAME, where, 0);
    1480214887    psFree(where);
    1480314888    if (count < 0) {
    14804         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4bRun");
     14889        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4InputScfile");
    1480514890        return false;
    1480614891    }
     
    1480814893        // XXX should this be a psAbort() instead?  It is possible that
    1480914894        // having an object match multiple rows was by design.
    14810         psError(PS_ERR_UNKNOWN, true, "p4bRunRow object matched more then one row.  Check your database schema");
    14811         return false;
    14812     }
    14813 
    14814     return true;
    14815 }
    14816 long long p4bRunDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     14895        psError(PS_ERR_UNKNOWN, true, "p4InputScfileRow object matched more then one row.  Check your database schema");
     14896        return false;
     14897    }
     14898
     14899    return true;
     14900}
     14901long long p4InputScfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    1481714902{
    1481814903    long long       deleted = 0;
    1481914904
    1482014905    for (long long i = 0; i < objects->n; i++) {
    14821         p4bRunRow *object = objects->data[i];
    14822         psMetadata *where = p4bRunMetadataFromObject(object);
    14823         long long count = psDBDeleteRows(dbh, P4BRUN_TABLE_NAME, where, limit);
     14906        p4InputScfileRow *object = objects->data[i];
     14907        psMetadata *where = p4InputScfileMetadataFromObject(object);
     14908        long long count = psDBDeleteRows(dbh, P4INPUTSCFILE_TABLE_NAME, where, limit);
    1482414909        psFree(where);
    1482514910        if (count < 0) {
    14826             psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4bRun");
     14911            psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4InputScfile");
    1482714912            return count;
    1482814913        }
     
    1483314918    return deleted;
    1483414919}
    14835 bool p4bRunPrintObjects(FILE *stream, psArray *objects, bool mdcf)
     14920bool p4InputScfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
    1483614921{
    1483714922    PS_ASSERT_PTR_NON_NULL(objects, false);
     
    1483914924    psMetadata *output = psMetadataAlloc();
    1484014925    for (long i = 0; i < psArrayLength(objects); i++) {
    14841         psMetadata *md = p4bRunMetadataFromObject(objects->data[i]);
     14926        psMetadata *md = p4InputScfileMetadataFromObject(objects->data[i]);
    1484214927        if (!psMetadataAddMetadata(
    1484314928            output,
    1484414929            PS_LIST_TAIL,
    14845             P4BRUN_TABLE_NAME,
     14930            P4INPUTSCFILE_TABLE_NAME,
    1484614931            PS_META_DUPLICATE_OK,
    1484714932            NULL,
     
    1486414949    return true;
    1486514950}
    14866 bool p4bRunPrintObject(FILE *stream, p4bRunRow *object, bool mdcf)
     14951bool p4InputScfilePrintObject(FILE *stream, p4InputScfileRow *object, bool mdcf)
    1486714952{
    1486814953    PS_ASSERT_PTR_NON_NULL(object, false);
    1486914954
    14870     psMetadata *md = p4bRunMetadataFromObject(object);
     14955    psMetadata *md = p4InputScfileMetadataFromObject(object);
    1487114956
    1487214957    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     
    1487914964    return true;
    1488014965}
    14881 static void p4bInputScfileRowFree(p4bInputScfileRow *object);
    14882 
    14883 p4bInputScfileRow *p4bInputScfileRowAlloc(psS32 p4b_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *kind)
    14884 {
    14885     p4bInputScfileRow *_object;
    14886 
    14887     _object = psAlloc(sizeof(p4bInputScfileRow));
    14888     psMemSetDeallocator(_object, (psFreeFunc)p4bInputScfileRowFree);
     14966static void p4DiffScfileRowFree(p4DiffScfileRow *object);
     14967
     14968p4DiffScfileRow *p4DiffScfileRowAlloc(psS32 p4b_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *uri, psF64 bg, psF64 bg_mean_stdev)
     14969{
     14970    p4DiffScfileRow *_object;
     14971
     14972    _object = psAlloc(sizeof(p4DiffScfileRow));
     14973    psMemSetDeallocator(_object, (psFreeFunc)p4DiffScfileRowFree);
    1488914974
    1489014975    _object->p4b_id = p4b_id;
     
    1489314978    _object->exp_tag = psStringCopy(exp_tag);
    1489414979    _object->p3_version = p3_version;
    14895     _object->kind = psStringCopy(kind);
     14980    _object->uri = psStringCopy(uri);
     14981    _object->bg = bg;
     14982    _object->bg_mean_stdev = bg_mean_stdev;
    1489614983
    1489714984    return _object;
    1489814985}
    1489914986
    14900 static void p4bInputScfileRowFree(p4bInputScfileRow *object)
     14987static void p4DiffScfileRowFree(p4DiffScfileRow *object)
    1490114988{
    1490214989    psFree(object->skycell_id);
    1490314990    psFree(object->tess_id);
    1490414991    psFree(object->exp_tag);
    14905     psFree(object->kind);
    14906 }
    14907 
    14908 bool p4bInputScfileCreateTable(psDB *dbh)
     14992    psFree(object->uri);
     14993}
     14994
     14995bool p4DiffScfileCreateTable(psDB *dbh)
    1490914996{
    1491014997    psMetadata *md = psMetadataAlloc();
     
    1493415021        return false;
    1493515022    }
    14936     if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, "Key", "64")) {
    14937         psError(PS_ERR_UNKNOWN, false, "failed to add item kind");
    14938         psFree(md);
    14939         return false;
    14940     }
    14941 
    14942     bool status = psDBCreateTable(dbh, P4BINPUTSCFILE_TABLE_NAME, md);
     15023    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) {
     15024        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     15025        psFree(md);
     15026        return false;
     15027    }
     15028    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, 0.0)) {
     15029        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
     15030        psFree(md);
     15031        return false;
     15032    }
     15033    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, 0.0)) {
     15034        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
     15035        psFree(md);
     15036        return false;
     15037    }
     15038
     15039    bool status = psDBCreateTable(dbh, P4DIFFSCFILE_TABLE_NAME, md);
    1494315040
    1494415041    psFree(md);
     
    1494715044}
    1494815045
    14949 bool p4bInputScfileDropTable(psDB *dbh)
    14950 {
    14951     return psDBDropTable(dbh, P4BINPUTSCFILE_TABLE_NAME);
    14952 }
    14953 
    14954 bool p4bInputScfileInsert(psDB * dbh, psS32 p4b_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *kind)
     15046bool p4DiffScfileDropTable(psDB *dbh)
     15047{
     15048    return psDBDropTable(dbh, P4DIFFSCFILE_TABLE_NAME);
     15049}
     15050
     15051bool p4DiffScfileInsert(psDB * dbh, psS32 p4b_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *uri, psF64 bg, psF64 bg_mean_stdev)
    1495515052{
    1495615053    psMetadata *md = psMetadataAlloc();
     
    1498015077        return false;
    1498115078    }
    14982     if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, NULL, kind)) {
    14983         psError(PS_ERR_UNKNOWN, false, "failed to add item kind");
    14984         psFree(md);
    14985         return false;
    14986     }
    14987 
    14988     bool status = psDBInsertOneRow(dbh, P4BINPUTSCFILE_TABLE_NAME, md);
     15079    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {
     15080        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     15081        psFree(md);
     15082        return false;
     15083    }
     15084    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, bg)) {
     15085        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
     15086        psFree(md);
     15087        return false;
     15088    }
     15089    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, bg_mean_stdev)) {
     15090        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
     15091        psFree(md);
     15092        return false;
     15093    }
     15094
     15095    bool status = psDBInsertOneRow(dbh, P4DIFFSCFILE_TABLE_NAME, md);
    1498915096    psFree(md);
    1499015097
     
    1499215099}
    1499315100
    14994 long long p4bInputScfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     15101long long p4DiffScfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    1499515102{
    1499615103    long long       deleted = 0;
    1499715104
    14998     long long count = psDBDeleteRows(dbh, P4BINPUTSCFILE_TABLE_NAME, where, limit);
     15105    long long count = psDBDeleteRows(dbh, P4DIFFSCFILE_TABLE_NAME, where, limit);
    1499915106    if (count < 0) {
    15000         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4bInputScfile");
     15107        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4DiffScfile");
    1500115108        return count;
    1500215109
     
    1500615113    return deleted;
    1500715114}
    15008 bool p4bInputScfileInsertObject(psDB *dbh, p4bInputScfileRow *object)
    15009 {
    15010     return p4bInputScfileInsert(dbh, object->p4b_id, object->skycell_id, object->tess_id, object->exp_tag, object->p3_version, object->kind);
    15011 }
    15012 
    15013 bool p4bInputScfileInsertObjects(psDB *dbh, psArray *objects)
     15115bool p4DiffScfileInsertObject(psDB *dbh, p4DiffScfileRow *object)
     15116{
     15117    return p4DiffScfileInsert(dbh, object->p4b_id, object->skycell_id, object->tess_id, object->exp_tag, object->p3_version, object->uri, object->bg, object->bg_mean_stdev);
     15118}
     15119
     15120bool p4DiffScfileInsertObjects(psDB *dbh, psArray *objects)
    1501415121{
    1501515122    for (long i = 0; i < psArrayLength(objects); i++) {
    15016         if (!p4bInputScfileInsertObject(dbh, objects->data[i])) {
     15123        if (!p4DiffScfileInsertObject(dbh, objects->data[i])) {
    1501715124            return false;
    1501815125        }
     
    1502215129}
    1502315130
    15024 bool p4bInputScfileInsertFits(psDB *dbh, const psFits *fits)
     15131bool p4DiffScfileInsertFits(psDB *dbh, const psFits *fits)
    1502515132{
    1502615133    psArray         *rowSet;
    1502715134
    15028     // move to (the first?) extension named  P4BINPUTSCFILE_TABLE_NAME
    15029     if (!psFitsMoveExtName(fits, P4BINPUTSCFILE_TABLE_NAME)) {
    15030         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P4BINPUTSCFILE_TABLE_NAME);
     15135    // move to (the first?) extension named  P4DIFFSCFILE_TABLE_NAME
     15136    if (!psFitsMoveExtName(fits, P4DIFFSCFILE_TABLE_NAME)) {
     15137        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P4DIFFSCFILE_TABLE_NAME);
    1503115138        return false;
    1503215139    }
     
    1504615153    }
    1504715154
    15048     if (!psDBInsertRows(dbh, P4BINPUTSCFILE_TABLE_NAME, rowSet)) {
     15155    if (!psDBInsertRows(dbh, P4DIFFSCFILE_TABLE_NAME, rowSet)) {
    1504915156        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    1505015157        psFree(rowSet);
     
    1505715164}
    1505815165
    15059 bool p4bInputScfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     15166bool p4DiffScfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    1506015167{
    1506115168    psArray         *rowSet;
    1506215169
    15063     rowSet = psDBSelectRows(dbh, P4BINPUTSCFILE_TABLE_NAME, where, limit);
     15170    rowSet = psDBSelectRows(dbh, P4DIFFSCFILE_TABLE_NAME, where, limit);
    1506415171    if (!rowSet) {
    1506515172        return false;
     
    1506715174
    1506815175    // output to fits
    15069     if (!psFitsWriteTable(fits, NULL, rowSet, P4BINPUTSCFILE_TABLE_NAME)) {
     15176    if (!psFitsWriteTable(fits, NULL, rowSet, P4DIFFSCFILE_TABLE_NAME)) {
    1507015177        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    1507115178        psFree(rowSet);
     
    1507815185}
    1507915186
    15080 psMetadata *p4bInputScfileMetadataFromObject(const p4bInputScfileRow *object)
     15187psMetadata *p4DiffScfileMetadataFromObject(const p4DiffScfileRow *object)
    1508115188{
    1508215189    psMetadata *md = psMetadataAlloc();
     
    1510615213        return false;
    1510715214    }
    15108     if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, NULL, object->kind)) {
    15109         psError(PS_ERR_UNKNOWN, false, "failed to add item kind");
     15215    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {
     15216        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     15217        psFree(md);
     15218        return false;
     15219    }
     15220    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, object->bg)) {
     15221        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
     15222        psFree(md);
     15223        return false;
     15224    }
     15225    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, object->bg_mean_stdev)) {
     15226        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
    1511015227        psFree(md);
    1511115228        return false;
     
    1511615233}
    1511715234
    15118 p4bInputScfileRow *p4bInputScfileObjectFromMetadata(psMetadata *md)
     15235p4DiffScfileRow *p4DiffScfileObjectFromMetadata(psMetadata *md)
    1511915236{
    1512015237
     
    1514515262        return false;
    1514615263    }
    15147     char* kind = psMetadataLookupPtr(&status, md, "kind");
    15148     if (!status) {
    15149         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kind");
    15150         return false;
    15151     }
    15152 
    15153     return p4bInputScfileRowAlloc(p4b_id, skycell_id, tess_id, exp_tag, p3_version, kind);
    15154 }
    15155 psArray *p4bInputScfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     15264    char* uri = psMetadataLookupPtr(&status, md, "uri");
     15265    if (!status) {
     15266        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri");
     15267        return false;
     15268    }
     15269    psF64 bg = psMetadataLookupF64(&status, md, "bg");
     15270    if (!status) {
     15271        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg");
     15272        return false;
     15273    }
     15274    psF64 bg_mean_stdev = psMetadataLookupF64(&status, md, "bg_mean_stdev");
     15275    if (!status) {
     15276        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_mean_stdev");
     15277        return false;
     15278    }
     15279
     15280    return p4DiffScfileRowAlloc(p4b_id, skycell_id, tess_id, exp_tag, p3_version, uri, bg, bg_mean_stdev);
     15281}
     15282psArray *p4DiffScfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    1515615283{
    1515715284    psArray         *rowSet;
     
    1515915286    psU64           i;
    1516015287
    15161     rowSet = psDBSelectRows(dbh, P4BINPUTSCFILE_TABLE_NAME, where, limit);
     15288    rowSet = psDBSelectRows(dbh, P4DIFFSCFILE_TABLE_NAME, where, limit);
    1516215289    if (!rowSet) {
    1516315290        return NULL;
     
    1516915296
    1517015297    for (i = 0; i < rowSet->n; i++) {
    15171         p4bInputScfileRow *object = p4bInputScfileObjectFromMetadata(rowSet->data[i]);
     15298        p4DiffScfileRow *object = p4DiffScfileObjectFromMetadata(rowSet->data[i]);
    1517215299        psArrayAdd(returnSet, 0, object);
    1517315300        psFree(object);
     
    1517815305    return returnSet;
    1517915306}
    15180 bool p4bInputScfileDeleteObject(psDB *dbh, const p4bInputScfileRow *object)
    15181 {
    15182     psMetadata *where = p4bInputScfileMetadataFromObject(object);
    15183     long long count = psDBDeleteRows(dbh, P4BINPUTSCFILE_TABLE_NAME, where, 0);
     15307bool p4DiffScfileDeleteObject(psDB *dbh, const p4DiffScfileRow *object)
     15308{
     15309    psMetadata *where = p4DiffScfileMetadataFromObject(object);
     15310    long long count = psDBDeleteRows(dbh, P4DIFFSCFILE_TABLE_NAME, where, 0);
    1518415311    psFree(where);
    1518515312    if (count < 0) {
    15186         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4bInputScfile");
     15313        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4DiffScfile");
    1518715314        return false;
    1518815315    }
     
    1519015317        // XXX should this be a psAbort() instead?  It is possible that
    1519115318        // having an object match multiple rows was by design.
    15192         psError(PS_ERR_UNKNOWN, true, "p4bInputScfileRow object matched more then one row.  Check your database schema");
    15193         return false;
    15194     }
    15195 
    15196     return true;
    15197 }
    15198 long long p4bInputScfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     15319        psError(PS_ERR_UNKNOWN, true, "p4DiffScfileRow object matched more then one row.  Check your database schema");
     15320        return false;
     15321    }
     15322
     15323    return true;
     15324}
     15325long long p4DiffScfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    1519915326{
    1520015327    long long       deleted = 0;
    1520115328
    1520215329    for (long long i = 0; i < objects->n; i++) {
    15203         p4bInputScfileRow *object = objects->data[i];
    15204         psMetadata *where = p4bInputScfileMetadataFromObject(object);
    15205         long long count = psDBDeleteRows(dbh, P4BINPUTSCFILE_TABLE_NAME, where, limit);
     15330        p4DiffScfileRow *object = objects->data[i];
     15331        psMetadata *where = p4DiffScfileMetadataFromObject(object);
     15332        long long count = psDBDeleteRows(dbh, P4DIFFSCFILE_TABLE_NAME, where, limit);
    1520615333        psFree(where);
    1520715334        if (count < 0) {
    15208             psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4bInputScfile");
     15335            psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4DiffScfile");
    1520915336            return count;
    1521015337        }
     
    1521515342    return deleted;
    1521615343}
    15217 bool p4bInputScfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
     15344bool p4DiffScfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
    1521815345{
    1521915346    PS_ASSERT_PTR_NON_NULL(objects, false);
     
    1522115348    psMetadata *output = psMetadataAlloc();
    1522215349    for (long i = 0; i < psArrayLength(objects); i++) {
    15223         psMetadata *md = p4bInputScfileMetadataFromObject(objects->data[i]);
     15350        psMetadata *md = p4DiffScfileMetadataFromObject(objects->data[i]);
    1522415351        if (!psMetadataAddMetadata(
    1522515352            output,
    1522615353            PS_LIST_TAIL,
    15227             P4BINPUTSCFILE_TABLE_NAME,
     15354            P4DIFFSCFILE_TABLE_NAME,
    1522815355            PS_META_DUPLICATE_OK,
    1522915356            NULL,
     
    1524615373    return true;
    1524715374}
    15248 bool p4bInputScfilePrintObject(FILE *stream, p4bInputScfileRow *object, bool mdcf)
     15375bool p4DiffScfilePrintObject(FILE *stream, p4DiffScfileRow *object, bool mdcf)
    1524915376{
    1525015377    PS_ASSERT_PTR_NON_NULL(object, false);
    1525115378
    15252     psMetadata *md = p4bInputScfileMetadataFromObject(object);
    15253 
    15254     if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
    15255         psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
    15256         psFree(md);
    15257     }
    15258 
    15259     psFree(md);
    15260 
    15261     return true;
    15262 }
    15263 static void p4bDiffScfileRowFree(p4bDiffScfileRow *object);
    15264 
    15265 p4bDiffScfileRow *p4bDiffScfileRowAlloc(psS32 p4b_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *uri, psF64 bg, psF64 bg_mean_stdev)
    15266 {
    15267     p4bDiffScfileRow *_object;
    15268 
    15269     _object = psAlloc(sizeof(p4bDiffScfileRow));
    15270     psMemSetDeallocator(_object, (psFreeFunc)p4bDiffScfileRowFree);
    15271 
    15272     _object->p4b_id = p4b_id;
    15273     _object->skycell_id = psStringCopy(skycell_id);
    15274     _object->tess_id = psStringCopy(tess_id);
    15275     _object->exp_tag = psStringCopy(exp_tag);
    15276     _object->p3_version = p3_version;
    15277     _object->uri = psStringCopy(uri);
    15278     _object->bg = bg;
    15279     _object->bg_mean_stdev = bg_mean_stdev;
    15280 
    15281     return _object;
    15282 }
    15283 
    15284 static void p4bDiffScfileRowFree(p4bDiffScfileRow *object)
    15285 {
    15286     psFree(object->skycell_id);
    15287     psFree(object->tess_id);
    15288     psFree(object->exp_tag);
    15289     psFree(object->uri);
    15290 }
    15291 
    15292 bool p4bDiffScfileCreateTable(psDB *dbh)
    15293 {
    15294     psMetadata *md = psMetadataAlloc();
    15295     if (!psMetadataAdd(md, PS_LIST_TAIL, "p4b_id", PS_DATA_S32, "Primary Key", 0)) {
    15296         psError(PS_ERR_UNKNOWN, false, "failed to add item p4b_id");
    15297         psFree(md);
    15298         return false;
    15299     }
    15300     if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, "Primary Key", "64")) {
    15301         psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");
    15302         psFree(md);
    15303         return false;
    15304     }
    15305     if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, "Primary Key", "64")) {
    15306         psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");
    15307         psFree(md);
    15308         return false;
    15309     }
    15310     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
    15311         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    15312         psFree(md);
    15313         return false;
    15314     }
    15315     if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, "Primary Key", 0)) {
    15316         psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version");
    15317         psFree(md);
    15318         return false;
    15319     }
    15320     if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) {
    15321         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
    15322         psFree(md);
    15323         return false;
    15324     }
    15325     if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, 0.0)) {
    15326         psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
    15327         psFree(md);
    15328         return false;
    15329     }
    15330     if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, 0.0)) {
    15331         psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
    15332         psFree(md);
    15333         return false;
    15334     }
    15335 
    15336     bool status = psDBCreateTable(dbh, P4BDIFFSCFILE_TABLE_NAME, md);
    15337 
    15338     psFree(md);
    15339 
    15340     return status;
    15341 }
    15342 
    15343 bool p4bDiffScfileDropTable(psDB *dbh)
    15344 {
    15345     return psDBDropTable(dbh, P4BDIFFSCFILE_TABLE_NAME);
    15346 }
    15347 
    15348 bool p4bDiffScfileInsert(psDB * dbh, psS32 p4b_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *uri, psF64 bg, psF64 bg_mean_stdev)
    15349 {
    15350     psMetadata *md = psMetadataAlloc();
    15351     if (!psMetadataAdd(md, PS_LIST_TAIL, "p4b_id", PS_DATA_S32, NULL, p4b_id)) {
    15352         psError(PS_ERR_UNKNOWN, false, "failed to add item p4b_id");
    15353         psFree(md);
    15354         return false;
    15355     }
    15356     if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, skycell_id)) {
    15357         psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");
    15358         psFree(md);
    15359         return false;
    15360     }
    15361     if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, tess_id)) {
    15362         psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");
    15363         psFree(md);
    15364         return false;
    15365     }
    15366     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    15367         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    15368         psFree(md);
    15369         return false;
    15370     }
    15371     if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, NULL, p3_version)) {
    15372         psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version");
    15373         psFree(md);
    15374         return false;
    15375     }
    15376     if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {
    15377         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
    15378         psFree(md);
    15379         return false;
    15380     }
    15381     if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, bg)) {
    15382         psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
    15383         psFree(md);
    15384         return false;
    15385     }
    15386     if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, bg_mean_stdev)) {
    15387         psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
    15388         psFree(md);
    15389         return false;
    15390     }
    15391 
    15392     bool status = psDBInsertOneRow(dbh, P4BDIFFSCFILE_TABLE_NAME, md);
    15393     psFree(md);
    15394 
    15395     return status;
    15396 }
    15397 
    15398 long long p4bDiffScfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    15399 {
    15400     long long       deleted = 0;
    15401 
    15402     long long count = psDBDeleteRows(dbh, P4BDIFFSCFILE_TABLE_NAME, where, limit);
    15403     if (count < 0) {
    15404         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4bDiffScfile");
    15405         return count;
    15406 
    15407         deleted += count;
    15408     }
    15409 
    15410     return deleted;
    15411 }
    15412 bool p4bDiffScfileInsertObject(psDB *dbh, p4bDiffScfileRow *object)
    15413 {
    15414     return p4bDiffScfileInsert(dbh, object->p4b_id, object->skycell_id, object->tess_id, object->exp_tag, object->p3_version, object->uri, object->bg, object->bg_mean_stdev);
    15415 }
    15416 
    15417 bool p4bDiffScfileInsertObjects(psDB *dbh, psArray *objects)
    15418 {
    15419     for (long i = 0; i < psArrayLength(objects); i++) {
    15420         if (!p4bDiffScfileInsertObject(dbh, objects->data[i])) {
    15421             return false;
    15422         }
    15423     }
    15424 
    15425     return true;
    15426 }
    15427 
    15428 bool p4bDiffScfileInsertFits(psDB *dbh, const psFits *fits)
    15429 {
    15430     psArray         *rowSet;
    15431 
    15432     // move to (the first?) extension named  P4BDIFFSCFILE_TABLE_NAME
    15433     if (!psFitsMoveExtName(fits, P4BDIFFSCFILE_TABLE_NAME)) {
    15434         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P4BDIFFSCFILE_TABLE_NAME);
    15435         return false;
    15436     }
    15437 
    15438     // check HDU type
    15439     if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
    15440         psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
    15441         return false;
    15442     }
    15443 
    15444     // read fits table
    15445     rowSet = psFitsReadTable(fits);
    15446     if (!rowSet) {
    15447         psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
    15448         psFree(rowSet);
    15449         return false;
    15450     }
    15451 
    15452     if (!psDBInsertRows(dbh, P4BDIFFSCFILE_TABLE_NAME, rowSet)) {
    15453         psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    15454         psFree(rowSet);
    15455         return false;
    15456     }
    15457 
    15458     psFree(rowSet);
    15459 
    15460     return true;
    15461 }
    15462 
    15463 bool p4bDiffScfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    15464 {
    15465     psArray         *rowSet;
    15466 
    15467     rowSet = psDBSelectRows(dbh, P4BDIFFSCFILE_TABLE_NAME, where, limit);
    15468     if (!rowSet) {
    15469         return false;
    15470     }
    15471 
    15472     // output to fits
    15473     if (!psFitsWriteTable(fits, NULL, rowSet, P4BDIFFSCFILE_TABLE_NAME)) {
    15474         psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    15475         psFree(rowSet);
    15476         return false;
    15477     }
    15478 
    15479     psFree(rowSet);
    15480 
    15481     return true;
    15482 }
    15483 
    15484 psMetadata *p4bDiffScfileMetadataFromObject(const p4bDiffScfileRow *object)
    15485 {
    15486     psMetadata *md = psMetadataAlloc();
    15487     if (!psMetadataAdd(md, PS_LIST_TAIL, "p4b_id", PS_DATA_S32, NULL, object->p4b_id)) {
    15488         psError(PS_ERR_UNKNOWN, false, "failed to add item p4b_id");
    15489         psFree(md);
    15490         return false;
    15491     }
    15492     if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, object->skycell_id)) {
    15493         psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");
    15494         psFree(md);
    15495         return false;
    15496     }
    15497     if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, object->tess_id)) {
    15498         psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");
    15499         psFree(md);
    15500         return false;
    15501     }
    15502     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    15503         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    15504         psFree(md);
    15505         return false;
    15506     }
    15507     if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, NULL, object->p3_version)) {
    15508         psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version");
    15509         psFree(md);
    15510         return false;
    15511     }
    15512     if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {
    15513         psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
    15514         psFree(md);
    15515         return false;
    15516     }
    15517     if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, object->bg)) {
    15518         psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
    15519         psFree(md);
    15520         return false;
    15521     }
    15522     if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, object->bg_mean_stdev)) {
    15523         psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
    15524         psFree(md);
    15525         return false;
    15526     }
    15527 
    15528 
    15529     return md;
    15530 }
    15531 
    15532 p4bDiffScfileRow *p4bDiffScfileObjectFromMetadata(psMetadata *md)
    15533 {
    15534 
    15535 bool status = false;
    15536     psS32 p4b_id = psMetadataLookupS32(&status, md, "p4b_id");
    15537     if (!status) {
    15538         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p4b_id");
    15539         return false;
    15540     }
    15541     char* skycell_id = psMetadataLookupPtr(&status, md, "skycell_id");
    15542     if (!status) {
    15543         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item skycell_id");
    15544         return false;
    15545     }
    15546     char* tess_id = psMetadataLookupPtr(&status, md, "tess_id");
    15547     if (!status) {
    15548         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item tess_id");
    15549         return false;
    15550     }
    15551     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    15552     if (!status) {
    15553         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
    15554         return false;
    15555     }
    15556     psS32 p3_version = psMetadataLookupS32(&status, md, "p3_version");
    15557     if (!status) {
    15558         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p3_version");
    15559         return false;
    15560     }
    15561     char* uri = psMetadataLookupPtr(&status, md, "uri");
    15562     if (!status) {
    15563         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri");
    15564         return false;
    15565     }
    15566     psF64 bg = psMetadataLookupF64(&status, md, "bg");
    15567     if (!status) {
    15568         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg");
    15569         return false;
    15570     }
    15571     psF64 bg_mean_stdev = psMetadataLookupF64(&status, md, "bg_mean_stdev");
    15572     if (!status) {
    15573         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_mean_stdev");
    15574         return false;
    15575     }
    15576 
    15577     return p4bDiffScfileRowAlloc(p4b_id, skycell_id, tess_id, exp_tag, p3_version, uri, bg, bg_mean_stdev);
    15578 }
    15579 psArray *p4bDiffScfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    15580 {
    15581     psArray         *rowSet;
    15582     psArray         *returnSet;
    15583     psU64           i;
    15584 
    15585     rowSet = psDBSelectRows(dbh, P4BDIFFSCFILE_TABLE_NAME, where, limit);
    15586     if (!rowSet) {
    15587         return NULL;
    15588     }
    15589 
    15590     // convert psMetadata rows to row objects
    15591 
    15592     returnSet = psArrayAllocEmpty(rowSet->n);
    15593 
    15594     for (i = 0; i < rowSet->n; i++) {
    15595         p4bDiffScfileRow *object = p4bDiffScfileObjectFromMetadata(rowSet->data[i]);
    15596         psArrayAdd(returnSet, 0, object);
    15597         psFree(object);
    15598     }
    15599 
    15600     psFree(rowSet);
    15601 
    15602     return returnSet;
    15603 }
    15604 bool p4bDiffScfileDeleteObject(psDB *dbh, const p4bDiffScfileRow *object)
    15605 {
    15606     psMetadata *where = p4bDiffScfileMetadataFromObject(object);
    15607     long long count = psDBDeleteRows(dbh, P4BDIFFSCFILE_TABLE_NAME, where, 0);
    15608     psFree(where);
    15609     if (count < 0) {
    15610         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4bDiffScfile");
    15611         return false;
    15612     }
    15613     if (count > 1) {
    15614         // XXX should this be a psAbort() instead?  It is possible that
    15615         // having an object match multiple rows was by design.
    15616         psError(PS_ERR_UNKNOWN, true, "p4bDiffScfileRow object matched more then one row.  Check your database schema");
    15617         return false;
    15618     }
    15619 
    15620     return true;
    15621 }
    15622 long long p4bDiffScfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    15623 {
    15624     long long       deleted = 0;
    15625 
    15626     for (long long i = 0; i < objects->n; i++) {
    15627         p4bDiffScfileRow *object = objects->data[i];
    15628         psMetadata *where = p4bDiffScfileMetadataFromObject(object);
    15629         long long count = psDBDeleteRows(dbh, P4BDIFFSCFILE_TABLE_NAME, where, limit);
    15630         psFree(where);
    15631         if (count < 0) {
    15632             psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4bDiffScfile");
    15633             return count;
    15634         }
    15635 
    15636         deleted += count;
    15637     }
    15638 
    15639     return deleted;
    15640 }
    15641 bool p4bDiffScfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
    15642 {
    15643     PS_ASSERT_PTR_NON_NULL(objects, false);
    15644 
    15645     psMetadata *output = psMetadataAlloc();
    15646     for (long i = 0; i < psArrayLength(objects); i++) {
    15647         psMetadata *md = p4bDiffScfileMetadataFromObject(objects->data[i]);
    15648         if (!psMetadataAddMetadata(
    15649             output,
    15650             PS_LIST_TAIL,
    15651             P4BDIFFSCFILE_TABLE_NAME,
    15652             PS_META_DUPLICATE_OK,
    15653             NULL,
    15654             md
    15655         )) {
    15656             psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
    15657             psFree(md);
    15658             psFree(output);
    15659             return false;
    15660         }
    15661         psFree(md);
    15662     }
    15663 
    15664     if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
    15665         psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
    15666         psFree(output);
    15667     }
    15668     psFree(output);
    15669 
    15670     return true;
    15671 }
    15672 bool p4bDiffScfilePrintObject(FILE *stream, p4bDiffScfileRow *object, bool mdcf)
    15673 {
    15674     PS_ASSERT_PTR_NON_NULL(object, false);
    15675 
    15676     psMetadata *md = p4bDiffScfileMetadataFromObject(object);
    15677 
    15678     if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
    15679         psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
    15680         psFree(md);
    15681     }
    15682 
    15683     psFree(md);
    15684 
    15685     return true;
    15686 }
    15687 static void p4cRunRowFree(p4cRunRow *object);
    15688 
    15689 p4cRunRow *p4cRunRowAlloc(psS32 p4c_id, const char *state, const char *workdir, bool magic)
    15690 {
    15691     p4cRunRow       *_object;
    15692 
    15693     _object = psAlloc(sizeof(p4cRunRow));
    15694     psMemSetDeallocator(_object, (psFreeFunc)p4cRunRowFree);
    15695 
    15696     _object->p4c_id = p4c_id;
    15697     _object->state = psStringCopy(state);
    15698     _object->workdir = psStringCopy(workdir);
    15699     _object->magic = magic;
    15700 
    15701     return _object;
    15702 }
    15703 
    15704 static void p4cRunRowFree(p4cRunRow *object)
    15705 {
    15706     psFree(object->state);
    15707     psFree(object->workdir);
    15708 }
    15709 
    15710 bool p4cRunCreateTable(psDB *dbh)
    15711 {
    15712     psMetadata *md = psMetadataAlloc();
    15713     if (!psMetadataAdd(md, PS_LIST_TAIL, "p4c_id", PS_DATA_S32, "Primary Key AUTO_INCREMENT", 0)) {
    15714         psError(PS_ERR_UNKNOWN, false, "failed to add item p4c_id");
    15715         psFree(md);
    15716         return false;
    15717     }
    15718     if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, "Key", "64")) {
    15719         psError(PS_ERR_UNKNOWN, false, "failed to add item state");
    15720         psFree(md);
    15721         return false;
    15722     }
    15723     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, "255")) {
    15724         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    15725         psFree(md);
    15726         return false;
    15727     }
    15728     if (!psMetadataAdd(md, PS_LIST_TAIL, "magic", PS_DATA_BOOL, "Primary Key", 0)) {
    15729         psError(PS_ERR_UNKNOWN, false, "failed to add item magic");
    15730         psFree(md);
    15731         return false;
    15732     }
    15733 
    15734     bool status = psDBCreateTable(dbh, P4CRUN_TABLE_NAME, md);
    15735 
    15736     psFree(md);
    15737 
    15738     return status;
    15739 }
    15740 
    15741 bool p4cRunDropTable(psDB *dbh)
    15742 {
    15743     return psDBDropTable(dbh, P4CRUN_TABLE_NAME);
    15744 }
    15745 
    15746 bool p4cRunInsert(psDB * dbh, psS32 p4c_id, const char *state, const char *workdir, bool magic)
    15747 {
    15748     psMetadata *md = psMetadataAlloc();
    15749     if (!psMetadataAdd(md, PS_LIST_TAIL, "p4c_id", PS_DATA_S32, NULL, p4c_id)) {
    15750         psError(PS_ERR_UNKNOWN, false, "failed to add item p4c_id");
    15751         psFree(md);
    15752         return false;
    15753     }
    15754     if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, state)) {
    15755         psError(PS_ERR_UNKNOWN, false, "failed to add item state");
    15756         psFree(md);
    15757         return false;
    15758     }
    15759     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) {
    15760         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    15761         psFree(md);
    15762         return false;
    15763     }
    15764     if (!psMetadataAdd(md, PS_LIST_TAIL, "magic", PS_DATA_BOOL, NULL, magic)) {
    15765         psError(PS_ERR_UNKNOWN, false, "failed to add item magic");
    15766         psFree(md);
    15767         return false;
    15768     }
    15769 
    15770     bool status = psDBInsertOneRow(dbh, P4CRUN_TABLE_NAME, md);
    15771     psFree(md);
    15772 
    15773     return status;
    15774 }
    15775 
    15776 long long p4cRunDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    15777 {
    15778     long long       deleted = 0;
    15779 
    15780     long long count = psDBDeleteRows(dbh, P4CRUN_TABLE_NAME, where, limit);
    15781     if (count < 0) {
    15782         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4cRun");
    15783         return count;
    15784 
    15785         deleted += count;
    15786     }
    15787 
    15788     return deleted;
    15789 }
    15790 bool p4cRunInsertObject(psDB *dbh, p4cRunRow *object)
    15791 {
    15792     return p4cRunInsert(dbh, object->p4c_id, object->state, object->workdir, object->magic);
    15793 }
    15794 
    15795 bool p4cRunInsertObjects(psDB *dbh, psArray *objects)
    15796 {
    15797     for (long i = 0; i < psArrayLength(objects); i++) {
    15798         if (!p4cRunInsertObject(dbh, objects->data[i])) {
    15799             return false;
    15800         }
    15801     }
    15802 
    15803     return true;
    15804 }
    15805 
    15806 bool p4cRunInsertFits(psDB *dbh, const psFits *fits)
    15807 {
    15808     psArray         *rowSet;
    15809 
    15810     // move to (the first?) extension named  P4CRUN_TABLE_NAME
    15811     if (!psFitsMoveExtName(fits, P4CRUN_TABLE_NAME)) {
    15812         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P4CRUN_TABLE_NAME);
    15813         return false;
    15814     }
    15815 
    15816     // check HDU type
    15817     if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
    15818         psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
    15819         return false;
    15820     }
    15821 
    15822     // read fits table
    15823     rowSet = psFitsReadTable(fits);
    15824     if (!rowSet) {
    15825         psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
    15826         psFree(rowSet);
    15827         return false;
    15828     }
    15829 
    15830     if (!psDBInsertRows(dbh, P4CRUN_TABLE_NAME, rowSet)) {
    15831         psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    15832         psFree(rowSet);
    15833         return false;
    15834     }
    15835 
    15836     psFree(rowSet);
    15837 
    15838     return true;
    15839 }
    15840 
    15841 bool p4cRunSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    15842 {
    15843     psArray         *rowSet;
    15844 
    15845     rowSet = psDBSelectRows(dbh, P4CRUN_TABLE_NAME, where, limit);
    15846     if (!rowSet) {
    15847         return false;
    15848     }
    15849 
    15850     // output to fits
    15851     if (!psFitsWriteTable(fits, NULL, rowSet, P4CRUN_TABLE_NAME)) {
    15852         psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    15853         psFree(rowSet);
    15854         return false;
    15855     }
    15856 
    15857     psFree(rowSet);
    15858 
    15859     return true;
    15860 }
    15861 
    15862 psMetadata *p4cRunMetadataFromObject(const p4cRunRow *object)
    15863 {
    15864     psMetadata *md = psMetadataAlloc();
    15865     if (!psMetadataAdd(md, PS_LIST_TAIL, "p4c_id", PS_DATA_S32, NULL, object->p4c_id)) {
    15866         psError(PS_ERR_UNKNOWN, false, "failed to add item p4c_id");
    15867         psFree(md);
    15868         return false;
    15869     }
    15870     if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, object->state)) {
    15871         psError(PS_ERR_UNKNOWN, false, "failed to add item state");
    15872         psFree(md);
    15873         return false;
    15874     }
    15875     if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, object->workdir)) {
    15876         psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
    15877         psFree(md);
    15878         return false;
    15879     }
    15880     if (!psMetadataAdd(md, PS_LIST_TAIL, "magic", PS_DATA_BOOL, NULL, object->magic)) {
    15881         psError(PS_ERR_UNKNOWN, false, "failed to add item magic");
    15882         psFree(md);
    15883         return false;
    15884     }
    15885 
    15886 
    15887     return md;
    15888 }
    15889 
    15890 p4cRunRow *p4cRunObjectFromMetadata(psMetadata *md)
    15891 {
    15892 
    15893 bool status = false;
    15894     psS32 p4c_id = psMetadataLookupS32(&status, md, "p4c_id");
    15895     if (!status) {
    15896         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p4c_id");
    15897         return false;
    15898     }
    15899     char* state = psMetadataLookupPtr(&status, md, "state");
    15900     if (!status) {
    15901         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item state");
    15902         return false;
    15903     }
    15904     char* workdir = psMetadataLookupPtr(&status, md, "workdir");
    15905     if (!status) {
    15906         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item workdir");
    15907         return false;
    15908     }
    15909     bool magic = psMetadataLookupBool(&status, md, "magic");
    15910     if (!status) {
    15911         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item magic");
    15912         return false;
    15913     }
    15914 
    15915     return p4cRunRowAlloc(p4c_id, state, workdir, magic);
    15916 }
    15917 psArray *p4cRunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    15918 {
    15919     psArray         *rowSet;
    15920     psArray         *returnSet;
    15921     psU64           i;
    15922 
    15923     rowSet = psDBSelectRows(dbh, P4CRUN_TABLE_NAME, where, limit);
    15924     if (!rowSet) {
    15925         return NULL;
    15926     }
    15927 
    15928     // convert psMetadata rows to row objects
    15929 
    15930     returnSet = psArrayAllocEmpty(rowSet->n);
    15931 
    15932     for (i = 0; i < rowSet->n; i++) {
    15933         p4cRunRow *object = p4cRunObjectFromMetadata(rowSet->data[i]);
    15934         psArrayAdd(returnSet, 0, object);
    15935         psFree(object);
    15936     }
    15937 
    15938     psFree(rowSet);
    15939 
    15940     return returnSet;
    15941 }
    15942 bool p4cRunDeleteObject(psDB *dbh, const p4cRunRow *object)
    15943 {
    15944     psMetadata *where = p4cRunMetadataFromObject(object);
    15945     long long count = psDBDeleteRows(dbh, P4CRUN_TABLE_NAME, where, 0);
    15946     psFree(where);
    15947     if (count < 0) {
    15948         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4cRun");
    15949         return false;
    15950     }
    15951     if (count > 1) {
    15952         // XXX should this be a psAbort() instead?  It is possible that
    15953         // having an object match multiple rows was by design.
    15954         psError(PS_ERR_UNKNOWN, true, "p4cRunRow object matched more then one row.  Check your database schema");
    15955         return false;
    15956     }
    15957 
    15958     return true;
    15959 }
    15960 long long p4cRunDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    15961 {
    15962     long long       deleted = 0;
    15963 
    15964     for (long long i = 0; i < objects->n; i++) {
    15965         p4cRunRow *object = objects->data[i];
    15966         psMetadata *where = p4cRunMetadataFromObject(object);
    15967         long long count = psDBDeleteRows(dbh, P4CRUN_TABLE_NAME, where, limit);
    15968         psFree(where);
    15969         if (count < 0) {
    15970             psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4cRun");
    15971             return count;
    15972         }
    15973 
    15974         deleted += count;
    15975     }
    15976 
    15977     return deleted;
    15978 }
    15979 bool p4cRunPrintObjects(FILE *stream, psArray *objects, bool mdcf)
    15980 {
    15981     PS_ASSERT_PTR_NON_NULL(objects, false);
    15982 
    15983     psMetadata *output = psMetadataAlloc();
    15984     for (long i = 0; i < psArrayLength(objects); i++) {
    15985         psMetadata *md = p4cRunMetadataFromObject(objects->data[i]);
    15986         if (!psMetadataAddMetadata(
    15987             output,
    15988             PS_LIST_TAIL,
    15989             P4CRUN_TABLE_NAME,
    15990             PS_META_DUPLICATE_OK,
    15991             NULL,
    15992             md
    15993         )) {
    15994             psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
    15995             psFree(md);
    15996             psFree(output);
    15997             return false;
    15998         }
    15999         psFree(md);
    16000     }
    16001 
    16002     if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
    16003         psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
    16004         psFree(output);
    16005     }
    16006     psFree(output);
    16007 
    16008     return true;
    16009 }
    16010 bool p4cRunPrintObject(FILE *stream, p4cRunRow *object, bool mdcf)
    16011 {
    16012     PS_ASSERT_PTR_NON_NULL(object, false);
    16013 
    16014     psMetadata *md = p4cRunMetadataFromObject(object);
    16015 
    16016     if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
    16017         psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
    16018         psFree(md);
    16019     }
    16020 
    16021     psFree(md);
    16022 
    16023     return true;
    16024 }
    16025 static void p4cInputExpRowFree(p4cInputExpRow *object);
    16026 
    16027 p4cInputExpRow *p4cInputExpRowAlloc(psS32 p4c_id, const char *exp_tag, psS32 p3_version)
    16028 {
    16029     p4cInputExpRow  *_object;
    16030 
    16031     _object = psAlloc(sizeof(p4cInputExpRow));
    16032     psMemSetDeallocator(_object, (psFreeFunc)p4cInputExpRowFree);
    16033 
    16034     _object->p4c_id = p4c_id;
    16035     _object->exp_tag = psStringCopy(exp_tag);
    16036     _object->p3_version = p3_version;
    16037 
    16038     return _object;
    16039 }
    16040 
    16041 static void p4cInputExpRowFree(p4cInputExpRow *object)
    16042 {
    16043     psFree(object->exp_tag);
    16044 }
    16045 
    16046 bool p4cInputExpCreateTable(psDB *dbh)
    16047 {
    16048     psMetadata *md = psMetadataAlloc();
    16049     if (!psMetadataAdd(md, PS_LIST_TAIL, "p4c_id", PS_DATA_S32, "Primary Key", 0)) {
    16050         psError(PS_ERR_UNKNOWN, false, "failed to add item p4c_id");
    16051         psFree(md);
    16052         return false;
    16053     }
    16054     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
    16055         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    16056         psFree(md);
    16057         return false;
    16058     }
    16059     if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, "Primary Key", 0)) {
    16060         psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version");
    16061         psFree(md);
    16062         return false;
    16063     }
    16064 
    16065     bool status = psDBCreateTable(dbh, P4CINPUTEXP_TABLE_NAME, md);
    16066 
    16067     psFree(md);
    16068 
    16069     return status;
    16070 }
    16071 
    16072 bool p4cInputExpDropTable(psDB *dbh)
    16073 {
    16074     return psDBDropTable(dbh, P4CINPUTEXP_TABLE_NAME);
    16075 }
    16076 
    16077 bool p4cInputExpInsert(psDB * dbh, psS32 p4c_id, const char *exp_tag, psS32 p3_version)
    16078 {
    16079     psMetadata *md = psMetadataAlloc();
    16080     if (!psMetadataAdd(md, PS_LIST_TAIL, "p4c_id", PS_DATA_S32, NULL, p4c_id)) {
    16081         psError(PS_ERR_UNKNOWN, false, "failed to add item p4c_id");
    16082         psFree(md);
    16083         return false;
    16084     }
    16085     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
    16086         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    16087         psFree(md);
    16088         return false;
    16089     }
    16090     if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, NULL, p3_version)) {
    16091         psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version");
    16092         psFree(md);
    16093         return false;
    16094     }
    16095 
    16096     bool status = psDBInsertOneRow(dbh, P4CINPUTEXP_TABLE_NAME, md);
    16097     psFree(md);
    16098 
    16099     return status;
    16100 }
    16101 
    16102 long long p4cInputExpDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
    16103 {
    16104     long long       deleted = 0;
    16105 
    16106     long long count = psDBDeleteRows(dbh, P4CINPUTEXP_TABLE_NAME, where, limit);
    16107     if (count < 0) {
    16108         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4cInputExp");
    16109         return count;
    16110 
    16111         deleted += count;
    16112     }
    16113 
    16114     return deleted;
    16115 }
    16116 bool p4cInputExpInsertObject(psDB *dbh, p4cInputExpRow *object)
    16117 {
    16118     return p4cInputExpInsert(dbh, object->p4c_id, object->exp_tag, object->p3_version);
    16119 }
    16120 
    16121 bool p4cInputExpInsertObjects(psDB *dbh, psArray *objects)
    16122 {
    16123     for (long i = 0; i < psArrayLength(objects); i++) {
    16124         if (!p4cInputExpInsertObject(dbh, objects->data[i])) {
    16125             return false;
    16126         }
    16127     }
    16128 
    16129     return true;
    16130 }
    16131 
    16132 bool p4cInputExpInsertFits(psDB *dbh, const psFits *fits)
    16133 {
    16134     psArray         *rowSet;
    16135 
    16136     // move to (the first?) extension named  P4CINPUTEXP_TABLE_NAME
    16137     if (!psFitsMoveExtName(fits, P4CINPUTEXP_TABLE_NAME)) {
    16138         psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P4CINPUTEXP_TABLE_NAME);
    16139         return false;
    16140     }
    16141 
    16142     // check HDU type
    16143     if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
    16144         psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
    16145         return false;
    16146     }
    16147 
    16148     // read fits table
    16149     rowSet = psFitsReadTable(fits);
    16150     if (!rowSet) {
    16151         psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
    16152         psFree(rowSet);
    16153         return false;
    16154     }
    16155 
    16156     if (!psDBInsertRows(dbh, P4CINPUTEXP_TABLE_NAME, rowSet)) {
    16157         psError(PS_ERR_UNKNOWN, false, "databse insert failed");
    16158         psFree(rowSet);
    16159         return false;
    16160     }
    16161 
    16162     psFree(rowSet);
    16163 
    16164     return true;
    16165 }
    16166 
    16167 bool p4cInputExpSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
    16168 {
    16169     psArray         *rowSet;
    16170 
    16171     rowSet = psDBSelectRows(dbh, P4CINPUTEXP_TABLE_NAME, where, limit);
    16172     if (!rowSet) {
    16173         return false;
    16174     }
    16175 
    16176     // output to fits
    16177     if (!psFitsWriteTable(fits, NULL, rowSet, P4CINPUTEXP_TABLE_NAME)) {
    16178         psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
    16179         psFree(rowSet);
    16180         return false;
    16181     }
    16182 
    16183     psFree(rowSet);
    16184 
    16185     return true;
    16186 }
    16187 
    16188 psMetadata *p4cInputExpMetadataFromObject(const p4cInputExpRow *object)
    16189 {
    16190     psMetadata *md = psMetadataAlloc();
    16191     if (!psMetadataAdd(md, PS_LIST_TAIL, "p4c_id", PS_DATA_S32, NULL, object->p4c_id)) {
    16192         psError(PS_ERR_UNKNOWN, false, "failed to add item p4c_id");
    16193         psFree(md);
    16194         return false;
    16195     }
    16196     if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
    16197         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
    16198         psFree(md);
    16199         return false;
    16200     }
    16201     if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, NULL, object->p3_version)) {
    16202         psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version");
    16203         psFree(md);
    16204         return false;
    16205     }
    16206 
    16207 
    16208     return md;
    16209 }
    16210 
    16211 p4cInputExpRow *p4cInputExpObjectFromMetadata(psMetadata *md)
    16212 {
    16213 
    16214 bool status = false;
    16215     psS32 p4c_id = psMetadataLookupS32(&status, md, "p4c_id");
    16216     if (!status) {
    16217         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p4c_id");
    16218         return false;
    16219     }
    16220     char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
    16221     if (!status) {
    16222         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
    16223         return false;
    16224     }
    16225     psS32 p3_version = psMetadataLookupS32(&status, md, "p3_version");
    16226     if (!status) {
    16227         psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p3_version");
    16228         return false;
    16229     }
    16230 
    16231     return p4cInputExpRowAlloc(p4c_id, exp_tag, p3_version);
    16232 }
    16233 psArray *p4cInputExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
    16234 {
    16235     psArray         *rowSet;
    16236     psArray         *returnSet;
    16237     psU64           i;
    16238 
    16239     rowSet = psDBSelectRows(dbh, P4CINPUTEXP_TABLE_NAME, where, limit);
    16240     if (!rowSet) {
    16241         return NULL;
    16242     }
    16243 
    16244     // convert psMetadata rows to row objects
    16245 
    16246     returnSet = psArrayAllocEmpty(rowSet->n);
    16247 
    16248     for (i = 0; i < rowSet->n; i++) {
    16249         p4cInputExpRow *object = p4cInputExpObjectFromMetadata(rowSet->data[i]);
    16250         psArrayAdd(returnSet, 0, object);
    16251         psFree(object);
    16252     }
    16253 
    16254     psFree(rowSet);
    16255 
    16256     return returnSet;
    16257 }
    16258 bool p4cInputExpDeleteObject(psDB *dbh, const p4cInputExpRow *object)
    16259 {
    16260     psMetadata *where = p4cInputExpMetadataFromObject(object);
    16261     long long count = psDBDeleteRows(dbh, P4CINPUTEXP_TABLE_NAME, where, 0);
    16262     psFree(where);
    16263     if (count < 0) {
    16264         psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4cInputExp");
    16265         return false;
    16266     }
    16267     if (count > 1) {
    16268         // XXX should this be a psAbort() instead?  It is possible that
    16269         // having an object match multiple rows was by design.
    16270         psError(PS_ERR_UNKNOWN, true, "p4cInputExpRow object matched more then one row.  Check your database schema");
    16271         return false;
    16272     }
    16273 
    16274     return true;
    16275 }
    16276 long long p4cInputExpDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
    16277 {
    16278     long long       deleted = 0;
    16279 
    16280     for (long long i = 0; i < objects->n; i++) {
    16281         p4cInputExpRow *object = objects->data[i];
    16282         psMetadata *where = p4cInputExpMetadataFromObject(object);
    16283         long long count = psDBDeleteRows(dbh, P4CINPUTEXP_TABLE_NAME, where, limit);
    16284         psFree(where);
    16285         if (count < 0) {
    16286             psError(PS_ERR_UNKNOWN, true, "failed to delete row from p4cInputExp");
    16287             return count;
    16288         }
    16289 
    16290         deleted += count;
    16291     }
    16292 
    16293     return deleted;
    16294 }
    16295 bool p4cInputExpPrintObjects(FILE *stream, psArray *objects, bool mdcf)
    16296 {
    16297     PS_ASSERT_PTR_NON_NULL(objects, false);
    16298 
    16299     psMetadata *output = psMetadataAlloc();
    16300     for (long i = 0; i < psArrayLength(objects); i++) {
    16301         psMetadata *md = p4cInputExpMetadataFromObject(objects->data[i]);
    16302         if (!psMetadataAddMetadata(
    16303             output,
    16304             PS_LIST_TAIL,
    16305             P4CINPUTEXP_TABLE_NAME,
    16306             PS_META_DUPLICATE_OK,
    16307             NULL,
    16308             md
    16309         )) {
    16310             psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
    16311             psFree(md);
    16312             psFree(output);
    16313             return false;
    16314         }
    16315         psFree(md);
    16316     }
    16317 
    16318     if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
    16319         psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
    16320         psFree(output);
    16321     }
    16322     psFree(output);
    16323 
    16324     return true;
    16325 }
    16326 bool p4cInputExpPrintObject(FILE *stream, p4cInputExpRow *object, bool mdcf)
    16327 {
    16328     PS_ASSERT_PTR_NON_NULL(object, false);
    16329 
    16330     psMetadata *md = p4cInputExpMetadataFromObject(object);
     15379    psMetadata *md = p4DiffScfileMetadataFromObject(object);
    1633115380
    1633215381    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
Note: See TracChangeset for help on using the changeset viewer.