IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Oct 19, 2007, 3:59:06 PM (19 years ago)
Author:
jhoblitt
Message:

VERSION 1.1.28

File:
1 edited

Legend:

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

    r15003 r15343  
    3131#include "ippdb.h"
    3232
     33#define PZDATASTORE_TABLE_NAME "pzDataStore"
    3334#define SUMMITEXP_TABLE_NAME "summitExp"
    3435#define SUMMITIMFILE_TABLE_NAME "summitImfile"
     
    7071#define DETRUNSUMMARY_TABLE_NAME "detRunSummary"
    7172#define DETREGISTEREDIMFILE_TABLE_NAME "detRegisteredImfile"
     73#define DETCORRECTEDEXP_TABLE_NAME "detCorrectedExp"
     74#define DETCORRECTEDIMFILE_TABLE_NAME "detCorrectedImfile"
    7275#define MAGICRUN_TABLE_NAME "magicRun"
    7376#define MAGICINPUTSKYFILE_TABLE_NAME "magicInputSkyfile"
     
    7578#define MAGICNODERESULT_TABLE_NAME "magicNodeResult"
    7679#define MAGICMASK_TABLE_NAME "magicMask"
     80#define MAGICSKYFILEMASK_TABLE_NAME "magicSkyfileMask"
    7781#define MAX_STRING_LENGTH 1024
    7882
     
    251255}
    252256
     257static void pzDataStoreRowFree(pzDataStoreRow *object);
     258
     259pzDataStoreRow *pzDataStoreRowAlloc(const char *camera, const char *telescope, const char *uri)
     260{
     261    pzDataStoreRow  *_object;
     262
     263    _object = psAlloc(sizeof(pzDataStoreRow));
     264    psMemSetDeallocator(_object, (psFreeFunc)pzDataStoreRowFree);
     265
     266    _object->camera = psStringCopy(camera);
     267    _object->telescope = psStringCopy(telescope);
     268    _object->uri = psStringCopy(uri);
     269
     270    return _object;
     271}
     272
     273static void pzDataStoreRowFree(pzDataStoreRow *object)
     274{
     275    psFree(object->camera);
     276    psFree(object->telescope);
     277    psFree(object->uri);
     278}
     279
     280bool pzDataStoreCreateTable(psDB *dbh)
     281{
     282    psMetadata *md = psMetadataAlloc();
     283    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, "Primary Key", "64")) {
     284        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
     285        psFree(md);
     286        return false;
     287    }
     288    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, "Primary Key", "64")) {
     289        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
     290        psFree(md);
     291        return false;
     292    }
     293    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) {
     294        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     295        psFree(md);
     296        return false;
     297    }
     298
     299    bool status = psDBCreateTable(dbh, PZDATASTORE_TABLE_NAME, md);
     300
     301    psFree(md);
     302
     303    return status;
     304}
     305
     306bool pzDataStoreDropTable(psDB *dbh)
     307{
     308    return psDBDropTable(dbh, PZDATASTORE_TABLE_NAME);
     309}
     310
     311bool pzDataStoreInsert(psDB * dbh, const char *camera, const char *telescope, const char *uri)
     312{
     313    psMetadata *md = psMetadataAlloc();
     314    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, camera)) {
     315        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
     316        psFree(md);
     317        return false;
     318    }
     319    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, telescope)) {
     320        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
     321        psFree(md);
     322        return false;
     323    }
     324    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {
     325        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     326        psFree(md);
     327        return false;
     328    }
     329
     330    bool status = psDBInsertOneRow(dbh, PZDATASTORE_TABLE_NAME, md);
     331    psFree(md);
     332
     333    return status;
     334}
     335
     336long long pzDataStoreDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     337{
     338    long long       deleted = 0;
     339
     340    long long count = psDBDeleteRows(dbh, PZDATASTORE_TABLE_NAME, where, limit);
     341    if (count < 0) {
     342        psError(PS_ERR_UNKNOWN, true, "failed to delete row from pzDataStore");
     343        return count;
     344
     345        deleted += count;
     346    }
     347
     348    return deleted;
     349}
     350bool pzDataStoreInsertObject(psDB *dbh, pzDataStoreRow *object)
     351{
     352    return pzDataStoreInsert(dbh, object->camera, object->telescope, object->uri);
     353}
     354
     355bool pzDataStoreInsertObjects(psDB *dbh, psArray *objects)
     356{
     357    for (long i = 0; i < psArrayLength(objects); i++) {
     358        if (!pzDataStoreInsertObject(dbh, objects->data[i])) {
     359            return false;
     360        }
     361    }
     362
     363    return true;
     364}
     365
     366bool pzDataStoreInsertFits(psDB *dbh, const psFits *fits)
     367{
     368    psArray         *rowSet;
     369
     370    // move to (the first?) extension named  PZDATASTORE_TABLE_NAME
     371    if (!psFitsMoveExtName(fits, PZDATASTORE_TABLE_NAME)) {
     372        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", PZDATASTORE_TABLE_NAME);
     373        return false;
     374    }
     375
     376    // check HDU type
     377    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
     378        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
     379        return false;
     380    }
     381
     382    // read fits table
     383    rowSet = psFitsReadTable(fits);
     384    if (!rowSet) {
     385        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
     386        psFree(rowSet);
     387        return false;
     388    }
     389
     390    if (!psDBInsertRows(dbh, PZDATASTORE_TABLE_NAME, rowSet)) {
     391        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
     392        psFree(rowSet);
     393        return false;
     394    }
     395
     396    psFree(rowSet);
     397
     398    return true;
     399}
     400
     401bool pzDataStoreSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     402{
     403    psArray         *rowSet;
     404
     405    rowSet = psDBSelectRows(dbh, PZDATASTORE_TABLE_NAME, where, limit);
     406    if (!rowSet) {
     407        return false;
     408    }
     409
     410    // output to fits
     411    if (!psFitsWriteTable(fits, NULL, rowSet, PZDATASTORE_TABLE_NAME)) {
     412        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
     413        psFree(rowSet);
     414        return false;
     415    }
     416
     417    psFree(rowSet);
     418
     419    return true;
     420}
     421
     422psMetadata *pzDataStoreMetadataFromObject(const pzDataStoreRow *object)
     423{
     424    psMetadata *md = psMetadataAlloc();
     425    if (!psMetadataAdd(md, PS_LIST_TAIL, "camera", PS_DATA_STRING, NULL, object->camera)) {
     426        psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
     427        psFree(md);
     428        return false;
     429    }
     430    if (!psMetadataAdd(md, PS_LIST_TAIL, "telescope", PS_DATA_STRING, NULL, object->telescope)) {
     431        psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
     432        psFree(md);
     433        return false;
     434    }
     435    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {
     436        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     437        psFree(md);
     438        return false;
     439    }
     440
     441
     442    return md;
     443}
     444
     445pzDataStoreRow *pzDataStoreObjectFromMetadata(psMetadata *md)
     446{
     447
     448bool status = false;
     449    char* camera = psMetadataLookupPtr(&status, md, "camera");
     450    if (!status) {
     451        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item camera");
     452        return false;
     453    }
     454    char* telescope = psMetadataLookupPtr(&status, md, "telescope");
     455    if (!status) {
     456        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item telescope");
     457        return false;
     458    }
     459    char* uri = psMetadataLookupPtr(&status, md, "uri");
     460    if (!status) {
     461        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri");
     462        return false;
     463    }
     464
     465    return pzDataStoreRowAlloc(camera, telescope, uri);
     466}
     467psArray *pzDataStoreSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     468{
     469    psArray         *rowSet;
     470    psArray         *returnSet;
     471    psU64           i;
     472
     473    rowSet = psDBSelectRows(dbh, PZDATASTORE_TABLE_NAME, where, limit);
     474    if (!rowSet) {
     475        return NULL;
     476    }
     477
     478    // convert psMetadata rows to row objects
     479
     480    returnSet = psArrayAllocEmpty(rowSet->n);
     481
     482    for (i = 0; i < rowSet->n; i++) {
     483        pzDataStoreRow *object = pzDataStoreObjectFromMetadata(rowSet->data[i]);
     484        psArrayAdd(returnSet, 0, object);
     485        psFree(object);
     486    }
     487
     488    psFree(rowSet);
     489
     490    return returnSet;
     491}
     492bool pzDataStoreDeleteObject(psDB *dbh, const pzDataStoreRow *object)
     493{
     494    psMetadata *where = pzDataStoreMetadataFromObject(object);
     495    long long count = psDBDeleteRows(dbh, PZDATASTORE_TABLE_NAME, where, 0);
     496    psFree(where);
     497    if (count < 0) {
     498        psError(PS_ERR_UNKNOWN, true, "failed to delete row from pzDataStore");
     499        return false;
     500    }
     501    if (count > 1) {
     502        // XXX should this be a psAbort() instead?  It is possible that
     503        // having an object match multiple rows was by design.
     504        psError(PS_ERR_UNKNOWN, true, "pzDataStoreRow object matched more then one row.  Check your database schema");
     505        return false;
     506    }
     507
     508    return true;
     509}
     510long long pzDataStoreDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     511{
     512    long long       deleted = 0;
     513
     514    for (long long i = 0; i < objects->n; i++) {
     515        pzDataStoreRow *object = objects->data[i];
     516        psMetadata *where = pzDataStoreMetadataFromObject(object);
     517        long long count = psDBDeleteRows(dbh, PZDATASTORE_TABLE_NAME, where, limit);
     518        psFree(where);
     519        if (count < 0) {
     520            psError(PS_ERR_UNKNOWN, true, "failed to delete row from pzDataStore");
     521            return count;
     522        }
     523
     524        deleted += count;
     525    }
     526
     527    return deleted;
     528}
     529bool pzDataStorePrintObjects(FILE *stream, psArray *objects, bool mdcf)
     530{
     531    PS_ASSERT_PTR_NON_NULL(objects, false);
     532
     533    psMetadata *output = psMetadataAlloc();
     534    for (long i = 0; i < psArrayLength(objects); i++) {
     535        psMetadata *md = pzDataStoreMetadataFromObject(objects->data[i]);
     536        if (!psMetadataAddMetadata(
     537            output,
     538            PS_LIST_TAIL,
     539            PZDATASTORE_TABLE_NAME,
     540            PS_META_DUPLICATE_OK,
     541            NULL,
     542            md
     543        )) {
     544            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
     545            psFree(md);
     546            psFree(output);
     547            return false;
     548        }
     549        psFree(md);
     550    }
     551
     552    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
     553        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     554        psFree(output);
     555    }
     556    psFree(output);
     557
     558    return true;
     559}
     560bool pzDataStorePrintObject(FILE *stream, pzDataStoreRow *object, bool mdcf)
     561{
     562    PS_ASSERT_PTR_NON_NULL(object, false);
     563
     564    psMetadata *md = pzDataStoreMetadataFromObject(object);
     565
     566    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     567        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     568        psFree(md);
     569    }
     570
     571    psFree(md);
     572
     573    return true;
     574}
    253575static void summitExpRowFree(summitExpRow *object);
    254576
     
    1888619208    return true;
    1888719209}
     19210static void detCorrectedExpRowFree(detCorrectedExpRow *object);
     19211
     19212detCorrectedExpRow *detCorrectedExpRowAlloc(psS64 det_id, psS64 exp_id, const char *uri, psS64 corr_id, const char *corr_type, const char *recipe, const char *path_base, psS16 fault)
     19213{
     19214    detCorrectedExpRow *_object;
     19215
     19216    _object = psAlloc(sizeof(detCorrectedExpRow));
     19217    psMemSetDeallocator(_object, (psFreeFunc)detCorrectedExpRowFree);
     19218
     19219    _object->det_id = det_id;
     19220    _object->exp_id = exp_id;
     19221    _object->uri = psStringCopy(uri);
     19222    _object->corr_id = corr_id;
     19223    _object->corr_type = psStringCopy(corr_type);
     19224    _object->recipe = psStringCopy(recipe);
     19225    _object->path_base = psStringCopy(path_base);
     19226    _object->fault = fault;
     19227
     19228    return _object;
     19229}
     19230
     19231static void detCorrectedExpRowFree(detCorrectedExpRow *object)
     19232{
     19233    psFree(object->uri);
     19234    psFree(object->corr_type);
     19235    psFree(object->recipe);
     19236    psFree(object->path_base);
     19237}
     19238
     19239bool detCorrectedExpCreateTable(psDB *dbh)
     19240{
     19241    psMetadata *md = psMetadataAlloc();
     19242    if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key fkey(det_id, exp_id) ref detInputExp(det_id, exp_id)", 0)) {
     19243        psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
     19244        psFree(md);
     19245        return false;
     19246    }
     19247    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key fkey(exp_id, class_id) ref rawImfile(exp_id, class_id)", 64)) {
     19248        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     19249        psFree(md);
     19250        return false;
     19251    }
     19252    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, "INDEX(det_id, exp_id)", "255")) {
     19253        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     19254        psFree(md);
     19255        return false;
     19256    }
     19257    if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_id", PS_DATA_S64, NULL, 0)) {
     19258        psError(PS_ERR_UNKNOWN, false, "failed to add item corr_id");
     19259        psFree(md);
     19260        return false;
     19261    }
     19262    if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_type", PS_DATA_STRING, NULL, "64")) {
     19263        psError(PS_ERR_UNKNOWN, false, "failed to add item corr_type");
     19264        psFree(md);
     19265        return false;
     19266    }
     19267    if (!psMetadataAdd(md, PS_LIST_TAIL, "recipe", PS_DATA_STRING, NULL, "64")) {
     19268        psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
     19269        psFree(md);
     19270        return false;
     19271    }
     19272    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, "255")) {
     19273        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     19274        psFree(md);
     19275        return false;
     19276    }
     19277    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
     19278        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     19279        psFree(md);
     19280        return false;
     19281    }
     19282
     19283    bool status = psDBCreateTable(dbh, DETCORRECTEDEXP_TABLE_NAME, md);
     19284
     19285    psFree(md);
     19286
     19287    return status;
     19288}
     19289
     19290bool detCorrectedExpDropTable(psDB *dbh)
     19291{
     19292    return psDBDropTable(dbh, DETCORRECTEDEXP_TABLE_NAME);
     19293}
     19294
     19295bool detCorrectedExpInsert(psDB * dbh, psS64 det_id, psS64 exp_id, const char *uri, psS64 corr_id, const char *corr_type, const char *recipe, const char *path_base, psS16 fault)
     19296{
     19297    psMetadata *md = psMetadataAlloc();
     19298    if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, NULL, det_id)) {
     19299        psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
     19300        psFree(md);
     19301        return false;
     19302    }
     19303    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     19304        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     19305        psFree(md);
     19306        return false;
     19307    }
     19308    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {
     19309        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     19310        psFree(md);
     19311        return false;
     19312    }
     19313    if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_id", PS_DATA_S64, NULL, corr_id)) {
     19314        psError(PS_ERR_UNKNOWN, false, "failed to add item corr_id");
     19315        psFree(md);
     19316        return false;
     19317    }
     19318    if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_type", PS_DATA_STRING, NULL, corr_type)) {
     19319        psError(PS_ERR_UNKNOWN, false, "failed to add item corr_type");
     19320        psFree(md);
     19321        return false;
     19322    }
     19323    if (!psMetadataAdd(md, PS_LIST_TAIL, "recipe", PS_DATA_STRING, NULL, recipe)) {
     19324        psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
     19325        psFree(md);
     19326        return false;
     19327    }
     19328    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
     19329        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     19330        psFree(md);
     19331        return false;
     19332    }
     19333    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, fault)) {
     19334        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     19335        psFree(md);
     19336        return false;
     19337    }
     19338
     19339    bool status = psDBInsertOneRow(dbh, DETCORRECTEDEXP_TABLE_NAME, md);
     19340    psFree(md);
     19341
     19342    return status;
     19343}
     19344
     19345long long detCorrectedExpDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     19346{
     19347    long long       deleted = 0;
     19348
     19349    long long count = psDBDeleteRows(dbh, DETCORRECTEDEXP_TABLE_NAME, where, limit);
     19350    if (count < 0) {
     19351        psError(PS_ERR_UNKNOWN, true, "failed to delete row from detCorrectedExp");
     19352        return count;
     19353
     19354        deleted += count;
     19355    }
     19356
     19357    return deleted;
     19358}
     19359bool detCorrectedExpInsertObject(psDB *dbh, detCorrectedExpRow *object)
     19360{
     19361    return detCorrectedExpInsert(dbh, object->det_id, object->exp_id, object->uri, object->corr_id, object->corr_type, object->recipe, object->path_base, object->fault);
     19362}
     19363
     19364bool detCorrectedExpInsertObjects(psDB *dbh, psArray *objects)
     19365{
     19366    for (long i = 0; i < psArrayLength(objects); i++) {
     19367        if (!detCorrectedExpInsertObject(dbh, objects->data[i])) {
     19368            return false;
     19369        }
     19370    }
     19371
     19372    return true;
     19373}
     19374
     19375bool detCorrectedExpInsertFits(psDB *dbh, const psFits *fits)
     19376{
     19377    psArray         *rowSet;
     19378
     19379    // move to (the first?) extension named  DETCORRECTEDEXP_TABLE_NAME
     19380    if (!psFitsMoveExtName(fits, DETCORRECTEDEXP_TABLE_NAME)) {
     19381        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", DETCORRECTEDEXP_TABLE_NAME);
     19382        return false;
     19383    }
     19384
     19385    // check HDU type
     19386    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
     19387        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
     19388        return false;
     19389    }
     19390
     19391    // read fits table
     19392    rowSet = psFitsReadTable(fits);
     19393    if (!rowSet) {
     19394        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
     19395        psFree(rowSet);
     19396        return false;
     19397    }
     19398
     19399    if (!psDBInsertRows(dbh, DETCORRECTEDEXP_TABLE_NAME, rowSet)) {
     19400        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
     19401        psFree(rowSet);
     19402        return false;
     19403    }
     19404
     19405    psFree(rowSet);
     19406
     19407    return true;
     19408}
     19409
     19410bool detCorrectedExpSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     19411{
     19412    psArray         *rowSet;
     19413
     19414    rowSet = psDBSelectRows(dbh, DETCORRECTEDEXP_TABLE_NAME, where, limit);
     19415    if (!rowSet) {
     19416        return false;
     19417    }
     19418
     19419    // output to fits
     19420    if (!psFitsWriteTable(fits, NULL, rowSet, DETCORRECTEDEXP_TABLE_NAME)) {
     19421        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
     19422        psFree(rowSet);
     19423        return false;
     19424    }
     19425
     19426    psFree(rowSet);
     19427
     19428    return true;
     19429}
     19430
     19431psMetadata *detCorrectedExpMetadataFromObject(const detCorrectedExpRow *object)
     19432{
     19433    psMetadata *md = psMetadataAlloc();
     19434    if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, NULL, object->det_id)) {
     19435        psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
     19436        psFree(md);
     19437        return false;
     19438    }
     19439    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     19440        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     19441        psFree(md);
     19442        return false;
     19443    }
     19444    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {
     19445        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     19446        psFree(md);
     19447        return false;
     19448    }
     19449    if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_id", PS_DATA_S64, NULL, object->corr_id)) {
     19450        psError(PS_ERR_UNKNOWN, false, "failed to add item corr_id");
     19451        psFree(md);
     19452        return false;
     19453    }
     19454    if (!psMetadataAdd(md, PS_LIST_TAIL, "corr_type", PS_DATA_STRING, NULL, object->corr_type)) {
     19455        psError(PS_ERR_UNKNOWN, false, "failed to add item corr_type");
     19456        psFree(md);
     19457        return false;
     19458    }
     19459    if (!psMetadataAdd(md, PS_LIST_TAIL, "recipe", PS_DATA_STRING, NULL, object->recipe)) {
     19460        psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
     19461        psFree(md);
     19462        return false;
     19463    }
     19464    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, object->path_base)) {
     19465        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     19466        psFree(md);
     19467        return false;
     19468    }
     19469    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
     19470        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     19471        psFree(md);
     19472        return false;
     19473    }
     19474
     19475
     19476    return md;
     19477}
     19478
     19479detCorrectedExpRow *detCorrectedExpObjectFromMetadata(psMetadata *md)
     19480{
     19481
     19482bool status = false;
     19483    psS64 det_id = psMetadataLookupS64(&status, md, "det_id");
     19484    if (!status) {
     19485        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item det_id");
     19486        return false;
     19487    }
     19488    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     19489    if (!status) {
     19490        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
     19491        return false;
     19492    }
     19493    char* uri = psMetadataLookupPtr(&status, md, "uri");
     19494    if (!status) {
     19495        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri");
     19496        return false;
     19497    }
     19498    psS64 corr_id = psMetadataLookupS64(&status, md, "corr_id");
     19499    if (!status) {
     19500        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item corr_id");
     19501        return false;
     19502    }
     19503    char* corr_type = psMetadataLookupPtr(&status, md, "corr_type");
     19504    if (!status) {
     19505        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item corr_type");
     19506        return false;
     19507    }
     19508    char* recipe = psMetadataLookupPtr(&status, md, "recipe");
     19509    if (!status) {
     19510        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item recipe");
     19511        return false;
     19512    }
     19513    char* path_base = psMetadataLookupPtr(&status, md, "path_base");
     19514    if (!status) {
     19515        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item path_base");
     19516        return false;
     19517    }
     19518    psS16 fault = psMetadataLookupS16(&status, md, "fault");
     19519    if (!status) {
     19520        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fault");
     19521        return false;
     19522    }
     19523
     19524    return detCorrectedExpRowAlloc(det_id, exp_id, uri, corr_id, corr_type, recipe, path_base, fault);
     19525}
     19526psArray *detCorrectedExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     19527{
     19528    psArray         *rowSet;
     19529    psArray         *returnSet;
     19530    psU64           i;
     19531
     19532    rowSet = psDBSelectRows(dbh, DETCORRECTEDEXP_TABLE_NAME, where, limit);
     19533    if (!rowSet) {
     19534        return NULL;
     19535    }
     19536
     19537    // convert psMetadata rows to row objects
     19538
     19539    returnSet = psArrayAllocEmpty(rowSet->n);
     19540
     19541    for (i = 0; i < rowSet->n; i++) {
     19542        detCorrectedExpRow *object = detCorrectedExpObjectFromMetadata(rowSet->data[i]);
     19543        psArrayAdd(returnSet, 0, object);
     19544        psFree(object);
     19545    }
     19546
     19547    psFree(rowSet);
     19548
     19549    return returnSet;
     19550}
     19551bool detCorrectedExpDeleteObject(psDB *dbh, const detCorrectedExpRow *object)
     19552{
     19553    psMetadata *where = detCorrectedExpMetadataFromObject(object);
     19554    long long count = psDBDeleteRows(dbh, DETCORRECTEDEXP_TABLE_NAME, where, 0);
     19555    psFree(where);
     19556    if (count < 0) {
     19557        psError(PS_ERR_UNKNOWN, true, "failed to delete row from detCorrectedExp");
     19558        return false;
     19559    }
     19560    if (count > 1) {
     19561        // XXX should this be a psAbort() instead?  It is possible that
     19562        // having an object match multiple rows was by design.
     19563        psError(PS_ERR_UNKNOWN, true, "detCorrectedExpRow object matched more then one row.  Check your database schema");
     19564        return false;
     19565    }
     19566
     19567    return true;
     19568}
     19569long long detCorrectedExpDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     19570{
     19571    long long       deleted = 0;
     19572
     19573    for (long long i = 0; i < objects->n; i++) {
     19574        detCorrectedExpRow *object = objects->data[i];
     19575        psMetadata *where = detCorrectedExpMetadataFromObject(object);
     19576        long long count = psDBDeleteRows(dbh, DETCORRECTEDEXP_TABLE_NAME, where, limit);
     19577        psFree(where);
     19578        if (count < 0) {
     19579            psError(PS_ERR_UNKNOWN, true, "failed to delete row from detCorrectedExp");
     19580            return count;
     19581        }
     19582
     19583        deleted += count;
     19584    }
     19585
     19586    return deleted;
     19587}
     19588bool detCorrectedExpPrintObjects(FILE *stream, psArray *objects, bool mdcf)
     19589{
     19590    PS_ASSERT_PTR_NON_NULL(objects, false);
     19591
     19592    psMetadata *output = psMetadataAlloc();
     19593    for (long i = 0; i < psArrayLength(objects); i++) {
     19594        psMetadata *md = detCorrectedExpMetadataFromObject(objects->data[i]);
     19595        if (!psMetadataAddMetadata(
     19596            output,
     19597            PS_LIST_TAIL,
     19598            DETCORRECTEDEXP_TABLE_NAME,
     19599            PS_META_DUPLICATE_OK,
     19600            NULL,
     19601            md
     19602        )) {
     19603            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
     19604            psFree(md);
     19605            psFree(output);
     19606            return false;
     19607        }
     19608        psFree(md);
     19609    }
     19610
     19611    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
     19612        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     19613        psFree(output);
     19614    }
     19615    psFree(output);
     19616
     19617    return true;
     19618}
     19619bool detCorrectedExpPrintObject(FILE *stream, detCorrectedExpRow *object, bool mdcf)
     19620{
     19621    PS_ASSERT_PTR_NON_NULL(object, false);
     19622
     19623    psMetadata *md = detCorrectedExpMetadataFromObject(object);
     19624
     19625    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     19626        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     19627        psFree(md);
     19628    }
     19629
     19630    psFree(md);
     19631
     19632    return true;
     19633}
     19634static void detCorrectedImfileRowFree(detCorrectedImfileRow *object);
     19635
     19636detCorrectedImfileRow *detCorrectedImfileRowAlloc(psS64 det_id, psS64 exp_id, const char *class_id, const char *uri, const char *path_base, psS16 fault)
     19637{
     19638    detCorrectedImfileRow *_object;
     19639
     19640    _object = psAlloc(sizeof(detCorrectedImfileRow));
     19641    psMemSetDeallocator(_object, (psFreeFunc)detCorrectedImfileRowFree);
     19642
     19643    _object->det_id = det_id;
     19644    _object->exp_id = exp_id;
     19645    _object->class_id = psStringCopy(class_id);
     19646    _object->uri = psStringCopy(uri);
     19647    _object->path_base = psStringCopy(path_base);
     19648    _object->fault = fault;
     19649
     19650    return _object;
     19651}
     19652
     19653static void detCorrectedImfileRowFree(detCorrectedImfileRow *object)
     19654{
     19655    psFree(object->class_id);
     19656    psFree(object->uri);
     19657    psFree(object->path_base);
     19658}
     19659
     19660bool detCorrectedImfileCreateTable(psDB *dbh)
     19661{
     19662    psMetadata *md = psMetadataAlloc();
     19663    if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, "Primary Key fkey(det_id, exp_id) ref detInputExp(det_id, exp_id)", 0)) {
     19664        psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
     19665        psFree(md);
     19666        return false;
     19667    }
     19668    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, "Primary Key fkey(exp_id, class_id) ref rawImfile(exp_id, class_id)", 64)) {
     19669        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     19670        psFree(md);
     19671        return false;
     19672    }
     19673    if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, "Primary Key INDEX(det_id, class_id)", "64")) {
     19674        psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
     19675        psFree(md);
     19676        return false;
     19677    }
     19678    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, "INDEX(det_id, exp_id)", "255")) {
     19679        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     19680        psFree(md);
     19681        return false;
     19682    }
     19683    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, "255")) {
     19684        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     19685        psFree(md);
     19686        return false;
     19687    }
     19688    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, "Key NOT NULL", 0)) {
     19689        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     19690        psFree(md);
     19691        return false;
     19692    }
     19693
     19694    bool status = psDBCreateTable(dbh, DETCORRECTEDIMFILE_TABLE_NAME, md);
     19695
     19696    psFree(md);
     19697
     19698    return status;
     19699}
     19700
     19701bool detCorrectedImfileDropTable(psDB *dbh)
     19702{
     19703    return psDBDropTable(dbh, DETCORRECTEDIMFILE_TABLE_NAME);
     19704}
     19705
     19706bool detCorrectedImfileInsert(psDB * dbh, psS64 det_id, psS64 exp_id, const char *class_id, const char *uri, const char *path_base, psS16 fault)
     19707{
     19708    psMetadata *md = psMetadataAlloc();
     19709    if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, NULL, det_id)) {
     19710        psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
     19711        psFree(md);
     19712        return false;
     19713    }
     19714    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, exp_id)) {
     19715        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     19716        psFree(md);
     19717        return false;
     19718    }
     19719    if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, class_id)) {
     19720        psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
     19721        psFree(md);
     19722        return false;
     19723    }
     19724    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {
     19725        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     19726        psFree(md);
     19727        return false;
     19728    }
     19729    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, path_base)) {
     19730        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     19731        psFree(md);
     19732        return false;
     19733    }
     19734    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, fault)) {
     19735        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     19736        psFree(md);
     19737        return false;
     19738    }
     19739
     19740    bool status = psDBInsertOneRow(dbh, DETCORRECTEDIMFILE_TABLE_NAME, md);
     19741    psFree(md);
     19742
     19743    return status;
     19744}
     19745
     19746long long detCorrectedImfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     19747{
     19748    long long       deleted = 0;
     19749
     19750    long long count = psDBDeleteRows(dbh, DETCORRECTEDIMFILE_TABLE_NAME, where, limit);
     19751    if (count < 0) {
     19752        psError(PS_ERR_UNKNOWN, true, "failed to delete row from detCorrectedImfile");
     19753        return count;
     19754
     19755        deleted += count;
     19756    }
     19757
     19758    return deleted;
     19759}
     19760bool detCorrectedImfileInsertObject(psDB *dbh, detCorrectedImfileRow *object)
     19761{
     19762    return detCorrectedImfileInsert(dbh, object->det_id, object->exp_id, object->class_id, object->uri, object->path_base, object->fault);
     19763}
     19764
     19765bool detCorrectedImfileInsertObjects(psDB *dbh, psArray *objects)
     19766{
     19767    for (long i = 0; i < psArrayLength(objects); i++) {
     19768        if (!detCorrectedImfileInsertObject(dbh, objects->data[i])) {
     19769            return false;
     19770        }
     19771    }
     19772
     19773    return true;
     19774}
     19775
     19776bool detCorrectedImfileInsertFits(psDB *dbh, const psFits *fits)
     19777{
     19778    psArray         *rowSet;
     19779
     19780    // move to (the first?) extension named  DETCORRECTEDIMFILE_TABLE_NAME
     19781    if (!psFitsMoveExtName(fits, DETCORRECTEDIMFILE_TABLE_NAME)) {
     19782        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", DETCORRECTEDIMFILE_TABLE_NAME);
     19783        return false;
     19784    }
     19785
     19786    // check HDU type
     19787    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
     19788        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
     19789        return false;
     19790    }
     19791
     19792    // read fits table
     19793    rowSet = psFitsReadTable(fits);
     19794    if (!rowSet) {
     19795        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
     19796        psFree(rowSet);
     19797        return false;
     19798    }
     19799
     19800    if (!psDBInsertRows(dbh, DETCORRECTEDIMFILE_TABLE_NAME, rowSet)) {
     19801        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
     19802        psFree(rowSet);
     19803        return false;
     19804    }
     19805
     19806    psFree(rowSet);
     19807
     19808    return true;
     19809}
     19810
     19811bool detCorrectedImfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     19812{
     19813    psArray         *rowSet;
     19814
     19815    rowSet = psDBSelectRows(dbh, DETCORRECTEDIMFILE_TABLE_NAME, where, limit);
     19816    if (!rowSet) {
     19817        return false;
     19818    }
     19819
     19820    // output to fits
     19821    if (!psFitsWriteTable(fits, NULL, rowSet, DETCORRECTEDIMFILE_TABLE_NAME)) {
     19822        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
     19823        psFree(rowSet);
     19824        return false;
     19825    }
     19826
     19827    psFree(rowSet);
     19828
     19829    return true;
     19830}
     19831
     19832psMetadata *detCorrectedImfileMetadataFromObject(const detCorrectedImfileRow *object)
     19833{
     19834    psMetadata *md = psMetadataAlloc();
     19835    if (!psMetadataAdd(md, PS_LIST_TAIL, "det_id", PS_DATA_S64, NULL, object->det_id)) {
     19836        psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
     19837        psFree(md);
     19838        return false;
     19839    }
     19840    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_id", PS_DATA_S64, NULL, object->exp_id)) {
     19841        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
     19842        psFree(md);
     19843        return false;
     19844    }
     19845    if (!psMetadataAdd(md, PS_LIST_TAIL, "class_id", PS_DATA_STRING, NULL, object->class_id)) {
     19846        psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
     19847        psFree(md);
     19848        return false;
     19849    }
     19850    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {
     19851        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     19852        psFree(md);
     19853        return false;
     19854    }
     19855    if (!psMetadataAdd(md, PS_LIST_TAIL, "path_base", PS_DATA_STRING, NULL, object->path_base)) {
     19856        psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
     19857        psFree(md);
     19858        return false;
     19859    }
     19860    if (!psMetadataAdd(md, PS_LIST_TAIL, "fault", PS_DATA_S16, NULL, object->fault)) {
     19861        psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
     19862        psFree(md);
     19863        return false;
     19864    }
     19865
     19866
     19867    return md;
     19868}
     19869
     19870detCorrectedImfileRow *detCorrectedImfileObjectFromMetadata(psMetadata *md)
     19871{
     19872
     19873bool status = false;
     19874    psS64 det_id = psMetadataLookupS64(&status, md, "det_id");
     19875    if (!status) {
     19876        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item det_id");
     19877        return false;
     19878    }
     19879    psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
     19880    if (!status) {
     19881        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_id");
     19882        return false;
     19883    }
     19884    char* class_id = psMetadataLookupPtr(&status, md, "class_id");
     19885    if (!status) {
     19886        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class_id");
     19887        return false;
     19888    }
     19889    char* uri = psMetadataLookupPtr(&status, md, "uri");
     19890    if (!status) {
     19891        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri");
     19892        return false;
     19893    }
     19894    char* path_base = psMetadataLookupPtr(&status, md, "path_base");
     19895    if (!status) {
     19896        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item path_base");
     19897        return false;
     19898    }
     19899    psS16 fault = psMetadataLookupS16(&status, md, "fault");
     19900    if (!status) {
     19901        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item fault");
     19902        return false;
     19903    }
     19904
     19905    return detCorrectedImfileRowAlloc(det_id, exp_id, class_id, uri, path_base, fault);
     19906}
     19907psArray *detCorrectedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     19908{
     19909    psArray         *rowSet;
     19910    psArray         *returnSet;
     19911    psU64           i;
     19912
     19913    rowSet = psDBSelectRows(dbh, DETCORRECTEDIMFILE_TABLE_NAME, where, limit);
     19914    if (!rowSet) {
     19915        return NULL;
     19916    }
     19917
     19918    // convert psMetadata rows to row objects
     19919
     19920    returnSet = psArrayAllocEmpty(rowSet->n);
     19921
     19922    for (i = 0; i < rowSet->n; i++) {
     19923        detCorrectedImfileRow *object = detCorrectedImfileObjectFromMetadata(rowSet->data[i]);
     19924        psArrayAdd(returnSet, 0, object);
     19925        psFree(object);
     19926    }
     19927
     19928    psFree(rowSet);
     19929
     19930    return returnSet;
     19931}
     19932bool detCorrectedImfileDeleteObject(psDB *dbh, const detCorrectedImfileRow *object)
     19933{
     19934    psMetadata *where = detCorrectedImfileMetadataFromObject(object);
     19935    long long count = psDBDeleteRows(dbh, DETCORRECTEDIMFILE_TABLE_NAME, where, 0);
     19936    psFree(where);
     19937    if (count < 0) {
     19938        psError(PS_ERR_UNKNOWN, true, "failed to delete row from detCorrectedImfile");
     19939        return false;
     19940    }
     19941    if (count > 1) {
     19942        // XXX should this be a psAbort() instead?  It is possible that
     19943        // having an object match multiple rows was by design.
     19944        psError(PS_ERR_UNKNOWN, true, "detCorrectedImfileRow object matched more then one row.  Check your database schema");
     19945        return false;
     19946    }
     19947
     19948    return true;
     19949}
     19950long long detCorrectedImfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     19951{
     19952    long long       deleted = 0;
     19953
     19954    for (long long i = 0; i < objects->n; i++) {
     19955        detCorrectedImfileRow *object = objects->data[i];
     19956        psMetadata *where = detCorrectedImfileMetadataFromObject(object);
     19957        long long count = psDBDeleteRows(dbh, DETCORRECTEDIMFILE_TABLE_NAME, where, limit);
     19958        psFree(where);
     19959        if (count < 0) {
     19960            psError(PS_ERR_UNKNOWN, true, "failed to delete row from detCorrectedImfile");
     19961            return count;
     19962        }
     19963
     19964        deleted += count;
     19965    }
     19966
     19967    return deleted;
     19968}
     19969bool detCorrectedImfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
     19970{
     19971    PS_ASSERT_PTR_NON_NULL(objects, false);
     19972
     19973    psMetadata *output = psMetadataAlloc();
     19974    for (long i = 0; i < psArrayLength(objects); i++) {
     19975        psMetadata *md = detCorrectedImfileMetadataFromObject(objects->data[i]);
     19976        if (!psMetadataAddMetadata(
     19977            output,
     19978            PS_LIST_TAIL,
     19979            DETCORRECTEDIMFILE_TABLE_NAME,
     19980            PS_META_DUPLICATE_OK,
     19981            NULL,
     19982            md
     19983        )) {
     19984            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
     19985            psFree(md);
     19986            psFree(output);
     19987            return false;
     19988        }
     19989        psFree(md);
     19990    }
     19991
     19992    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
     19993        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     19994        psFree(output);
     19995    }
     19996    psFree(output);
     19997
     19998    return true;
     19999}
     20000bool detCorrectedImfilePrintObject(FILE *stream, detCorrectedImfileRow *object, bool mdcf)
     20001{
     20002    PS_ASSERT_PTR_NON_NULL(object, false);
     20003
     20004    psMetadata *md = detCorrectedImfileMetadataFromObject(object);
     20005
     20006    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     20007        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     20008        psFree(md);
     20009    }
     20010
     20011    psFree(md);
     20012
     20013    return true;
     20014}
    1888820015static void magicRunRowFree(magicRunRow *object);
    1888920016
     
    1932020447        return false;
    1932120448    }
    19322     if (!psMetadataAdd(md, PS_LIST_TAIL, "diff_id", PS_DATA_S64, "Key fkey(diff_id) ref diffRun(diff_id)", 0)) {
     20449    if (!psMetadataAdd(md, PS_LIST_TAIL, "diff_id", PS_DATA_S64, "Primary Key fkey(diff_id) ref diffRun(diff_id)", 0)) {
    1932320450        psError(PS_ERR_UNKNOWN, false, "failed to add item diff_id");
    1932420451        psFree(md);
    1932520452        return false;
    1932620453    }
    19327     if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, "INDEX(magic_id, node)", "64")) {
     20454    if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, NULL, "64")) {
    1932820455        psError(PS_ERR_UNKNOWN, false, "failed to add item node");
    1932920456        psFree(md);
     
    1963220759{
    1963320760    psMetadata *md = psMetadataAlloc();
    19634     if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, "Primary Key fkey(magic_id) ref magicRun(magic_id)", 0)) {
     20761    if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, "Key fkey(magic_id) ref magicRun(magic_id)", 0)) {
    1963520762        psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");
    1963620763        psFree(md);
    1963720764        return false;
    1963820765    }
    19639     if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, "Primary Key fkey(magic_id, node) ref magicInputSkyfile(magic_id, node)", "64")) {
     20766    if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, "Key INDEX(magic_id, node)", "64")) {
    1964020767        psError(PS_ERR_UNKNOWN, false, "failed to add item node");
    1964120768        psFree(md);
    1964220769        return false;
    1964320770    }
    19644     if (!psMetadataAdd(md, PS_LIST_TAIL, "dep", PS_DATA_STRING, "fkey(magic_id, dep) ref magicInputSkyfile(magic_id, node)", "64")) {
     20771    if (!psMetadataAdd(md, PS_LIST_TAIL, "dep", PS_DATA_STRING, "Key", "64")) {
    1964520772        psError(PS_ERR_UNKNOWN, false, "failed to add item dep");
    1964620773        psFree(md);
     
    1995421081        return false;
    1995521082    }
    19956     if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, "Primary Key fkey(magic_id, node) ref magicInputSkyfile(magic_id, node)", "64")) {
     21083    if (!psMetadataAdd(md, PS_LIST_TAIL, "node", PS_DATA_STRING, "Primary Key fkey(magic_id, node) ref magicTree(magic_id, node)", "64")) {
    1995721084        psError(PS_ERR_UNKNOWN, false, "failed to add item node");
    1995821085        psFree(md);
     
    2053621663    return true;
    2053721664}
     21665static void magicSkyfileMaskRowFree(magicSkyfileMaskRow *object);
     21666
     21667magicSkyfileMaskRow *magicSkyfileMaskRowAlloc(psS64 magic_id, psS64 diff_id, const char *uri)
     21668{
     21669    magicSkyfileMaskRow *_object;
     21670
     21671    _object = psAlloc(sizeof(magicSkyfileMaskRow));
     21672    psMemSetDeallocator(_object, (psFreeFunc)magicSkyfileMaskRowFree);
     21673
     21674    _object->magic_id = magic_id;
     21675    _object->diff_id = diff_id;
     21676    _object->uri = psStringCopy(uri);
     21677
     21678    return _object;
     21679}
     21680
     21681static void magicSkyfileMaskRowFree(magicSkyfileMaskRow *object)
     21682{
     21683    psFree(object->uri);
     21684}
     21685
     21686bool magicSkyfileMaskCreateTable(psDB *dbh)
     21687{
     21688    psMetadata *md = psMetadataAlloc();
     21689    if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, "Primary Key fkey(magic_id) ref magicRun(magic_id)", 0)) {
     21690        psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");
     21691        psFree(md);
     21692        return false;
     21693    }
     21694    if (!psMetadataAdd(md, PS_LIST_TAIL, "diff_id", PS_DATA_S64, "Primary Key fkey(diff_id) ref magicInputSkyfile(magic_id, diff_id)", 0)) {
     21695        psError(PS_ERR_UNKNOWN, false, "failed to add item diff_id");
     21696        psFree(md);
     21697        return false;
     21698    }
     21699    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, "fkey(magic_id) ref magicMask(magic_id)", "255")) {
     21700        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     21701        psFree(md);
     21702        return false;
     21703    }
     21704
     21705    bool status = psDBCreateTable(dbh, MAGICSKYFILEMASK_TABLE_NAME, md);
     21706
     21707    psFree(md);
     21708
     21709    return status;
     21710}
     21711
     21712bool magicSkyfileMaskDropTable(psDB *dbh)
     21713{
     21714    return psDBDropTable(dbh, MAGICSKYFILEMASK_TABLE_NAME);
     21715}
     21716
     21717bool magicSkyfileMaskInsert(psDB * dbh, psS64 magic_id, psS64 diff_id, const char *uri)
     21718{
     21719    psMetadata *md = psMetadataAlloc();
     21720    if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, magic_id)) {
     21721        psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");
     21722        psFree(md);
     21723        return false;
     21724    }
     21725    if (!psMetadataAdd(md, PS_LIST_TAIL, "diff_id", PS_DATA_S64, NULL, diff_id)) {
     21726        psError(PS_ERR_UNKNOWN, false, "failed to add item diff_id");
     21727        psFree(md);
     21728        return false;
     21729    }
     21730    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {
     21731        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     21732        psFree(md);
     21733        return false;
     21734    }
     21735
     21736    bool status = psDBInsertOneRow(dbh, MAGICSKYFILEMASK_TABLE_NAME, md);
     21737    psFree(md);
     21738
     21739    return status;
     21740}
     21741
     21742long long magicSkyfileMaskDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     21743{
     21744    long long       deleted = 0;
     21745
     21746    long long count = psDBDeleteRows(dbh, MAGICSKYFILEMASK_TABLE_NAME, where, limit);
     21747    if (count < 0) {
     21748        psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicSkyfileMask");
     21749        return count;
     21750
     21751        deleted += count;
     21752    }
     21753
     21754    return deleted;
     21755}
     21756bool magicSkyfileMaskInsertObject(psDB *dbh, magicSkyfileMaskRow *object)
     21757{
     21758    return magicSkyfileMaskInsert(dbh, object->magic_id, object->diff_id, object->uri);
     21759}
     21760
     21761bool magicSkyfileMaskInsertObjects(psDB *dbh, psArray *objects)
     21762{
     21763    for (long i = 0; i < psArrayLength(objects); i++) {
     21764        if (!magicSkyfileMaskInsertObject(dbh, objects->data[i])) {
     21765            return false;
     21766        }
     21767    }
     21768
     21769    return true;
     21770}
     21771
     21772bool magicSkyfileMaskInsertFits(psDB *dbh, const psFits *fits)
     21773{
     21774    psArray         *rowSet;
     21775
     21776    // move to (the first?) extension named  MAGICSKYFILEMASK_TABLE_NAME
     21777    if (!psFitsMoveExtName(fits, MAGICSKYFILEMASK_TABLE_NAME)) {
     21778        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", MAGICSKYFILEMASK_TABLE_NAME);
     21779        return false;
     21780    }
     21781
     21782    // check HDU type
     21783    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
     21784        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
     21785        return false;
     21786    }
     21787
     21788    // read fits table
     21789    rowSet = psFitsReadTable(fits);
     21790    if (!rowSet) {
     21791        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
     21792        psFree(rowSet);
     21793        return false;
     21794    }
     21795
     21796    if (!psDBInsertRows(dbh, MAGICSKYFILEMASK_TABLE_NAME, rowSet)) {
     21797        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
     21798        psFree(rowSet);
     21799        return false;
     21800    }
     21801
     21802    psFree(rowSet);
     21803
     21804    return true;
     21805}
     21806
     21807bool magicSkyfileMaskSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     21808{
     21809    psArray         *rowSet;
     21810
     21811    rowSet = psDBSelectRows(dbh, MAGICSKYFILEMASK_TABLE_NAME, where, limit);
     21812    if (!rowSet) {
     21813        return false;
     21814    }
     21815
     21816    // output to fits
     21817    if (!psFitsWriteTable(fits, NULL, rowSet, MAGICSKYFILEMASK_TABLE_NAME)) {
     21818        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
     21819        psFree(rowSet);
     21820        return false;
     21821    }
     21822
     21823    psFree(rowSet);
     21824
     21825    return true;
     21826}
     21827
     21828psMetadata *magicSkyfileMaskMetadataFromObject(const magicSkyfileMaskRow *object)
     21829{
     21830    psMetadata *md = psMetadataAlloc();
     21831    if (!psMetadataAdd(md, PS_LIST_TAIL, "magic_id", PS_DATA_S64, NULL, object->magic_id)) {
     21832        psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");
     21833        psFree(md);
     21834        return false;
     21835    }
     21836    if (!psMetadataAdd(md, PS_LIST_TAIL, "diff_id", PS_DATA_S64, NULL, object->diff_id)) {
     21837        psError(PS_ERR_UNKNOWN, false, "failed to add item diff_id");
     21838        psFree(md);
     21839        return false;
     21840    }
     21841    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {
     21842        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     21843        psFree(md);
     21844        return false;
     21845    }
     21846
     21847
     21848    return md;
     21849}
     21850
     21851magicSkyfileMaskRow *magicSkyfileMaskObjectFromMetadata(psMetadata *md)
     21852{
     21853
     21854bool status = false;
     21855    psS64 magic_id = psMetadataLookupS64(&status, md, "magic_id");
     21856    if (!status) {
     21857        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item magic_id");
     21858        return false;
     21859    }
     21860    psS64 diff_id = psMetadataLookupS64(&status, md, "diff_id");
     21861    if (!status) {
     21862        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item diff_id");
     21863        return false;
     21864    }
     21865    char* uri = psMetadataLookupPtr(&status, md, "uri");
     21866    if (!status) {
     21867        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri");
     21868        return false;
     21869    }
     21870
     21871    return magicSkyfileMaskRowAlloc(magic_id, diff_id, uri);
     21872}
     21873psArray *magicSkyfileMaskSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     21874{
     21875    psArray         *rowSet;
     21876    psArray         *returnSet;
     21877    psU64           i;
     21878
     21879    rowSet = psDBSelectRows(dbh, MAGICSKYFILEMASK_TABLE_NAME, where, limit);
     21880    if (!rowSet) {
     21881        return NULL;
     21882    }
     21883
     21884    // convert psMetadata rows to row objects
     21885
     21886    returnSet = psArrayAllocEmpty(rowSet->n);
     21887
     21888    for (i = 0; i < rowSet->n; i++) {
     21889        magicSkyfileMaskRow *object = magicSkyfileMaskObjectFromMetadata(rowSet->data[i]);
     21890        psArrayAdd(returnSet, 0, object);
     21891        psFree(object);
     21892    }
     21893
     21894    psFree(rowSet);
     21895
     21896    return returnSet;
     21897}
     21898bool magicSkyfileMaskDeleteObject(psDB *dbh, const magicSkyfileMaskRow *object)
     21899{
     21900    psMetadata *where = magicSkyfileMaskMetadataFromObject(object);
     21901    long long count = psDBDeleteRows(dbh, MAGICSKYFILEMASK_TABLE_NAME, where, 0);
     21902    psFree(where);
     21903    if (count < 0) {
     21904        psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicSkyfileMask");
     21905        return false;
     21906    }
     21907    if (count > 1) {
     21908        // XXX should this be a psAbort() instead?  It is possible that
     21909        // having an object match multiple rows was by design.
     21910        psError(PS_ERR_UNKNOWN, true, "magicSkyfileMaskRow object matched more then one row.  Check your database schema");
     21911        return false;
     21912    }
     21913
     21914    return true;
     21915}
     21916long long magicSkyfileMaskDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     21917{
     21918    long long       deleted = 0;
     21919
     21920    for (long long i = 0; i < objects->n; i++) {
     21921        magicSkyfileMaskRow *object = objects->data[i];
     21922        psMetadata *where = magicSkyfileMaskMetadataFromObject(object);
     21923        long long count = psDBDeleteRows(dbh, MAGICSKYFILEMASK_TABLE_NAME, where, limit);
     21924        psFree(where);
     21925        if (count < 0) {
     21926            psError(PS_ERR_UNKNOWN, true, "failed to delete row from magicSkyfileMask");
     21927            return count;
     21928        }
     21929
     21930        deleted += count;
     21931    }
     21932
     21933    return deleted;
     21934}
     21935bool magicSkyfileMaskPrintObjects(FILE *stream, psArray *objects, bool mdcf)
     21936{
     21937    PS_ASSERT_PTR_NON_NULL(objects, false);
     21938
     21939    psMetadata *output = psMetadataAlloc();
     21940    for (long i = 0; i < psArrayLength(objects); i++) {
     21941        psMetadata *md = magicSkyfileMaskMetadataFromObject(objects->data[i]);
     21942        if (!psMetadataAddMetadata(
     21943            output,
     21944            PS_LIST_TAIL,
     21945            MAGICSKYFILEMASK_TABLE_NAME,
     21946            PS_META_DUPLICATE_OK,
     21947            NULL,
     21948            md
     21949        )) {
     21950            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
     21951            psFree(md);
     21952            psFree(output);
     21953            return false;
     21954        }
     21955        psFree(md);
     21956    }
     21957
     21958    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
     21959        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     21960        psFree(output);
     21961    }
     21962    psFree(output);
     21963
     21964    return true;
     21965}
     21966bool magicSkyfileMaskPrintObject(FILE *stream, magicSkyfileMaskRow *object, bool mdcf)
     21967{
     21968    PS_ASSERT_PTR_NON_NULL(object, false);
     21969
     21970    psMetadata *md = magicSkyfileMaskMetadataFromObject(object);
     21971
     21972    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     21973        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     21974        psFree(md);
     21975    }
     21976
     21977    psFree(md);
     21978
     21979    return true;
     21980}
Note: See TracChangeset for help on using the changeset viewer.