[svn-r29269] Purpose: Improve Packet Table library

Description:
    The Packet Table API used to have fixed-length and variable-length functions
    (i.e., H5PTcreate_fl and H5PTcreate_vl), but in 2006, the vlen functions
    were ifdef'ed out with VLPT_REMOVED, see HDFFV-442. The majority of this
    revision includes removing unused vlen stuff, adding various vlen tests,
    initial code cleanup, and first pass of commenting.
    Details:
      - Removed the VLPT_REMOVED ifdef, but keep H5PTis_varlen and the free
        function because they are useful or even needed, but the free
        function's name is changed to be more appropriate for both
        read/write buffers, i.e., H5PTfree_vlen_buff.

      - The new test file, test_packet_vlen.c, contains tests showing packet
        tables, containing various types of vlen data, can be created with
        the fixed-length function

      - Two accessor functions were added per HDFFV-8623/patch 003.
            /* Returns the ID of the dataset associated with the packet table */
            hid_t H5PTget_dataset(hid_t table_id);

            /* Returns the ID of the datatype the packet table uses */
            hid_t H5PTget_type(hid_t table_id);

      - Various cleanup: replacing 0/-1 with SUCCEED/FAIL and H5I_BADID with
        H5I_INVALID_HID, and removing many warnings.

Platforms tested:
    Linux/32 2.6 (jam)
    Linux/64 (platypus)
    Darwin (osx1010test)
This commit is contained in:
Binh-Minh Ribler 2016-03-04 14:49:14 -05:00
parent 6e7e6bb3aa
commit 9592119ffd
6 changed files with 1656 additions and 589 deletions

View File

