/*------------------------------------------------------------------------- * 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; }
int main(void) { #ifdef VLPT_REMOVED hid_t fid; /* File identifier */ hid_t ptable; /* Packet table identifier */ herr_t err; /* Function return status */ hsize_t count; /* Number of records in the table */ int x; /* Loop variable */ /* Buffers to hold data */ hvl_t writeBuffer[5]; hvl_t readBuffer[5]; /* This example has two different sizes of "record": longs and shorts */ long longBuffer[5]; short shortBuffer[5]; /* Initialize buffers */ for(x=0; x<5; x++) { longBuffer[x] = -x; shortBuffer[x] = x; } /* Fill the write buffer with a mix of longs and shorts */ /* We need to supply the length of each record and a pointer to */ /* the beginning of each record. */ writeBuffer[0].len = sizeof(long); writeBuffer[0].p = &(longBuffer[0]); writeBuffer[1].len = sizeof(short); writeBuffer[1].p = &(shortBuffer[1]); writeBuffer[2].len = sizeof(long); writeBuffer[2].p = &(longBuffer[2]); writeBuffer[3].len = sizeof(long); writeBuffer[3].p = &(longBuffer[3]); writeBuffer[4].len = sizeof(short); writeBuffer[4].p = &(shortBuffer[4]); /* Create a file using default properties */ fid=H5Fcreate("packet_table_VLexample.h5",H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT); /* Create a variable-length packet table within the file */ ptable = H5PTcreate_vl(fid, "Packet Test Dataset", (hsize_t)1); if(ptable == H5I_INVALID_HID) goto out; /* Write the entire buffer to the packet table */ err = H5PTappend(ptable, (hsize_t)5, writeBuffer ); if(err < 0) goto out; /* Get the number of packets in the packet table. This should be five. */ err = H5PTget_num_packets(ptable, &count); if(err < 0) goto out; printf("Number of packets in packet table after five appends: %d\n", count); /* Read all five packets back */ err = H5PTread_packets(ptable, (hsize_t)0, (hsize_t)5, readBuffer ); if(err < 0) goto out; for(x=0; x<5; x++) { printf("Packet %d's length is %d\n", x, readBuffer[x].len); if(readBuffer[x].len == sizeof(long)) printf("Packet %d's value is %d\n", x, *( (long *) readBuffer[x].p) ); else printf("Packet %d's value is %d\n", x, *( (short *) readBuffer[x].p) ); } /* Before we close the packet table, we must free the memory that */ /* the pointers in readBuffer point to. */ err = H5PTfree_vlen_readbuff(ptable, (hsize_t)5, readBuffer); if(err < 0) goto out; /* Close the packet table */ err = H5PTclose(ptable); if(err < 0) goto out; /* Close the file */ H5Fclose(fid); #endif /* VLPT_REMOVED */ return 0; #ifdef VLPT_REMOVED out: /* An error has occurred. Clean up and exit. */ fprintf(stderr, "An error has occurred!\n"); H5PTclose(ptable); H5Fclose(fid); return -1; #endif /* VLPT_REMOVED */ }
/* 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); }