IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 15343


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

VERSION 1.1.28

Location:
trunk/ippdb
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/ippdb/Makefile.am

    r14598 r15343  
    1010man_MANS = \
    1111    $(top_builddir)/docs/man/man3/ippdb.3 \
     12    $(top_builddir)/docs/man/man3/pzDataStoreRow.3 \
    1213    $(top_builddir)/docs/man/man3/summitExpRow.3 \
    1314    $(top_builddir)/docs/man/man3/summitImfileRow.3 \
     
    4950    $(top_builddir)/docs/man/man3/detRunSummaryRow.3 \
    5051    $(top_builddir)/docs/man/man3/detRegisteredImfileRow.3 \
     52    $(top_builddir)/docs/man/man3/detCorrectedExpRow.3 \
     53    $(top_builddir)/docs/man/man3/detCorrectedImfileRow.3 \
    5154    $(top_builddir)/docs/man/man3/magicRunRow.3 \
    5255    $(top_builddir)/docs/man/man3/magicInputSkyfileRow.3 \
    5356    $(top_builddir)/docs/man/man3/magicTreeRow.3 \
    5457    $(top_builddir)/docs/man/man3/magicNodeResultRow.3 \
    55     $(top_builddir)/docs/man/man3/magicMaskRow.3
     58    $(top_builddir)/docs/man/man3/magicMaskRow.3 \
     59    $(top_builddir)/docs/man/man3/magicSkyfileMaskRow.3
    5660
    5761
    58 docs/man/man3/ippdb.3 docs/man/man3/summitExpRow.3 docs/man/man3/summitImfileRow.3 docs/man/man3/pzPendingExpRow.3 docs/man/man3/pzPendingImfileRow.3 docs/man/man3/pzDoneExpRow.3 docs/man/man3/pzDoneImfileRow.3 docs/man/man3/newExpRow.3 docs/man/man3/newImfileRow.3 docs/man/man3/rawExpRow.3 docs/man/man3/rawImfileRow.3 docs/man/man3/guidePendingExpRow.3 docs/man/man3/chipRunRow.3 docs/man/man3/chipProcessedImfileRow.3 docs/man/man3/chipMaskRow.3 docs/man/man3/camRunRow.3 docs/man/man3/camProcessedExpRow.3 docs/man/man3/camMaskRow.3 docs/man/man3/warpRunRow.3 docs/man/man3/warpInputExpRow.3 docs/man/man3/warpSkyCellMapRow.3 docs/man/man3/warpSkyfileRow.3 docs/man/man3/diffRunRow.3 docs/man/man3/diffInputSkyfileRow.3 docs/man/man3/diffSkyfileRow.3 docs/man/man3/stackRunRow.3 docs/man/man3/stackInputSkyfileRow.3 docs/man/man3/stackSumSkyfileRow.3 docs/man/man3/detRunRow.3 docs/man/man3/detInputExpRow.3 docs/man/man3/detProcessedImfileRow.3 docs/man/man3/detProcessedExpRow.3 docs/man/man3/detStackedImfileRow.3 docs/man/man3/detNormalizedStatImfileRow.3 docs/man/man3/detNormalizedImfileRow.3 docs/man/man3/detNormalizedExpRow.3 docs/man/man3/detResidImfileRow.3 docs/man/man3/detResidExpRow.3 docs/man/man3/detRunSummaryRow.3 docs/man/man3/detRegisteredImfileRow.3 docs/man/man3/magicRunRow.3 docs/man/man3/magicInputSkyfileRow.3 docs/man/man3/magicTreeRow.3 docs/man/man3/magicNodeResultRow.3 docs/man/man3/magicMaskRow.3:
     62docs/man/man3/ippdb.3 docs/man/man3/pzDataStoreRow.3 docs/man/man3/summitExpRow.3 docs/man/man3/summitImfileRow.3 docs/man/man3/pzPendingExpRow.3 docs/man/man3/pzPendingImfileRow.3 docs/man/man3/pzDoneExpRow.3 docs/man/man3/pzDoneImfileRow.3 docs/man/man3/newExpRow.3 docs/man/man3/newImfileRow.3 docs/man/man3/rawExpRow.3 docs/man/man3/rawImfileRow.3 docs/man/man3/guidePendingExpRow.3 docs/man/man3/chipRunRow.3 docs/man/man3/chipProcessedImfileRow.3 docs/man/man3/chipMaskRow.3 docs/man/man3/camRunRow.3 docs/man/man3/camProcessedExpRow.3 docs/man/man3/camMaskRow.3 docs/man/man3/warpRunRow.3 docs/man/man3/warpInputExpRow.3 docs/man/man3/warpSkyCellMapRow.3 docs/man/man3/warpSkyfileRow.3 docs/man/man3/diffRunRow.3 docs/man/man3/diffInputSkyfileRow.3 docs/man/man3/diffSkyfileRow.3 docs/man/man3/stackRunRow.3 docs/man/man3/stackInputSkyfileRow.3 docs/man/man3/stackSumSkyfileRow.3 docs/man/man3/detRunRow.3 docs/man/man3/detInputExpRow.3 docs/man/man3/detProcessedImfileRow.3 docs/man/man3/detProcessedExpRow.3 docs/man/man3/detStackedImfileRow.3 docs/man/man3/detNormalizedStatImfileRow.3 docs/man/man3/detNormalizedImfileRow.3 docs/man/man3/detNormalizedExpRow.3 docs/man/man3/detResidImfileRow.3 docs/man/man3/detResidExpRow.3 docs/man/man3/detRunSummaryRow.3 docs/man/man3/detRegisteredImfileRow.3 docs/man/man3/detCorrectedExpRow.3 docs/man/man3/detCorrectedImfileRow.3 docs/man/man3/magicRunRow.3 docs/man/man3/magicInputSkyfileRow.3 docs/man/man3/magicTreeRow.3 docs/man/man3/magicNodeResultRow.3 docs/man/man3/magicMaskRow.3 docs/man/man3/magicSkyfileMaskRow.3:
    5963        $(DOXYGEN)
    6064
  • 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}
  • trunk/ippdb/src/ippdb.h

    r15003 r15343  
    125125);
    126126
     127/** pzDataStoreRow data structure
     128 *
     129 * Structure for representing a single row of pzDataStore table data.
     130 */
     131
     132typedef struct {
     133    char            *camera;
     134    char            *telescope;
     135    char            *uri;
     136} pzDataStoreRow;
     137
     138/** Creates a new pzDataStoreRow object
     139 *
     140 *  @return A new pzDataStoreRow object or NULL on failure.
     141 */
     142
     143pzDataStoreRow *pzDataStoreRowAlloc(
     144    const char      *camera,
     145    const char      *telescope,
     146    const char      *uri
     147);
     148
     149/** Creates a new pzDataStore table
     150 *
     151 * @return true on success
     152 */
     153
     154bool pzDataStoreCreateTable(
     155    psDB            *dbh                ///< Database handle
     156);
     157
     158/** Deletes a pzDataStore table
     159 *
     160 * @return true on success
     161 */
     162
     163bool pzDataStoreDropTable(
     164    psDB            *dbh                ///< Database handle
     165);
     166
     167/** Insert a single row into a table
     168 *
     169 * This function constructs and inserts a single row based on it's parameters.
     170 *
     171 * @return true on success
     172 */
     173
     174bool pzDataStoreInsert(
     175    psDB            *dbh,               ///< Database handle
     176    const char      *camera,
     177    const char      *telescope,
     178    const char      *uri
     179);
     180
     181/** Deletes up to limit rows from the database and returns the number of rows actually deleted.
     182 *
     183 * @return A The number of rows removed or a negative value on error
     184 */
     185
     186long long pzDataStoreDelete(
     187    psDB            *dbh,               ///< Database handle
     188    const psMetadata *where,            ///< Row match criteria
     189    unsigned long long limit            ///< Maximum number of elements to delete
     190);
     191
     192/** Insert a single pzDataStoreRow object into a table
     193 *
     194 * This function constructs and inserts a single row based on it's parameters.
     195 *
     196 * @return true on success
     197 */
     198
     199bool pzDataStoreInsertObject(
     200    psDB            *dbh,               ///< Database handle
     201    pzDataStoreRow  *object             ///< pzDataStoreRow object
     202);
     203
     204/** Insert an array of pzDataStoreRow object into a table
     205 *
     206 * This function constructs and inserts multiple rows based on it's parameters.
     207 *
     208 * @return true on success
     209 */
     210
     211bool pzDataStoreInsertObjects(
     212    psDB            *dbh,               ///< Database handle
     213    psArray         *objects            ///< array of pzDataStoreRow objects
     214);
     215
     216/** Insert data from a binary FITS table pzDataStoreRow into the database
     217 *
     218 * This function expects a psFits object with a FITS table as the first
     219 * extension.  The table must have at least one row of data in it, that is of
     220 * the appropriate format (number of columns and their type).  All other
     221 * extensions are ignored.
     222 *
     223 * @return true on success
     224 */
     225
     226bool pzDataStoreInsertFits(
     227    psDB            *dbh,               ///< Database handle
     228    const psFits    *fits               ///< psFits object
     229);
     230
     231/** Selects up to limit from the database and returns them in a binary FITS table
     232 *
     233 * This function assumes an empty psFits object and will create a FITS table
     234 * as the first extension.
     235 *
     236 *  See psDBSelectRows() for documentation on the format of where.
     237 *
     238 * @return true on success
     239 */
     240
     241bool pzDataStoreSelectRowsFits(
     242    psDB            *dbh,               ///< Database handle
     243    psFits          *fits,              ///< psFits object
     244    const psMetadata *where,            ///< Row match criteria
     245    unsigned long long limit            ///< Maximum number of elements to return
     246);
     247
     248/** Convert a pzDataStoreRow into an equivalent psMetadata
     249 *
     250 * @return A psMetadata pointer or NULL on error
     251 */
     252
     253psMetadata *pzDataStoreMetadataFromObject(
     254    const pzDataStoreRow *object             ///< fooRow to convert into a psMetadata
     255);
     256
     257/** Convert a psMetadata into an equivalent fooRow
     258 *
     259 * @return A pzDataStoreRow pointer or NULL on error
     260 */
     261
     262pzDataStoreRow *pzDataStoreObjectFromMetadata(
     263    psMetadata      *md                 ///< psMetadata to convert into a fooRow
     264);
     265/** Selects up to limit rows from the database and returns as pzDataStoreRow objects in a psArray
     266 *
     267 *  See psDBSelectRows() for documentation on the format of where.
     268 *
     269 * @return A psArray pointer or NULL on error
     270 */
     271
     272psArray *pzDataStoreSelectRowObjects(
     273    psDB            *dbh,               ///< Database handle
     274    const psMetadata *where,            ///< Row match criteria
     275    unsigned long long limit            ///< Maximum number of elements to return
     276);
     277/** Deletes a row from the database coresponding to an pzDataStore
     278 *
     279 *  Note that a 'where' search psMetadata is constructed from each object and
     280 *  used to find rows to delete.
     281 *
     282 * @return A The number of rows removed or a negative value on error
     283 */
     284
     285bool pzDataStoreDeleteObject(
     286    psDB            *dbh,               ///< Database handle
     287    const pzDataStoreRow *object    ///< Object to delete
     288);
     289/** Deletes up to limit rows from the database and returns the number of rows actually deleted.
     290 *
     291 *  Note that a 'where' search psMetadata is constructed from each object and
     292 *  used to find rows to delete.
     293 *
     294 * @return A The number of rows removed or a negative value on error
     295 */
     296
     297long long pzDataStoreDeleteRowObjects(
     298    psDB            *dbh,               ///< Database handle
     299    const psArray   *objects,           ///< Array of objects to delete
     300    unsigned long long limit            ///< Maximum number of elements to delete
     301);
     302/** Formats and prints an array of pzDataStoreRow objects
     303 *
     304 * When mdcf is set the formated output is in psMetadataConfig
     305 * format, otherwise it is in a simple tabular format.
     306 *
     307 * @return true on success
     308 */
     309
     310bool pzDataStorePrintObjects(
     311    FILE            *stream,            ///< a stream
     312    psArray         *objects,           ///< An array of pzDataStoreRow objects
     313    bool            mdcf                ///< format as mdconfig or simple
     314);
     315/** Formats and prints an pzDataStoreRow object
     316 *
     317 * When mdcf is set the formated output is in psMetadataConfig
     318 * format, otherwise it is in a simple tabular format.
     319 *
     320 * @return true on success
     321 */
     322
     323bool pzDataStorePrintObject(
     324    FILE            *stream,            ///< a stream
     325    pzDataStoreRow *object,    ///< an pzDataStoreRow object
     326    bool            mdcf                ///< format as mdconfig or simple
     327);
    127328/** summitExpRow data structure
    128329 *
     
    88499050    bool            mdcf                ///< format as mdconfig or simple
    88509051);
     9052/** detCorrectedExpRow data structure
     9053 *
     9054 * Structure for representing a single row of detCorrectedExp table data.
     9055 */
     9056
     9057typedef struct {
     9058    psS64           det_id;
     9059    psS64           exp_id;
     9060    char            *uri;
     9061    psS64           corr_id;
     9062    char            *corr_type;
     9063    char            *recipe;
     9064    char            *path_base;
     9065    psS16           fault;
     9066} detCorrectedExpRow;
     9067
     9068/** Creates a new detCorrectedExpRow object
     9069 *
     9070 *  @return A new detCorrectedExpRow object or NULL on failure.
     9071 */
     9072
     9073detCorrectedExpRow *detCorrectedExpRowAlloc(
     9074    psS64           det_id,
     9075    psS64           exp_id,
     9076    const char      *uri,
     9077    psS64           corr_id,
     9078    const char      *corr_type,
     9079    const char      *recipe,
     9080    const char      *path_base,
     9081    psS16           fault
     9082);
     9083
     9084/** Creates a new detCorrectedExp table
     9085 *
     9086 * @return true on success
     9087 */
     9088
     9089bool detCorrectedExpCreateTable(
     9090    psDB            *dbh                ///< Database handle
     9091);
     9092
     9093/** Deletes a detCorrectedExp table
     9094 *
     9095 * @return true on success
     9096 */
     9097
     9098bool detCorrectedExpDropTable(
     9099    psDB            *dbh                ///< Database handle
     9100);
     9101
     9102/** Insert a single row into a table
     9103 *
     9104 * This function constructs and inserts a single row based on it's parameters.
     9105 *
     9106 * @return true on success
     9107 */
     9108
     9109bool detCorrectedExpInsert(
     9110    psDB            *dbh,               ///< Database handle
     9111    psS64           det_id,
     9112    psS64           exp_id,
     9113    const char      *uri,
     9114    psS64           corr_id,
     9115    const char      *corr_type,
     9116    const char      *recipe,
     9117    const char      *path_base,
     9118    psS16           fault
     9119);
     9120
     9121/** Deletes up to limit rows from the database and returns the number of rows actually deleted.
     9122 *
     9123 * @return A The number of rows removed or a negative value on error
     9124 */
     9125
     9126long long detCorrectedExpDelete(
     9127    psDB            *dbh,               ///< Database handle
     9128    const psMetadata *where,            ///< Row match criteria
     9129    unsigned long long limit            ///< Maximum number of elements to delete
     9130);
     9131
     9132/** Insert a single detCorrectedExpRow object into a table
     9133 *
     9134 * This function constructs and inserts a single row based on it's parameters.
     9135 *
     9136 * @return true on success
     9137 */
     9138
     9139bool detCorrectedExpInsertObject(
     9140    psDB            *dbh,               ///< Database handle
     9141    detCorrectedExpRow *object             ///< detCorrectedExpRow object
     9142);
     9143
     9144/** Insert an array of detCorrectedExpRow object into a table
     9145 *
     9146 * This function constructs and inserts multiple rows based on it's parameters.
     9147 *
     9148 * @return true on success
     9149 */
     9150
     9151bool detCorrectedExpInsertObjects(
     9152    psDB            *dbh,               ///< Database handle
     9153    psArray         *objects            ///< array of detCorrectedExpRow objects
     9154);
     9155
     9156/** Insert data from a binary FITS table detCorrectedExpRow into the database
     9157 *
     9158 * This function expects a psFits object with a FITS table as the first
     9159 * extension.  The table must have at least one row of data in it, that is of
     9160 * the appropriate format (number of columns and their type).  All other
     9161 * extensions are ignored.
     9162 *
     9163 * @return true on success
     9164 */
     9165
     9166bool detCorrectedExpInsertFits(
     9167    psDB            *dbh,               ///< Database handle
     9168    const psFits    *fits               ///< psFits object
     9169);
     9170
     9171/** Selects up to limit from the database and returns them in a binary FITS table
     9172 *
     9173 * This function assumes an empty psFits object and will create a FITS table
     9174 * as the first extension.
     9175 *
     9176 *  See psDBSelectRows() for documentation on the format of where.
     9177 *
     9178 * @return true on success
     9179 */
     9180
     9181bool detCorrectedExpSelectRowsFits(
     9182    psDB            *dbh,               ///< Database handle
     9183    psFits          *fits,              ///< psFits object
     9184    const psMetadata *where,            ///< Row match criteria
     9185    unsigned long long limit            ///< Maximum number of elements to return
     9186);
     9187
     9188/** Convert a detCorrectedExpRow into an equivalent psMetadata
     9189 *
     9190 * @return A psMetadata pointer or NULL on error
     9191 */
     9192
     9193psMetadata *detCorrectedExpMetadataFromObject(
     9194    const detCorrectedExpRow *object             ///< fooRow to convert into a psMetadata
     9195);
     9196
     9197/** Convert a psMetadata into an equivalent fooRow
     9198 *
     9199 * @return A detCorrectedExpRow pointer or NULL on error
     9200 */
     9201
     9202detCorrectedExpRow *detCorrectedExpObjectFromMetadata(
     9203    psMetadata      *md                 ///< psMetadata to convert into a fooRow
     9204);
     9205/** Selects up to limit rows from the database and returns as detCorrectedExpRow objects in a psArray
     9206 *
     9207 *  See psDBSelectRows() for documentation on the format of where.
     9208 *
     9209 * @return A psArray pointer or NULL on error
     9210 */
     9211
     9212psArray *detCorrectedExpSelectRowObjects(
     9213    psDB            *dbh,               ///< Database handle
     9214    const psMetadata *where,            ///< Row match criteria
     9215    unsigned long long limit            ///< Maximum number of elements to return
     9216);
     9217/** Deletes a row from the database coresponding to an detCorrectedExp
     9218 *
     9219 *  Note that a 'where' search psMetadata is constructed from each object and
     9220 *  used to find rows to delete.
     9221 *
     9222 * @return A The number of rows removed or a negative value on error
     9223 */
     9224
     9225bool detCorrectedExpDeleteObject(
     9226    psDB            *dbh,               ///< Database handle
     9227    const detCorrectedExpRow *object    ///< Object to delete
     9228);
     9229/** Deletes up to limit rows from the database and returns the number of rows actually deleted.
     9230 *
     9231 *  Note that a 'where' search psMetadata is constructed from each object and
     9232 *  used to find rows to delete.
     9233 *
     9234 * @return A The number of rows removed or a negative value on error
     9235 */
     9236
     9237long long detCorrectedExpDeleteRowObjects(
     9238    psDB            *dbh,               ///< Database handle
     9239    const psArray   *objects,           ///< Array of objects to delete
     9240    unsigned long long limit            ///< Maximum number of elements to delete
     9241);
     9242/** Formats and prints an array of detCorrectedExpRow objects
     9243 *
     9244 * When mdcf is set the formated output is in psMetadataConfig
     9245 * format, otherwise it is in a simple tabular format.
     9246 *
     9247 * @return true on success
     9248 */
     9249
     9250bool detCorrectedExpPrintObjects(
     9251    FILE            *stream,            ///< a stream
     9252    psArray         *objects,           ///< An array of detCorrectedExpRow objects
     9253    bool            mdcf                ///< format as mdconfig or simple
     9254);
     9255/** Formats and prints an detCorrectedExpRow object
     9256 *
     9257 * When mdcf is set the formated output is in psMetadataConfig
     9258 * format, otherwise it is in a simple tabular format.
     9259 *
     9260 * @return true on success
     9261 */
     9262
     9263bool detCorrectedExpPrintObject(
     9264    FILE            *stream,            ///< a stream
     9265    detCorrectedExpRow *object,    ///< an detCorrectedExpRow object
     9266    bool            mdcf                ///< format as mdconfig or simple
     9267);
     9268/** detCorrectedImfileRow data structure
     9269 *
     9270 * Structure for representing a single row of detCorrectedImfile table data.
     9271 */
     9272
     9273typedef struct {
     9274    psS64           det_id;
     9275    psS64           exp_id;
     9276    char            *class_id;
     9277    char            *uri;
     9278    char            *path_base;
     9279    psS16           fault;
     9280} detCorrectedImfileRow;
     9281
     9282/** Creates a new detCorrectedImfileRow object
     9283 *
     9284 *  @return A new detCorrectedImfileRow object or NULL on failure.
     9285 */
     9286
     9287detCorrectedImfileRow *detCorrectedImfileRowAlloc(
     9288    psS64           det_id,
     9289    psS64           exp_id,
     9290    const char      *class_id,
     9291    const char      *uri,
     9292    const char      *path_base,
     9293    psS16           fault
     9294);
     9295
     9296/** Creates a new detCorrectedImfile table
     9297 *
     9298 * @return true on success
     9299 */
     9300
     9301bool detCorrectedImfileCreateTable(
     9302    psDB            *dbh                ///< Database handle
     9303);
     9304
     9305/** Deletes a detCorrectedImfile table
     9306 *
     9307 * @return true on success
     9308 */
     9309
     9310bool detCorrectedImfileDropTable(
     9311    psDB            *dbh                ///< Database handle
     9312);
     9313
     9314/** Insert a single row into a table
     9315 *
     9316 * This function constructs and inserts a single row based on it's parameters.
     9317 *
     9318 * @return true on success
     9319 */
     9320
     9321bool detCorrectedImfileInsert(
     9322    psDB            *dbh,               ///< Database handle
     9323    psS64           det_id,
     9324    psS64           exp_id,
     9325    const char      *class_id,
     9326    const char      *uri,
     9327    const char      *path_base,
     9328    psS16           fault
     9329);
     9330
     9331/** Deletes up to limit rows from the database and returns the number of rows actually deleted.
     9332 *
     9333 * @return A The number of rows removed or a negative value on error
     9334 */
     9335
     9336long long detCorrectedImfileDelete(
     9337    psDB            *dbh,               ///< Database handle
     9338    const psMetadata *where,            ///< Row match criteria
     9339    unsigned long long limit            ///< Maximum number of elements to delete
     9340);
     9341
     9342/** Insert a single detCorrectedImfileRow object into a table
     9343 *
     9344 * This function constructs and inserts a single row based on it's parameters.
     9345 *
     9346 * @return true on success
     9347 */
     9348
     9349bool detCorrectedImfileInsertObject(
     9350    psDB            *dbh,               ///< Database handle
     9351    detCorrectedImfileRow *object             ///< detCorrectedImfileRow object
     9352);
     9353
     9354/** Insert an array of detCorrectedImfileRow object into a table
     9355 *
     9356 * This function constructs and inserts multiple rows based on it's parameters.
     9357 *
     9358 * @return true on success
     9359 */
     9360
     9361bool detCorrectedImfileInsertObjects(
     9362    psDB            *dbh,               ///< Database handle
     9363    psArray         *objects            ///< array of detCorrectedImfileRow objects
     9364);
     9365
     9366/** Insert data from a binary FITS table detCorrectedImfileRow into the database
     9367 *
     9368 * This function expects a psFits object with a FITS table as the first
     9369 * extension.  The table must have at least one row of data in it, that is of
     9370 * the appropriate format (number of columns and their type).  All other
     9371 * extensions are ignored.
     9372 *
     9373 * @return true on success
     9374 */
     9375
     9376bool detCorrectedImfileInsertFits(
     9377    psDB            *dbh,               ///< Database handle
     9378    const psFits    *fits               ///< psFits object
     9379);
     9380
     9381/** Selects up to limit from the database and returns them in a binary FITS table
     9382 *
     9383 * This function assumes an empty psFits object and will create a FITS table
     9384 * as the first extension.
     9385 *
     9386 *  See psDBSelectRows() for documentation on the format of where.
     9387 *
     9388 * @return true on success
     9389 */
     9390
     9391bool detCorrectedImfileSelectRowsFits(
     9392    psDB            *dbh,               ///< Database handle
     9393    psFits          *fits,              ///< psFits object
     9394    const psMetadata *where,            ///< Row match criteria
     9395    unsigned long long limit            ///< Maximum number of elements to return
     9396);
     9397
     9398/** Convert a detCorrectedImfileRow into an equivalent psMetadata
     9399 *
     9400 * @return A psMetadata pointer or NULL on error
     9401 */
     9402
     9403psMetadata *detCorrectedImfileMetadataFromObject(
     9404    const detCorrectedImfileRow *object             ///< fooRow to convert into a psMetadata
     9405);
     9406
     9407/** Convert a psMetadata into an equivalent fooRow
     9408 *
     9409 * @return A detCorrectedImfileRow pointer or NULL on error
     9410 */
     9411
     9412detCorrectedImfileRow *detCorrectedImfileObjectFromMetadata(
     9413    psMetadata      *md                 ///< psMetadata to convert into a fooRow
     9414);
     9415/** Selects up to limit rows from the database and returns as detCorrectedImfileRow objects in a psArray
     9416 *
     9417 *  See psDBSelectRows() for documentation on the format of where.
     9418 *
     9419 * @return A psArray pointer or NULL on error
     9420 */
     9421
     9422psArray *detCorrectedImfileSelectRowObjects(
     9423    psDB            *dbh,               ///< Database handle
     9424    const psMetadata *where,            ///< Row match criteria
     9425    unsigned long long limit            ///< Maximum number of elements to return
     9426);
     9427/** Deletes a row from the database coresponding to an detCorrectedImfile
     9428 *
     9429 *  Note that a 'where' search psMetadata is constructed from each object and
     9430 *  used to find rows to delete.
     9431 *
     9432 * @return A The number of rows removed or a negative value on error
     9433 */
     9434
     9435bool detCorrectedImfileDeleteObject(
     9436    psDB            *dbh,               ///< Database handle
     9437    const detCorrectedImfileRow *object    ///< Object to delete
     9438);
     9439/** Deletes up to limit rows from the database and returns the number of rows actually deleted.
     9440 *
     9441 *  Note that a 'where' search psMetadata is constructed from each object and
     9442 *  used to find rows to delete.
     9443 *
     9444 * @return A The number of rows removed or a negative value on error
     9445 */
     9446
     9447long long detCorrectedImfileDeleteRowObjects(
     9448    psDB            *dbh,               ///< Database handle
     9449    const psArray   *objects,           ///< Array of objects to delete
     9450    unsigned long long limit            ///< Maximum number of elements to delete
     9451);
     9452/** Formats and prints an array of detCorrectedImfileRow objects
     9453 *
     9454 * When mdcf is set the formated output is in psMetadataConfig
     9455 * format, otherwise it is in a simple tabular format.
     9456 *
     9457 * @return true on success
     9458 */
     9459
     9460bool detCorrectedImfilePrintObjects(
     9461    FILE            *stream,            ///< a stream
     9462    psArray         *objects,           ///< An array of detCorrectedImfileRow objects
     9463    bool            mdcf                ///< format as mdconfig or simple
     9464);
     9465/** Formats and prints an detCorrectedImfileRow object
     9466 *
     9467 * When mdcf is set the formated output is in psMetadataConfig
     9468 * format, otherwise it is in a simple tabular format.
     9469 *
     9470 * @return true on success
     9471 */
     9472
     9473bool detCorrectedImfilePrintObject(
     9474    FILE            *stream,            ///< a stream
     9475    detCorrectedImfileRow *object,    ///< an detCorrectedImfileRow object
     9476    bool            mdcf                ///< format as mdconfig or simple
     9477);
    88519478/** magicRunRow data structure
    88529479 *
     
    986310490    bool            mdcf                ///< format as mdconfig or simple
    986410491);
     10492/** magicSkyfileMaskRow data structure
     10493 *
     10494 * Structure for representing a single row of magicSkyfileMask table data.
     10495 */
     10496
     10497typedef struct {
     10498    psS64           magic_id;
     10499    psS64           diff_id;
     10500    char            *uri;
     10501} magicSkyfileMaskRow;
     10502
     10503/** Creates a new magicSkyfileMaskRow object
     10504 *
     10505 *  @return A new magicSkyfileMaskRow object or NULL on failure.
     10506 */
     10507
     10508magicSkyfileMaskRow *magicSkyfileMaskRowAlloc(
     10509    psS64           magic_id,
     10510    psS64           diff_id,
     10511    const char      *uri
     10512);
     10513
     10514/** Creates a new magicSkyfileMask table
     10515 *
     10516 * @return true on success
     10517 */
     10518
     10519bool magicSkyfileMaskCreateTable(
     10520    psDB            *dbh                ///< Database handle
     10521);
     10522
     10523/** Deletes a magicSkyfileMask table
     10524 *
     10525 * @return true on success
     10526 */
     10527
     10528bool magicSkyfileMaskDropTable(
     10529    psDB            *dbh                ///< Database handle
     10530);
     10531
     10532/** Insert a single row into a table
     10533 *
     10534 * This function constructs and inserts a single row based on it's parameters.
     10535 *
     10536 * @return true on success
     10537 */
     10538
     10539bool magicSkyfileMaskInsert(
     10540    psDB            *dbh,               ///< Database handle
     10541    psS64           magic_id,
     10542    psS64           diff_id,
     10543    const char      *uri
     10544);
     10545
     10546/** Deletes up to limit rows from the database and returns the number of rows actually deleted.
     10547 *
     10548 * @return A The number of rows removed or a negative value on error
     10549 */
     10550
     10551long long magicSkyfileMaskDelete(
     10552    psDB            *dbh,               ///< Database handle
     10553    const psMetadata *where,            ///< Row match criteria
     10554    unsigned long long limit            ///< Maximum number of elements to delete
     10555);
     10556
     10557/** Insert a single magicSkyfileMaskRow object into a table
     10558 *
     10559 * This function constructs and inserts a single row based on it's parameters.
     10560 *
     10561 * @return true on success
     10562 */
     10563
     10564bool magicSkyfileMaskInsertObject(
     10565    psDB            *dbh,               ///< Database handle
     10566    magicSkyfileMaskRow *object             ///< magicSkyfileMaskRow object
     10567);
     10568
     10569/** Insert an array of magicSkyfileMaskRow object into a table
     10570 *
     10571 * This function constructs and inserts multiple rows based on it's parameters.
     10572 *
     10573 * @return true on success
     10574 */
     10575
     10576bool magicSkyfileMaskInsertObjects(
     10577    psDB            *dbh,               ///< Database handle
     10578    psArray         *objects            ///< array of magicSkyfileMaskRow objects
     10579);
     10580
     10581/** Insert data from a binary FITS table magicSkyfileMaskRow into the database
     10582 *
     10583 * This function expects a psFits object with a FITS table as the first
     10584 * extension.  The table must have at least one row of data in it, that is of
     10585 * the appropriate format (number of columns and their type).  All other
     10586 * extensions are ignored.
     10587 *
     10588 * @return true on success
     10589 */
     10590
     10591bool magicSkyfileMaskInsertFits(
     10592    psDB            *dbh,               ///< Database handle
     10593    const psFits    *fits               ///< psFits object
     10594);
     10595
     10596/** Selects up to limit from the database and returns them in a binary FITS table
     10597 *
     10598 * This function assumes an empty psFits object and will create a FITS table
     10599 * as the first extension.
     10600 *
     10601 *  See psDBSelectRows() for documentation on the format of where.
     10602 *
     10603 * @return true on success
     10604 */
     10605
     10606bool magicSkyfileMaskSelectRowsFits(
     10607    psDB            *dbh,               ///< Database handle
     10608    psFits          *fits,              ///< psFits object
     10609    const psMetadata *where,            ///< Row match criteria
     10610    unsigned long long limit            ///< Maximum number of elements to return
     10611);
     10612
     10613/** Convert a magicSkyfileMaskRow into an equivalent psMetadata
     10614 *
     10615 * @return A psMetadata pointer or NULL on error
     10616 */
     10617
     10618psMetadata *magicSkyfileMaskMetadataFromObject(
     10619    const magicSkyfileMaskRow *object             ///< fooRow to convert into a psMetadata
     10620);
     10621
     10622/** Convert a psMetadata into an equivalent fooRow
     10623 *
     10624 * @return A magicSkyfileMaskRow pointer or NULL on error
     10625 */
     10626
     10627magicSkyfileMaskRow *magicSkyfileMaskObjectFromMetadata(
     10628    psMetadata      *md                 ///< psMetadata to convert into a fooRow
     10629);
     10630/** Selects up to limit rows from the database and returns as magicSkyfileMaskRow objects in a psArray
     10631 *
     10632 *  See psDBSelectRows() for documentation on the format of where.
     10633 *
     10634 * @return A psArray pointer or NULL on error
     10635 */
     10636
     10637psArray *magicSkyfileMaskSelectRowObjects(
     10638    psDB            *dbh,               ///< Database handle
     10639    const psMetadata *where,            ///< Row match criteria
     10640    unsigned long long limit            ///< Maximum number of elements to return
     10641);
     10642/** Deletes a row from the database coresponding to an magicSkyfileMask
     10643 *
     10644 *  Note that a 'where' search psMetadata is constructed from each object and
     10645 *  used to find rows to delete.
     10646 *
     10647 * @return A The number of rows removed or a negative value on error
     10648 */
     10649
     10650bool magicSkyfileMaskDeleteObject(
     10651    psDB            *dbh,               ///< Database handle
     10652    const magicSkyfileMaskRow *object    ///< Object to delete
     10653);
     10654/** Deletes up to limit rows from the database and returns the number of rows actually deleted.
     10655 *
     10656 *  Note that a 'where' search psMetadata is constructed from each object and
     10657 *  used to find rows to delete.
     10658 *
     10659 * @return A The number of rows removed or a negative value on error
     10660 */
     10661
     10662long long magicSkyfileMaskDeleteRowObjects(
     10663    psDB            *dbh,               ///< Database handle
     10664    const psArray   *objects,           ///< Array of objects to delete
     10665    unsigned long long limit            ///< Maximum number of elements to delete
     10666);
     10667/** Formats and prints an array of magicSkyfileMaskRow objects
     10668 *
     10669 * When mdcf is set the formated output is in psMetadataConfig
     10670 * format, otherwise it is in a simple tabular format.
     10671 *
     10672 * @return true on success
     10673 */
     10674
     10675bool magicSkyfileMaskPrintObjects(
     10676    FILE            *stream,            ///< a stream
     10677    psArray         *objects,           ///< An array of magicSkyfileMaskRow objects
     10678    bool            mdcf                ///< format as mdconfig or simple
     10679);
     10680/** Formats and prints an magicSkyfileMaskRow object
     10681 *
     10682 * When mdcf is set the formated output is in psMetadataConfig
     10683 * format, otherwise it is in a simple tabular format.
     10684 *
     10685 * @return true on success
     10686 */
     10687
     10688bool magicSkyfileMaskPrintObject(
     10689    FILE            *stream,            ///< a stream
     10690    magicSkyfileMaskRow *object,    ///< an magicSkyfileMaskRow object
     10691    bool            mdcf                ///< format as mdconfig or simple
     10692);
    986510693
    986610694/// @}
     
    987010698#endif
    987110699
    9872 #endif // MAGICMASK_DB_H
     10700#endif // MAGICSKYFILEMASK_DB_H
  • trunk/ippdb/tests/alloc.c

    r15003 r15343  
    99{
    1010    {
     11        pzDataStoreRow  *object;
     12
     13        object = pzDataStoreRowAlloc("a string", "a string", "a string"    );
     14
     15        if (!object) {
     16            exit(EXIT_FAILURE);
     17        }
     18
     19        if (strncmp(object->camera, "a string", MAX_STRING_LENGTH)) {
     20            psFree(object);
     21            exit(EXIT_FAILURE);
     22        }
     23        if (strncmp(object->telescope, "a string", MAX_STRING_LENGTH)) {
     24            psFree(object);
     25            exit(EXIT_FAILURE);
     26        }
     27        if (strncmp(object->uri, "a string", MAX_STRING_LENGTH)) {
     28            psFree(object);
     29            exit(EXIT_FAILURE);
     30        }
     31
     32        psFree(object);
     33    }
     34
     35    {
    1136        summitExpRow    *object;
    1237
     
    21532178
    21542179    {
     2180        detCorrectedExpRow *object;
     2181
     2182        object = detCorrectedExpRowAlloc(-64, -64, "a string", -64, "a string", "a string", "a string", -16    );
     2183
     2184        if (!object) {
     2185            exit(EXIT_FAILURE);
     2186        }
     2187
     2188        if (!object->det_id == -64) {
     2189            psFree(object);
     2190            exit(EXIT_FAILURE);
     2191        }
     2192        if (!object->exp_id == -64) {
     2193            psFree(object);
     2194            exit(EXIT_FAILURE);
     2195        }
     2196        if (strncmp(object->uri, "a string", MAX_STRING_LENGTH)) {
     2197            psFree(object);
     2198            exit(EXIT_FAILURE);
     2199        }
     2200        if (!object->corr_id == -64) {
     2201            psFree(object);
     2202            exit(EXIT_FAILURE);
     2203        }
     2204        if (strncmp(object->corr_type, "a string", MAX_STRING_LENGTH)) {
     2205            psFree(object);
     2206            exit(EXIT_FAILURE);
     2207        }
     2208        if (strncmp(object->recipe, "a string", MAX_STRING_LENGTH)) {
     2209            psFree(object);
     2210            exit(EXIT_FAILURE);
     2211        }
     2212        if (strncmp(object->path_base, "a string", MAX_STRING_LENGTH)) {
     2213            psFree(object);
     2214            exit(EXIT_FAILURE);
     2215        }
     2216        if (!object->fault == -16) {
     2217            psFree(object);
     2218            exit(EXIT_FAILURE);
     2219        }
     2220
     2221        psFree(object);
     2222    }
     2223
     2224    {
     2225        detCorrectedImfileRow *object;
     2226
     2227        object = detCorrectedImfileRowAlloc(-64, -64, "a string", "a string", "a string", -16    );
     2228
     2229        if (!object) {
     2230            exit(EXIT_FAILURE);
     2231        }
     2232
     2233        if (!object->det_id == -64) {
     2234            psFree(object);
     2235            exit(EXIT_FAILURE);
     2236        }
     2237        if (!object->exp_id == -64) {
     2238            psFree(object);
     2239            exit(EXIT_FAILURE);
     2240        }
     2241        if (strncmp(object->class_id, "a string", MAX_STRING_LENGTH)) {
     2242            psFree(object);
     2243            exit(EXIT_FAILURE);
     2244        }
     2245        if (strncmp(object->uri, "a string", MAX_STRING_LENGTH)) {
     2246            psFree(object);
     2247            exit(EXIT_FAILURE);
     2248        }
     2249        if (strncmp(object->path_base, "a string", MAX_STRING_LENGTH)) {
     2250            psFree(object);
     2251            exit(EXIT_FAILURE);
     2252        }
     2253        if (!object->fault == -16) {
     2254            psFree(object);
     2255            exit(EXIT_FAILURE);
     2256        }
     2257
     2258        psFree(object);
     2259    }
     2260
     2261    {
    21552262        magicRunRow     *object;
    21562263
     
    22772384
    22782385        if (!object->magic_id == -64) {
     2386            psFree(object);
     2387            exit(EXIT_FAILURE);
     2388        }
     2389        if (strncmp(object->uri, "a string", MAX_STRING_LENGTH)) {
     2390            psFree(object);
     2391            exit(EXIT_FAILURE);
     2392        }
     2393
     2394        psFree(object);
     2395    }
     2396
     2397    {
     2398        magicSkyfileMaskRow *object;
     2399
     2400        object = magicSkyfileMaskRowAlloc(-64, -64, "a string"    );
     2401
     2402        if (!object) {
     2403            exit(EXIT_FAILURE);
     2404        }
     2405
     2406        if (!object->magic_id == -64) {
     2407            psFree(object);
     2408            exit(EXIT_FAILURE);
     2409        }
     2410        if (!object->diff_id == -64) {
    22792411            psFree(object);
    22802412            exit(EXIT_FAILURE);
  • trunk/ippdb/tests/createtable.c

    r14598 r15343  
    1313        }
    1414
     15        if(!pzDataStoreCreateTable(dbh)) {
     16            exit(EXIT_FAILURE);
     17        }
     18
     19        psDBCleanup(dbh);
     20    }
     21
     22    {
     23        psDB            *dbh;
     24
     25        dbh = psDBInit("localhost", "test", NULL, "test");
     26        if (!dbh) {
     27            exit(EXIT_FAILURE);
     28        }
     29
    1530        if(!summitExpCreateTable(dbh)) {
    1631            exit(EXIT_FAILURE);
     
    598613        }
    599614
     615        if(!detCorrectedExpCreateTable(dbh)) {
     616            exit(EXIT_FAILURE);
     617        }
     618
     619        psDBCleanup(dbh);
     620    }
     621
     622    {
     623        psDB            *dbh;
     624
     625        dbh = psDBInit("localhost", "test", NULL, "test");
     626        if (!dbh) {
     627            exit(EXIT_FAILURE);
     628        }
     629
     630        if(!detCorrectedImfileCreateTable(dbh)) {
     631            exit(EXIT_FAILURE);
     632        }
     633
     634        psDBCleanup(dbh);
     635    }
     636
     637    {
     638        psDB            *dbh;
     639
     640        dbh = psDBInit("localhost", "test", NULL, "test");
     641        if (!dbh) {
     642            exit(EXIT_FAILURE);
     643        }
     644
    600645        if(!magicRunCreateTable(dbh)) {
    601646            exit(EXIT_FAILURE);
     
    659704
    660705        if(!magicMaskCreateTable(dbh)) {
     706            exit(EXIT_FAILURE);
     707        }
     708
     709        psDBCleanup(dbh);
     710    }
     711
     712    {
     713        psDB            *dbh;
     714
     715        dbh = psDBInit("localhost", "test", NULL, "test");
     716        if (!dbh) {
     717            exit(EXIT_FAILURE);
     718        }
     719
     720        if(!magicSkyfileMaskCreateTable(dbh)) {
    661721            exit(EXIT_FAILURE);
    662722        }
  • trunk/ippdb/tests/dbcleanup.c

    r14598 r15343  
    1111    }
    1212
     13    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS pzDataStore");
    1314    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS summitExp");
    1415    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS summitImfile");
     
    5051    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS detRunSummary");
    5152    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS detRegisteredImfile");
     53    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS detCorrectedExp");
     54    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS detCorrectedImfile");
    5255    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS magicRun");
    5356    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS magicInputSkyfile");
     
    5558    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS magicNodeResult");
    5659    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS magicMask");
     60    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS magicSkyfileMask");
    5761
    5862    psDBCleanup(dbh);
  • trunk/ippdb/tests/dbsetup.c

    r14598 r15343  
    1313
    1414    // remove the table if it already exists
     15    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS pzDataStore");
     16    pzDataStoreCreateTable(dbh);
     17
    1518    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS summitExp");
    1619    summitExpCreateTable(dbh);
     
    130133    detRegisteredImfileCreateTable(dbh);
    131134
     135    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS detCorrectedExp");
     136    detCorrectedExpCreateTable(dbh);
     137
     138    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS detCorrectedImfile");
     139    detCorrectedImfileCreateTable(dbh);
     140
    132141    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS magicRun");
    133142    magicRunCreateTable(dbh);
     
    145154    magicMaskCreateTable(dbh);
    146155
     156    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS magicSkyfileMask");
     157    magicSkyfileMaskCreateTable(dbh);
     158
    147159    psDBCleanup(dbh);
    148160
  • trunk/ippdb/tests/droptable.c

    r14598 r15343  
    1313        }
    1414
     15        if (!pzDataStoreDropTable(dbh)) {
     16            exit(EXIT_FAILURE);
     17        }
     18
     19        psDBCleanup(dbh);
     20    }
     21
     22    {
     23        psDB            *dbh;
     24
     25        dbh = psDBInit("localhost", "test", NULL, "test");
     26        if (!dbh) {
     27            exit(EXIT_FAILURE);
     28        }
     29
    1530        if (!summitExpDropTable(dbh)) {
    1631            exit(EXIT_FAILURE);
     
    598613        }
    599614
     615        if (!detCorrectedExpDropTable(dbh)) {
     616            exit(EXIT_FAILURE);
     617        }
     618
     619        psDBCleanup(dbh);
     620    }
     621
     622    {
     623        psDB            *dbh;
     624
     625        dbh = psDBInit("localhost", "test", NULL, "test");
     626        if (!dbh) {
     627            exit(EXIT_FAILURE);
     628        }
     629
     630        if (!detCorrectedImfileDropTable(dbh)) {
     631            exit(EXIT_FAILURE);
     632        }
     633
     634        psDBCleanup(dbh);
     635    }
     636
     637    {
     638        psDB            *dbh;
     639
     640        dbh = psDBInit("localhost", "test", NULL, "test");
     641        if (!dbh) {
     642            exit(EXIT_FAILURE);
     643        }
     644
    600645        if (!magicRunDropTable(dbh)) {
    601646            exit(EXIT_FAILURE);
     
    659704
    660705        if (!magicMaskDropTable(dbh)) {
     706            exit(EXIT_FAILURE);
     707        }
     708
     709        psDBCleanup(dbh);
     710    }
     711
     712    {
     713        psDB            *dbh;
     714
     715        dbh = psDBInit("localhost", "test", NULL, "test");
     716        if (!dbh) {
     717            exit(EXIT_FAILURE);
     718        }
     719
     720        if (!magicSkyfileMaskDropTable(dbh)) {
    661721            exit(EXIT_FAILURE);
    662722        }
  • trunk/ippdb/tests/insert.c

    r15003 r15343  
    1313        }
    1414
     15        if (!pzDataStoreInsert(dbh, "a string", "a string", "a string")) {
     16            exit(EXIT_FAILURE);
     17        }
     18
     19        psDBCleanup(dbh);
     20    }
     21
     22    {
     23        psDB            *dbh;
     24
     25        dbh = psDBInit("localhost", "test", NULL, "test");
     26        if (!dbh) {
     27            exit(EXIT_FAILURE);
     28        }
     29
    1530        if (!summitExpInsert(dbh, "a string", "a string", "a string", "0001-01-01T00:00:00Z", "a string", "a string", -32)) {
    1631            exit(EXIT_FAILURE);
     
    598613        }
    599614
     615        if (!detCorrectedExpInsert(dbh, -64, -64, "a string", -64, "a string", "a string", "a string", -16)) {
     616            exit(EXIT_FAILURE);
     617        }
     618
     619        psDBCleanup(dbh);
     620    }
     621
     622    {
     623        psDB            *dbh;
     624
     625        dbh = psDBInit("localhost", "test", NULL, "test");
     626        if (!dbh) {
     627            exit(EXIT_FAILURE);
     628        }
     629
     630        if (!detCorrectedImfileInsert(dbh, -64, -64, "a string", "a string", "a string", -16)) {
     631            exit(EXIT_FAILURE);
     632        }
     633
     634        psDBCleanup(dbh);
     635    }
     636
     637    {
     638        psDB            *dbh;
     639
     640        dbh = psDBInit("localhost", "test", NULL, "test");
     641        if (!dbh) {
     642            exit(EXIT_FAILURE);
     643        }
     644
    600645        if (!magicRunInsert(dbh, -64, "a string", "a string", "a string", "a string", "a string", "0001-01-01T00:00:00Z")) {
    601646            exit(EXIT_FAILURE);
     
    659704
    660705        if (!magicMaskInsert(dbh, -64, "a string")) {
     706            exit(EXIT_FAILURE);
     707        }
     708
     709        psDBCleanup(dbh);
     710    }
     711
     712    {
     713        psDB            *dbh;
     714
     715        dbh = psDBInit("localhost", "test", NULL, "test");
     716        if (!dbh) {
     717            exit(EXIT_FAILURE);
     718        }
     719
     720        if (!magicSkyfileMaskInsert(dbh, -64, -64, "a string")) {
    661721            exit(EXIT_FAILURE);
    662722        }
  • trunk/ippdb/tests/insertfits.c

    r14598 r15343  
    2424        }
    2525
     26        if (!pzDataStoreInsertFits(dbh, fits)) {
     27            exit(EXIT_FAILURE);
     28        }
     29
     30        if (!psFitsClose(fits)) {
     31            exit(EXIT_FAILURE);
     32        }
     33
     34        psDBCleanup(dbh);
     35    }
     36
     37    {
     38        psDB            *dbh;
     39        psFits          *fits;
     40
     41        dbh = psDBInit("localhost", "test", NULL, "test");
     42        if (!dbh) {
     43            exit(EXIT_FAILURE);
     44        }
     45
     46        // open a temp
     47        fits = psFitsOpen(TMP_FILENAME, "r");
     48        if (!fits) {
     49            exit(EXIT_FAILURE);
     50        }
     51
    2652        if (!summitExpInsertFits(dbh, fits)) {
    2753            exit(EXIT_FAILURE);
     
    10381064        }
    10391065
     1066        if (!detCorrectedExpInsertFits(dbh, fits)) {
     1067            exit(EXIT_FAILURE);
     1068        }
     1069
     1070        if (!psFitsClose(fits)) {
     1071            exit(EXIT_FAILURE);
     1072        }
     1073
     1074        psDBCleanup(dbh);
     1075    }
     1076
     1077    {
     1078        psDB            *dbh;
     1079        psFits          *fits;
     1080
     1081        dbh = psDBInit("localhost", "test", NULL, "test");
     1082        if (!dbh) {
     1083            exit(EXIT_FAILURE);
     1084        }
     1085
     1086        // open a temp
     1087        fits = psFitsOpen(TMP_FILENAME, "r");
     1088        if (!fits) {
     1089            exit(EXIT_FAILURE);
     1090        }
     1091
     1092        if (!detCorrectedImfileInsertFits(dbh, fits)) {
     1093            exit(EXIT_FAILURE);
     1094        }
     1095
     1096        if (!psFitsClose(fits)) {
     1097            exit(EXIT_FAILURE);
     1098        }
     1099
     1100        psDBCleanup(dbh);
     1101    }
     1102
     1103    {
     1104        psDB            *dbh;
     1105        psFits          *fits;
     1106
     1107        dbh = psDBInit("localhost", "test", NULL, "test");
     1108        if (!dbh) {
     1109            exit(EXIT_FAILURE);
     1110        }
     1111
     1112        // open a temp
     1113        fits = psFitsOpen(TMP_FILENAME, "r");
     1114        if (!fits) {
     1115            exit(EXIT_FAILURE);
     1116        }
     1117
    10401118        if (!magicRunInsertFits(dbh, fits)) {
    10411119            exit(EXIT_FAILURE);
     
    11431221
    11441222        if (!magicMaskInsertFits(dbh, fits)) {
     1223            exit(EXIT_FAILURE);
     1224        }
     1225
     1226        if (!psFitsClose(fits)) {
     1227            exit(EXIT_FAILURE);
     1228        }
     1229
     1230        psDBCleanup(dbh);
     1231    }
     1232
     1233    {
     1234        psDB            *dbh;
     1235        psFits          *fits;
     1236
     1237        dbh = psDBInit("localhost", "test", NULL, "test");
     1238        if (!dbh) {
     1239            exit(EXIT_FAILURE);
     1240        }
     1241
     1242        // open a temp
     1243        fits = psFitsOpen(TMP_FILENAME, "r");
     1244        if (!fits) {
     1245            exit(EXIT_FAILURE);
     1246        }
     1247
     1248        if (!magicSkyfileMaskInsertFits(dbh, fits)) {
    11451249            exit(EXIT_FAILURE);
    11461250        }
  • trunk/ippdb/tests/insertobject.c

    r15003 r15343  
    77    {
    88        psDB            *dbh;
     9        pzDataStoreRow  *object;
     10
     11        dbh = psDBInit("localhost", "test", NULL, "test");
     12        if (!dbh) {
     13            exit(EXIT_FAILURE);
     14        }
     15
     16        object = pzDataStoreRowAlloc("a string", "a string", "a string");
     17        if (!object) {
     18            exit(EXIT_FAILURE);
     19        }
     20
     21        if (!pzDataStoreInsertObject(dbh, object)) {
     22            exit(EXIT_FAILURE);
     23        }
     24
     25        psFree(object);
     26        psDBCleanup(dbh);
     27    }
     28
     29    {
     30        psDB            *dbh;
    931        summitExpRow    *object;
    1032
     
    865887    {
    866888        psDB            *dbh;
     889        detCorrectedExpRow *object;
     890
     891        dbh = psDBInit("localhost", "test", NULL, "test");
     892        if (!dbh) {
     893            exit(EXIT_FAILURE);
     894        }
     895
     896        object = detCorrectedExpRowAlloc(-64, -64, "a string", -64, "a string", "a string", "a string", -16);
     897        if (!object) {
     898            exit(EXIT_FAILURE);
     899        }
     900
     901        if (!detCorrectedExpInsertObject(dbh, object)) {
     902            exit(EXIT_FAILURE);
     903        }
     904
     905        psFree(object);
     906        psDBCleanup(dbh);
     907    }
     908
     909    {
     910        psDB            *dbh;
     911        detCorrectedImfileRow *object;
     912
     913        dbh = psDBInit("localhost", "test", NULL, "test");
     914        if (!dbh) {
     915            exit(EXIT_FAILURE);
     916        }
     917
     918        object = detCorrectedImfileRowAlloc(-64, -64, "a string", "a string", "a string", -16);
     919        if (!object) {
     920            exit(EXIT_FAILURE);
     921        }
     922
     923        if (!detCorrectedImfileInsertObject(dbh, object)) {
     924            exit(EXIT_FAILURE);
     925        }
     926
     927        psFree(object);
     928        psDBCleanup(dbh);
     929    }
     930
     931    {
     932        psDB            *dbh;
    867933        magicRunRow     *object;
    868934
     
    9661032
    9671033        if (!magicMaskInsertObject(dbh, object)) {
     1034            exit(EXIT_FAILURE);
     1035        }
     1036
     1037        psFree(object);
     1038        psDBCleanup(dbh);
     1039    }
     1040
     1041    {
     1042        psDB            *dbh;
     1043        magicSkyfileMaskRow *object;
     1044
     1045        dbh = psDBInit("localhost", "test", NULL, "test");
     1046        if (!dbh) {
     1047            exit(EXIT_FAILURE);
     1048        }
     1049
     1050        object = magicSkyfileMaskRowAlloc(-64, -64, "a string");
     1051        if (!object) {
     1052            exit(EXIT_FAILURE);
     1053        }
     1054
     1055        if (!magicSkyfileMaskInsertObject(dbh, object)) {
    9681056            exit(EXIT_FAILURE);
    9691057        }
  • trunk/ippdb/tests/metadatafromobject.c

    r15003 r15343  
    1010    {
    1111        psMetadata      *md;
     12        pzDataStoreRow  *object;
     13        bool            status;
     14
     15        object = pzDataStoreRowAlloc("a string", "a string", "a string");
     16        if (!object) {
     17            exit(EXIT_FAILURE);
     18        }
     19
     20        md = pzDataStoreMetadataFromObject(object);
     21        if (!md) {
     22            exit(EXIT_FAILURE);
     23        }
     24
     25        psFree(object);
     26
     27        if (strncmp(psMetadataLookupPtr(&status, md, "camera"), "a string", MAX_STRING_LENGTH)) {
     28            psFree(md);
     29            exit(EXIT_FAILURE);
     30        }
     31        if (strncmp(psMetadataLookupPtr(&status, md, "telescope"), "a string", MAX_STRING_LENGTH)) {
     32            psFree(md);
     33            exit(EXIT_FAILURE);
     34        }
     35        if (strncmp(psMetadataLookupPtr(&status, md, "uri"), "a string", MAX_STRING_LENGTH)) {
     36            psFree(md);
     37            exit(EXIT_FAILURE);
     38        }
     39
     40        psFree(md);
     41    }
     42
     43    {
     44        psMetadata      *md;
    1245        summitExpRow    *object;
    1346        bool            status;
     
    24022435    {
    24032436        psMetadata      *md;
     2437        detCorrectedExpRow *object;
     2438        bool            status;
     2439
     2440        object = detCorrectedExpRowAlloc(-64, -64, "a string", -64, "a string", "a string", "a string", -16);
     2441        if (!object) {
     2442            exit(EXIT_FAILURE);
     2443        }
     2444
     2445        md = detCorrectedExpMetadataFromObject(object);
     2446        if (!md) {
     2447            exit(EXIT_FAILURE);
     2448        }
     2449
     2450        psFree(object);
     2451
     2452            psFree(md);
     2453            exit(EXIT_FAILURE);
     2454        }
     2455            psFree(md);
     2456            exit(EXIT_FAILURE);
     2457        }
     2458        if (strncmp(psMetadataLookupPtr(&status, md, "uri"), "a string", MAX_STRING_LENGTH)) {
     2459            psFree(md);
     2460            exit(EXIT_FAILURE);
     2461        }
     2462            psFree(md);
     2463            exit(EXIT_FAILURE);
     2464        }
     2465        if (strncmp(psMetadataLookupPtr(&status, md, "corr_type"), "a string", MAX_STRING_LENGTH)) {
     2466            psFree(md);
     2467            exit(EXIT_FAILURE);
     2468        }
     2469        if (strncmp(psMetadataLookupPtr(&status, md, "recipe"), "a string", MAX_STRING_LENGTH)) {
     2470            psFree(md);
     2471            exit(EXIT_FAILURE);
     2472        }
     2473        if (strncmp(psMetadataLookupPtr(&status, md, "path_base"), "a string", MAX_STRING_LENGTH)) {
     2474            psFree(md);
     2475            exit(EXIT_FAILURE);
     2476        }
     2477            psFree(md);
     2478            exit(EXIT_FAILURE);
     2479        }
     2480
     2481        psFree(md);
     2482    }
     2483
     2484    {
     2485        psMetadata      *md;
     2486        detCorrectedImfileRow *object;
     2487        bool            status;
     2488
     2489        object = detCorrectedImfileRowAlloc(-64, -64, "a string", "a string", "a string", -16);
     2490        if (!object) {
     2491            exit(EXIT_FAILURE);
     2492        }
     2493
     2494        md = detCorrectedImfileMetadataFromObject(object);
     2495        if (!md) {
     2496            exit(EXIT_FAILURE);
     2497        }
     2498
     2499        psFree(object);
     2500
     2501            psFree(md);
     2502            exit(EXIT_FAILURE);
     2503        }
     2504            psFree(md);
     2505            exit(EXIT_FAILURE);
     2506        }
     2507        if (strncmp(psMetadataLookupPtr(&status, md, "class_id"), "a string", MAX_STRING_LENGTH)) {
     2508            psFree(md);
     2509            exit(EXIT_FAILURE);
     2510        }
     2511        if (strncmp(psMetadataLookupPtr(&status, md, "uri"), "a string", MAX_STRING_LENGTH)) {
     2512            psFree(md);
     2513            exit(EXIT_FAILURE);
     2514        }
     2515        if (strncmp(psMetadataLookupPtr(&status, md, "path_base"), "a string", MAX_STRING_LENGTH)) {
     2516            psFree(md);
     2517            exit(EXIT_FAILURE);
     2518        }
     2519            psFree(md);
     2520            exit(EXIT_FAILURE);
     2521        }
     2522
     2523        psFree(md);
     2524    }
     2525
     2526    {
     2527        psMetadata      *md;
    24042528        magicRunRow     *object;
    24052529        bool            status;
     
    25592683        psFree(object);
    25602684
     2685            psFree(md);
     2686            exit(EXIT_FAILURE);
     2687        }
     2688        if (strncmp(psMetadataLookupPtr(&status, md, "uri"), "a string", MAX_STRING_LENGTH)) {
     2689            psFree(md);
     2690            exit(EXIT_FAILURE);
     2691        }
     2692
     2693        psFree(md);
     2694    }
     2695
     2696    {
     2697        psMetadata      *md;
     2698        magicSkyfileMaskRow *object;
     2699        bool            status;
     2700
     2701        object = magicSkyfileMaskRowAlloc(-64, -64, "a string");
     2702        if (!object) {
     2703            exit(EXIT_FAILURE);
     2704        }
     2705
     2706        md = magicSkyfileMaskMetadataFromObject(object);
     2707        if (!md) {
     2708            exit(EXIT_FAILURE);
     2709        }
     2710
     2711        psFree(object);
     2712
     2713            psFree(md);
     2714            exit(EXIT_FAILURE);
     2715        }
    25612716            psFree(md);
    25622717            exit(EXIT_FAILURE);
  • trunk/ippdb/tests/objectfrommetadata.c

    r15003 r15343  
    1010    {
    1111        psMetadata      *md;
     12        pzDataStoreRow  *object;
     13
     14        md = psMetadataAlloc();
     15        if (!psMetadataAddStr(md, PS_LIST_TAIL, "camera", 0, NULL, "a string")) {
     16            psFree(md);
     17            exit(EXIT_FAILURE);
     18        }
     19        if (!psMetadataAddStr(md, PS_LIST_TAIL, "telescope", 0, NULL, "a string")) {
     20            psFree(md);
     21            exit(EXIT_FAILURE);
     22        }
     23        if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, "a string")) {
     24            psFree(md);
     25            exit(EXIT_FAILURE);
     26        }
     27
     28        object = pzDataStoreObjectFromMetadata(md);
     29        if (!object) {
     30            psFree(md);
     31            exit(EXIT_FAILURE);
     32        }
     33
     34        psFree(md);
     35
     36        if (strncmp(object->camera, "a string", MAX_STRING_LENGTH)) {
     37            psFree(object);
     38            exit(EXIT_FAILURE);
     39        }
     40        if (strncmp(object->telescope, "a string", MAX_STRING_LENGTH)) {
     41            psFree(object);
     42            exit(EXIT_FAILURE);
     43        }
     44        if (strncmp(object->uri, "a string", MAX_STRING_LENGTH)) {
     45            psFree(object);
     46            exit(EXIT_FAILURE);
     47        }
     48
     49        psFree(object);
     50    }
     51
     52    {
     53        psMetadata      *md;
    1254        summitExpRow    *object;
    1355
     
    38583900    {
    38593901        psMetadata      *md;
     3902        detCorrectedExpRow *object;
     3903
     3904        md = psMetadataAlloc();
     3905            psFree(md);
     3906            exit(EXIT_FAILURE);
     3907        }
     3908            psFree(md);
     3909            exit(EXIT_FAILURE);
     3910        }
     3911        if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, "a string")) {
     3912            psFree(md);
     3913            exit(EXIT_FAILURE);
     3914        }
     3915            psFree(md);
     3916            exit(EXIT_FAILURE);
     3917        }
     3918        if (!psMetadataAddStr(md, PS_LIST_TAIL, "corr_type", 0, NULL, "a string")) {
     3919            psFree(md);
     3920            exit(EXIT_FAILURE);
     3921        }
     3922        if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, "a string")) {
     3923            psFree(md);
     3924            exit(EXIT_FAILURE);
     3925        }
     3926        if (!psMetadataAddStr(md, PS_LIST_TAIL, "path_base", 0, NULL, "a string")) {
     3927            psFree(md);
     3928            exit(EXIT_FAILURE);
     3929        }
     3930            psFree(md);
     3931            exit(EXIT_FAILURE);
     3932        }
     3933
     3934        object = detCorrectedExpObjectFromMetadata(md);
     3935        if (!object) {
     3936            psFree(md);
     3937            exit(EXIT_FAILURE);
     3938        }
     3939
     3940        psFree(md);
     3941
     3942            psFree(object);
     3943            exit(EXIT_FAILURE);
     3944        }
     3945            psFree(object);
     3946            exit(EXIT_FAILURE);
     3947        }
     3948        if (strncmp(object->uri, "a string", MAX_STRING_LENGTH)) {
     3949            psFree(object);
     3950            exit(EXIT_FAILURE);
     3951        }
     3952            psFree(object);
     3953            exit(EXIT_FAILURE);
     3954        }
     3955        if (strncmp(object->corr_type, "a string", MAX_STRING_LENGTH)) {
     3956            psFree(object);
     3957            exit(EXIT_FAILURE);
     3958        }
     3959        if (strncmp(object->recipe, "a string", MAX_STRING_LENGTH)) {
     3960            psFree(object);
     3961            exit(EXIT_FAILURE);
     3962        }
     3963        if (strncmp(object->path_base, "a string", MAX_STRING_LENGTH)) {
     3964            psFree(object);
     3965            exit(EXIT_FAILURE);
     3966        }
     3967            psFree(object);
     3968            exit(EXIT_FAILURE);
     3969        }
     3970
     3971        psFree(object);
     3972    }
     3973
     3974    {
     3975        psMetadata      *md;
     3976        detCorrectedImfileRow *object;
     3977
     3978        md = psMetadataAlloc();
     3979            psFree(md);
     3980            exit(EXIT_FAILURE);
     3981        }
     3982            psFree(md);
     3983            exit(EXIT_FAILURE);
     3984        }
     3985        if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, "a string")) {
     3986            psFree(md);
     3987            exit(EXIT_FAILURE);
     3988        }
     3989        if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, "a string")) {
     3990            psFree(md);
     3991            exit(EXIT_FAILURE);
     3992        }
     3993        if (!psMetadataAddStr(md, PS_LIST_TAIL, "path_base", 0, NULL, "a string")) {
     3994            psFree(md);
     3995            exit(EXIT_FAILURE);
     3996        }
     3997            psFree(md);
     3998            exit(EXIT_FAILURE);
     3999        }
     4000
     4001        object = detCorrectedImfileObjectFromMetadata(md);
     4002        if (!object) {
     4003            psFree(md);
     4004            exit(EXIT_FAILURE);
     4005        }
     4006
     4007        psFree(md);
     4008
     4009            psFree(object);
     4010            exit(EXIT_FAILURE);
     4011        }
     4012            psFree(object);
     4013            exit(EXIT_FAILURE);
     4014        }
     4015        if (strncmp(object->class_id, "a string", MAX_STRING_LENGTH)) {
     4016            psFree(object);
     4017            exit(EXIT_FAILURE);
     4018        }
     4019        if (strncmp(object->uri, "a string", MAX_STRING_LENGTH)) {
     4020            psFree(object);
     4021            exit(EXIT_FAILURE);
     4022        }
     4023        if (strncmp(object->path_base, "a string", MAX_STRING_LENGTH)) {
     4024            psFree(object);
     4025            exit(EXIT_FAILURE);
     4026        }
     4027            psFree(object);
     4028            exit(EXIT_FAILURE);
     4029        }
     4030
     4031        psFree(object);
     4032    }
     4033
     4034    {
     4035        psMetadata      *md;
    38604036        magicRunRow     *object;
    38614037
     
    40654241        psFree(md);
    40664242
     4243            psFree(object);
     4244            exit(EXIT_FAILURE);
     4245        }
     4246        if (strncmp(object->uri, "a string", MAX_STRING_LENGTH)) {
     4247            psFree(object);
     4248            exit(EXIT_FAILURE);
     4249        }
     4250
     4251        psFree(object);
     4252    }
     4253
     4254    {
     4255        psMetadata      *md;
     4256        magicSkyfileMaskRow *object;
     4257
     4258        md = psMetadataAlloc();
     4259            psFree(md);
     4260            exit(EXIT_FAILURE);
     4261        }
     4262            psFree(md);
     4263            exit(EXIT_FAILURE);
     4264        }
     4265        if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, "a string")) {
     4266            psFree(md);
     4267            exit(EXIT_FAILURE);
     4268        }
     4269
     4270        object = magicSkyfileMaskObjectFromMetadata(md);
     4271        if (!object) {
     4272            psFree(md);
     4273            exit(EXIT_FAILURE);
     4274        }
     4275
     4276        psFree(md);
     4277
     4278            psFree(object);
     4279            exit(EXIT_FAILURE);
     4280        }
    40674281            psFree(object);
    40684282            exit(EXIT_FAILURE);
  • trunk/ippdb/tests/selectrowsfits.c

    r14598 r15343  
    2121        }
    2222
     23        if (!pzDataStoreSelectRowsFits(dbh, fits, NULL, 1)) {
     24            exit(EXIT_FAILURE);
     25        }
     26
     27        psFree(fits);
     28        psDBCleanup(dbh);
     29    }
     30
     31    {
     32        psDB            *dbh;
     33        psFits          *fits;
     34
     35        dbh = psDBInit("localhost", "test", NULL, "test");
     36        if (!dbh) {
     37            exit(EXIT_FAILURE);
     38        }
     39
     40        fits = psFitsOpen(TMP_FILENAME, "w");
     41        if (!fits) {
     42            exit(EXIT_FAILURE);
     43        }
     44
    2345        if (!summitExpSelectRowsFits(dbh, fits, NULL, 1)) {
    2446            exit(EXIT_FAILURE);
     
    879901        }
    880902
     903        if (!detCorrectedExpSelectRowsFits(dbh, fits, NULL, 1)) {
     904            exit(EXIT_FAILURE);
     905        }
     906
     907        psFree(fits);
     908        psDBCleanup(dbh);
     909    }
     910
     911    {
     912        psDB            *dbh;
     913        psFits          *fits;
     914
     915        dbh = psDBInit("localhost", "test", NULL, "test");
     916        if (!dbh) {
     917            exit(EXIT_FAILURE);
     918        }
     919
     920        fits = psFitsOpen(TMP_FILENAME, "w");
     921        if (!fits) {
     922            exit(EXIT_FAILURE);
     923        }
     924
     925        if (!detCorrectedImfileSelectRowsFits(dbh, fits, NULL, 1)) {
     926            exit(EXIT_FAILURE);
     927        }
     928
     929        psFree(fits);
     930        psDBCleanup(dbh);
     931    }
     932
     933    {
     934        psDB            *dbh;
     935        psFits          *fits;
     936
     937        dbh = psDBInit("localhost", "test", NULL, "test");
     938        if (!dbh) {
     939            exit(EXIT_FAILURE);
     940        }
     941
     942        fits = psFitsOpen(TMP_FILENAME, "w");
     943        if (!fits) {
     944            exit(EXIT_FAILURE);
     945        }
     946
    881947        if (!magicRunSelectRowsFits(dbh, fits, NULL, 1)) {
    882948            exit(EXIT_FAILURE);
     
    9681034
    9691035        if (!magicMaskSelectRowsFits(dbh, fits, NULL, 1)) {
     1036            exit(EXIT_FAILURE);
     1037        }
     1038
     1039        psFree(fits);
     1040        psDBCleanup(dbh);
     1041    }
     1042
     1043    {
     1044        psDB            *dbh;
     1045        psFits          *fits;
     1046
     1047        dbh = psDBInit("localhost", "test", NULL, "test");
     1048        if (!dbh) {
     1049            exit(EXIT_FAILURE);
     1050        }
     1051
     1052        fits = psFitsOpen(TMP_FILENAME, "w");
     1053        if (!fits) {
     1054            exit(EXIT_FAILURE);
     1055        }
     1056
     1057        if (!magicSkyfileMaskSelectRowsFits(dbh, fits, NULL, 1)) {
    9701058            exit(EXIT_FAILURE);
    9711059        }
Note: See TracChangeset for help on using the changeset viewer.