720674a15f
* adaptions to renamed members in "struct h5_file" * several changes/additions for H5Fed
362 lines
7.3 KiB
C
362 lines
7.3 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdarg.h> /* va_arg - System dependent ?! */
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <hdf5.h>
|
|
|
|
#include "H5PartTypes.h"
|
|
#include "H5BlockTypes.h"
|
|
#include "H5Part.h"
|
|
#include "H5Block.h"
|
|
#include "H5PartPrivate.h"
|
|
#include "H5BlockPrivate.h"
|
|
#include "H5PartErrors.h"
|
|
#include "H5BlockErrors.h"
|
|
#include "H5.h"
|
|
|
|
h5part_int64_t
|
|
H5_write_data (
|
|
h5_file *f, /*!< IN: Handle to open file */
|
|
const char *name, /*!< IN: Name to associate array with */
|
|
const void *array, /*!< IN: Array to commit to disk */
|
|
const hid_t type, /*!< IN: Type of data */
|
|
const hid_t groupid,
|
|
const hid_t shape,
|
|
const hid_t memshape,
|
|
const hid_t diskshape
|
|
) {
|
|
herr_t herr;
|
|
hid_t dataset_id;
|
|
|
|
H5_print_debug ( "Create a dataset[%s] mounted on the "
|
|
"step_idx %lld",
|
|
name, (long long)f->step_idx );
|
|
|
|
dataset_id = H5Dcreate (
|
|
groupid,
|
|
name,
|
|
type,
|
|
shape,
|
|
H5P_DEFAULT );
|
|
if ( dataset_id < 0 )
|
|
return HANDLE_H5D_CREATE_ERR ( name, f->step_idx );
|
|
|
|
herr = H5Dwrite (
|
|
dataset_id,
|
|
type,
|
|
memshape,
|
|
diskshape,
|
|
f->xfer_prop,
|
|
array );
|
|
|
|
if ( herr < 0 ) return HANDLE_H5D_WRITE_ERR ( name, f->step_idx );
|
|
|
|
herr = H5Dclose ( dataset_id );
|
|
if ( herr < 0 ) return HANDLE_H5D_CLOSE_ERR;
|
|
|
|
f->empty = 0;
|
|
|
|
return H5PART_SUCCESS;
|
|
}
|
|
|
|
|
|
/*!
|
|
\ingroup h5part_kernel
|
|
|
|
Iterator for \c H5Giterate().
|
|
*/
|
|
herr_t
|
|
H5_iteration_operator (
|
|
hid_t group_id, /*!< [in] group id */
|
|
const char *member_name,/*!< [in] group name */
|
|
void *operator_data /*!< [in,out] data passed to the iterator */
|
|
) {
|
|
|
|
struct _iter_op_data *data = (struct _iter_op_data*)operator_data;
|
|
herr_t herr;
|
|
H5G_stat_t objinfo;
|
|
|
|
if ( data->type != H5G_UNKNOWN ) {
|
|
herr = H5Gget_objinfo ( group_id, member_name, 1, &objinfo );
|
|
if ( herr < 0 ) return (herr_t)HANDLE_H5G_GET_OBJINFO_ERR ( member_name );
|
|
|
|
if ( objinfo.type != data->type )
|
|
return 0;/* don't count, continue iteration */
|
|
}
|
|
|
|
if ( data->name && (data->stop_idx == data->count) ) {
|
|
memset ( data->name, 0, data->len );
|
|
strncpy ( data->name, member_name, data->len-1 );
|
|
|
|
return 1; /* stop iteration */
|
|
}
|
|
/*
|
|
count only if pattern is NULL or member name matches
|
|
*/
|
|
if ( !data->pattern ||
|
|
(strncmp (member_name, data->pattern, strlen(data->pattern)) == 0)
|
|
) {
|
|
data->count++;
|
|
}
|
|
return 0; /* continue iteration */
|
|
}
|
|
|
|
/*!
|
|
\ingroup h5part_kernel
|
|
|
|
Iterator for \c H5Giterate().
|
|
*/
|
|
h5part_int64_t
|
|
H5_get_num_objects (
|
|
hid_t group_id,
|
|
const char *group_name,
|
|
const hid_t type
|
|
) {
|
|
|
|
return H5_get_num_objects_matching_pattern (
|
|
group_id,
|
|
group_name,
|
|
type,
|
|
NULL );
|
|
}
|
|
|
|
/*!
|
|
\ingroup h5part_kernel
|
|
|
|
Iterator for \c H5Giterate().
|
|
*/
|
|
h5part_int64_t
|
|
H5_get_num_objects_matching_pattern (
|
|
hid_t group_id,
|
|
const char *group_name,
|
|
const hid_t type,
|
|
char * const pattern
|
|
) {
|
|
|
|
h5part_int64_t herr;
|
|
int idx = 0;
|
|
struct _iter_op_data data;
|
|
|
|
memset ( &data, 0, sizeof ( data ) );
|
|
data.type = type;
|
|
data.pattern = pattern;
|
|
|
|
herr = H5Giterate ( group_id, group_name, &idx,
|
|
H5_iteration_operator, &data );
|
|
if ( herr < 0 ) return herr;
|
|
|
|
return data.count;
|
|
}
|
|
|
|
/*!
|
|
\ingroup h5part_kernel
|
|
|
|
Iterator for \c H5Giterate().
|
|
*/
|
|
h5part_int64_t
|
|
H5_get_object_name (
|
|
hid_t group_id,
|
|
const char *group_name,
|
|
const hid_t type,
|
|
const h5part_int64_t idx,
|
|
char *obj_name,
|
|
const h5part_int64_t len_obj_name
|
|
) {
|
|
|
|
herr_t herr;
|
|
struct _iter_op_data data;
|
|
int iterator_idx = 0;
|
|
|
|
memset ( &data, 0, sizeof ( data ) );
|
|
data.stop_idx = (hid_t)idx;
|
|
data.type = type;
|
|
data.name = obj_name;
|
|
data.len = (size_t)len_obj_name;
|
|
|
|
herr = H5Giterate ( group_id, group_name, &iterator_idx,
|
|
H5_iteration_operator,
|
|
&data );
|
|
if ( herr < 0 ) return (h5part_int64_t)herr;
|
|
|
|
if ( herr == 0 ) HANDLE_H5PART_NOENTRY_ERR( group_name,
|
|
type, idx );
|
|
|
|
return H5PART_SUCCESS;
|
|
}
|
|
|
|
h5_int64_t
|
|
_create_step (
|
|
h5_file * f
|
|
) {
|
|
H5_print_debug (
|
|
"Proc[%d]: Create step #%lld for file %lld",
|
|
f->myproc,
|
|
(long long)f->step_idx,
|
|
(long long)(size_t) f );
|
|
f->is_new_step = 1;
|
|
f->step_gid = H5Gcreate ( f->file, f->step_name, 0 );
|
|
if ( f->step_gid < 0 )
|
|
return HANDLE_H5G_CREATE_ERR ( f->step_name );
|
|
|
|
return H5_SUCCESS;
|
|
}
|
|
|
|
h5_int64_t
|
|
_open_step (
|
|
h5_file * f
|
|
) {
|
|
H5_print_info (
|
|
"Proc[%d]: Open step #%lld for file %lld",
|
|
f->myproc,
|
|
(long long)step,
|
|
(long long)(size_t) f );
|
|
f->is_new_step = 0;
|
|
f->step_gid = H5Gopen ( f->file, f->step_name );
|
|
if ( f->step_gid < 0 )
|
|
return HANDLE_H5G_OPEN_ERR( f->step_name );
|
|
|
|
return H5_SUCCESS;
|
|
}
|
|
|
|
static h5_err_t
|
|
_init_step (
|
|
h5_err_t h5err = _h5t_init_step ( f );
|
|
if ( h5err < 0 ) return h5err;
|
|
|
|
return H5_SUCCESS;
|
|
}
|
|
|
|
static h5_err_t
|
|
_close_step (
|
|
h5_file * f
|
|
) {
|
|
|
|
if ( f->step_gid < 0 ) return H5_SUCCESS;
|
|
|
|
h5_err_t h5err = _h5t_close_step ( f );
|
|
if ( h5err < 0 ) return h5err;
|
|
|
|
herr_t herr = H5Gclose ( f->step_gid );
|
|
if ( herr < 0 ) return HANDLE_H5G_CLOSE_ERR;
|
|
|
|
f->step_gid = -1;
|
|
|
|
return H5_SUCCESS;
|
|
}
|
|
|
|
h5_int64_t
|
|
_set_step (
|
|
h5_file * f,
|
|
const h5_int64_t step_idx /*!< [in] Step to set. */
|
|
) {
|
|
f->step_idx = step_idx;
|
|
|
|
sprintf (
|
|
f->step_name,
|
|
"%s#%0*lld",
|
|
f->prefix_step_name, f->width_step_idx, (long long) f->step_idx );
|
|
|
|
herr_t herr = H5Gget_objinfo( f->file, f->step_name, 1, NULL );
|
|
|
|
if( f->mode == H5_O_RDONLY ) {
|
|
if ( herr < 0 ) return HANDLE_H5G_OPEN_ERR( f->step_name );
|
|
herr = _open_step ( f );
|
|
if ( herr < 0 ) return herr;
|
|
} else if ( (f->mode == H5_O_WRONLY) || (f->mode == H5_O_APPEND) ) {
|
|
if ( herr > 0 ) return HANDLE_H5PART_STEP_EXISTS_ERR ( step );
|
|
herr = _create_step ( f );
|
|
if ( herr < 0 ) return herr;
|
|
} else if ( (f->mode == H5_O_RDWR) && (herr < 0) ) {
|
|
herr = _create_step ( f );
|
|
if ( herr < 0 ) return herr;
|
|
} else if ( (f->mode == H5_O_RDWR) && (herr >= 0) ) {
|
|
herr = _open_step ( f );
|
|
if ( herr < 0 ) return herr;
|
|
}
|
|
return H5_SUCCESS;
|
|
}
|
|
|
|
h5p_int64_t
|
|
H5_set_step (
|
|
h5_file *f, /*!< [in] Handle to open file */
|
|
const h5_int64_t step_idx /*!< [in] Step to set. */
|
|
) {
|
|
|
|
herr = _close_step ( f );
|
|
if ( herr < 0 ) return herr;
|
|
|
|
herr = _set_step ( f );
|
|
if ( herr < 0 ) return herr;
|
|
|
|
herr = _init_step ( f );
|
|
if ( herr < 0 ) return herr;
|
|
|
|
return H5_SUCCESS;
|
|
}
|
|
|
|
/*!
|
|
Normalize HDF5 type
|
|
*/
|
|
hid_t
|
|
H5_normalize_h5_type (
|
|
hid_t type
|
|
) {
|
|
H5T_class_t tclass = H5Tget_class ( type );
|
|
int size = H5Tget_size ( type );
|
|
|
|
switch ( tclass ){
|
|
case H5T_INTEGER:
|
|
if ( size==8 ) {
|
|
return H5T_NATIVE_INT64;
|
|
}
|
|
else if ( size==1 ) {
|
|
return H5T_NATIVE_CHAR;
|
|
}
|
|
break;
|
|
case H5T_FLOAT:
|
|
return H5T_NATIVE_DOUBLE;
|
|
default:
|
|
; /* NOP */
|
|
}
|
|
H5_print_warn ( "Unknown type %d", (int)type );
|
|
|
|
return -1;
|
|
}
|
|
|
|
|
|
h5part_int64_t
|
|
H5_get_dataset_type(
|
|
hid_t group_id,
|
|
const char *dataset_name
|
|
) {
|
|
hid_t dataset_id = H5Dopen ( group_id, dataset_name );
|
|
if ( dataset_id < 0 ) HANDLE_H5D_OPEN_ERR ( dataset_name );
|
|
|
|
hid_t hdf5_type = H5Dget_type ( dataset_id );
|
|
if ( hdf5_type < 0 ) HANDLE_H5D_GET_TYPE_ERR;
|
|
|
|
h5part_int64_t type = (h5part_int64_t) H5_normalize_h5_type ( hdf5_type );
|
|
|
|
herr_t herr = H5Tclose(hdf5_type);
|
|
if ( herr < 0 ) HANDLE_H5T_CLOSE_ERR;
|
|
|
|
herr = H5Dclose(dataset_id);
|
|
if ( herr < 0 ) HANDLE_H5D_CLOSE_ERR;
|
|
|
|
return type;
|
|
}
|
|
|
|
h5part_int64_t
|
|
H5_has_index (
|
|
h5_file *f, /*!< [in] Handle to open file */
|
|
h5part_int64_t step /*!< [in] Step number to query */
|
|
) {
|
|
char name[128];
|
|
sprintf ( name,
|
|
"%s#%0*lld",
|
|
f->prefix_step_name, f->width_step_idx, (long long) step );
|
|
return ( H5Gget_objinfo( f->file, name, 1, NULL ) >= 0 );
|
|
}
|