Skip to content

Commit

Permalink
Port H5E and H5Z functions to HDF5 1.8 API (PyTablesgh-105)
Browse files Browse the repository at this point in the history
  • Loading branch information
avalentino committed Apr 6, 2012
1 parent a900896 commit ca8d14a
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 98 deletions.
4 changes: 2 additions & 2 deletions blosc/blosc_filter.c
Expand Up @@ -23,10 +23,10 @@
/* The conditional below is necessary because the THG team has decided
to fix an API inconsistency in the definition of the H5Z_class_t
structure in version 1.8.3 */
#if H5_VERS_MAJOR == 1 && H5_VERS_MINOR == 8 && (H5_VERS_RELEASE < 3 || !H5_USE_16_API)
#if H5_VERS_MAJOR == 1 && H5_VERS_MINOR == 8 && (H5_VERS_RELEASE >= 3 || !H5_USE_16_API)
/* 1.8.x where x >= 3 */
#define H5Z_16API 0
#define PUSH_ERR(func, minor, str) H5Epush1(__FILE__, func, __LINE__, H5E_PLINE, minor, str)
#define PUSH_ERR(func, minor, str) H5Epush(H5E_DEFAULT, __FILE__, func, __LINE__, H5E_ERR_CLS, H5E_PLINE, minor, str)
#define GET_FILTER(a,b,c,d,e,f,g) H5Pget_filter_by_id2(a,b,c,d,e,f,g,NULL)

#else
Expand Down
18 changes: 9 additions & 9 deletions setup.py
Expand Up @@ -388,20 +388,20 @@ def get_hdf5_version(headername):
# the Cython extensions
CFLAGS.append("-Isrc")

# Forche the 1.8.x HDF5 API even if the library as been compiled to use the
# Force the 1.8.x HDF5 API even if the library as been compiled to use the
# 1.6.x API by default
CFLAGS.extend([
"-DH5Acreate_vers=2",
"-DH5Aiterate_vers=2",
#"-DH5Dcreate_vers=2",
#"-DH5Dopen_vers=2",
#"-DH5Eclear_vers=2",
#"-DH5Eprint_vers=2",
#"-DH5Epush_vers=2",
#"-DH5Eset_auto_vers=2",
#"-DH5Eget_auto_vers=2",
#"-DH5Ewalk_vers=2",
#"-DH5E_auto_t_vers=2",
"-DH5Eclear_vers=2",
"-DH5Eprint_vers=2",
"-DH5Epush_vers=2",
"-DH5Eset_auto_vers=2",
"-DH5Eget_auto_vers=2",
"-DH5Ewalk_vers=2",
"-DH5E_auto_t_vers=2",
#"-DH5Gcreate_vers=2",
#"-DH5Gopen_vers=2",
#"-DH5Pget_filter_vers=2",
Expand All @@ -413,7 +413,7 @@ def get_hdf5_version(headername):
##"-DH5Tcommit_vers=2",
#"-DH5Tget_array_dims_vers=2",
##"-DH5Topen_vers=2",
#"-DH5Z_class_t_vers=2",
"-DH5Z_class_t_vers=2",
])
#CFLAGS.append("-DH5_NO_DEPRECATED_SYMBOLS")

Expand Down
20 changes: 1 addition & 19 deletions src/H5Zbzip2.c
Expand Up @@ -22,23 +22,6 @@ int register_bzip2(char **version, char **date)
#ifdef HAVE_BZ2_LIB
char *libver, *versionp, *datep, *sep;

/* The conditional below is somewhat messy, but it is necessary because
the THG team has decided to fix an API inconsistency in the definition
of the H5Z_class_t structure in version 1.8.3 */
#if (H5_VERS_MAJOR == 1 && H5_VERS_MINOR < 7) || \
(H5_USE_16_API && (H5_VERS_MAJOR > 1 || \
(H5_VERS_MAJOR == 1 && (H5_VERS_MINOR > 8 || \
(H5_VERS_MINOR == 8 && H5_VERS_RELEASE >= 3)))))
/* 1.6.x */
H5Z_class_t filter_class = {
(H5Z_filter_t)(FILTER_BZIP2), /* filter_id */
"bzip2", /* comment */
NULL, /* can_apply_func */
NULL, /* set_local_func */
(H5Z_func_t)(bzip2_deflate) /* filter_func */
};
#else
/* 1.8.x where x < 3 */
H5Z_class_t filter_class = {
H5Z_CLASS_T_VERS, /* H5Z_class_t version */
(H5Z_filter_t)(FILTER_BZIP2), /* filter_id */
Expand All @@ -47,8 +30,7 @@ int register_bzip2(char **version, char **date)
NULL, /* can_apply_func */
NULL, /* set_local_func */
(H5Z_func_t)(bzip2_deflate) /* filter_func */
};
#endif
};

