summaryrefslogtreecommitdiffstats
path: root/examples/h5dsm_tvlen.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/h5dsm_tvlen.c')
-rw-r--r--examples/h5dsm_tvlen.c342
1 files changed, 342 insertions, 0 deletions
diff --git a/examples/h5dsm_tvlen.c b/examples/h5dsm_tvlen.c
new file mode 100644
index 0000000..ffe4933
--- /dev/null
+++ b/examples/h5dsm_tvlen.c
@@ -0,0 +1,342 @@
+#include "h5dsm_example.h"
+#include <time.h>
+
+#define FILE_NAME "tvlen.h5"
+#define NITER 10
+
+hbool_t verbose_g = 1;
+
+static void print_vla(const hvl_t *vla) {
+ int i, j, k;
+
+ for(i = 0; i < 4; i++) {
+ for(j = 0; j < 2; j++) {
+ if(j > 0)
+ printf(", ");
+ printf("{");
+ for(k = 0; k < (int)vla[2 * i + j].len; k++) {
+ if(k > 0)
+ printf(", ");
+ printf("%d", ((int *)vla[2 * i + j].p)[k]);
+ } /* end for */
+ printf("}");
+ } /* end for */
+ printf("\n");
+ } /* end for */
+
+ return;
+} /* end print_vla() */
+
+static int check_vla(const hvl_t *vla1, const hvl_t *vla2) {
+ int i, j, k;
+
+ for(i = 0; i < 4; i++)
+ for(j = 0; j < 2; j++) {
+ if(vla1[2 * i + j].len != vla2[2 * i + j].len)
+ PRINTF_ERROR("vlen array length at location %d, %d does not match", i, j);
+ for(k = 0; k < (int)vla1[2 * i + j].len; k++)
+ if(((int *)vla1[2 * i + j].p)[k] != ((int *)vla2[2 * i + j].p)[k])
+ PRINTF_ERROR("vlen array data at location %d, %d, %d does not match", i, j, k);
+ } /* end for */
+
+ return 0;
+
+error:
+ return -1;
+} /* end check_vla() */
+
+static void print_vls(char **vls) {
+ int i, j;
+
+ for(i = 0; i < 4; i++) {
+ for(j = 0; j < 2; j++) {
+ if(j > 0)
+ printf(", ");
+ if(vls[2 * i + j])
+ printf("\"%s\"", vls[2 * i + j]);
+ else
+ printf("NULL");
+ } /* end for */
+ printf("\n");
+ } /* end for */
+
+ return;
+} /* end print_vls() */
+
+static int check_vls(char **vls1, char **vls2) {
+ int i, j;
+
+ for(i = 0; i < 4; i++)
+ for(j = 0; j < 2; j++) {
+ if((vls1[2 * i + j] == NULL) != (vls2[2 * i + j] == NULL))
+ PRINTF_ERROR("one vlen string at location %d, %d is NULL and the other is not", i, j);
+ if(vls1[2 * i + j] && strcmp(vls1[2 * i + j], vls2[2 * i + j]))
+ PRINTF_ERROR("vlen strings at location %d, %d do not match", i, j);
+ } /* end for */
+
+ return 0;
+
+error:
+ return -1;
+} /* end check_vls() */
+
+int main(int argc, char *argv[]) {
+ uuid_t pool_uuid;
+ char *pool_grp = NULL;
+ hid_t file = -1, dset_vla = -1, dset_vls = -1, attr_vla = -1, attr_vls = -1, space = -1, fapl = -1;
+ hid_t type_vla = -1, type_vls = -1;
+ hsize_t dims[2] = {4, 2};
+ int static_buf_vla[4][2][8];
+ char static_buf_vls[4][2][8];
+ hvl_t rbuf_vla[4][2];
+ char *rbuf_vls[4][2];
+ hvl_t wbuf_vla[4][2];
+ char *wbuf_vls[4][2];
+ int bogus_int = -1;
+ char bogus_str[3] = {'-', '1', '\0'};
+ const hvl_t rbuf_vla_init[4][2] = {{{1, &bogus_int}, {1, &bogus_int}},
+ {{1, &bogus_int}, {1, &bogus_int}},
+ {{1, &bogus_int}, {1, &bogus_int}},
+ {{1, &bogus_int}, {1, &bogus_int}}};
+ char * const rbuf_vls_init[4][2] = {{bogus_str, bogus_str},
+ {bogus_str, bogus_str},
+ {bogus_str, bogus_str},
+ {bogus_str, bogus_str}};
+ const hvl_t wbuf_vla_init[4][2] = {{{0, &static_buf_vla[0][0][0]}, {0, &static_buf_vla[0][1][0]}},
+ {{0, &static_buf_vla[1][0][0]}, {0, &static_buf_vla[1][1][0]}},
+ {{0, &static_buf_vla[2][0][0]}, {0, &static_buf_vla[2][1][0]}},
+ {{0, &static_buf_vla[3][0][0]}, {1, &static_buf_vla[3][1][0]}}};
+ char * const wbuf_vls_init[4][2] = {{&static_buf_vls[0][0][0], &static_buf_vls[0][1][0]},
+ {&static_buf_vls[1][0][0], &static_buf_vls[1][1][0]},
+ {&static_buf_vls[2][0][0], &static_buf_vls[2][1][0]},
+ {&static_buf_vls[3][0][0], &static_buf_vls[3][1][0]}};
+ int i, j, k, l;
+
+ (void)MPI_Init(&argc, &argv);
+
+ /* Seed random number generator */
+ srand(time(NULL));
+
+ if((argc != 2) && (argc != 3))
+ PRINTF_ERROR("argc must be 2 or 3\n");
+
+ if(argc == 3)
+ verbose_g = 0;
+
+ /* Parse UUID */
+ if(0 != uuid_parse(argv[1], pool_uuid))
+ ERROR;
+
+ /* Initialize VOL */
+ if(H5VLdaosm_init(MPI_COMM_WORLD, pool_uuid, pool_grp) < 0)
+ ERROR;
+
+ /* Set up FAPL */
+ if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+ ERROR;
+ if(H5Pset_fapl_daosm(fapl, MPI_COMM_WORLD, MPI_INFO_NULL) < 0)
+ ERROR;
+ if(H5Pset_all_coll_metadata_ops(fapl, true) < 0)
+ ERROR;
+
+ /* Create file */
+ if((file = H5Fcreate(FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+ ERROR;
+
+ /* Set up dataspace */
+ if((space = H5Screate_simple(2, dims, NULL)) < 0)
+ ERROR;
+
+ /*
+ * Set up types
+ */
+ /* Create variable length array */
+ /* Set up file "all" type */
+ if((type_vla = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
+ ERROR;
+
+ /* Set up variable length string type */
+ if((type_vls = H5Tcopy(H5T_C_S1)) < 0)
+ ERROR;
+ if(H5Tset_size(type_vls, H5T_VARIABLE) < 0)
+ ERROR;
+
+ /*
+ * Create objects
+ */
+ /* Create vla dataset */
+ if((dset_vla = H5Dcreate2(file, "vla_dset", type_vla, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ ERROR;
+
+ /* Create vls dataset */
+ if((dset_vls = H5Dcreate2(file, "vls_dset", type_vls, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ ERROR;
+
+ /* Create vla attribute */
+ if((attr_vla = H5Acreate2(dset_vla, "vla_attr", type_vla, space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ ERROR;
+
+ /* Create vls attribute */
+ if((attr_vls = H5Acreate2(dset_vla, "vls_attr", type_vls, space, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+ ERROR;
+
+ /*
+ * Test attribute
+ */
+ /* Loop over iterations */
+ for(i = 0; i < NITER; i++) {
+ /*
+ * Variable length array attribute test
+ */
+ /* Fill write data buffer */
+ for(j = 0; j < dims[0]; j++)
+ for(k = 0; k < dims[1]; k++)
+ for(l = 0; l < (sizeof(static_buf_vla[0][0]) / sizeof(static_buf_vla[0][0][0])); l++)
+ static_buf_vla[j][k][l] = rand() % 100;
+
+ /* Fill write buffer */
+ memcpy(wbuf_vla, wbuf_vla_init, sizeof(wbuf_vla));
+ for(j = 0; j < dims[0]; j++)
+ for(k = 0; k < dims[1]; k++) {
+ /* 10% chance of having a NULL sequence */
+ if(rand() % 10)
+ wbuf_vla[j][k].len = rand() % 9;
+ else {
+ wbuf_vla[j][k].len = 0;
+ wbuf_vla[j][k].p = NULL;
+ } /* end if */
+ } /* end for */
+
+ /* Print message */
+ if(verbose_g) {
+ printf("Writing attribute with variable length arrays. buf =\n");
+ print_vla(wbuf_vla[0]);
+ } /* end if */
+
+ /* Write data */
+ if(H5Awrite(attr_vla, type_vla, wbuf_vla) < 0)
+ ERROR;
+
+ /* Read data */
+ memcpy(rbuf_vla, rbuf_vla_init, sizeof(rbuf_vla));
+ if(H5Aread(attr_vla, type_vla, rbuf_vla) < 0)
+ ERROR;
+
+ /* Print message */
+ if(verbose_g) {
+ printf("Read attribute with variable length arrays. buf =\n");
+ print_vla(rbuf_vla[0]);
+ } /* end if */
+
+ /* Check buffer */
+ if(check_vla(wbuf_vla[0], rbuf_vla[0]) < 0) {
+ (void)H5Dvlen_reclaim(type_vla, space, H5P_DEFAULT, rbuf_vla);
+ ERROR;
+ } /* end if */
+
+ /* Reclaim read buffer */
+ if(H5Dvlen_reclaim(type_vla, space, H5P_DEFAULT, rbuf_vla) < 0)
+ ERROR;
+
+ if(verbose_g)
+ printf("\n");
+
+ /*
+ * Variable length string attribute test
+ */
+ /* Fill write data buffer */
+ for(j = 0; j < dims[0]; j++)
+ for(k = 0; k < dims[1]; k++)
+ for(l = 0; l < (sizeof(static_buf_vls[0][0]) / sizeof(static_buf_vls[0][0][0])); l++)
+ static_buf_vls[j][k][l] = 'a' + rand() % 26;
+
+ /* Fill write buffer */
+ memcpy(wbuf_vls, wbuf_vls_init, sizeof(wbuf_vls));
+ for(j = 0; j < dims[0]; j++)
+ for(k = 0; k < dims[1]; k++) {
+ /* 10% chance of having a NULL sequence */
+ if(rand() % 10)
+ static_buf_vls[j][k][rand() % 8] = '\0';
+ else
+ wbuf_vls[j][k] = NULL;
+ } /* end for */
+
+ /* Print message */
+ if(verbose_g) {
+ printf("Writing attribute with variable length strings. buf =\n");
+ print_vls(wbuf_vls[0]);
+ } /* end if */
+
+ /* Write data */
+ if(H5Awrite(attr_vls, type_vls, wbuf_vls) < 0)
+ ERROR;
+
+ /* Read data */
+ memcpy(rbuf_vls, rbuf_vls_init, sizeof(rbuf_vls));
+ if(H5Aread(attr_vls, type_vls, rbuf_vls) < 0)
+ ERROR;
+
+ /* Print message */
+ if(verbose_g) {
+ printf("Read attribute with variable length strings. buf =\n");
+ print_vls(rbuf_vls[0]);
+ } /* end if */
+
+ /* Check buffer */
+ if(check_vls(wbuf_vls[0], rbuf_vls[0]) < 0) {
+ (void)H5Dvlen_reclaim(type_vls, space, H5P_DEFAULT, rbuf_vls);
+ ERROR;
+ } /* end if */
+
+ /* Reclaim read buffer */
+ if(H5Dvlen_reclaim(type_vls, space, H5P_DEFAULT, rbuf_vls) < 0)
+ ERROR;
+
+ if(verbose_g)
+ printf("\n");
+ } /* end for */
+
+ /*
+ * Close
+ */
+ if(H5Aclose(attr_vla) < 0)
+ ERROR;
+ if(H5Aclose(attr_vls) < 0)
+ ERROR;
+ if(H5Dclose(dset_vla) < 0)
+ ERROR;
+ if(H5Dclose(dset_vls) < 0)
+ ERROR;
+ if(H5Fclose(file) < 0)
+ ERROR;
+ if(H5Tclose(type_vla) < 0)
+ ERROR;
+ if(H5Tclose(type_vls) < 0)
+ ERROR;
+ if(H5Sclose(space) < 0)
+ ERROR;
+ if(H5Pclose(fapl) < 0)
+ ERROR;
+
+ printf("Success\n");
+
+ (void)MPI_Finalize();
+ return 0;
+
+error:
+ H5E_BEGIN_TRY {
+ H5Aclose(attr_vla);
+ H5Aclose(attr_vls);
+ H5Dclose(dset_vla);
+ H5Dclose(dset_vls);
+ H5Fclose(file);
+ H5Tclose(type_vla);
+ H5Tclose(type_vls);
+ H5Sclose(space);
+ H5Pclose(fapl);
+ } H5E_END_TRY;
+
+ (void)MPI_Finalize();
+ return 1;
+}
+