diff options
-rw-r--r-- | src/H5Odtype.c | 4 | ||||
-rw-r--r-- | src/H5T.c | 8 | ||||
-rw-r--r-- | src/H5Tcommit.c | 15 | ||||
-rw-r--r-- | test/dtypes.c | 203 |
4 files changed, 226 insertions, 4 deletions
diff --git a/src/H5Odtype.c b/src/H5Odtype.c index 88403ea..c2015c0 100644 --- a/src/H5Odtype.c +++ b/src/H5Odtype.c @@ -1111,7 +1111,9 @@ H5O_dtype_get_share(H5F_t UNUSED *f, const void *_mesg, assert (sh); if (H5F_addr_defined (dt->ent.header)) { - assert (H5T_STATE_NAMED==dt->state || H5T_STATE_OPEN==dt->state); + if(H5T_STATE_NAMED!=dt->state && H5T_STATE_OPEN!=dt->state && H5T_STATE_TRANSIENT!=dt->state) + HGOTO_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "datatype state is not valid"); + sh->in_gh = FALSE; sh->u.ent = dt->ent; } else @@ -2744,6 +2744,14 @@ H5T_open (H5G_entry_t *loc, const char *name, hid_t dxpl_id) if ((dt=H5T_open_oid(&ent, dxpl_id)) ==NULL) HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, NULL, "not found"); + /* Mark any datatypes as being in memory now */ + if (H5T_vlen_mark(dt, NULL, H5T_VLEN_MEMORY)<0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "invalid datatype location") + + /* Unlock data type */ + if (H5T_lock (dt, FALSE)<0) + HGOTO_ERROR (H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to lock transient data type") + /* Set return value */ ret_value=dt; diff --git a/src/H5Tcommit.c b/src/H5Tcommit.c index f43d8d8..37363b5 100644 --- a/src/H5Tcommit.c +++ b/src/H5Tcommit.c @@ -139,13 +139,17 @@ H5T_commit (H5G_entry_t *loc, const char *name, H5T_t *type, hid_t dxpl_id) if (H5T_STATE_IMMUTABLE==type->state) HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "data type is immutable"); + /* Find the insertion file */ + if (NULL==(file=H5G_insertion_file(loc, name, dxpl_id))) + HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to find insertion point"); + /* Check for a "sensible" datatype to store on disk */ if(H5T_is_sensible(type)!=TRUE) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "datatype is not sensible"); - /* Find the insertion file */ - if (NULL==(file=H5G_insertion_file(loc, name, dxpl_id))) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to find insertion point"); + /* Mark datatype as being on disk now */ + if (H5T_vlen_mark(type, file, H5T_VLEN_DISK)<0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "invalid VL location"); /* * Create the object header and open it for write access. Insert the data @@ -159,6 +163,11 @@ H5T_commit (H5G_entry_t *loc, const char *name, H5T_t *type, hid_t dxpl_id) HGOTO_ERROR (H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to name data type"); type->state = H5T_STATE_OPEN; + /* Mark datatype as being on memory now because this datatype may be still used in + * memory after committed to disk. So we need to change its size back. */ + if (H5T_vlen_mark(type, NULL, H5T_VLEN_MEMORY)<0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "cannot mark datatype in memory") + done: if (ret_value<0) { if ((type->state==H5T_STATE_TRANSIENT || type->state==H5T_STATE_RDONLY) && H5F_addr_defined(type->ent.header)) { diff --git a/test/dtypes.c b/test/dtypes.c index 18b837c..5f899e9 100644 --- a/test/dtypes.c +++ b/test/dtypes.c @@ -60,6 +60,7 @@ const char *FILENAME[] = { "dtypes1", "dtypes2", "dtypes3", + "dtypes4", NULL }; @@ -1424,6 +1425,207 @@ test_compound_8(void) /*------------------------------------------------------------------------- + * Function: test_compound_9 + * + * Purpose: Tests compound data type with VL string as field. + * + * Return: Success: 0 + * + * Failure: number of errors + * + * Programmer: Raymond Lu + * Wednesday, June 9, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static int +test_compound_9(void) +{ + typedef struct cmpd_struct { + int i1; + const char* str; + int i2; + } cmpd_struct; + + cmpd_struct wdata = {11, "variable-length string", 22}; + cmpd_struct rdata; + hid_t file; + hid_t cmpd_tid, str_id, dup_tid; + hid_t space_id; + hid_t dset_id; + hsize_t dim1[1]; + char filename[1024]; + + TESTING("compound data type with VL string"); + + /* Create File */ + h5_fixname(FILENAME[3], H5P_DEFAULT, filename, sizeof filename); + if((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0) { + H5_FAILED(); AT(); + printf("Can't create file!\n"); + goto error; + } /* end if */ + + /* Create first compound datatype */ + if((cmpd_tid = H5Tcreate( H5T_COMPOUND, sizeof(struct cmpd_struct)))<0) { + H5_FAILED(); AT(); + printf("Can't create datatype!\n"); + goto error; + } /* end if */ + + if(H5Tinsert(cmpd_tid,"i1",HOFFSET(struct cmpd_struct,i1),H5T_NATIVE_INT)<0) { + H5_FAILED(); AT(); + printf("Can't insert field 'i1'\n"); + goto error; + } /* end if */ + + str_id = H5Tcopy(H5T_C_S1); + if(H5Tset_size(str_id,H5T_VARIABLE)<0) { + H5_FAILED(); AT(); + printf("Can't set size for VL string\n"); + goto error; + } /* end if */ + + if(H5Tinsert(cmpd_tid,"vl_string",HOFFSET(cmpd_struct,str),str_id)<0) { + H5_FAILED(); AT(); + printf("Can't insert field 'i1'\n"); + goto error; + } /* end if */ + + if(H5Tinsert(cmpd_tid,"i2",HOFFSET(struct cmpd_struct,i2),H5T_NATIVE_INT)<0) { + H5_FAILED(); AT(); + printf("Can't insert field 'i2'\n"); + goto error; + } /* end if */ + + if(H5Tcommit(file,"compound",cmpd_tid)<0) { + H5_FAILED(); AT(); + printf("Can't commit datatype\n"); + goto error; + } /* end if */ + + if(H5Tclose(cmpd_tid)<0) { + H5_FAILED(); AT(); + printf("Can't close datatype\n"); + goto error; + } /* end if */ + + if((cmpd_tid = H5Topen(file, "compound"))<0) { + H5_FAILED(); AT(); + printf("Can't open datatype\n"); + goto error; + } /* end if */ + + if((dup_tid = H5Tcopy(cmpd_tid))<0) { + H5_FAILED(); AT(); + printf("Can't copy datatype\n"); + goto error; + } /* end if */ + + dim1[0] = 1; + if((space_id=H5Screate_simple(1,dim1,NULL))<0) { + H5_FAILED(); AT(); + printf("Can't create space\n"); + goto error; + } /* end if */ + + if((dset_id = H5Dcreate(file,"Dataset",dup_tid,space_id,H5P_DEFAULT))<0) { + H5_FAILED(); AT(); + printf("Can't create dataset\n"); + goto error; + } /* end if */ + + if(H5Dwrite(dset_id,dup_tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,&wdata)<0) { + H5_FAILED(); AT(); + printf("Can't write data\n"); + goto error; + } /* end if */ + + if(H5Dread(dset_id,dup_tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,&rdata)<0) { + H5_FAILED(); AT(); + printf("Can't read data\n"); + goto error; + } /* end if */ + + if(rdata.i1!=wdata.i1 || rdata.i2!=wdata.i2 || strcmp(rdata.str, wdata.str)) { + H5_FAILED(); AT(); + printf("incorrect read data\n"); + goto error; + } /* end if */ + + if(H5Dclose(dset_id)<0) + goto error; + if(H5Tclose(cmpd_tid)<0) + goto error; + /*if(H5Tclose(dup_tid)<0) + goto error;*/ + if(H5Tclose(str_id)<0) + goto error; + if(H5Sclose(space_id)<0) + goto error; + if(H5Fclose(file)<0) + goto error; + + + if((file=H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT))<0) { + H5_FAILED(); AT(); + printf("cannot open file\n"); + goto error; + } /* end if */ + + if((dset_id = H5Dopen(file, "Dataset"))<0) { + H5_FAILED(); AT(); + printf("cannot open dataset\n"); + goto error; + } /* end if */ + + if((cmpd_tid = H5Dget_type(dset_id))<0) { + H5_FAILED(); AT(); + printf("cannot open dataset\n"); + goto error; + } /* end if */ + + if((dup_tid = H5Tcopy(cmpd_tid))<0) { + H5_FAILED(); AT(); + printf("Can't copy datatype\n"); + goto error; + } /* end if */ + + rdata.i1 = rdata.i2 = 0; + free(rdata.str); + + if(H5Dread(dset_id,dup_tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,&rdata)<0) { + H5_FAILED(); AT(); + printf("Can't read data\n"); + goto error; + } /* end if */ + + if(rdata.i1!=wdata.i1 || rdata.i2!=wdata.i2 || strcmp(rdata.str, wdata.str)) { + H5_FAILED(); AT(); + printf("incorrect read data\n"); + goto error; + } /* end if */ + + if(H5Dclose(dset_id)<0) + goto error; + if(H5Tclose(cmpd_tid)<0) + goto error; + if(H5Tclose(dup_tid)<0) + goto error; + if(H5Fclose(file)<0) + goto error; + + PASSED(); + return 0; + + error: + return 1; +} + + +/*------------------------------------------------------------------------- * Function: test_query * * Purpose: Tests query functions of compound and enumeration types. @@ -4679,6 +4881,7 @@ main(void) nerrors += test_compound_6(); nerrors += test_compound_7(); nerrors += test_compound_8(); + nerrors += test_compound_9(); nerrors += test_conv_int (); nerrors += test_conv_enum_1(); nerrors += test_conv_enum_2(); |