diff options
Diffstat (limited to 'src/H5D.c')
-rw-r--r-- | src/H5D.c | 161 |
1 files changed, 152 insertions, 9 deletions
@@ -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 */ |