Add C++, Java, and FORTRAN wrappers and tests for H5Fget_fileno

This commit is contained in:
Quincey Koziol 2019-04-13 22:58:16 -05:00
parent 4918d443bb
commit d7e1464058
13 changed files with 396 additions and 1 deletions

View File

@ -7666,6 +7666,42 @@ normal'><span style='font-size:14.0pt;mso-bidi-font-size:11.0pt;line-height:
normal'><o:p>&nbsp;</o:p></p>
</td>
</tr>
<tr style='mso-yfti-irow:180'>
<td width=263 style='width:197.2pt;border:solid windowtext 1.0pt;border-top:
none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;
padding:0in 5.4pt 0in 5.4pt'>
<p class=MsoNormal style='margin-bottom:0in;margin-bottom:.0001pt;line-height:
normal'>H5Fget_fileno</p>
</td>
<td width=474 valign=top style='width:355.2pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt'>
<p class=MsoNormal style='margin-bottom:0in;margin-bottom:.0001pt;line-height:
normal'>unsigned long H5File::getFileNum()</p>
</td>
<td width=35 valign=top style='width:26.05pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt'>
<p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
text-align:center;line-height:normal'><o:p>&nbsp;</o:p></p>
</td>
<td width=42 valign=top style='width:31.45pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt'>
<p class=MsoNormal align=center style='margin-bottom:0in;margin-bottom:.0001pt;
text-align:center;line-height:normal'><o:p>&nbsp;</o:p></p>
</td>
<td width=169 valign=top style='width:126.65pt;border-top:none;border-left:
none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
mso-border-top-alt:solid windowtext .5pt;mso-border-left-alt:solid windowtext .5pt;
mso-border-alt:solid windowtext .5pt;padding:0in 5.4pt 0in 5.4pt'>
<p class=MsoNormal style='margin-bottom:0in;margin-bottom:.0001pt;line-height:
normal'><o:p>&nbsp;</o:p></p>
</td>
</tr>
<tr style='mso-yfti-irow:181'>
<td width=263 style='width:197.2pt;border:solid windowtext 1.0pt;border-top:
none;mso-border-top-alt:solid windowtext .5pt;mso-border-alt:solid windowtext .5pt;

View File

@ -579,6 +579,27 @@ hsize_t H5File::getFileSize() const
return (file_size);
}
//--------------------------------------------------------------------------
// Function: H5File::getFileNum
///\brief Returns the file number of the HDF5 file.
///\return File number
///\exception H5::FileIException
///\par Description
/// This function is called after an existing file is opened in
/// order to retrieve the unique 'file number' for the file.
// Programmer Quincey Koziol - April 13, 2019
//--------------------------------------------------------------------------
unsigned long H5File::getFileNum() const
{
unsigned long fileno = 0;
herr_t ret_value = H5Fget_fileno(id, &fileno);
if (ret_value < 0)
{
throw FileIException("H5File::getFileNum", "H5Fget_fileno failed");
}
return (fileno);
}
//--------------------------------------------------------------------------
// Function: H5File::getId
///\brief Get the id of this file

View File

