summaryrefslogtreecommitdiffstats
path: root/src/H5D.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5D.c')
-rw-r--r--src/H5D.c161
1 files changed, 152 insertions, 9 deletions
diff --git a/src/H5D.c b/src/H5D.c
index 32eb59b..995d741 100644
--- a/src/H5D.c
+++ b/src/H5D.c
@@ -38,6 +38,7 @@ static char RcsId[] = "@(#)$Revision$";
#include <H5Dprivate.h> /* Dataset functions */
#include <H5Eprivate.h> /* Error handling */
#include <H5Mprivate.h> /* Meta data */
+#include <H5Gprivate.h> /* Group headers */
#include <H5Oprivate.h> /* Object headers */
#include <H5MFprivate.h> /* File space allocation header */
@@ -67,6 +68,7 @@ static herr_t H5D_init_interface(void)
FUNC_ENTER (H5D_init_interface, NULL, FAIL);
/* Initialize the atom group for the file IDs */
+ ret_value=H5Ainit_group(H5_OID,H5A_OID_HASHSIZE,0);
ret_value=H5Ainit_group(H5_DATASET,H5A_DATASETID_HASHSIZE,H5D_RESERVED_ATOMS);
FUNC_LEAVE(ret_value);
@@ -165,18 +167,21 @@ hatom_t H5D_access(hatom_t oid)
/* Pull information about the dataset out of the file */
dset->file=H5Aatom_object(ohdr->fid); /* Get the pointer to the file for the dataset */
/* Get the dataset's name */
- if((dset->name=H5O_read(dset->file,ohdr->ohdr,ohdr->ent,H5O_NAME,1,NULL))==NULL)
+ if((dset->name=H5O_read(dset->file,ohdr->ohdr,&ohdr->ent,H5O_NAME,0,NULL))==NULL)
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL);
dset->modified=BFALSE; /* nothing changed yet */
/* Get the dataset's type (currently only atomic types) */
- if((dset->type=H5O_read(dset->file,ohdr->ohdr,ohdr->ent,H5O_SIM_DTYPE,1,NULL))==NULL)
+ if((dset->type=H5O_read(dset->file,ohdr->ohdr,&ohdr->ent,H5O_SIM_DTYPE,0,NULL))==NULL)
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL);
/* Get the dataset's dimensionality (currently only simple dataspaces) */
- if((dset->dim=H5O_read(dset->file,ohdr->ohdr,ohdr->ent,H5O_SIM_DIM,1,NULL))==NULL)
+ if((dset->dim=HDmalloc(sizeof(H5P_dim_t)))==NULL)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL);
+ dset->dim->type=H5P_TYPE_SIMPLE; /* for now... */
+ if((dset->dim->s=H5O_read(dset->file,ohdr->ohdr,&ohdr->ent,H5O_SIM_DIM,0,NULL))==NULL)
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL);
dset->header=ohdr->ohdr; /* keep the object header location for later */
/* Get the dataset's data offset (currently only standard storage) */
- if(NULL==H5O_read(dset->file,ohdr->ohdr,ohdr->ent,H5O_STD_STORE,1,&store))
+ if(NULL==H5O_read(dset->file,ohdr->ohdr,&ohdr->ent,H5O_STD_STORE,0,&store))
HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL);
dset->data=store.off;
@@ -197,6 +202,66 @@ done:
/*--------------------------------------------------------------------------
NAME
+ H5D_find_name
+ PURPOSE
+ Get the OID for accessing an existing HDF5 dataset object
+ USAGE
+ hoid_t H5D_find_name(grp_id, type, name)
+ hatom_t grp_id; IN: Atom for directory to search for dataset
+ hobjtype_t type; IN: Type of object to search for (dataset in this case)
+ const char *name; IN: Name of the object to search for
+ RETURNS
+ Returns ID (atom) on success, FAIL on failure
+ DESCRIPTION
+ This function finds for a dataset by name in a directory.
+--------------------------------------------------------------------------*/
+hatom_t H5D_find_name(hatom_t grp_id, hobjtype_t type, const char *name)
+{
+ hdf5_file_t *file; /* Pointer to the file-store of this object */
+ H5D_oid_t *ohdr; /* OID for reference to dataset */
+ hatom_t ret_value = SUCCEED;
+
+ FUNC_ENTER(H5D_find_name, H5D_init_interface, FAIL);
+
+ /* Clear errors and check args and all the boring stuff. */
+ H5ECLEAR;
+
+ /* Allocate space for the dataset */
+ if((ohdr=HDmalloc(sizeof(H5D_oid_t)))==NULL)
+ HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL);
+
+ /* Get directory symbols, etc... */
+ if(H5Aatom_group(grp_id)!=H5_FILE)
+ HGOTO_ERROR(H5E_ATOM, H5E_BADTYPE, FAIL);
+ file=H5Aatom_object(grp_id);
+/* WARNING! WARNING! WARNING! */
+/* The following line explicitly uses the root symbol as the
+ current working directory. This should be changed to something more
+ appropriate and is only hacked in here to get the prototype working. -QAK
+*/
+/* WARNING! WARNING! WARNING! */
+ if(H5G_find(file,file->root_sym,&(ohdr->dir),name,&(ohdr->ent))==FAIL)
+ HGOTO_ERROR(H5E_DATASET, H5E_NOTFOUND, FAIL);
+ ohdr->fid=grp_id;
+ ohdr->ohdr=ohdr->ent.header;
+
+ /* Register the new OID and get an ID for it */
+ if((ret_value=H5Aregister_atom(H5_OID, (const VOIDP)ohdr))==FAIL)
+ HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL);
+
+done:
+ if(ret_value == FAIL)
+ { /* Error condition cleanup */
+
+ } /* end if */
+
+ /* Normal function cleanup */
+
+ FUNC_LEAVE(ret_value);
+} /* end H5D_find_name() */
+
+/*--------------------------------------------------------------------------
+ NAME
H5Dset_info
PURPOSE
Set the type and dimensionality of a dataset.
@@ -302,11 +367,79 @@ done:
/*--------------------------------------------------------------------------
NAME
+ H5Dread
+ PURPOSE
+ Read data from a dataset
+ USAGE
+ herr_t H5Dread(oid)
+ hatom_t oid; IN: Dataset to read
+ hatom_t did; IN: Dimensionality object to use as dataspace for I/O
+ VOIDP buf; IN: Buffer to fill with data from the file
+ RETURNS
+ SUCCEED/FAIL
+ DESCRIPTION
+ This function reads dataset object data to the file. The dataspace
+ ID determines the slice/hyper-slab/portion of the dataset to write.
+ H5P_SCALAR is a special value which indicates that the entire dataset is
+ to be written out. (For datasets which have a scalar dataspace for the
+ entire dataset, this is somewhat redundant.... :-)
+--------------------------------------------------------------------------*/
+herr_t H5Dread(hatom_t oid, hatom_t did, VOIDP buf)
+{
+ H5D_dataset_t *dataset; /* dataset object to do I/O on */
+ uintn toread; /* number of bytes to read in */
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER(H5Dread, H5D_init_interface, FAIL);
+
+ /* Clear errors and check args and all the boring stuff. */
+ H5ECLEAR;
+
+ /* Check that we've received correctly typed parameters */
+ if(H5Aatom_group(did)!=H5_DATASPACE || H5Aatom_group(oid)!=H5_DATASET)
+ HGOTO_ERROR(H5E_ATOM, H5E_BADTYPE, FAIL);
+ if(buf==NULL)
+ HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL);
+
+ /* Get the object */
+ if((dataset=H5Aatom_object(oid))==NULL)
+ HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL);
+
+ /* Check that the datatype & dataspace have already been initialized */
+ if(dataset->type==NULL || dataset->dim==NULL || dataset->data==(-1))
+ HGOTO_ERROR(H5E_FUNC, H5E_UNINITIALIZED, FAIL);
+
+ /* Compute the number of bytes to read */
+ if(did==H5P_SCALAR) /* Check if we are reading the entire dataset */
+ toread=H5T_size(dataset->type,BTRUE)*H5P_nelem(dataset->dim);
+ else
+ HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL);
+
+/* Check memory to disk datatype conversions, etc. */
+/* DO THIS! -QAK */
+
+ /* Write the data out to disk */
+ if(H5F_block_read(dataset->file,dataset->data,toread,buf)==FAIL)
+ HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL);
+
+done:
+ if(ret_value == FAIL)
+ { /* Error condition cleanup */
+
+ } /* end if */
+
+ /* Normal function cleanup */
+
+ FUNC_LEAVE(ret_value);
+} /* end H5Dread() */
+
+/*--------------------------------------------------------------------------
+ NAME
H5Dwrite
PURPOSE
Write data for a dataset
USAGE
- herr_t H5Dset_info(oid)
+ herr_t H5Dwrite(oid)
hatom_t oid; IN: Dataset object to modify
hatom_t did; IN: Dimensionality object to use as dataspace for I/O
VOIDP buf; IN: Buffer with data to write to the file
@@ -321,7 +454,7 @@ done:
--------------------------------------------------------------------------*/
herr_t H5Dwrite(hatom_t oid, hatom_t did, VOIDP buf)
{
- H5D_dataset_t *dataset; /* dataset object to release */
+ H5D_dataset_t *dataset; /* dataset object to do I/O on */
uintn towrite; /* number of bytes to write out */
herr_t ret_value = SUCCEED;
@@ -331,7 +464,7 @@ herr_t H5Dwrite(hatom_t oid, hatom_t did, VOIDP buf)
H5ECLEAR;
/* Check that we've received correctly typed parameters */
- if(did!=0 && H5Aatom_group(did)!=H5_DATASPACE)
+ if(H5Aatom_group(did)!=H5_DATASPACE || H5Aatom_group(oid)!=H5_DATASET)
HGOTO_ERROR(H5E_ATOM, H5E_BADTYPE, FAIL);
if(buf==NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL);
@@ -339,12 +472,13 @@ herr_t H5Dwrite(hatom_t oid, hatom_t did, VOIDP buf)
/* Get the object */
if((dataset=H5Aatom_object(oid))==NULL)
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL);
+
/* Check that the datatype & dataspace haven't already been initialized */
if(dataset->type==NULL || dataset->dim==NULL)
HGOTO_ERROR(H5E_FUNC, H5E_UNINITIALIZED, FAIL);
/* Compute the number of bytes to write out */
- if(did==0) /* Check if we are writing out the entire dataset */
+ if(did==H5P_SCALAR) /* Check if we are writing out the entire dataset */
towrite=H5T_size(dataset->type,BTRUE)*H5P_nelem(dataset->dim);
else
HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL);
@@ -423,6 +557,12 @@ herr_t H5D_flush(hatom_t oid)
/*
* Write the necessary messages to the header.
*/
+ /* Write the dataset's name */
+ if(dataset->name!=NULL)
+ {
+ if(H5O_modify(dataset->file,dataset->header,&d_sym,NULL,H5O_NAME,H5O_NEW_MESG,dataset->name)==FAIL)
+ HGOTO_ERROR (H5E_INTERNAL, H5E_CANTCREATE, FAIL);
+ } /* end if */
/* Check if this dataset has an "atomic" datatype */
if(BTRUE==H5T_is_atomic(dataset->type))
{
@@ -443,6 +583,7 @@ herr_t H5D_flush(hatom_t oid)
{ /* if it's not an atomic datatype, fail for right now */
HGOTO_ERROR (H5E_INTERNAL, H5E_UNSUPPORTED, FAIL);
} /* end else */
+ /* Write the dataset's storage information */
if(dataset->data>0)
{
H5O_std_store_t store; /* standard storage info */
@@ -559,10 +700,12 @@ herr_t H5D_release(hatom_t oid)
if(dataset->modified==BTRUE)
H5D_flush(oid);
- /* relase the memory used for the dataset */
+ /* release the memory used for the dataset */
if(dataset->name!=NULL)
+ {
HDfree(dataset->name->s);
HDfree(dataset->name);
+ } /* end if */
HDfree(dataset);
/* Delete the dataset from the atom group */