mirror of
https://github.com/Unidata/netcdf-c.git
synced 2025-03-19 17:30:27 +08:00
Fix NCF-247 bug, and add test for bug fix.
This commit is contained in:
parent
f17e7324c1
commit
6ebc98d254
@ -3001,7 +3001,7 @@ sync_netcdf4_file(NC_HDF5_FILE_INFO_T *h5)
|
||||
int bad_coord_order = 0; /* if detected, propagate to all groups to consistently store dimids */
|
||||
if ((retval = nc4_rec_write_types(h5->root_grp)))
|
||||
return retval;
|
||||
if ((retval = nc4_rec_detect_bad_coord_order(h5->root_grp, &bad_coord_order)))
|
||||
if ((retval = nc4_rec_detect_need_to_preserve_dimids(h5->root_grp, &bad_coord_order)))
|
||||
return retval;
|
||||
if ((retval = nc4_rec_write_metadata(h5->root_grp, bad_coord_order)))
|
||||
return retval;
|
||||
|
@ -2427,9 +2427,12 @@ write_dim(NC_DIM_INFO_T *dim, NC_GRP_INFO_T *grp, int write_dimid)
|
||||
|
||||
/* Recursively determine if there is a mismatch between order of
|
||||
* coordinate creation and associated dimensions in this group or any
|
||||
* subgroups, to find out if we have to handle that situation. */
|
||||
* subgroups, to find out if we have to handle that situation. Also
|
||||
* check if there are any multidimensional coordinate variables
|
||||
* defined, which require the same treatment to fix a potential bug
|
||||
* when such variables occur in subgroups. */
|
||||
int
|
||||
nc4_rec_detect_bad_coord_order(NC_GRP_INFO_T *grp, int *bad_coord_orderp)
|
||||
nc4_rec_detect_need_to_preserve_dimids(NC_GRP_INFO_T *grp, int *bad_coord_orderp)
|
||||
{
|
||||
NC_DIM_INFO_T *dim;
|
||||
NC_VAR_INFO_T *var;
|
||||
@ -2455,6 +2458,19 @@ nc4_rec_detect_bad_coord_order(NC_GRP_INFO_T *grp, int *bad_coord_orderp)
|
||||
}
|
||||
}
|
||||
|
||||
/* If there are multidimensional coordinate variables defined, then
|
||||
* it's also necessary to preserve dimension IDs when the file is
|
||||
* reopened ... */
|
||||
for (var = grp->var; var; var = var->next)
|
||||
{
|
||||
LOG((5, "checking %s for multidimensional coord var", var->name));
|
||||
if (var->ndims > 1 && var->dimscale)
|
||||
{
|
||||
*bad_coord_orderp = 1;
|
||||
return NC_NOERR;
|
||||
}
|
||||
}
|
||||
|
||||
/* Did the user define a dimension, end define mode, reenter define
|
||||
* mode, and then define a coordinate variable for that dimension?
|
||||
* If so, dimensions will be out of order. */
|
||||
@ -2470,7 +2486,7 @@ nc4_rec_detect_bad_coord_order(NC_GRP_INFO_T *grp, int *bad_coord_orderp)
|
||||
|
||||
/* If there are any child groups, check them also for this condition. */
|
||||
for (child_grp = grp->children; child_grp; child_grp = child_grp->next)
|
||||
if ((retval = nc4_rec_detect_bad_coord_order(child_grp, bad_coord_orderp)))
|
||||
if ((retval = nc4_rec_detect_need_to_preserve_dimids(child_grp, bad_coord_orderp)))
|
||||
return retval;
|
||||
|
||||
return NC_NOERR;
|
||||
|
@ -139,6 +139,46 @@ main(int argc, char **argv)
|
||||
if (nc_close(ncid)) ERR;
|
||||
}
|
||||
SUMMARIZE_ERR;
|
||||
printf("**** testing example from bug NCF-247, multidimensional coord variable in subgroup ...");
|
||||
{
|
||||
#define GRPNAME "g1"
|
||||
#define DIM0NAME "dim0"
|
||||
#define DIM1NAME "dim1"
|
||||
#define DIM2NAME "coord"
|
||||
#define DIM3NAME "dim3"
|
||||
#define VARNAME DIM2NAME
|
||||
#define VARRANK 2
|
||||
int ncid, grpid, varid, var_dims[VARRANK], var_dims_in[VARRANK];
|
||||
char name2[NC_MAX_NAME], name3[NC_MAX_NAME];
|
||||
int dim0_dim, dim1_dim, dim2_dim, dim3_dim;
|
||||
size_t dim0_len = 3, dim1_len = 2, dim2_len = 5, dim3_len = 7;
|
||||
|
||||
if (nc_create(FILE_NAME, NC_CLOBBER|NC_NETCDF4, &ncid)) ERR;
|
||||
if (nc_def_grp(ncid, GRPNAME, &grpid)) ERR;
|
||||
|
||||
if (nc_def_dim(ncid, DIM0NAME, dim0_len, &dim0_dim)) ERR;
|
||||
if (nc_def_dim(ncid, DIM1NAME, dim1_len, &dim1_dim)) ERR;
|
||||
if (nc_def_dim(grpid, DIM2NAME, dim2_len, &dim2_dim)) ERR;
|
||||
if (nc_def_dim(grpid, DIM3NAME, dim3_len, &dim3_dim)) ERR;
|
||||
|
||||
var_dims[0] = dim2_dim;
|
||||
var_dims[1] = dim3_dim;
|
||||
if (nc_def_var(grpid, VARNAME, NC_INT, VARRANK, var_dims, &varid)) ERR;
|
||||
|
||||
if (nc_close(ncid)) ERR;
|
||||
|
||||
if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
|
||||
|
||||
if (nc_inq_grp_ncid(ncid, GRPNAME, &grpid)) ERR;
|
||||
|
||||
if (nc_inq_varid(grpid, VARNAME, &varid)) ERR;
|
||||
if (nc_inq_vardimid(grpid, varid, var_dims_in)) ERR;
|
||||
if (nc_inq_dimname(grpid, var_dims_in[0], name2)) ERR;
|
||||
if (nc_inq_dimname(grpid, var_dims_in[1], name3)) ERR;
|
||||
if (strcmp(name2, DIM2NAME) != 0 || strcmp(name3, DIM3NAME) != 0) ERR;
|
||||
if (nc_close(ncid)) ERR;
|
||||
}
|
||||
SUMMARIZE_ERR;
|
||||
FINAL_RESULTS;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user