mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-11-21 01:04:10 +08:00
[svn-r831] DDL.html
References.html New User Guide documents. RM_H5I.html Identifier Interface RM_H5R.html Reference Interface Created these two sections of Reference Manual.
This commit is contained in:
parent
cd3b105997
commit
ed5859ad80
208
doc/html/DDL.html
Normal file
208
doc/html/DDL.html
Normal file
@ -0,0 +1,208 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>DDL for HDF5</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>DDL in BNF for HDF5</h1>
|
||||
|
||||
|
||||
<h2>1. Introduction</h2>
|
||||
|
||||
This document contains the data description language (DDL) for an HDF5 file.
|
||||
The description is in Backus-Naur Form.
|
||||
|
||||
<h2>2. Explanation of Symbols</h2>
|
||||
|
||||
This section contains a brief explanation of the symbols used in the DDL.
|
||||
|
||||
<PRE>
|
||||
::= defined as
|
||||
<tname> a token with the name tname
|
||||
<a> | <b> one of <a> or <b>
|
||||
<a><FONT SIZE=1.7>opt</FONT> zero or one occurrence of <a>
|
||||
<a>* zero or more occurrence of <a>
|
||||
<a>+ one or more occurrence of <a>
|
||||
TBD To Be Decided
|
||||
</pre>
|
||||
|
||||
<h2>3. The DDL</h2>
|
||||
|
||||
<dir>
|
||||
<pre>
|
||||
<file> ::= HDF5 "<file_name>" { <file_boot_block><FONT SIZE=1.7>opt</FONT> <root_group> }
|
||||
|
||||
<file_name> ::= <identifier>
|
||||
|
||||
<file_boot_block> ::= BOOT_BLOCK { <boot_block_content> }
|
||||
|
||||
<boot_block_content> ::= TBD
|
||||
|
||||
<root_group> ::= GROUP "/" { <unamed_datatype>* <group_attribute>* <group_member>* }
|
||||
|
||||
<unamed_datatype> ::= DATATYPE "<unamed_type_name>" { <compound_type_def>+ }
|
||||
|
||||
<unamed_type_name> ::= the assigned name for unamed type is in the form of
|
||||
#oid1:oid2, where oid1 and oid2 are the object ids of the type
|
||||
|
||||
<compound_type_def> ::= <named_scalar_type> | <named_array_type>
|
||||
|
||||
<named_scalar_type> ::= <scalar_type> <field_name> ;
|
||||
|
||||
<scalar_type> ::= H5T_STD_I8BE | H5T_STD_I8LE | ...
|
||||
|
||||
<field_name> ::= <identifier>
|
||||
|
||||
<named_array_type> ::= <scalar_type> <field_name> <dim_sizes> ;
|
||||
|
||||
<dim_sizes> ::= dimension sizes in the form of [dimsize1][dimzise2]...,
|
||||
where dimsize1, dimsize2 are integers
|
||||
|
||||
<group_attribute> ::= <attribute>
|
||||
|
||||
<attribute> ::= ATTRIBUTE "<attr_name>" { <datatype>
|
||||
<dataspace>
|
||||
<data><FONT SIZE=1.7>opt</FONT> }
|
||||
// <datatype> and <dataspace> must appear before <data>.
|
||||
|
||||
<attr_name> ::= <identifier>
|
||||
|
||||
<datatype> ::= DATATYPE { <named_type> } |
|
||||
DATATYPE { "<scalar_type>" } |
|
||||
DATATYPE { <compound_type_def>+ }
|
||||
|
||||
<named_type> ::= <hardlink>
|
||||
|
||||
<hardlink> ::= HARDLINK { "<abs_name>" }
|
||||
|
||||
<abs_name> ::= object absolute name
|
||||
|
||||
<dataspace> ::= DATASPACE { "<dataspace_name>" } |
|
||||
DATASPACE { ARRAY <current_dims> <max_dims> } |
|
||||
DATASPACE { OTHER <ds_definition>+ }
|
||||
|
||||
<dataspace_name> ::= <identifier>
|
||||
|
||||
<current_dims> ::= a list of integers in the form of (<i>i<FONT SIZE=1.0>1</i></FONT>, <i>i<FONT SIZE=1.0>2</i></FONT>, ... ),
|
||||
where <i>i<FONT SIZE=1.0>k</i></FONT> is an integer, <i>k</i> = 1,2,...
|
||||
|
||||
<max_dims> ::= (<i>i<FONT SIZE=1.0>1</i></FONT>, <i>i<FONT SIZE=1.0>2</i></FONT>, ... ) where <i>i<FONT SIZE=1.0>k</i></FONT> is an integer or H5S_UNLIMITED
|
||||
|
||||
<ds_definition> ::= TBD
|
||||
|
||||
<data> ::= data {TBD}
|
||||
|
||||
<group_member> ::= <named_datatype> | <named_dataspace> | <group> | <dataset> |
|
||||
<softlink>
|
||||
|
||||
<named_datatype> ::= DATATYPE "<type_name>" { <compound_type_def>+ }
|
||||
|
||||
<type_name> ::= "<identifier>"
|
||||
|
||||
<named_dataspace> ::= DATASPACE "<dataspace_name>" { ARRAY <current_dims> <max_dims> } |
|
||||
DATASPACE "<dataspace_name>" { OTHER <ds_definition>+ }
|
||||
|
||||
<group> ::= GROUP "<group_name>" { <hardlink> } |
|
||||
GROUP "<group_name>" { <group_attribute>* <group_member>* }
|
||||
|
||||
<group_name> ::= <identifier>
|
||||
|
||||
<dataset> ::= DATASET "<dataset_name>" { <hardlink> } |
|
||||
DATASET "<dataset_name>" { <datatype>
|
||||
<dataspace>
|
||||
<storagelayout><FONT SIZE=1.7>opt</FONT>
|
||||
<compression><FONT SIZE=1.7>opt</FONT>
|
||||
<dataset_attribute>*
|
||||
<data><FONT SIZE=1.7>opt</FONT> }
|
||||
// Tokens within {} can be in any order as long as <data> and <dataset_attribute>
|
||||
// are after <datatype> and <dataspace>.
|
||||
|
||||
<dataset_name> ::= <identifier>
|
||||
|
||||
<storagelayout> :: = STORAGELAYOUT <contiguous_layout> |
|
||||
STORAGELAYOUT <chunked_layout> |
|
||||
STORAGELAYOUT <compact_layout> |
|
||||
STORAGELAYOUT <external_layout>
|
||||
|
||||
<contiguous_layout> ::= {CONTIGUOUS} // default
|
||||
|
||||
<chunked_layout> ::= {CHUNKED <dims> }
|
||||
|
||||
<dims> ::= (<i>i<FONT SIZE=1.0>1</i></FONT>, <i>i<FONT SIZE=1.0>2</i></FONT>, ... ), <i>i<FONT SIZE=1.0>k</i></FONT> is an integer, <i>k</i> = 1,2,...
|
||||
|
||||
<compact_layout> ::= TBD
|
||||
|
||||
<external_layout> ::= {EXTERNAL <external_file>+ }
|
||||
|
||||
<external_file> ::= (<file_name> <offset> <size>)
|
||||
|
||||
<offset> ::= an integer
|
||||
|
||||
<size> ::= an integer
|
||||
|
||||
<compression> :: = COMPRESSION { TBD }
|
||||
|
||||
<dataset_attribute> ::= <attribute>
|
||||
|
||||
<softlink> ::= SOFTLINK "<softlink_name>" { LINKTARGET "<target>" }
|
||||
|
||||
<softlink_name> ::= <identifier>
|
||||
|
||||
<target> ::= <identifier>
|
||||
|
||||
<identifier> ::= string
|
||||
// character '/' should be used with care.
|
||||
|
||||
</PRE>
|
||||
</dir>
|
||||
|
||||
|
||||
<h2>4. An Example of an HDF5 File in DDL</h2>
|
||||
|
||||
<dir>
|
||||
<PRE>
|
||||
HDF5 "example.h5" {
|
||||
GROUP "/" {
|
||||
DATASET "dset1" {
|
||||
DATATYPE {
|
||||
H5T_STD_I32BE int_name;
|
||||
H5T_IEEE_F32BE float_name;
|
||||
H5T_IEEE_F64BE double_name;
|
||||
}
|
||||
DATASPACE { ARRAY ( 5 ) ( 5 ) }
|
||||
DATA {{0,0,1}, {1,1,0.5}, {2,4,0.333333}, {3,9,0.25}, {4,16,0.2}}
|
||||
}
|
||||
GROUP "group1" {
|
||||
DATASET "dset2" {
|
||||
DATATYPE {
|
||||
HARDLINK { "/type1" }
|
||||
}
|
||||
DATASPACE { ARRAY ( 5 ) ( 5 ) }
|
||||
DATA {{0,0}, {1,1.1}, {2,2.2}, {3,3.3}, {4,4.4}}
|
||||
}
|
||||
}
|
||||
GROUP "group2" {
|
||||
HARDLINK { "/group1" }
|
||||
}
|
||||
SOFTLINK "slink1" {
|
||||
LINKTARGET "somevalue"
|
||||
}
|
||||
DATATYPE "type1" {
|
||||
H5T_STD_I32BE int_name;
|
||||
H5T_IEEE_F32BE float_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
</pre>
|
||||
</dir>
|
||||
|
||||
<hr>
|
||||
<address>
|
||||
<a href="mailto:hdfhelp@ncsa.uiuc.edu">HDF Help Desk</a>
|
||||
</address>
|
||||
|
||||
Last modified: 28 October 1998
|
||||
|
||||
</body>
|
||||
</html>
|
136
doc/html/RM_H5I.html
Normal file
136
doc/html/RM_H5I.html
Normal file
@ -0,0 +1,136 @@
|
||||
<html>
|
||||
<head><title>
|
||||
HDF5/H5I Draft API Specification
|
||||
</title></head>
|
||||
|
||||
<body>
|
||||
|
||||
<hr>
|
||||
<center>
|
||||
<a href="RM_H5Front.html">HDF5 Reference Manual</a>
|
||||
<a href="RM_H5.html">H5</a>
|
||||
<a href="RM_H5A.html">H5A</a>
|
||||
<a href="RM_H5D.html">H5D</a>
|
||||
<a href="RM_H5E.html">H5E</a>
|
||||
<a href="RM_H5F.html">H5F</a>
|
||||
<a href="RM_H5G.html">H5G</a>
|
||||
H5I
|
||||
<a href="RM_H5P.html">H5P</a>
|
||||
<a href="RM_H5R.html">H5R</a>
|
||||
<a href="RM_H5RA.html">H5RA</a>
|
||||
<a href="RM_H5S.html">H5S</a>
|
||||
<a href="RM_H5T.html">H5T</a>
|
||||
<a href="RM_H5Z.html">H5Z</a>
|
||||
<a href="Tools.html">Tools</a>
|
||||
<!--
|
||||
<a href="Glossary.html">Glossary</a>
|
||||
-->
|
||||
</center>
|
||||
<hr>
|
||||
|
||||
<center>
|
||||
<h1>H5I: Identifier Interface</h1>
|
||||
</center>
|
||||
|
||||
<h2>Identifier API Functions</h2>
|
||||
|
||||
This function provides a tool for working with object identifiers.
|
||||
<p>
|
||||
|
||||
<table border=0>
|
||||
<tr><td valign=top>
|
||||
<ul>
|
||||
<li><a href="#Identify-GetType">H5Iget_type</a>
|
||||
</ul>
|
||||
</td><td> </td><td valign=top>
|
||||
<ul>
|
||||
|
||||
</ul>
|
||||
</td><td> </td><td valign=top>
|
||||
<ul>
|
||||
|
||||
</ul>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
|
||||
<hr>
|
||||
<dl>
|
||||
<dt><strong>Name:</strong> <a name="Identify-GetType">H5Iget_type</a>
|
||||
<dt><strong>Signature:</strong>
|
||||
<dd><em>H5I_type_t</em> <code>H5Iget_type</code>(<em>hid_t</em> <code>obj_id</code>)
|
||||
<dt><strong>Purpose:</strong>
|
||||
<dd>Retrieves the type of an object.
|
||||
<dt><strong>Description:</strong>
|
||||
<dd><code>H5Iget_type</code> retrieves the type of the object
|
||||
identified by <code>obj_id</code>.
|
||||
<p>
|
||||
Valid types returned by the function are
|
||||
<table>
|
||||
<tr><td width=200><code> H5I_FILE</code>
|
||||
</td><td>File</td></tr>
|
||||
<tr><td><code> H5I_GROUP</code>
|
||||
</td><td>Group</td></tr>
|
||||
<tr><td><code> H5I_DATATYPE</code>
|
||||
</td><td>Datatype</td></tr>
|
||||
<tr><td><code> H5I_DATASPACE</code>
|
||||
</td><td>Dataspace</td></tr>
|
||||
<tr><td><code> H5I_DATASET</code>
|
||||
</td><td>Dataset</td></tr>
|
||||
<tr><td><code> H5I_ATTR</code>
|
||||
</td><td>Attribute</td></tr>
|
||||
</table>
|
||||
If no valid type can be determined or the identifier
|
||||
submitted is invalid, the function returns
|
||||
<table>
|
||||
<tr><td width=200><code> H5I_BADID</code>
|
||||
</td><td>Invalid identifier</td></tr>
|
||||
</table>
|
||||
<p>
|
||||
This function is of particular value in determining the
|
||||
type of object closing function (<code>H5Dclose</code>,
|
||||
<code>H5Gclose</code>, etc.) to call after a call to
|
||||
<code>H5Rdereference</code>.
|
||||
<dt><strong>Parameters:</strong>
|
||||
<dl>
|
||||
<dt><em>hid_t</em> <code>obj_id</code>
|
||||
<dd>IN: Object identifier whose type is to be determined.
|
||||
</dl>
|
||||
<dt><strong>Returns:</strong>
|
||||
<dd>Returns the object type if successful;
|
||||
otherwise <code>H5I_BADID</code>.
|
||||
</dl>
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<center>
|
||||
<a href="RM_H5Front.html">HDF5 Reference Manual</a>
|
||||
<a href="RM_H5.html">H5</a>
|
||||
<a href="RM_H5A.html">H5A</a>
|
||||
<a href="RM_H5D.html">H5D</a>
|
||||
<a href="RM_H5E.html">H5E</a>
|
||||
<a href="RM_H5F.html">H5F</a>
|
||||
<a href="RM_H5G.html">H5G</a>
|
||||
<a href="RM_H5I.html">H5I</a>
|
||||
<a href="RM_H5P.html">H5P</a>
|
||||
H5R
|
||||
<a href="RM_H5RA.html">H5RA</a>
|
||||
<a href="RM_H5S.html">H5S</a>
|
||||
<a href="RM_H5T.html">H5T</a>
|
||||
<a href="RM_H5Z.html">H5Z</a>
|
||||
<a href="Tools.html">Tools</a>
|
||||
<!--
|
||||
<a href="Glossary.html">Glossary</a>
|
||||
-->
|
||||
</center>
|
||||
<hr>
|
||||
|
||||
<address>
|
||||
<a href="mailto:hdfhelp@ncsa.uiuc.edu">HDF Help Desk</a>
|
||||
|
||||
<br>
|
||||
Last modified: 27 October 1998
|
||||
|
||||
</body>
|
||||
</html>
|
213
doc/html/RM_H5R.html
Normal file
213
doc/html/RM_H5R.html
Normal file
@ -0,0 +1,213 @@
|
||||
<html>
|
||||
<head><title>
|
||||
HDF5/H5R Draft API Specification
|
||||
</title></head>
|
||||
|
||||
<body>
|
||||
|
||||
<hr>
|
||||
<center>
|
||||
<a href="RM_H5Front.html">HDF5 Reference Manual</a>
|
||||
<a href="RM_H5.html">H5</a>
|
||||
<a href="RM_H5A.html">H5A</a>
|
||||
<a href="RM_H5D.html">H5D</a>
|
||||
<a href="RM_H5E.html">H5E</a>
|
||||
<a href="RM_H5F.html">H5F</a>
|
||||
<a href="RM_H5G.html">H5G</a>
|
||||
<a href="RM_H5I.html">H5I</a>
|
||||
<a href="RM_H5P.html">H5P</a>
|
||||
H5R
|
||||
<a href="RM_H5RA.html">H5RA</a>
|
||||
<a href="RM_H5S.html">H5S</a>
|
||||
<a href="RM_H5T.html">H5T</a>
|
||||
<a href="RM_H5Z.html">H5Z</a>
|
||||
<a href="Tools.html">Tools</a>
|
||||
<!--
|
||||
<a href="Glossary.html">Glossary</a>
|
||||
-->
|
||||
</center>
|
||||
<hr>
|
||||
|
||||
<center>
|
||||
<h1>H5R: Reference Interface</h1>
|
||||
</center>
|
||||
|
||||
<h2>Reference API Functions</h2>
|
||||
|
||||
The Reference interface allows the user to create references
|
||||
to specific objects and data regions in an HDF5 file.
|
||||
<p>
|
||||
|
||||
<table border=0>
|
||||
<tr><td valign=top>
|
||||
<ul>
|
||||
<li><a href="#Reference-Create">H5Rcreate</a>
|
||||
</ul>
|
||||
</td><td> </td><td valign=top>
|
||||
<ul>
|
||||
<li><a href="#Reference-Dereference">H5Rdereference</a>
|
||||
</ul>
|
||||
</td><td> </td><td valign=top>
|
||||
<ul>
|
||||
<li><a href="#Reference-GetRegion">H5Rget_region</a> (NYI)
|
||||
</ul>
|
||||
</td></tr>
|
||||
<tr><td colspan=5 align=right><font size=-1>
|
||||
NYI = Not yet implemented.</font>
|
||||
</td></tr>
|
||||
</table>
|
||||
|
||||
<p>
|
||||
<i>Note: The only type of reference implemented in this release
|
||||
is an object reference pointing to a dataset.</i>
|
||||
<p>
|
||||
|
||||
<hr>
|
||||
<dl>
|
||||
<dt><strong>Name:</strong> <a name="Reference-Create">H5Rcreate</a>
|
||||
<dt><strong>Signature:</strong>
|
||||
<dd><em>herr_t</em> <code>H5Rcreate</code>(<em>href_t *</em><code>ref</code>,
|
||||
<em>hid_t</em> <code>loc_id</code>,
|
||||
<em>const char *</em><code>name</code>,
|
||||
<em>H5R_type_t</em> <code>ref_type</code>,
|
||||
<em>hid_t</em> <code>space_id</code>
|
||||
)
|
||||
<dt><strong>Purpose:</strong>
|
||||
<dd>Creates a reference.
|
||||
<dt><strong>Description:</strong>
|
||||
<dd><code>H5Rcreate</code> creates the reference, <code>ref</code>,
|
||||
of the type specified in <code>ref_type</code>, pointing to
|
||||
the object <code>name</code> located at <code>loc_id</code>.
|
||||
<p>
|
||||
The parameters <code>loc_id</code> and <code>name</code> are
|
||||
used to locate the object.
|
||||
<p>
|
||||
The parameter <code>space_id</code> identifies the region
|
||||
to be pointed to (for dataset region references).
|
||||
<p>
|
||||
<i>Note: Only object references of type <code>H5T_STD_REF_OBJ</code>
|
||||
pointing to entire datasets are implemented at this time.</i>
|
||||
<dt><strong>Parameters:</strong>
|
||||
<dl>
|
||||
<dt><em>href_t *</em><code>ref</code>
|
||||
<dd>OUT: Reference created by the function call.
|
||||
<dt><em>hid_t</em> <code>loc_id</code>
|
||||
<dd>IN: Location identifier used to locate the object being
|
||||
pointed to.
|
||||
<dt><em>const char *</em><code>name</code>
|
||||
<dd>IN: Name of object at location <code>loc_id</code>.
|
||||
<dt><em>H5R_type_t</em> <code>ref_type</code>
|
||||
<dd>IN: Type of reference.
|
||||
<dt><em>hid_t</em> <code>space_id</code>
|
||||
<dd>IN: Dataspace identifier with selection.
|
||||
Used for dataset region references.
|
||||
</dl>
|
||||
<dt><strong>Returns:</strong>
|
||||
<dd>Returns a non-negative value if successful;
|
||||
otherwise returns a negative value.
|
||||
</dl>
|
||||
|
||||
|
||||
<hr>
|
||||
<dl>
|
||||
<dt><strong>Name:</strong> <a name="Reference-Dereference">H5Rdereference</a>
|
||||
<dt><strong>Signature:</strong>
|
||||
<dd><em>hid_t</em> <code>H5Rdereference</code>(<em>hid_t</em> <code>dataset</code>,
|
||||
<em>H5R_type_t</em> <code>ref_type</code>,
|
||||
<em>href_t *</em><code>ref</code>
|
||||
)
|
||||
<dt><strong>Purpose:</strong>
|
||||
<dd>Opens the HDF5 object referenced.
|
||||
<dt><strong>Description:</strong>
|
||||
<dd>Given a reference to some object, <code>H5Rdereference</code>
|
||||
opens that object and returns an identifier.
|
||||
<p>
|
||||
The parameter <code>ref_type</code> specifies the reference type
|
||||
of <code>ref</code>. See
|
||||
<a href="References.html#Reference-RefTypes">Reference Types</a> in
|
||||
<a href="References.html"><i>References (H5R)</i></a>
|
||||
for a list of valid reference types.
|
||||
<dt><strong>Parameters:</strong>
|
||||
<dl>
|
||||
<dt><em>hid_t</em> <code>dataset</code>
|
||||
<dd>IN: Dataset containing reference object.
|
||||
<dt><em>H5R_type_t</em> <code>ref_type</code>
|
||||
<dd>IN: The reference type of <code>ref</code>.
|
||||
<dt><em>void *</em><code>ref</code>
|
||||
<dd>IN: Reference to open.
|
||||
</dl>
|
||||
<dt><strong>Returns:</strong>
|
||||
<dd>Returns valid identifier if successful;
|
||||
otherwise returns a negative value.
|
||||
</dl>
|
||||
|
||||
|
||||
<hr>
|
||||
<dl>
|
||||
<dt><strong>Name:</strong> <a name="Reference-GetRegion">H5Rget_region</a>
|
||||
<i>(Not yet implemented.)</i>
|
||||
<dt><strong>Signature:</strong>
|
||||
<dd><em>hid_t</em> <code>H5Rget_region</code>(<em>hid_t</em> <code>dataset</code>,
|
||||
<em>H5R_type_t</em> <code>ref_type</code>,
|
||||
<em>href_t *</em><code>ref</code>
|
||||
)
|
||||
<dt><strong>Purpose:</strong>
|
||||
<dd>Retrieves a dataspace with the specified region selected.
|
||||
<dt><strong>Description:</strong>
|
||||
<dd>Given a reference to an object <code>ref</code>,
|
||||
<code>H5Rget_region</code> creates a copy of the dataspace
|
||||
of the dataset pointed to and defines a selection in the copy
|
||||
which is the region pointed to.
|
||||
<p>
|
||||
The parameter <code>ref_type</code> specifies the reference type
|
||||
of <code>ref</code>. See
|
||||
<a href="References.html#Reference-RefTypes">Reference Types</a> in
|
||||
<a href="References.html"><i>References (H5R)</i></a>
|
||||
for a list of valid reference types.
|
||||
<dt><strong>Parameters:</strong>
|
||||
<dl>
|
||||
<dt><em>hid_t</em> <code>dataset</code>,
|
||||
<dd>IN: Dataset containing reference object.
|
||||
<dt><em>H5R_type_t</em> <code>ref_type</code>,
|
||||
<dd>IN: The reference type of <code>ref</code>.
|
||||
<dt><em>href_t *</em><code>ref</code>
|
||||
<dd>IN: Reference to open.
|
||||
</dl>
|
||||
<dt><strong>Returns:</strong>
|
||||
<dd>Returns a valid identifier if successful;
|
||||
otherwise returns a negative value.
|
||||
</dl>
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<center>
|
||||
<a href="RM_H5Front.html">HDF5 Reference Manual</a>
|
||||
<a href="RM_H5.html">H5</a>
|
||||
<a href="RM_H5A.html">H5A</a>
|
||||
<a href="RM_H5D.html">H5D</a>
|
||||
<a href="RM_H5E.html">H5E</a>
|
||||
<a href="RM_H5F.html">H5F</a>
|
||||
<a href="RM_H5G.html">H5G</a>
|
||||
<a href="RM_H5I.html">H5I</a>
|
||||
<a href="RM_H5P.html">H5P</a>
|
||||
H5R
|
||||
<a href="RM_H5RA.html">H5RA</a>
|
||||
<a href="RM_H5S.html">H5S</a>
|
||||
<a href="RM_H5T.html">H5T</a>
|
||||
<a href="RM_H5Z.html">H5Z</a>
|
||||
<a href="Tools.html">Tools</a>
|
||||
<!--
|
||||
<a href="Glossary.html">Glossary</a>
|
||||
-->
|
||||
</center>
|
||||
<hr>
|
||||
|
||||
<address>
|
||||
<a href="mailto:hdfhelp@ncsa.uiuc.edu">HDF Help Desk</a>
|
||||
|
||||
<br>
|
||||
Last modified: 27 October 1998
|
||||
|
||||
</body>
|
||||
</html>
|
558
doc/html/References.html
Normal file
558
doc/html/References.html
Normal file
@ -0,0 +1,558 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>References</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>References</h1>
|
||||
|
||||
<h2>1. Introduction</h2>
|
||||
|
||||
This document discusses the kinds of references implemented
|
||||
(and planned) in HDF5 and the functions implemented (and planned)
|
||||
to support them.
|
||||
|
||||
|
||||
<h2>2. References</h2>
|
||||
|
||||
This section contains an overview of the kinds of references
|
||||
implemented, or planned for implementation, in HDF5.
|
||||
|
||||
<p>
|
||||
|
||||
<dl>
|
||||
<dt>Object reference
|
||||
<dd>Reference to an entire object in the current HDF5 file.
|
||||
<br>
|
||||
<em>The only kind of reference currently implemented.</em>
|
||||
<p>
|
||||
An object reference points to an entire object in the
|
||||
current HDF5 file by storing the relative file address
|
||||
(OID) of the object header for the object pointed to.
|
||||
The relative file address of an object header is
|
||||
constant for the life of the object.
|
||||
An object reference is of a fixed size in the file.
|
||||
<p>
|
||||
<dt>Dataset region reference
|
||||
<dd>Reference to a specific dataset region.
|
||||
<br>
|
||||
<em>Not yet implemented.</em>
|
||||
<p>
|
||||
A dataset region reference points to a region of a
|
||||
dataset in the current HDF5 file by storing the OID
|
||||
of the dataset and the global heap offset of the
|
||||
region referenced. The region referenced is located
|
||||
by retrieving the coordinates of the areas in the
|
||||
region from the global heap. A dataset region
|
||||
reference is of a variable size in the file.
|
||||
<p>
|
||||
<dt>Internal dataset region reference
|
||||
<dd>Reference to a region within the current dataset.
|
||||
<br>
|
||||
<em>Not yet implemented.</em>
|
||||
<p>
|
||||
An internal dataset region reference points to a
|
||||
region of the current dataset by storing the
|
||||
coordinates of the region. An internal dataset
|
||||
region reference is of a fixed size in the file.
|
||||
</dl>
|
||||
|
||||
|
||||
<b>Note:</b> All references are treated as soft links for the
|
||||
purposes of reference counting. The library does not keep track of
|
||||
reference links and they may dangle if the object they refer to
|
||||
is deleted, moved, or not yet available.
|
||||
|
||||
|
||||
<h2>3. Reference Types</h2>
|
||||
|
||||
This section lists valid HDF5 reference types for use in the
|
||||
H5R functions.
|
||||
|
||||
<center>
|
||||
<table>
|
||||
<tr><th align=left>Reference Type</th><th align=left>Value </th><th align=left>Description</th></tr>
|
||||
<tr><td><code>H5R_BADTYPE</code></td>
|
||||
<td align=right><code>-1 </code></td>
|
||||
<td>Invalid reference type</td></tr>
|
||||
<tr><td><code>H5R_OBJECT</code></td>
|
||||
<td align=right><code>0 </code></td>
|
||||
<td>Object reference</td></tr>
|
||||
<tr><td><code>H5R_DATASET_REGION</code></td>
|
||||
<td align=right><code>1 </code></td>
|
||||
<td>Dataset region reference</td></tr>
|
||||
<tr><td><code>H5R_INTERNAL</code></td>
|
||||
<td align=right><code>2 </code></td>
|
||||
<td>Internal reference</td></tr>
|
||||
</table>
|
||||
</center>
|
||||
|
||||
|
||||
<h2>4. Functions</h2>
|
||||
|
||||
Four functions, three in the H5R interface and one in the
|
||||
H5I interface, have been implemented to support references.
|
||||
The H5I function is also useful outside the context of references.
|
||||
<p>
|
||||
<dl>
|
||||
<dt><em>herr_t</em> <code>H5Rcreate(</code><em>href_t *</em><code>reference,</code>
|
||||
<em>hid_t</em> <code>loc_id,</code>
|
||||
<em>const char *</em><code>name,</code>
|
||||
<em>H5R_type_t</em> <code>type,</code>
|
||||
<em>hid_t</em> <code>space_id)</code>
|
||||
<dd><code>H5Rcreate</code> creates an object which is a
|
||||
particular type of reference (specified with the
|
||||
<code>type</code> parameter) to some file object and/or
|
||||
location specified with the <code>space_id</code> parameter.
|
||||
For dataset region references, the selection specified
|
||||
in the dataspace is the portion of the dataset which
|
||||
will be referred to.
|
||||
<p>
|
||||
<em>Currently only object references which point to
|
||||
entire datasets can be created.</em>
|
||||
<p>
|
||||
|
||||
<dt><em>hid_t</em> <code>H5Rdereference(</code><em>hid_t</em> <code>dset,</code>
|
||||
<em>H5R_type_t</em> <code>rtype,</code>
|
||||
<em>href_t *</em><code>ref)</code>
|
||||
<dd><code>H5Rdereference</code> opens the object referenced
|
||||
and returns an identifier for that object.
|
||||
The parameter <code>ref</code> specifies a reference of
|
||||
type <code>rtype</code> that is stored in the dataset
|
||||
<code>dset</code>.
|
||||
<p>
|
||||
|
||||
<dt><em>hid_t</em> <code>H5Rget_region(</code><em>hid_t</em> <code>dataset,</code>
|
||||
<em>H5R_type_t</em> <code>type,</code>
|
||||
<em>href_t *</em><code>reference)</code>
|
||||
<dd><code>H5Rget_region</code> creates a copy of dataspace of
|
||||
the dataset that is pointed to and defines a selection in
|
||||
the copy which is the location (or region) pointed to.
|
||||
The parameter <code>ref</code> specifies a reference of
|
||||
type <code>rtype</code> that is stored in the dataset
|
||||
<code>dset</code>.
|
||||
<p>
|
||||
<em>This function is not yet implemented.</em>
|
||||
<p>
|
||||
|
||||
<dt><em>H5I_type_t</em> <code>H5Iget_type(</code><em>hid_t</em> <code>id)</code>
|
||||
<dd>Returns the type of object referred to by the
|
||||
identifier <code>id</code>. Valid return values appear
|
||||
in the following list:
|
||||
<center>
|
||||
<table>
|
||||
<tr><td><code>H5I_BADID</code></td>
|
||||
<td>Invalid ID</td></tr>
|
||||
<tr><td><code>H5I_FILE</code></td>
|
||||
<td>File objects</td></tr>
|
||||
<tr><td><code>H5I_GROUP</code></td>
|
||||
<td>Group objects</td></tr>
|
||||
<tr><td><code>H5I_DATATYPE</code></td>
|
||||
<td>Data type objects</td></tr>
|
||||
<tr><td><code>H5I_DATASPACE</code></td>
|
||||
<td>Dataspace objects</td></tr>
|
||||
<tr><td><code>H5I_DATASET</code></td>
|
||||
<td>Dataset objects</td></tr>
|
||||
<tr><td><code>H5I_ATTR</code></td>
|
||||
<td>Attribute objects</td></tr>
|
||||
</table>
|
||||
</center>
|
||||
<p>
|
||||
This function was inspired by the need of users to figure
|
||||
out which type of object closing function
|
||||
(<code>H5Dclose</code>, <code>H5Gclose</code>, etc.)
|
||||
to call after a call to <code>H5Ddereference</code>,
|
||||
but it is also of general use.
|
||||
<p>
|
||||
</dl>
|
||||
|
||||
|
||||
|
||||
<h2>5. Examples</h2>
|
||||
|
||||
<b>Object Reference Writing Example</b>
|
||||
<br>
|
||||
Create a dataset which has links to other datasets as part
|
||||
of its raw data and write the dataset to the file.
|
||||
<p>
|
||||
|
||||
<pre>
|
||||
{
|
||||
hid_t file1;
|
||||
hid_t dataset1;
|
||||
hid_t datatype, dataspace;
|
||||
char buf[128];
|
||||
href_t link;
|
||||
href_t data[10][10];
|
||||
int rank;
|
||||
size_t dimsf[2];
|
||||
int i, j;
|
||||
|
||||
/* Open the file */
|
||||
file1=H5Fopen("example.h5", H5F_ACC_RDWR, H5P_DEFAULT);
|
||||
|
||||
/* Describe the size of the array and create the data space */
|
||||
rank=2;
|
||||
dimsf[0] = 10;
|
||||
dimsf[1] = 10;
|
||||
dataspace = H5Screate_simple(rank, dimsf, NULL);
|
||||
|
||||
/* Define datatype */
|
||||
datatype = H5Tcopy(H5T_STD_REF_OBJ);
|
||||
|
||||
/* Create a dataset */
|
||||
dataset1=H5Dcreate(file1,"Dataset One",datatype,dataspace,H5P_DEFAULT);
|
||||
|
||||
/* Construct array of OIDs for other datasets in the file */
|
||||
/* somewhat hokey and artificial, but demonstrates the point */
|
||||
for(i=0; i<10; i++)
|
||||
for(j=0; j<10; i++)
|
||||
{
|
||||
sprintf(buf,"/Group/Linked Set %d-%d",i,j);
|
||||
if(H5Rcreate(&link,file1,buf,H5R_REF_OBJ,-1)>0)
|
||||
data[i][j]=link;
|
||||
} /* end for */
|
||||
|
||||
/* Write the data to the dataset using default transfer properties. */
|
||||
H5Dwrite(dataset, H5T_POINTER_OBJECT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
|
||||
|
||||
/* Close everything */
|
||||
H5Sclose(dataspace);
|
||||
H5Tclose(datatype);
|
||||
H5Dclose(dataset1);
|
||||
H5Fclose(file1);
|
||||
}
|
||||
</pre>
|
||||
|
||||
|
||||
<b>Object Reference Reading Example</b>
|
||||
<br>
|
||||
Open a dataset which has links to other datasets as part of
|
||||
its raw data and read in those links.
|
||||
<p>
|
||||
|
||||
<pre>
|
||||
{
|
||||
hid_t file1;
|
||||
hid_t dataset1, tmp_dset;
|
||||
href_t data[10][10];
|
||||
int i, j;
|
||||
|
||||
/* Open the file */
|
||||
file1=H5Fopen("example.h5", H5F_ACC_RDWR, H5P_DEFAULT);
|
||||
|
||||
/* Open the dataset */
|
||||
dataset1=H5Dopen(file1,"Dataset One",H5P_DEFAULT);
|
||||
|
||||
/*
|
||||
* Read the data to the dataset using default transfer properties.
|
||||
* (we are assuming the dataset is the same and not querying the
|
||||
* dimensions, etc.)
|
||||
*/
|
||||
H5Dread(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
|
||||
|
||||
/* Analyze array of OIDs of linked datasets in the file */
|
||||
/* somewhat hokey and artificial, but demonstrates the point */
|
||||
for(i=0; i<10; i++)
|
||||
for(j=0; j<10; i++)
|
||||
{
|
||||
if((tmp_dset=H5Rdereference(dataset, H5T_STD_REF_OBJ, data[i][j]))>0)
|
||||
{
|
||||
<perform operations on linked dataset>
|
||||
} /* end if */
|
||||
H5Dclose(tmp_dset);
|
||||
} /* end for */
|
||||
|
||||
|
||||
/* Close everything */
|
||||
H5Dclose(dataset1);
|
||||
H5Fclose(file1);
|
||||
}
|
||||
</pre>
|
||||
|
||||
|
||||
<b>Dataset Region Reference Writing Example</b>
|
||||
<br>
|
||||
Create a dataset which has links to other dataset regions
|
||||
(single elements in this case) as part of its raw data and
|
||||
write the dataset to the file.
|
||||
<p>
|
||||
|
||||
<pre>
|
||||
{
|
||||
hid_t file1;
|
||||
hid_t dataset1, dataset2;
|
||||
hid_t datatype, dataspace1, dataspace2;
|
||||
char buf[128];
|
||||
href_t link;
|
||||
href_t data[10][10]; /* HDF5 reference type */
|
||||
int rank;
|
||||
size_t dimsf[2];
|
||||
hssize_t start[3],count[3];
|
||||
int i, j;
|
||||
|
||||
/* Open the file */
|
||||
file1=H5Fopen("example.h5", H5F_ACC_RDWR, H5P_DEFAULT);
|
||||
|
||||
/* Describe the size of the array and create the data space */
|
||||
rank=2;
|
||||
dimsf[0] = 10;
|
||||
dimsf[1] = 10;
|
||||
dataspace1 = H5Screate_simple(rank, dimsf, NULL);
|
||||
|
||||
/* Define Dataset Region Reference datatype */
|
||||
datatype = H5Tcopy(H5T_STD_REF_DATAREG);
|
||||
|
||||
/* Create a dataset */
|
||||
dataset1=H5Dcreate(file1,"Dataset One",datatype,dataspace1,H5P_DEFAULT);
|
||||
|
||||
/* Construct array of OIDs for other datasets in the file */
|
||||
/* (somewhat artificial, but demonstrates the point) */
|
||||
for(i=0; i<10; i++)
|
||||
for(j=0; j<10; i++)
|
||||
{
|
||||
sprintf(buf,"/Group/Linked Set %d-%d",i,j);
|
||||
|
||||
/* Get the dataspace for the object to point to */
|
||||
dataset2=H5Dopen(file1,buf,H5P_DEFAULT);
|
||||
dataspace2=H5Dget_space(dataspace2);
|
||||
|
||||
/* Select the region to point to */
|
||||
/* (could be different region for each pointer) */
|
||||
start[0]=5; start[1]=4; start[2]=3;
|
||||
count[0]=2; count[1]=4; count[2]=1;
|
||||
H5Sselect_hyperslab(dataspace2,H5S_SELECT_SET,start,NULL,count,NULL);
|
||||
|
||||
if(H5Rcreate(&link,file1,buf,H5R_REF_DATAREG,dataspace2)>0)
|
||||
/* Store the reference */
|
||||
data[i][j]=link;
|
||||
|
||||
H5Sclose(dataspace2);
|
||||
H5Dclose(dataspace2);
|
||||
} /* end for */
|
||||
|
||||
/* Write the data to the dataset using default transfer properties. */
|
||||
H5Dwrite(dataset, H5T_STD_REF_DATAREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
|
||||
|
||||
/* Close everything */
|
||||
H5Sclose(dataspace);
|
||||
H5Tclose(datatype);
|
||||
H5Dclose(dataset1);
|
||||
H5Fclose(file1);
|
||||
}
|
||||
</pre>
|
||||
|
||||
|
||||
<b>Dataset Region Reference Reading Example</b>
|
||||
<br>
|
||||
Open a dataset which has links to other datasets regions
|
||||
(single elements in this case) as part of its raw data and
|
||||
read in those links.
|
||||
<p>
|
||||
|
||||
<pre>
|
||||
{
|
||||
hid_t file1;
|
||||
hid_t dataset1, tmp_dset;
|
||||
hid_t dataspace;
|
||||
href_t data[10][10]; /* HDF5 reference type */
|
||||
int i, j;
|
||||
|
||||
/* Open the file */
|
||||
file1=H5Fopen("example.h5", H5F_ACC_RDWR, H5P_DEFAULT);
|
||||
|
||||
/* Open the dataset */
|
||||
dataset1=H5Dopen(file1,"Dataset One",H5P_DEFAULT);
|
||||
|
||||
/*
|
||||
* Read the data to the dataset using default transfer properties.
|
||||
* (we are assuming the dataset is the same and not querying the
|
||||
* dimensions, etc.)
|
||||
*/
|
||||
H5Dread(dataset, H5T_STD_REF_DATAREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
|
||||
|
||||
/* Analyze array of OIDs of linked datasets in the file */
|
||||
/* (somewhat artificial, but demonstrates the point) */
|
||||
for(i=0; i<10; i++)
|
||||
for(j=0; j<10; i++)
|
||||
{
|
||||
if((tmp_dset=H5Rdereference(dataset, H5D_STD_REF_DATAREG,data[i][j]))>0)
|
||||
{
|
||||
/* Get the dataspace with the pointed to region selected */
|
||||
dataspace=H5Rget_space(data[i][j]);
|
||||
|
||||
<perform operation on linked dataset region>
|
||||
|
||||
H5Sclose(dataspace);
|
||||
} /* end if */
|
||||
H5Dclose(tmp_dset);
|
||||
} /* end for */
|
||||
|
||||
|
||||
/* Close everything */
|
||||
H5Dclose(dataset1);
|
||||
H5Fclose(file1);
|
||||
}
|
||||
</pre>
|
||||
|
||||
|
||||
|
||||
<hr>
|
||||
<address>
|
||||
<a href="mailto:hdfhelp@ncsa.uiuc.edu">HDF Help Desk</a>
|
||||
</address>
|
||||
|
||||
Last modified: 28 October 1998
|
||||
|
||||
|
||||
<h1>Material to Be Omitted!!!</h1>
|
||||
|
||||
Additional material above will also need to be deleted or
|
||||
commented out.
|
||||
<p>
|
||||
|
||||
<h2>"Kinds of Reference" Information</h2>
|
||||
|
||||
<dl>
|
||||
<dt>Dataset Offset Reference
|
||||
<dd>Reference to a specific byte sequence in a dataset (3)
|
||||
<dt>Disk Offset Reference
|
||||
<dd>Reference to a specific byte sequence in a file (3)
|
||||
<dt>External Object Reference
|
||||
<dd>Reference to an entire object in another HDF5 file (3)
|
||||
<dt>External Dataset Region Reference
|
||||
<dd>Reference an a specific dataset region in another HDF5 file (3)
|
||||
<dt>External Dataset Offset Reference
|
||||
<dd>Reference to a specific byte sequence in a dataset in
|
||||
another HDF5 file (3)
|
||||
<dt>External Disk Offset Reference
|
||||
<dd>Reference to a specific byte sequence in another HDF5 file (3)
|
||||
<dt>Generic Reference
|
||||
<dd>A reference which may be any of the types defined above. (3)
|
||||
</dl>
|
||||
|
||||
Notes:
|
||||
<ul>
|
||||
<li>1 - Planned for in final release.
|
||||
<li>2 - Most useful reference types to tackle next
|
||||
<li>3 - Optional reference types.
|
||||
</ul>
|
||||
|
||||
<h2>Comments</h2>
|
||||
<pre>
|
||||
Reference types are atomic types and may be included as fields in compound
|
||||
data types.
|
||||
|
||||
There are (at least) three levels of reference strength:
|
||||
Weak - We allow the user to store any type of reference in an array
|
||||
of references. (u.e., the array of references in the example above
|
||||
could be a mix of Object, Dataset Region and Internal references)
|
||||
Medium - We force the user to stick with a particular type of
|
||||
reference within a dataset, but the datasets pointed to (with
|
||||
Object and Dataset Region references) may be of any data type
|
||||
or dataspace.
|
||||
Strong - We force the user to stick with a particular type of
|
||||
reference and Object and Dataset Region references must point to
|
||||
datasets with the same data type.
|
||||
Extra Strong - We force the user to stick with a particular type of
|
||||
reference and Object and Dataset Region references must point to
|
||||
datasets with the same data type _and_ dataspace.
|
||||
|
||||
The library is currently implemented with "medium" strength references.
|
||||
</pre>
|
||||
|
||||
|
||||
<h2>Reference Type</h2>
|
||||
|
||||
<center>
|
||||
<table>
|
||||
<tr><td><code>H5R_MAXTYPE</code></td>
|
||||
<td align=right><code>3 </code></td>
|
||||
<td>Highest type in group (invalid as true type)</td></tr>
|
||||
</table>
|
||||
</center>
|
||||
|
||||
|
||||
<h2>Information Regarding Specific Kinds of References</h2>
|
||||
|
||||
<dl>
|
||||
<dt>Dataset Offset Reference
|
||||
<dd>Points to a sequence of bytes within a dataset in
|
||||
the current HDF5 file by storing the OID of the dataset and the byte
|
||||
length and offset of the sequence within the dataset. The offset is
|
||||
the logical byte offset within the dataset, meaning that the data is
|
||||
de-compressed before returning the sequence of bytes requested. No
|
||||
interpretation of the data at that location is provided. However,
|
||||
if the dataset is extendible and the size of the dimensions are changed,
|
||||
the element(s) that the sequence is located within may vary. Fixed size
|
||||
in file.
|
||||
|
||||
<dt>Disk Offset Reference
|
||||
<dd>Points to a sequence of bytes in the current
|
||||
HDF5 file by storing the byte length and offset of the sequence within
|
||||
the file, relative to the boot-block (as are all the other high-level
|
||||
addresses used in the file). The offset is the absolute byte offset
|
||||
within the file, no interpretation of the data at that location is
|
||||
provided. Fixed size in file.
|
||||
|
||||
<dt>External Object Reference
|
||||
<dd>Points to an entire object in another HDF5 file by
|
||||
storing a global heap offset which points to the URL of the external
|
||||
file and the OID of the object pointed to. Variable size in file.
|
||||
|
||||
<dt>External Dataset Region Reference
|
||||
<dd>Points to a region of a dataset in
|
||||
another HDF5 file by storing a global heap offset which points to the
|
||||
URL of the external file, OID of the dataset and the coordinates of the
|
||||
region. Variable size in file.
|
||||
|
||||
<dt>External Dataset Offset Reference
|
||||
<dd>Points to a sequence of bytes within a
|
||||
dataset in another HDF5 file by storing a global heap offset which
|
||||
points to the URL of the external file, the OID of the dataset and the
|
||||
byte length and offset of the sequence within the dataset. The offset
|
||||
is the logical byte offset within the dataset, meaning that the data is
|
||||
de-compressed before returning the sequence of bytes requested.
|
||||
However, if the dataset is not stored contiguously and the size of the
|
||||
dimensions are changed, the element(s) that the sequence is located
|
||||
within may vary. Variable size in file.
|
||||
|
||||
<dt>External Disk Offset Reference
|
||||
<dd>Points to a sequence of bytes in another
|
||||
HDF5 file by storing a global heap reference which points to the URL
|
||||
of the external file and the byte length and offset of the sequence
|
||||
within the file. The offset is the absolute byte offset within the
|
||||
file, no interpretation of the data at that location is provided.
|
||||
Variable size in file.
|
||||
|
||||
<dt>Generic Reference
|
||||
<dd>A reference which may contain any of the other
|
||||
references defined above. (Mostly useful for implementing "weak"
|
||||
strength pointers within the medium strength model we are using)
|
||||
Variable size in file.
|
||||
|
||||
</dl>
|
||||
|
||||
<h2>Implementation Details</h2>
|
||||
|
||||
<dl>
|
||||
<dt>File Storage
|
||||
<dd>In order to efficiently index an array, each element must be the
|
||||
same size when stored in the dataset on disk. Fixed-sized references
|
||||
will be stored directly in the dataset array on disk; variable-sized
|
||||
references will have a fixed-size head offset stored in the array on
|
||||
disk with a file heap used to store the actual variable-sized
|
||||
information stored in the heap.
|
||||
|
||||
<dt>Memory Storage
|
||||
<dd>Each <code>href_t</code> object in memory is a struct containing
|
||||
a pointer type and union of information required for each
|
||||
pointer type.
|
||||
Information in this structure is not designed for users to view.
|
||||
Non-C APIs may have to mangle this structure in some way, in order
|
||||
to provide users with access to references in a language-appropriate
|
||||
way.
|
||||
</dl>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user