IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Feb 14, 2007, 4:02:28 PM (19 years ago)
Author:
jhoblitt
Message:

VERSION 1.1.6

File:
1 edited

Legend:

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

    r11780 r11809  
    6666#define P4SKYCELLMAP_TABLE_NAME "p4SkyCellMap"
    6767#define P4SCFILE_TABLE_NAME "p4Scfile"
     68#define P5RUN_TABLE_NAME "p5Run"
     69#define P5INPUTSCFILE_TABLE_NAME "p5InputScfile"
     70#define P5DIFFSCFILE_TABLE_NAME "p5DiffScfile"
    6871#define MAX_STRING_LENGTH 1024
    6972
     
    1496014963    return true;
    1496114964}
     14965static void p5RunRowFree(p5RunRow *object);
     14966
     14967p5RunRow *p5RunRowAlloc(psS32 p5_id, const char *state, const char *workdir, psTime* registered)
     14968{
     14969    p5RunRow        *_object;
     14970
     14971    _object = psAlloc(sizeof(p5RunRow));
     14972    psMemSetDeallocator(_object, (psFreeFunc)p5RunRowFree);
     14973
     14974    _object->p5_id = p5_id;
     14975    _object->state = psStringCopy(state);
     14976    _object->workdir = psStringCopy(workdir);
     14977    _object->registered = psTimeCopy(registered);
     14978
     14979    return _object;
     14980}
     14981
     14982static void p5RunRowFree(p5RunRow *object)
     14983{
     14984    psFree(object->state);
     14985    psFree(object->workdir);
     14986    psFree(object->registered);
     14987}
     14988
     14989bool p5RunCreateTable(psDB *dbh)
     14990{
     14991    psMetadata *md = psMetadataAlloc();
     14992    if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, "Primary Key AUTO_INCREMENT", 0)) {
     14993        psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id");
     14994        psFree(md);
     14995        return false;
     14996    }
     14997    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, "Key", "64")) {
     14998        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
     14999        psFree(md);
     15000        return false;
     15001    }
     15002    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, "255")) {
     15003        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
     15004        psFree(md);
     15005        return false;
     15006    }
     15007    if (!psMetadataAdd(md, PS_LIST_TAIL, "registered", PS_DATA_TIME, NULL, NULL)) {
     15008        psError(PS_ERR_UNKNOWN, false, "failed to add item registered");
     15009        psFree(md);
     15010        return false;
     15011    }
     15012
     15013    bool status = psDBCreateTable(dbh, P5RUN_TABLE_NAME, md);
     15014
     15015    psFree(md);
     15016
     15017    return status;
     15018}
     15019
     15020bool p5RunDropTable(psDB *dbh)
     15021{
     15022    return psDBDropTable(dbh, P5RUN_TABLE_NAME);
     15023}
     15024
     15025bool p5RunInsert(psDB * dbh, psS32 p5_id, const char *state, const char *workdir, psTime* registered)
     15026{
     15027    psMetadata *md = psMetadataAlloc();
     15028    if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, NULL, p5_id)) {
     15029        psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id");
     15030        psFree(md);
     15031        return false;
     15032    }
     15033    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, state)) {
     15034        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
     15035        psFree(md);
     15036        return false;
     15037    }
     15038    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, workdir)) {
     15039        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
     15040        psFree(md);
     15041        return false;
     15042    }
     15043    if (!psMetadataAdd(md, PS_LIST_TAIL, "registered", PS_DATA_TIME, NULL, registered)) {
     15044        psError(PS_ERR_UNKNOWN, false, "failed to add item registered");
     15045        psFree(md);
     15046        return false;
     15047    }
     15048
     15049    bool status = psDBInsertOneRow(dbh, P5RUN_TABLE_NAME, md);
     15050    psFree(md);
     15051
     15052    return status;
     15053}
     15054
     15055long long p5RunDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     15056{
     15057    long long       deleted = 0;
     15058
     15059    long long count = psDBDeleteRows(dbh, P5RUN_TABLE_NAME, where, limit);
     15060    if (count < 0) {
     15061        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5Run");
     15062        return count;
     15063
     15064        deleted += count;
     15065    }
     15066
     15067    return deleted;
     15068}
     15069bool p5RunInsertObject(psDB *dbh, p5RunRow *object)
     15070{
     15071    return p5RunInsert(dbh, object->p5_id, object->state, object->workdir, object->registered);
     15072}
     15073
     15074bool p5RunInsertObjects(psDB *dbh, psArray *objects)
     15075{
     15076    for (long i = 0; i < psArrayLength(objects); i++) {
     15077        if (!p5RunInsertObject(dbh, objects->data[i])) {
     15078            return false;
     15079        }
     15080    }
     15081
     15082    return true;
     15083}
     15084
     15085bool p5RunInsertFits(psDB *dbh, const psFits *fits)
     15086{
     15087    psArray         *rowSet;
     15088
     15089    // move to (the first?) extension named  P5RUN_TABLE_NAME
     15090    if (!psFitsMoveExtName(fits, P5RUN_TABLE_NAME)) {
     15091        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P5RUN_TABLE_NAME);
     15092        return false;
     15093    }
     15094
     15095    // check HDU type
     15096    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
     15097        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
     15098        return false;
     15099    }
     15100
     15101    // read fits table
     15102    rowSet = psFitsReadTable(fits);
     15103    if (!rowSet) {
     15104        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
     15105        psFree(rowSet);
     15106        return false;
     15107    }
     15108
     15109    if (!psDBInsertRows(dbh, P5RUN_TABLE_NAME, rowSet)) {
     15110        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
     15111        psFree(rowSet);
     15112        return false;
     15113    }
     15114
     15115    psFree(rowSet);
     15116
     15117    return true;
     15118}
     15119
     15120bool p5RunSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     15121{
     15122    psArray         *rowSet;
     15123
     15124    rowSet = psDBSelectRows(dbh, P5RUN_TABLE_NAME, where, limit);
     15125    if (!rowSet) {
     15126        return false;
     15127    }
     15128
     15129    // output to fits
     15130    if (!psFitsWriteTable(fits, NULL, rowSet, P5RUN_TABLE_NAME)) {
     15131        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
     15132        psFree(rowSet);
     15133        return false;
     15134    }
     15135
     15136    psFree(rowSet);
     15137
     15138    return true;
     15139}
     15140
     15141psMetadata *p5RunMetadataFromObject(const p5RunRow *object)
     15142{
     15143    psMetadata *md = psMetadataAlloc();
     15144    if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, NULL, object->p5_id)) {
     15145        psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id");
     15146        psFree(md);
     15147        return false;
     15148    }
     15149    if (!psMetadataAdd(md, PS_LIST_TAIL, "state", PS_DATA_STRING, NULL, object->state)) {
     15150        psError(PS_ERR_UNKNOWN, false, "failed to add item state");
     15151        psFree(md);
     15152        return false;
     15153    }
     15154    if (!psMetadataAdd(md, PS_LIST_TAIL, "workdir", PS_DATA_STRING, NULL, object->workdir)) {
     15155        psError(PS_ERR_UNKNOWN, false, "failed to add item workdir");
     15156        psFree(md);
     15157        return false;
     15158    }
     15159    if (!psMetadataAdd(md, PS_LIST_TAIL, "registered", PS_DATA_TIME, NULL, object->registered)) {
     15160        psError(PS_ERR_UNKNOWN, false, "failed to add item registered");
     15161        psFree(md);
     15162        return false;
     15163    }
     15164
     15165
     15166    return md;
     15167}
     15168
     15169p5RunRow *p5RunObjectFromMetadata(psMetadata *md)
     15170{
     15171
     15172bool status = false;
     15173    psS32 p5_id = psMetadataLookupS32(&status, md, "p5_id");
     15174    if (!status) {
     15175        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p5_id");
     15176        return false;
     15177    }
     15178    char* state = psMetadataLookupPtr(&status, md, "state");
     15179    if (!status) {
     15180        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item state");
     15181        return false;
     15182    }
     15183    char* workdir = psMetadataLookupPtr(&status, md, "workdir");
     15184    if (!status) {
     15185        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item workdir");
     15186        return false;
     15187    }
     15188    psTime* registered = psMetadataLookupPtr(&status, md, "registered");
     15189    if (!status) {
     15190        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item registered");
     15191        return false;
     15192    }
     15193
     15194    return p5RunRowAlloc(p5_id, state, workdir, registered);
     15195}
     15196psArray *p5RunSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     15197{
     15198    psArray         *rowSet;
     15199    psArray         *returnSet;
     15200    psU64           i;
     15201
     15202    rowSet = psDBSelectRows(dbh, P5RUN_TABLE_NAME, where, limit);
     15203    if (!rowSet) {
     15204        return NULL;
     15205    }
     15206
     15207    // convert psMetadata rows to row objects
     15208
     15209    returnSet = psArrayAllocEmpty(rowSet->n);
     15210
     15211    for (i = 0; i < rowSet->n; i++) {
     15212        p5RunRow *object = p5RunObjectFromMetadata(rowSet->data[i]);
     15213        psArrayAdd(returnSet, 0, object);
     15214        psFree(object);
     15215    }
     15216
     15217    psFree(rowSet);
     15218
     15219    return returnSet;
     15220}
     15221bool p5RunDeleteObject(psDB *dbh, const p5RunRow *object)
     15222{
     15223    psMetadata *where = p5RunMetadataFromObject(object);
     15224    long long count = psDBDeleteRows(dbh, P5RUN_TABLE_NAME, where, 0);
     15225    psFree(where);
     15226    if (count < 0) {
     15227        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5Run");
     15228        return false;
     15229    }
     15230    if (count > 1) {
     15231        // XXX should this be a psAbort() instead?  It is possible that
     15232        // having an object match multiple rows was by design.
     15233        psError(PS_ERR_UNKNOWN, true, "p5RunRow object matched more then one row.  Check your database schema");
     15234        return false;
     15235    }
     15236
     15237    return true;
     15238}
     15239long long p5RunDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     15240{
     15241    long long       deleted = 0;
     15242
     15243    for (long long i = 0; i < objects->n; i++) {
     15244        p5RunRow *object = objects->data[i];
     15245        psMetadata *where = p5RunMetadataFromObject(object);
     15246        long long count = psDBDeleteRows(dbh, P5RUN_TABLE_NAME, where, limit);
     15247        psFree(where);
     15248        if (count < 0) {
     15249            psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5Run");
     15250            return count;
     15251        }
     15252
     15253        deleted += count;
     15254    }
     15255
     15256    return deleted;
     15257}
     15258bool p5RunPrintObjects(FILE *stream, psArray *objects, bool mdcf)
     15259{
     15260    PS_ASSERT_PTR_NON_NULL(objects, false);
     15261
     15262    psMetadata *output = psMetadataAlloc();
     15263    for (long i = 0; i < psArrayLength(objects); i++) {
     15264        psMetadata *md = p5RunMetadataFromObject(objects->data[i]);
     15265        if (!psMetadataAddMetadata(
     15266            output,
     15267            PS_LIST_TAIL,
     15268            P5RUN_TABLE_NAME,
     15269            PS_META_DUPLICATE_OK,
     15270            NULL,
     15271            md
     15272        )) {
     15273            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
     15274            psFree(md);
     15275            psFree(output);
     15276            return false;
     15277        }
     15278        psFree(md);
     15279    }
     15280
     15281    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
     15282        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     15283        psFree(output);
     15284    }
     15285    psFree(output);
     15286
     15287    return true;
     15288}
     15289bool p5RunPrintObject(FILE *stream, p5RunRow *object, bool mdcf)
     15290{
     15291    PS_ASSERT_PTR_NON_NULL(object, false);
     15292
     15293    psMetadata *md = p5RunMetadataFromObject(object);
     15294
     15295    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     15296        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     15297        psFree(md);
     15298    }
     15299
     15300    psFree(md);
     15301
     15302    return true;
     15303}
     15304static void p5InputScfileRowFree(p5InputScfileRow *object);
     15305
     15306p5InputScfileRow *p5InputScfileRowAlloc(psS32 p5_id, psS32 p4_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *kind, bool template)
     15307{
     15308    p5InputScfileRow *_object;
     15309
     15310    _object = psAlloc(sizeof(p5InputScfileRow));
     15311    psMemSetDeallocator(_object, (psFreeFunc)p5InputScfileRowFree);
     15312
     15313    _object->p5_id = p5_id;
     15314    _object->p4_id = p4_id;
     15315    _object->skycell_id = psStringCopy(skycell_id);
     15316    _object->tess_id = psStringCopy(tess_id);
     15317    _object->exp_tag = psStringCopy(exp_tag);
     15318    _object->p3_version = p3_version;
     15319    _object->kind = psStringCopy(kind);
     15320    _object->template = template;
     15321
     15322    return _object;
     15323}
     15324
     15325static void p5InputScfileRowFree(p5InputScfileRow *object)
     15326{
     15327    psFree(object->skycell_id);
     15328    psFree(object->tess_id);
     15329    psFree(object->exp_tag);
     15330    psFree(object->kind);
     15331}
     15332
     15333bool p5InputScfileCreateTable(psDB *dbh)
     15334{
     15335    psMetadata *md = psMetadataAlloc();
     15336    if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, "Primary Key", 0)) {
     15337        psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id");
     15338        psFree(md);
     15339        return false;
     15340    }
     15341    if (!psMetadataAdd(md, PS_LIST_TAIL, "p4_id", PS_DATA_S32, "Primary Key", 0)) {
     15342        psError(PS_ERR_UNKNOWN, false, "failed to add item p4_id");
     15343        psFree(md);
     15344        return false;
     15345    }
     15346    if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, "Primary Key", "64")) {
     15347        psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");
     15348        psFree(md);
     15349        return false;
     15350    }
     15351    if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, "Primary Key", "64")) {
     15352        psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");
     15353        psFree(md);
     15354        return false;
     15355    }
     15356    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, "Primary Key", "64")) {
     15357        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     15358        psFree(md);
     15359        return false;
     15360    }
     15361    if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, "Primary Key", 0)) {
     15362        psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version");
     15363        psFree(md);
     15364        return false;
     15365    }
     15366    if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, "Key", "64")) {
     15367        psError(PS_ERR_UNKNOWN, false, "failed to add item kind");
     15368        psFree(md);
     15369        return false;
     15370    }
     15371    if (!psMetadataAdd(md, PS_LIST_TAIL, "template", PS_DATA_BOOL, NULL, 0)) {
     15372        psError(PS_ERR_UNKNOWN, false, "failed to add item template");
     15373        psFree(md);
     15374        return false;
     15375    }
     15376
     15377    bool status = psDBCreateTable(dbh, P5INPUTSCFILE_TABLE_NAME, md);
     15378
     15379    psFree(md);
     15380
     15381    return status;
     15382}
     15383
     15384bool p5InputScfileDropTable(psDB *dbh)
     15385{
     15386    return psDBDropTable(dbh, P5INPUTSCFILE_TABLE_NAME);
     15387}
     15388
     15389bool p5InputScfileInsert(psDB * dbh, psS32 p5_id, psS32 p4_id, const char *skycell_id, const char *tess_id, const char *exp_tag, psS32 p3_version, const char *kind, bool template)
     15390{
     15391    psMetadata *md = psMetadataAlloc();
     15392    if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, NULL, p5_id)) {
     15393        psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id");
     15394        psFree(md);
     15395        return false;
     15396    }
     15397    if (!psMetadataAdd(md, PS_LIST_TAIL, "p4_id", PS_DATA_S32, NULL, p4_id)) {
     15398        psError(PS_ERR_UNKNOWN, false, "failed to add item p4_id");
     15399        psFree(md);
     15400        return false;
     15401    }
     15402    if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, skycell_id)) {
     15403        psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");
     15404        psFree(md);
     15405        return false;
     15406    }
     15407    if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, tess_id)) {
     15408        psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");
     15409        psFree(md);
     15410        return false;
     15411    }
     15412    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, exp_tag)) {
     15413        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     15414        psFree(md);
     15415        return false;
     15416    }
     15417    if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, NULL, p3_version)) {
     15418        psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version");
     15419        psFree(md);
     15420        return false;
     15421    }
     15422    if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, NULL, kind)) {
     15423        psError(PS_ERR_UNKNOWN, false, "failed to add item kind");
     15424        psFree(md);
     15425        return false;
     15426    }
     15427    if (!psMetadataAdd(md, PS_LIST_TAIL, "template", PS_DATA_BOOL, NULL, template)) {
     15428        psError(PS_ERR_UNKNOWN, false, "failed to add item template");
     15429        psFree(md);
     15430        return false;
     15431    }
     15432
     15433    bool status = psDBInsertOneRow(dbh, P5INPUTSCFILE_TABLE_NAME, md);
     15434    psFree(md);
     15435
     15436    return status;
     15437}
     15438
     15439long long p5InputScfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     15440{
     15441    long long       deleted = 0;
     15442
     15443    long long count = psDBDeleteRows(dbh, P5INPUTSCFILE_TABLE_NAME, where, limit);
     15444    if (count < 0) {
     15445        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5InputScfile");
     15446        return count;
     15447
     15448        deleted += count;
     15449    }
     15450
     15451    return deleted;
     15452}
     15453bool p5InputScfileInsertObject(psDB *dbh, p5InputScfileRow *object)
     15454{
     15455    return p5InputScfileInsert(dbh, object->p5_id, object->p4_id, object->skycell_id, object->tess_id, object->exp_tag, object->p3_version, object->kind, object->template);
     15456}
     15457
     15458bool p5InputScfileInsertObjects(psDB *dbh, psArray *objects)
     15459{
     15460    for (long i = 0; i < psArrayLength(objects); i++) {
     15461        if (!p5InputScfileInsertObject(dbh, objects->data[i])) {
     15462            return false;
     15463        }
     15464    }
     15465
     15466    return true;
     15467}
     15468
     15469bool p5InputScfileInsertFits(psDB *dbh, const psFits *fits)
     15470{
     15471    psArray         *rowSet;
     15472
     15473    // move to (the first?) extension named  P5INPUTSCFILE_TABLE_NAME
     15474    if (!psFitsMoveExtName(fits, P5INPUTSCFILE_TABLE_NAME)) {
     15475        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P5INPUTSCFILE_TABLE_NAME);
     15476        return false;
     15477    }
     15478
     15479    // check HDU type
     15480    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
     15481        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
     15482        return false;
     15483    }
     15484
     15485    // read fits table
     15486    rowSet = psFitsReadTable(fits);
     15487    if (!rowSet) {
     15488        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
     15489        psFree(rowSet);
     15490        return false;
     15491    }
     15492
     15493    if (!psDBInsertRows(dbh, P5INPUTSCFILE_TABLE_NAME, rowSet)) {
     15494        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
     15495        psFree(rowSet);
     15496        return false;
     15497    }
     15498
     15499    psFree(rowSet);
     15500
     15501    return true;
     15502}
     15503
     15504bool p5InputScfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     15505{
     15506    psArray         *rowSet;
     15507
     15508    rowSet = psDBSelectRows(dbh, P5INPUTSCFILE_TABLE_NAME, where, limit);
     15509    if (!rowSet) {
     15510        return false;
     15511    }
     15512
     15513    // output to fits
     15514    if (!psFitsWriteTable(fits, NULL, rowSet, P5INPUTSCFILE_TABLE_NAME)) {
     15515        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
     15516        psFree(rowSet);
     15517        return false;
     15518    }
     15519
     15520    psFree(rowSet);
     15521
     15522    return true;
     15523}
     15524
     15525psMetadata *p5InputScfileMetadataFromObject(const p5InputScfileRow *object)
     15526{
     15527    psMetadata *md = psMetadataAlloc();
     15528    if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, NULL, object->p5_id)) {
     15529        psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id");
     15530        psFree(md);
     15531        return false;
     15532    }
     15533    if (!psMetadataAdd(md, PS_LIST_TAIL, "p4_id", PS_DATA_S32, NULL, object->p4_id)) {
     15534        psError(PS_ERR_UNKNOWN, false, "failed to add item p4_id");
     15535        psFree(md);
     15536        return false;
     15537    }
     15538    if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, object->skycell_id)) {
     15539        psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");
     15540        psFree(md);
     15541        return false;
     15542    }
     15543    if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, object->tess_id)) {
     15544        psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");
     15545        psFree(md);
     15546        return false;
     15547    }
     15548    if (!psMetadataAdd(md, PS_LIST_TAIL, "exp_tag", PS_DATA_STRING, NULL, object->exp_tag)) {
     15549        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_tag");
     15550        psFree(md);
     15551        return false;
     15552    }
     15553    if (!psMetadataAdd(md, PS_LIST_TAIL, "p3_version", PS_DATA_S32, NULL, object->p3_version)) {
     15554        psError(PS_ERR_UNKNOWN, false, "failed to add item p3_version");
     15555        psFree(md);
     15556        return false;
     15557    }
     15558    if (!psMetadataAdd(md, PS_LIST_TAIL, "kind", PS_DATA_STRING, NULL, object->kind)) {
     15559        psError(PS_ERR_UNKNOWN, false, "failed to add item kind");
     15560        psFree(md);
     15561        return false;
     15562    }
     15563    if (!psMetadataAdd(md, PS_LIST_TAIL, "template", PS_DATA_BOOL, NULL, object->template)) {
     15564        psError(PS_ERR_UNKNOWN, false, "failed to add item template");
     15565        psFree(md);
     15566        return false;
     15567    }
     15568
     15569
     15570    return md;
     15571}
     15572
     15573p5InputScfileRow *p5InputScfileObjectFromMetadata(psMetadata *md)
     15574{
     15575
     15576bool status = false;
     15577    psS32 p5_id = psMetadataLookupS32(&status, md, "p5_id");
     15578    if (!status) {
     15579        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p5_id");
     15580        return false;
     15581    }
     15582    psS32 p4_id = psMetadataLookupS32(&status, md, "p4_id");
     15583    if (!status) {
     15584        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p4_id");
     15585        return false;
     15586    }
     15587    char* skycell_id = psMetadataLookupPtr(&status, md, "skycell_id");
     15588    if (!status) {
     15589        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item skycell_id");
     15590        return false;
     15591    }
     15592    char* tess_id = psMetadataLookupPtr(&status, md, "tess_id");
     15593    if (!status) {
     15594        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item tess_id");
     15595        return false;
     15596    }
     15597    char* exp_tag = psMetadataLookupPtr(&status, md, "exp_tag");
     15598    if (!status) {
     15599        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item exp_tag");
     15600        return false;
     15601    }
     15602    psS32 p3_version = psMetadataLookupS32(&status, md, "p3_version");
     15603    if (!status) {
     15604        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p3_version");
     15605        return false;
     15606    }
     15607    char* kind = psMetadataLookupPtr(&status, md, "kind");
     15608    if (!status) {
     15609        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item kind");
     15610        return false;
     15611    }
     15612    bool template = psMetadataLookupBool(&status, md, "template");
     15613    if (!status) {
     15614        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item template");
     15615        return false;
     15616    }
     15617
     15618    return p5InputScfileRowAlloc(p5_id, p4_id, skycell_id, tess_id, exp_tag, p3_version, kind, template);
     15619}
     15620psArray *p5InputScfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     15621{
     15622    psArray         *rowSet;
     15623    psArray         *returnSet;
     15624    psU64           i;
     15625
     15626    rowSet = psDBSelectRows(dbh, P5INPUTSCFILE_TABLE_NAME, where, limit);
     15627    if (!rowSet) {
     15628        return NULL;
     15629    }
     15630
     15631    // convert psMetadata rows to row objects
     15632
     15633    returnSet = psArrayAllocEmpty(rowSet->n);
     15634
     15635    for (i = 0; i < rowSet->n; i++) {
     15636        p5InputScfileRow *object = p5InputScfileObjectFromMetadata(rowSet->data[i]);
     15637        psArrayAdd(returnSet, 0, object);
     15638        psFree(object);
     15639    }
     15640
     15641    psFree(rowSet);
     15642
     15643    return returnSet;
     15644}
     15645bool p5InputScfileDeleteObject(psDB *dbh, const p5InputScfileRow *object)
     15646{
     15647    psMetadata *where = p5InputScfileMetadataFromObject(object);
     15648    long long count = psDBDeleteRows(dbh, P5INPUTSCFILE_TABLE_NAME, where, 0);
     15649    psFree(where);
     15650    if (count < 0) {
     15651        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5InputScfile");
     15652        return false;
     15653    }
     15654    if (count > 1) {
     15655        // XXX should this be a psAbort() instead?  It is possible that
     15656        // having an object match multiple rows was by design.
     15657        psError(PS_ERR_UNKNOWN, true, "p5InputScfileRow object matched more then one row.  Check your database schema");
     15658        return false;
     15659    }
     15660
     15661    return true;
     15662}
     15663long long p5InputScfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     15664{
     15665    long long       deleted = 0;
     15666
     15667    for (long long i = 0; i < objects->n; i++) {
     15668        p5InputScfileRow *object = objects->data[i];
     15669        psMetadata *where = p5InputScfileMetadataFromObject(object);
     15670        long long count = psDBDeleteRows(dbh, P5INPUTSCFILE_TABLE_NAME, where, limit);
     15671        psFree(where);
     15672        if (count < 0) {
     15673            psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5InputScfile");
     15674            return count;
     15675        }
     15676
     15677        deleted += count;
     15678    }
     15679
     15680    return deleted;
     15681}
     15682bool p5InputScfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
     15683{
     15684    PS_ASSERT_PTR_NON_NULL(objects, false);
     15685
     15686    psMetadata *output = psMetadataAlloc();
     15687    for (long i = 0; i < psArrayLength(objects); i++) {
     15688        psMetadata *md = p5InputScfileMetadataFromObject(objects->data[i]);
     15689        if (!psMetadataAddMetadata(
     15690            output,
     15691            PS_LIST_TAIL,
     15692            P5INPUTSCFILE_TABLE_NAME,
     15693            PS_META_DUPLICATE_OK,
     15694            NULL,
     15695            md
     15696        )) {
     15697            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
     15698            psFree(md);
     15699            psFree(output);
     15700            return false;
     15701        }
     15702        psFree(md);
     15703    }
     15704
     15705    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
     15706        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     15707        psFree(output);
     15708    }
     15709    psFree(output);
     15710
     15711    return true;
     15712}
     15713bool p5InputScfilePrintObject(FILE *stream, p5InputScfileRow *object, bool mdcf)
     15714{
     15715    PS_ASSERT_PTR_NON_NULL(object, false);
     15716
     15717    psMetadata *md = p5InputScfileMetadataFromObject(object);
     15718
     15719    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     15720        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     15721        psFree(md);
     15722    }
     15723
     15724    psFree(md);
     15725
     15726    return true;
     15727}
     15728static void p5DiffScfileRowFree(p5DiffScfileRow *object);
     15729
     15730p5DiffScfileRow *p5DiffScfileRowAlloc(psS32 p5_id, const char *skycell_id, const char *tess_id, const char *uri, psF64 bg, psF64 bg_mean_stdev)
     15731{
     15732    p5DiffScfileRow *_object;
     15733
     15734    _object = psAlloc(sizeof(p5DiffScfileRow));
     15735    psMemSetDeallocator(_object, (psFreeFunc)p5DiffScfileRowFree);
     15736
     15737    _object->p5_id = p5_id;
     15738    _object->skycell_id = psStringCopy(skycell_id);
     15739    _object->tess_id = psStringCopy(tess_id);
     15740    _object->uri = psStringCopy(uri);
     15741    _object->bg = bg;
     15742    _object->bg_mean_stdev = bg_mean_stdev;
     15743
     15744    return _object;
     15745}
     15746
     15747static void p5DiffScfileRowFree(p5DiffScfileRow *object)
     15748{
     15749    psFree(object->skycell_id);
     15750    psFree(object->tess_id);
     15751    psFree(object->uri);
     15752}
     15753
     15754bool p5DiffScfileCreateTable(psDB *dbh)
     15755{
     15756    psMetadata *md = psMetadataAlloc();
     15757    if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, "Primary Key", 0)) {
     15758        psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id");
     15759        psFree(md);
     15760        return false;
     15761    }
     15762    if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, "Primary Key", "64")) {
     15763        psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");
     15764        psFree(md);
     15765        return false;
     15766    }
     15767    if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, "Primary Key", "64")) {
     15768        psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");
     15769        psFree(md);
     15770        return false;
     15771    }
     15772    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, "255")) {
     15773        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     15774        psFree(md);
     15775        return false;
     15776    }
     15777    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, 0.0)) {
     15778        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
     15779        psFree(md);
     15780        return false;
     15781    }
     15782    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, 0.0)) {
     15783        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
     15784        psFree(md);
     15785        return false;
     15786    }
     15787
     15788    bool status = psDBCreateTable(dbh, P5DIFFSCFILE_TABLE_NAME, md);
     15789
     15790    psFree(md);
     15791
     15792    return status;
     15793}
     15794
     15795bool p5DiffScfileDropTable(psDB *dbh)
     15796{
     15797    return psDBDropTable(dbh, P5DIFFSCFILE_TABLE_NAME);
     15798}
     15799
     15800bool p5DiffScfileInsert(psDB * dbh, psS32 p5_id, const char *skycell_id, const char *tess_id, const char *uri, psF64 bg, psF64 bg_mean_stdev)
     15801{
     15802    psMetadata *md = psMetadataAlloc();
     15803    if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, NULL, p5_id)) {
     15804        psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id");
     15805        psFree(md);
     15806        return false;
     15807    }
     15808    if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, skycell_id)) {
     15809        psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");
     15810        psFree(md);
     15811        return false;
     15812    }
     15813    if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, tess_id)) {
     15814        psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");
     15815        psFree(md);
     15816        return false;
     15817    }
     15818    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, uri)) {
     15819        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     15820        psFree(md);
     15821        return false;
     15822    }
     15823    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, bg)) {
     15824        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
     15825        psFree(md);
     15826        return false;
     15827    }
     15828    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, bg_mean_stdev)) {
     15829        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
     15830        psFree(md);
     15831        return false;
     15832    }
     15833
     15834    bool status = psDBInsertOneRow(dbh, P5DIFFSCFILE_TABLE_NAME, md);
     15835    psFree(md);
     15836
     15837    return status;
     15838}
     15839
     15840long long p5DiffScfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
     15841{
     15842    long long       deleted = 0;
     15843
     15844    long long count = psDBDeleteRows(dbh, P5DIFFSCFILE_TABLE_NAME, where, limit);
     15845    if (count < 0) {
     15846        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5DiffScfile");
     15847        return count;
     15848
     15849        deleted += count;
     15850    }
     15851
     15852    return deleted;
     15853}
     15854bool p5DiffScfileInsertObject(psDB *dbh, p5DiffScfileRow *object)
     15855{
     15856    return p5DiffScfileInsert(dbh, object->p5_id, object->skycell_id, object->tess_id, object->uri, object->bg, object->bg_mean_stdev);
     15857}
     15858
     15859bool p5DiffScfileInsertObjects(psDB *dbh, psArray *objects)
     15860{
     15861    for (long i = 0; i < psArrayLength(objects); i++) {
     15862        if (!p5DiffScfileInsertObject(dbh, objects->data[i])) {
     15863            return false;
     15864        }
     15865    }
     15866
     15867    return true;
     15868}
     15869
     15870bool p5DiffScfileInsertFits(psDB *dbh, const psFits *fits)
     15871{
     15872    psArray         *rowSet;
     15873
     15874    // move to (the first?) extension named  P5DIFFSCFILE_TABLE_NAME
     15875    if (!psFitsMoveExtName(fits, P5DIFFSCFILE_TABLE_NAME)) {
     15876        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P5DIFFSCFILE_TABLE_NAME);
     15877        return false;
     15878    }
     15879
     15880    // check HDU type
     15881    if (psFitsGetExtType(fits) != PS_FITS_TYPE_BINARY_TABLE)  {
     15882        psError(PS_ERR_UNKNOWN, true, "FITS HDU type is not PS_FITS_TYPE_BINARY_TABLE");
     15883        return false;
     15884    }
     15885
     15886    // read fits table
     15887    rowSet = psFitsReadTable(fits);
     15888    if (!rowSet) {
     15889        psError(PS_ERR_UNKNOWN, true, "FITS read error or FITS table is empty");
     15890        psFree(rowSet);
     15891        return false;
     15892    }
     15893
     15894    if (!psDBInsertRows(dbh, P5DIFFSCFILE_TABLE_NAME, rowSet)) {
     15895        psError(PS_ERR_UNKNOWN, false, "databse insert failed");
     15896        psFree(rowSet);
     15897        return false;
     15898    }
     15899
     15900    psFree(rowSet);
     15901
     15902    return true;
     15903}
     15904
     15905bool p5DiffScfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
     15906{
     15907    psArray         *rowSet;
     15908
     15909    rowSet = psDBSelectRows(dbh, P5DIFFSCFILE_TABLE_NAME, where, limit);
     15910    if (!rowSet) {
     15911        return false;
     15912    }
     15913
     15914    // output to fits
     15915    if (!psFitsWriteTable(fits, NULL, rowSet, P5DIFFSCFILE_TABLE_NAME)) {
     15916        psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
     15917        psFree(rowSet);
     15918        return false;
     15919    }
     15920
     15921    psFree(rowSet);
     15922
     15923    return true;
     15924}
     15925
     15926psMetadata *p5DiffScfileMetadataFromObject(const p5DiffScfileRow *object)
     15927{
     15928    psMetadata *md = psMetadataAlloc();
     15929    if (!psMetadataAdd(md, PS_LIST_TAIL, "p5_id", PS_DATA_S32, NULL, object->p5_id)) {
     15930        psError(PS_ERR_UNKNOWN, false, "failed to add item p5_id");
     15931        psFree(md);
     15932        return false;
     15933    }
     15934    if (!psMetadataAdd(md, PS_LIST_TAIL, "skycell_id", PS_DATA_STRING, NULL, object->skycell_id)) {
     15935        psError(PS_ERR_UNKNOWN, false, "failed to add item skycell_id");
     15936        psFree(md);
     15937        return false;
     15938    }
     15939    if (!psMetadataAdd(md, PS_LIST_TAIL, "tess_id", PS_DATA_STRING, NULL, object->tess_id)) {
     15940        psError(PS_ERR_UNKNOWN, false, "failed to add item tess_id");
     15941        psFree(md);
     15942        return false;
     15943    }
     15944    if (!psMetadataAdd(md, PS_LIST_TAIL, "uri", PS_DATA_STRING, NULL, object->uri)) {
     15945        psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
     15946        psFree(md);
     15947        return false;
     15948    }
     15949    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg", PS_DATA_F64, NULL, object->bg)) {
     15950        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
     15951        psFree(md);
     15952        return false;
     15953    }
     15954    if (!psMetadataAdd(md, PS_LIST_TAIL, "bg_mean_stdev", PS_DATA_F64, NULL, object->bg_mean_stdev)) {
     15955        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
     15956        psFree(md);
     15957        return false;
     15958    }
     15959
     15960
     15961    return md;
     15962}
     15963
     15964p5DiffScfileRow *p5DiffScfileObjectFromMetadata(psMetadata *md)
     15965{
     15966
     15967bool status = false;
     15968    psS32 p5_id = psMetadataLookupS32(&status, md, "p5_id");
     15969    if (!status) {
     15970        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item p5_id");
     15971        return false;
     15972    }
     15973    char* skycell_id = psMetadataLookupPtr(&status, md, "skycell_id");
     15974    if (!status) {
     15975        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item skycell_id");
     15976        return false;
     15977    }
     15978    char* tess_id = psMetadataLookupPtr(&status, md, "tess_id");
     15979    if (!status) {
     15980        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item tess_id");
     15981        return false;
     15982    }
     15983    char* uri = psMetadataLookupPtr(&status, md, "uri");
     15984    if (!status) {
     15985        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item uri");
     15986        return false;
     15987    }
     15988    psF64 bg = psMetadataLookupF64(&status, md, "bg");
     15989    if (!status) {
     15990        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg");
     15991        return false;
     15992    }
     15993    psF64 bg_mean_stdev = psMetadataLookupF64(&status, md, "bg_mean_stdev");
     15994    if (!status) {
     15995        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_mean_stdev");
     15996        return false;
     15997    }
     15998
     15999    return p5DiffScfileRowAlloc(p5_id, skycell_id, tess_id, uri, bg, bg_mean_stdev);
     16000}
     16001psArray *p5DiffScfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
     16002{
     16003    psArray         *rowSet;
     16004    psArray         *returnSet;
     16005    psU64           i;
     16006
     16007    rowSet = psDBSelectRows(dbh, P5DIFFSCFILE_TABLE_NAME, where, limit);
     16008    if (!rowSet) {
     16009        return NULL;
     16010    }
     16011
     16012    // convert psMetadata rows to row objects
     16013
     16014    returnSet = psArrayAllocEmpty(rowSet->n);
     16015
     16016    for (i = 0; i < rowSet->n; i++) {
     16017        p5DiffScfileRow *object = p5DiffScfileObjectFromMetadata(rowSet->data[i]);
     16018        psArrayAdd(returnSet, 0, object);
     16019        psFree(object);
     16020    }
     16021
     16022    psFree(rowSet);
     16023
     16024    return returnSet;
     16025}
     16026bool p5DiffScfileDeleteObject(psDB *dbh, const p5DiffScfileRow *object)
     16027{
     16028    psMetadata *where = p5DiffScfileMetadataFromObject(object);
     16029    long long count = psDBDeleteRows(dbh, P5DIFFSCFILE_TABLE_NAME, where, 0);
     16030    psFree(where);
     16031    if (count < 0) {
     16032        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5DiffScfile");
     16033        return false;
     16034    }
     16035    if (count > 1) {
     16036        // XXX should this be a psAbort() instead?  It is possible that
     16037        // having an object match multiple rows was by design.
     16038        psError(PS_ERR_UNKNOWN, true, "p5DiffScfileRow object matched more then one row.  Check your database schema");
     16039        return false;
     16040    }
     16041
     16042    return true;
     16043}
     16044long long p5DiffScfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
     16045{
     16046    long long       deleted = 0;
     16047
     16048    for (long long i = 0; i < objects->n; i++) {
     16049        p5DiffScfileRow *object = objects->data[i];
     16050        psMetadata *where = p5DiffScfileMetadataFromObject(object);
     16051        long long count = psDBDeleteRows(dbh, P5DIFFSCFILE_TABLE_NAME, where, limit);
     16052        psFree(where);
     16053        if (count < 0) {
     16054            psError(PS_ERR_UNKNOWN, true, "failed to delete row from p5DiffScfile");
     16055            return count;
     16056        }
     16057
     16058        deleted += count;
     16059    }
     16060
     16061    return deleted;
     16062}
     16063bool p5DiffScfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
     16064{
     16065    PS_ASSERT_PTR_NON_NULL(objects, false);
     16066
     16067    psMetadata *output = psMetadataAlloc();
     16068    for (long i = 0; i < psArrayLength(objects); i++) {
     16069        psMetadata *md = p5DiffScfileMetadataFromObject(objects->data[i]);
     16070        if (!psMetadataAddMetadata(
     16071            output,
     16072            PS_LIST_TAIL,
     16073            P5DIFFSCFILE_TABLE_NAME,
     16074            PS_META_DUPLICATE_OK,
     16075            NULL,
     16076            md
     16077        )) {
     16078            psError(PS_ERR_UNKNOWN, false, "failed to add metadata");
     16079            psFree(md);
     16080            psFree(output);
     16081            return false;
     16082        }
     16083        psFree(md);
     16084    }
     16085
     16086    if (!ippdbPrintMetadataRaw(stream, output, mdcf)) {
     16087        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     16088        psFree(output);
     16089    }
     16090    psFree(output);
     16091
     16092    return true;
     16093}
     16094bool p5DiffScfilePrintObject(FILE *stream, p5DiffScfileRow *object, bool mdcf)
     16095{
     16096    PS_ASSERT_PTR_NON_NULL(object, false);
     16097
     16098    psMetadata *md = p5DiffScfileMetadataFromObject(object);
     16099
     16100    if (!ippdbPrintMetadataRaw(stream, md, mdcf)) {
     16101        psError(PS_ERR_UNKNOWN, false, "failed to print metadata");
     16102        psFree(md);
     16103    }
     16104
     16105    psFree(md);
     16106
     16107    return true;
     16108}
Note: See TracChangeset for help on using the changeset viewer.