diff options
author | James Laird <jlaird@hdfgroup.org> | 2005-03-18 17:19:36 (GMT) |
---|---|---|
committer | James Laird <jlaird@hdfgroup.org> | 2005-03-18 17:19:36 (GMT) |
commit | 349ca8daa9a1d0f094d716ea603d7d41ac14b862 (patch) | |
tree | d5180e62e013724f1c8972c018963bfe4da74e17 /hl/src/H5HL_private.c | |
parent | f7ee415cdb4e6000636a55ff017c516d65ed64c1 (diff) | |
download | hdf5-349ca8daa9a1d0f094d716ea603d7d41ac14b862.zip hdf5-349ca8daa9a1d0f094d716ea603d7d41ac14b862.tar.gz hdf5-349ca8daa9a1d0f094d716ea603d7d41ac14b862.tar.bz2 |
[svn-r10234] Purpose:
Added Packet Table to high-level APIs
Description:
The Packet Table is an API that allows the user to append records
("packets") to a table, and read the back again. It supports
fixed-length records with a defined datatype and variable-length
records. It also supports a "current record" index to track the
user's position in the table.
Solution:
The Packet Table code lives in hl/src, and its tests in hl/test.
Some code is shared between the H5TB table and the H5PT Packet Table
in the form of functions in H5HL_private.c.
Some documentation exists for a previous version of the API. Updated
documentation and C++ wrapper API coming soon.
Platforms tested:
sleipnir, eirene, copper, modi4
Diffstat (limited to 'hl/src/H5HL_private.c')
-rw-r--r-- | hl/src/H5HL_private.c | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/hl/src/H5HL_private.c b/hl/src/H5HL_private.c new file mode 100644 index 0000000..723e9ea --- /dev/null +++ b/hl/src/H5HL_private.c @@ -0,0 +1,167 @@ +/**************************************************************************** + * NCSA HDF * + * Scientific Data Technologies * + * National Center for Supercomputing Applications * + * University of Illinois at Urbana-Champaign * + * 605 E. Springfield, Champaign IL 61820 * + * * + * For conditions of distribution and use, see the accompanying * + * hdf/COPYING file. * + * * + ****************************************************************************/ + +#include "H5HL_private.h" + +/*------------------------------------------------------------------------- + * + * Functions shared between H5TB and H5PT + * + *------------------------------------------------------------------------- + */ + +/*------------------------------------------------------------------------- + * Function: H5TBcommon_append_records + * + * Purpose: Common code for reading records shared between H5PT and H5TB + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu + * James Laird, jlaird@ncsa.uiuc.edu + * + * Date: March 8, 2004 + * + * Comments: Called by H5TBappend_records and H5PTappend_records + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +herr_t H5TBcommon_append_records( hid_t dataset_id, + hid_t mem_type_id, + hsize_t nrecords, + hsize_t orig_table_size, + const void * data) +{ + hsize_t count[1]; + hsize_t offset[1]; + hid_t space_id = H5I_BADID; + hid_t mem_space_id = H5I_BADID; + hsize_t dims[1]; + hsize_t mem_dims[1]; + + /* Extend the dataset */ + dims[0] = nrecords + orig_table_size; + if ( H5Dextend ( dataset_id, dims ) < 0 ) + goto out; + + /* Create a simple memory data space */ + mem_dims[0]=nrecords; + if ( (mem_space_id = H5Screate_simple( 1, mem_dims, NULL )) < 0 ) + goto out; + + /* Get a copy of the new file data space for writing */ + if ( (space_id = H5Dget_space( dataset_id )) < 0 ) + goto out; + + /* Define a hyperslab in the dataset */ + offset[0] = orig_table_size; + count[0] = nrecords; + if ( H5Sselect_hyperslab( space_id, H5S_SELECT_SET, offset, NULL, count, NULL) < 0 ) + goto out; + + /* Write the records */ + if ( H5Dwrite( dataset_id, mem_type_id, mem_space_id, space_id, H5P_DEFAULT, data ) < +0 ) + goto out; + + /* Terminate access to the dataspace */ + if ( H5Sclose( mem_space_id ) < 0 ) + goto out; + + if ( H5Sclose( space_id ) < 0 ) + goto out; + + return 0; + +out: + H5E_BEGIN_TRY + H5Sclose(mem_space_id); + H5Sclose(space_id); + H5E_END_TRY + return -1; +} + + +/*------------------------------------------------------------------------- + * Function: H5TBcommon_read_records + * + * Purpose: Common code for reading records shared between H5PT and H5TB + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu + * James Laird, jlaird@ncsa.uiuc.edu + * + * Date: March 8, 2004 + * + * Comments: Called by H5TBread_records and H5PTread_records + * + * Modifications: + * + * + *------------------------------------------------------------------------- + */ +herr_t H5TBcommon_read_records( hid_t dataset_id, + hid_t mem_type_id, + hsize_t start, + hsize_t nrecords, + hsize_t table_size, + void *data) +{ + hsize_t count[1]; + hsize_t offset[1]; + hid_t space_id = H5I_BADID; + hid_t mem_space_id = H5I_BADID; + hsize_t mem_size[1]; + + /* Make sure the read request is in bounds */ + if ( start + nrecords > table_size ) + goto out; + + /* Get the dataspace handle */ + if ( (space_id = H5Dget_space( dataset_id )) < 0 ) + goto out; + + /* Define a hyperslab in the dataset of the size of the records */ + offset[0] = start; + count[0] = nrecords; + if ( H5Sselect_hyperslab( space_id, H5S_SELECT_SET, offset, NULL, count, NULL) < 0 ) + goto out; + + /* Create a memory dataspace handle */ + mem_size[0] = count[0]; + if ((mem_space_id = H5Screate_simple( 1, mem_size, NULL )) < 0 ) + goto out; + if ((H5Dread( dataset_id, mem_type_id, mem_space_id, space_id, H5P_DEFAULT, data)) < 0 + ) + goto out; + + /* Terminate access to the memory dataspace */ + if ( H5Sclose( mem_space_id ) < 0 ) + goto out; + + /* Terminate access to the dataspace */ + if ( H5Sclose( space_id ) < 0 ) + goto out; + + return 0; + +out: + H5E_BEGIN_TRY + H5Sclose(space_id); + H5Sclose(mem_space_id); + H5E_END_TRY + return -1; +} + |