diff options
author | Pedro Vicente Nunes <pvn@hdfgroup.org> | 2008-12-29 20:36:34 (GMT) |
---|---|---|
committer | Pedro Vicente Nunes <pvn@hdfgroup.org> | 2008-12-29 20:36:34 (GMT) |
commit | 75951cfcf8fe9e5d8f9a7785828285eaddc0c3ae (patch) | |
tree | 443c8af14a5c4914859d7223e8f15be382484280 | |
parent | f9f462e720c03e3b73cfa5b9fb4f190212e50546 (diff) | |
download | hdf5-75951cfcf8fe9e5d8f9a7785828285eaddc0c3ae.zip hdf5-75951cfcf8fe9e5d8f9a7785828285eaddc0c3ae.tar.gz hdf5-75951cfcf8fe9e5d8f9a7785828285eaddc0c3ae.tar.bz2 |
[svn-r16223] Modified H5Dset_extent so that it fails when called for compact datasets and contiguous with no external storage
new test program: It adds tests for several ranks, use of fill value or not, compression, different fill value allocation times, use of different storage layouts, and external files
tested: windows, linux
-rw-r--r-- | src/H5Dint.c | 14 | ||||
-rw-r--r-- | test/set_extent.c | 1852 |
2 files changed, 1707 insertions, 159 deletions
diff --git a/src/H5Dint.c b/src/H5Dint.c index 3018108..221d448 100644 --- a/src/H5Dint.c +++ b/src/H5Dint.c @@ -2294,6 +2294,20 @@ H5D_set_extent(H5D_t *dset, const hsize_t *size, hid_t dxpl_id) if(0 == (H5F_INTENT(dset->oloc.file) & H5F_ACC_RDWR)) HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "no write intent on file") + /* Check if we are allowed to modify the space; only datasets with chunked and external storage are allowed to be modified */ + if( H5D_COMPACT == dset->shared->layout.type ) + { + HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "dataset has compact storage") + } + if( H5D_CONTIGUOUS == dset->shared->layout.type ) + { + if( 0 == dset->shared->dcpl_cache.efl.nused) + { + HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "dataset has contiguous storage") + } + + } + /* Check if the filters in the DCPL will need to encode, and if so, can they? */ if(H5D_check_filters(dset) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't apply filters") diff --git a/test/set_extent.c b/test/set_extent.c index 1523015..d680371 100644 --- a/test/set_extent.c +++ b/test/set_extent.c @@ -21,12 +21,10 @@ */ #if 0 -#define H5_SET_EXTENT_DEBUG +#define H5_SET_EXTENT_DEBUG4 #endif -#if 0 -#define H5_SET_EXTENT_DEBUG2 -#endif + #include "hdf5.h" @@ -34,23 +32,45 @@ /*------------------------------------------------------------------------- * - * Tests the function H5Dset_extent. In the current version of the library - * the dataset MUST be chunked. + * Tests the function H5Dset_extent. * *------------------------------------------------------------------------- */ -#define RANK 2 +#define RANK1 1 +#define RANK2 2 +#define RANK3 3 #define DIM0 4 #define DIM1 4 +#define DIM2 4 #define DIMS0 2 #define DIMS1 2 +#define DIMS2 2 #define DIME0 7 #define DIME1 7 +#define DIME2 7 #define ISTORE_IK 64 +static int do_ranks( void ); +static int do_layouts( void ); + +static int test_rank1( hbool_t do_compress, + hbool_t do_fill_value, + hbool_t set_istore_k, + H5D_fill_time_t fill_time); +static int test_rank2( hbool_t do_compress, + hbool_t do_fill_value, + hbool_t set_istore_k, + H5D_fill_time_t fill_time); +static int test_rank3( hbool_t do_compress, + hbool_t do_fill_value, + hbool_t set_istore_k, + H5D_fill_time_t fill_time); + +static int test_external( void ); +static int test_layouts( H5D_layout_t layout ); + -static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_k); /*------------------------------------------------------------------------- @@ -61,19 +81,77 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ int main( void ) { + if ( do_ranks() < 0 ) + { + goto error; + } + + if ( test_external() < 0 ) + { + goto error; + } + + if ( do_layouts() < 0 ) + { + goto error; + } + + + puts("All set_extent tests passed."); + return 0; + + +error: + + + H5_FAILED(); + return 1; +} + + + +/*------------------------------------------------------------------------- +* test with several ranks +*------------------------------------------------------------------------- +*/ +static int do_ranks( void ) +{ + hbool_t do_compress = 0; hbool_t do_fillvalue = 0; hbool_t set_istore_k = 0; - + TESTING("with fill value, no compression"); do_fillvalue = 1; - if (test( do_compress, do_fillvalue, set_istore_k ) < 0) + if (test_rank1( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_ALLOC ) < 0) + { + goto error; + } + if (test_rank1( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_IFSET ) < 0) { goto error; - } + } + if (test_rank2( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_ALLOC ) < 0) + { + goto error; + } + if (test_rank2( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_IFSET ) < 0) + { + goto error; + } + if (test_rank3( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_ALLOC ) < 0) + { + goto error; + } + if (test_rank3( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_IFSET ) < 0) + { + goto error; + } + + PASSED(); @@ -82,10 +160,19 @@ int main( void ) do_fillvalue = 0; - if (test( do_compress, do_fillvalue, set_istore_k ) < 0) + if (test_rank1( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_ERROR ) < 0) { goto error; } + if (test_rank2( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_ERROR ) < 0) + { + goto error; + } + if (test_rank3( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_ERROR ) < 0) + { + goto error; + } + PASSED(); @@ -95,10 +182,29 @@ int main( void ) #ifdef H5_HAVE_FILTER_DEFLATE do_compress = 1; - do_fillvalue = 1; - if (test( do_compress, do_fillvalue, set_istore_k ) < 0) + if (test_rank1( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_ALLOC ) < 0) + { + goto error; + } + if (test_rank1( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_IFSET ) < 0) + { + goto error; + } + if (test_rank2( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_ALLOC ) < 0) + { + goto error; + } + if (test_rank2( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_IFSET ) < 0) + { + goto error; + } + if (test_rank3( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_ALLOC ) < 0) + { + goto error; + } + if (test_rank3( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_IFSET ) < 0) { goto error; } @@ -115,7 +221,15 @@ int main( void ) do_fillvalue = 0; - if (test( do_compress, do_fillvalue, set_istore_k ) < 0) + if (test_rank1( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_ERROR ) < 0) + { + goto error; + } + if (test_rank2( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_ERROR ) < 0) + { + goto error; + } + if (test_rank3( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_ERROR ) < 0) { goto error; } @@ -130,7 +244,7 @@ int main( void ) do_fillvalue = 1; set_istore_k = 1; - if (test( do_compress, do_fillvalue, set_istore_k ) < 0) + if (test_rank2( do_compress, do_fillvalue, set_istore_k, H5D_FILL_TIME_ALLOC ) < 0) { goto error; } @@ -139,7 +253,6 @@ int main( void ) PASSED(); - puts("All set_extent tests passed."); return 0; @@ -148,30 +261,61 @@ error: H5_FAILED(); - return 1; + return -1; } +/*------------------------------------------------------------------------- +* test with different storage layouts +*------------------------------------------------------------------------- +*/ +static int do_layouts( void ) +{ + + TESTING("storage layout use"); + + if (test_layouts( H5D_COMPACT ) < 0) + { + goto error; + } + + if (test_layouts( H5D_CONTIGUOUS ) < 0) + { + goto error; + } + + PASSED(); + + return 0; + +error: + H5_FAILED(); + return -1; +} + /*------------------------------------------------------------------------- - * test + * test usage with a 2D rank *------------------------------------------------------------------------- */ -static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_k) +static int test_rank2( hbool_t do_compress, + hbool_t do_fill_value, + hbool_t set_istore_k, + H5D_fill_time_t fill_time) { - hid_t fid; + hid_t fid; hid_t did; hid_t sid; hid_t dcpl; hid_t fcpl; - hsize_t dims_o[RANK] = {DIM0,DIM1}; - hsize_t dims_s[RANK] = {DIMS0,DIMS1}; - hsize_t dims_e[RANK] = {DIME0,DIME1}; - hsize_t dims_c[RANK] = {2,2}; - hsize_t dims_r[RANK]; - hsize_t maxdims[RANK] = {H5S_UNLIMITED,H5S_UNLIMITED}; + hsize_t dims_o[RANK2] = {DIM0,DIM1}; /* original dimensions */ + hsize_t dims_s[RANK2] = {DIMS0,DIMS1}; /* shrinking dimensions */ + hsize_t dims_e[RANK2] = {DIME0,DIME1}; /* extended dimensions */ + hsize_t dims_c[RANK2] = {2,2}; /* chunk dimensions */ + hsize_t dims_r[RANK2]; /* read dimensions */ + hsize_t maxdims[RANK2] = {H5S_UNLIMITED,H5S_UNLIMITED}; int buf_o[DIM0][DIM1]; int buf_s[DIMS0][DIMS1]; int buf_e[DIME0][DIME1]; @@ -189,7 +333,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ comp_value = 0; } - + for( i = 0; i < DIM0; i++ ) { for( j = 0; j < DIM1; j++ ) @@ -226,7 +370,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ } /* create the data space with unlimited dimensions. */ - if ((sid = H5Screate_simple(RANK, dims_o, maxdims)) < 0) + if ((sid = H5Screate_simple(RANK2, dims_o, maxdims)) < 0) { goto error; } @@ -236,7 +380,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ { goto error; } - if (H5Pset_chunk(dcpl, RANK, dims_c) < 0) + if (H5Pset_chunk(dcpl, RANK2, dims_c) < 0) { goto error; } @@ -246,6 +390,11 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ { goto error; } + + if(H5Pset_fill_time(dcpl, fill_time) < 0) + { + goto error; + } } else { @@ -256,7 +405,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ } } - if(do_compress) + if (do_compress) { if(H5Pset_deflate(dcpl, 9) < 0) { @@ -264,11 +413,15 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ } } - - /*------------------------------------------------------------------------- - * create and write one dataset - * data is + * Procedure 1 + * a. Write an array AxB. These are the dimensions for creating the dataset + * b. Define a greater array CxD where C > A and D > B + * c. Read data back + * d. Verify if new dimensions are C and D + * e. Verify if data from A to C and B to D is what it is to be expected + * + * original data is * * 2 2 2 2 * 2 2 2 2 @@ -291,7 +444,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ } -#if defined (H5_SET_EXTENT_DEBUG) +#if defined (H5_SET_EXTENT_DEBUG2) printf("\n"); for (i = 0; i < (int)dims_o[0]; i++ ) { @@ -350,7 +503,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ /* check dimensions */ - for( i = 0; i < RANK; i++ ) + for( i = 0; i < RANK2; i++ ) { if (dims_r[i] != dims_e[i]) goto error; @@ -362,7 +515,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ -#if defined (H5_SET_EXTENT_DEBUG) +#if defined (H5_SET_EXTENT_DEBUG2) printf("\n"); for (i = 0; i < (int)dims_r[0]; i++ ) { @@ -382,7 +535,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ { for (j = 0; j < (int)dims_r[1]; j++ ) { - if (i >= DIM0 || j >= DIM1) + if ( i >= DIM0 || j >= DIM1 ) { if(buf_e[i][j] != comp_value) { @@ -400,70 +553,16 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ } + + /*------------------------------------------------------------------------- - * write to the expanded array. fill the space with fill value with other value - * data is now, extended space was written * - * 2 2 2 2 2 2 2 - * 2 2 2 2 2 2 2 - * 2 2 2 2 2 2 2 - * 2 2 2 2 2 2 2 - * 2 2 2 2 2 2 2 - * 2 2 2 2 2 2 2 - * 2 2 2 2 2 2 2 + * Procedure 2 + * a. Define a smaller array ExF where E < A and F < B + * b. Read data back + * c. Verify if new dimensions are E and F + * d. Verify if data up until E and F is what to be expected * - *------------------------------------------------------------------------- - */ - - for( i = 0; i < DIME0; i++ ) - { - for( j = 0; j < DIME1; j++ ) - { - buf_e[i][j] = 2; - } - } - - /* get the space */ - if ((sid = H5Dget_space(did)) < 0) - { - goto error; - } - - /* write */ - if (H5Dwrite(did , H5T_NATIVE_INT, sid, H5S_ALL, H5P_DEFAULT, buf_e) < 0) - { - goto error; - } - - /* read */ - if (H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_e) < 0) - goto error; - - - /* close space */ - if (H5Sclose(sid) < 0) - { - goto error; - } - - -#if defined (H5_SET_EXTENT_DEBUG) - printf("\n"); - for (i = 0; i < (int)dims_r[0]; i++ ) - { - for (j = 0; j < (int)dims_r[1]; j++ ) - { - printf("%d ", buf_e[i][j]); - } - printf("\n"); - } -#endif - - - - - /*------------------------------------------------------------------------- - * set new dimensions for the array; shrink it * data is now * * 2 2 @@ -496,7 +595,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ } /* check dimensions */ - for( i = 0; i < RANK; i++ ) + for( i = 0; i < RANK2; i++ ) { if (dims_r[i] != dims_s[i]) goto error; @@ -543,7 +642,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ goto error; } -#if defined (H5_SET_EXTENT_DEBUG) +#if defined (H5_SET_EXTENT_DEBUG2) printf("\n"); for (i = 0; i < (int)dims_r[0]; i++ ) { @@ -565,7 +664,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ { if ( buf_s[i][j] != buf_o[i][j] ) { - printf("buf_r[%d][%d] = %d\n", i, j, buf_r[i][j]); + printf("buf_s[%d][%d] = %d\n", i, j, buf_s[i][j]); printf("buf_o[%d][%d] = %d\n", i, j, buf_o[i][j]); goto error; } @@ -604,7 +703,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ } /* check dimensions */ - for( i = 0; i < RANK; i++ ) + for( i = 0; i < RANK2; i++ ) { if (dims_r[i] != dims_o[i]) goto error; @@ -620,7 +719,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ if (H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_r) < 0) goto error; -#if defined (H5_SET_EXTENT_DEBUG) +#if defined (H5_SET_EXTENT_DEBUG2) printf("\n"); for (i = 0; i < (int)dims_r[0]; i++ ) { @@ -672,29 +771,703 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ } + + + + /*------------------------------------------------------------------------- + * test a dataset with non initialized chunks + *------------------------------------------------------------------------- + */ + + + if ((sid = H5Screate_simple(RANK2, dims_o, maxdims)) < 0) + { + goto error; + } + if ((did = H5Dcreate2(fid , "dset3", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) + { + goto error; + } + /* set new dimensions for the array */ + dims_o[ 0 ] = 0; + dims_o[ 1 ] = 0; + if (H5Dset_extent( did , dims_o ) < 0) + { + goto error; + } + + + + if (H5Dclose(did) < 0) + { + goto error; + } + if (H5Sclose(sid) < 0) + { + goto error; + } + + + + + /*------------------------------------------------------------------------- + * close property list + *------------------------------------------------------------------------- + */ + + + if (H5Pclose(dcpl) < 0) + { + goto error; + } + + if (H5Fclose( fid ) < 0) + { + goto error; + } + + + return 0; + + + +error: + + H5E_BEGIN_TRY + { + H5Dclose( did ); + H5Sclose( sid ); + H5Pclose( dcpl ); + H5Pclose( fcpl ); + H5Fclose( fid ); + } H5E_END_TRY; + return -1; + +} + +/*------------------------------------------------------------------------- + * test usage with a 1D rank + *------------------------------------------------------------------------- + */ + +static int test_rank1( hbool_t do_compress, + hbool_t do_fill_value, + hbool_t set_istore_k, + H5D_fill_time_t fill_time) +{ + + hid_t fid; + hid_t did; + hid_t sid; + hid_t dcpl; + hid_t fcpl; + hsize_t dims_o[RANK1] = {DIM0}; /* original dimensions */ + hsize_t dims_s[RANK1] = {DIMS0}; /* shrinking dimensions */ + hsize_t dims_e[RANK1] = {DIME0}; /* extended dimensions */ + hsize_t dims_c[RANK1] = {2}; /* chunk dimensions */ + hsize_t dims_r[RANK1]; /* read dimensions */ + hsize_t maxdims[RANK1] = {H5S_UNLIMITED}; + int buf_o[DIM0]; + int buf_s[DIMS0]; + int buf_e[DIME0]; + int buf_r[DIM0]; + int i; + int fillvalue = 1; + int comp_value; + + if ( do_fill_value ) + { + comp_value = fillvalue; + } + else + { + comp_value = 0; + } + + + for( i = 0; i < DIM0; i++ ) + { + + buf_o[i] = 2; + } + + /* create a file creation property list */ + if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) + { + goto error; + } + + if ( set_istore_k ) + { + /* set non-default indexed storage B-tree internal 'K' value */ + if (H5Pset_istore_k(fcpl,ISTORE_IK) < 0) + { + goto error; + } + + } + /* create a new file */ + if ((fid = H5Fcreate("set_extent1.h5", H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0) + { + goto error; + } + + /* close property list */ + if(H5Pclose(fcpl) < 0) + { + goto error; + } + + /* create the data space with unlimited dimensions. */ + if ((sid = H5Screate_simple(RANK1, dims_o, maxdims)) < 0) + { + goto error; + } + + /* modify dataset creation properties, i.e. enable chunking. */ + if ((dcpl = H5Pcreate (H5P_DATASET_CREATE)) < 0) + { + goto error; + } + if (H5Pset_chunk(dcpl, RANK1, dims_c) < 0) + { + goto error; + } + if ( do_fill_value ) + { + if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillvalue) < 0) + { + goto error; + } + + if(H5Pset_fill_time(dcpl, fill_time) < 0) + { + goto error; + } + } + else + { + + if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC) < 0) + { + goto error; + } + + } + if (do_compress) + { + if(H5Pset_deflate(dcpl, 9) < 0) + { + goto error; + } + } + + /*------------------------------------------------------------------------- + * create, write dataset + *------------------------------------------------------------------------- + */ + + /* create a dataset */ + if ((did = H5Dcreate2(fid , "dset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) + { + goto error; + } + + /* write */ + if (H5Dwrite(did , H5T_NATIVE_INT, sid, H5S_ALL, H5P_DEFAULT, buf_o) < 0) + { + goto error; + } + + +#if defined (H5_SET_EXTENT_DEBUG) + printf("\n"); + for (i = 0; i < (int)dims_o[0]; i++ ) + { + + printf("%d ", buf_o[i]); + + } + printf("\n"); +#endif + + + if (H5Sclose(sid) < 0) + { + goto error; + } + + /*------------------------------------------------------------------------- + * set new dimensions for the array; expand it + *------------------------------------------------------------------------- + */ + + /* set new dimensions for the array. */ + if (H5Dset_extent(did , dims_e) < 0) + { + goto error; + } + + /* get the space */ + if ((sid = H5Dget_space(did)) < 0) + { + goto error; + } + + /* get dimensions */ + if (H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0) + { + goto error; + } + + if (H5Sclose(sid) < 0) + { + goto error; + } + + + /* check dimensions */ + for( i = 0; i < RANK1; i++ ) + { + if (dims_r[i] != dims_e[i]) + goto error; + } + + /* read */ + if (H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_e) < 0) + goto error; + + +#if defined (H5_SET_EXTENT_DEBUG) + printf("\n"); + for (i = 0; i < (int)dims_r[0]; i++ ) + { + + printf("%d ", buf_e[i]); + + } + printf("\n"); +#endif - /*------------------------------------------------------------------------- - * create and write one dataset - * data is - * - * 2 2 2 2 - * 2 2 2 2 - * 2 2 2 2 - * 2 2 2 2 + + + + /* compare the read array with the expanded array */ + for (i = 0; i < (int)dims_r[0]; i++ ) + { + + if ( i >= DIM0 ) + { + if(buf_e[i] != comp_value) + { + printf("buf_e[%d] = %d\n", i, buf_e[i]); + printf("value = %d\n", comp_value); + goto error; + } + } + else + { + if(buf_e[i] != buf_o[i]) + goto error; + } + } + + + + + /*------------------------------------------------------------------------- + * shrink * *------------------------------------------------------------------------- */ + + /* set new dimensions for the array. */ + if (H5Dset_extent(did , dims_s) < 0) + { + goto error; + } + + /* get the space */ + if ((sid = H5Dget_space(did)) < 0) + { + goto error; + } + + /* get dimensions */ + if (H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0) + { + goto error; + } + + if (H5Sclose(sid) < 0) + { + goto error; + } + + /* check dimensions */ + for( i = 0; i < RANK1; i++ ) + { + if (dims_r[i] != dims_s[i]) + goto error; + } + + + + /* for this case we close and reopen file */ + if ( set_istore_k ) + { + + if (H5Dclose(did) < 0) + { + goto error; + } + if (H5Fclose(fid) < 0) + { + goto error; + } + + if ((fid = H5Fopen( "set_extent1.h5", H5F_ACC_RDWR, H5P_DEFAULT ))<0) + { + goto error; + } + + if ((did = H5Dopen2( fid , "dset1", H5P_DEFAULT ))<0) + { + goto error; + } + + + + } + + + /*------------------------------------------------------------------------- + * read + *------------------------------------------------------------------------- + */ + + /* read */ + if (H5Dread( did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_s ) < 0) + { + goto error; + } + +#if defined (H5_SET_EXTENT_DEBUG) + printf("\n"); + for (i = 0; i < (int)dims_r[0]; i++ ) + { + + printf("%d ", buf_s[i]); + } + printf("\n"); + +#endif + + + + /* compare the read array with the shrinked array */ + for( i = 0; i < (int)dims_r[0]; i++ ) + { + + if ( buf_s[i] != buf_o[i] ) + { + printf("buf_s[%d] = %d\n", i, buf_s[i]); + printf("buf_o[%d] = %d\n", i, buf_o[i]); + goto error; + } + } + + + /*------------------------------------------------------------------------- + * expand it back to original size + *------------------------------------------------------------------------- + */ + + /* set new dimensions for the array */ + if (H5Dset_extent(did, dims_o) < 0) + { + goto error; + } + + /* get the space */ + if ((sid = H5Dget_space(did)) < 0) + { + goto error; + } + + /* get dimensions. */ + if (H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0) + { + goto error; + } + + /* check dimensions */ + for( i = 0; i < RANK1; i++ ) + { + if (dims_r[i] != dims_o[i]) + goto error; + } + + + /* read */ + if (H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_r) < 0) + goto error; + +#if defined (H5_SET_EXTENT_DEBUG) + printf("\n"); + for (i = 0; i < (int)dims_r[0]; i++ ) + { + + printf("%d ", buf_r[i]); + + } + printf("\n"); +#endif + + + + /* compare the read array with the original array */ + for (i = 0; i < (int)dims_r[0]; i++ ) + { + + if (i >= DIMS0 ) + { + if(buf_r[i] != comp_value) + { + printf("buf_r[%d] = %d\n", i, buf_r[i] ); + printf("value = %d\n", comp_value); + goto error; + } + } + else + { + if(buf_r[i] != buf_o[i]) + goto error; + } + } + + + /*------------------------------------------------------------------------- + * close dataset and space + *------------------------------------------------------------------------- + */ + + if (H5Dclose(did) < 0) + { + goto error; + } + if (H5Sclose(sid) < 0) + { + goto error; + } + + + + + + /*------------------------------------------------------------------------- + * test a dataset with non initialized chunks + *------------------------------------------------------------------------- + */ + + + if ((sid = H5Screate_simple(RANK1, dims_o, maxdims)) < 0) + { + goto error; + } + if ((did = H5Dcreate2(fid , "dset3", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) + { + goto error; + } + /* set new dimensions for the array */ + dims_o[ 0 ] = 0; + if (H5Dset_extent( did , dims_o ) < 0) + { + goto error; + } + + + + if (H5Dclose(did) < 0) + { + goto error; + } + if (H5Sclose(sid) < 0) + { + goto error; + } + + + + + /*------------------------------------------------------------------------- + * close property list + *------------------------------------------------------------------------- + */ + + + if (H5Pclose(dcpl) < 0) + { + goto error; + } + + if (H5Fclose( fid ) < 0) + { + goto error; + } + + + return 0; + + + +error: + + H5E_BEGIN_TRY + { + H5Dclose( did ); + H5Sclose( sid ); + H5Pclose( dcpl ); + H5Pclose( fcpl ); + H5Fclose( fid ); + } H5E_END_TRY; + return -1; + +} + + +/*------------------------------------------------------------------------- + * test usage with a 3D rank + *------------------------------------------------------------------------- + */ + +static int test_rank3( hbool_t do_compress, + hbool_t do_fill_value, + hbool_t set_istore_k, + H5D_fill_time_t fill_time) +{ + + hid_t fid; + hid_t did; + hid_t sid; + hid_t dcpl; + hid_t fcpl; + hsize_t dims_o[RANK3] = {DIM0,DIM1,DIM2}; /* original dimensions */ + hsize_t dims_s[RANK3] = {DIMS0,DIMS1,DIMS2}; /* shrinking dimensions */ + hsize_t dims_e[RANK3] = {DIME0,DIME1,DIME2}; /* extended dimensions */ + hsize_t dims_c[RANK3] = {2,2,2}; /* chunk dimensions */ + hsize_t dims_r[RANK3]; /* read dimensions */ + hsize_t maxdims[RANK3] = {H5S_UNLIMITED,H5S_UNLIMITED,H5S_UNLIMITED}; + int buf_o[DIM0][DIM1][DIM2]; + int buf_s[DIMS0][DIMS1][DIMS2]; + int buf_e[DIME0][DIME1][DIME2]; + int buf_r[DIM0][DIM1][DIM2]; + int i, j, k; + int fillvalue = 1; + int comp_value; + + if ( do_fill_value ) + { + comp_value = fillvalue; + } + else + { + comp_value = 0; + } + + + for( i = 0; i < DIM0; i++ ) + { + for( j = 0; j < DIM1; j++ ) + { + for( k = 0; k < DIM2; k++ ) + { + buf_o[i][j][k] = 2; + } + } + } + + /* create a file creation property list */ + if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) + { + goto error; + } + + if ( set_istore_k ) + { + /* set non-default indexed storage B-tree internal 'K' value */ + if (H5Pset_istore_k(fcpl,ISTORE_IK) < 0) + { + goto error; + } + + } + /* create a new file */ + if ((fid = H5Fcreate("set_extent1.h5", H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0) + { + goto error; + } + + /* close property list */ + if(H5Pclose(fcpl) < 0) + { + goto error; + } + /* create the data space with unlimited dimensions. */ - if ((sid = H5Screate_simple(RANK, dims_o, maxdims)) < 0) + if ((sid = H5Screate_simple(RANK3, dims_o, maxdims)) < 0) { goto error; } + /* modify dataset creation properties, i.e. enable chunking. */ + if ((dcpl = H5Pcreate (H5P_DATASET_CREATE)) < 0) + { + goto error; + } + if (H5Pset_chunk(dcpl, RANK3, dims_c) < 0) + { + goto error; + } + if ( do_fill_value ) + { + if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillvalue) < 0) + { + goto error; + } + + if(H5Pset_fill_time(dcpl, fill_time) < 0) + { + goto error; + } + } + else + { + + if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC) < 0) + { + goto error; + } + + } + if (do_compress) + { + if(H5Pset_deflate(dcpl, 9) < 0) + { + goto error; + } + } + + /*------------------------------------------------------------------------- + * create, write array + *------------------------------------------------------------------------- + */ + /* create a dataset */ - if ((did = H5Dcreate2(fid , "dset2", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) + if ((did = H5Dcreate2(fid , "dset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) { goto error; } @@ -706,16 +1479,22 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ } -#if defined (H5_SET_EXTENT_DEBUG2) +#if defined (H5_SET_EXTENT_DEBUG3) printf("\n"); for (i = 0; i < (int)dims_o[0]; i++ ) { for (j = 0; j < (int)dims_o[1]; j++ ) { - printf("%d ", buf_o[i][j]); + for( k = 0; k < (int)dims_o[2]; k++ ) + { + printf("%d ", buf_o[i][j][k]); + } + printf("[%d] ", j); } printf("\n"); + } + printf("\n"); #endif @@ -724,15 +1503,101 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ { goto error; } + + /*------------------------------------------------------------------------- + * set new dimensions for the array; expand it + * + *------------------------------------------------------------------------- + */ + + /* set new dimensions for the array. */ + if (H5Dset_extent(did , dims_e) < 0) + { + goto error; + } + + /* get the space */ + if ((sid = H5Dget_space(did)) < 0) + { + goto error; + } + + /* get dimensions */ + if (H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0) + { + goto error; + } + + if (H5Sclose(sid) < 0) + { + goto error; + } + + + /* check dimensions */ + for( i = 0; i < RANK3; i++ ) + { + if (dims_r[i] != dims_e[i]) + goto error; + } + + /* read */ + if (H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_e) < 0) + goto error; + + +#if defined (H5_SET_EXTENT_DEBUG3) + printf("\n"); + for (i = 0; i < (int)dims_r[0]; i++ ) + { + for (j = 0; j < (int)dims_r[1]; j++ ) + { + for( k = 0; k < (int)dims_r[2]; k++ ) + { + printf("%d ", buf_e[i][j][k]); + } + printf("[%d] ", j); + } + printf("\n"); + + } + printf("\n"); +#endif - /*------------------------------------------------------------------------- - * set new dimensions for the array; shrink it - * data is now - * - * 2 2 - * 2 2 - * + + + + /* compare the read array with the expanded array */ + for (i = 0; i < (int)dims_r[0]; i++ ) + { + for (j = 0; j < (int)dims_r[1]; j++ ) + { + for( k = 0; k < (int)dims_r[2]; k++ ) + { + if ( i >= DIM0 || j >= DIM1 || k >= DIM2 ) + { + if(buf_e[i][j][k] != comp_value) + { + printf("buf_e[%d][%d][%d] = %d\n", i, j, k, buf_e[i][j][k] ); + printf("value = %d\n", comp_value); + goto error; + } + } + else + { + if(buf_e[i][j][k] != buf_o[i][j][k] ) + goto error; + } + } + } + } + + + + + /*------------------------------------------------------------------------- + * shrink *------------------------------------------------------------------------- */ @@ -760,11 +1625,40 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ } /* check dimensions */ - for( i = 0; i < RANK; i++ ) + for( i = 0; i < RANK3; i++ ) { if (dims_r[i] != dims_s[i]) goto error; } + + + + /* for this case we close and reopen file */ + if ( set_istore_k ) + { + + if (H5Dclose(did) < 0) + { + goto error; + } + if (H5Fclose(fid) < 0) + { + goto error; + } + + if ((fid = H5Fopen( "set_extent1.h5", H5F_ACC_RDWR, H5P_DEFAULT ))<0) + { + goto error; + } + + if ((did = H5Dopen2( fid , "dset1", H5P_DEFAULT ))<0) + { + goto error; + } + + + + } /*------------------------------------------------------------------------- @@ -778,16 +1672,22 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ goto error; } -#if defined (H5_SET_EXTENT_DEBUG2) +#if defined (H5_SET_EXTENT_DEBUG3) printf("\n"); for (i = 0; i < (int)dims_r[0]; i++ ) { for (j = 0; j < (int)dims_r[1]; j++ ) { - printf("%d ", buf_s[i][j]); + for( k = 0; k < (int)dims_r[2]; k++ ) + { + printf("%d ", buf_s[i][j][k]); + } + printf("[%d] ", j); } printf("\n"); + } + printf("\n"); #endif @@ -798,25 +1698,21 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ { for( j = 0; j < (int)dims_r[1]; j++ ) { - if ( buf_s[i][j] != buf_o[i][j] ) + for( k = 0; k < (int)dims_r[2]; k++ ) { - printf("buf_r[%d][%d] = %d\n", i, j, buf_r[i][j]); - printf("buf_o[%d][%d] = %d\n", i, j, buf_o[i][j]); - goto error; - } + if ( buf_s[i][j][k] != buf_o[i][j][k] ) + { + printf("buf_s[%d][%d][%d] = %d\n", i, j, k, buf_s[i][j][k] ); + printf("buf_o[%d][%d][%d] = %d\n", i, j, k, buf_o[i][j][k] ); + goto error; + } + } } } /*------------------------------------------------------------------------- * set new dimensions for the array; expand it back to original size - * data is now, extended space was initialized with fill value or default value - * - * 2 2 1 1 - * 2 2 1 1 - * 1 1 1 1 - * 1 1 1 1 - * *------------------------------------------------------------------------- */ @@ -839,32 +1735,33 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ } /* check dimensions */ - for( i = 0; i < RANK; i++ ) + for( i = 0; i < RANK3; i++ ) { if (dims_r[i] != dims_o[i]) goto error; } - - /*------------------------------------------------------------------------- - * read - *------------------------------------------------------------------------- - */ - /* read */ if (H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_r) < 0) goto error; -#if defined (H5_SET_EXTENT_DEBUG2) +#if defined (H5_SET_EXTENT_DEBUG3) printf("\n"); for (i = 0; i < (int)dims_r[0]; i++ ) { for (j = 0; j < (int)dims_r[1]; j++ ) { - printf("%d ", buf_r[i][j]); + for( k = 0; k < (int)dims_r[2]; k++ ) + { + + printf("%d ", buf_r[i][j][k]); + } + printf("[%d] ", j); } printf("\n"); + } + printf("\n"); #endif @@ -874,19 +1771,22 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ { for (j = 0; j < (int)dims_r[1]; j++ ) { - if (i >= DIMS0 || j >= DIMS1) + for( k = 0; k < (int)dims_r[2]; k++ ) { - if(buf_r[i][j] != comp_value) + if (i >= DIMS0 || j >= DIMS1 || k >= DIMS2 ) { - printf("buf_r[%d][%d] = %d\n", i, j, buf_r[i][j]); - printf("value = %d\n", comp_value); - goto error; + if( buf_r[i][j][k] != comp_value ) + { + printf("buf_r[%d][%d][%d] = %d\n", i, j, k, buf_r[i][j][k] ); + printf("value = %d\n", comp_value); + goto error; + } } - } - else - { - if(buf_r[i][j] != buf_o[i][j]) - goto error; + else + { + if(buf_r[i][j][k] != buf_o[i][j][k]) + goto error; + } } } } @@ -907,13 +1807,16 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ } + + + /*------------------------------------------------------------------------- * test a dataset with non initialized chunks *------------------------------------------------------------------------- */ - if ((sid = H5Screate_simple(RANK, dims_o, maxdims)) < 0) + if ((sid = H5Screate_simple(RANK3, dims_o, maxdims)) < 0) { goto error; } @@ -924,6 +1827,7 @@ static int test( hbool_t do_compress, hbool_t do_fill_value, hbool_t set_istore_ /* set new dimensions for the array */ dims_o[ 0 ] = 0; dims_o[ 1 ] = 0; + dims_o[ 2 ] = 0; if (H5Dset_extent( did , dims_o ) < 0) { goto error; @@ -979,5 +1883,635 @@ error: } +/*------------------------------------------------------------------------- + * test usage with external storage + *------------------------------------------------------------------------- + */ +static int test_external() +{ + + hid_t fid; + hid_t did; + hid_t sid; + hid_t dcpl; + hsize_t dims_o[RANK2] = {DIM0,DIM1}; /* original dimensions */ + hsize_t dims_s[RANK2] = {DIMS0,DIMS1}; /* shrinking dimensions */ + hsize_t dims_e[RANK2] = {DIME0,DIM1}; /* extended dimensions, dimension 1 is the original */ + hsize_t dims_c[RANK2] = {2,2}; /* chunk dimensions */ + hsize_t dims_r[RANK2]; /* read dimensions */ + hsize_t maxdims[RANK2] = {DIME0,DIM1}; /* only the first dimension can be extendible */ + int buf_o[DIM0][DIM1]; /* original buffer, for writing */ + int buf_s[DIMS0][DIMS1]; /* shrinked buffer, for reading */ + int buf_e[DIME0][DIM1]; /* extended buffer, for writing, dimension 1 is the original */ + int buf_ro[DIM0][DIM1]; /* original buffer for reading */ + int i, j; + int comp_value = 0; + + + hsize_t size; /* number of bytes reserved in the file for the data */ + hsize_t max_size[2]; + + max_size[0] = dims_e[0]; + max_size[1] = dims_e[1]; + size = max_size[0] * max_size[1] * sizeof(int) / 2; + + + for( i = 0; i < DIM0; i++ ) + { + for( j = 0; j < DIM1; j++ ) + { + buf_o[i][j] = 2; + } + } + + TESTING("external file use"); + + /* create a new file */ + if ((fid = H5Fcreate("set_extent2.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + { + goto error; + } + + /* modify dataset creation properties */ + if ((dcpl = H5Pcreate (H5P_DATASET_CREATE)) < 0) + { + goto error; + } + + if(H5Pset_external(dcpl, "ext1.bin", (off_t)0, size) < 0) + { + goto error; + } + + if(H5Pset_external(dcpl, "ext2.bin", (off_t)0, size) < 0) + { + goto error; + } + + { + + char name[256]; /*external file name */ + off_t file_offset; /*external file offset */ + hsize_t file_size; /*sizeof external file segment */ + + if(H5Pget_external(dcpl, 0, sizeof(name), name, &file_offset, + &file_size) < 0) goto error; + + } + + + + /*------------------------------------------------------------------------- + * Write an array AxB. These are the dimensions for creating the dataset + * + * original data is + * + * 2 2 2 2 + * 2 2 2 2 + * 2 2 2 2 + * 2 2 2 2 + * + *------------------------------------------------------------------------- + */ + + + /* create the data space with unlimited dimensions. */ + if ((sid = H5Screate_simple(RANK2, dims_o, maxdims)) < 0) + { + goto error; + } + if ((did = H5Dcreate2(fid , "dset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) + { + goto error; + } + if (H5Dwrite(did , H5T_NATIVE_INT, sid, H5S_ALL, H5P_DEFAULT, buf_o) < 0) + { + goto error; + } + if (H5Sclose(sid) < 0) + { + goto error; + } + + + /*------------------------------------------------------------------------- + * read + *------------------------------------------------------------------------- + */ + + /* read */ + if (H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_ro) < 0) + goto error; + +#if defined (H5_SET_EXTENT_DEBUG) + printf("\n"); + for (i = 0; i < (int)dims_o[0]; i++ ) + { + for (j = 0; j < (int)dims_o[1]; j++ ) + { + printf("%d ", buf_ro[i][j]); + } + printf("\n"); + } +#endif + + + + /*------------------------------------------------------------------------- + * expand + *------------------------------------------------------------------------- + */ + + /*------------------------------------------------------------------------- + * set new dimensions for the array; expand it + * data is now, extended space was initialized with default value + * + * 2 2 2 2 + * 2 2 2 2 + * 2 2 2 2 + * 2 2 2 2 + * 0 0 0 0 + * 0 0 0 0 + * 0 0 0 0 + * + *------------------------------------------------------------------------- + */ + + /* set new dimensions for the array. */ + if (H5Dset_extent(did , dims_e) < 0) + { + goto error; + } + + /* get the space */ + if ((sid = H5Dget_space(did)) < 0) + { + goto error; + } + + /* get dimensions */ + if (H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0) + { + goto error; + } + + if (H5Sclose(sid) < 0) + { + goto error; + } + + + /* check dimensions */ + for( i = 0; i < RANK2; i++ ) + { + if (dims_r[i] != dims_e[i]) + goto error; + } + + /* read */ + if (H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_e) < 0) + goto error; + + + +#if defined (H5_SET_EXTENT_DEBUG) + printf("\n"); + for (i = 0; i < (int)dims_r[0]; i++ ) + { + for (j = 0; j < (int)dims_r[1]; j++ ) + { + printf("%d ", buf_e[i][j]); + } + printf("\n"); + } +#endif + + + + + /* compare the read array with the expanded array */ + for (i = 0; i < (int)dims_r[0]; i++ ) + { + for (j = 0; j < (int)dims_r[1]; j++ ) + { + if ( i >= DIM0 || j >= DIM1 ) + { + if(buf_e[i][j] != comp_value) + { + printf("buf_e[%d][%d] = %d\n", i, j, buf_e[i][j]); + printf("value = %d\n", comp_value); + goto error; + } + } + else + { + if(buf_e[i][j] != buf_o[i][j]) + goto error; + } + } + } + + + + /*------------------------------------------------------------------------- + * shrink + * + * data is now + * + * 2 2 + * 2 2 + * + *------------------------------------------------------------------------- + */ + + /* set new dimensions for the array. */ + if (H5Dset_extent(did , dims_s) < 0) + { + goto error; + } + + /* get the space */ + if ((sid = H5Dget_space(did)) < 0) + { + goto error; + } + + /* get dimensions */ + if (H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0) + { + goto error; + } + + if (H5Sclose(sid) < 0) + { + goto error; + } + + /* check dimensions */ + for( i = 0; i < RANK2; i++ ) + { + if (dims_r[i] != dims_s[i]) + goto error; + } + + + + + /*------------------------------------------------------------------------- + * read + *------------------------------------------------------------------------- + */ + + /* read */ + if (H5Dread( did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_s ) < 0) + { + goto error; + } + +#if defined (H5_SET_EXTENT_DEBUG) + printf("\n"); + for (i = 0; i < (int)dims_r[0]; i++ ) + { + for (j = 0; j < (int)dims_r[1]; j++ ) + { + printf("%d ", buf_s[i][j]); + } + printf("\n"); + } +#endif + + + + + /* compare the read array with the shrinked array */ + for( i = 0; i < (int)dims_r[0]; i++ ) + { + for( j = 0; j < (int)dims_r[1]; j++ ) + { + if ( buf_s[i][j] != buf_o[i][j] ) + { + printf("buf_s[%d][%d] = %d\n", i, j, buf_s[i][j]); + printf("buf_o[%d][%d] = %d\n", i, j, buf_o[i][j]); + goto error; + } + } + } + + + /*------------------------------------------------------------------------- + * negative test + * try to extend dimension above maximum + *------------------------------------------------------------------------- + */ + + + dims_e[1] = DIME1; + + + H5E_BEGIN_TRY + { + + + /* set new dimensions for the array. */ + if (H5Dset_extent(did , dims_e) == SUCCEED) + { + goto error; + } + + } H5E_END_TRY; + + + + /*------------------------------------------------------------------------- + * close property list + *------------------------------------------------------------------------- + */ + + + if (H5Pclose(dcpl) < 0) + { + goto error; + } + + if (H5Fclose( fid ) < 0) + { + goto error; + } + + PASSED(); + + + return 0; + + + +error: + + H5E_BEGIN_TRY + { + H5Dclose( did ); + H5Sclose( sid ); + H5Pclose( dcpl ); + H5Fclose( fid ); + } H5E_END_TRY; + return -1; + +} + + +/*------------------------------------------------------------------------- + * test usage with layouts compact and contiguous + *------------------------------------------------------------------------- + */ +static int test_layouts( H5D_layout_t layout ) +{ + + hid_t fid; + hid_t did; + hid_t sid; + hid_t dcpl; + hsize_t dims_o[RANK2] = {DIM0,DIM1}; /* original dimensions */ + hsize_t dims_s[RANK2] = {DIMS0,DIMS1}; /* shrinking dimensions */ + hsize_t dims_e[RANK2] = {DIME0,DIME1}; /* extended dimensions */ + hsize_t dims_c[RANK2] = {2,2}; /* chunk dimensions */ + hsize_t dims_r[RANK2]; /* read dimensions */ + int buf_o[DIM0][DIM1]; + int buf_r[DIM0][DIM1]; + int i, j; + + for( i = 0; i < DIM0; i++ ) + { + for( j = 0; j < DIM1; j++ ) + { + buf_o[i][j] = 2; + } + } + + + /* create a new file */ + if ((fid = H5Fcreate("set_extent3.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + { + goto error; + } + + /* create the data space with unlimited dimensions. */ + if ((sid = H5Screate_simple(RANK2, dims_o, NULL)) < 0) + { + goto error; + } + + /* modify dataset creation properties */ + if ((dcpl = H5Pcreate (H5P_DATASET_CREATE)) < 0) + { + goto error; + } + + if (H5Pset_layout (dcpl, layout) < 0) + { + goto error; + } + + /* create a dataset */ + if ((did = H5Dcreate2(fid , "dset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) + { + goto error; + } + + /* write */ + if (H5Dwrite(did , H5T_NATIVE_INT, sid, H5S_ALL, H5P_DEFAULT, buf_o) < 0) + { + goto error; + } + + +#if defined (H5_SET_EXTENT_DEBUG4) + printf("\n"); + for (i = 0; i < (int)dims_o[0]; i++ ) + { + for (j = 0; j < (int)dims_o[1]; j++ ) + { + printf("%d ", buf_o[i][j]); + } + printf("\n"); + } +#endif + + + + if (H5Sclose(sid) < 0) + { + goto error; + } + + /*------------------------------------------------------------------------- + * negative test + * try to extend dimension + *------------------------------------------------------------------------- + */ + + H5E_BEGIN_TRY + { + + if (H5Dset_extent(did , dims_e) == SUCCEED) + { + goto error; + } + + } H5E_END_TRY; + + + + + /* get the space */ + if ((sid = H5Dget_space(did)) < 0) + { + goto error; + } + + /* get dimensions */ + if (H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0) + { + goto error; + } + + if (H5Sclose(sid) < 0) + { + goto error; + } + + + /* check dimensions */ + for( i = 0; i < RANK2; i++ ) + { + if (dims_r[i] != dims_o[i]) + goto error; + } + + /* read */ + if (H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_r) < 0) + goto error; + + + +#if defined (H5_SET_EXTENT_DEBUG4) + printf("\n"); + for (i = 0; i < (int)dims_r[0]; i++ ) + { + for (j = 0; j < (int)dims_r[1]; j++ ) + { + printf("%d ", buf_r[i][j]); + } + printf("\n"); + } +#endif + + + + /*------------------------------------------------------------------------- + * negative test + * try to shrink dimension + *------------------------------------------------------------------------- + */ + + H5E_BEGIN_TRY + { + + if (H5Dset_extent(did , dims_s) == SUCCEED) + { + goto error; + } + + } H5E_END_TRY; + + + /* get the space */ + if ((sid = H5Dget_space(did)) < 0) + { + goto error; + } + + /* get dimensions */ + if (H5Sget_simple_extent_dims(sid, dims_r, NULL) < 0) + { + goto error; + } + + if (H5Sclose(sid) < 0) + { + goto error; + } + + /* check dimensions */ + for( i = 0; i < RANK2; i++ ) + { + if (dims_r[i] != dims_o[i]) + goto error; + } + + + /*------------------------------------------------------------------------- + * read + *------------------------------------------------------------------------- + */ + + /* read */ + if (H5Dread( did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_r ) < 0) + { + goto error; + } + +#if defined (H5_SET_EXTENT_DEBUG4) + printf("\n"); + for (i = 0; i < (int)dims_r[0]; i++ ) + { + for (j = 0; j < (int)dims_r[1]; j++ ) + { + printf("%d ", buf_r[i][j]); + } + printf("\n"); + } +#endif + + + + /*------------------------------------------------------------------------- + * close + *------------------------------------------------------------------------- + */ + + if (H5Dclose(did) < 0) + { + goto error; + } + + if (H5Pclose(dcpl) < 0) + { + goto error; + } + + if (H5Fclose( fid ) < 0) + { + goto error; + } + + + return 0; + + + +error: + + H5E_BEGIN_TRY + { + H5Dclose( did ); + H5Sclose( sid ); + H5Pclose( dcpl ); + H5Fclose( fid ); + } H5E_END_TRY; + return -1; + +} + + |