static NCerror computeseqcountconstraints3(NCDAPCOMMON* dapcomm, CDFnode* seq, NCbytes* seqcountconstraints) { int i,j; NClist* path = NULL; CDFnode* var = NULL; ASSERT(seq->nctype == NC_Sequence); computeseqcountconstraints3r(dapcomm,seq,&var); ASSERT((var != NULL)); /* Compute var path */ path = nclistnew(); collectnodepath3(var,path,WITHOUTDATASET); /* construct the projection path using minimal index values */ for(i=0;i<nclistlength(path);i++) { CDFnode* node = (CDFnode*)nclistget(path,i); if(i > 0) ncbytescat(seqcountconstraints,"."); ncbytescat(seqcountconstraints,node->ocname); if(node == seq) { /* Use the limit */ if(node->sequencelimit > 0) { char tmp[64]; snprintf(tmp,sizeof(tmp),"[0:%lu]", (unsigned long)(node->sequencelimit - 1)); ncbytescat(seqcountconstraints,tmp); } } else if(nclistlength(node->array.dimset0) > 0) { int ndims = nclistlength(node->array.dimset0); for(j=0;j<ndims;j++) { CDFnode* dim = (CDFnode*)nclistget(node->array.dimset0,j); if(DIMFLAG(dim,CDFDIMSTRING)) { ASSERT((j == (ndims - 1))); break; } ncbytescat(seqcountconstraints,"[0]"); } } } /* Finally, add in any selection from the original URL */ if(dapcomm->oc.url->selection != NULL) ncbytescat(seqcountconstraints,dapcomm->oc.url->selection); nclistfree(path); return NC_NOERR; }
static NCerror buildglobalattrs3(NCDAPCOMMON* dapcomm, CDFnode* root) { int i; NCerror ncstat = NC_NOERR; const char* txt; char *nltxt, *p; NCbytes* buf = NULL; NClist* cdfnodes; NC* drno = dapcomm->controller; if(root->attributes != NULL) { for(i=0;i<nclistlength(root->attributes);i++) { NCattribute* att = (NCattribute*)nclistget(root->attributes,i); ncstat = buildattribute3a(dapcomm,att,NC_NAT,NC_GLOBAL); if(ncstat != NC_NOERR) goto done; } } /* Add global attribute identifying the sequence dimensions */ if(paramcheck34(dapcomm,"show","seqdims")) { buf = ncbytesnew(); cdfnodes = dapcomm->cdf.ddsroot->tree->nodes; for(i=0;i<nclistlength(cdfnodes);i++) { CDFnode* dim = (CDFnode*)nclistget(cdfnodes,i); if(dim->nctype != NC_Dimension) continue; if(DIMFLAG(dim,CDFDIMSEQ)) { char* cname = cdflegalname3(dim->ocname); if(ncbyteslength(buf) > 0) ncbytescat(buf,", "); ncbytescat(buf,cname); nullfree(cname); } } if(ncbyteslength(buf) > 0) { ncstat = nc_put_att_text(drno->substrate,NC_GLOBAL,"_sequence_dimensions", ncbyteslength(buf),ncbytescontents(buf)); } } /* Define some additional system global attributes depending on show= clientparams*/ /* Ignore failures*/ if(paramcheck34(dapcomm,"show","translate")) { /* Add a global attribute to show the translation */ ncstat = nc_put_att_text(drno->substrate,NC_GLOBAL,"_translate", strlen("netcdf-3"),"netcdf-3"); } if(paramcheck34(dapcomm,"show","url")) { if(dapcomm->oc.rawurltext != NULL) ncstat = nc_put_att_text(drno->substrate,NC_GLOBAL,"_url", strlen(dapcomm->oc.rawurltext),dapcomm->oc.rawurltext); } if(paramcheck34(dapcomm,"show","dds")) { txt = NULL; if(dapcomm->cdf.ddsroot != NULL) txt = oc_inq_text(dapcomm->oc.conn,dapcomm->cdf.ddsroot->ocnode); if(txt != NULL) { /* replace newlines with spaces*/ nltxt = nulldup(txt); for(p=nltxt;*p;p++) {if(*p == '\n' || *p == '\r' || *p == '\t') {*p = ' ';}}; ncstat = nc_put_att_text(drno->substrate,NC_GLOBAL,"_dds",strlen(nltxt),nltxt); nullfree(nltxt); } } if(paramcheck34(dapcomm,"show","das")) { txt = NULL; if(dapcomm->oc.ocdasroot != OCNULL) txt = oc_inq_text(dapcomm->oc.conn,dapcomm->oc.ocdasroot); if(txt != NULL) { nltxt = nulldup(txt); for(p=nltxt;*p;p++) {if(*p == '\n' || *p == '\r' || *p == '\t') {*p = ' ';}}; ncstat = nc_put_att_text(drno->substrate,NC_GLOBAL,"_das",strlen(nltxt),nltxt); nullfree(nltxt); } } done: ncbytesfree(buf); return THROW(ncstat); }
static NCerror builddims(NCDAPCOMMON* dapcomm) { int i; NCerror ncstat = NC_NOERR; int dimid; NClist* dimset = NULL; NC* drno = dapcomm->controller; NC* ncsub; char* definename; /* collect all dimensions from variables */ dimset = dapcomm->cdf.dimnodes; /* Sort by fullname just for the fun of it */ for(;;) { int last = nclistlength(dimset) - 1; int swap = 0; for(i=0;i<last;i++) { CDFnode* dim1 = (CDFnode*)nclistget(dimset,i); CDFnode* dim2 = (CDFnode*)nclistget(dimset,i+1); if(strcmp(dim1->ncfullname,dim2->ncfullname) > 0) { nclistset(dimset,i,(ncelem)dim2); nclistset(dimset,i+1,(ncelem)dim1); swap = 1; break; } } if(!swap) break; } /* Define unlimited only if needed */ if(dapcomm->cdf.recorddim != NULL) { CDFnode* unlimited = dapcomm->cdf.recorddim; definename = getdefinename(unlimited); ncstat = nc_def_dim(drno->substrate, definename, NC_UNLIMITED, &unlimited->ncid); nullfree(definename); if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} /* get the id for the substrate */ ncstat = NC_check_id(drno->substrate,&ncsub); if(ncstat != NC_NOERR) {THROWCHK(ncstat); goto done;} /* Set the effective size of UNLIMITED; note that this cannot be done thru the normal API.*/ NC_set_numrecs(ncsub,unlimited->dim.declsize); } for(i=0;i<nclistlength(dimset);i++) { CDFnode* dim = (CDFnode*)nclistget(dimset,i); if(dim->dim.basedim != NULL) continue; /* handle below */ if(DIMFLAG(dim,CDFDIMRECORD)) continue; /* defined above */ #ifdef DEBUG1 fprintf(stderr,"define: dim: %s=%ld\n",dim->ncfullname,(long)dim->dim.declsize); #endif definename = getdefinename(dim); ncstat = nc_def_dim(drno->substrate,definename,dim->dim.declsize,&dimid); if(ncstat != NC_NOERR) { THROWCHK(ncstat); goto done; } nullfree(definename); dim->ncid = dimid; } /* Make all duplicate dims have same dimid as basedim*/ /* (see computecdfdimnames)*/ for(i=0;i<nclistlength(dimset);i++) { CDFnode* dim = (CDFnode*)nclistget(dimset,i); if(dim->dim.basedim != NULL) { dim->ncid = dim->dim.basedim->ncid; } } done: nclistfree(dimset); return THROW(ncstat); }