Attributes

1. Introduction

The appribute API (H5A) is primarily designed to easily allow small datasets to be attached to primary datasets as metadata information. Additional goals for the H5A interface include keeping storage requirement for each attribute to a minimum and easily sharing attributes among datasets.

Because attributes are intended to be small objects, large datasets intended as additional information for a primary dataset should be stored as supplemental datasets in a group with the primary dataset. Attributes can then be attached to the group containing everything to indicate a particular type of dataset with supplemental datasets is located in the group. How small is "small" is not defined by the library and is up to the user's interpretation.

Attributes are not seperate objects in the file, they are always contained in the object header of the object they are attached to. The I/O functions defined below are required to read or write attribute information, not the H5D I/O routines.

2. Creating, Opening, Closing and Deleting Attributes

Attributes are created with the H5Acreate() function, and existing attributes can be accessed with either the H5Aopen_name() or H5Aopen_idx() functions. All three functions return an object ID which should be eventually released by calling H5Aclose().

hid_t H5Acreate (hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, hid_t create_plist_id)
This function creates an attribute which is attached to the object specified with loc_id. The name specified with name for each attribute for an object must be unique for that object. The type_id and space_id are created with the H5T and H5S interfaces respectively. Currently only simple dataspaces are allowed for attribute dataspaces. The create_plist_id property list is currently unused, but will be used int the future for optional properties of attributes. The attribute ID returned from this function must be released with H5Aclose or resource leaks will develop. Attempting to create an attribute with the same name as an already existing attribute will fail, leaving the pre-existing attribute in place. This function returns a attribute ID for success or negative for failure.

hid_t H5Aopen_name (hid_t loc_id, const char *name)
This function opens an attribute which is attached to the object specified with loc_id. The name specified with name indicates the attribute to access. The attribute ID returned from this function must be released with H5Aclose or resource leaks will develop. This function returns a attribute ID for success or negative for failure.

hid_t H5Aopen_idx (hid_t loc_id, unsigned idx)
This function opens an attribute which is attached to the object specified with loc_id. The attribute specified with idx indicates the idxth attribute to access, starting with '0'. The attribute ID returned from this function must be released with H5Aclose or resource leaks will develop. This function returns a attribute ID for success or negative for failure.

herr_t H5Aclose (hid_t attr_id)
This function releases an attribute from use. Further use of the attribute ID will result in undefined behavior. This function returns non-negative on success, negative on failure.

herr_t H5Adelete (hid_t loc_id, const char *name)
This function removes the named attribute from a dataset or group. This function should not be used when attribute IDs are open on loc_id as it may cause the internal indexes of the attributes to change and future writes to the open attributes to produce incorrect results. Returns non-negative on success, negative on failure.

3. Attribute I/O Functions

Attributes may only be written as an entire object, no partial I/O is currently supported.

herr_t H5Awrite (hid_t attr_id, hid_t mem_type_id, void *buf)
This function writes an attribute, specified with attr_id, with mem_type_id specifying the datatype in memory. The entire attribute is written from buf to the file. This function returns non-negative on success, negative on failure.

herr_t H5Aread (hid_t attr_id, hid_t mem_type_id, void *buf)
This function read an attribute, specified with attr_id, with mem_type_id specifying the datatype in memory. The entire attribute is read into buf from the file. This function returns non-negative on success, negative on failure.

4. Attribute Inquiry Functions

int H5Aiterate (hid_t loc_id, unsigned *attr_number, H5A_operator operator, void *operator_data)
This function interates over the attributes of dataset or group specified with loc_id. For each attribute of the object, the operator_data and some additional information (specified below) are passed to the operator function. The iteration begins with the *attr_number object in the group and the next attribute to be processed by the operator is returned in *attr_number.

The iterator returns a negative value if something is wrong, the return value of the last operator if it was non-zero, or zero if all attributes were processed.

The prototype for H5A_operator_t is:
typedef herr_t (*H5A_operator_t)(hid_t loc_id, const char *attr_name, void *operator_data);

The operation receives the ID for the group or dataset being iterated over (loc_id), the name of the current attribute about the object (attr_name) and the pointer to the operator data passed in to H5Aiterate (operator_data). The return values from an operator are:



hid_t H5Aget_space (hid_t attr_id)
This function retrieves a copy of the dataspace for an attribute. The dataspace ID returned from this function must be released with H5Sclose or resource leaks will develop. This function returns a dataspace ID for success or negative for failure.

hid_t H5Aget_type (hid_t attr_id)
This function retrieves a copy of the datatype for an attribute. The datatype ID returned from this function must be released with H5Tclose or resource leaks will develop. This function returns a datatype ID for success or negative for failure.

size_t H5Aget_name (hid_t attr_id, char *buf, size_t buf_size)
This function retrieves the name of an attribute for an attribute ID. Up to buf_size characters are stored in buf followed by a '\0' string terminator. If the name of the attribute is longer than buf_size-1, the string terminator is stored in the last position of the buffer to properly terminate the string. This function returns the length of the attribute's name (which may be longer than buf_size) on success or negative for failure.

int H5Anum_attrs (hid_t loc_id)
This function returns the number of attributes attached to a dataset or group, loc_id. This function returns non-negative for success or negative for failure.

HDF Support