IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 25, 2008, 1:14:07 PM (18 years ago)
Author:
jhoblitt
Message:

add warpMask table

File:
1 edited

Legend:

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

    r17142 r17144  
    5050#define WARPSKYCELLMAP_TABLE_NAME "warpSkyCellMap"
    5151#define WARPSKYFILE_TABLE_NAME "warpSkyfile"
     52#define WARPMASK_TABLE_NAME "warpMask"
    5253#define DIFFRUN_TABLE_NAME "diffRun"
    5354#define DIFFINPUTSKYFILE_TABLE_NAME "diffInputSkyfile"
     
    1092210923    return true;
    1092310924}
     10925static void warpMaskRowFree(warpMaskRow *object);
     10926
     10927warpMaskRow *warpMaskRowAlloc(const char *label)
     10928{
     10929    warpMaskRow     *_object;
     10930
     10931    _object = psAlloc(sizeof(warpMaskRow));
     10932    psMemSetDeallocator(_object, (psFreeFunc)warpMaskRowFree);
     10933
     10934    _object->label = psStringCopy(label);
     10935
     10936    return _object;
     10937}
     10938
     10939static void warpMaskRowFree(warpMaskRow *object)
     10940{
     10941    psFree(object->label);
     10942}
     10943
     10944bool warpMaskCreateTable(psDB *dbh)
     10945{
     10946    psMetadata *md = psMetadataAlloc();
     10947    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, "Primary Key", "64")) {
     10948        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     10949        psFree(md);
     10950        return false;
     10951    }
     10952
     10953    bool status = psDBCreateTable(dbh, WARPMASK_TABLE_NAME, md);
     10954
     10955    psFree(md);
     10956
     10957    return status;
     10958}
     10959
     10960bool warpMaskDropTable(psDB *dbh)
     10961{
     10962    return psDBDropTable(dbh, WARPMASK_TABLE_NAME);
     10963}
     10964
     10965bool warpMaskInsert(psDB * dbh, const char *label)
     10966{
     10967    psMetadata *md = psMetadataAlloc();
     10968    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, label)) {
     10969        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     10970        psFree(md);
     10971        return false;
     10972    }
     10973
     10974    bool status = psDBInsertOneRow(dbh, WARPMASK_TABLE_NAME, md);
     10975    psFree(md);
     10976
     10977    return status;
     10978}
     10979
     10980long long warpMaskDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     10981{
     10982    long long       deleted = 0;
     10983
     10984    long long count = psDBDeleteRows(dbh, WARPMASK_TABLE_NAME, where, limit);
     10985    if (count < 0) {
     10986        psError(PS_ERR_UNKNOWN, true, "failed to delete row from warpMask");
     10987        return count;
     10988
     10989        deleted += count;
     10990    }
     10991
     10992    return deleted;
     10993}
     10994bool warpMaskInsertObject(psDB *dbh, warpMaskRow *object)
     10995{
     10996    return warpMaskInsert(dbh, object->label);
     10997}
     10998
     10999bool warpMaskInsertObjects(psDB *dbh, psArray *objects)
     11000{
     11001    for (long i = 0; i < psArrayLength(objects); i++) {
     11002        if (!warpMaskInsertObject(dbh, objects->data[i])) {
     11003            return false;
     11004        }
     11005    }
     11006
     11007    return true;
     11008}
     11009
     11010bool warpMaskInsertFits(psDB *dbh, const psFits *fits)
     11011{
     11012    psArray         *rowSet;
     11013
     11014    // move to (the first?) extension named  WARPMASK_TABLE_NAME
     11015    if (!psFitsMoveExtName(fits, WARPMASK_TABLE_NAME)) {
     11016        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", WARPMASK_TABLE_NAME);
     11017        return false;
     11018    }
     11019
     11020    // check HDU type
     11021    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
     11022        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
     11023        return false;
     11024    }
     11025
     11026    // read fits table
     11027    rowSet = psFitsReadTable(fits);
     11028    if (!rowSet) {
     11029        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
     11030        psFree(rowSet);
     11031        return false;
     11032    }
     11033
     11034    if (!psDBInsertRows(dbh, WARPMASK_TABLE_NAME, rowSet)) {
     11035        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
     11036        psFree(rowSet);
     11037        return false;
     11038    }
     11039
     11040    psFree(rowSet);
     11041
     11042    return true;
     11043}
     11044
     11045bool warpMaskSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     11046{
     11047    psArray         *rowSet;
     11048
     11049    rowSet = psDBSelectRows(dbh, WARPMASK_TABLE_NAME, where, limit);
     11050    if (!rowSet) {
     11051        return false;
     11052    }
     11053
     11054    // output to fits
     11055    if (!psFitsWriteTable(fits, NULL, rowSet, WARPMASK_TABLE_NAME)) {
     11056        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
     11057        psFree(rowSet);
     11058        return false;
     11059    }
     11060
     11061    psFree(rowSet);
     11062
     11063    return true;
     11064}
     11065
     11066psMetadata *warpMaskMetadataFromObject(const warpMaskRow *object)
     11067{
     11068    psMetadata *md = psMetadataAlloc();
     11069    if (!psMetadataAdd(md, PS_LIST_TAIL, "label", PS_DATA_STRING, NULL, object->label)) {
     11070        psError(PS_ERR_UNKNOWN, false, "failed to add item label");
     11071        psFree(md);
     11072        return false;
     11073    }
     11074
     11075
     11076    return md;
     11077}
     11078
     11079warpMaskRow *warpMaskObjectFromMetadata(psMetadata *md)
     11080{
     11081
     11082bool status = false;
     11083    char* label = psMetadataLookupPtr(&status, md, "label");
     11084    if (!status) {
     11085        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item label");
     11086        return false;
     11087    }
     11088
     11089    return warpMaskRowAlloc(label);
     11090}
     11091psArray *warpMaskSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     11092{
     11093    psArray         *rowSet;
     11094    psArray         *returnSet;
     11095    psU64           i;
     11096
     11097    rowSet = psDBSelectRows(dbh, WARPMASK_TABLE_NAME, where, limit);
     11098    if (!rowSet) {
     11099        return NULL;
     11100    }
     11101
     11102    // convert psMetadata rows to row objects
     11103
     11104    returnSet = psArrayAllocEmpty(rowSet->n);
     11105
     11106    for (i = 0; i < rowSet->n; i++) {
     11107        warpMaskRow *object = warpMaskObjectFromMetadata(rowSet->data[i]);
     11108        if (!object) {
     11109            psFree(object);
     11110            psFree(returnSet);
     11111            psError(PS_ERR_UNKNOWN, false, "database error");
     11112            return NULL;
     11113        }
     11114        psArrayAdd(returnSet, 0, object);
     11115        psFree(object);
     11116    }
     11117
     11118    psFree(rowSet);
     11119
     11120    return returnSet;
     11121}
     11122bool warpMaskDeleteObject(psDB *dbh, const warpMaskRow *object)
     11123{
     11124    psMetadata *where = warpMaskMetadataFromObject(object);
     11125    long long count = psDBDeleteRows(dbh, WARPMASK_TABLE_NAME, where, 0);
     11126    psFree(where);
     11127    if (count < 0) {
     11128        psError(PS_ERR_UNKNOWN, true, "failed to delete row from warpMask");
     11129        return false;
     11130    }
     11131    if (count > 1) {
     11132        // XXX should this be a psAbort() instead?  It is possible that
     11133        // having an object match multiple rows was by design.
     11134        psError(PS_ERR_UNKNOWN, true, "warpMaskRow object matched more then one row.  Check your database schema");
     11135        return false;
     11136    }
     11137
     11138    return true;
     11139}
     11140long long warpMaskDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     11141{
     11142    long long       deleted = 0;
     11143
     11144    for (long long i = 0; i < objects->n; i++) {
     11145        warpMaskRow *object = objects->data[i];
     11146        psMetadata *where = warpMaskMetadataFromObject(object);
     11147        long long count = psDBDeleteRows(dbh, WARPMASK_TABLE_NAME, where, limit);
     11148        psFree(where);
     11149        if (count < 0) {
     11150            psError(PS_ERR_UNKNOWN, true, "failed to delete row from warpMask");
     11151            return count;
     11152        }
     11153
     11154        deleted += count;
     11155    }
     11156
     11157    return deleted;
     11158}
     11159bool warpMaskPrintObjects(FILE *stream, psArray *objects, bool mdcf)
     11160{
     11161    PS_ASSERT_PTR_NON_NULL(objects, false);
     11162
     11163    psMetadata *output = psMetadataAlloc();
     11164    for (long i = 0; i < psArrayLength(objects); i++) {
     11165        psMetadata *md = warpMaskMetadataFromObject(objects->data[i]);
     11166        if (!psMetadataAddMetadata(
     11167            output,
     11168            PS_LIST_TAIL,
     11169            WARPMASK_TABLE_NAME,
     11170            PS_META_DUPLICATE_OK,
     11171            NULL,
     11172            md
     11173        )) {
     11174            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
     11175            psFree(md);
     11176            psFree(output);
     11177            return false;
     11178        }
     11179        psFree(md);
     11180    }
     11181
     11182    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
     11183        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     11184        psFree(output);
     11185    }
     11186    psFree(output);
     11187
     11188    return true;
     11189}
     11190bool warpMaskPrintObject(FILE *stream, warpMaskRow *object, bool mdcf)
     11191{
     11192    PS_ASSERT_PTR_NON_NULL(object, false);
     11193
     11194    psMetadata *md = warpMaskMetadataFromObject(object);
     11195
     11196    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     11197        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     11198        psFree(md);
     11199    }
     11200
     11201    psFree(md);
     11202
     11203    return true;
     11204}
    1092411205static void diffRunRowFree(diffRunRow *object);
    1092511206
Note: See TracChangeset for help on using the changeset viewer.