Changeset 3945 for trunk/psLib/src/collections/psMetadata.c
- Timestamp:
- May 16, 2005, 9:43:53 AM (21 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/collections/psMetadata.c (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/collections/psMetadata.c
r3780 r3945 12 12 * @author Ross Harman, MHPCC 13 13 * 14 * @version $Revision: 1.6 1$ $Name: not supported by cvs2svn $15 * @date $Date: 2005-0 4-28 19:52:48$14 * @version $Revision: 1.62 $ $Name: not supported by cvs2svn $ 15 * @date $Date: 2005-05-16 19:43:53 $ 16 16 * 17 17 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 38 38 #include "psAstronomyErrors.h" 39 39 #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 /*****************************************************************************/ 40 64 41 65 static psS32 metadataId = 0; 66 67 /*****************************************************************************/ 68 /* FUNCTION IMPLEMENTATION - LOCAL */ 69 /*****************************************************************************/ 42 70 43 71 static psMetadataItem* makeMetaMulti(psHash* table, const char* key, psMetadataItem* existing) … … 48 76 } 49 77 78 // move any existing entry into a psList 79 psList* newList = psListAlloc(existing); 50 80 51 81 psMetadataItem* item = psMetadataItemAlloc(key, 52 82 PS_META_MULTI, 53 "List of Metadata Items", 54 NULL); 55 56 psListAdd(item->data.list,PS_LIST_TAIL,existing); 83 "", 84 newList); 57 85 58 86 if (existing != NULL) { … … 60 88 } 61 89 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); 65 94 psFree(item); 66 95 … … 80 109 psFree(metadataItem->name); 81 110 psFree(metadataItem->comment); 82 if (! PS_META_IS_PRIMITIVE(type)) { 111 112 if(!PS_META_IS_PRIMITIVE(type)) { 83 113 psFree(metadataItem->data.V); 84 114 } … … 104 134 psFree(metadata->list); 105 135 psFree(metadata->table); 136 106 137 } 107 138 … … 146 177 { 147 178 psMetadataItem* metadataItem = NULL; 148 char tmp; 149 int nBytes; 179 150 180 151 181 PS_PTR_CHECK_NULL(name,NULL); … … 158 188 psMemSetDeallocator(metadataItem, (psFreeFcn) metadataItemFree); 159 189 160 // set metadata item comment 190 // Allocate and set metadata item comment 191 metadataItem->comment = (char *)psAlloc(sizeof(char) * MAX_STRING_LENGTH); 161 192 if (comment == NULL) { 162 193 // Per SDRS, null isn't allowed, must use "" instead 163 metadataItem->comment = psStringCopy("");194 strncpy(metadataItem->comment, "", MAX_STRING_LENGTH); 164 195 } else { 165 metadataItem->comment = psStringCopy(comment);196 strncpy(metadataItem->comment, comment, MAX_STRING_LENGTH); 166 197 } 167 198 … … 173 204 174 205 // 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); 177 207 vsprintf(metadataItem->name, name, argPtr); 178 208 … … 193 223 case PS_META_STR: 194 224 // 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); 200 226 break; 201 227 case PS_META_LIST: … … 207 233 case PS_META_ASTROM: 208 234 case PS_META_UNKNOWN: 235 case PS_META_META: 236 case PS_META_MULTI: 209 237 // Copy of input data not performed due to variability of data types 210 238 metadataItem->data.V = psMemIncrRefCounter(va_arg(argPtr, psPtr)); … … 258 286 259 287 // 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 269 290 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 278 294 existingEntry = makeMetaMulti(mdTable,key,existingEntry); 279 295 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 280 307 return true; // all done. 281 308 } 282 309 283 310 // 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 291 312 if (existingEntry->type == PS_META_MULTI || (flags & PS_META_DUPLICATE_OK) != 0) { 292 313 // duplicate entries allowed - add another entry. 293 314 294 // make sure the existing hashentry is PS_META_MULTI315 // make sure the existing entry is PS_META_MULTI 295 316 existingEntry = makeMetaMulti(mdTable,key,existingEntry); 296 317 297 // add to the hash key's list ofentries318 // add to the hash's list of duplicate entries 298 319 if (! psListAdd(existingEntry->data.list, PS_LIST_TAIL, metadataItem) ) { 299 320 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key); 300 321 return false; 301 322 } 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); 302 338 } else { 303 // error on duplicate entry.339 // default is to error on duplicate entry. 304 340 psError(PS_ERR_BAD_PARAMETER_VALUE, true, 305 341 PS_ERRORTEXT_psMetadata_DUPLICATE_NOT_ALLOWED); 306 342 return false; 307 343 } 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 311 354 if(!psListAdd(mdList, location, metadataItem)) { 312 355 psError(PS_ERR_UNKNOWN,false,PS_ERRORTEXT_psMetadata_ADD_COLLECTION_FAILED,key); … … 363 406 METADATA_ADD_TYPE(LookupTable,psLookupTable*,PS_META_LOOKUPTABLE) 364 407 METADATA_ADD_TYPE(Unknown,void*,PS_META_UNKNOWN) 408 METADATA_ADD_TYPE(Metadata,psMetadata*,PS_META_META) 365 409 366 410 psBool psMetadataRemove(psMetadata *md, psS32 where, const char *key)
Note:
See TracChangeset
for help on using the changeset viewer.