@ -69,6 +69,9 @@ class H5_DLLCPP H5File : public Group {
// Returns the file size of the HDF5 file.
hsize_t getFileSize() const;
// Returns the 'file number' of the HDF5 file.
unsigned long getFileNum() const;
// Determines if a file, specified by its name, is in HDF5 format
static bool isHdf5(const char* name);
static bool isHdf5(const H5std_string& name);

View File

@ -410,6 +410,64 @@ static void test_file_size()
} // test_file_size()
/*-------------------------------------------------------------------------
* Function: test_file_num
*
* Purpose Test file number.
*
* Return None
*
* Programmer Quincey Koziol
* April, 2019
*-------------------------------------------------------------------------
*/
static void test_file_num()
{
// Output message about test being performed
SUBTEST("File Number");
hid_t fapl_id;
fapl_id = h5_fileaccess(); // in h5test.c, returns a file access template
try {
// Use the file access template id to create a file access prop.
// list object to pass in H5File::H5File
FileAccPropList fapl(fapl_id);
// Create two files
H5File file1(FILE1, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
H5File file2(FILE2, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
// Open the first file again
H5File file3(FILE1, H5F_ACC_RDWR);
// Get file numbers
unsigned long file_num1 = file1.getFileNum();
unsigned long file_num2 = file2.getFileNum();
unsigned long file_num3 = file3.getFileNum();
// Check file numbers
if (file_num1 == file_num2)
issue_fail_msg("test_file_num()", __LINE__, __FILE__, "getFileNum() returned wrong value");
if (file_num1 != file_num3)
issue_fail_msg("test_file_num()", __LINE__, __FILE__, "getFileNum() returned wrong value");
PASSED();
} // end of try block
catch (Exception& E)
{
issue_fail_msg("test_file_num()", __LINE__, __FILE__, E.getCDetailMsg());
}
// use C test utility routine to close property list.
herr_t ret = H5Pclose(fapl_id);
if (ret < 0)
issue_fail_msg("test_file_num()", __LINE__, __FILE__, "H5Pclose failed");
} // test_file_num()
/*-------------------------------------------------------------------------
* Function: test_file_name
@ -966,6 +1024,7 @@ void test_file()
test_file_create(); // Test file creation (also creation templates)
test_file_open(); // Test file opening
test_file_size(); // Test file size
test_file_num(); // Test file number
test_file_name(); // Test getting file's name
test_file_attribute(); // Test file attribute feature
test_libver_bounds(); // Test format version

View File

@ -632,6 +632,40 @@ done:
return ret_value;
}
/****if* H5Ff/h5fget_fileno_c
* NAME
* h5fget_fileno_c
* PURPOSE
* Call H5Fget_fileno to get file number
* INPUTS
* file_id - file identifier
* OUTPUTS
* fileno - file number for open file
* RETURNS
* 0 on success, -1 on failure
* AUTHOR
* Quincey Koziol
* Saturday, April 13, 2019
* SOURCE
*/
int_f
h5fget_fileno_c(hid_t_f *file_id, int_f *fileno)
/******/
{
unsigned long fileno_c;
herr_t ret_value=0; /* Return value */
/*
* Call H5Fget_filesize function
*/
if ((ret_value = H5Fget_fileno((hid_t)*file_id, &fileno_c)) < 0)
HGOTO_DONE(FAIL);
*fileno = (hsize_t_f)fileno_c;
done:
return ret_value;
}
/****if* H5Ff/h5fget_file_image_c
* NAME
* h5fget_file_image_c

View File

@ -886,6 +886,44 @@ CONTAINS
hdferr = h5fget_filesize_c(file_id, size)
END SUBROUTINE h5fget_filesize_f
!****s* H5F/h5fget_fileno_f
!
! NAME
! h5fget_fileno_f
!
! PURPOSE
! Retrieves the file number of the HDF5 file.
!
! INPUTS
! file_id - file identifier
! OUTPUTS
! fileno - file number
! hdferr - Returns 0 if successful and -1 if fails
!
! AUTHOR
! Quincey Koziol
! April 13, 2019
!
! SOURCE
SUBROUTINE h5fget_fileno_f(file_id, fileno, hdferr)
IMPLICIT NONE
INTEGER(HID_T), INTENT(IN) :: file_id ! file identifier
INTEGER, INTENT(OUT) :: fileno ! File number
INTEGER, INTENT(OUT) :: hdferr ! Error code: 0 on success,
! -1 if fail
!*****
INTERFACE
INTEGER FUNCTION h5fget_fileno_c(file_id, fileno) &
BIND(C,NAME='h5fget_fileno_c')
IMPORT :: HID_T, HSIZE_T
IMPLICIT NONE
INTEGER(HID_T), INTENT(IN) :: file_id
INTEGER, INTENT(OUT) :: fileno
END FUNCTION h5fget_fileno_c
END INTERFACE
hdferr = h5fget_fileno_c(file_id, fileno)
END SUBROUTINE h5fget_fileno_f
!****s* H5F (F03)/h5fget_file_image_f_F03
!
! NAME

View File

@ -91,6 +91,7 @@ H5_FCDLL int_f h5fget_file_image_c(hid_t_f *file_id, void *buf_ptr, size_t_f *bu
H5_FCDLL int_f h5fflush_c(hid_t_f *obj_id, int_f *scope);
H5_FCDLL int_f h5fget_name_c(hid_t_f *obj_id, size_t_f *size, _fcd buf, size_t_f *buflen);
H5_FCDLL int_f h5fget_filesize_c(hid_t_f *file_id, hsize_t_f *size);
H5_FCDLL int_f h5fget_fileno_c(hid_t_f *file_id, int_f *fileno);
/*
* Functions from H5Sf.c

View File

@ -105,6 +105,10 @@ CONTAINS
INTEGER(SIZE_T) :: obj_count
INTEGER(HID_T) :: t1, t2, t3, t4
! File numbers
INTEGER :: file_num1
INTEGER :: file_num2
!
!data buffers
!
@ -287,6 +291,18 @@ CONTAINS
IF(obj_count.NE.2)THEN
total_error = total_error + 1
ENDIF
!
!Check file numbers
!
CALL h5fget_fileno_f(file1_id, file_num1, error)
CALL check("h5fget_fileno_f",error,total_error)
CALL h5fget_fileno_f(file2_id, file_num2, error)
CALL check("h5fget_fileno_f",error,total_error)
IF(file_num1 .EQ. file_num2) THEN
write(*,*) "file numbers aren't supposed to match"
END IF
!
!mount the second file under the first file's "/G" group.
!
@ -431,6 +447,8 @@ CONTAINS
INTEGER, DIMENSION(4,6) :: dset_data, data_out
INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
INTEGER(HSIZE_T) :: file_size
INTEGER :: file_num1
INTEGER :: file_num2
CHARACTER(LEN=80) :: file_name
INTEGER(SIZE_T) :: name_size
@ -498,6 +516,17 @@ CONTAINS
CALL h5fget_filesize_f(file_id, file_size, error)
CALL check("h5fget_filesize_f",error,total_error)
!
!Check file numbers
!
CALL h5fget_fileno_f(file_id, file_num1, error)
CALL check("h5fget_fileno_f",error,total_error)
CALL h5fget_fileno_f(reopen_id, file_num2, error)
CALL check("h5fget_fileno_f",error,total_error)
IF(file_num1 .NE. file_num2) THEN
write(*,*) "file numbers don't match"
END IF
!
!Open the dataset based on the reopen_id.
!

View File

@ -2967,6 +2967,19 @@ public class H5 implements java.io.Serializable {
**/
public synchronized static native int H5Fget_intent(long file_id) throws HDF5LibraryException;
/**
* H5Fget_fileno retrieves the "file number" for an open file.
*
* @param file_id
* IN: File identifier for a currently-open HDF5 file
*
* @return the unique file number for the file.
*
* @exception HDF5LibraryException
* - Error from the HDF-5 Library.
**/
public synchronized static native long H5Fget_fileno(long file_id) throws HDF5LibraryException;
/**
* H5Fget_mdc_hit_rate queries the metadata cache of the target file to obtain its hit rate (cache hits / (cache
* hits + cache misses)) since the last time hit rate statistics were reset.

View File

@ -273,6 +273,26 @@ done:
return (jint)intent;
} /* end Java_hdf_hdf5lib_H5_H5Fget_1intent */
/*
* Class: hdf_hdf5lib_H5
* Method: H5Fget_fileno
* Signature: (J)J
*/
JNIEXPORT jlong JNICALL
Java_hdf_hdf5lib_H5_H5Fget_1fileno
(JNIEnv *env, jclass cls, jlong file_id)
{
unsigned long fileno = 0;
UNUSED(cls);
if (H5Fget_intent((hid_t)file_id, &fileno) < 0)
H5_LIBRARY_ERROR(ENVONLY);
done:
return (jlong)fileno;
} /* end Java_hdf_hdf5lib_H5_H5Fget_1intent */
/*
* Class: hdf_hdf5lib_H5
* Method: H5Fclose

View File

@ -102,6 +102,15 @@ JNIEXPORT jint JNICALL
Java_hdf_hdf5lib_H5_H5Fget_1intent
(JNIEnv*, jclass, jlong);
/*
* Class: hdf_hdf5lib_H5
* Method: H5Fget_fileno
* Signature: (J)J
*/
JNIEXPORT jlong JNICALL
Java_hdf_hdf5lib_H5_H5Fget_1fileno
(JNIEnv*, jclass, jlong);
/*
* Class: hdf_hdf5lib_H5
* Method: H5Fclose

View File

@ -14,6 +14,7 @@
package test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@ -32,6 +33,7 @@ import org.junit.rules.TestName;
public class TestH5F {
@Rule public TestName testname = new TestName();
private static final String H5_FILE = "testF.h5";
private static final String H5_FILE2 = "testF2.h5";
private static final int COUNT_OBJ_FILE = 1;
private static final int COUNT_OBJ_DATASET = 0;
@ -48,6 +50,7 @@ public class TestH5F {
HDF5Constants.H5F_OBJ_DATATYPE, HDF5Constants.H5F_OBJ_ATTR,
HDF5Constants.H5F_OBJ_ALL };
long H5fid = -1;
long H5fid2 = -1;
private final void _deleteFile(String filename) {
File file = new File(filename);
@ -66,6 +69,10 @@ public class TestH5F {
H5fid = H5.H5Fcreate(H5_FILE, HDF5Constants.H5F_ACC_TRUNC,
HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT);
H5.H5Fflush(H5fid, HDF5Constants.H5F_SCOPE_LOCAL);
H5fid2 = H5.H5Fcreate(H5_FILE2, HDF5Constants.H5F_ACC_TRUNC,
HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT);
H5.H5Fflush(H5fid2, HDF5Constants.H5F_SCOPE_LOCAL);
}
@After
@ -74,7 +81,12 @@ public class TestH5F {
try {H5.H5Fclose(H5fid);} catch (Exception ex) {}
H5fid = -1;
}
if (H5fid2 > 0) {
try {H5.H5Fclose(H5fid2);} catch (Exception ex) {}
H5fid2 = -1;
}
_deleteFile(H5_FILE);
_deleteFile(H5_FILE2);
System.out.println();
}
@ -222,6 +234,124 @@ public class TestH5F {
}
}
@Test
public void testH5Fget_fileno_same() {
long fileno1 = 0;
long fileno2 = 0;
long fid1 = -1;
long fid2 = -1;
if (H5fid > 0) {
try {H5.H5Fclose(H5fid);} catch (Exception ex) {}
H5fid = -1;
}
try {
fid1 = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDWR,
HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
fail("H5.H5Fopen: " + err);
}
try {
fid2 = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDWR,
HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
fail("H5.H5Fopen: " + err);
}
try {
fileno1 = H5.H5Fget_fileno(fid1);
}
catch (Throwable err) {
fail("H5.H5Fget_fileno: " + err);
}
try {
fileno2 = H5.H5Fget_fileno(fid2);
}
catch (Throwable err) {
fail("H5.H5Fget_fileno: " + err);
}
assertEquals(fileno1, fileno2);
try {
H5.H5Fclose(fid1);
}
catch (Exception ex) {
}
try {
H5.H5Fclose(fid2);
}
catch (Exception ex) {
}
}
@Test
public void testH5Fget_fileno_diff() {
long fileno1 = 0;
long fileno2 = 0;
long fid1 = -1;
long fid2 = -1;
if (H5fid > 0) {
try {H5.H5Fclose(H5fid);} catch (Exception ex) {}
H5fid = -1;
}
if (H5fid2 > 0) {
try {H5.H5Fclose(H5fid2);} catch (Exception ex) {}
H5fid2 = -1;
}
try {
fid1 = H5.H5Fopen(H5_FILE, HDF5Constants.H5F_ACC_RDWR,
HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
fail("H5.H5Fopen: " + err);
}
try {
fid2 = H5.H5Fopen(H5_FILE2, HDF5Constants.H5F_ACC_RDWR,
HDF5Constants.H5P_DEFAULT);
}
catch (Throwable err) {
fail("H5.H5Fopen: " + err);
}
try {
fileno1 = H5.H5Fget_fileno(fid1);
}
catch (Throwable err) {
fail("H5.H5Fget_fileno: " + err);
}
try {
fileno2 = H5.H5Fget_fileno(fid2);
}
catch (Throwable err) {
fail("H5.H5Fget_fileno: " + err);
}
assertNotEquals(fileno1, fileno2);
try {
H5.H5Fclose(fid1);
}
catch (Exception ex) {
}
try {
H5.H5Fclose(fid2);
}
catch (Exception ex) {
}
}
@Test
public void testH5Fget_obj_count() {
long count = -1;

View File

@ -7,8 +7,10 @@ JUnit version 4.11
.testH5Fget_intent_rdonly
.testH5Fget_create_plist
.testH5Fget_obj_count
.testH5Fget_fileno_same
.testH5Fget_fileno_diff
Time: XXXX
OK (8 tests)
OK (10 tests)