IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Aug 15, 2006, 4:31:35 PM (20 years ago)
Author:
jhoblitt
Message:

VERSION 0.0.29

File:
1 edited

Legend:

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

    r8325 r8368  
    5656#define DETSTACKEDIMFILE_TABLE_NAME "detStackedImfile"
    5757#define DETSTACKEDIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
     58#define DETNORMALIZEDSTATIMFILE_TABLE_NAME "detNormalizedStatImfile"
     59#define DETNORMALIZEDSTATIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
    5860#define DETNORMALIZEDIMFILE_TABLE_NAME "detNormalizedImfile"
    5961#define DETNORMALIZEDIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
     
    1458314585    return true;
    1458414586}
     14587static void detNormalizedStatImfileRowFree(detNormalizedStatImfileRow *object);
     14588
     14589detNormalizedStatImfileRow *detNormalizedStatImfileRowAlloc(psS32 det_id, psS32 iteration, const char *class_id, psF32 norm)
     14590{
     14591    detNormalizedStatImfileRow *object;
     14592
     14593    object = psAlloc(sizeof(detNormalizedStatImfileRow));
     14594    psMemSetDeallocator(object, (psFreeFunc)detNormalizedStatImfileRowFree);
     14595
     14596    object->det_id = det_id;
     14597    object->iteration = iteration;
     14598    object->class_id = psStringCopy(class_id);
     14599    object->norm = norm;
     14600
     14601    return object;
     14602}
     14603
     14604static void detNormalizedStatImfileRowFree(detNormalizedStatImfileRow *object)
     14605{
     14606    psFree(object->class_id);
     14607}
     14608
     14609bool detNormalizedStatImfileCreateTable(psDB *dbh)
     14610{
     14611    psMetadata      *md;
     14612    bool            status;
     14613
     14614    md = psMetadataAlloc();
     14615    if (!psMetadataAdd(md, PS_LIST_TAIL, DETNORMALIZEDSTATIMFILE_INDEX_NAME, PS_DATA_S32, "AUTO_INCREMENT", 0.0)) {
     14616        psError(PS_ERR_UNKNOWN, false, "failed to add item %s", DETNORMALIZEDSTATIMFILE_INDEX_NAME);
     14617        psFree(md);
     14618        return false;
     14619    }
     14620    if (!psMetadataAddS32(md, PS_LIST_TAIL, "det_id", 0, "Primary Key", 0)) {
     14621        psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
     14622        psFree(md);
     14623        return false;
     14624    }
     14625    if (!psMetadataAddS32(md, PS_LIST_TAIL, "iteration", 0, "Primary Key", 0)) {
     14626        psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
     14627        psFree(md);
     14628        return false;
     14629    }
     14630    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, "Primary Key", "64")) {
     14631        psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
     14632        psFree(md);
     14633        return false;
     14634    }
     14635    if (!psMetadataAddF32(md, PS_LIST_TAIL, "norm", 0, NULL, 0.0)) {
     14636        psError(PS_ERR_UNKNOWN, false, "failed to add item norm");
     14637        psFree(md);
     14638        return false;
     14639    }
     14640
     14641    status = psDBCreateTable(dbh, DETNORMALIZEDSTATIMFILE_TABLE_NAME, md);
     14642
     14643    psFree(md);
     14644
     14645    return status;
     14646}
     14647
     14648bool detNormalizedStatImfileDropTable(psDB *dbh)
     14649{
     14650    return psDBDropTable(dbh, DETNORMALIZEDSTATIMFILE_TABLE_NAME);
     14651}
     14652
     14653bool detNormalizedStatImfileInsert(psDB * dbh, psS32 det_id, psS32 iteration, const char *class_id, psF32 norm)
     14654{
     14655    psMetadata      *md;
     14656    bool            status;
     14657
     14658    md = psMetadataAlloc();
     14659    if (!psMetadataAddS32(md, PS_LIST_TAIL, "det_id", 0, NULL, det_id)) {
     14660        psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
     14661        psFree(md);
     14662        return false;
     14663    }
     14664    if (!psMetadataAddS32(md, PS_LIST_TAIL, "iteration", 0, NULL, iteration)) {
     14665        psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
     14666        psFree(md);
     14667        return false;
     14668    }
     14669    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, class_id)) {
     14670        psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
     14671        psFree(md);
     14672        return false;
     14673    }
     14674    if (!psMetadataAddF32(md, PS_LIST_TAIL, "norm", 0, NULL, norm)) {
     14675        psError(PS_ERR_UNKNOWN, false, "failed to add item norm");
     14676        psFree(md);
     14677        return false;
     14678    }
     14679
     14680    status = psDBInsertOneRow(dbh, DETNORMALIZEDSTATIMFILE_TABLE_NAME, md);
     14681    psFree(md);
     14682
     14683    return status;
     14684}
     14685
     14686long long detNormalizedStatImfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     14687{
     14688    long long       deleted = 0;
     14689
     14690    long long count = psDBDeleteRows(dbh, DETNORMALIZEDSTATIMFILE_TABLE_NAME, where, limit);
     14691    if (count < 0) {
     14692        psError(PS_ERR_UNKNOWN, true, "failed to delete row from detNormalizedStatImfile");
     14693        return count;
     14694
     14695        deleted += count;
     14696    }
     14697
     14698    return deleted;
     14699}
     14700bool detNormalizedStatImfilePop(psDB *dbh, psS32 *det_id, psS32 *iteration, char **class_id, psF32 *norm)
     14701{
     14702    psArray         *rowSet;
     14703    psMetadata      *row;
     14704    psMetadata      *popped;
     14705    long            deleted;
     14706    bool            status;
     14707    int             rowID;
     14708
     14709    rowSet = psDBSelectRows(dbh, DETNORMALIZEDSTATIMFILE_TABLE_NAME, NULL, 1);
     14710    if (!rowSet) {
     14711        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item %s", DETNORMALIZEDSTATIMFILE_INDEX_NAME);
     14712        psFree(rowSet);
     14713        return NULL;
     14714    }
     14715
     14716    row = psArrayGet(rowSet, 0);
     14717    psMemIncrRefCounter(row);
     14718    if (!row) {
     14719        psError(PS_ERR_UNKNOWN, true, "database error or table is empty");
     14720        return NULL;
     14721    }
     14722    psFree(rowSet);
     14723
     14724    rowID = psMetadataLookupS32(&status, row, DETNORMALIZEDSTATIMFILE_INDEX_NAME);
     14725    if (!status) {
     14726        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item %s", DETNORMALIZEDSTATIMFILE_INDEX_NAME);
     14727        psFree(row);
     14728        return NULL;
     14729    }
     14730
     14731    popped = psMetadataAlloc();
     14732    psMetadataAddS32(popped, PS_LIST_TAIL, DETNORMALIZEDSTATIMFILE_INDEX_NAME, 0, NULL, rowID);
     14733
     14734    deleted = psDBDeleteRows(dbh, DETNORMALIZEDSTATIMFILE_TABLE_NAME, popped, 0);
     14735    if (deleted != 1) {
     14736        psError(PS_ERR_UNKNOWN, false, "database failed to delete row");
     14737        psFree(popped);
     14738        psFree(row);
     14739        return NULL;
     14740    }
     14741
     14742    psFree(popped);
     14743
     14744    *det_id = psMetadataLookupS32(&status, row, "det_id");
     14745    if (!status) {
     14746        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item det_id");
     14747        psFree(row);
     14748        return false;
     14749    }
     14750    *iteration = psMetadataLookupS32(&status, row, "iteration");
     14751    if (!status) {
     14752        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iteration");
     14753        psFree(row);
     14754        return false;
     14755    }
     14756    *class_id = psMetadataLookupPtr(&status, row, "class_id");
     14757    if (!status) {
     14758        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class_id");
     14759        psFree(row);
     14760        return false;
     14761    }
     14762    *norm = psMetadataLookupF32(&status, row, "norm");
     14763    if (!status) {
     14764        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item norm");
     14765        psFree(row);
     14766        return false;
     14767    }
     14768
     14769    psFree(row);
     14770
     14771    return true;
     14772}
     14773
     14774bool detNormalizedStatImfileInsertObject(psDB *dbh, detNormalizedStatImfileRow *object)
     14775{
     14776    return detNormalizedStatImfileInsert(dbh, object->det_id, object->iteration, object->class_id, object->norm);
     14777}
     14778
     14779bool detNormalizedStatImfileInsertObjects(psDB *dbh, psArray *objects)
     14780{
     14781    for (long i = 0; i < psArrayLength(objects); i++) {
     14782        if (!detNormalizedStatImfileInsertObject(dbh, objects->data[i])) {
     14783            return false;
     14784        }
     14785    }
     14786
     14787    return true;
     14788}
     14789
     14790detNormalizedStatImfileRow *detNormalizedStatImfilePopObject(psDB *dbh)
     14791{
     14792    psS32           det_id;
     14793    psS32           iteration;
     14794    char            class_id[256];
     14795    psF32           norm;
     14796
     14797    if (!detNormalizedStatImfilePop(dbh, &det_id, &iteration, (char **)&class_id, &norm)) {
     14798        psError(PS_ERR_UNKNOWN, false, "failed to pop a database row");
     14799        return NULL;
     14800    }
     14801
     14802    return detNormalizedStatImfileRowAlloc(det_id, iteration, class_id, norm);
     14803}
     14804
     14805bool detNormalizedStatImfileInsertFits(psDB *dbh, const psFits *fits)
     14806{
     14807    psArray         *rowSet;
     14808
     14809    // move to (the first?) extension named  DETNORMALIZEDSTATIMFILE_TABLE_NAME
     14810    if (!psFitsMoveExtName(fits, DETNORMALIZEDSTATIMFILE_TABLE_NAME)) {
     14811        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", DETNORMALIZEDSTATIMFILE_TABLE_NAME);
     14812        return false;
     14813    }
     14814
     14815    // check HDU type
     14816    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
     14817        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
     14818        return false;
     14819    }
     14820
     14821    // read fits table
     14822    rowSet = psFitsReadTable(fits);
     14823    if (!rowSet) {
     14824        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
     14825        psFree(rowSet);
     14826        return false;
     14827    }
     14828
     14829    if (!psDBInsertRows(dbh, DETNORMALIZEDSTATIMFILE_TABLE_NAME, rowSet)) {
     14830        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
     14831        psFree(rowSet);
     14832        return false;
     14833    }
     14834
     14835    psFree(rowSet);
     14836
     14837    return true;
     14838}
     14839
     14840bool detNormalizedStatImfilePopFits(psDB *dbh, psFits *fits, unsigned long long limit)
     14841{
     14842    char            query[MAX_STRING_LENGTH];
     14843
     14844    if (!detNormalizedStatImfileSelectRowsFits(dbh, fits, NULL, limit)) {
     14845        psError(PS_ERR_UNKNOWN, true, "database error or table is empty");
     14846        return false;
     14847    }
     14848
     14849    // remove limit rows from the end of the database
     14850    if (snprintf(query, MAX_STRING_LENGTH,
     14851                "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
     14852                DETNORMALIZEDSTATIMFILE_TABLE_NAME, DETNORMALIZEDSTATIMFILE_INDEX_NAME, limit) < 0) {
     14853        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
     14854        return false;
     14855    }
     14856           
     14857    if (!p_psDBRunQuery(dbh, query)) {
     14858        psError(PS_ERR_UNKNOWN, false, "database query failed");
     14859        return false;
     14860    }
     14861
     14862    return true;
     14863}
     14864
     14865bool detNormalizedStatImfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     14866{
     14867    psArray         *rowSet;
     14868    psU64           i;
     14869
     14870    rowSet = psDBSelectRows(dbh, DETNORMALIZEDSTATIMFILE_TABLE_NAME, where, limit);
     14871    if (!rowSet) {
     14872        return false;
     14873    }
     14874
     14875    // strip index column
     14876    for (i = 0; i < rowSet->n; i++) {
     14877        if (!psMetadataRemove((psMetadata *)rowSet->data[i], 0, DETNORMALIZEDSTATIMFILE_INDEX_NAME)) {
     14878            psError(PS_ERR_UNKNOWN, true, "failed to remove item %s", DETNORMALIZEDSTATIMFILE_INDEX_NAME);
     14879            psFree(rowSet);
     14880            return false;
     14881        }
     14882    }
     14883
     14884    // output to fits
     14885    if (!psFitsWriteTable(fits, NULL, rowSet, DETNORMALIZEDSTATIMFILE_TABLE_NAME)) {
     14886        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
     14887        psFree(rowSet);
     14888        return false;
     14889    }
     14890
     14891    psFree(rowSet);
     14892
     14893    return true;
     14894}
     14895
     14896psMetadata *detNormalizedStatImfileMetadataFromObject(const detNormalizedStatImfileRow *object)
     14897{
     14898    psMetadata      *md;
     14899
     14900    md = psMetadataAlloc();
     14901    if (!psMetadataAddS32(md, PS_LIST_TAIL, "det_id", 0, NULL, object->det_id)) {
     14902        psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
     14903        psFree(md);
     14904        return NULL;
     14905    }
     14906    if (!psMetadataAddS32(md, PS_LIST_TAIL, "iteration", 0, NULL, object->iteration)) {
     14907        psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
     14908        psFree(md);
     14909        return NULL;
     14910    }
     14911    if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, object->class_id)) {
     14912        psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
     14913        psFree(md);
     14914        return NULL;
     14915    }
     14916    if (!psMetadataAddF32(md, PS_LIST_TAIL, "norm", 0, NULL, object->norm)) {
     14917        psError(PS_ERR_UNKNOWN, false, "failed to add item norm");
     14918        psFree(md);
     14919        return NULL;
     14920    }
     14921
     14922    return md;
     14923}
     14924
     14925detNormalizedStatImfileRow *detNormalizedStatImfileObjectFromMetadata(psMetadata *md)
     14926{
     14927    bool            status;
     14928    psS32           det_id;
     14929    psS32           iteration;
     14930    char            *class_id;
     14931    psF32           norm;
     14932
     14933    det_id = psMetadataLookupS32(&status, md, "det_id");
     14934    if (!status) {
     14935        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item det_id");
     14936        return false;
     14937    }
     14938    iteration = psMetadataLookupS32(&status, md, "iteration");
     14939    if (!status) {
     14940        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item iteration");
     14941        return false;
     14942    }
     14943    class_id = psMetadataLookupPtr(&status, md, "class_id");
     14944    if (!status) {
     14945        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item class_id");
     14946        return false;
     14947    }
     14948    norm = psMetadataLookupF32(&status, md, "norm");
     14949    if (!status) {
     14950        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item norm");
     14951        return false;
     14952    }
     14953
     14954    return detNormalizedStatImfileRowAlloc(det_id, iteration, class_id, norm);
     14955}
     14956psArray *detNormalizedStatImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     14957{
     14958    psArray         *rowSet;
     14959    psArray         *returnSet;
     14960    psU64           i;
     14961
     14962    rowSet = psDBSelectRows(dbh, DETNORMALIZEDSTATIMFILE_TABLE_NAME, where, limit);
     14963    if (!rowSet) {
     14964        return NULL;
     14965    }
     14966
     14967    // strip index column
     14968    for (i = 0; i < rowSet->n; i++) {
     14969        if (!psMetadataRemove((psMetadata *)(rowSet->data[i]), 0, DETNORMALIZEDSTATIMFILE_INDEX_NAME)) {
     14970            psError(PS_ERR_UNKNOWN, true, "failed to remove item %s", DETNORMALIZEDSTATIMFILE_INDEX_NAME);
     14971            psFree(rowSet);
     14972            return false;
     14973        }
     14974    }
     14975
     14976    // convert psMetadata rows to row objects
     14977
     14978    returnSet = psArrayAlloc(rowSet->n);
     14979    returnSet->n = 0;
     14980
     14981    for (i = 0; i < rowSet->n; i++) {
     14982        detNormalizedStatImfileRow *object = detNormalizedStatImfileObjectFromMetadata(rowSet->data[i]);
     14983        psArrayAdd(returnSet, 0, object);
     14984        psFree(object);
     14985    }
     14986
     14987    psFree(rowSet);
     14988
     14989    return returnSet;
     14990}
     14991bool detNormalizedStatImfileDeleteObject(psDB *dbh, const detNormalizedStatImfileRow *object)
     14992{
     14993    psMetadata *where = detNormalizedStatImfileMetadataFromObject(object);
     14994    long long count = psDBDeleteRows(dbh, DETNORMALIZEDSTATIMFILE_TABLE_NAME, where, 0);
     14995    psFree(where)
     14996    if (count < 0) {
     14997        psError(PS_ERR_UNKNOWN, true, "failed to delete row from detNormalizedStatImfile");
     14998        return false;
     14999    }
     15000    if (count > 1) {
     15001        // XXX should this be a psAbort() instead?  It is possible that
     15002        // having an object match multiple rows was by design.
     15003        psError(PS_ERR_UNKNOWN, true, "detNormalizedStatImfileRow object matched more then one row.  Check your database schema");
     15004        return false;
     15005    }
     15006
     15007    return true;
     15008}
     15009long long detNormalizedStatImfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     15010{
     15011    long long       deleted = 0;
     15012
     15013    for (long long i = 0; i < objects->n; i++) {
     15014        detNormalizedStatImfileRow *object = objects->data[i];
     15015        psMetadata *where = detNormalizedStatImfileMetadataFromObject(object);
     15016        long long count = psDBDeleteRows(dbh, DETNORMALIZEDSTATIMFILE_TABLE_NAME, where, limit);
     15017        psFree(where)
     15018        if (count < 0) {
     15019            psError(PS_ERR_UNKNOWN, true, "failed to delete row from detNormalizedStatImfile");
     15020            return count;
     15021        }
     15022
     15023        deleted += count;
     15024    }
     15025
     15026    return deleted;
     15027}
     15028bool detNormalizedStatImfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
     15029{
     15030    PS_ASSERT_PTR_NON_NULL(objects, false);
     15031
     15032    psMetadata *output = psMetadataAlloc();
     15033    for (long i = 0; i < psArrayLength(objects); i++) {
     15034        psMetadata *md = detNormalizedStatImfileMetadataFromObject(objects->data[i]);
     15035        if (!psMetadataAddMetadata(
     15036            output,
     15037            PS_LIST_TAIL,
     15038            DETNORMALIZEDSTATIMFILE_TABLE_NAME,
     15039            PS_META_DUPLICATE_OK,
     15040            NULL,
     15041            md
     15042        )) {
     15043            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
     15044            psFree(md);
     15045            psFree(output);
     15046            return false;
     15047        }
     15048        psFree(md);
     15049    }
     15050
     15051    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
     15052        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     15053        psFree(output);
     15054    }
     15055    psFree(output);
     15056
     15057    return true;
     15058}
    1458515059static void detNormalizedImfileRowFree(detNormalizedImfileRow *object);
    1458615060
Note: See TracChangeset for help on using the changeset viewer.