void finalize_quote(void) { check_buffer(); if(current_col_size ==0) *lexical_stack=NULL; else { fix_quote((*lexical_stack)->content); ((cd*)*lexical_stack)->col_tag = QUOTE; } }
void go_down_level(void) { ccell * end; lexical_stack_height--; end = find_end(((cd *)lexical_stack[lexical_stack_height-1])->content); if(current_col_size == 0) end->car=NULL; else { fix_quote(lexical_stack[lexical_stack_height]->content); /* fixing occurs */ end->car=lexical_stack[lexical_stack_height];/* linking occurs */ if(lexical_stack[lexical_stack_height]->col_tag == QUOTE) pop(scope_stack); } current_col_size = 1; end->cdr=cons(NULL,NULL); current_node = end->cdr; lexical_stack =realloc(lexical_stack,sizeof(void*)*lexical_stack_height); }
str NCDFattach(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { mvc *m = NULL; sql_schema *sch = NULL; sql_table *tfiles = NULL, *tdims = NULL, *tvars = NULL, *tvardim = NULL, *tattrs = NULL; sql_column *col; str msg = MAL_SUCCEED; str fname = *(str*)getArgReference(stk, pci, 1); char buf[BUFSIZ], *s= buf; oid fid, rid = oid_nil; sql_trans *tr; int ncid; /* dataset id */ int ndims, nvars, ngatts, unlimdim; int didx, vidx, vndims, vnatts, i, aidx, coord_dim_id = -1; int vdims[NC_MAX_VAR_DIMS]; size_t dlen, alen; char dname[NC_MAX_NAME+1], vname[NC_MAX_NAME+1], aname[NC_MAX_NAME +1], abuf[80], *aval; char **dims = NULL; nc_type vtype, atype; /* == int */ int retval, avalint; float avalfl; double avaldbl; msg = getSQLContext(cntxt, mb, &m, NULL); if (msg) return msg; tr = m->session->tr; sch = mvc_bind_schema(m, "sys"); if ( !sch ) return createException(MAL, "netcdf.attach", "Cannot get schema sys\n"); tfiles = mvc_bind_table(m, sch, "netcdf_files"); tdims = mvc_bind_table(m, sch, "netcdf_dims"); tvars = mvc_bind_table(m, sch, "netcdf_vars"); tvardim = mvc_bind_table(m, sch, "netcdf_vardim"); tattrs = mvc_bind_table(m, sch, "netcdf_attrs"); if (tfiles == NULL || tdims == NULL || tvars == NULL || tvardim == NULL || tattrs == NULL) return createException(MAL, "netcdf.attach", "Catalog table missing\n"); /* check if the file is already attached */ col = mvc_bind_column(m, tfiles, "location"); rid = table_funcs.column_find_row(m->session->tr, col, fname, NULL); if (rid != oid_nil) return createException(SQL, "netcdf.attach", "File %s is already attached\n", fname); /* Open NetCDF file */ if ((retval = nc_open(fname, NC_NOWRITE, &ncid))) return createException(MAL, "netcdf.test", "Cannot open NetCDF \ file %s: %s", fname, nc_strerror(retval)); if ((retval = nc_inq(ncid, &ndims, &nvars, &ngatts, &unlimdim))) return createException(MAL, "netcdf.test", "Cannot read NetCDF \ header: %s", nc_strerror(retval)); /* Insert row into netcdf_files table */ col = mvc_bind_column(m, tfiles, "file_id"); fid = store_funcs.count_col(tr, col, 1) + 1; snprintf(buf, BUFSIZ, INSFILE, (int)fid, fname); if ( ( msg = SQLstatementIntern(cntxt, &s, "netcdf.attach", TRUE, FALSE, NULL)) != MAL_SUCCEED ) goto finish; /* Read dimensions from NetCDF header and insert a row for each one into netcdf_dims table */ dims = (char **)GDKzalloc(sizeof(char *) * ndims); for (didx = 0; didx < ndims; didx++){ if ((retval = nc_inq_dim(ncid, didx, dname, &dlen))) return createException(MAL, "netcdf.attach", "Cannot read dimension %d : %s", didx, nc_strerror(retval)); snprintf(buf, BUFSIZ, INSDIM, didx, (int)fid, dname, (int)dlen); if ( ( msg = SQLstatementIntern(cntxt, &s, "netcdf.attach", TRUE, FALSE, NULL)) != MAL_SUCCEED ) goto finish; dims[didx] = GDKstrdup(dname); } /* Read variables and attributes from the header and insert rows in netcdf_vars, netcdf_vardims, and netcdf_attrs tables */ for (vidx = 0; vidx < nvars; vidx++){ if ( (retval = nc_inq_var(ncid, vidx, vname, &vtype, &vndims, vdims, &vnatts))) return createException(MAL, "netcdf.attach", "Cannot read variable %d : %s", vidx, nc_strerror(retval)); /* Check if this is coordinate variable */ if ( (vndims == 1) && ( strcmp(vname, dims[vdims[0]]) == 0 )) coord_dim_id = vdims[0]; else coord_dim_id = -1; snprintf(buf, BUFSIZ, INSVAR, vidx, (int)fid, vname, prim_type_name(vtype), vndims, coord_dim_id); if ( ( msg = SQLstatementIntern(cntxt, &s, "netcdf.attach", TRUE, FALSE, NULL)) != MAL_SUCCEED ) goto finish; if ( coord_dim_id < 0 ){ for (i = 0; i < vndims; i++){ snprintf(buf, BUFSIZ, INSVARDIM, vidx, vdims[i], (int)fid, i); if ( ( msg = SQLstatementIntern(cntxt, &s, "netcdf.attach", TRUE, FALSE, NULL)) != MAL_SUCCEED ) goto finish; } } if ( vnatts > 0 ) { /* fill in netcdf_attrs table */ for (aidx = 0; aidx < vnatts; aidx++){ if ((retval = nc_inq_attname(ncid,vidx,aidx,aname))) return createException(MAL, "netcdf.attach", "Cannot read attribute %d of variable %d: %s", aidx, vidx, nc_strerror(retval)); if ((retval = nc_inq_att(ncid,vidx,aname,&atype,&alen))) return createException(MAL, "netcdf.attach", "Cannot read attribute %s type and length: %s", aname, nc_strerror(retval)); switch ( atype ) { case NC_CHAR: aval = (char *) GDKzalloc(alen + 1); if ((retval = nc_get_att_text(ncid,vidx,aname,aval))) return createException(MAL, "netcdf.attach", "Cannot read attribute %s value: %s", aname, nc_strerror(retval)); fix_quote(aval, alen); aval[alen] = '\0'; snprintf(buf, BUFSIZ, INSATTR, vname, aname, "string", aval, (int)fid, "root"); GDKfree(aval); break; case NC_INT: if ((retval = nc_get_att_int(ncid,vidx,aname,&avalint))) return createException(MAL, "netcdf.attach", "Cannot read attribute %s value: %s", aname, nc_strerror(retval)); snprintf(abuf,80,"%d",avalint); snprintf(buf, BUFSIZ, INSATTR, vname, aname, prim_type_name(atype), abuf, (int)fid, "root"); break; case NC_FLOAT: if ((retval = nc_get_att_float(ncid,vidx,aname,&avalfl))) return createException(MAL, "netcdf.attach", "Cannot read attribute %s value: %s", aname, nc_strerror(retval)); snprintf(abuf,80,"%7.2f",avalfl); snprintf(buf, BUFSIZ, INSATTR, vname, aname, prim_type_name(atype), abuf, (int)fid, "root"); break; case NC_DOUBLE: if ((retval = nc_get_att_double(ncid,vidx,aname,&avaldbl))) return createException(MAL, "netcdf.attach", "Cannot read attribute %s value: %s", aname, nc_strerror(retval)); snprintf(abuf,80,"%7.2e",avaldbl); snprintf(buf, BUFSIZ, INSATTR, vname, aname, prim_type_name(atype), abuf, (int)fid, "root"); break; default: continue; /* next attribute */ } printf("statement: '%s'\n", s); if ( ( msg = SQLstatementIntern(cntxt, &s, "netcdf.attach", TRUE, FALSE, NULL)) != MAL_SUCCEED ) goto finish; } /* attr loop */ } } /* var loop */ /* Extract global attributes */ for (aidx = 0; aidx < ngatts; aidx++){ if ((retval = nc_inq_attname(ncid,NC_GLOBAL,aidx,aname))) return createException(MAL, "netcdf.attach", "Cannot read global attribute %d: %s", aidx, nc_strerror(retval)); if ((retval = nc_inq_att(ncid,NC_GLOBAL,aname,&atype,&alen))) return createException(MAL, "netcdf.attach", "Cannot read global attribute %s type and length: %s", aname, nc_strerror(retval)); switch ( atype ) { case NC_CHAR: aval = (char *) GDKzalloc(alen + 1); if ((retval = nc_get_att_text(ncid,NC_GLOBAL,aname,aval))) return createException(MAL, "netcdf.attach", "Cannot read global attribute %s value: %s", aname, nc_strerror(retval)); fix_quote(aval, alen); aval[alen] = '\0'; snprintf(buf, BUFSIZ, INSATTR, "GLOBAL", aname, "string", aval, (int)fid, "root"); GDKfree(aval); break; case NC_INT: if ((retval = nc_get_att_int(ncid,NC_GLOBAL,aname,&avalint))) return createException(MAL, "netcdf.attach", "Cannot read global attribute %s of type %s : %s", aname, prim_type_name(atype), nc_strerror(retval)); snprintf(abuf,80,"%d",avalint); snprintf(buf, BUFSIZ, INSATTR, "GLOBAL", aname, prim_type_name(atype), abuf, (int)fid, "root"); break; case NC_FLOAT: if ((retval = nc_get_att_float(ncid,NC_GLOBAL,aname,&avalfl))) return createException(MAL, "netcdf.attach", "Cannot read global attribute %s of type %s: %s", aname, prim_type_name(atype), nc_strerror(retval)); snprintf(abuf,80,"%7.2f",avalfl); snprintf(buf, BUFSIZ, INSATTR, "GLOBAL", aname, prim_type_name(atype), abuf, (int)fid, "root"); break; case NC_DOUBLE: if ((retval = nc_get_att_double(ncid,NC_GLOBAL,aname,&avaldbl))) return createException(MAL, "netcdf.attach", "Cannot read global attribute %s value: %s", aname, nc_strerror(retval)); snprintf(abuf,80,"%7.2e",avaldbl); snprintf(buf, BUFSIZ, INSATTR, "GLOBAL", aname, prim_type_name(atype), abuf, (int)fid, "root"); break; default: continue; /* next attribute */ } printf("global: '%s'\n", s); if ( ( msg = SQLstatementIntern(cntxt, &s, "netcdf.attach", TRUE, FALSE, NULL)) != MAL_SUCCEED ) goto finish; } /* global attr loop */ finish: nc_close(ncid); if (dims != NULL ){ for (didx = 0; didx < ndims; didx++) GDKfree(dims[didx]); GDKfree(dims); } return msg; }