diff options
author | Binh-Minh Ribler <bmribler@hdfgroup.org> | 2016-04-13 18:48:16 (GMT) |
---|---|---|
committer | Binh-Minh Ribler <bmribler@hdfgroup.org> | 2016-04-13 18:48:16 (GMT) |
commit | d9c4a4c747908d3fdfd7e8bbef13635b2f4d5a60 (patch) | |
tree | cd558dbf5fe5d25d0965251d2ba14924c446d526 | |
parent | 933adde73a7a2cf25bb0716a275ebff56807bf11 (diff) | |
download | hdf5-d9c4a4c747908d3fdfd7e8bbef13635b2f4d5a60.zip hdf5-d9c4a4c747908d3fdfd7e8bbef13635b2f4d5a60.tar.gz hdf5-d9c4a4c747908d3fdfd7e8bbef13635b2f4d5a60.tar.bz2 |
[svn-r29690] Purpose: Merge PT improvements from trunk
Description:
Merged from trunk:
r29269: Improve Packet Table library
r29295: Replaced H5Acreate with H5Acreate2 (by Larry)
r29360: Adding missing tests
r29364: Improve C++ Packet Table library
r29554: Removed extra line in Copyright
Platforms tested:
Linux/32 2.6 (jam)
Linux/64 (platypus)
Darwin (osx1010test)
-rw-r--r-- | hl/c++/src/H5PacketTable.cpp | 206 | ||||
-rw-r--r-- | hl/c++/src/H5PacketTable.h | 133 | ||||
-rw-r--r-- | hl/c++/test/ptableTest.cpp | 53 | ||||
-rw-r--r-- | hl/src/H5PT.c | 528 | ||||
-rw-r--r-- | hl/src/H5PTpublic.h | 68 | ||||
-rw-r--r-- | hl/test/CMakeLists.txt | 12 | ||||
-rw-r--r-- | hl/test/Makefile.am | 3 | ||||
-rw-r--r-- | hl/test/Makefile.in | 15 | ||||
-rw-r--r-- | hl/test/h5hltest.h | 2 | ||||
-rw-r--r-- | hl/test/test_packet.c | 520 | ||||
-rw-r--r-- | hl/test/test_packet_vlen.c | 1693 |
11 files changed, 2420 insertions, 813 deletions
diff --git a/hl/c++/src/H5PacketTable.cpp b/hl/c++/src/H5PacketTable.cpp index 2a491de..50e11f6 100644 --- a/hl/c++/src/H5PacketTable.cpp +++ b/hl/c++/src/H5PacketTable.cpp @@ -39,6 +39,12 @@ table_id = H5PTopen( fileID, name); } + /* "Open" Constructor - will be deprecated because of char* name */ + PacketTable::PacketTable(hid_t fileID, char* name) + { + table_id = H5PTopen( fileID, name); + } + /* Destructor * Cleans up the packet table */ @@ -60,17 +66,14 @@ return false; } -#ifdef VLPT_REMOVED /* IsVariableLength - * Return 1 if this packet table is a Variable Length packet table, - * return 0 if it is Fixed Length. Returns -1 if the table is - * invalid (not open). + * Return 1 if this packet table uses variable-length datatype, + * and 0, otherwise. Returns -1 if the table is invalid (not open). */ int PacketTable::IsVariableLength() { return H5PTis_varlen(table_id); } -#endif /* VLPT_REMOVED */ /* ResetIndex * Sets the index to point to the first packet in the packet table @@ -113,39 +116,87 @@ { hsize_t npackets; - error = H5PTget_num_packets( table_id, (hsize_t *)&npackets); + error = H5PTget_num_packets(table_id, &npackets); return npackets; } + /* GetTableId + * Returns the identifier of the packet table + */ + hid_t PacketTable::GetTableId() + { + return table_id; + } + + /* GetDatatype + * Returns the datatype identifier used by the packet table, on success, + * or FAIL, on failure. + * Note: it is best to avoid using this identifier in applications, unless + * the desired functionality cannot be performed via the packet table ID. + */ + hid_t PacketTable::GetDatatype() + { + return H5PTget_type(table_id); + } + + /* GetDataset + * Returns the dataset identifier associated with the packet table, on + * success, or FAIL, on failure. + * Note: it is best to avoid using this identifier in applications, unless + * the desired functionality cannot be performed via the packet table ID. + */ + hid_t PacketTable::GetDataset() + { + return H5PTget_dataset(table_id); + } + + /* FreeBuff + * Frees the buffers created when variable-length packets are read. + * Takes the number of hvl_t structs to be freed and a pointer to their + * location in memory. + * Returns 0 on success, negative on error. + */ + int PacketTable::FreeBuff(size_t numStructs, hvl_t * buffer) + { + return H5PTfree_vlen_buff( table_id, numStructs, buffer); + } + + /********************************/ /* Fixed-Length Packet Table */ /********************************/ /* Constructor - * Creates a packet table in which to store fixed length packets. + * Creates a packet table to store either fixed- or variable-length packets. + * Takes the ID of the file the packet table will be created in, the ID of + * the property list to specify compression, the name of the packet table, + * the ID of the datatype, and the size of a memory chunk used in chunking. + */ + FL_PacketTable::FL_PacketTable(hid_t fileID, hid_t plist_id, const char* name, hid_t dtypeID, hsize_t chunkSize) + { + table_id = H5PTcreate(fileID, name, dtypeID, chunkSize, plist_id); + } + + /* Constructor + * Creates a packet table to store either fixed- or variable-length packets. * Takes the ID of the file the packet table will be created in, the name of * the packet table, the ID of the datatype of the set, and the size * of a memory chunk used in chunking. + * Note: this overload will be deprecated in favor of the constructor above. */ - FL_PacketTable::FL_PacketTable(hid_t fileID, const char* name, hid_t dtypeID, hsize_t chunkSize, int compression) + FL_PacketTable::FL_PacketTable(hid_t fileID, char* name, hid_t dtypeID, hsize_t chunkSize, int compression) { - table_id = H5PTcreate_fl ( fileID, name, dtypeID, chunkSize, compression); + table_id = H5PTcreate_fl(fileID, name, dtypeID, chunkSize, compression); } /* "Open" Constructor * Opens an existing fixed-length packet table. * Fails if the packet table specified is variable-length. */ - FL_PacketTable::FL_PacketTable(hid_t fileID, const char* name) : PacketTable(fileID, name) - { -#ifdef VLPT_REMOVED - if( H5PTis_varlen(table_id) != 0 ) // If this is not a fixed-length table - { - H5PTclose(table_id); - table_id = -1; - } -#endif /* VLPT_REMOVED */ - } + FL_PacketTable::FL_PacketTable(hid_t fileID, const char* name) : PacketTable(fileID, name) {} + + /* "Open" Constructor - will be deprecated because of char* name */ + FL_PacketTable::FL_PacketTable(hid_t fileID, char* name) : PacketTable(fileID, name) {} /* AppendPacket * Adds a single packet to the packet table. Takes a pointer @@ -215,119 +266,4 @@ return H5PTget_next(table_id, numPackets, data); } - -#ifdef VLPT_REMOVED - /********************************/ - /* Variable-Length Packet Table */ - /********************************/ - - /* Constructor - * Creates a packet table in which to store variable length packets. - * Takes the ID of the file the packet table will be created in, the name of - * the packet table, and the size of a memory chunk used in chunking. - */ - VL_PacketTable::VL_PacketTable(hid_t fileID, char* name, hsize_t chunkSize) - { - table_id = H5PTcreate_vl ( fileID, name, chunkSize); - } - - /* "Open" Constructor - * Opens an existing variable-length packet table. - * Fails if the packet table specified is fixed-length. - */ - VL_PacketTable::VL_PacketTable(hid_t fileID, char* name) : PacketTable(fileID, name) - { - if( H5PTis_varlen(table_id) != 1 ) // If this is not a variable-length table - { - H5PTclose(table_id); - table_id = -1; - } - } - - /* AppendPacket (variable-length) - * Adds a single variable-length packet to the packet table. - * Takes a pointer to the location of the data in memory and the length of the data - * in bytes. - * Returns 0 on success, negative on failure. - */ - int VL_PacketTable::AppendPacket(void * data, size_t length) - { - hvl_t packet; - - packet.len = length; - packet.p = data; - - return H5PTappend(table_id, 1, &packet); - } - - /* AppendPackets (multiple packets) - * Adds multiple variable-length packets to the packet table. Takes the - * number of - * packets to be added and a pointer to an array of hvl_t structs in memory. - * Returns 0 on success, negative on failure. - */ - int VL_PacketTable::AppendPackets(size_t numPackets, hvl_t * data) - { - return H5PTappend(table_id, numPackets, data); - } - - /* GetPacket (indexed) - * Gets a single variable-length packet from the packet table. Takes the - * index of the packet (with 0 being the first packet) and a pointer - * to a hvl_t struct in which to store the packet's size and location. - * Returns 0 on success, negative on failure. - */ - int VL_PacketTable::GetPacket(hsize_t index, hvl_t * data) - { - return H5PTread_packets(table_id, index, 1, data); - } - - /* GetPackets (multiple packets) - * Gets multiple variable-length packets at once, all packets between - * startIndex and endIndex inclusive. Takes a pointer to an array - * of hvl_t structs in memory in which to store pointers to the packets. - * Returns 0 on success, negative on failure. - */ - int VL_PacketTable::GetPackets(hsize_t startIndex, hsize_t endIndex, hvl_t * data) - { - // Make sure the range of indexes is valid - if (startIndex > endIndex) - return -1; - - return H5PTread_packets(table_id, startIndex, endIndex-startIndex+1, data); - } - - /* GetNextPacket (single packet) - * Gets the next packet in the packet table. Takes a pointer to - * an hvl_t struct where the packet should be stored. - * Returns 0 on success, negative on failure. Index - * is not advanced to the next packet on failure. - */ - int VL_PacketTable::GetNextPacket(hvl_t * data) - { - return H5PTget_next(table_id, 1, data); - } - - /* GetNextPackets (multiple packets) - * Gets the next numPackets packets in the packet table. Takes a - * pointer to an array of hvl_t structs where pointers to the packets - * should be stored. - * Returns 0 on success, negative on failure. Index - * is not advanced on failure. - */ - int VL_PacketTable::GetNextPackets(size_t numPackets, hvl_t * data) - { - return H5PTget_next(table_id, numPackets, data); - } - - /* FreeReadbuff - * Frees the buffers created when variable-length packets are read. - * Takes the number of hvl_t structs to be freed and a pointer to their - * location in memory. - * Returns 0 on success, negative on error. - */ - int VL_PacketTable::FreeReadbuff(size_t numStructs, hvl_t * buffer) - { - return H5PTfree_vlen_readbuff( table_id, numStructs, buffer); - } -#endif /* VLPT_REMOVED */ +/* Removed "ifdef VLPT_REMOVED" block. 03/08/2016, -BMR */ diff --git a/hl/c++/src/H5PacketTable.h b/hl/c++/src/H5PacketTable.h index c7c7fc0..bdd669d 100644 --- a/hl/c++/src/H5PacketTable.h +++ b/hl/c++/src/H5PacketTable.h @@ -44,10 +44,13 @@ public: */ PacketTable(hid_t fileID, const char* name); + /* "Open" Constructor - will be deprecated because of char* name */ + PacketTable(hid_t fileID, char* name); + /* Destructor * Cleans up the packet table */ - ~PacketTable(); + virtual ~PacketTable(); /* IsValid * Returns true if this packet table is valid, false otherwise. @@ -56,14 +59,12 @@ public: */ bool IsValid(); -#ifdef VLPT_REMOVED /* IsVariableLength - * Return 1 if this packet table is a Variable Length packet table, + * Return 1 if this packet table uses variable-length datatype, * return 0 if it is Fixed Length. Returns -1 if the table is * invalid (not open). */ int IsVariableLength(); -#endif /* VLPT_REMOVED */ /* ResetIndex * Sets the "current packet" index to point to the first packet in the @@ -96,6 +97,35 @@ public: return GetPacketCount(ignoreError); } + /* GetTableId + * Returns the identifier of the packet table. + */ + hid_t GetTableId(); + + /* GetDatatype + * Returns the datatype identifier used by the packet table, on success, + * or FAIL, on failure. + * Note: it is best to avoid using this identifier in applications, unless + * the desired functionality cannot be performed via the packet table ID. + */ + hid_t GetDatatype(); + + /* GetDataset + * Returns the dataset identifier associated with the packet table, on + * success, or FAIL, on failure. + * Note: it is best to avoid using this identifier in applications, unless + * the desired functionality cannot be performed via the packet table ID. + */ + hid_t GetDataset(); + + /* FreeBuff + * Frees the buffers created when variable-length packets are read. + * Takes the number of hvl_t structs to be freed and a pointer to their + * location in memory. + * Returns 0 on success, negative on error. + */ + int FreeBuff(size_t numStructs, hvl_t * buffer); + protected: hid_t table_id; }; @@ -104,13 +134,22 @@ class H5_HLCPPDLL FL_PacketTable : virtual public PacketTable { public: /* Constructor + * Creates a packet table to store either fixed- or variable-length packets. + * Takes the ID of the file the packet table will be created in, the ID of + * the property list to specify compression, the name of the packet table, + * the ID of the datatype, and the size of a memory chunk used in chunking. + */ + FL_PacketTable(hid_t fileID, hid_t plist_id, const char* name, hid_t dtypeID, hsize_t chunkSize); + + /* Constructor * Creates a packet table in which to store fixed length packets. * Takes the ID of the file the packet table will be created in, the name of * the packet table, the ID of the datatype of the set, the size * of a memory chunk used in chunking, and the desired compression level * (0-9, or -1 for no compression). + * Note: this overload will be deprecated in favor of the constructor above. */ - FL_PacketTable(hid_t fileID, const char* name, hid_t dtypeID, hsize_t chunkSize, int compression = -1); + FL_PacketTable(hid_t fileID, char* name, hid_t dtypeID, hsize_t chunkSize, int compression = -1); /* "Open" Constructor * Opens an existing fixed-length packet table. @@ -118,6 +157,14 @@ public: */ FL_PacketTable(hid_t fileID, const char* name); + /* "Open" Constructor - will be deprecated because of char* name */ + FL_PacketTable(hid_t fileID, char* name); + + /* Destructor + * Cleans up the packet table + */ + virtual ~FL_PacketTable() {}; + /* AppendPacket * Adds a single packet to the packet table. Takes a pointer * to the location of the data in memory. @@ -165,80 +212,6 @@ public: int GetNextPackets(size_t numPackets, void * data); }; -#ifdef VLPT_REMOVED -class H5_HLCPPDLL VL_PacketTable : virtual public PacketTable -{ -public: - /* Constructor - * Creates a packet table in which to store variable length packets. - * Takes the ID of the file the packet table will be created in, the name of - * the packet table, and the size of a memory chunk used in chunking. - */ - VL_PacketTable(hid_t fileID, char* name, hsize_t chunkSize); - - /* "Open" Constructor - * Opens an existing variable-length packet table. - * Fails if the packet table specified is fixed-length. - */ - VL_PacketTable(hid_t fileID, char* name); - - /* AppendPacket - * Adds a single packet of any length to the packet table. - * Takes a pointer to the location of the data in memory and the length of the data - * in bytes. - * Returns 0 on success, negative on failure. - */ - int AppendPacket(void * data, size_t length); - - /* AppendPackets (multiple packets) - * Adds multiple variable-length packets to the packet table. Takes the - * number of packets to be added and a pointer to an array of - * hvl_t structs in memory. - * Returns 0 on success, negative on failure. - */ - int AppendPackets(size_t numPackets, hvl_t * data); - - /* GetPacket (indexed) - * Gets a single variable-length packet from the packet table. Takes - * the index of the packet (with 0 being the first packet) and a pointer - * to a hvl_t struct in which to store the packet's size and location. - * Returns 0 on success, negative on failure. - */ - int GetPacket(hsize_t index, hvl_t * data); - - /* GetPackets (multiple packets) - * Gets multiple variable-length packets at once, all packets between - * startIndex and endIndex inclusive. Takes a pointer to an array - * of hvl_t structs in memory in which to store pointers to the packets. - * Returns 0 on success, negative on failure. - */ - int GetPackets(hsize_t startIndex, hsize_t endIndex, hvl_t * data); - - /* GetNextPacket (single packet) - * Gets the next packet in the packet table. Takes a pointer to - * an hvl_t struct where the packet should be stored. - * Returns 0 on success, negative on failure. Index - * is not advanced to the next packet on failure. - */ - int GetNextPacket(hvl_t * data); - - /* GetNextPackets (multiple packets) - * Gets the next numPackets packets in the packet table. Takes a - * pointer to an array of hvl_t structs where pointers to the packets - * should be stored. - * Returns 0 on success, negative on failure. Index - * is not advanced on failure. - */ - int GetNextPackets(size_t numPackets, hvl_t * data); - - /* FreeReadbuff - * Frees the buffers created when variable-length packets are read. - * Takes the number of hvl_t structs to be freed and a pointer to their - * location in memory. - * Returns 0 on success, negative on error. - */ - int FreeReadbuff(size_t numStructs, hvl_t * buffer); -}; -#endif /* VLPT_REMOVED */ +/* Removed "#ifdef VLPT_REMOVED" block. 03/08/2016, -BMR */ #endif /* H5PTWRAP_H */ diff --git a/hl/c++/test/ptableTest.cpp b/hl/c++/test/ptableTest.cpp index 929058d..ff99285 100644 --- a/hl/c++/test/ptableTest.cpp +++ b/hl/c++/test/ptableTest.cpp @@ -15,9 +15,11 @@ /* ptableTest.cpp */ +#include <iostream> #include "ptableTest.h" using namespace H5; +using namespace std; #define TEST_FILE "packettest.h5" @@ -74,7 +76,7 @@ int main(void) return -1; } - +const char* BASICTEST_PT("/basicTest"); int BasicTest() { herr_t err; @@ -82,9 +84,9 @@ int BasicTest() hsize_t count; int error; - TESTING("basic funtionality") + TESTING("basic functionality") - FL_PacketTable wrapper(fileID, "/basicTest", H5T_NATIVE_INT, 1); + FL_PacketTable wrapper(fileID, H5P_DEFAULT, BASICTEST_PT, H5T_NATIVE_INT, 1); if(! wrapper.IsValid()) goto out; @@ -131,6 +133,7 @@ out: return 1; } +const char* CMPDTEST_PT("/compoundTest"); int TestCompoundDatatype() { hid_t dtypeID; @@ -153,8 +156,8 @@ int TestCompoundDatatype() H5Tinsert(dtypeID, "charlie", HOFFSET( compoundType, c ), H5T_NATIVE_SHORT); H5Tinsert(dtypeID, "ebert", HOFFSET( compoundType, e ), H5T_NATIVE_INT); - /* Create packet table. Explicitly specify no compression */ - FL_PacketTable wrapper(fileID, "/compoundTest", dtypeID, 1, -1); + /* Create packet table using default property list. */ + FL_PacketTable wrapper(fileID, H5P_DEFAULT, CMPDTEST_PT, dtypeID, 1); if(! wrapper.IsValid()) goto out; @@ -198,6 +201,7 @@ out: return 1; } +const char* GETNEXT_PT("/TestGetNext"); int TestGetNext() { int error; @@ -208,7 +212,7 @@ int TestGetNext() TESTING("GetNextPacket") /* Create a dataset */ - FL_PacketTable wrapper(fileID, "/TestGetNext", H5T_NATIVE_INT, 500); + FL_PacketTable wrapper(fileID, H5P_DEFAULT, GETNEXT_PT, H5T_NATIVE_INT, 500); if(! wrapper.IsValid()) goto out; @@ -260,18 +264,27 @@ out: return 1; } +const char* COMPRESS_PT("/compressTest"); int TestCompress() { - - unsigned int flags = 0; + unsigned int flags = 0; unsigned int config = 0; size_t cd_nelemts = 0; TESTING("compression") #ifdef H5_HAVE_FILTER_DEFLATE try { + /* Prepare property list to set compression, randomly use deflate */ + DSetCreatPropList dscreatplist; + dscreatplist.setDeflate(6); + /* Create packet table with compression. */ - FL_PacketTable wrapper(fileID, "/compressTest", H5T_NATIVE_CHAR, 100, 8); + FL_PacketTable wrapper(fileID, dscreatplist.getId(), COMPRESS_PT, H5T_NATIVE_CHAR, 100); + + /* Close the property list */ + dscreatplist.close(); + + /* Verify that the deflate filter is set */ /* Create an HDF5 C++ file object */ H5File file; @@ -279,11 +292,14 @@ int TestCompress() /* Make sure that the deflate filter is set by opening the packet table * as a dataset and getting its creation property list */ - DataSet dsetID = file.openDataSet("/compressTest"); + DataSet dset = file.openDataSet(COMPRESS_PT); - DSetCreatPropList dcplID = dsetID.getCreatePlist(); + DSetCreatPropList dcpl = dset.getCreatePlist(); - dcplID.getFilterById(H5Z_FILTER_DEFLATE, flags, cd_nelemts, NULL, 0, NULL, config); + char filter_name[8]; + dcpl.getFilterById(H5Z_FILTER_DEFLATE, flags, cd_nelemts, NULL, 8, filter_name, config); + if (HDstrncmp(filter_name, "deflate", 7) != 0) + H5_FAILED() } catch (Exception e) { H5_FAILED(); return 1; @@ -296,6 +312,7 @@ int TestCompress() return 0; } +const char* PT_TESTGETPT = "/TestGetPacket"; int TestGetPacket() { int record; @@ -304,7 +321,7 @@ int TestGetPacket() TESTING("GetPacket") /* Create a dataset. Explicitly specify no compression */ - FL_PacketTable wrapper(fileID, "/TestGetPacket", H5T_NATIVE_INT, 1, -1); + FL_PacketTable wrapper(fileID, H5P_DEFAULT, PT_TESTGETPT, H5T_NATIVE_INT, 1); if(! wrapper.IsValid()) goto out; @@ -334,12 +351,14 @@ out: return 1; } +const char* PT_TESTERROR = "/TestErrors"; + int TestErrors() { TESTING("error conditions") /* Create a dataset */ - FL_PacketTable wrapper(fileID, "/TestErrors", H5T_NATIVE_INT, 1); + FL_PacketTable wrapper(fileID, H5P_DEFAULT, PT_TESTERROR, H5T_NATIVE_INT, 1); if(! wrapper.IsValid()) goto out; @@ -443,6 +462,8 @@ out: return 1; } +const char* PT_SYSTEMTST1 = "/SystemTest1"; +const char* PT_SYSTEMTST2 = "/SystemTest2"; int SystemTest() { TESTING("multiple datatypes") @@ -485,8 +506,8 @@ int SystemTest() ct2[0].g.e = 3000; /* Create the packet table datasets. Make one of them compressed. */ - FL_PacketTable wrapper1(fileID, "/SystemTest1", dtypeID1, 1); - FL_PacketTable wrapper2(fileID, "/SystemTest2", dtypeID2, 1, 5); + FL_PacketTable wrapper1(fileID, H5P_DEFAULT, PT_SYSTEMTST1, dtypeID1, 1); + FL_PacketTable wrapper2(fileID, H5P_DEFAULT, PT_SYSTEMTST2, dtypeID2, 1); if(! wrapper1.IsValid()) goto out; diff --git a/hl/src/H5PT.c b/hl/src/H5PT.c index 6ed1ac0..e2d6a3d 100644 --- a/hl/src/H5PT.c +++ b/hl/src/H5PT.c @@ -48,15 +48,15 @@ static herr_t H5PT_get_index(htbl_t *table_id, hsize_t *pt_index); */ /*------------------------------------------------------------------------- - * Function: H5PTcreate_fl + * Function: H5PTcreate * * Purpose: Creates a dataset containing a table and returns the Identifier - * of the table. + * of the table. (Copied mostly from H5PTcreate_fl) * - * Return: Success: table ID, Failure: Negative + * Return: Success: table ID, Failure: FAIL * - * Programmer: Nat Furrer, nfurrer@ncsa.uiuc.edu - * James Laird, jlaird@ncsa.uiuc.edu + * 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 * @@ -65,80 +65,93 @@ static herr_t H5PT_get_index(htbl_t *table_id, hsize_t *pt_index); * 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_fl ( hid_t loc_id, - const char *dset_name, - hid_t dtype_id, - hsize_t chunk_size, - int compression ) +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_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 plistcopy_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; - if(compression >= 0 && compression <= 9) - if(H5Pset_deflate(plist_id, (unsigned)compression) < 0) - goto out; + 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, plist_id, H5P_DEFAULT)) < 0) - goto out; + 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 out; + goto error; /* End access to the property list */ - if(H5Pclose(plist_id) < 0) - goto out; - - /* Create the table identifier */ - table->dset_id = dset_id; + if(H5Pclose(plistcopy_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,32 +159,38 @@ 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 (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 */ + -#ifdef H5_VLPT_ENABLED /*------------------------------------------------------------------------- - * Function: H5PTcreate_vl + * Function: H5PTcreate_fl * - * Purpose: Creates a dataset containing a table of variable length records - * and returns the Identifier of the table. + * 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: April 12, 2004 + * Date: March 12, 2004 * - * Comments: This function does not handle compression or fill data + * Comments: This function does not handle fill data * currently. Fill data is not necessary because the * table is initially of size 0. * @@ -179,38 +198,104 @@ hid_t H5PTcreate_fl ( hid_t loc_id, * *------------------------------------------------------------------------- */ -hid_t H5PTcreate_vl ( hid_t loc_id, - const char*dset_name, - hsize_t chunk_size) + +hid_t H5PTcreate_fl ( hid_t loc_id, + const char *dset_name, + hid_t dtype_id, + hsize_t chunk_size, + int compression ) { - hid_t ret_value=H5I_BADID; - hid_t vltype; + htbl_t * table = NULL; + 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 = 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 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 */ + plist_id = H5Pcreate(H5P_DATASET_CREATE); + if(H5Pset_chunk(plist_id, 1, dims_chunk) < 0) + goto error; + if(compression >= 0 && compression <= 9) + if(H5Pset_deflate(plist_id, (unsigned)compression) < 0) + 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 error; - /* Create a variable length type that uses single bytes as its base type */ - vltype = H5Tvlen_create(H5T_NATIVE_UCHAR); - if(vltype < 0) - goto out; + /* Create the table identifier */ + table->dset_id = dset_id; - if((ret_value=H5PTcreate_fl(loc_id, dset_name, vltype, chunk_size, 0)) < 0) - goto out; + /* Terminate access to the data space. */ + if(H5Sclose(space_id) < 0) + goto error; - /* close the vltype */ - if(H5Tclose(vltype) < 0) - goto out; + /* End access to the property list */ + if(H5Pclose(plist_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; -out: - if(ret_value != H5I_BADID) - H5PTclose(ret_value); - return H5I_BADID; -} -#endif /* H%_VLPT_ENABLED */ +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); + } + + 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; +} diff --git a/hl/src/H5PTpublic.h b/hl/src/H5PTpublic.h index f919010..420275a 100644 --- a/hl/src/H5PTpublic.h +++ b/hl/src/H5PTpublic.h @@ -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 } diff --git a/hl/test/CMakeLists.txt b/hl/test/CMakeLists.txt index 916dcf3..bf598c4 100644 --- a/hl/test/CMakeLists.txt +++ b/hl/test/CMakeLists.txt @@ -48,9 +48,19 @@ HL_ADD_EXE (test_ds) HL_ADD_EXE (test_dset_opt) HL_ADD_EXE (test_image) HL_ADD_EXE (test_lite) -HL_ADD_EXE (test_packet) HL_ADD_EXE (test_table) +# test_packet has two source files +add_executable (hl_test_packet test_packet.c test_packet_vlen.c) +TARGET_NAMING (hl_test_packet STATIC) +TARGET_C_PROPERTIES (hl_test_packet STATIC " " " ") +target_link_libraries (hl_test_packet + ${HDF5_HL_LIB_TARGET} + ${HDF5_LIB_TARGET} + ${HDF5_TEST_LIB_TARGET} +) +set_target_properties (hl_test_packet PROPERTIES FOLDER test/hl) + # -------------------------------------------------------------------- # This executable is used to generate test files for the test_ds test. # It should only be run during development when new test files are needed diff --git a/hl/test/Makefile.am b/hl/test/Makefile.am index 0809deb..32d14b6 100644 --- a/hl/test/Makefile.am +++ b/hl/test/Makefile.am @@ -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 diff --git a/hl/test/Makefile.in b/hl/test/Makefile.in index 6fc324b..6ab37e6 100644 --- a/hl/test/Makefile.in +++ b/hl/test/Makefile.in @@ -148,8 +148,9 @@ test_lite_SOURCES = test_lite.c test_lite_OBJECTS = test_lite.$(OBJEXT) test_lite_LDADD = $(LDADD) test_lite_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5) -test_packet_SOURCES = test_packet.c -test_packet_OBJECTS = test_packet.$(OBJEXT) +am_test_packet_OBJECTS = test_packet.$(OBJEXT) \ + test_packet_vlen.$(OBJEXT) +test_packet_OBJECTS = $(am_test_packet_OBJECTS) test_packet_LDADD = $(LDADD) test_packet_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5) test_table_SOURCES = test_table.c @@ -191,10 +192,10 @@ am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = gen_test_ds.c test_ds.c test_dset_opt.c test_file_image.c \ - test_image.c test_lite.c test_packet.c test_table.c + test_image.c test_lite.c $(test_packet_SOURCES) test_table.c DIST_SOURCES = gen_test_ds.c test_ds.c test_dset_opt.c \ - test_file_image.c test_image.c test_lite.c test_packet.c \ - test_table.c + test_file_image.c test_image.c test_lite.c \ + $(test_packet_SOURCES) test_table.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -713,6 +714,9 @@ TEST_PROG = test_lite test_image test_file_image test_table test_ds test_packet # --enable-build-all at configure time. BUILD_ALL_PROGS = gen_test_ds +# Sources for test_packet executable +test_packet_SOURCES = test_packet.c test_packet_vlen.c + # 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., # lib_LIBRARIES are built for lib target), but EXTRA_LIB, EXTRA_PROG, and @@ -833,6 +837,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_image.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_lite.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_packet.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_packet_vlen.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_table.Po@am__quote@ .c.o: diff --git a/hl/test/h5hltest.h b/hl/test/h5hltest.h index e8292d2..9a5e702 100644 --- a/hl/test/h5hltest.h +++ b/hl/test/h5hltest.h @@ -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 */ diff --git a/hl/test/test_packet.c b/hl/test/test_packet.c index 256892b..0bd5292 100644 --- a/hl/test/test_packet.c +++ b/hl/test/test_packet.c @@ -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 || !FLT_ABS_EQUAL(rbuf[i].pressure,wbuf[j].pressure) || !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,222 +468,44 @@ 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; -} - -#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; + return FAIL; } -#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; + + /* Test packet table with variable length, using separate data file */ + if (test_packet_table_with_varlen() < 0) + status = 1; - /* close */ - H5Fclose(fid); + /* Close the file */ + H5Fclose(fid); - return status; + return status; } diff --git a/hl/test/test_packet_vlen.c b/hl/test/test_packet_vlen.c new file mode 100644 index 0000000..82c8d1c --- /dev/null +++ b/hl/test/test_packet_vlen.c @@ -0,0 +1,1693 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "h5hltest.h" + +/*------------------------------------------------------------------------- + * Packet Table with Variable-Length test + * + *------------------------------------------------------------------------- + */ + +#define NRECORDS 5 +#define TEST_FILE_NAME "test_packet_table_vlen.h5" +#define TESTFL_FILE_NAME "testfl_packet_table_vlen.h5" +#define PT_VLEN_ATOMIC "Dataset with VL of Atomic types" +#define PT_VLEN_COMP "Dataset with VL of Compound Types" +#define PT_COMP_VLEN "Dataset with Compound Type of VL types" +#define PT_VLEN_VLEN "Dataset with VL of VL types" +#define PT_FIXED_LEN "Fixed-length Packet Table" +#define SPACE3_RANK 1 +#define L1_INCM 16 +#define L2_INCM 8 +#define NAME_BUF_SIZE 80 + +/*------------------------------------------------------------------------- + * Local functions + *------------------------------------------------------------------------- + */ + +/* Verifies that the packet table is a variable- or fixed-length */ +static int verify_ptlengthtype(hid_t fid, const char *table_name, herr_t checked_value); + +/* Adds an attribute to the named packet table */ +static int adding_attribute(hid_t fid, const char *table_name, const char *attr_name); + +/* Verifies that the named attribute was written and is read correctly */ +static int verify_attribute(hid_t fid, const char *table_name, const char *attr_name); + +/*------------------------------------------------------------------------- + * test_VLof_atomic(): Test that a packet table with VL datatypes of atomic + * datatypes can be created and written correctly. (HDFFV-442) + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static int test_VLof_atomic(void) +{ + hid_t fid=H5I_INVALID_HID; /* Test file identifier */ + hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */ + hid_t vltype=H5I_INVALID_HID; /* Variable length datatype */ + hsize_t count; /* Number of records in the table */ + int ii, jj; /* Loop variables */ + hvl_t writeBuf[NRECORDS]; /* Buffer to hold data to be written */ + hvl_t readBuf[NRECORDS]; /* Buffer to hold read data */ + char msg[80]; /* For error message */ + herr_t ret; /* Returned status from a callee */ + + TESTING3(" with vlen of atomic"); + + /* Allocate and initialize VL data to write (copied from C test) */ + for (ii=0; ii<NRECORDS; ii++) { + writeBuf[ii].p = HDmalloc((ii+1)*sizeof(unsigned int)); + if (writeBuf[ii].p == NULL) { + fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii); + goto error; + } + writeBuf[ii].len = ii+1; + for (jj=0; jj<(ii+1); jj++) + ((unsigned int *)writeBuf[ii].p)[jj] = ii * 10 + jj; + } /* end for */ + + /* Open the file */ + fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + /* Create a vlen type that uses an atomic datatype as its base type */ + vltype = H5Tvlen_create (H5T_NATIVE_UINT); + if (vltype < 0) + goto error; + + /* Create a packet table that uses a vlen datatype of an atomic type */ + ptable = H5PTcreate(fid, PT_VLEN_ATOMIC, vltype, (hsize_t)1, H5P_DEFAULT); + + /* Ensure that PT is created successfully */ + if (ptable == H5I_INVALID_HID) + goto error; + + /* Close the vlen datatype */ + if (H5Tclose(vltype) < 0) + goto error; + + /* Write the entire buffer to the packet table */ + ret = H5PTappend(ptable, (size_t)NRECORDS, writeBuf); + if (ret < 0) + goto error; + + /* Get the number of packets in the packet table, should be NRECORDS. */ + ret = H5PTget_num_packets(ptable, &count); + if (ret < 0) + goto error; + + sprintf(msg, "The number of packets in the packet table must be %u\n", NRECORDS); + VERIFY(count == NRECORDS, msg); + + /* Read all five packets back */ + ret = H5PTread_packets(ptable, (hsize_t)0, (size_t)NRECORDS, (void*)readBuf ); + if (ret < 0) + goto error; + + for (ii = 0; ii < NRECORDS; ii++) + for (jj=0; jj<(ii+1); jj++) + { + if (((unsigned int *)readBuf[ii].p)[jj] != ((unsigned int *)writeBuf[ii].p)[jj]) { + printf("Packet %d's value should be %d\n", ii, ((unsigned int *)writeBuf[ii].p)[jj]); + printf("Packet %d's value in readBuf is %d\n", ii, ((unsigned int *)readBuf[ii].p)[jj]); + } + } + + /* Free the buffers */ + ret = H5PTfree_vlen_buff(ptable, NRECORDS, readBuf ); + if (ret < 0) + goto error; + ret = H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + if (ret < 0) + goto error; + + /* Close the packet table */ + ret = H5PTclose(ptable); + if (ret < 0) + goto error; + + /* Close the file */ + if (H5Fclose(fid) < 0) + goto error; + + PASSED(); + return SUCCEED; + +error: /* An error has occurred. Clean up and exit. */ + if (H5PTis_valid(ptable) > 0) H5PTclose(ptable); + if (fid > 0) H5Fclose(fid); + H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + H5_FAILED(); + return FAIL; +} /* test_VLof_atomic */ + +/*------------------------------------------------------------------------- + * test_VLof_comptype(): Test that a packet table with VL datatypes of + * compound datatypes can be created and written correctly. (HDFFV-442) + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static int test_VLof_comptype(void) +{ + /* Struct that the VL sequences are composed of */ + typedef struct { + int i; + float f; + } VLcomp_t; + hid_t fid=H5I_INVALID_HID; /* Test file identifier */ + hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */ + hid_t vltype=H5I_INVALID_HID; /* Variable length datatype */ + hid_t cmptype=H5I_INVALID_HID; /* Compound datatype */ + hvl_t writeBuf[NRECORDS]; /* Buffer to hold data to be written */ + hvl_t readBuf[NRECORDS]; /* Buffer to hold read data */ + hsize_t count; /* Number of records in the table */ + int ii, jj; /* Loop variables */ + char msg[80]; /* For error message */ + herr_t ret; + + TESTING3(" with vlen of compound datatypes"); + + /* Allocate and initialize VL data to write (copied from C test) */ + for (ii=0; ii<NRECORDS; ii++) { + writeBuf[ii].p = HDmalloc((ii+1)*sizeof(VLcomp_t)); + if(writeBuf[ii].p == NULL) { + fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii); + goto error; + } + writeBuf[ii].len = ii+1; + for (jj=0; jj<(ii+1); jj++) { + ((VLcomp_t *)writeBuf[ii].p)[jj].i = ii+jj; + ((VLcomp_t *)writeBuf[ii].p)[jj].f = (float)((ii+jj)/3.0F); + } /* end for */ + } /* end for */ + + /* Open the file */ + fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + /* Create the base compound type */ + cmptype = H5Tcreate(H5T_COMPOUND, sizeof(VLcomp_t)); + if (cmptype < 0) + goto error; + + /* Insert fields */ + ret = H5Tinsert(cmptype, "i", HOFFSET(VLcomp_t, i), H5T_NATIVE_INT); + if (ret < 0) + goto error; + ret = H5Tinsert(cmptype, "f", HOFFSET(VLcomp_t, f), H5T_NATIVE_FLOAT); + if (ret < 0) + goto error; + + /* Create a variable length type that uses the VLcomp_t as its base type */ + vltype = H5Tvlen_create(cmptype); + if (vltype < 0) + goto error; + + /* Create a packet table that uses a vlen datatype of compound datatype */ + ptable = H5PTcreate(fid, PT_VLEN_COMP, vltype, (hsize_t)1, H5P_DEFAULT); + + /* Ensure that PT is created successfully */ + if (ptable == H5I_INVALID_HID) + goto error; + + /* Close the vlen datatype */ + if (H5Tclose(vltype) < 0) + goto error; + + /* Write the entire buffer to the packet table */ + ret = H5PTappend(ptable, (size_t)5, writeBuf ); + if (ret < 0) + goto error; + + /* Get the number of packets in the packet table, should be NRECORDS. */ + ret = H5PTget_num_packets(ptable, &count); + if (ret < 0) + goto error; + + sprintf(msg, "The number of packets in the packet table must be %u\n", NRECORDS); + VERIFY(count == NRECORDS, msg); + + /* Read all five packets back */ + ret = H5PTread_packets(ptable, (hsize_t)0, (size_t)5, (void*)readBuf ); + if (ret < 0) + goto error; + + /* Compare data read in */ + for (ii = 0; ii < NRECORDS; ii++) { + if (writeBuf[ii].len != readBuf[ii].len) { + fprintf(stderr, "%d: VL data length don't match!, writeBuf[%d].len=%d, readBuf[%d].len=%d\n",__LINE__,(int)ii,(int)writeBuf[ii].len,(int)ii,(int)readBuf[ii].len); + continue; + } /* write len != read len */ + + for (jj=0; jj<(ii+1); jj++) { + if (((unsigned int *)writeBuf[ii].p)[jj] != ((unsigned int *)readBuf[ii].p)[jj] ) { + fprintf(stderr, "VL data values don't match!, writeBuf[ii].p[%d]=%d, readBuf[ii].p[%d]=%d\n",(int)jj, (int)((unsigned int *)writeBuf[ii].p)[jj], (int)jj, (int)((unsigned int *)readBuf[ii].p)[jj]); + continue; + } /* write value != read value */ + } + } /* end for */ + + /* Free the buffers */ + ret = H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + if (ret < 0) + goto error; + ret = H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + if (ret < 0) + goto error; + + /* Close the packet table */ + ret = H5PTclose(ptable); + if (ret < 0) + goto error; + + /* Close the file */ + if (H5Fclose(fid) < 0) + goto error; + + PASSED(); + return SUCCEED; + +error: /* An error has occurred. Clean up and exit. */ + if (H5PTis_valid(ptable) > 0) H5PTclose(ptable); + if (fid > 0) H5Fclose(fid); + H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + H5_FAILED(); + return FAIL; +} /* test_VLof_comptype */ + +/*------------------------------------------------------------------------- + * test_compound_VL_VL(): Test that a packet table of compound datatypes + * containing VL datatypes can be created and written + * correctly. (HDFFV-442) + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static int test_compound_VL_VLtype(void) +{ + /* Struct that the VL sequences are composed of */ + typedef struct { + int i; + float f; + hvl_t v; + } compVLVL_t; + hid_t fid=H5I_INVALID_HID; /* Test file identifier */ + hid_t space=H5I_INVALID_HID; /* Dataspace identifier */ + hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */ + hid_t vlatomic=H5I_INVALID_HID; /* Variable length datatype */ + hid_t vlofvl=H5I_INVALID_HID; /* Variable length datatype */ + hid_t comp_vlvl=H5I_INVALID_HID; /* ID of a compound datatype containing + a VL of VL of atomic datatype */ + hsize_t dims1[] = {NRECORDS}; + hsize_t count; /* Number of records in the table */ + compVLVL_t writeBuf[NRECORDS];/* Buffer to hold data to be written */ + compVLVL_t readBuf[NRECORDS]; /* Buffer to hold read data */ + hvl_t *t1, *t2; + int ii, jj, kk; /* Loop variables */ + char msg[80]; /* For error message */ + herr_t ret; /* Returned status from a callee */ + + TESTING3(" with compound datatype containing vlen datatype"); + + /* Allocate and initialize VL data to write (copied from C test) */ + for (ii=0; ii<NRECORDS; ii++) { + writeBuf[ii].i = ii*10; + writeBuf[ii].f = (float)((ii*20)/3.0F); + writeBuf[ii].v.p = HDmalloc((ii+L1_INCM)*sizeof(hvl_t)); + if (writeBuf[ii].v.p == NULL) { + fprintf(stderr, "Cannot allocate memory for VL data! ii=%d\n",ii); + goto error; + } + writeBuf[ii].v.len=ii+L1_INCM; + for (t1=(hvl_t *)((writeBuf[ii].v).p), jj=0; jj<(ii+L1_INCM); jj++, t1++) + { + t1->p = HDmalloc((jj+L2_INCM)*sizeof(unsigned int)); + if (t1->p == NULL) { + fprintf(stderr, "Cannot allocate memory for VL data! ii=%d\n",ii); + goto error; + } + t1->len = jj+L2_INCM; + for (kk=0; kk<jj+L2_INCM; kk++) + ((unsigned int*)t1->p)[kk] = ii*100 + jj*10 + kk; + } + } /* end for */ + + /* Open the file */ + fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + /* Create dataspace for datasets */ + space = H5Screate_simple(SPACE3_RANK, dims1, NULL); + if (space < 0) + goto error; + + /* Create a VL datatype of an atomic type */ + vlatomic = H5Tvlen_create (H5T_NATIVE_UINT); + if (vlatomic < 0) + goto error; + + /* Create a VL datatype of the VL of atomic datatype */ + vlofvl = H5Tvlen_create (vlatomic); + if (vlofvl < 0) + goto error; + + /* Create the base compound type */ + comp_vlvl = H5Tcreate(H5T_COMPOUND, sizeof(compVLVL_t)); + if (comp_vlvl < 0) + goto error; + + /* Insert fields: atomic, atomic, vlen */ + ret = H5Tinsert(comp_vlvl, "i", HOFFSET(compVLVL_t, i), H5T_NATIVE_INT); + if (ret < 0) + goto error; + ret = H5Tinsert(comp_vlvl, "f", HOFFSET(compVLVL_t, f), H5T_NATIVE_FLOAT); + if (ret < 0) + goto error; + ret = H5Tinsert(comp_vlvl, "v", HOFFSET(compVLVL_t, v), vlofvl); + if (ret < 0) + goto error; + + /* Create a packet table that uses a compound datatype of vlen datatype */ + ptable = H5PTcreate(fid, PT_COMP_VLEN, comp_vlvl, (hsize_t)1, H5P_DEFAULT); + + /* Ensure that PT is created successfully */ + if (ptable == H5I_INVALID_HID) + goto error; + + /* Close the vlen datatype */ + if (H5Tclose(comp_vlvl) < 0) + goto error; + + /* Write the entire buffer to the packet table */ + ret = H5PTappend(ptable, (size_t)NRECORDS, writeBuf ); + if (ret < 0) + goto error; + + /* Get the number of packets in the packet table, should be NRECORDS. */ + ret = H5PTget_num_packets(ptable, &count); + if (ret < 0) + goto error; + + sprintf(msg, "The number of packets in the packet table must be %u\n", NRECORDS); + VERIFY(count == NRECORDS, msg); + + /* Read all five packets back */ + ret = H5PTread_packets(ptable, (hsize_t)0, (size_t)NRECORDS, (void*)readBuf ); + if (ret < 0) + goto error; + + /* Compare data read in */ + for (ii = 0; ii < NRECORDS; ii++) { + if (writeBuf[ii].i != readBuf[ii].i) { + fprintf(stderr, "Integer components don't match!, writeBuf[%d].i=%d, readBuf[%d].i=%d\n",(int)ii,(int)writeBuf[ii].i,(int)ii,(int)readBuf[ii].i); + continue; + } /* end if */ + if (!H5_FLT_ABS_EQUAL(writeBuf[ii].f,readBuf[ii].f)) { + fprintf(stderr, "Float components don't match!, writeBuf[%d].f=%f, readBuf[%d].f=%f\n",(int)ii,(double)writeBuf[ii].f,(int)ii,(double)readBuf[ii].f); + continue; + } /* end if */ + + if (writeBuf[ii].v.len != readBuf[ii].v.len) { + fprintf(stderr, "%d: VL data length don't match!, writeBuf[%d].v.len=%d, readBuf[%d].v.len=%d\n",__LINE__,(int)ii,(int)writeBuf[ii].v.len,(int)ii,(int)readBuf[ii].v.len); + continue; + } /* end if */ + + for (t1=(hvl_t *)(writeBuf[ii].v.p), t2=(hvl_t *)(readBuf[ii].v.p), jj=0; (size_t)jj<readBuf[ii].v.len; jj++, t1++, t2++) { + if (t1->len != t2->len) { + fprintf(stderr, "%d: VL data length don't match!, ii=%d, jj=%d, t1->len=%d, t2->len=%d\n",__LINE__,(int)ii,(int)jj,(int)t1->len,(int)t2->len); + continue; + } /* end if */ + for (kk=0; (size_t)kk<t2->len; kk++) { + if (((unsigned int *)t1->p)[kk] != ((unsigned int *)t2->p)[kk] ) { + fprintf(stderr, "VL data values don't match!, t1->p[%d]=%d, t2->p[%d]=%d\n",(int)kk, (int)((unsigned int *)t1->p)[kk], (int)kk, (int)((unsigned int *)t2->p)[kk]); + continue; + } /* end if */ + } /* end for */ + } /* end for */ + } /* end for */ + + /* Free the buffers */ + ret = H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + if (ret < 0) + goto error; + ret = H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + if (ret < 0) + goto error; + + /* Close the packet table */ + ret = H5PTclose(ptable); + if (ret < 0) + goto error; + + /* Release datatypes */ + if (H5Tclose(vlatomic) < 0) + goto error; + if (H5Tclose(vlofvl) < 0) + goto error; + + /* Close the file */ + if (H5Fclose(fid) < 0) + goto error; + + PASSED(); + return SUCCEED; + +error: /* An error has occurred. Clean up and exit. */ + if (H5PTis_valid(ptable) > 0) H5PTclose(ptable); + if (fid > 0) H5Fclose(fid); + H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + H5_FAILED(); + return FAIL; +} /* test_compound_VL_VLtype */ + +/*------------------------------------------------------------------------- + * test_VLof_VLtype(): Test that a packet table of VL datatype with VL + * datatypes of atomic datatypes can be created and written + * correctly. (HDFFV-442) + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static int test_VLof_VLtype(void) +{ + hid_t fid=H5I_INVALID_HID; /* Test file identifier */ + hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */ + hid_t vlatomic=H5I_INVALID_HID; /* Variable length datatype */ + hid_t vlofvl=H5I_INVALID_HID; /* VL datatype of VL datatypes */ + hsize_t count; /* Number of records in the table */ + hvl_t *t1; /* pointer to advance */ + int ii, jj, kk; /* Loop variables */ + hvl_t writeBuf[NRECORDS]; /* Buffer to hold data to be written */ + hvl_t readBuf[NRECORDS]; /* Buffer to hold read data */ + char msg[80]; /* For error message */ + herr_t ret; /* Returned status from a callee */ + + TESTING3(" with vlen datatype of vlen datatype"); + + /* Allocate and initialize VL data to write (copied from C test) */ + for (ii=0; ii< NRECORDS; ii++) { + writeBuf[ii].p = HDmalloc((ii+1)*sizeof(hvl_t)); + if (writeBuf[ii].p == NULL) { + fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii); + goto error; + } /* end if */ + writeBuf[ii].len = ii+1; + for (t1=(hvl_t *)(writeBuf[ii].p), jj=0; jj<(ii+1); jj++, t1++) + { + t1->p = HDmalloc((jj+1)*sizeof(unsigned int)); + if (t1->p == NULL) { + fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii); + goto error; + } + t1->len = jj+1; + for (kk=0; kk<(jj+1); kk++) + ((unsigned int *)t1->p)[kk] = ii*100+jj*10+kk; + } /* end for */ + } /* end for */ + + /* Open the file */ + fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + /* Create a VL datatype of an atomic type */ + vlatomic = H5Tvlen_create (H5T_NATIVE_UINT); + if (vlatomic < 0) + goto error; + + vlofvl = H5Tvlen_create (vlatomic); + if (vlofvl < 0) + goto error; + + /* Create a packet table that uses a vlen datatype of vlen datatype */ + ptable = H5PTcreate(fid, PT_VLEN_VLEN, vlofvl, (hsize_t)1, H5P_DEFAULT); + + /* Ensure that PT is created successfully */ + if (ptable == H5I_INVALID_HID) + goto error; + + /* Close the vlen datatype */ + if (H5Tclose(vlofvl) < 0) + goto error; + + /* Write the entire buffer to the packet table */ + ret = H5PTappend(ptable, (size_t)5, writeBuf ); + if (ret < 0) + goto error; + + /* Get the number of packets in the packet table, should be NRECORDS. */ + ret = H5PTget_num_packets(ptable, &count); + if (ret < 0) + goto error; + + sprintf(msg, "The number of packets in the packet table must be %u\n", NRECORDS); + VERIFY(count == NRECORDS, msg); + + /* Read all five packets back */ + ret = H5PTread_packets(ptable, (hsize_t)0, (size_t)5, (void*)readBuf ); + if (ret < 0) + goto error; + + /* Free the buffers */ + ret = H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + if (ret < 0) + goto error; + ret = H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + if (ret < 0) + goto error; + + /* Close the packet table */ + ret = H5PTclose(ptable); + if (ret < 0) + goto error; + + /* Close the file */ + if (H5Fclose(fid) < 0) + goto error; + + PASSED(); + return SUCCEED; + +error: /* An error has occurred. Clean up and exit. */ + if (H5PTis_valid(ptable) > 0) H5PTclose(ptable); + if (fid > 0) H5Fclose(fid); + H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + H5_FAILED(); + return FAIL; +} /* test_VLof_VLtype */ + +/*------------------------------------------------------------------------- + * verify_ptlengthtype() - helper function, verifies that the named packet + * table is a fixed-length or variable-length as indicated by the last + * argument. + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static int verify_ptlengthtype(hid_t fid, const char *table_name, herr_t expected_value) +{ + hid_t ptable = H5I_INVALID_HID; /* Packet table identifier */ + herr_t is_varlen = 0; + herr_t ret = FAIL; + + /* Open the named packet table */ + if( (ptable = H5PTopen(fid, table_name)) < 0) + goto error; + + /* Verify the value returned from H5PTis_varlen is as expected */ + is_varlen = H5PTis_varlen(ptable); + if (is_varlen == FAIL) + goto error; + else if (is_varlen == expected_value) + ret = SUCCEED; + else + { + char lenthtype[20]; + HDstrcpy(lenthtype, "fixed-length"); + if (expected_value == 1) + HDstrcpy(lenthtype, "variable-length"); + fprintf(stderr, "\nPacket table '%s' should be %s but is not\n", table_name, lenthtype); + ret = FAIL; + } + + /* Close the packet table */ + if (H5PTclose(ptable) < 0) + goto error; + + return ret; + +error: /* An error has occurred. Clean up and exit. */ + if (H5PTis_valid(ptable) > 0) H5PTclose(ptable); + return ret; +} /* verify_ptlengthtype */ + +/*------------------------------------------------------------------------- + * test_H5PTis_varlen(): Test that H5PTis_varlen works correctly on both + * fixed- and variable-length packet tables. + * + * Description: + * - Added a fixed-length packet table to the file for variety + * - Use the helper funtion verify_ptlengthtype to test H5PTis_varlen + * on each packet table. + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static int test_H5PTis_varlen(void) +{ + hid_t fid=H5I_INVALID_HID; /* Test file identifier */ + hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */ + herr_t ret; /* Returned status from a callee */ + + TESTING("H5PTis_varlen"); + + /* Open the file */ + fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + /* Create a new table */ + ptable = H5PTcreate(fid, PT_FIXED_LEN, H5T_STD_I32BE, (hsize_t)100, H5P_DEFAULT); + + /* Ensure that PT is created successfully */ + if (ptable == H5I_INVALID_HID) + goto error; + + /* Close the packet table */ + ret = H5PTclose(ptable); + if (ret < 0) + goto error; + + /* Close the file */ + if (H5Fclose(fid) < 0) + goto error; + + /* Open the file */ + fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + /* Open each packet table, and verify that H5PTis_varlen returns correct + type for each table */ + ret = verify_ptlengthtype(fid, PT_VLEN_ATOMIC, 1); /* vlen of atomic */ + if (ret < 0) + goto error; + ret = verify_ptlengthtype(fid, PT_VLEN_COMP, 1); /* vlen of compound */ + if (ret < 0) + goto error; + ret = verify_ptlengthtype(fid, PT_COMP_VLEN, 0); /* compound of vlen, no vlen */ + if (ret < 0) + goto error; + ret = verify_ptlengthtype(fid, PT_VLEN_VLEN, 1); /* vlen of vlen */ + if (ret < 0) + goto error; + ret = verify_ptlengthtype(fid, PT_FIXED_LEN, 0); /* no vlen */ + if (ret < 0) + goto error; + + /* Close the file */ + if (H5Fclose(fid) < 0) + goto error; + + PASSED(); + return SUCCEED; + +error: /* An error has occurred. Clean up and exit. */ + if (fid > 0) H5Fclose(fid); + H5_FAILED(); + return FAIL; +} /* test_H5PTis_varlen */ + +/*------------------------------------------------------------------------- + * adding_attribute() - helper function, adds an attribute to the named + * packet table. + * Note: + * For simplicity, the attributes that are added to the packet tables + * have the same characteristics except their names. They have the + * same type, space, and values. + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +#define ATTR_RANK 1 +#define ATTR_DIM 3 +int attr_data[ATTR_DIM]={256,11945,-22107}; /* values to be written to attr */ + +static int adding_attribute(hid_t fid, const char *table_name, const char *attr_name) +{ + hid_t ptable = H5I_INVALID_HID; /* Packet table identifier */ + hid_t space_id = H5I_INVALID_HID; /* Dataspace for the attribute */ + hid_t attr_id = H5I_INVALID_HID; /* Attribute identifier */ + hid_t dset_id = H5I_INVALID_HID; /* Dataset identifier */ + hsize_t dims[] = {ATTR_DIM}; /* Dimension for dataspace */ + int ret = FAIL; /* Returned status from a callee */ + + /* Create dataspace for attribute */ + space_id = H5Screate_simple(ATTR_RANK, dims, NULL); + if (space_id < 0) + goto error; + + /* Open the named packet table */ + if( (ptable = H5PTopen(fid, table_name)) < 0) + goto error; + + dset_id = H5PTget_dataset(ptable); + if (dset_id < 0) + goto error; + + /* Add the specified attribute to it */ + attr_id = H5Acreate2(dset_id, attr_name, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT); + if (attr_id < 0) + goto error; + + /* Write attribute values */ + ret = H5Awrite(attr_id, H5T_NATIVE_INT, attr_data); + if (ret < 0) + goto error; + + /* Close the attribute */ + if (H5Aclose(attr_id) < 0) + goto error; + + /* Close the packet table */ + if (H5PTclose(ptable) < 0) + goto error; + + return SUCCEED; + +error: /* An error has occurred. Clean up and exit. */ + if (H5PTis_valid(ptable) > 0) H5PTclose(ptable); + return ret; +} /* adding_attribute */ + +/*------------------------------------------------------------------------- + * verify_attribute() - helper function, verifies the named attribute can + * be read correctly. + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static herr_t verify_attribute(hid_t fid, const char *table_name, const char *attr_name) +{ + hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */ + hid_t space_id=H5I_INVALID_HID; /* Dataspace for the attribute */ + hid_t attr_id=H5I_INVALID_HID; /* Attribute identifier */ + hid_t dset_id=H5I_INVALID_HID; /* Dataset associated with the pt */ + hsize_t dims[] = {ATTR_DIM}; /* Dimensions for dataspace */ + int read_data[ATTR_DIM]; /* Output buffer */ + int ii; + herr_t ret = FAIL; /* Returned status from a callee */ + + /* Create dataspace for attribute */ + space_id = H5Screate_simple(ATTR_RANK, dims, NULL); + if (space_id < 0) + goto error; + + /* Open the named packet table */ + ptable = H5PTopen(fid, table_name); + if (ptable < 0) + goto error; + + /* Get the dataset id of this packet table */ + dset_id = H5PTget_dataset(ptable); + if (dset_id < 0) + goto error; + + /* Open first attribute for the dataset */ + attr_id = H5Aopen(dset_id, attr_name, H5P_DEFAULT); + if (attr_id < 0) + goto error; + + /* Read attribute values */ + ret = H5Aread(attr_id, H5T_NATIVE_INT, read_data); + if (ret < 0) + goto error; + + /* Verify values read in */ + for (ii = 0; ii < ATTR_DIM; ii++) + if (attr_data[ii] != read_data[ii]) + TestErrPrintf("%d: attribute data different: attr_data[%d]=%d, read_data[%d]=%d\n", __LINE__, ii, attr_data[ii], ii, read_data[ii]); + + /* Close the attribute */ + if (H5Aclose(attr_id) < 0) + goto error; + + /* Close the packet table */ + if (H5PTclose(ptable) < 0) + goto error; + + return SUCCEED; + +error: /* An error has occurred. Clean up and exit. */ + if (attr_id > 0) H5Aclose(attr_id); + if (H5PTis_valid(ptable) > 0) H5PTclose(ptable); + return ret; +} /* verify_attribute */ + +/*------------------------------------------------------------------------- + * test_attributes(): Test adding attributes to packet tables + * + * Description: + * Added attributes to some random packet tables in the file. + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static int test_attributes(void) +{ + hid_t fid=H5I_INVALID_HID; /* File identifier */ + hid_t attr_id=H5I_INVALID_HID; /* Attribute identifier */ + herr_t ret = FAIL; /* Returned status from a callee */ + + TESTING("adding attributes to packet tables"); + + /* Open the file */ + fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + /* Add an arbitrary attribute to a few packet tables, using helper func */ + attr_id = adding_attribute(fid, PT_VLEN_ATOMIC, "Attribute 1"); + if (attr_id < 0) + goto error; + attr_id = adding_attribute(fid, PT_VLEN_COMP, "Attribute 2"); + if (attr_id < 0) + goto error; + attr_id = adding_attribute(fid, PT_COMP_VLEN, "Attribute 3"); + if (attr_id < 0) + goto error; + + /* Close the file */ + if (H5Fclose(fid) < 0) + goto error; + + /* Open the file again */ + fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + /* Read each attribute and verify the values, using helper function */ + ret = verify_attribute(fid, PT_VLEN_ATOMIC, "Attribute 1"); + if (ret < 0) + goto error; + ret = verify_attribute(fid, PT_VLEN_COMP, "Attribute 2"); + if (ret < 0) + goto error; + ret = verify_attribute(fid, PT_COMP_VLEN, "Attribute 3"); + if (ret < 0) + goto error; + + /* Close the file */ + if (H5Fclose(fid) < 0) + goto error; + + PASSED(); + return(ret); + +error: /* An error has occurred. Clean up and exit. */ + H5Fclose(fid); + H5_FAILED(); + return FAIL; +} /* test_attributes */ + +/*------------------------------------------------------------------------- + * verify_accessors() - helper function, verifies that various info can be + * retrieved correctly using the info returned by the accessor functions. + * + * Description: + * Testing functions H5PTget_dataset and H5PTget_type + * + * - Opens the named packet table + * - Gets its associated dataset ID then calls a C function on that ID + * to verify the dataset name + * - Gets its associated datatype ID then calls a C function on that ID + * to verify that the packet table is variable- or fixed-length as + * indicated by the expected_value argument + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static herr_t verify_accessors(const char *table_name, herr_t expected_value) +{ + hid_t fid=H5I_INVALID_HID; /* File identifier */ + hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */ + hid_t dset_id=H5I_INVALID_HID; /* Dataset associated with the pt */ + hid_t dtype_id=H5I_INVALID_HID; /* Dataset identifier */ + char buf[NAME_BUF_SIZE]; + ssize_t name_size; + herr_t is_varlen = 0; + herr_t ret = FAIL; /* Returned status from a callee */ + + /* Open the file. */ + fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + /* Open the named packet table. */ + ptable = H5PTopen(fid, table_name); + if (ptable < 0) + goto error; + + /* Get the associated dataset ID. */ + dset_id = H5PTget_dataset(ptable); + if (dset_id < 0) + goto error; + + /* Check if the packet table's name matches its associated dataset's. */ + *buf = '\0'; + name_size = H5Iget_name(dset_id, (char*)buf, NAME_BUF_SIZE); + VERIFY(HDstrcmp(buf, table_name), "Names of dataset and packet table don't match"); + + /* Get the packet table's datatype ID */ + dtype_id = H5PTget_type(ptable); + if (dtype_id < 0) + goto error; + + /* Check if the type class matches that of the packet table. */ + is_varlen = H5Tdetect_class(dtype_id, H5T_VLEN); + if (is_varlen == FAIL) /* failure occurred */ + goto error; + else if (is_varlen == expected_value) /* length types match */ + ret = SUCCEED; + else /* length types don't match */ + { + /* Give lengthtype "fixed-length" or "variable-length" depending on the + expected_value passed in, then print the error message. */ + char lenthtype[20]; + HDstrcpy(lenthtype, "fixed-length"); + if (expected_value == 1) + HDstrcpy(lenthtype, "variable-length"); + fprintf(stderr, "\nThe dataset '%s' should be %s but is not\n", table_name, lenthtype); + ret = FAIL; + } + + /* Close the packet table */ + if (H5PTclose(ptable) < 0) + goto error; + + return SUCCEED; + +error: /* An error has occurred. Clean up and exit. */ + if (H5PTis_valid(ptable) > 0) H5PTclose(ptable); + return ret; +} /* verify_accessors */ + +/*------------------------------------------------------------------------- + * test_accessors(): Test the accessor functions + * + * Description: + * Retrieves the dataset and datatype IDs and verifies various info + * to ensure these IDs are correct. + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static int test_accessors(void) +{ + hid_t fid=H5I_INVALID_HID; /* File identifier */ + hid_t ptable=H5I_INVALID_HID; /* File identifier */ + herr_t ret = FAIL; /* Returned status from a callee */ + + TESTING("accessor functions"); + + /* Open the file */ + fid = H5Fopen(TEST_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + ret = verify_accessors(PT_VLEN_ATOMIC, TRUE); + if (ret < 0) + goto error; + + ret = verify_accessors(PT_FIXED_LEN, FALSE); + if (ret < 0) + goto error; + + /* Close the file */ + if (H5Fclose(fid) < 0) + goto error; + + PASSED(); + return SUCCEED; + +error: /* An error has occurred. Clean up and exit. */ + if (H5PTis_valid(ptable) > 0) H5PTclose(ptable); + if (fid > 0) H5Fclose(fid); + H5_FAILED(); + return FAIL; +} /* test_accessors */ + +/************************************************************************** + Test set for deprecated function H5PTcreate_fl + Each test in this set is the same as the corresponding one in the + set for H5PTcreate, as of Mar 2016 + +**************************************************************************/ + +/*------------------------------------------------------------------------- + * testfl_VLof_atomic(): Test that a packet table with VL datatypes of atomic + * datatypes can be created and written correctly. (HDFFV-442) + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static int testfl_VLof_atomic(void) +{ + hid_t fid=H5I_INVALID_HID; /* Test file identifier */ + hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */ + hid_t vltype=H5I_INVALID_HID; /* Variable length datatype */ + hsize_t count; /* Number of records in the table */ + int ii, jj; /* Loop variables */ + hvl_t writeBuf[NRECORDS]; /* Buffer to hold data to be written */ + hvl_t readBuf[NRECORDS]; /* Buffer to hold read data */ + char msg[80]; /* For error message */ + herr_t ret; /* Returned status from a callee */ + + TESTING3(" with vlen of atomic"); + + /* Allocate and initialize VL data to write (copied from C test) */ + for (ii=0; ii<NRECORDS; ii++) { + writeBuf[ii].p = HDmalloc((ii+1)*sizeof(unsigned int)); + if (writeBuf[ii].p == NULL) { + fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii); + goto error; + } + writeBuf[ii].len = ii+1; + for (jj=0; jj<(ii+1); jj++) + ((unsigned int *)writeBuf[ii].p)[jj] = ii * 10 + jj; + } /* end for */ + + /* Open the file */ + fid = H5Fopen(TESTFL_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + /* Create a vlen type that uses an atomic datatype as its base type */ + vltype = H5Tvlen_create (H5T_NATIVE_UINT); + if (vltype < 0) + goto error; + + /* Create a packet table that uses a vlen datatype of an atomic type */ + ptable = H5PTcreate_fl(fid, PT_VLEN_ATOMIC, vltype, (hsize_t)1, 0); + + /* Ensure that PT is created successfully */ + if (ptable == H5I_INVALID_HID) + goto error; + + /* Close the vlen datatype */ + if (H5Tclose(vltype) < 0) + goto error; + + /* Write the entire buffer to the packet table */ + ret = H5PTappend(ptable, (size_t)NRECORDS, writeBuf); + if (ret < 0) + goto error; + + /* Get the number of packets in the packet table, should be NRECORDS. */ + ret = H5PTget_num_packets(ptable, &count); + if (ret < 0) + goto error; + + sprintf(msg, "The number of packets in the packet table must be %u\n", NRECORDS); + VERIFY(count == NRECORDS, msg); + + /* Read all five packets back */ + ret = H5PTread_packets(ptable, (hsize_t)0, (size_t)NRECORDS, (void*)readBuf ); + if (ret < 0) + goto error; + + for (ii = 0; ii < NRECORDS; ii++) + for (jj=0; jj<(ii+1); jj++) + { + if (((unsigned int *)readBuf[ii].p)[jj] != ((unsigned int *)writeBuf[ii].p)[jj]) { + printf("Packet %d's value should be %d\n", ii, ((unsigned int *)writeBuf[ii].p)[jj]); + printf("Packet %d's value in readBuf is %d\n", ii, ((unsigned int *)readBuf[ii].p)[jj]); + } + } + + /* Free the buffers */ + ret = H5PTfree_vlen_buff(ptable, NRECORDS, readBuf ); + if (ret < 0) + goto error; + ret = H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + if (ret < 0) + goto error; + + /* Close the packet table */ + ret = H5PTclose(ptable); + if (ret < 0) + goto error; + + /* Close the file */ + if (H5Fclose(fid) < 0) + goto error; + + PASSED(); + return SUCCEED; + +error: /* An error has occurred. Clean up and exit. */ + if (H5PTis_valid(ptable) > 0) H5PTclose(ptable); + if (fid > 0) H5Fclose(fid); + H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + H5_FAILED(); + return FAIL; +} /* testfl_VLof_atomic */ + +/*------------------------------------------------------------------------- + * testfl_VLof_comptype(): Test that a packet table with VL datatypes of + * compound datatypes can be created and written correctly. (HDFFV-442) + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static int testfl_VLof_comptype(void) +{ + /* Struct that the VL sequences are composed of */ + typedef struct { + int i; + float f; + } VLcomp_t; + hid_t fid=H5I_INVALID_HID; /* Test file identifier */ + hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */ + hid_t vltype=H5I_INVALID_HID; /* Variable length datatype */ + hid_t cmptype=H5I_INVALID_HID; /* Compound datatype */ + hvl_t writeBuf[NRECORDS]; /* Buffer to hold data to be written */ + hvl_t readBuf[NRECORDS]; /* Buffer to hold read data */ + hsize_t count; /* Number of records in the table */ + int ii, jj; /* Loop variables */ + char msg[80]; /* For error message */ + herr_t ret; + + TESTING3(" with vlen of compound datatypes"); + + /* Allocate and initialize VL data to write (copied from C test) */ + for (ii=0; ii<NRECORDS; ii++) { + writeBuf[ii].p = HDmalloc((ii+1)*sizeof(VLcomp_t)); + if(writeBuf[ii].p == NULL) { + fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii); + goto error; + } + writeBuf[ii].len = ii+1; + for (jj=0; jj<(ii+1); jj++) { + ((VLcomp_t *)writeBuf[ii].p)[jj].i = ii+jj; + ((VLcomp_t *)writeBuf[ii].p)[jj].f = (float)((ii+jj)/3.0F); + } /* end for */ + } /* end for */ + + /* Open the file */ + fid = H5Fopen(TESTFL_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + /* Create the base compound type */ + cmptype = H5Tcreate(H5T_COMPOUND, sizeof(VLcomp_t)); + if (cmptype < 0) + goto error; + + /* Insert fields */ + ret = H5Tinsert(cmptype, "i", HOFFSET(VLcomp_t, i), H5T_NATIVE_INT); + if (ret < 0) + goto error; + ret = H5Tinsert(cmptype, "f", HOFFSET(VLcomp_t, f), H5T_NATIVE_FLOAT); + if (ret < 0) + goto error; + + /* Create a variable length type that uses the VLcomp_t as its base type */ + vltype = H5Tvlen_create(cmptype); + if (vltype < 0) + goto error; + + /* Create a packet table that uses a vlen datatype of compound datatype */ + ptable = H5PTcreate_fl(fid, PT_VLEN_COMP, vltype, (hsize_t)1, 0); + + /* Ensure that PT is created successfully */ + if (ptable == H5I_INVALID_HID) + goto error; + + /* Close the vlen datatype */ + if (H5Tclose(vltype) < 0) + goto error; + + /* Write the entire buffer to the packet table */ + ret = H5PTappend(ptable, (size_t)5, writeBuf ); + if (ret < 0) + goto error; + + /* Get the number of packets in the packet table, should be NRECORDS. */ + ret = H5PTget_num_packets(ptable, &count); + if (ret < 0) + goto error; + + sprintf(msg, "The number of packets in the packet table must be %u\n", NRECORDS); + VERIFY(count == NRECORDS, msg); + + /* Read all five packets back */ + ret = H5PTread_packets(ptable, (hsize_t)0, (size_t)5, (void*)readBuf ); + if (ret < 0) + goto error; + + /* Compare data read in */ + for (ii = 0; ii < NRECORDS; ii++) { + if (writeBuf[ii].len != readBuf[ii].len) { + fprintf(stderr, "%d: VL data length don't match!, writeBuf[%d].len=%d, readBuf[%d].len=%d\n",__LINE__,(int)ii,(int)writeBuf[ii].len,(int)ii,(int)readBuf[ii].len); + continue; + } /* write len != read len */ + + for (jj=0; jj<(ii+1); jj++) { + if (((unsigned int *)writeBuf[ii].p)[jj] != ((unsigned int *)readBuf[ii].p)[jj] ) { + fprintf(stderr, "VL data values don't match!, writeBuf[ii].p[%d]=%d, readBuf[ii].p[%d]=%d\n",(int)jj, (int)((unsigned int *)writeBuf[ii].p)[jj], (int)jj, (int)((unsigned int *)readBuf[ii].p)[jj]); + continue; + } /* write value != read value */ + } + } /* end for */ + + /* Free the buffers */ + ret = H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + if (ret < 0) + goto error; + ret = H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + if (ret < 0) + goto error; + + /* Close the packet table */ + ret = H5PTclose(ptable); + if (ret < 0) + goto error; + + /* Close the file */ + if (H5Fclose(fid) < 0) + goto error; + + PASSED(); + return SUCCEED; + +error: /* An error has occurred. Clean up and exit. */ + if (H5PTis_valid(ptable) > 0) H5PTclose(ptable); + if (fid > 0) H5Fclose(fid); + H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + H5_FAILED(); + return FAIL; +} /* testfl_VLof_comptype */ + +/*------------------------------------------------------------------------- + * testfl_compound_VL_VL(): Test that a packet table of compound datatypes + * containing VL datatypes can be created and written + * correctly. (HDFFV-442) + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static int testfl_compound_VL_VLtype(void) +{ + /* Struct that the VL sequences are composed of */ + typedef struct { + int i; + float f; + hvl_t v; + } compVLVL_t; + hid_t fid=H5I_INVALID_HID; /* Test file identifier */ + hid_t space=H5I_INVALID_HID; /* Dataspace identifier */ + hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */ + hid_t vlatomic=H5I_INVALID_HID; /* Variable length datatype */ + hid_t vlofvl=H5I_INVALID_HID; /* Variable length datatype */ + hid_t comp_vlvl=H5I_INVALID_HID; /* ID of a compound datatype containing + a VL of VL of atomic datatype */ + hsize_t dims1[] = {NRECORDS}; + hsize_t count; /* Number of records in the table */ + compVLVL_t writeBuf[NRECORDS];/* Buffer to hold data to be written */ + compVLVL_t readBuf[NRECORDS]; /* Buffer to hold read data */ + hvl_t *t1, *t2; + int ii, jj, kk; /* Loop variables */ + char msg[80]; /* For error message */ + herr_t ret; /* Returned status from a callee */ + + TESTING3(" with compound datatype containing vlen datatype"); + + /* Allocate and initialize VL data to write (copied from C test) */ + for (ii=0; ii<NRECORDS; ii++) { + writeBuf[ii].i = ii*10; + writeBuf[ii].f = (float)((ii*20)/3.0F); + writeBuf[ii].v.p = HDmalloc((ii+L1_INCM)*sizeof(hvl_t)); + if (writeBuf[ii].v.p == NULL) { + fprintf(stderr, "Cannot allocate memory for VL data! ii=%d\n",ii); + goto error; + } + writeBuf[ii].v.len=ii+L1_INCM; + for (t1=(hvl_t *)((writeBuf[ii].v).p), jj=0; jj<(ii+L1_INCM); jj++, t1++) + { + t1->p = HDmalloc((jj+L2_INCM)*sizeof(unsigned int)); + if (t1->p == NULL) { + fprintf(stderr, "Cannot allocate memory for VL data! ii=%d\n",ii); + goto error; + } + t1->len = jj+L2_INCM; + for (kk=0; kk<jj+L2_INCM; kk++) + ((unsigned int*)t1->p)[kk] = ii*100 + jj*10 + kk; + } + } /* end for */ + + /* Open the file */ + fid = H5Fopen(TESTFL_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + /* Create dataspace for datasets */ + space = H5Screate_simple(SPACE3_RANK, dims1, NULL); + if (space < 0) + goto error; + + /* Create a VL datatype of an atomic type */ + vlatomic = H5Tvlen_create (H5T_NATIVE_UINT); + if (vlatomic < 0) + goto error; + + /* Create a VL datatype of the VL of atomic datatype */ + vlofvl = H5Tvlen_create (vlatomic); + if (vlofvl < 0) + goto error; + + /* Create the base compound type */ + comp_vlvl = H5Tcreate(H5T_COMPOUND, sizeof(compVLVL_t)); + if (comp_vlvl < 0) + goto error; + + /* Insert fields: atomic, atomic, vlen */ + ret = H5Tinsert(comp_vlvl, "i", HOFFSET(compVLVL_t, i), H5T_NATIVE_INT); + if (ret < 0) + goto error; + ret = H5Tinsert(comp_vlvl, "f", HOFFSET(compVLVL_t, f), H5T_NATIVE_FLOAT); + if (ret < 0) + goto error; + ret = H5Tinsert(comp_vlvl, "v", HOFFSET(compVLVL_t, v), vlofvl); + if (ret < 0) + goto error; + + /* Create a packet table that uses a compound datatype of vlen datatype */ + ptable = H5PTcreate_fl(fid, PT_COMP_VLEN, comp_vlvl, (hsize_t)1, 0); + + /* Ensure that PT is created successfully */ + if (ptable == H5I_INVALID_HID) + goto error; + + /* Close the vlen datatype */ + if (H5Tclose(comp_vlvl) < 0) + goto error; + + /* Write the entire buffer to the packet table */ + ret = H5PTappend(ptable, (size_t)NRECORDS, writeBuf ); + if (ret < 0) + goto error; + + /* Get the number of packets in the packet table, should be NRECORDS. */ + ret = H5PTget_num_packets(ptable, &count); + if (ret < 0) + goto error; + + sprintf(msg, "The number of packets in the packet table must be %u\n", NRECORDS); + VERIFY(count == NRECORDS, msg); + + /* Read all five packets back */ + ret = H5PTread_packets(ptable, (hsize_t)0, (size_t)NRECORDS, (void*)readBuf ); + if (ret < 0) + goto error; + + /* Compare data read in */ + for (ii = 0; ii < NRECORDS; ii++) { + if (writeBuf[ii].i != readBuf[ii].i) { + fprintf(stderr, "Integer components don't match!, writeBuf[%d].i=%d, readBuf[%d].i=%d\n",(int)ii,(int)writeBuf[ii].i,(int)ii,(int)readBuf[ii].i); + continue; + } /* end if */ + if (!H5_FLT_ABS_EQUAL(writeBuf[ii].f,readBuf[ii].f)) { + fprintf(stderr, "Float components don't match!, writeBuf[%d].f=%f, readBuf[%d].f=%f\n",(int)ii,(double)writeBuf[ii].f,(int)ii,(double)readBuf[ii].f); + continue; + } /* end if */ + + if (writeBuf[ii].v.len != readBuf[ii].v.len) { + fprintf(stderr, "%d: VL data length don't match!, writeBuf[%d].v.len=%d, readBuf[%d].v.len=%d\n",__LINE__,(int)ii,(int)writeBuf[ii].v.len,(int)ii,(int)readBuf[ii].v.len); + continue; + } /* end if */ + + for (t1=(hvl_t *)(writeBuf[ii].v.p), t2=(hvl_t *)(readBuf[ii].v.p), jj=0; (size_t)jj<readBuf[ii].v.len; jj++, t1++, t2++) { + if (t1->len != t2->len) { + fprintf(stderr, "%d: VL data length don't match!, ii=%d, jj=%d, t1->len=%d, t2->len=%d\n",__LINE__,(int)ii,(int)jj,(int)t1->len,(int)t2->len); + continue; + } /* end if */ + for (kk=0; (size_t)kk<t2->len; kk++) { + if (((unsigned int *)t1->p)[kk] != ((unsigned int *)t2->p)[kk] ) { + fprintf(stderr, "VL data values don't match!, t1->p[%d]=%d, t2->p[%d]=%d\n",(int)kk, (int)((unsigned int *)t1->p)[kk], (int)kk, (int)((unsigned int *)t2->p)[kk]); + continue; + } /* end if */ + } /* end for */ + } /* end for */ + } /* end for */ + + /* Free the buffers */ + ret = H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + if (ret < 0) + goto error; + ret = H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + if (ret < 0) + goto error; + + /* Close the packet table */ + ret = H5PTclose(ptable); + if (ret < 0) + goto error; + + /* Release datatypes */ + if (H5Tclose(vlatomic) < 0) + goto error; + if (H5Tclose(vlofvl) < 0) + goto error; + + /* Close the file */ + if (H5Fclose(fid) < 0) + goto error; + + PASSED(); + return SUCCEED; + +error: /* An error has occurred. Clean up and exit. */ + if (H5PTis_valid(ptable) > 0) H5PTclose(ptable); + if (fid > 0) H5Fclose(fid); + H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + H5_FAILED(); + return FAIL; +} /* testfl_compound_VL_VLtype */ + +/*------------------------------------------------------------------------- + * testfl_VLof_VLtype(): Test that a packet table of VL datatype with VL + * datatypes of atomic datatypes can be created and written + * correctly. (HDFFV-442) + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +static int testfl_VLof_VLtype(void) +{ + hid_t fid=H5I_INVALID_HID; /* Test file identifier */ + hid_t ptable=H5I_INVALID_HID; /* Packet table identifier */ + hid_t vlatomic=H5I_INVALID_HID; /* Variable length datatype */ + hid_t vlofvl=H5I_INVALID_HID; /* VL datatype of VL datatypes */ + hsize_t count; /* Number of records in the table */ + hvl_t *t1; /* pointer to advance */ + int ii, jj, kk; /* Loop variables */ + hvl_t writeBuf[NRECORDS]; /* Buffer to hold data to be written */ + hvl_t readBuf[NRECORDS]; /* Buffer to hold read data */ + char msg[80]; /* For error message */ + herr_t ret; /* Returned status from a callee */ + + TESTING3(" with vlen datatype of vlen datatype"); + + /* Allocate and initialize VL data to write (copied from C test) */ + for (ii=0; ii< NRECORDS; ii++) { + writeBuf[ii].p = HDmalloc((ii+1)*sizeof(hvl_t)); + if (writeBuf[ii].p == NULL) { + fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii); + goto error; + } /* end if */ + writeBuf[ii].len = ii+1; + for (t1=(hvl_t *)(writeBuf[ii].p), jj=0; jj<(ii+1); jj++, t1++) + { + t1->p = HDmalloc((jj+1)*sizeof(unsigned int)); + if (t1->p == NULL) { + fprintf(stderr, "Cannot allocate memory for VL data! ii=%u\n",ii); + goto error; + } + t1->len = jj+1; + for (kk=0; kk<(jj+1); kk++) + ((unsigned int *)t1->p)[kk] = ii*100+jj*10+kk; + } /* end for */ + } /* end for */ + + /* Open the file */ + fid = H5Fopen(TESTFL_FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + if (fid < 0) + goto error; + + /* Create a VL datatype of an atomic type */ + vlatomic = H5Tvlen_create (H5T_NATIVE_UINT); + if (vlatomic < 0) + goto error; + + vlofvl = H5Tvlen_create (vlatomic); + if (vlofvl < 0) + goto error; + + /* Create a packet table that uses a vlen datatype of vlen datatype */ + ptable = H5PTcreate_fl(fid, PT_VLEN_VLEN, vlofvl, (hsize_t)1, 0); + + /* Ensure that PT is created successfully */ + if (ptable == H5I_INVALID_HID) + goto error; + + /* Close the vlen datatype */ + if (H5Tclose(vlofvl) < 0) + goto error; + + /* Write the entire buffer to the packet table */ + ret = H5PTappend(ptable, (size_t)5, writeBuf ); + if (ret < 0) + goto error; + + /* Get the number of packets in the packet table, should be NRECORDS. */ + ret = H5PTget_num_packets(ptable, &count); + if (ret < 0) + goto error; + + sprintf(msg, "The number of packets in the packet table must be %u\n", NRECORDS); + VERIFY(count == NRECORDS, msg); + + /* Read all five packets back */ + ret = H5PTread_packets(ptable, (hsize_t)0, (size_t)5, (void*)readBuf ); + if (ret < 0) + goto error; + + /* Free the buffers */ + ret = H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + if (ret < 0) + goto error; + ret = H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + if (ret < 0) + goto error; + + /* Close the packet table */ + ret = H5PTclose(ptable); + if (ret < 0) + goto error; + + /* Close the file */ + if (H5Fclose(fid) < 0) + goto error; + + PASSED(); + return SUCCEED; + +error: /* An error has occurred. Clean up and exit. */ + if (H5PTis_valid(ptable) > 0) H5PTclose(ptable); + if (fid > 0) H5Fclose(fid); + H5PTfree_vlen_buff(ptable, NRECORDS, readBuf); + H5PTfree_vlen_buff(ptable, NRECORDS, writeBuf); + H5_FAILED(); + return FAIL; +} /* testfl_VLof_VLtype */ + +/*------------------------------------------------------------------------- + * test_packet_table_with_varlen(): Invokes individual tests to ensure that + * packet tables with variable length are created and written correctly + * without the specific VL PT functionality. (HDFFV-442) + * + * 2016/01/27 -BMR + *------------------------------------------------------------------------- + */ +int test_packet_table_with_varlen(void) +{ + hid_t fid=H5I_INVALID_HID; /* File identifier */ + int status = SUCCEED; + + /* Create a file using default properties */ + fid = H5Fcreate(TEST_FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + if (fid < 0) + return FAIL; + + /* Close the file. The file will be opened by each test function below */ + if (H5Fclose(fid) < 0) + return FAIL; + + HDputs("Testing packet table with various variable-length datatypes"); + + /* If any test fails, move on to subsequent test, but status will indicate + there is a failure. */ + + /* Test variable length of a simple type */ + if (test_VLof_atomic() < 0) + status = FAIL; + + /* Test variable length of a compound type */ + if (test_VLof_comptype() < 0) + status = FAIL; + + /* Test compound type with variable length */ + if (test_compound_VL_VLtype() < 0) + status = FAIL; + + /* Test variable length of a variable length */ + if (test_VLof_VLtype() < 0) + status = FAIL; + + /* Test variable length of a variable length */ + if (test_H5PTis_varlen() < 0) + status = FAIL; + + /* Test adding attributes to packet table */ + if (test_attributes() < 0) + status = FAIL; + + /* Test accessor functions */ + if (test_accessors() < 0) + status = FAIL; + + +/************************************************************************** + Calling test functions for deprecated function H5PTcreate_fl + Mar 2016, -BMR + +**************************************************************************/ + + /* Create a file using default properties */ + fid = H5Fcreate(TESTFL_FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + if (fid < 0) + return FAIL; + + /* Close the file. The file will be opened by each test function below */ + if (H5Fclose(fid) < 0) + return FAIL; + + HDputs("Testing packet table with various variable-length datatypes - H5PTcreate_fl"); + + /* If any test fails, move on to subsequent test, but status will indicate + there is a failure. */ + + /* Test variable length of a simple type */ + if (testfl_VLof_atomic() < 0) + status = FAIL; + + /* Test variable length of a compound type */ + if (testfl_VLof_comptype() < 0) + status = FAIL; + + /* Test compound type with variable length */ + if (testfl_compound_VL_VLtype() < 0) + status = FAIL; + + /* Test variable length of a variable length */ + if (testfl_VLof_VLtype() < 0) + status = FAIL; + + return(status); +} |