@ -47,6 +47,136 @@ static herr_t H5PT_get_index(htbl_t *table_id, hsize_t *pt_index);
*-------------------------------------------------------------------------
*/
/*-------------------------------------------------------------------------
* Function: H5PTcreate
*
* Purpose: Creates a dataset containing a table and returns the Identifier
* of the table. (Copied mostly from H5PTcreate_fl)
*
* Return: Success: table ID, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu (Author of H5PTcreate_fl)
* James Laird, jlaird@ncsa.uiuc.edu (Author of H5PTcreate_fl)
*
* Date: March 12, 2004
*
* Comments: This function does not handle fill data
* currently. Fill data is not necessary because the
* table is initially of size 0.
*
* Modifications:
* Mar 1, 2016
* This function is added to replace H5PTcreate_fl and it differs
* from H5PTcreate_fl only because its last argument is plist_id
* instead of compression; this is to allow flexible compression.
* -BMR
*
*-------------------------------------------------------------------------
*/
hid_t H5PTcreate(hid_t loc_id,
const char *dset_name,
hid_t dtype_id,
hsize_t chunk_size,
hid_t plist_id)
{
htbl_t * table = NULL;
hid_t dset_id = H5I_INVALID_HID;
hid_t space_id = H5I_INVALID_HID;
hid_t plistcopy_id = H5I_INVALID_HID;
hsize_t dims[1];
hsize_t dims_chunk[1];
hsize_t maxdims[1];
hid_t ret_value = H5I_INVALID_HID;
/* check the arguments */
if (dset_name == NULL) {
goto error;
}
/* Register the packet table ID type if this is the first table created */
if(H5PT_ptable_id_type < 0)
if((H5PT_ptable_id_type = H5Iregister_type((size_t)H5PT_HASH_TABLE_SIZE, 0, (H5I_free_t)H5PT_free_id)) < 0)
goto error;
/* Get memory for the table identifier */
table = (htbl_t *)HDmalloc(sizeof(htbl_t));
if ( table == NULL ) {
goto error;
}
table->dset_id = H5I_INVALID_HID;
table->type_id = H5I_INVALID_HID;
/* Create a simple data space with unlimited size */
dims[0] = 0;
dims_chunk[0] = chunk_size;
maxdims[0] = H5S_UNLIMITED;
if((space_id = H5Screate_simple(1, dims, maxdims)) < 0)
goto error;
/* Modify dataset creation properties to enable chunking */
if (plist_id == H5P_DEFAULT) {
plistcopy_id = H5Pcreate(H5P_DATASET_CREATE);
}
else {
plistcopy_id = H5Pcopy(plist_id);
}
if (chunk_size > 0)
{
if(H5Pset_chunk(plistcopy_id, 1, dims_chunk) < 0)
goto error;
}
/* Create the dataset. */
if((dset_id = H5Dcreate2(loc_id, dset_name, dtype_id, space_id, H5P_DEFAULT, plistcopy_id, H5P_DEFAULT)) < 0)
goto error;
/* Create the table identifier */
table->dset_id = dset_id;
/* Terminate access to the data space. */
if(H5Sclose(space_id) < 0)
goto error;
/* End access to the property list */
if(H5Pclose(plistcopy_id) < 0)
goto error;
if((table->type_id = H5Tcopy(dtype_id)) < 0)
goto error;
if((table->type_id = H5Tget_native_type(table->type_id, H5T_DIR_DEFAULT)) < 0)
goto error;
H5PT_create_index(table);
table->size = 0;
/* Get an ID for this table */
ret_value = H5Iregister(H5PT_ptable_id_type, table);
if(ret_value != H5I_INVALID_HID)
H5PT_ptable_count++;
else
H5PT_close(table);
return ret_value;
error:
if (space_id != H5I_INVALID_HID)
H5Sclose(space_id);
if (plistcopy_id != H5I_INVALID_HID)
H5Pclose(plistcopy_id);
if (dset_id != H5I_INVALID_HID)
H5Dclose(dset_id);
if (table)
{
if (table->type_id != H5I_INVALID_HID)
H5Tclose(table->type_id);
HDfree(table);
}
return ret_value;
} /* H5PTcreate */
/*-------------------------------------------------------------------------
* Function: H5PTcreate_fl
*
@ -76,69 +206,73 @@ hid_t H5PTcreate_fl ( hid_t loc_id,
int compression )
{
htbl_t * table = NULL;
hid_t dset_id = H5I_BADID;
hid_t space_id = H5I_BADID;
hid_t plist_id = H5I_BADID;
hid_t dset_id = H5I_INVALID_HID;
hid_t space_id = H5I_INVALID_HID;
hid_t plist_id = H5I_INVALID_HID;
hsize_t dims[1];
hsize_t dims_chunk[1];
hsize_t maxdims[1];
hid_t ret_value;
hid_t ret_value = H5I_INVALID_HID;
/* check the arguments */
if (dset_name == NULL) {
goto out;
goto error;
}
/* Register the packet table ID type if this is the first table created */
if(H5PT_ptable_id_type < 0)
if((H5PT_ptable_id_type = H5Iregister_type((size_t)H5PT_HASH_TABLE_SIZE, 0, (H5I_free_t)H5PT_free_id)) < 0)
goto out;
goto error;
/* Get memory for the table identifier */
table = (htbl_t *)HDmalloc(sizeof(htbl_t));
if ( table == NULL ) {
goto error;
}
table->dset_id = H5I_INVALID_HID;
table->type_id = H5I_INVALID_HID;
/* Create a simple data space with unlimited size */
dims[0] = 0;
dims_chunk[0] = chunk_size;
maxdims[0] = H5S_UNLIMITED;
if((space_id = H5Screate_simple(1, dims, maxdims)) < 0)
goto out;
goto error;
/* Modify dataset creation properties to enable chunking */
plist_id = H5Pcreate(H5P_DATASET_CREATE);
if(H5Pset_chunk(plist_id, 1, dims_chunk) < 0)
goto out;
goto error;
if(compression >= 0 && compression <= 9)
if(H5Pset_deflate(plist_id, (unsigned)compression) < 0)
goto out;
goto error;
/* Create the dataset. */
if((dset_id = H5Dcreate2(loc_id, dset_name, dtype_id, space_id, H5P_DEFAULT, plist_id, H5P_DEFAULT)) < 0)
goto out;
/* Terminate access to the data space. */
if(H5Sclose(space_id) < 0)
goto out;
/* End access to the property list */
if(H5Pclose(plist_id) < 0)
goto out;
goto error;
/* Create the table identifier */
table->dset_id = dset_id;
/* Terminate access to the data space. */
if(H5Sclose(space_id) < 0)
goto error;
/* End access to the property list */
if(H5Pclose(plist_id) < 0)
goto error;
if((table->type_id = H5Tcopy(dtype_id)) < 0)
goto out;
goto error;
if((table->type_id = H5Tget_native_type(table->type_id, H5T_DIR_DEFAULT)) < 0)
goto out;
goto error;
H5PT_create_index(table);
table->size = 0;
/* Get an ID for this table */
ret_value = H5Iregister(H5PT_ptable_id_type, table);
if(ret_value != H5I_INVALID_HID)
H5PT_ptable_count++;
else
@ -146,71 +280,22 @@ hid_t H5PTcreate_fl ( hid_t loc_id,
return ret_value;
out:
H5E_BEGIN_TRY
H5Sclose(space_id);
H5Pclose(plist_id);
H5Dclose(dset_id);
if(table)
HDfree(table);
H5E_END_TRY
return H5I_INVALID_HID;
}
error:
if (space_id != H5I_INVALID_HID)
H5Sclose(space_id);
if (plist_id != H5I_INVALID_HID)
H5Pclose(plist_id);
if (dset_id != H5I_INVALID_HID)
H5Dclose(dset_id);
if (table)
{
if (table->type_id != H5I_INVALID_HID)
H5Tclose(table->type_id);
HDfree(table);
}
#ifdef H5_VLPT_ENABLED
/*-------------------------------------------------------------------------
* Function: H5PTcreate_vl
*
* Purpose: Creates a dataset containing a table of variable length records
* and returns the Identifier of the table.
*
* Return: Success: table ID, Failure: Negative
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
*
* Date: April 12, 2004
*
* Comments: This function does not handle compression or fill data
* currently. Fill data is not necessary because the
* table is initially of size 0.
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
hid_t H5PTcreate_vl ( hid_t loc_id,
const char*dset_name,
hsize_t chunk_size)
{
hid_t ret_value=H5I_BADID;
hid_t vltype;
/* check the arguments */
if (dset_name == NULL) {
goto out;
}
/* Create a variable length type that uses single bytes as its base type */
vltype = H5Tvlen_create(H5T_NATIVE_UCHAR);
if(vltype < 0)
goto out;
if((ret_value=H5PTcreate_fl(loc_id, dset_name, vltype, chunk_size, 0)) < 0)
goto out;
/* close the vltype */
if(H5Tclose(vltype) < 0)
goto out;
return ret_value;
out:
if(ret_value != H5I_BADID)
H5PTclose(ret_value);
return H5I_BADID;
}
#endif /* H%_VLPT_ENABLED */
return ret_value;
} /* H5PTcreate_fl */
/*-------------------------------------------------------------------------
* Function: H5PTopen
@ -239,58 +324,59 @@ out:
hid_t H5PTopen( hid_t loc_id,
const char *dset_name )
{
hid_t type_id=H5I_BADID;
hid_t space_id=H5I_BADID;
hid_t type_id=H5I_INVALID_HID;
hid_t space_id=H5I_INVALID_HID;
htbl_t * table = NULL;
hid_t ret_value;
hsize_t dims[1];
hid_t ret_value = H5I_INVALID_HID;
/* check the arguments */
if (dset_name == NULL) {
goto out;
goto error;
}
/* Register the packet table ID type if this is the first table created */
if( H5PT_ptable_id_type < 0)
if((H5PT_ptable_id_type = H5Iregister_type((size_t)H5PT_HASH_TABLE_SIZE, 0, (H5I_free_t)H5PT_free_id)) < 0)
goto out;
goto error;
table = (htbl_t *)HDmalloc(sizeof(htbl_t));
if ( table == NULL ) {
goto out;
goto error;
}
table->dset_id = H5I_BADID;
table->type_id = H5I_BADID;
table->dset_id = H5I_INVALID_HID;
table->type_id = H5I_INVALID_HID;
/* Open the dataset */
if((table->dset_id = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
goto out;
if(table->dset_id < 0)
goto out;
goto error;
/* Get the dataset's disk datatype */
if((type_id = H5Dget_type(table->dset_id)) < 0)
goto out;
goto error;
/* Get the table's native datatype */
if((table->type_id = H5Tget_native_type(type_id, H5T_DIR_ASCEND)) < 0)
goto out;
goto error;
/* Close the disk datatype */
if(H5Tclose(type_id) < 0)
goto out;
goto error;
type_id = H5I_INVALID_HID;
/* Initialize the current record pointer */
if((H5PT_create_index(table)) < 0)
goto out;
goto error;
/* Get number of records in table */
if((space_id=H5Dget_space(table->dset_id)) < 0)
goto out;
if( H5Sget_simple_extent_dims( space_id, dims, NULL) < 0)
goto out;
goto error;
if(H5Sget_simple_extent_dims(space_id, dims, NULL) < 0)
goto error;
if(H5Sclose(space_id) < 0)
goto out;
goto error;
space_id = H5I_INVALID_HID;
table->size = dims[0];
/* Get an ID for this table */
@ -303,33 +389,36 @@ hid_t H5PTopen( hid_t loc_id,
return ret_value;
out:
H5E_BEGIN_TRY
H5Tclose(type_id);
H5Sclose(space_id);
if(table)
{
H5Dclose(table->dset_id);
H5Tclose(table->type_id);
HDfree(table);
}
H5E_END_TRY
return H5I_INVALID_HID;
}
error:
if (type_id != H5I_INVALID_HID)
H5Dclose(type_id);
if (space_id != H5I_INVALID_HID)
H5Sclose(space_id);
if(table)
{
if (table->type_id != H5I_INVALID_HID)
H5Tclose(table->type_id);
if (table->dset_id != H5I_INVALID_HID)
H5Dclose(table->dset_id);
HDfree(table);
}
return ret_value;
} /* H5PTopen */
/*-------------------------------------------------------------------------
* Function: H5PT_free_id
*
* Purpose: Free an id. Callback for H5Iregister_type.
*
* Return: Success: 0, Failure: N/A
* Return: Success: SUCCEED, Failure: N/A
*-------------------------------------------------------------------------
*/
static herr_t
H5PT_free_id(void *id)
{
HDfree(id);
return 0;
return SUCCEED;
}
/*-------------------------------------------------------------------------
@ -338,7 +427,7 @@ H5PT_free_id(void *id)
* Purpose: Closes a table (i.e. cleans up all open resources used by a
* table).
*
* Return: Success: 0, Failure: -1
* Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@ -355,21 +444,21 @@ static herr_t
H5PT_close( htbl_t* table)
{
if(table == NULL)
goto out;
goto error;
/* Close the dataset */
if(H5Dclose(table->dset_id) < 0)
goto out;
goto error;
/* Close the memory datatype */
if(H5Tclose(table->type_id) < 0)
goto out;
goto error;
HDfree(table);
return 0;
return SUCCEED;
out:
error:
if(table)
{
H5E_BEGIN_TRY
@ -378,7 +467,7 @@ out:
H5E_END_TRY
HDfree(table);
}
return -1;
return FAIL;
}
/*-------------------------------------------------------------------------
@ -387,7 +476,7 @@ out:
* Purpose: Closes a table (i.e. cleans up all open resources used by a
* table).
*
* Return: Success: 0, Failure: -1
* Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@ -406,11 +495,11 @@ herr_t H5PTclose( hid_t table_id )
/* Remove the ID from the library */
if((table = (htbl_t *)H5Iremove_verify(table_id, H5PT_ptable_id_type)) ==NULL)
goto out;
goto error;
/* If the library found the table, remove it */
if( H5PT_close(table) < 0)
goto out;
goto error;
/* One less packet table open */
H5PT_ptable_count--;
@ -423,10 +512,10 @@ herr_t H5PTclose( hid_t table_id )
H5PT_ptable_id_type = H5I_UNINIT;
}
return 0;
return SUCCEED;
out:
return -1;
error:
return FAIL;
}
@ -442,7 +531,7 @@ out:
*
* Purpose: Appends packets to the end of a packet table
*
* Return: Success: 0, Failure: -1
* Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@ -463,22 +552,22 @@ herr_t H5PTappend( hid_t table_id,
/* Find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
goto out;
goto error;
/* If we are asked to write 0 records, just do nothing */
if(nrecords == 0)
return 0;
return SUCCEED;
if((H5TB_common_append_records(table->dset_id, table->type_id,
nrecords, table->size, data)) < 0)
goto out;
goto error;
/* Update table size */
table->size += nrecords;
return 0;
return SUCCEED;
out:
return -1;
error:
return FAIL;
}
/*-------------------------------------------------------------------------
@ -495,7 +584,7 @@ out:
* Purpose: Reads packets starting at the current index and updates
* that index
*
* Return: Success: 0, Failure: -1
* Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@ -517,22 +606,22 @@ herr_t H5PTget_next( hid_t table_id,
/* Find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
goto out;
goto error;
/* If nrecords == 0, do nothing */
if(nrecords == 0)
return 0;
return SUCCEED;
if((H5TB_common_read_records(table->dset_id, table->type_id,
table->current_index, nrecords, table->size, data)) < 0)
goto out;
goto error;
/* Update the current index */
table->current_index += nrecords;
return 0;
return SUCCEED;
out:
return -1;
error:
return FAIL;
}
/*-------------------------------------------------------------------------
@ -540,7 +629,7 @@ out:
*
* Purpose: Reads packets from anywhere in a packet table
*
* Return: Success: 0, Failure: -1
* Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@ -564,20 +653,20 @@ herr_t H5PTread_packets( hid_t table_id,
/* find the table struct from its ID */
table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type);
if(table == NULL)
goto out;
goto error;
/* If nrecords == 0, do nothing */
if(nrecords == 0)
return 0;
return SUCCEED;
if( H5TB_common_read_records(table->dset_id, table->type_id,
start, nrecords, table->size, data) < 0)
goto out;
goto error;
return 0;
return SUCCEED;
out:
return -1;
error:
return FAIL;
}
/*-------------------------------------------------------------------------
@ -592,7 +681,7 @@ out:
*
* Purpose: Resets, sets, and gets the current record index for a packet table
*
* Return: Success: 0, Failure: -1
* Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@ -611,37 +700,37 @@ H5PT_create_index(htbl_t *table)
if( table != NULL)
{
table->current_index = 0;
return 0;
return SUCCEED;
}
return -1;
return FAIL;
}
static herr_t
H5PT_set_index(htbl_t *table, hsize_t index)
H5PT_set_index(htbl_t *table, hsize_t pt_index)
{
/* Ensure index is valid */
if( table != NULL )
{
if( index < table->size )
if( pt_index < table->size )
{
table->current_index = index;
return 0;
table->current_index = pt_index;
return SUCCEED;
}
}
return -1;
return FAIL;
}
static herr_t
H5PT_get_index(htbl_t *table, hsize_t *index)
H5PT_get_index(htbl_t *table, hsize_t *pt_index)
{
/* Ensure index is valid */
if( table != NULL )
{
if(index)
*index = table->current_index;
return 0;
if(pt_index)
*pt_index = table->current_index;
return SUCCEED;
}
return -1;
return FAIL;
}
/*-------------------------------------------------------------------------
@ -649,7 +738,7 @@ H5PT_get_index(htbl_t *table, hsize_t *index)
*
* Purpose: Resets, sets, and gets the current record index for a packet table
*
* Return: Success: 0, Failure: -1
* Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@ -668,7 +757,7 @@ herr_t H5PTcreate_index(hid_t table_id)
/* find the table struct from its ID */
if((table = (htbl_t *) (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
return -1;
return FAIL;
return H5PT_create_index(table);
}
@ -679,7 +768,7 @@ herr_t H5PTset_index(hid_t table_id, hsize_t pt_index)
/* find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
return -1;
return FAIL;
return H5PT_set_index(table, pt_index);
}
@ -690,7 +779,7 @@ herr_t H5PTget_index(hid_t table_id, hsize_t *pt_index)
/* find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
return -1;
return FAIL;
return H5PT_get_index(table, pt_index);
}
@ -705,9 +794,9 @@ herr_t H5PTget_index(hid_t table_id, hsize_t *pt_index)
/*-------------------------------------------------------------------------
* Function: H5PTget_num_packets
*
* Purpose: Returns by reference the number of packets in the dataset
* Purpose: Returns by reference the number of packets in the packet table
*
* Return: Success: 0, Failure: -1
* Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@ -727,14 +816,15 @@ herr_t H5PTget_num_packets( hid_t table_id, hsize_t *nrecords)
/* find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
goto out;
goto error;
if(nrecords)
*nrecords = table->size;
return 0;
out:
return -1;
return SUCCEED;
error:
return FAIL;
}
@ -743,7 +833,7 @@ out:
*
* Purpose: Validates a table identifier
*
* Return: Success: 0, Failure: -1
* Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@ -761,19 +851,18 @@ herr_t H5PTis_valid(hid_t table_id)
{
/* find the table struct from its ID */
if(H5Iobject_verify(table_id, H5PT_ptable_id_type) ==NULL)
return -1;
return FAIL;
return 0;
return SUCCEED;
}
#ifdef H5_VLPT_ENABLED
/*-------------------------------------------------------------------------
* Function: H5PTis_varlen
*
* Purpose: Returns 1 if a table_id corresponds to a packet table of variable-
* length records or 0 for fixed-length records.
*
* Return: True: 1, False: 0, Failure: -1
* Return: True: 1, False: 0, Failure: FAIL
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
* James Laird, jlaird@ncsa.uiuc.edu
@ -794,17 +883,18 @@ herr_t H5PTis_varlen(hid_t table_id)
/* find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
goto out;
goto error;
if((type = H5Tget_class( table->type_id )) == H5T_NO_CLASS)
goto out;
goto error;
if( type == H5T_VLEN )
return 1;
else
return 0;
out:
return -1;
error:
return FAIL;
}
/*-------------------------------------------------------------------------
@ -815,12 +905,12 @@ out:
*/
/*-------------------------------------------------------------------------
* Function: H5PTfree_vlen_readbuff
* Function: H5PTfree_vlen_buff
*
* Purpose: Frees memory used when reading from a variable length packet
* table.
*
* Return: Success: 0, Failure: -1
* Return: Success: SUCCEED, Failure: FAIL
* -2 if memory was reclaimed but another error occurred
*
* Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
@ -836,25 +926,25 @@ out:
*-------------------------------------------------------------------------
*/
herr_t H5PTfree_vlen_readbuff( hid_t table_id,
herr_t H5PTfree_vlen_buff( hid_t table_id,
size_t _bufflen,
void * buff )
{
hid_t space_id = H5I_BADID;
hid_t space_id = H5I_INVALID_HID;
htbl_t * table;
hsize_t bufflen = _bufflen;
herr_t ret_value;
/* find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
goto out;
goto error;
if((space_id = H5Screate_simple(1, &bufflen, NULL)) < 0)
goto out;
goto error;
/* Free the memory. If this succeeds, ret_value should be 0. */
if((ret_value = H5Dvlen_reclaim(table->type_id, space_id, H5P_DEFAULT, buff)) < 0)
goto out;
goto error;
/* If the dataspace cannot be closed, return -2 to indicate that memory */
/* was freed successfully but an error still occurred. */
@ -863,11 +953,83 @@ herr_t H5PTfree_vlen_readbuff( hid_t table_id,
return ret_value;
out:
error:
H5E_BEGIN_TRY
H5Sclose(space_id);
H5E_END_TRY
return -1;
return FAIL;
} /* H5PTfree_vlen_buff */
/*-------------------------------------------------------------------------
*
* Accessor functions
*
*-------------------------------------------------------------------------
*/
/*-------------------------------------------------------------------------
* Function: H5PTget_dataset
*
* Purpose: Returns the backend dataset of this packet table
*
* Return: Success: SUCCEED, Failure: FAIL
*
* Programmer: User's patch 0003, HDFFV-8623. -BMR
*
* Date: Feb 10, 2016
*
* Comments:
*
* Modifications:
*
*
*-------------------------------------------------------------------------
*/
hid_t H5PTget_dataset(hid_t table_id)
{
htbl_t * table;
hid_t ret_value = H5I_INVALID_HID;
/* find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
goto error;
ret_value = table->dset_id;
error:
return ret_value;
}
#endif /* H5_VLPT_ENABLED */
/*-------------------------------------------------------------------------
* Function: H5PTget_type
*
* Purpose: Returns the backend type of this packet table
*
* Return: Success: datatype ID, Failure: H5I_INVALID_HID
*
* Programmer: User's patch 0003, HDFFV-8623. -BMR
*
* Date: Feb 10, 2016
*
* Comments:
*
* Modifications:
*
*
*-------------------------------------------------------------------------
*/
hid_t H5PTget_type( hid_t table_id)
{
htbl_t * table;
hid_t ret_value = H5I_INVALID_HID;
/* find the table struct from its ID */
if((table = (htbl_t *) H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
goto error;
ret_value = table->type_id;
error:
return ret_value;
}

View File

@ -22,74 +22,58 @@ extern "C" {
#endif
/*-------------------------------------------------------------------------
*
* Create/Open/Close functions
*
*-------------------------------------------------------------------------
*/
/* NOTE: H5PTcreate is replacing H5PTcreate_fl for better name due to the
removal of H5PTcreate_vl. H5PTcreate_fl may be retired in 1.8.19. */
H5_HLDLL hid_t H5PTcreate(hid_t loc_id, const char *dset_name,
hid_t dtype_id, hsize_t chunk_size, hid_t plist_id);
H5_HLDLL hid_t H5PTcreate_fl ( hid_t loc_id,
const char *dset_name,
hid_t dtype_id,
hsize_t chunk_size,
int compression );
H5_HLDLL hid_t H5PTopen(hid_t loc_id, const char *dset_name);
#ifdef VLPT_REMOVED
H5_HLDLL hid_t H5PTcreate_vl ( hid_t loc_id,
const char *dset_name,
hsize_t chunk_size );
#endif /* VLPT_REMOVED */
H5_HLDLL herr_t H5PTclose(hid_t table_id);
H5_HLDLL hid_t H5PTopen( hid_t loc_id,
const char *dset_name );
H5_HLDLL herr_t H5PTclose( hid_t table_id );
/* This function may be removed from the packet table in release 1.8.19. */
H5_HLDLL hid_t H5PTcreate_fl(hid_t loc_id, const char *dset_name,
hid_t dtype_id, hsize_t chunk_size, int compression);
/*-------------------------------------------------------------------------
*
* Write functions
*
*-------------------------------------------------------------------------
*/
H5_HLDLL herr_t H5PTappend( hid_t table_id,
size_t nrecords,
const void * data );
H5_HLDLL herr_t H5PTappend(hid_t table_id, size_t nrecords, const void *data);
/*-------------------------------------------------------------------------
*
* Read functions
*
*-------------------------------------------------------------------------
*/
H5_HLDLL herr_t H5PTget_next(hid_t table_id, size_t nrecords, void * data);
H5_HLDLL herr_t H5PTread_packets(hid_t table_id, hsize_t start,
size_t nrecords, void *data);
H5_HLDLL herr_t H5PTget_next( hid_t table_id,
size_t nrecords,
void * data );
/*-------------------------------------------------------------------------
* Inquiry functions
*-------------------------------------------------------------------------
*/
H5_HLDLL herr_t H5PTget_num_packets(hid_t table_id, hsize_t *nrecords);
H5_HLDLL herr_t H5PTread_packets( hid_t table_id,
hsize_t start,
size_t nrecords,
void *data );
H5_HLDLL herr_t H5PTis_valid(hid_t table_id);
H5_HLDLL herr_t H5PTis_varlen(hid_t table_id);
/*-------------------------------------------------------------------------
*
* Inquiry functions
* Accessor functions
*
*-------------------------------------------------------------------------
*/
H5_HLDLL hid_t H5PTget_dataset(hid_t table_id);
H5_HLDLL herr_t H5PTget_num_packets( hid_t table_id,
hsize_t *nrecords );
H5_HLDLL herr_t H5PTis_valid( hid_t table_id );
#ifdef VLPT_REMOVED
H5_HLDLL herr_t H5PTis_varlen( hid_t table_id );
#endif /* VLPT_REMOVED */
H5_HLDLL hid_t H5PTget_type(hid_t table_id);
/*-------------------------------------------------------------------------
*
@ -113,11 +97,9 @@ H5_HLDLL herr_t H5PTget_index( hid_t table_id,
*-------------------------------------------------------------------------
*/
#ifdef VLPT_REMOVED
H5_HLDLL herr_t H5PTfree_vlen_readbuff( hid_t table_id,
H5_HLDLL herr_t H5PTfree_vlen_buff( hid_t table_id,
size_t bufflen,
void * buff );
#endif /* VLPT_REMOVED */
#ifdef __cplusplus
}

View File

@ -49,4 +49,7 @@ CHECK_CLEANFILES+=combine_tables[1-2].h5 test_ds[1-9].h5 test_ds10.h5 \
test_packet_table.h5 test_packet_compress.h5 test_detach.h5 \
test_dectris.h5
# Sources for test_packet executable
test_packet_SOURCES=test_packet.c test_packet_vlen.c
include $(top_srcdir)/config/conclude.am

View File

@ -36,5 +36,7 @@
/* Implements verbose 'assert' with 'goto error' exit */
#define VERIFY(condition, string) do { if (!(condition)) FAIL_PUTS_ERROR(string) } while(0)
int test_packet_table_with_varlen(void);
#endif /* _H5HLTEST_H */

View File

@ -31,9 +31,6 @@
#define TEST_FILE_NAME "test_packet_table.h5"
#define TEST_COMPRESS_FILE "test_packet_compress.h5"
#define PT_NAME "Test Packet Table"
#ifdef VLPT_REMOVED
#define VL_TABLE_NAME "Varlen Test Table"
#endif /* VLPT_REMOVED */
#define H5TB_TABLE_NAME "Table1"
/*-------------------------------------------------------------------------
@ -77,9 +74,9 @@ static int cmp_par(size_t i, size_t j, particle_t *rbuf, particle_t *wbuf )
rbuf[i].longi != wbuf[j].longi ||
!H5_FLT_ABS_EQUAL(rbuf[i].pressure,wbuf[j].pressure) ||
!H5_DBL_ABS_EQUAL(rbuf[i].temperature,wbuf[j].temperature) ) {
return -1;
return FAIL;
}
return 0;
return SUCCEED;
}
/*-------------------------------------------------------------------------
@ -95,22 +92,22 @@ make_particle_type(void)
/* Create the memory data type. */
if ((type_id = H5Tcreate (H5T_COMPOUND, type_size )) < 0 )
return -1;
return FAIL;
/* Insert fields. */
string_type = H5Tcopy( H5T_C_S1 );
H5Tset_size( string_type, (size_t)16 );
if ( H5Tinsert(type_id, "Name", HOFFSET(particle_t, name) , string_type ) < 0 )
return -1;
return FAIL;
if ( H5Tinsert(type_id, "Lat", HOFFSET(particle_t, lati) , H5T_NATIVE_INT ) < 0 )
return -1;
return FAIL;
if ( H5Tinsert(type_id, "Long", HOFFSET(particle_t, longi) , H5T_NATIVE_INT ) < 0 )
return -1;
return FAIL;
if ( H5Tinsert(type_id, "Pressure", HOFFSET(particle_t, pressure) , H5T_NATIVE_FLOAT ) < 0 )
return -1;
return FAIL;
if ( H5Tinsert(type_id, "Temperature", HOFFSET(particle_t, temperature) , H5T_NATIVE_DOUBLE ) < 0 )
return -1;
return FAIL;
return type_id;
}
@ -156,9 +153,9 @@ static int create_hl_table(hid_t fid)
chunk_size, fill_data, compress, testPart );
if(status<0)
return -1;
return FAIL;
else
return 0;
return SUCCEED;
}
@ -188,23 +185,21 @@ static int test_create_close(hid_t fid)
table = H5PTcreate_fl(fid, PT_NAME, part_t, (hsize_t)100, -1);
H5Tclose(part_t);
if( H5PTis_valid(table) < 0)
goto out;
#ifdef VLPT_REMOVED
goto error;
if( H5PTis_varlen(table) != 0)
goto out;
#endif /* VLPT_REMOVED */
goto error;
/* Close the table */
err = H5PTclose(table);
if( err < 0)
goto out;
goto error;
PASSED();
return 0;
return SUCCEED;
out:
error:
H5_FAILED();
return -1;
return FAIL;
}
/*-------------------------------------------------------------------------
@ -224,23 +219,22 @@ static int test_open(hid_t fid)
/* Open the table */
table = H5PTopen(fid, PT_NAME);
if( H5PTis_valid(table) < 0)
goto out;
#ifdef VLPT_REMOVED
goto error;
if( H5PTis_varlen(table) != 0)
goto out;
#endif /* VLPT_REMOVED */
goto error;
/* Close the table */
err = H5PTclose(table);
if( err < 0)
goto out;
goto error;
PASSED();
return 0;
return SUCCEED;
out:
error:
if (table > 0) H5PTclose(table);
H5_FAILED();
return -1;
return FAIL;
}
/*-------------------------------------------------------------------------
@ -261,52 +255,52 @@ static int test_append(hid_t fid)
/* Open the table */
table = H5PTopen(fid, PT_NAME);
if( H5PTis_valid(table) < 0)
goto out;
goto error;
/* Count the number of packets in the table */
err = H5PTget_num_packets(table, &count);
if( err < 0)
goto out;
goto error;
/* There should be 0 records in the table */
if( count != 0 )
goto out;
goto error;
/* Append one particle */
err = H5PTappend(table, (size_t)1, &(testPart[0]));
if( err < 0)
goto out;
goto error;
/* Append several particles */
err = H5PTappend(table, (size_t)6, &(testPart[1]));
if( err < 0)
goto out;
goto error;
/* Append one more particle */
err = H5PTappend(table, (size_t)1, &(testPart[7]));
if( err < 0)
goto out;
goto error;
/* Count the number of packets in the table */
err = H5PTget_num_packets(table, &count);
if( err < 0)
goto out;
goto error;
/* There should be 8 records in the table now */
if( count != 8 )
goto out;
goto error;
/* Close the table */
err = H5PTclose(table);
if( err < 0)
goto out;
goto error;
PASSED();
return 0;
return SUCCEED;
out:
error:
H5_FAILED();
if( H5PTis_valid(table) < 0)
if( H5PTis_valid(table) > 0)
H5PTclose(table);
return -1;
return FAIL;
}
/*-------------------------------------------------------------------------
@ -328,44 +322,44 @@ static int test_read(hid_t fid)
/* Open the table */
table = H5PTopen(fid, PT_NAME);
if( H5PTis_valid(table) < 0)
goto out;
goto error;
/* Read several particles */
err = H5PTread_packets(table, (hsize_t)0, 3, &(readBuf[0]));
if( err < 0)
goto out;
goto error;
/* Read one particle */
err = H5PTread_packets(table, (hsize_t)3, 1, &(readBuf[3]));
if( err < 0)
goto out;
goto error;
/* Read several particles */
err = H5PTread_packets(table, (hsize_t)4, (NRECORDS - 4 ), &(readBuf[4]));
if( err < 0)
goto out;
goto error;
/* Ensure that particles were read correctly */
for(c=0; c<NRECORDS; c++)
{
if( cmp_par(c%8, c, testPart, readBuf) != 0)
goto out;
goto error;
}
/* Close the table */
err = H5PTclose(table);
if( err < 0)
goto out;
goto error;
PASSED();
return 0;
return SUCCEED;
out:
error:
H5_FAILED();
if( H5PTis_valid(table) < 0)
if( H5PTis_valid(table) > 0)
H5PTclose(table);
return -1;
return FAIL;
}
/*-------------------------------------------------------------------------
@ -389,21 +383,21 @@ static int test_get_next(hid_t fid)
/* Open the table */
table = H5PTopen(fid, PT_NAME);
if( H5PTis_valid(table) < 0)
goto out;
goto error;
/* Read several particles consecutively */
for(c=0; c < NRECORDS; c++)
{
err = H5PTget_next(table, 1, &readBuf[c]);
err = H5PTget_next(table, (size_t)1, &readBuf[c]);
if(err < 0)
goto out;
goto error;
}
/* Ensure that particles were read correctly */
for(c=0; c<NRECORDS; c++)
{
if( cmp_par(c, c, testPart, readBuf) != 0)
goto out;
goto error;
}
H5PTcreate_index(table);
@ -411,31 +405,31 @@ static int test_get_next(hid_t fid)
/* Read particles two by two */
for(c=0; c < NRECORDS / 2; c++)
{
err = H5PTget_next(table, 2, &readBuf2[c * 2]);
err = H5PTget_next(table, (size_t)2, &readBuf2[c * 2]);
if(err < 0)
goto out;
goto error;
}
/* Ensure that particles were read correctly */
for(c=0; c<NRECORDS; c++)
{
if( cmp_par(c, c, testPart, readBuf2) != 0)
goto out;
goto error;
}
/* Close the table */
err = H5PTclose(table);
if( err < 0)
goto out;
goto error;
PASSED();
return 0;
return SUCCEED;
out:
error:
H5_FAILED();
if( H5PTis_valid(table) < 0)
if( H5PTis_valid(table) > 0)
H5PTclose(table);
return -1;
return FAIL;
}
/*-------------------------------------------------------------------------
@ -466,7 +460,7 @@ static int test_big_table(hid_t fid)
table = H5PTcreate_fl(fid, "Packet Test Dataset2", part_t, (hsize_t)33, -1);
H5Tclose(part_t);
if( H5PTis_valid(table) < 0)
goto out;
goto error;
/* Add many particles */
for(c = 0; c < BIG_TABLE_SIZE ; c+=8)
@ -474,223 +468,45 @@ static int test_big_table(hid_t fid)
/* Append eight particles at once*/
err = H5PTappend(table, (size_t)8, &(testPart[0]));
if( err < 0)
goto out;
goto error;
}
/* Count the number of packets in the table */
err = H5PTget_num_packets(table, &count);
if( err < 0)
goto out;
goto error;
if( count != BIG_TABLE_SIZE )
goto out;
goto error;
/* Read particles to ensure that all of them were written correctly */
/* Also, ensure that H5PTcreate_fl set the current packet to */
/* the first packet in the table */
for(c = 0; c < BIG_TABLE_SIZE; c++)
{
err = H5PTget_next(table, 1, &readPart);
err = H5PTget_next(table, (size_t)1, &readPart);
if(err < 0)
goto out;
goto error;
/* Ensure that particles were read correctly */
if( cmp_par(c % 8, 0, testPart, &readPart) != 0)
goto out;
goto error;
}
/* Close the table */
err = H5PTclose(table);
if( err < 0)
goto out;
goto error;
PASSED();
return 0;
return SUCCEED;
out:
error:
H5_FAILED();
if( H5PTis_valid(table) < 0)
if( H5PTis_valid(table) > 0)
H5PTclose(table);
return -1;
return FAIL;
}
#ifdef VLPT_REMOVED
/*-------------------------------------------------------------------------
* test_varlen
*
* Tests creation, opening, closing, writing, reading, etc. on a
* variable-length packet table.
*
*-------------------------------------------------------------------------
*/
static int test_varlen(hid_t fid)
{
herr_t err;
hid_t table=H5I_BADID;
hsize_t count;
/* Buffers to hold data */
hvl_t writeBuffer[NRECORDS];
hvl_t readBuffer[NRECORDS];
/* This example has three different sizes of "record": longs, shorts, and particles */
long longBuffer[NRECORDS];
short shortBuffer[NRECORDS];
int x;
TESTING("variable-length packet tables");
/* Initialize buffers */
for(x=0; x<NRECORDS; x++)
{
longBuffer[x] = -x;
shortBuffer[x] = x;
}
/* Fill the write buffer with a mix of variable types */
for(x=0; x<8; x+=4)
{
writeBuffer[x].len = sizeof(long);
writeBuffer[x].p = &(longBuffer[x]);
writeBuffer[x+1].len = sizeof(short);
writeBuffer[x+1].p = &(shortBuffer[x+1]);
writeBuffer[x+2].len = sizeof(long);
writeBuffer[x+2].p = &(longBuffer[x+2]);
writeBuffer[x+3].len = sizeof(particle_t);
writeBuffer[x+3].p = &(testPart[x+3]);
}
/* Create the table */
table = H5PTcreate_vl(fid, VL_TABLE_NAME, (hsize_t)1001);
if( H5PTis_valid(table) < 0)
goto out;
if( H5PTis_varlen(table) != 1)
goto out;
/* Count the number of packets in the table */
err = H5PTget_num_packets(table, &count);
if( err < 0)
goto out;
if( count != 0 )
goto out;
/* Close the table */
err = H5PTclose(table);
if( err < 0)
goto out;
/* Re-open the table */
table = H5PTopen(fid, VL_TABLE_NAME);
if( H5PTis_valid(table) < 0)
goto out;
if( H5PTis_varlen(table) != 1)
goto out;
/* Count the number of packets in the table */
err = H5PTget_num_packets(table, &count);
if( err < 0)
goto out;
if( count != 0 )
goto out;
/* Add several variable-length packets */
err = H5PTappend(table, (size_t)8, writeBuffer );
if(err < 0)
goto out;
/* Read them back */
err = H5PTread_packets(table, (hsize_t)0, 4, &(readBuffer[0]));
if( err < 0)
goto out;
err = H5PTread_packets(table, (hsize_t)4, 1, &(readBuffer[4]));
if( err < 0)
goto out;
err = H5PTread_packets(table, (hsize_t)5, (NRECORDS - 5 ), &(readBuffer[5]));
if( err < 0)
goto out;
/* Ensure that packets were read correctly */
for(x=0; x<NRECORDS; x++)
{
if( readBuffer[x].len != writeBuffer[x%4].len)
goto out;
switch(x%4)
{
case 0:
case 2:
if( *((long*)(readBuffer[x].p)) != *((long*)(writeBuffer[x].p)))
goto out;
break;
case 1:
if( *((short*)(readBuffer[x].p)) != *((short*)(writeBuffer[x].p)))
goto out;
break;
case 3:
if( cmp_par(0, 0, readBuffer[x].p, writeBuffer[x].p) < 0)
goto out;
break;
default:
goto out;
}
}
/* Free memory used by read buffer */
if(H5PTfree_vlen_readbuff(table, NRECORDS, readBuffer) <0)
goto out;
/* Read packets back using get_next */
for(x=0; x < NRECORDS; x++)
{
err = H5PTget_next(table, 1, &readBuffer[x]);
if(err < 0)
goto out;
}
/* Ensure that packets were read correctly */
for(x=0; x<NRECORDS; x++)
{
if( readBuffer[x].len != writeBuffer[x%4].len)
goto out;
switch(x%4)
{
case 0:
case 2:
if( *((long*)(readBuffer[x].p)) != *((long*)(writeBuffer[x].p)))
goto out;
break;
case 1:
if( *((short*)(readBuffer[x].p)) != *((short*)(writeBuffer[x].p)))
goto out;
break;
case 3:
if( cmp_par(0, 0, readBuffer[x].p, writeBuffer[x].p) < 0)
goto out;
break;
default:
goto out;
}
}
/* Free memory used by read buffer */
if(H5PTfree_vlen_readbuff(table, NRECORDS, readBuffer) <0)
goto out;
/* Close the table */
err = H5PTclose(table);
if( err < 0)
goto out;
PASSED();
return 0;
out:
H5_FAILED();
H5E_BEGIN_TRY
H5PTclose(table);
H5E_END_TRY
return -1;
}
#endif /* VLPT_REMOVED */
/*-------------------------------------------------------------------------
* test_opaque
*
@ -710,50 +526,50 @@ static int test_opaque(hid_t fid)
/* Create an opaque datatype for the particle struct */
if ((part_t = H5Tcreate (H5T_OPAQUE, sizeof(particle_t) )) < 0 )
return -1;
return FAIL;
HDassert(part_t != -1);
/* Tag the opaque datatype */
if ( H5Tset_tag(part_t, "Opaque Particle" ) < 0)
return -1;
return FAIL;
/* Create a new table */
table = H5PTcreate_fl(fid, "Packet Test Dataset3", part_t, (hsize_t)100, -1);
H5Tclose(part_t);
if( H5PTis_valid(table) < 0)
goto out;
goto error;
/* Append several particles, starting at particle 1 */
err = H5PTappend(table, (size_t)(NRECORDS - 1), &(testPart[1]));
if( err < 0)
goto out;
goto error;
/* Read the particles back */
err = H5PTread_packets(table, (hsize_t)0, 7, &(readBuf[0]));
if( err < 0)
goto out;
goto error;
/* Ensure that particles were read correctly */
for(c=0; c<NRECORDS - 1; c++)
{
if( cmp_par(c+1, c, testPart, readBuf) != 0)
goto out;
goto error;
}
/* Close the table */
err = H5PTclose(table);
if( err < 0)
goto out;
goto error;
PASSED();
return 0;
return SUCCEED;
out:
error:
H5_FAILED();
if( H5PTis_valid(table) < 0)
if( H5PTis_valid(table) > 0)
H5PTclose(table);
return -1;
return FAIL;
}
/*-------------------------------------------------------------------------
@ -767,12 +583,12 @@ static int test_opaque(hid_t fid)
static int
test_compress(void)
{
hid_t fid1 = -1;
hid_t fid1 = H5I_INVALID_HID;
herr_t err;
hid_t table = -1;
hid_t part_t = -1;
hid_t dset_id = -1;
hid_t plist_id = -1;
hid_t table = H5I_INVALID_HID;
hid_t part_t = H5I_INVALID_HID;
hid_t dset_id = H5I_INVALID_HID;
hid_t plist_id = H5I_INVALID_HID;
size_t c;
size_t num_elems = 1;
unsigned filter_vals[1];
@ -812,7 +628,7 @@ test_compress(void)
HDmemset(readPart, 0, sizeof(readPart));
for(c = 0; c < BIG_TABLE_SIZE; c++)
{
err = H5PTget_next(table, 1, readPart);
err = H5PTget_next(table, (size_t)1, readPart);
if(err < 0) TEST_ERROR;
/* Ensure that particles were read correctly */
@ -881,7 +697,7 @@ test_compress(void)
if( err < 0) TEST_ERROR;
PASSED();
return 0;
return SUCCEED;
error:
H5E_BEGIN_TRY {
@ -892,7 +708,7 @@ error:
H5Fclose(fid1);
} H5E_END_TRY
H5_FAILED();
return -1;
return FAIL;
}
/*-------------------------------------------------------------------------
@ -932,54 +748,54 @@ static int test_rw_nonnative_dt(hid_t fid)
ptable = H5PTcreate_fl(fid, "Packet Test Dataset, Non-native", H5T_STD_I32LE, (hsize_t)100, -1);
}
if(ptable == H5I_INVALID_HID)
goto out;
goto error;
/* Write one packet to the packet table */
if( (err = H5PTappend(ptable, (hsize_t)1, &(writeBuffer[0]))) < 0 )
goto out;
if( (err = H5PTappend(ptable, (size_t)1, &(writeBuffer[0]))) < 0 )
goto error;
/* Write several packets to the packet table */
if( (err = H5PTappend(ptable, (hsize_t)4, &(writeBuffer[1]))) < 0)
goto out;
if( (err = H5PTappend(ptable, (size_t)4, &(writeBuffer[1]))) < 0)
goto error;
if( (err = H5PTclose(ptable)) < 0)
goto out;
goto error;
/* Open the Packet table */
if( (ptable = H5PTopen(fid, "Packet Test Dataset, Non-native")) < 0)
goto out;
goto error;
/* Get the number of packets in the packet table. This should be five. */
if( (err = H5PTget_num_packets(ptable, &count)) < 0)
goto out;
goto error;
if( (int)count != 5 )
goto out;
goto error;
/* Initialize packet table's "current record" */
if( (err = H5PTcreate_index(ptable)) < 0)
goto out;
goto error;
/* Iterate through packets, read each one back */
for(x=0; x<5; x++) {
if( (err = H5PTget_next(ptable, (hsize_t)1, &(readBuffer[x]))) < 0)
goto out;
if( (err = H5PTget_next(ptable, (size_t)1, &(readBuffer[x]))) < 0)
goto error;
if( x != readBuffer[x])
goto out;
goto error;
}
/* Close the packet table */
if( (err = H5PTclose(ptable)) < 0)
goto out;
goto error;
PASSED();
return 0;
return SUCCEED;
out:
error:
H5_FAILED();
if( H5PTis_valid(ptable) < 0)
if( H5PTis_valid(ptable) > 0)
H5PTclose(ptable);
return -1;
return FAIL;
}
/*-------------------------------------------------------------------------
@ -992,7 +808,7 @@ static int test_rw_nonnative_dt(hid_t fid)
*/
static int test_error(hid_t fid)
{
hid_t id = H5I_BADID;
hid_t id = H5I_INVALID_HID;
int id_open=0;
particle_t readBuf[1];
@ -1000,121 +816,121 @@ static int test_error(hid_t fid)
/* Create a HL table */
if(create_hl_table(fid) < 0)
goto out;
goto error;
/* Try to open things that are not packet tables */
H5E_BEGIN_TRY
if(H5PTopen(fid, "Bogus_name") >= 0)
goto out;
goto error;
if(H5PTopen(fid, "group1") >= 0)
goto out;
goto error;
H5E_END_TRY
/* Try to execute packet table commands on an invalid ID */
H5E_BEGIN_TRY
if(H5PTis_valid(id) >= 0)
goto out;
#ifdef VLPT_REMOVED
goto error;
if(H5PTis_varlen(id) >= 0)
goto out;
#endif /* VLPT_REMOVED */
goto error;
if(H5PTclose(id) >= 0)
goto out;
goto error;
if(H5PTappend(id, (size_t)1, testPart) >= 0)
goto out;
goto error;
if(H5PTread_packets(id, (hsize_t)0, 1, readBuf) >= 0)
goto out;
goto error;
if(H5PTcreate_index(id) >= 0)
goto out;
goto error;
if(H5PTset_index(id, (hsize_t)1) >= 0)
goto out;
goto error;
if(H5PTget_index(id, NULL) >= 0)
goto out;
goto error;
H5E_END_TRY
/* Open a high-level non-packet (H5TB) table and try to */
/* execute commands on it. */
if((id=H5Dopen2(fid, H5TB_TABLE_NAME, H5P_DEFAULT)) <0)
goto out;
goto error;
id_open = 1;
H5E_BEGIN_TRY
if(H5PTis_valid(id) >= 0)
goto out;
#ifdef VLPT_REMOVED
goto error;
if(H5PTis_varlen(id) >= 0)
goto out;
#endif /* VLPT_REMOVED */
goto error;
if(H5PTclose(id) >= 0)
goto out;
goto error;
if(H5PTappend(id, (size_t)1, testPart) >= 0)
goto out;
goto error;
if(H5PTread_packets(id, (hsize_t)0, 1, readBuf) >= 0)
goto out;
goto error;
if(H5PTcreate_index(id) >= 0)
goto out;
goto error;
if(H5PTset_index(id, (hsize_t)1) >= 0)
goto out;
goto error;
if(H5PTget_index(id, NULL) >= 0)
goto out;
goto error;
H5E_END_TRY
id_open=0;
if(H5Dclose(id) <0)
goto out;
goto error;
/* Open and close a packet table. Try to execute */
/* commands on the closed ID. */
if((id=H5PTopen(fid, PT_NAME))<0)
goto out;
goto error;
if(H5PTclose(id) <0)
goto out;
goto error;
H5E_BEGIN_TRY
if(H5PTis_valid(id) >= 0)
goto out;
#ifdef VLPT_REMOVED
goto error;
if(H5PTis_varlen(id) >= 0)
goto out;
#endif /* VLPT_REMOVED */
goto error;
if(H5PTclose(id) >= 0)
goto out;
goto error;
if(H5PTappend(id, (size_t)1, testPart) >= 0)
goto out;
goto error;
if(H5PTread_packets(id, (hsize_t)0, 1, readBuf) >= 0)
goto out;
goto error;
if(H5PTcreate_index(id) >= 0)
goto out;
goto error;
if(H5PTset_index(id, (hsize_t)1) >= 0)
goto out;
goto error;
if(H5PTget_index(id, NULL) >= 0)
goto out;
goto error;
H5E_END_TRY
PASSED();
return 0;
return SUCCEED;
out:
error:
H5_FAILED();
if(id_open)
H5Dclose(id);
return -1;
return FAIL;
}
/*-------------------------------------------------------------------------
* test_packet_table(): Invokes individual tests to ensure that all
* functions work correctly, except for the variable-length related
* functions, which are tested in "test_packet_vlen.c".
*
*-------------------------------------------------------------------------
*/
static int test_packet_table(hid_t fid)
{
if( test_create_close(fid) < 0 )
return -1;
return FAIL;
if( test_open(fid) < 0 )
return -1;
return FAIL;
/* test_append must be run before test_count and test_read, as it */
/* creates the packet table they use. */
if( test_append(fid) < 0 )
return -1;
return FAIL;
/* These tests will not necessarily cause failures in each other,
so we don't abort the other tests if one fails. */
@ -1122,24 +938,24 @@ static int test_packet_table(hid_t fid)
test_get_next(fid);
test_big_table(fid);
test_rw_nonnative_dt(fid);
#ifdef VLPT_REMOVED
test_varlen(fid);
#endif /* VLPT_REMOVED */
test_opaque(fid);
test_compress();
test_error(fid);
return 0;
return SUCCEED;
}
/*
*
*/
int main(void)
{
/* identifier for the file */
hid_t fid;
int status = 0;
/* identifier for the file that is used in FL PT tests */
hid_t fid;
int status = 0;
/*-------------------------------------------------------------------------
* Packet test: test each function of the packet table
* Packet test: test each function of the packet table library
*-------------------------------------------------------------------------
*/
@ -1148,12 +964,16 @@ int main(void)
HDputs("Testing packet table");
/* run tests */
if ( test_packet_table(fid) < 0)
status = 1;
/* Test packet table with fixed length */
if (test_packet_table(fid) < 0)
status = 1;
/* close */
H5Fclose(fid);
/* Test packet table with variable length, using separate data file */
if (test_packet_table_with_varlen() < 0)
status = 1;
return status;
/* Close the file */
H5Fclose(fid);
return status;
}

1098
hl/test/test_packet_vlen.c Normal file

File diff suppressed because it is too large Load Diff