void ocfreenodes(OClist* nodes) { unsigned int i,j; for(i=0;i<oclistlength(nodes);i++) { OCnode* node = (OCnode*)oclistget(nodes,i); ocfree(node->name); ocfree(node->fullname); while(oclistlength(node->att.values) > 0) { char* value = (char*)oclistpop(node->att.values); ocfree(value); } while(oclistlength(node->attributes) > 0) { OCattribute* attr = (OCattribute*)oclistpop(node->attributes); ocfree(attr->name); /* If the attribute type is string, then we need to free them*/ if(attr->etype == OC_String || attr->etype == OC_URL) { char** strings = (char**)attr->values; for(j=0;j<attr->nvalues;j++) {ocfree(*strings); strings++;} } ocfree(attr->values); ocfree(attr); } if(node->array.dimensions != NULL) oclistfree(node->array.dimensions); if(node->subnodes != NULL) oclistfree(node->subnodes); if(node->att.values != NULL) oclistfree(node->att.values); if(node->attributes != NULL) oclistfree(node->attributes); ocfree(node); } oclistfree(nodes); }
void ocfreeprojectionclause(OCprojectionclause* clause) { if(clause->target != NULL) free(clause->target); while(oclistlength(clause->indexsets) > 0) { OClist* slices = (OClist*)oclistpop(clause->indexsets); while(oclistlength(slices) > 0) { OCslice* slice = (OCslice*)oclistpop(slices); if(slice != NULL) free(slice); } oclistfree(slices); } oclistfree(clause->indexsets); free(clause); }
void occlose(OCstate* state) { unsigned int i; if(state == NULL) return; /* Warning: ocfreeroot will attempt to remove the root from state->trees */ /* Ok in this case because we are popping the root out of state->trees */ for(i=0;i<oclistlength(state->trees);i++) { OCnode* root = (OCnode*)oclistpop(state->trees); ocfreeroot(root); } oclistfree(state->trees); dapurlclear(&state->url); ocbytesfree(state->packet); ocfree(state->error.code); ocfree(state->error.message); if(state->contentlist != NULL) { struct OCcontent* next; struct OCcontent* curr = state->contentlist; while(curr != NULL) { next = curr->next; ocfree(curr); curr = next; } } if(state->curl != NULL) occurlclose(state->curl); if(state->clientparams != NULL) ocparamfree(state->clientparams); ocfree(state); }
void occlose(OCstate* state) { unsigned int i; if(state == NULL) return; /* Warning: ocfreeroot will attempt to remove the root from state->trees */ /* Ok in this case because we are popping the root out of state->trees */ for(i=0;i<oclistlength(state->trees);i++) { OCnode* root = (OCnode*)oclistpop(state->trees); ocroot_free(root); } oclistfree(state->trees); ocurifree(state->uri); ocbytesfree(state->packet); ocfree(state->error.code); ocfree(state->error.message); ocfree(state->curlflags.useragent); if(state->curlflags.cookiejar) { unlink(state->curlflags.cookiejar); ocfree(state->curlflags.cookiejar); } ocfree(state->ssl.certificate); ocfree(state->ssl.key); ocfree(state->ssl.keypasswd); ocfree(state->ssl.cainfo); ocfree(state->ssl.capath); ocfree(state->proxy.host); ocfree(state->creds.username); ocfree(state->creds.password); if(state->curl != NULL) occurlclose(state->curl); ocfree(state); }
void ocparamfree(OClist* params) { int i; if(params == NULL) return; for(i=0;i<oclistlength(params);i++) { char* s = (char*)oclistget(params,i); if(s != NULL) free((void*)s); } oclistfree(params); }
void daplexcleanup(DAPlexstate** lexstatep) { DAPlexstate* lexstate = *lexstatep; if(lexstate == NULL) return; if(lexstate->input != NULL) ocfree(lexstate->input); if(lexstate->reclaim != NULL) { while(oclistlength(lexstate->reclaim) > 0) { char* word = (char*)oclistpop(lexstate->reclaim); if(word) free(word); } oclistfree(lexstate->reclaim); } ocbytesfree(lexstate->yytext); free(lexstate); *lexstatep = NULL; }
void freeOCnode(OCnode* cdf, int deep) { unsigned int i; if(cdf == NULL) return; if(cdf->name != NULL) free(cdf->name); if(cdf->fullname != NULL) free(cdf->fullname); if(cdf->attributes != NULL) freeAttributes(cdf->attributes); if(cdf->subnodes != NULL) { if(deep) { for(i=0;i<oclistlength(cdf->subnodes);i++) { OCnode* node = (OCnode*)oclistget(cdf->subnodes,i); freeOCnode(node,deep); } } oclistfree(cdf->subnodes); } free(cdf); }
static void computefullname(OCnode* node) { char* tmp; char* fullname; OClist* path; OCASSERT((node->name != NULL)); path = oclistnew(); collectpathtonode(node,path); tmp = pathtostring(path,PATHSEPARATOR,1); if(tmp == NULL) { fullname = strdup(node->name); } else { fullname = tmp; } node->fullname = fullname; oclistfree(path); }
static int occompile1(OCstate* state, OCnode* xnode, OCmemdata** memdatap, XDR* xdrs) { unsigned int i,j,xdrcount; int stat = OC_NOERR; size_t nelements; OCmemdata* memdata = NULL; OCmemdata* structdata = NULL; OClist* records = NULL; OCerror ocstat = OC_NOERR; OCmemdata** pmem = NULL; /* Allocate the space for this memdata chunk */ switch (xnode->octype) { case OC_Dataset: case OC_Grid: case OC_Structure: { if(xnode->array.rank == 0) { ocstat = occompilefields(state,xnode,&memdata,xdrs); if(ocstat != OC_NOERR) goto fail; } else { /* rank > 0 */ /* Compute the actual index count after projections */ nelements = totaldimsize(xnode); if(nelements == 0) return THROW(OC_ENODATA); memdata = makememdata(xnode->octype,OC_NAT,nelements); MEMCHECK(memdata,OC_ENOMEM); memdata->mode = Dimmode; pmem = (OCmemdata**)&memdata->data; /* Consume the leading count field */ if(!xdr_u_int(xdrs,&xdrcount)) {stat = OC_EXDR; goto fail;} /* validate the datadds dimensions */ if(xdrcount != nelements) {stat=OC_EINVALCOORDS; goto fail;} for(i=0;i<nelements;i++) { ocstat = occompilefields(state,xnode,&structdata,xdrs); if(ocstat != OC_NOERR) { if(ocstat != OC_ENODATA) goto fail; structdata = NULL; /* Leave a hole for this element */ } pmem[i] = structdata; structdata = NULL; } } } break; case OC_Sequence:{ /* Since we do not know the # records beforehand, use a oclist to collect the record instances. Query: this stores by recor (where e.g. original ocapi stores by column). How hard would it be to make the storage choice conditional on some user defined flag? */ records = oclistnew(); for(;;) { /* pick up the sequence record begin marker*/ char tmp[sizeof(unsigned int)]; /* extract the tag byte*/ if(!xdr_opaque(xdrs,tmp,sizeof(tmp))) {stat = OC_EXDR; goto fail;} if(tmp[0] == StartOfoclist) { /* Walk each member field*/ ocstat = occompilefields(state,xnode,&structdata,xdrs); if(ocstat != OC_NOERR) goto fail; oclistpush(records,(ocelem)structdata); structdata = NULL; } else if(tmp[0] == EndOfoclist) { break; /* we are done with the this sequence instance*/ } else { oc_log(LOGERR,"missing/invalid begin/end record marker\n"); stat = OC_EINVALCOORDS; goto fail; } } /* Convert the list to a proper OCmemdata */ nelements = oclistlength(records); memdata = makememdata(xnode->octype,OC_NAT,nelements); MEMCHECK(memdata,OC_ENOMEM); memdata->mode = Recordmode; pmem = (OCmemdata**)&memdata->data; for(j=0;j<nelements;j++) { OCmemdata* record = (OCmemdata*)oclistget(records,j); pmem[j] = record; } oclistfree(records); records = NULL; } break; case OC_Primitive: ocstat = occompileprim(state,xnode,&memdata,xdrs); if(ocstat != OC_NOERR) goto fail; break; default: OCPANIC1("ocmap: encountered unexpected node type: %x",xnode->octype); break; } /*ok:*/ if(memdatap) *memdatap = memdata; return THROW(ocstat); fail: if(records != NULL) for(i=0;i<oclistlength(records);i++) freeocmemdata((OCmemdata*)oclistget(records,i)); freeocmemdata(memdata); freeocmemdata(structdata); return THROW(ocstat); }
int ocddsdasmerge(OCstate* state, OCnode* dasroot, OCnode* ddsroot) { OClist* dasglobals = oclistnew(); OClist* dasnodes = oclistnew(); OClist* varnodes = oclistnew(); OClist* ddsnodes; unsigned int i,j; if(dasroot->tree == NULL || dasroot->tree->dxdclass != OCDAS) return THROW(OC_EINVAL); if(ddsroot->tree == NULL || (ddsroot->tree->dxdclass != OCDDS && ddsroot->tree->dxdclass != OCDATADDS)) return THROW(OC_EINVAL); ddsnodes = ddsroot->tree->nodes; /* 1. collect all the relevant DAS nodes; namely those that contain at least one attribute value. Simultaneously look for potential ambiguities if found; complain but continue: result are indeterminate. also collect globals separately*/ for(i=0;i<oclistlength(dasroot->tree->nodes);i++) { OCnode* das = (OCnode*)oclistget(dasroot->tree->nodes,i); int hasattributes = 0; if(das->octype == OC_Attribute) continue; /* ignore these for now*/ if(das->name == NULL || das->att.isglobal) { oclistpush(dasglobals,(ocelem)das); continue; } for(j=0;j<oclistlength(das->subnodes);j++) { OCnode* subnode = (OCnode*)oclistget(das->subnodes,j); if(subnode->octype == OC_Attribute) {hasattributes = 1; break;} } if(hasattributes) { /* Look for previously collected nodes with same name*/ for(j=0;j<oclistlength(dasnodes);j++) { OCnode* das2 = (OCnode*)oclistget(dasnodes,j); if(das->name == NULL || das2->name == NULL) continue; if(strcmp(das->name,das2->name)==0) { oc_log(LOGWARN,"oc_mergedas: potentially ambiguous DAS name: %s",das->name); } } oclistpush(dasnodes,(ocelem)das); } } /* 2. collect all the leaf DDS nodes (of type OC_Primitive)*/ for(i=0;i<oclistlength(ddsnodes);i++) { OCnode* dds = (OCnode*)oclistget(ddsnodes,i); if(dds->octype == OC_Primitive) oclistpush(varnodes,(ocelem)dds); } /* 3. For each das node, locate matching DDS node(s) and attach attributes to the DDS node(s). Match means: 1. DAS->fullname :: DDS->fullname 2. DAS->name :: DDS->fullname (support DAS names with embedded '.' 3. DAS->name :: DDS->name */ for(i=0;i<oclistlength(dasnodes);i++) { OCnode* das = (OCnode*)oclistget(dasnodes,i); for(j=0;j<oclistlength(varnodes);j++) { OCnode* dds = (OCnode*)oclistget(varnodes,j); if(strcmp(das->fullname,dds->fullname)==0 || strcmp(das->name,dds->fullname)==0 || strcmp(das->name,dds->name)==0) { mergedas1(dds,das); /* remove from dasnodes list*/ oclistset(dasnodes,i,(ocelem)NULL); } } } /* 4. If there are attributes left, then complain about them being lost.*/ for(i=0;i<oclistlength(dasnodes);i++) { OCnode* das = (OCnode*)oclistget(dasnodes,i); if(das != NULL) marklostattribute(das); } /* 5. Assign globals*/ for(i=0;i<oclistlength(dasglobals);i++) { OCnode* das = (OCnode*)oclistget(dasglobals,i); mergedas1(ddsroot,das); } /* cleanup*/ oclistfree(dasglobals); oclistfree(dasnodes); oclistfree(varnodes); return THROW(OC_NOERR); }