IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 6195 for trunk/psLib/src/types


Ignore:
Timestamp:
Jan 25, 2006, 2:46:54 PM (21 years ago)
Author:
drobbin
Message:

Fixed/updated MetadataCopy (bug579) (& tests). Now makes deeper copies of items.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/types/psMetadata.c

    r6189 r6195  
    1212 *  @author Ross Harman, MHPCC
    1313 *
    14  *  @version $Revision: 1.95 $ $Name: not supported by cvs2svn $
    15  *  @date $Date: 2006-01-25 03:02:47 $
     14 *  @version $Revision: 1.96 $ $Name: not supported by cvs2svn $
     15 *  @date $Date: 2006-01-26 00:46:54 $
    1616 *
    1717 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    324324        out = psMetadataAlloc();
    325325    }
    326     psMetadataItem *item = NULL;
     326    //    psMetadataItem *item = NULL;
    327327    psMetadataIterator *iter = NULL;
    328328    iter = psMetadataIteratorAlloc(*(psMetadata**)&in, PS_LIST_HEAD, NULL);
    329     item = psMetadataGetAndIncrement(iter);
    330     while (item != NULL) {
    331         psMetadataAddItem(out, item, PS_LIST_TAIL, 0);
     329    /*
    332330        item = psMetadataGetAndIncrement(iter);
    333     }
    334     psFree(item);
     331        while (item != NULL) {
     332            psMetadataAddItem(out, item, PS_LIST_TAIL, 0);
     333            item = psMetadataGetAndIncrement(iter);
     334        }
     335        psFree(item);
     336        psFree(iter);
     337        return out;
     338    */
     339    psMetadataItem *inItem = NULL;
     340    unsigned long numPointers = 0;      // Number of pointers we were forced to copy
     341    while ((inItem = psMetadataGetAndIncrement(iter))) {
     342        // Need to look for MULTI, which won't be picked up using the iterator.
     343        psMetadataItem *multiCheckItem = psMetadataLookup(in, inItem->name);
     344        unsigned int flag = PS_META_REPLACE; // Flag to indicate MULTI; otherwise, replace
     345        if (multiCheckItem->type == PS_DATA_METADATA_MULTI) {
     346            psTrace(__func__, 10, "MULTI: %s (%s)\n", inItem->name, inItem->comment);
     347            flag = PS_DATA_METADATA_MULTI;
     348        }
     349        psTrace(__func__, 5, "Copying %s (%s)...\n", inItem->name, inItem->comment);
     350
     351
     352        //        case PS_TYPE_##NAME:
     353        #define PS_METADATA_COPY_CASE(NAME,TYPE) \
     354    case PS_DATA_##NAME: \
     355        if (! psMetadataAdd(out, PS_LIST_TAIL, inItem->name, \
     356                            PS_DATA_##NAME | flag, inItem->comment, inItem->data.TYPE)) { \
     357            psErrorStackPrint(stderr, "Error copying %s (%s) in the metadata\n", \
     358                              inItem->name, inItem->comment); \
     359        } \
     360        break;
     361
     362        switch (inItem->type) {
     363            // Numerical types
     364            PS_METADATA_COPY_CASE(BOOL,B);
     365            //            PS_METADATA_COPY_CASE(S8,S8);
     366            //            PS_METADATA_COPY_CASE(S16,S16);
     367            PS_METADATA_COPY_CASE(S32,S32);
     368            //            PS_METADATA_COPY_CASE(U8,U8);
     369            //            PS_METADATA_COPY_CASE(U16,U16);
     370            //            PS_METADATA_COPY_CASE(U32,U32);
     371            PS_METADATA_COPY_CASE(F32,F32);
     372            PS_METADATA_COPY_CASE(F64,F64);
     373
     374        case PS_DATA_VECTOR: {
     375                psVector *vecCopy = psVectorCopy(NULL, (psVector*)(inItem->data.V),
     376                                                 ((psVector*)(inItem->data.V))->type.type);
     377                if (vecCopy == NULL) {
     378                    psError(PS_ERR_BAD_PARAMETER_NULL, false,
     379                            "Error copying vector.  Vector skipped.\n");
     380                } else {
     381                    psMetadataAddVector(out, PS_LIST_TAIL, inItem->name, flag,
     382                                        inItem->comment, vecCopy);
     383                    psFree(vecCopy);
     384                }
     385                break;
     386            }
     387        case PS_DATA_TIME: {
     388                psTime *timeCopy = p_psTimeCopy( (psTime*)(inItem->data.V) );
     389                if (timeCopy == NULL) {
     390                    psError(PS_ERR_BAD_PARAMETER_NULL, false,
     391                            "Error copying time.  Time skipped.\n");
     392                } else {
     393                    psMetadataAddTime(out, PS_LIST_TAIL, inItem->name, flag,
     394                                      inItem->comment, timeCopy);
     395                    psFree(timeCopy);
     396                }
     397                break;
     398            }
     399            // String: relying on the fact that this will copy the string, not point at it.
     400        case PS_DATA_STRING:
     401            psMetadataAdd(out, PS_LIST_TAIL, inItem->name, PS_DATA_STRING |
     402                          flag, inItem->comment, inItem->data.V);
     403            break;
     404            // Metadata: copy the next level and stuff that in too
     405        case PS_DATA_METADATA: {
     406                psMetadata *metadata = psMetadataCopy(NULL, inItem->data.md);
     407                psMetadataAdd(out, PS_LIST_TAIL, inItem->name,
     408                              PS_DATA_METADATA | flag, inItem->comment, metadata);
     409                psFree(metadata);
     410                break;
     411            }
     412            // Other kinds of pointers
     413        default:
     414            numPointers++;
     415            psTrace(__func__, 10, "Copying a pointer in the metadata: %x\n", inItem->type);
     416            psMetadataAdd(out, PS_LIST_TAIL, inItem->name, inItem->type | flag,
     417                          inItem->comment, inItem->data.V);
     418            break;
     419        }
     420    }
    335421    psFree(iter);
     422
     423    if (numPointers > 0) {
     424        psLogMsg(__func__, PS_LOG_WARN,
     425                 "Forced to copy %d pointers when copying metadata.  Updating the "
     426                 "copied psMetadata will affect the original!\n", numPointers);
     427    }
     428
    336429    return out;
    337430}
Note: See TracChangeset for help on using the changeset viewer.