summaryrefslogtreecommitdiffstats
path: root/hl/src
diff options
context:
space:
mode:
authorJames Laird <jlaird@hdfgroup.org>2005-03-18 17:19:36 (GMT)
committerJames Laird <jlaird@hdfgroup.org>2005-03-18 17:19:36 (GMT)
commit349ca8daa9a1d0f094d716ea603d7d41ac14b862 (patch)
treed5180e62e013724f1c8972c018963bfe4da74e17 /hl/src
parentf7ee415cdb4e6000636a55ff017c516d65ed64c1 (diff)
downloadhdf5-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')
-rw-r--r--hl/src/H5HL_private.c167
-rw-r--r--hl/src/H5HL_private.h55
-rw-r--r--hl/src/H5PT.c862
-rw-r--r--hl/src/H5PT.h125
-rw-r--r--hl/src/H5TB.c43
-rw-r--r--hl/src/Makefile.am5
-rw-r--r--hl/src/Makefile.in10
7 files changed, 1225 insertions, 42 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;
+}
+
diff --git a/hl/src/H5HL_private.h b/hl/src/H5HL_private.h
new file mode 100644
index 0000000..d6f2157
--- /dev/null
+++ b/hl/src/H5HL_private.h
@@ -0,0 +1,55 @@
+/****************************************************************************
+ * 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. *
+ * *
+ ****************************************************************************/
+
+
+#ifndef _H5HL_private_H
+#define _H5HL_private_H
+
+#include <hdf5.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-------------------------------------------------------------------------
+ *
+ * Private write function used by H5TB and H5PT
+ *
+ *-------------------------------------------------------------------------
+ */
+
+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);
+
+/*-------------------------------------------------------------------------
+ *
+ * Private read function used by H5TB and H5PT
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+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);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/hl/src/H5PT.c b/hl/src/H5PT.c
new file mode 100644
index 0000000..2c9b359
--- /dev/null
+++ b/hl/src/H5PT.c
@@ -0,0 +1,862 @@
+/****************************************************************************
+ * 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 "H5PT.h"
+#include "H5HL_private.h"
+#include <stdlib.h>
+
+/* Packet Table private data */
+
+typedef struct
+{
+ hid_t dset_id; /* The ID of the dataset containing this table */
+ hid_t dspace_id; /* Single packet dataspace used for reading and writing one packet at a time */
+ hid_t mem_type_id; /* The type ID of the memory datatype */
+ hid_t mem_space_id; /* The space ID of the memory space data will be read into and written from */
+ hsize_t current_index; /* The index of the packet that get_next_packet will read next */
+ hsize_t set_size; /* The number of packets currently contained in this table */
+} htbl_t;
+
+static hsize_t H5PT_ptable_count = 0;
+static H5I_type_t H5PT_ptable_id_type = H5I_UNINIT;
+
+#define H5PT_HASH_TABLE_SIZE 64
+
+/* Packet Table private functions */
+herr_t H5PT_close( htbl_t* table );
+herr_t H5PT_create_index(htbl_t *table_id);
+herr_t H5PT_set_index(htbl_t *table_id, hsize_t pt_index);
+
+/*-------------------------------------------------------------------------
+ *
+ * Create/Open/Close functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*-------------------------------------------------------------------------
+ * Function: H5PTcreate_fl
+ *
+ * Purpose: Creates a dataset containing a table 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: March 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_fl ( hid_t loc_id,
+ const char *dset_name,
+ hid_t dtype_id,
+ hsize_t chunk_size )
+{
+ htbl_t * table = NULL;
+ hid_t dset_id = H5I_BADID;
+ hid_t space_id = H5I_BADID;
+ hid_t plist_id = H5I_BADID;
+ hsize_t dims[1];
+ hsize_t dims_chunk[1];
+ hsize_t maxdims[1];
+ hid_t ret_value;
+
+ /* 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(H5PT_HASH_TABLE_SIZE, 0, (H5I_free_t)free)) <0)
+ goto out;
+
+ /* Get memory for the table identifier */
+ table = (htbl_t *)malloc(sizeof(htbl_t));
+
+ /* 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;
+
+ /* Modify dataset creation properties to enable chunking */
+ plist_id = H5Pcreate (H5P_DATASET_CREATE);
+ if ( H5Pset_chunk ( plist_id, 1, dims_chunk ) < 0 )
+ goto out;
+
+ /* Create the dataset. */
+ if ( (dset_id=H5Dcreate( loc_id, dset_name, dtype_id, space_id, plist_id))<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;
+
+ /* Create the table identifier */
+ table->dset_id = dset_id;
+
+ dims[0] = 1;
+ if ((table->dspace_id = H5Screate_simple(1, dims, NULL)) < 0)
+ goto out;
+
+ if((table->mem_type_id = H5Tcopy(dtype_id)) <0)
+ goto out;
+
+ /* Create a simple memory data space */
+ if ( (table->mem_space_id = H5Screate_simple( 1, dims, NULL )) < 0 )
+ goto out;
+
+ H5PT_create_index(table);
+ table->set_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;
+
+ out:
+ H5E_BEGIN_TRY
+ H5Sclose(space_id);
+ H5Pclose(plist_id);
+ H5Dclose(dset_id);
+ if(table)
+ {
+ H5Sclose(table->mem_space_id);
+ H5Sclose(table->dspace_id);
+ free(table);
+ }
+ H5E_END_TRY
+ return H5I_INVALID_HID;
+}
+
+/*-------------------------------------------------------------------------
+ * 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;
+
+ /* 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)
+ 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;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: H5PTopen
+ *
+ * Purpose: Opens a dataset containing a table 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: March 10, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t H5PTopen( hid_t loc_id,
+ char *dset_name )
+{
+ hid_t type_id=H5I_BADID;
+ htbl_t * table = NULL;
+ hid_t ret_value;
+ hsize_t dims[1];
+
+ /* 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(H5PT_HASH_TABLE_SIZE, 0, (H5I_free_t)free))<0)
+ goto out;
+
+ table = (htbl_t *) malloc(sizeof(htbl_t));
+
+ /* Open the dataset */
+ table->dset_id = H5Dopen(loc_id, dset_name);
+ if (table->dset_id < 0)
+ goto out;
+
+ /* Create the dataspace */
+ dims[0] = 1;
+ if ((table->dspace_id = H5Screate_simple(1, dims, NULL)) < 0)
+ goto out;
+
+ /* Get the dataset's disk datatype */
+ if ((type_id = H5Dget_type(table->dset_id)) < 0)
+ goto out;
+
+ /* Get the native type for memory */
+ if ((table->mem_type_id = H5Tget_native_type(type_id, H5T_DIR_ASCEND)) < 0)
+ goto out;
+
+ /* Create a simple memory data space */
+ if ( (table->mem_space_id = H5Screate_simple( 1, dims, NULL )) < 0 )
+ goto out;
+
+ /* Initialize the current record pointer */
+ if((H5PT_create_index(table)) <0)
+ goto out;
+
+ /* Get the dataset size from disk */
+ if (H5PTget_num_records( table->dset_id, &(table->set_size)) < 0)
+ goto out;
+
+ /* 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;
+
+out:
+ H5E_BEGIN_TRY
+ H5Tclose(type_id);
+ if(table)
+ {
+ H5Sclose(table->dspace_id);
+ H5Dclose(table->dset_id);
+ H5Tclose(table->mem_type_id);
+ H5Sclose(table->mem_space_id);
+ free(table);
+ }
+ H5E_END_TRY
+ return H5I_INVALID_HID;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5PT_close
+ *
+ * Purpose: Closes a table (i.e. cleans up all open resources used by a
+ * table).
+ *
+ * Return: Success: 0, Failure: -1
+ *
+ * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
+ * James Laird, jlaird@ncsa.uiuc.edu
+ *
+ * Date: March 10, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t H5PT_close( htbl_t* table)
+{
+ herr_t return_status = 0;
+
+ if(table == NULL)
+ goto out;
+
+ /* Close the dataspace */
+ if (H5Sclose( table->dspace_id ) < 0)
+ goto out;
+
+ /* Close the dataset */
+ if (H5Dclose(table->dset_id) < 0)
+ goto out;
+
+ /* Close the memory datatype */
+ if (H5Tclose(table->mem_type_id) < 0)
+ goto out;
+
+ /* Close the memory dataspace */
+ if ( H5Sclose( table->mem_space_id ) < 0 )
+ goto out;
+
+ free(table);
+
+ return 0;
+
+out:
+ if(table)
+ {
+ H5E_BEGIN_TRY
+ H5Sclose( table->dspace_id );
+ H5Dclose(table->dset_id);
+ H5Tclose(table->mem_type_id);
+ H5Sclose( table->mem_space_id );
+ H5E_END_TRY
+ free(table);
+ }
+ return -1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: H5PTclose
+ *
+ * Purpose: Closes a table (i.e. cleans up all open resources used by a
+ * table).
+ *
+ * Return: Success: 0, Failure: -1
+ *
+ * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
+ * James Laird, jlaird@ncsa.uiuc.edu
+ *
+ * Date: April 21, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t H5PTclose( hid_t table_id )
+{
+ htbl_t * table;
+
+ /* Remove the ID from the library */
+ if((table = H5Iremove_verify(table_id, H5PT_ptable_id_type)) ==NULL)
+ goto out;
+
+ /* If the library found the table, remove it */
+ if( H5PT_close(table) < 0)
+ goto out;
+
+ /* One less packet table open */
+ H5PT_ptable_count--;
+
+ /* Remove the packet table type ID if no more packet */
+ /* tables are open */
+ if (H5PT_ptable_count == 0)
+ {
+ H5Idestroy_type(H5PT_ptable_id_type);
+ H5PT_ptable_id_type = H5I_UNINIT;
+ }
+
+ return 0;
+
+out:
+ return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+ *
+ * Write functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*-------------------------------------------------------------------------
+ * Function: H5PTappend
+ *
+ * Purpose: Appends packets to the end of a packet table
+ *
+ * Return: Success: 0, Failure: -1
+ *
+ * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
+ * James Laird, jlaird@ncsa.uiuc.edu
+ *
+ * Date: March 12, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t H5PTappend( hid_t table_id,
+ hsize_t nrecords,
+ const void * data )
+{
+ htbl_t * table;
+
+ /* Find the table struct from its ID */
+ if((table = H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
+ goto out;
+
+ /* If we are asked to write 0 records, just do nothing */
+ if (nrecords == 0)
+ return 0;
+
+ if((H5TBcommon_append_records(table->dset_id, table->mem_type_id,
+ nrecords, table->set_size, data)) <0)
+ goto out;
+
+ /* Update table size */
+ table->set_size += nrecords;
+ return 0;
+
+out:
+ return -1;
+}
+
+/*-------------------------------------------------------------------------
+ *
+ * Read functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5PTget_next
+ *
+ * Purpose: Reads packets starting at the current index and updates
+ * that index
+ *
+ * Return: Success: 0, Failure: -1
+ *
+ * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
+ * James Laird, jlaird@ncsa.uiuc.edu
+ *
+ * Date: March 10, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t H5PTget_next( hid_t table_id,
+ hsize_t nrecords,
+ void * data)
+{
+ htbl_t * table;
+
+ /* Find the table struct from its ID */
+ if((table = H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
+ goto out;
+
+ /* If nrecords == 0, do nothing */
+ if (nrecords == 0)
+ return 0;
+
+ if((H5TBcommon_read_records(table->dset_id, table->mem_type_id,
+ table->current_index, nrecords, table->set_size, data)) < 0)
+ goto out;
+
+ /* Update the current index */
+ table->current_index += nrecords;
+ return 0;
+
+out:
+ return -1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: H5PTread_packets
+ *
+ * Purpose: Reads packets from anywhere in a packet table
+ *
+ * Return: Success: 0, Failure: -1
+ *
+ * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
+ * James Laird, jlaird@ncsa.uiuc.edu
+ *
+ * Date: March 12, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t H5PTread_packets( hid_t table_id,
+ hsize_t start,
+ hsize_t nrecords,
+ void *data)
+{
+ htbl_t * table;
+
+ /* find the table struct from its ID */
+ table = H5Iobject_verify(table_id, H5PT_ptable_id_type);
+ if (table == NULL)
+ goto out;
+
+ /* If nrecords == 0, do nothing */
+ if (nrecords == 0)
+ return 0;
+
+ if( H5TBcommon_read_records(table->dset_id, table->mem_type_id,
+ start, nrecords, table->set_size, data) < 0)
+ goto out;
+
+ return 0;
+
+out:
+ return -1;
+}
+
+/*-------------------------------------------------------------------------
+ *
+ * Table attribute functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*-------------------------------------------------------------------------
+ * Function: H5PT_create_index, H5PT_set_index
+ *
+ * Purpose: Resets and sets the current record index for a packet table
+ *
+ * Return: Success: 0, Failure: -1
+ *
+ * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
+ * James Laird, jlaird@ncsa.uiuc.edu
+ *
+ * Date: March 12, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t H5PT_create_index(htbl_t *table)
+{
+ if( table != NULL)
+ {
+ table->current_index = 0;
+ return 0;
+ }
+ return -1;
+}
+
+herr_t H5PT_set_index(htbl_t *table, hsize_t index)
+{
+ /* Ensure index is valid */
+ if( table != NULL )
+ {
+ if( index < table->set_size )
+ {
+ table->current_index = index;
+ return 0;
+ }
+ }
+ return -1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: H5PTcreate_index, H5PTset_index
+ *
+ * Purpose: Resets and sets the current record index for a packet table
+ *
+ * Return: Success: 0, Failure: -1
+ *
+ * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
+ * James Laird, jlaird@ncsa.uiuc.edu
+ *
+ * Date: April 23, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t H5PTcreate_index(hid_t table_id)
+{
+ htbl_t * table;
+
+ /* find the table struct from its ID */
+ if((table = H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
+ return -1;
+
+ return H5PT_create_index(table);
+}
+
+herr_t H5PTset_index(hid_t table_id, hsize_t pt_index)
+{
+ htbl_t * table;
+
+ /* find the table struct from its ID */
+ if((table = H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
+ return -1;
+
+ return H5PT_set_index(table, pt_index);
+}
+/*-------------------------------------------------------------------------
+ *
+ * Inquiry functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5PTget_num_records
+ *
+ * Purpose: Returns by reference the number of records in the dataset
+ *
+ * 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 H5PTget_field_info
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+
+herr_t H5PTget_num_records( hid_t dataset_id, hsize_t *nrecords)
+{
+ hid_t space_id = H5I_BADID;
+ hsize_t dims[1];
+
+ /* Get the dataspace handle */
+ if ( (space_id = H5Dget_space( dataset_id )) < 0 )
+ goto out;
+
+ /* Get records */
+ if ( H5Sget_simple_extent_dims( space_id, dims, NULL) < 0 )
+ goto out;
+
+ /* Terminate access to the dataspace */
+ if ( H5Sclose( space_id ) < 0 )
+ goto out;
+
+ *nrecords = dims[0];
+
+ return 0;
+
+out:
+ H5E_BEGIN_TRY
+ H5Sclose(space_id);
+ H5E_END_TRY
+ return -1;
+}
+
+/*-------------------------------------------------------------------------
+ * Function: H5PTget_num_packets
+ *
+ * Purpose: Returns by reference the number of packets in the dataset
+ *
+ * Return: Success: 0, Failure: -1
+ *
+ * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
+ * James Laird, jlaird@ncsa.uiuc.edu
+ *
+ * Date: March 12, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t H5PTget_num_packets( hid_t table_id, hsize_t *nrecords)
+{
+ htbl_t * table;
+
+ /* find the table struct from its ID */
+ if((table = H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
+ goto out;
+
+ *nrecords = table->set_size;
+
+ return 0;
+out:
+ return -1;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5PTis_valid
+ *
+ * Purpose: Validates a table identifier
+ *
+ * Return: Success: 0, Failure: -1
+ *
+ * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
+ * James Laird, jlaird@ncsa.uiuc.edu
+ *
+ * Date: March 12, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t H5PTis_valid(hid_t table_id)
+{
+ htbl_t * table;
+
+ /* find the table struct from its ID */
+ if((table = H5Iobject_verify(table_id, H5PT_ptable_id_type)) ==NULL)
+ return -1;
+
+ return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * 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
+ *
+ * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
+ * James Laird, jlaird@ncsa.uiuc.edu
+ *
+ * Date: April 14, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t H5PTis_varlen(hid_t table_id)
+{
+ H5T_class_t type;
+ htbl_t * table;
+
+ /* find the table struct from its ID */
+ if((table = H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
+ goto out;
+
+ if((type = H5Tget_class( table->mem_type_id )) == H5T_NO_CLASS)
+ goto out;
+
+ if( type == H5T_VLEN )
+ return 1;
+ else
+ return 0;
+out:
+ return -1;
+}
+
+/*-------------------------------------------------------------------------
+ *
+ * Memory Management functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/*-------------------------------------------------------------------------
+ * Function: H5PTfree_vlen_readbuff
+ *
+ * Purpose: Frees memory used when reading from a variable length packet
+ * table.
+ *
+ * Return: Success: 0, Failure: -1
+ * -2 if memory was reclaimed but another error occurred
+ *
+ * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu
+ * James Laird, jlaird@ncsa.uiuc.edu
+ *
+ * Date: April 12, 2004
+ *
+ * Comments:
+ *
+ * Modifications:
+ *
+ *
+ *-------------------------------------------------------------------------
+ */
+
+herr_t H5PTfree_vlen_readbuff( hid_t table_id,
+ hsize_t bufflen,
+ void * buff )
+{
+ hid_t space_id = H5I_BADID;
+ htbl_t * table;
+ herr_t ret_value;
+
+ /* find the table struct from its ID */
+ if((table = H5Iobject_verify(table_id, H5PT_ptable_id_type)) == NULL)
+ goto out;
+
+ if ((space_id = H5Screate_simple(1, &bufflen, NULL)) < 0)
+ goto out;
+
+ /* Free the memory. If this succeeds, ret_value should be 0. */
+ if((ret_value = H5Dvlen_reclaim(table->mem_type_id, space_id, H5P_DEFAULT, buff)) < 0)
+ goto out;
+
+ /* If the dataspace cannot be closed, return -2 to indicate that memory */
+ /* was freed successfully but an error still occurred. */
+ if(H5Sclose(space_id) < 0)
+ return -2;
+
+ return ret_value;
+
+out:
+ H5E_BEGIN_TRY
+ H5Sclose(space_id);
+ H5E_END_TRY
+ return -1;
+}
diff --git a/hl/src/H5PT.h b/hl/src/H5PT.h
new file mode 100644
index 0000000..e7cceb8
--- /dev/null
+++ b/hl/src/H5PT.h
@@ -0,0 +1,125 @@
+/****************************************************************************
+ * 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. *
+ * *
+ ****************************************************************************/
+
+
+#ifndef _H5PT_H
+#define _H5PT_H
+
+#include <hdf5.h>
+
+#if 0
+#define H5_PT_DEBUG
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*-------------------------------------------------------------------------
+ *
+ * Create/Open/Close functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+hid_t H5PTcreate_fl ( hid_t loc_id,
+ const char *dset_name,
+ hid_t dtype_id,
+ hsize_t chunk_size );
+
+hid_t H5PTcreate_vl ( hid_t loc_id,
+ const char *dset_name,
+ hsize_t chunk_size );
+
+hid_t H5PTopen( hid_t loc_id,
+ char *dset_name );
+
+herr_t H5PTclose( hid_t table_id );
+
+
+/*-------------------------------------------------------------------------
+ *
+ * Write functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+herr_t H5PTappend( hid_t table_id,
+ hsize_t nrecords,
+ const void * data );
+
+herr_t H5PTappend_single_packet( hid_t table_id,
+ const void * data );
+
+/*-------------------------------------------------------------------------
+ *
+ * Read functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+herr_t H5PTget_next( hid_t table_id,
+ hsize_t nrecords,
+ void * data );
+
+herr_t H5PTread_packets( hid_t table_id,
+ hsize_t start,
+ hsize_t nrecords,
+ void *data );
+
+/*-------------------------------------------------------------------------
+ *
+ * Inquiry functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+herr_t H5PTget_num_records( hid_t dataset_id,
+ hsize_t *nrecords );
+
+herr_t H5PTget_num_packets( hid_t table_id,
+ hsize_t *nrecords );
+
+herr_t H5PTis_valid( hid_t table_id );
+
+herr_t H5PTis_varlen( hid_t table_id );
+
+/*-------------------------------------------------------------------------
+ *
+ * Packet Table "current index" functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+herr_t H5PTcreate_index( hid_t table_id );
+
+herr_t H5PTset_index( hid_t table_id,
+ hsize_t pt_index );
+
+/*-------------------------------------------------------------------------
+ *
+ * Memory Management functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+herr_t H5PTfree_vlen_readbuff( hid_t table_id,
+ hsize_t bufflen,
+ void * buff );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/hl/src/H5TB.c b/hl/src/H5TB.c
index 6b58c0f..84f626e 100644
--- a/hl/src/H5TB.c
+++ b/hl/src/H5TB.c
@@ -11,6 +11,7 @@
****************************************************************************/
#include "H5TB.h"
+#include "H5HL_private.h"
#include <stdlib.h>
#include <string.h>
@@ -328,42 +329,10 @@ herr_t H5TBappend_records( hid_t loc_id,
if ((mem_type_id=H5TB_create_type(loc_id,dset_name,dst_size,dst_offset,dst_sizes,tid))<0)
goto out;
- /* Extend the dataset */
- dims[0] = nrecords_orig;
- dims[0] += nrecords;
-
- if ( H5Dextend ( did, 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 )
- return -1;
-
- /* Get the file data space */
- if ( (sid = H5Dget_space( did )) < 0 )
- return -1;
-
- /* Get the dimensions */
- if ( H5Sget_simple_extent_dims( sid, dims, NULL ) != 1 )
- goto out;
-
- /* Define a hyperslab in the dataset */
- offset[0] = nrecords_orig;
- count[0] = nrecords;
- if ( H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0 )
- goto out;
-
- if ( H5Dwrite( did, mem_type_id, mem_space_id, sid, H5P_DEFAULT, data ) < 0 )
- goto out;
-
- /* Terminate access to the dataspace */
- if ( H5Sclose( mem_space_id ) < 0 )
- goto out;
+ /* Append the records */
+ if ((H5TBcommon_append_records(did, mem_type_id, nrecords, nrecords_orig, data))<0)
+ goto out;
- if ( H5Sclose( sid ) < 0 )
- goto out;
-
/* Release the datatype. */
if ( H5Tclose( tid ) < 0 )
return -1;
@@ -975,6 +944,10 @@ herr_t H5TBread_records( hid_t loc_id,
if ((mem_type_id=H5TB_create_type(loc_id,dset_name,dst_size,dst_offset,dst_sizes,ftype_id))<0)
goto out;
+ /* Read the records */
+ if ((H5TBcommon_read_records(did, mem_type_id, start, nrecords, nrecords_orig, data)) < 0)
+ goto out;
+
/* get the dataspace handle */
if ( (sid = H5Dget_space( did )) < 0 )
goto out;
diff --git a/hl/src/Makefile.am b/hl/src/Makefile.am
index adbe00a..db8c059 100644
--- a/hl/src/Makefile.am
+++ b/hl/src/Makefile.am
@@ -10,15 +10,14 @@
include $(top_srcdir)/config/commence.am
# Add include directories to the C preprocessor flags
-#AM_CPPFLAGS=-I. -I$(srcdir) -I$(top_builddir)/src -I$(top_srcdir)/src -I$(top-srcdir)/tools/lib
AM_CPPFLAGS=-I$(top_srcdir)/src
# This library is our main target.
lib_LTLIBRARIES=libhdf5_hl.la
-libhdf5_hl_la_SOURCES=H5LT.c H5TB.c H5IM.c H5DS.c
+libhdf5_hl_la_SOURCES=H5LT.c H5TB.c H5IM.c H5DS.c H5PT.c H5HL_private.c
# Public header files (to be installed)
-include_HEADERS=H5IM.h H5LT.h H5TB.h H5DS.h
+include_HEADERS=H5IM.h H5LT.h H5TB.h H5DS.h H5PT.h
include $(top_srcdir)/config/conclude.am
diff --git a/hl/src/Makefile.in b/hl/src/Makefile.in
index f83b3c0..060ada9 100644
--- a/hl/src/Makefile.in
+++ b/hl/src/Makefile.in
@@ -66,7 +66,8 @@ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
libhdf5_hl_la_LIBADD =
-am_libhdf5_hl_la_OBJECTS = H5LT.lo H5TB.lo H5IM.lo H5DS.lo
+am_libhdf5_hl_la_OBJECTS = H5LT.lo H5TB.lo H5IM.lo H5DS.lo H5PT.lo \
+ H5HL_private.lo
libhdf5_hl_la_OBJECTS = $(am_libhdf5_hl_la_OBJECTS)
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/src
depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
@@ -280,15 +281,14 @@ H5FC = $(bindir)/h5fc
H5FC_PP = $(bindir)/h5pfc
# Add include directories to the C preprocessor flags
-#AM_CPPFLAGS=-I. -I$(srcdir) -I$(top_builddir)/src -I$(top_srcdir)/src -I$(top-srcdir)/tools/lib
AM_CPPFLAGS = -I$(top_srcdir)/src
# This library is our main target.
lib_LTLIBRARIES = libhdf5_hl.la
-libhdf5_hl_la_SOURCES = H5LT.c H5TB.c H5IM.c H5DS.c
+libhdf5_hl_la_SOURCES = H5LT.c H5TB.c H5IM.c H5DS.c H5PT.c H5HL_private.c
# Public header files (to be installed)
-include_HEADERS = H5IM.h H5LT.h H5TB.h H5DS.h
+include_HEADERS = H5IM.h H5LT.h H5TB.h H5DS.h H5PT.h
# Automake needs to be taught how to build lib, progs, and tests targets.
# These will be filled in automatically for the most part (e.g.,
@@ -372,8 +372,10 @@ distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5DS.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5HL_private.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5IM.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5LT.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5PT.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5TB.Plo@am__quote@
.c.o: