IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
May 16, 2005, 9:43:53 AM (21 years ago)
Author:
evanalst
Message:

Bug #392 fix.

File:
1 edited

Legend:

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

    r3780 r3945  
    1212*  @author Ross Harman, MHPCC
    1313*
    14 *  @version $Revision: 1.61 $ $Name: not supported by cvs2svn $
    15 *  @date $Date: 2005-04-28 19:52:48 $
     14*  @version $Revision: 1.62 $ $Name: not supported by cvs2svn $
     15*  @date $Date: 2005-05-16 19:43:53 $
    1616*
    1717*  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    3838#include "psAstronomyErrors.h"
    3939#include "psConstants.h"
     40#include "psLogMsg.h"
     41
     42/******************************************************************************/
     43/*  DEFINE STATEMENTS                                                         */
     44/******************************************************************************/
     45
     46/** Maximum size of a string */
     47#define MAX_STRING_LENGTH 1024
     48
     49/******************************************************************************/
     50/*  TYPE DEFINITIONS                                                          */
     51/******************************************************************************/
     52
     53// None
     54
     55/*****************************************************************************/
     56/*  GLOBAL VARIABLES                                                         */
     57/*****************************************************************************/
     58
     59// None
     60
     61/*****************************************************************************/
     62/*  FILE STATIC VARIABLES                                                    */
     63/*****************************************************************************/
    4064
    4165static psS32 metadataId = 0;
     66
     67/*****************************************************************************/
     68/*  FUNCTION IMPLEMENTATION - LOCAL                                          */
     69/*****************************************************************************/
    4270
    4371static psMetadataItem* makeMetaMulti(psHash* table, const char* key, psMetadataItem* existing)
     
    4876    }
    4977
     78    // move any existing entry into a psList
     79    psList* newList = psListAlloc(existing);
    5080
    5181    psMetadataItem* item = psMetadataItemAlloc(key,
    5282                           PS_META_MULTI,
    53                            "List of Metadata Items",
    54                            NULL);
    55 
    56     psListAdd(item->data.list,PS_LIST_TAIL,existing);
     83                           "",
     84                           newList);
    5785
    5886    if (existing != NULL) {
     
    6088    }
    6189
    62     psHashAdd(table, key, item); // put in the new MULTI list entry
    63 
    64     // free local references of newly allocated item.
     90    psHashAdd(table, key, item); // put in the new entry
     91
     92    // free local references of newly allocated items.
     93    psFree(newList);
    6594    psFree(item);
    6695
     
    80109    psFree(metadataItem->name);
    81110    psFree(metadataItem->comment);
    82     if (! PS_META_IS_PRIMITIVE(type)) {
     111
     112    if(!PS_META_IS_PRIMITIVE(type)) {
    83113        psFree(metadataItem->data.V);
    84114    }
     
    104134    psFree(metadata->list);
    105135    psFree(metadata->table);
     136
    106137}
    107138
     
    146177{
    147178    psMetadataItem* metadataItem = NULL;
    148     char tmp;
    149     int nBytes;
     179
    150180
    151181    PS_PTR_CHECK_NULL(name,NULL);
     
    158188    psMemSetDeallocator(metadataItem, (psFreeFcn) metadataItemFree);
    159189
    160     // set metadata item comment
     190    // Allocate and set metadata item comment
     191    metadataItem->comment = (char *)psAlloc(sizeof(char) * MAX_STRING_LENGTH);
    161192    if (comment == NULL) {
    162193        // Per SDRS, null isn't allowed, must use "" instead
    163         metadataItem->comment = psStringCopy("");
     194        strncpy(metadataItem->comment, "", MAX_STRING_LENGTH);
    164195    } else {
    165         metadataItem->comment = psStringCopy(comment);
     196        strncpy(metadataItem->comment, comment, MAX_STRING_LENGTH);
    166197    }
    167198
     
    173204
    174205    // Allocate and set metadata item name
    175     nBytes = vsnprintf(&tmp, 0, name, argPtr) + 1;
    176     metadataItem->name = (char *)psAlloc(sizeof(char) * nBytes);
     206    metadataItem->name = (char *)psAlloc(sizeof(char) * MAX_STRING_LENGTH);
    177207    vsprintf(metadataItem->name, name, argPtr);
    178208
     
    193223    case PS_META_STR:
    194224        // Perform copy of input strings
    195         metadataItem->data.V = psStringCopy(va_arg(argPtr, char *));
    196         break;
    197     case PS_META_MULTI:
    198         // MULTI needs to create a psList entry, value must be NULL
    199         metadataItem->data.list = psListAlloc(NULL);
     225        metadataItem->data.V = psStringNCopy(va_arg(argPtr, char *), MAX_STRING_LENGTH);
    200226        break;
    201227    case PS_META_LIST:
     
    207233    case PS_META_ASTROM:
    208234    case PS_META_UNKNOWN:
     235    case PS_META_META:
     236    case PS_META_MULTI:
    209237        // Copy of input data not performed due to variability of data types
    210238        metadataItem->data.V = psMemIncrRefCounter(va_arg(argPtr, psPtr));
     
    258286
    259287    // See if key is already in table
    260     existingEntry = psMetadataLookup(md, key);
    261 
    262     // if replace is set, remove any existing items of the same key
    263     if (existingEntry != NULL && (flags & PS_META_REPLACE) != 0) {
    264         psMetadataRemove(md,0,key);
    265         existingEntry = NULL;
    266     }
    267 
    268     // if the metadataItem is MULTI, just create a MULTI node.
     288    existingEntry = (psMetadataItem*)psHashLookup(mdTable, key);
     289
    269290    if (metadataItem->type == PS_META_MULTI) {
    270         if (metadataItem->data.list == NULL || metadataItem->data.list->size > 0) {
    271             psError(PS_ERR_BAD_PARAMETER_VALUE,true,
    272                     "Specified PS_META_MULTI item is not defined properly "
    273                     "(list allocated with zero size).");
    274             return false;
    275         }
    276 
    277         // make sure the existing entry is PS_META_MULTI
     291        // the incoming entry is PS_META_MULTI
     292
     293        // force the hash entry to be PS_META_MULTI
    278294        existingEntry = makeMetaMulti(mdTable,key,existingEntry);
    279295
     296        // add all the items in the incoming entry to metadata
     297        psList* list = metadataItem->data.list;
     298        if (list != NULL) {
     299            psListIterator* iter = psListIteratorAlloc(list,PS_LIST_HEAD,true);
     300            psMetadataItem* listItem;
     301            while ((listItem=(psMetadataItem*)psListGetAndIncrement(iter)) != NULL) {
     302                psMetadataAddItem(md,listItem,location,flags);
     303            }
     304            psFree(iter);
     305        }
     306
    280307        return true; // all done.
    281308    }
    282309
    283310    // how the item is added to the hash depends on prior existence, flags, etc.
    284     if(existingEntry == NULL) { // no prior existence
    285         // Node doesn't already exist - Add new metadata item to metadata collection's hash
    286         if(!psHashAdd(mdTable, key, metadataItem)) {
    287             psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
    288             return false;
    289         }
    290     } else {
     311    if(existingEntry != NULL) { // prior existence
    291312        if (existingEntry->type == PS_META_MULTI || (flags & PS_META_DUPLICATE_OK) != 0) {
    292313            // duplicate entries allowed - add another entry.
    293314
    294             // make sure the existing hash entry is PS_META_MULTI
     315            // make sure the existing entry is PS_META_MULTI
    295316            existingEntry = makeMetaMulti(mdTable,key,existingEntry);
    296317
    297             // add to the hash key's list of entries
     318            // add to the hash's list of duplicate entries
    298319            if (! psListAdd(existingEntry->data.list, PS_LIST_TAIL, metadataItem) ) {
    299320                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
    300321                return false;
    301322            }
     323        } else if ((flags & PS_META_REPLACE) != 0) {
     324            // replace entry instead of creating a duplicate entry.
     325
     326            // remove the existing entry from metadata
     327            psMetadataRemove(md,0,key);
     328
     329            // treat as if new (added to list below)
     330            if(!psHashAdd(mdTable, key, metadataItem)) {
     331                psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
     332                return false;
     333            }
     334
     335            // Generate warning that item has been replaced
     336            psLogMsg(__func__,PS_LOG_WARN,"Metadata item %s has been replaced",
     337                     existingEntry->name);
    302338        } else {
    303             // error on duplicate entry.
     339            // default is to error on duplicate entry.
    304340            psError(PS_ERR_BAD_PARAMETER_VALUE, true,
    305341                    PS_ERRORTEXT_psMetadata_DUPLICATE_NOT_ALLOWED);
    306342            return false;
    307343        }
    308     }
    309 
    310     // finally, add the metadataItem to the metadata's list.
     344    } else {
     345        // OK, this is a new item.
     346
     347        // Node doesn't exist - Add new metadata item to metadata collection's hash
     348        if(!psHashAdd(mdTable, key, metadataItem)) {
     349            psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_TABLE_FAILED,key);
     350            return false;
     351        }
     352    }
     353
    311354    if(!psListAdd(mdList, location, metadataItem)) {
    312355        psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key);
     
    363406METADATA_ADD_TYPE(LookupTable,psLookupTable*,PS_META_LOOKUPTABLE)
    364407METADATA_ADD_TYPE(Unknown,void*,PS_META_UNKNOWN)
     408METADATA_ADD_TYPE(Metadata,psMetadata*,PS_META_META)
    365409
    366410psBool psMetadataRemove(psMetadata *md, psS32 where, const char *key)
Note: See TracChangeset for help on using the changeset viewer.