static int test_create_close(hid_t fid) { herr_t err; hid_t table; hid_t part_t; TESTING("H5PTcreate_fl and H5PTclose"); /* Create a datatype for the particle struct */ part_t = make_particle_type(); HDassert(part_t != -1); /* Create the table */ 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 if( H5PTis_varlen(table) != 0) goto out; #endif /* VLPT_REMOVED */ /* Close the table */ err = H5PTclose(table); if( err < 0) goto out; PASSED(); return 0; out: H5_FAILED(); return -1; }
/*------------------------------------------------------------------------- * test_open * * Tests opening and closing a FL packet table * *------------------------------------------------------------------------- */ static int test_open(hid_t fid) { herr_t err; hid_t table; TESTING("H5PTopen"); /* Open the table */ table = H5PTopen(fid, PT_NAME); if( H5PTis_valid(table) < 0) goto out; #ifdef VLPT_REMOVED if( H5PTis_varlen(table) != 0) goto out; #endif /* VLPT_REMOVED */ /* Close the table */ err = H5PTclose(table); if( err < 0) goto out; PASSED(); return 0; out: H5_FAILED(); return -1; }
/*------------------------------------------------------------------------- * test_open * * Tests opening and closing a FL packet table * *------------------------------------------------------------------------- */ static int test_open(hid_t fid) { herr_t err; hid_t table; TESTING("H5PTopen"); /* Open the table */ table = H5PTopen(fid, PT_NAME); if( H5PTis_valid(table) < 0) goto error; if( H5PTis_varlen(table) != 0) goto error; /* Close the table */ err = H5PTclose(table); if( err < 0) goto error; PASSED(); return SUCCEED; error: if (table > 0) H5PTclose(table); H5_FAILED(); return FAIL; }
static int test_create_close(hid_t fid) { herr_t err; hid_t table; hid_t part_t; TESTING("H5PTcreate_fl and H5PTclose"); /* Create a datatype for the particle struct */ part_t = make_particle_type(); HDassert(part_t != -1); /* Create the table */ table = H5PTcreate_fl(fid, PT_NAME, part_t, (hsize_t)100, -1); H5Tclose(part_t); if( H5PTis_valid(table) < 0) goto error; if( H5PTis_varlen(table) != 0) goto error; /* Close the table */ err = H5PTclose(table); if( err < 0) goto error; PASSED(); return SUCCEED; error: H5_FAILED(); return FAIL; }
/* "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; } }
/* "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 */ }
/*------------------------------------------------------------------------- * test_error * * ensures that the packet table API throws the correct errors used on * objects that are not packet tables. * *------------------------------------------------------------------------- */ static int test_error(hid_t fid) { hid_t id = H5I_BADID; int id_open=0; particle_t readBuf[1]; TESTING("error conditions"); /* Create a HL table */ if(create_hl_table(fid) < 0) goto out; /* Try to open things that are not packet tables */ H5E_BEGIN_TRY if(H5PTopen(fid, "Bogus_name") >= 0) goto out; if(H5PTopen(fid, "group1") >= 0) goto out; 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 if(H5PTis_varlen(id) >= 0) goto out; #endif /* VLPT_REMOVED */ if(H5PTclose(id) >= 0) goto out; if(H5PTappend(id, (size_t)1, testPart) >= 0) goto out; if(H5PTread_packets(id, (hsize_t)0, 1, readBuf) >= 0) goto out; if(H5PTcreate_index(id) >= 0) goto out; if(H5PTset_index(id, (hsize_t)1) >= 0) goto out; if(H5PTget_index(id, NULL) >= 0) goto out; 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; id_open = 1; H5E_BEGIN_TRY if(H5PTis_valid(id) >= 0) goto out; #ifdef VLPT_REMOVED if(H5PTis_varlen(id) >= 0) goto out; #endif /* VLPT_REMOVED */ if(H5PTclose(id) >= 0) goto out; if(H5PTappend(id, (size_t)1, testPart) >= 0) goto out; if(H5PTread_packets(id, (hsize_t)0, 1, readBuf) >= 0) goto out; if(H5PTcreate_index(id) >= 0) goto out; if(H5PTset_index(id, (hsize_t)1) >= 0) goto out; if(H5PTget_index(id, NULL) >= 0) goto out; H5E_END_TRY id_open=0; if(H5Dclose(id) <0) goto out; /* Open and close a packet table. Try to execute */ /* commands on the closed ID. */ if((id=H5PTopen(fid, PT_NAME))<0) goto out; if(H5PTclose(id) <0) goto out; H5E_BEGIN_TRY if(H5PTis_valid(id) >= 0) goto out; #ifdef VLPT_REMOVED if(H5PTis_varlen(id) >= 0) goto out; #endif /* VLPT_REMOVED */ if(H5PTclose(id) >= 0) goto out; if(H5PTappend(id, (size_t)1, testPart) >= 0) goto out; if(H5PTread_packets(id, (hsize_t)0, 1, readBuf) >= 0) goto out; if(H5PTcreate_index(id) >= 0) goto out; if(H5PTset_index(id, (hsize_t)1) >= 0) goto out; if(H5PTget_index(id, NULL) >= 0) goto out; H5E_END_TRY PASSED(); return 0; out: H5_FAILED(); if(id_open) H5Dclose(id); return -1; }
/*------------------------------------------------------------------------- * 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; }
/* 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). */ int PacketTable::IsVariableLength() { return H5PTis_varlen(table_id); }