/* Register the filter class for the bzip2 compressor. */
H5Zregister(&filter_class);
Expand Down
18 changes: 0 additions & 18 deletions src/H5Zlzo.c
Expand Up @@ -42,23 +42,6 @@ int register_lzo(char **version, char **date) {

#ifdef HAVE_LZO_LIB

/* The conditional below is somewhat messy, but it is necessary because
the THG team has decided to fix an API inconsistency in the definition
of the H5Z_class_t structure in version 1.8.3 */
#if (H5_VERS_MAJOR == 1 && H5_VERS_MINOR < 7) || \
(H5_USE_16_API && (H5_VERS_MAJOR > 1 || \
(H5_VERS_MAJOR == 1 && (H5_VERS_MINOR > 8 || \
(H5_VERS_MINOR == 8 && H5_VERS_RELEASE >= 3)))))
/* 1.6.x */
H5Z_class_t filter_class = {
(H5Z_filter_t)(FILTER_LZO), /* filter_id */
"lzo", /* comment */
NULL, /* can_apply_func */
NULL, /* set_local_func */
(H5Z_func_t)(lzo_deflate) /* filter_func */
};
#else
/* 1.8.x where x < 3 */
H5Z_class_t filter_class = {
H5Z_CLASS_T_VERS, /* H5Z_class_t version */
(H5Z_filter_t)(FILTER_LZO), /* filter_id */
Expand All @@ -68,7 +51,6 @@ int register_lzo(char **version, char **date) {
NULL, /* set_local_func */
(H5Z_func_t)(lzo_deflate) /* filter_func */
};
#endif

/* Init the LZO library */
if (lzo_init()!=LZO_E_OK) {
Expand Down
4 changes: 2 additions & 2 deletions src/utils.h
Expand Up @@ -39,9 +39,9 @@
if (ret == val) { \
printf("*** UNEXPECTED RETURN from %s is %ld at line %4d " \
"in %s\n", where, (long)ret, (int)__LINE__, __FILE__); \
H5Eprint (stdout); \
H5Eprint(H5E_DEFAULT, stdout); \
} \
H5Eclear(); \
H5Eclear(H5E_DEFAULT); \
} while(0)

int getLibrary(char *libname);
Expand Down
49 changes: 14 additions & 35 deletions tables/definitions.pxd
Expand Up @@ -225,33 +225,17 @@ cdef extern from "hdf5.h" nogil:
H5E_WALK_UPWARD = 0 # begin deep, end at API function
H5E_WALK_DOWNWARD = 1 # begin at API function, end deep

ctypedef hid_t H5E_major_t
ctypedef hid_t H5E_minor_t

ctypedef struct H5E_error_t:
H5E_major_t maj_num # major error number
H5E_minor_t min_num # minor error number
const_char *func_name # function in which error occurred
const_char *file_name # file in which error occurred
unsigned line # line in file where error occurs
const_char *desc # optional supplied description

ctypedef herr_t (*H5E_walk_t)(int n, H5E_error_t *err, void *data)
ctypedef herr_t (*H5E_auto_t)(void *data)

# 1.8 API
#ctypedef struct H5E_error_t
# hid_t cls_id # class ID
# hid_t maj_num # major error ID
# hid_t min_num # minor error number
# unsigned line # line in file where error occurs
# const_char *func_name # function in which error occurred
# const_char *file_name # file in which error occurred
# const_char *desc # optional supplied description
#
#ctypedef herr_t (*H5E_walk_t)(unsigned n, const H5E_error_t *err, void *data)
#ctypedef herr_t (*H5E_auto_t)(hid_t estack, void *client_data)
hid_t cls_id # class ID
hid_t maj_num # major error ID
hid_t min_num # minor error number
unsigned line # line in file where error occurs
const_char *func_name # function in which error occurred
const_char *file_name # file in which error occurred
const_char *desc # optional supplied description

ctypedef herr_t (*H5E_walk_t)(unsigned n, H5E_error_t *err, void *data)
ctypedef herr_t (*H5E_auto_t)(hid_t estack, void *data)

#------------------------------------------------------------------

Expand Down Expand Up @@ -367,23 +351,18 @@ cdef extern from "hdf5.h" nogil:
hbool_t backing_store)

# Error Handling Interface
#herr_t H5Eget_auto(H5E_auto_t *func, void** data)
herr_t H5Eset_auto(H5E_auto_t func, void *data)
herr_t H5Eprint(FILE *stream)
const_char * H5Eget_major(H5E_major_t n) # deprecated
char * H5Eget_minor(H5E_minor_t n) # deprecated
herr_t H5Ewalk(H5E_direction_t dir, H5E_walk_t func, void *data)

# 1.8 API
#herr_t H5Eget_auto(hid_t estack_id, H5E_auto_t *func, void** data)
herr_t H5Eset_auto(hid_t estack_id, H5E_auto_t func, void *data)
herr_t H5Eprint(hid_t estack_id, FILE *stream)
herr_t H5Ewalk(hid_t estack_id, H5E_direction_t dir, H5E_walk_t func,
void *data)
#hid_t H5Eget_current_stack(void)
#herr_t H5Eclose_stack(hid_t estack_id)
#ssize_t H5Eget_num(hid_t estack_id)
#ssize_t H5Eget_msg(hid_t mesg_id, H5E_type_t* mesg_type, char* mesg,
# size_t size)
#herr_t H5Eclose_msg(hid_t mesg_id)
#ssize_t H5Eget_class_name(hid_t class_id, char* name, size_t size)
#herr_t H5Ewalk(hid_t estack_id, H5E_direction_t dir, H5E_walk_t func,
# void *data)

# Specific HDF5 functions for PyTables
cdef extern from "H5ATTR.h" nogil:
Expand Down
25 changes: 12 additions & 13 deletions tables/utilsExtension.pyx
Expand Up @@ -42,8 +42,8 @@ from definitions cimport (hid_t, herr_t, hsize_t, hssize_t, htri_t,
H5F_ACC_RDONLY, H5P_DEFAULT, H5D_CHUNKED, H5T_DIR_DEFAULT,
H5Fopen, H5Fclose, H5Fis_hdf5,
H5Gopen, H5Gclose,
H5E_auto_t, H5Eset_auto, H5Eprint, H5Eget_major, H5Eget_minor,
H5E_error_t, H5E_walk_t, H5Ewalk, H5E_WALK_DOWNWARD,
H5E_auto_t, H5Eset_auto, H5Eprint,
H5E_error_t, H5E_walk_t, H5Ewalk, H5E_WALK_DOWNWARD, H5E_DEFAULT,
H5D_layout_t, H5Dopen, H5Dclose, H5Dget_type,
H5T_class_t, H5T_sign_t, H5Tcreate, H5Tcopy, H5Tclose,
H5Tget_nmembers, H5Tget_member_name, H5Tget_member_type,
Expand Down Expand Up @@ -175,19 +175,18 @@ else: # Unix systems
#---------------------------------------------------------------------

# Error handling helpers
cdef herr_t e_walk_cb(int n, H5E_error_t *err, void *data) with gil:
# XXX: silence warning about incompatible pointer types
#ctypedef H5E_error_t* const_H5E_error_t_ptr "const H5E_error_t*"
cdef herr_t e_walk_cb(unsigned n, H5E_error_t *err, void *data) with gil:
cdef object bt = <object>data # list
cdef bytes maj_str, min_str

if err == NULL:
return -1

# XXX: H5Eget_major and H5Eget_minor are deprecated
maj_str = <char*>H5Eget_major(err.maj_num)
min_str = H5Eget_minor(err.min_num)
msg = "%s (%s: %s)" % (bytes(<char*>err.desc).decode('utf-8'),
maj_str.decode('utf-8'),
maj_str.decode('utf-8'))
msg = "%s (MAJOR: %d, MINOR: %d)" % (
bytes(<char*>err.desc).decode('utf-8'),
err.maj_num,
err.maj_num)

# XXX: extract class info (see H5E_walk1_cb in H5Eint.c)

Expand All @@ -203,7 +202,7 @@ cdef herr_t e_walk_cb(int n, H5E_error_t *err, void *data) with gil:
def _dump_h5_backtrace():
cdef object bt = []

if H5Ewalk(H5E_WALK_DOWNWARD, e_walk_cb, <void*>bt) < 0:
if H5Ewalk(H5E_DEFAULT, H5E_WALK_DOWNWARD, e_walk_cb, <void*>bt) < 0:
return None

return bt
Expand All @@ -224,9 +223,9 @@ def silenceHDF5Messages(silence=True):
"""
cdef herr_t err
if silence:
err = H5Eset_auto(NULL, NULL)
err = H5Eset_auto(H5E_DEFAULT, NULL, NULL)
else:
err = H5Eset_auto(<H5E_auto_t>H5Eprint, stderr)
err = H5Eset_auto(H5E_DEFAULT, <H5E_auto_t>H5Eprint, stderr)
if err < 0:
raise HDF5ExtError("unable to configure HDF5 internal error handling")

Expand Down

0 comments on commit ca8d14a

Please sign in to comment.