IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 6195


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

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

Location:
trunk/psLib
Files:
2 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}
  • trunk/psLib/test/types/tst_psMetadata_07.c

    r6190 r6195  
    1616*  @author  David Robbins, MHPCC
    1717*
    18 *  @version $Revision: 1.18 $  $Name: not supported by cvs2svn $
    19 *  @date  $Date: 2006-01-25 22:18:00 $
     18*  @version $Revision: 1.19 $  $Name: not supported by cvs2svn $
     19*  @date  $Date: 2006-01-26 00:46:54 $
    2020*
    2121*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    291291    psMetadata *md = setupMeta();
    292292
    293 
    294293    //Return NULL for NULL input Metadata
    295294    test = psMetadataCopy(test, empty);
     295    if (test != NULL) {
     296        psError(PS_ERR_BAD_PARAMETER_VALUE, false,
     297                "psMetadataCopy failed to return NULL for NULL input metadata.\n");
     298        psFree(md);
     299        return 1;
     300    }
    296301
    297302    //Return a copy in of md in test
    298     test = psMetadataCopy(test, md);
     303    test = psMetadataCopy(NULL, md);
    299304    //Check if contents are the same
    300305    psMetadataItem *testItem = NULL;
     
    307312    mdItem = psMetadataGetAndIncrement(mdIterator);
    308313    while (testItem != NULL || mdItem != NULL ) {
    309         if (testItem != mdItem) {
    310             psError(PS_ERR_BAD_PARAMETER_VALUE, false,
    311                     "Copied psMetadataItem does not match Original.\n");
    312         }
    313314        testItem = psMetadataGetAndIncrement(testIterator);
    314315        mdItem = psMetadataGetAndIncrement(mdIterator);
    315316    }
     317
     318    if (!psMetadataConfigWrite(md, "MDCopy.in") ) {
     319        psError(PS_ERR_BAD_PARAMETER_VALUE, false,
     320                "psMetadataConfigWrite failed to output original metadata contents.\n");
     321        return 3;
     322    }
     323    if (!psMetadataConfigWrite(test, "MDCopy.out") ) {
     324        psError(PS_ERR_BAD_PARAMETER_VALUE, false,
     325                "psMetadataConfigWrite failed to output copied metadata contents.\n");
     326        return 4;
     327    }
     328    FILE *verified;
     329    FILE *output;
     330    verified = fopen("MDCopy.in", "r");
     331    output = fopen("MDCopy.out", "r");
     332    char buffer1[100];
     333    char buffer2[100];
     334    while ( fscanf(verified, "%s", buffer1) != EOF ) {
     335        if (fscanf(output, "%s", buffer2) == EOF) {
     336            psError(PS_ERR_BAD_PARAMETER_SIZE, false,
     337                    "Copied metadata is smaller than the original.\n");
     338            return 5;
     339        }
     340        if (strncmp(buffer1, buffer2, 100) ) {
     341            psError(PS_ERR_BAD_PARAMETER_VALUE, false,
     342                    "Copied metadata contents do not match original metadata contents.\n");
     343            return 6;
     344        }
     345    }
     346    if (fscanf(output, "%s", buffer2) != EOF) {
     347        psError(PS_ERR_BAD_PARAMETER_SIZE, false,
     348                "Copied metadata is larger than the original.\n");
     349        return 7;
     350    }
     351    fclose(verified);
     352    fclose(output);
     353
    316354
    317355    psFree(testItem);
Note: See TracChangeset for help on using the changeset viewer.