static NCerror moveto(NCDAPCOMMON* nccomm, Getvara* xgetvar, CDFnode* xrootnode, void* memory) { OCerror ocstat = OC_NOERR; NCerror ncstat = NC_NOERR; OClink conn = nccomm->oc.conn; OCdatanode xrootcontent; OCddsnode ocroot; NClist* path = nclistnew(); struct NCMEMORY memstate; memstate.next = (memstate.memory = memory); /* Get the root content*/ ocroot = xrootnode->tree->ocroot; ocstat = oc_data_getroot(conn,ocroot,&xrootcontent); if(ocstat != OC_NOERR) {THROWCHK(ocstat); goto done;} /* Remember: xgetvar->target is in DATADDS tree */ collectnodepath3(xgetvar->target,path,WITHDATASET); ncstat = movetor(nccomm,xrootcontent, path,0,xgetvar,0,&memstate, xgetvar->varaprojection->var->segments); done: nclistfree(path); oc_data_free(conn,xrootcontent); if(ocstat != OC_NOERR) ncstat = ocerrtoncerr(ocstat); return THROW(ncstat); }
NCerror buildcachenode34(NCDAPCOMMON* nccomm, DCEconstraint* constraint, NClist* varlist, NCcachenode** cachep, NCFLAGS flags) { NCerror ncstat = NC_NOERR; OCerror ocstat = OC_NOERR; OClink conn = nccomm->oc.conn; OCddsnode ocroot = NULL; CDFnode* dxdroot = NULL; NCcachenode* cachenode = NULL; char* ce = NULL; int isprefetch = 0; if((flags & NCF_PREFETCH) != 0) isprefetch = 1; if((flags & NCF_PREFETCH_ALL) == 0) ce = buildconstraintstring3(constraint); ocstat = dap_fetch(nccomm,conn,ce,OCDATADDS,&ocroot); nullfree(ce); if(ocstat) {THROWCHK(ocerrtoncerr(ocstat)); goto done;} ncstat = buildcdftree34(nccomm,ocroot,OCDATA,&dxdroot); if(ncstat) {THROWCHK(ncstat); goto done;} /* re-struct*/ if(!FLAGSET(nccomm->controls,NCF_UNCONSTRAINABLE)) { ncstat = restruct3(dxdroot,nccomm->cdf.ddsroot,constraint->projections); if(ncstat) {THROWCHK(ncstat); goto done;} } /* create the cache node */ cachenode = createnccachenode(); cachenode->isprefetch = isprefetch; cachenode->vars = nclistclone(varlist); cachenode->datadds = dxdroot; /* Give the constraint over to the cachenode */ cachenode->constraint = constraint; constraint = NULL; cachenode->wholevariable = iscacheableconstraint(cachenode->constraint); /* save the root content*/ cachenode->ocroot = ocroot; ocstat = oc_data_getroot(conn,ocroot,&cachenode->content); if(ocstat) {THROWCHK(ocerrtoncerr(ocstat)); goto done;} /* capture the packet size */ ocstat = oc_raw_xdrsize(conn,ocroot,&cachenode->xdrsize); if(ocstat) {THROWCHK(ocerrtoncerr(ocstat)); goto done;} #ifdef DEBUG fprintf(stderr,"buildcachenode: new cache node: %s\n", dumpcachenode(cachenode)); #endif /* Insert into the cache. If not caching, then remove any previous cache node */ if(!isprefetch) { NCcache* cache = nccomm->cdf.cache; if(cache->nodes == NULL) cache->nodes = nclistnew(); /* remove cache nodes to get below the max cache size */ while(cache->cachesize + cachenode->xdrsize > cache->cachelimit && nclistlength(cache->nodes) > 0) { NCcachenode* node = (NCcachenode*)nclistremove(cache->nodes,0); #ifdef DEBUG fprintf(stderr,"buildcachenode: purge cache node: %s\n", dumpcachenode(cachenode)); #endif cache->cachesize -= node->xdrsize; freenccachenode(nccomm,node); } /* Remove cache nodes to get below the max cache count */ /* If not caching, then cachecount should be 0 */ while(nclistlength(cache->nodes) > cache->cachecount) { NCcachenode* node = (NCcachenode*)nclistremove(cache->nodes,0); #ifdef DEBUG fprintf(stderr,"buildcachenode: count purge cache node: %s\n", dumpcachenode(node)); #endif cache->cachesize -= node->xdrsize; freenccachenode(nccomm,node); } nclistpush(nccomm->cdf.cache->nodes,(void*)cachenode); cache->cachesize += cachenode->xdrsize; } #ifdef DEBUG fprintf(stderr,"buildcachenode: %s\n",dumpcachenode(cachenode)); #endif done: if(constraint != NULL) dcefree((DCEnode*)constraint); if(cachep) *cachep = cachenode; if(ocstat != OC_NOERR) ncstat = ocerrtoncerr(ocstat); if(ncstat) { freecdfroot34(dxdroot); freenccachenode(nccomm,cachenode); } return THROW(ncstat); }
static NCerror countsequence(NCDAPCOMMON* dapcomm, CDFnode* xseq, size_t* sizep) { unsigned int i; NClist* path = nclistnew(); int index; OCerror ocstat = OC_NOERR; NCerror ncstat = NC_NOERR; OClink conn = dapcomm->oc.conn; size_t recordcount; CDFnode* xroot; OCdatanode data = NULL; ASSERT((xseq->nctype == NC_Sequence)); /* collect the path to the sequence node */ collectnodepath3(xseq,path,WITHDATASET); /* Get tree root */ ASSERT(xseq->root == (CDFnode*)nclistget(path,0)); xroot = xseq->root; ocstat = oc_data_getroot(conn,xroot->tree->ocroot,&data); if(ocstat) goto done; /* Basically we use the path to walk the data instances to reach the sequence instance */ for(i=0;i<nclistlength(path);i++) { CDFnode* current = (CDFnode*)nclistget(path,i); OCdatanode nextdata = NULL; CDFnode* next = NULL; /* invariant: current = ith node in path; data = corresponding datanode */ /* get next node in next and next instance in nextdata */ if(current->nctype == NC_Structure || current->nctype == NC_Dataset) { if(nclistlength(current->array.dimset0) > 0) { /* Cannot handle this case */ ncstat = THROW(NC_EDDS); goto done; } /* get next node in path; structure/dataset => exists */ next = (CDFnode*)nclistget(path,i+1); index = fieldindex(current,next); /* Move to appropriate field */ ocstat = oc_data_ithfield(conn,data,index,&nextdata); if(ocstat) goto done; oc_data_free(conn,data); data = nextdata; /* set up for next loop iteration */ } else if(current->nctype == NC_Sequence) { /* Check for nested Sequences */ if(current != xseq) { /* Cannot handle this case */ ncstat = THROW(NC_EDDS); goto done; } /* Get the record count */ ocstat = oc_data_recordcount(conn,data,&recordcount); if(sizep) *sizep = recordcount; oc_data_free(conn,data); /* reclaim */ break; /* leave the loop */ } else { PANIC("unexpected mode"); return NC_EINVAL; } } done: nclistfree(path); if(ocstat) ncstat = ocerrtoncerr(ocstat); return THROW(ncstat); }