diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2006-10-02 10:24:03 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2006-10-02 10:24:03 (GMT) |
commit | a6f6462541cc57364586f770131e2ea074d63492 (patch) | |
tree | 0debf502fb7d66f9f470edb935a62223945960d4 /src/H5Gbtree2.c | |
parent | 9bc29ea538b9ce2013a8cde5be230c18cf052009 (diff) | |
download | hdf5-a6f6462541cc57364586f770131e2ea074d63492.zip hdf5-a6f6462541cc57364586f770131e2ea074d63492.tar.gz hdf5-a6f6462541cc57364586f770131e2ea074d63492.tar.bz2 |
[svn-r12700] Alert:
File format is not stable, don't keep files produced!
Description:
First stage of checkins modifying the format of groups to support creation
order. Implement "dense" storage for links in groups.
Try to clarify some of the symbols for the H5L API.
Add the H5Pset_latest_format() flag for FAPLs, to choose to use the newest
file format options (including "dense" link storage in groups)
Add the H5Pset_track_creation_order() flag for GCPLs, to enable creation
order tracking in groups (although no index on creation order yet).
Remove --enable-group-revision configure flag, as file format issues are
now handled in a backwardly/forwardly compatible way.
Clean up lots of compiler warnings and other minor formatting issues.
Tested on:
FreeBSD/32 4.11 (sleipnir) w/threadsafe
Linux/32 2.4 (heping) w/FORTRAN & C++
Linux/64 2.4 (mir) w/enable-v1.6 compa
Mac OSX/32 10.4.8 (amazon)
AIX 5.3 (copper) w/parallel & FORTRAN
Diffstat (limited to 'src/H5Gbtree2.c')
-rw-r--r-- | src/H5Gbtree2.c | 376 |
1 files changed, 376 insertions, 0 deletions
diff --git a/src/H5Gbtree2.c b/src/H5Gbtree2.c new file mode 100644 index 0000000..f53493c --- /dev/null +++ b/src/H5Gbtree2.c @@ -0,0 +1,376 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5Gbtree2.c + * Sep 9 2006 + * Quincey Koziol <koziol@hdfgroup.org> + * + * Purpose: v2 B-tree callbacks for indexing fields on links + * + *------------------------------------------------------------------------- + */ + +/****************/ +/* Module Setup */ +/****************/ + +#define H5G_PACKAGE /*suppress error about including H5Gpkg */ + + +/***********/ +/* Headers */ +/***********/ +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Gpkg.h" /* Groups */ + + +/****************/ +/* Local Macros */ +/****************/ + + +/******************/ +/* Local Typedefs */ +/******************/ + +/* + * Data exchange structure for dense link storage. This structure is + * passed through the fractal heap layer to compare links. + */ +typedef struct H5G_fh_ud_cmp_t { + /* downward */ + H5F_t *f; /* Pointer to file that fractal heap is in */ + hid_t dxpl_id; /* DXPL for operation */ + const char *name; /* Name of link to compare */ + H5B2_found_t found_op; /* Callback when correct link is found */ + void *found_op_data; /* Callback data when correct link is found */ + + /* upward */ + int cmp; /* Comparison of two link names */ +} H5G_fh_ud_cmp_t; + + +/********************/ +/* Package Typedefs */ +/********************/ + + +/********************/ +/* Local Prototypes */ +/********************/ + +/* v2 B-tree function callbacks */ + +/* v2 B-tree driver callbacks */ +static herr_t H5G_dense_btree2_name_store(void *native, const void *udata); +static herr_t H5G_dense_btree2_name_retrieve(void *udata, const void *native); +static herr_t H5G_dense_btree2_name_compare(const void *rec1, const void *rec2); +static herr_t H5G_dense_btree2_name_encode(const H5F_t *f, uint8_t *raw, + const void *native); +static herr_t H5G_dense_btree2_name_decode(const H5F_t *f, const uint8_t *raw, + void *native); +static herr_t H5G_dense_btree2_name_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id, + int indent, int fwidth, const void *record, const void *_udata); + +/* Fractal heap function callbacks */ +static herr_t H5G_dense_fh_name_cmp(const void *obj, size_t obj_len, void *op_data); + + + +/*********************/ +/* Package Variables */ +/*********************/ +/* v2 B-tree class for indexing 'name' field of links */ +const H5B2_class_t H5G_BT2_NAME[1]={{ /* B-tree class information */ + H5B2_GRP_DENSE_NAME_ID, /* Type of B-tree */ + sizeof(H5G_dense_bt2_name_rec_t), /* Size of native record */ + H5G_dense_btree2_name_store, /* Record storage callback */ + H5G_dense_btree2_name_retrieve, /* Record retrieval callback */ + H5G_dense_btree2_name_compare, /* Record comparison callback */ + H5G_dense_btree2_name_encode, /* Record encoding callback */ + H5G_dense_btree2_name_decode, /* Record decoding callback */ + H5G_dense_btree2_name_debug /* Record debugging callback */ +}}; + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/*******************/ +/* Local Variables */ +/*******************/ + + +/*------------------------------------------------------------------------- + * Function: H5G_dense_fh_name_cmp + * + * Purpose: Compares the name of a link in a fractal heap to another + * name + * + * Return: SUCCEED/FAIL + * + * Programmer: Quincey Koziol + * koziol@hdfgroup.org + * Sep 11 2006 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5G_dense_fh_name_cmp(const void *obj, size_t UNUSED obj_len, void *_udata) +{ + H5G_fh_ud_cmp_t *udata = (H5G_fh_ud_cmp_t *)_udata; /* User data for 'op' callback */ + H5O_link_t *lnk; /* Pointer to link created from heap object */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5G_dense_fh_name_cmp) + + /* Decode link information */ + if(NULL == (lnk = H5O_decode(udata->f, udata->dxpl_id, obj, H5O_LINK_ID))) + HGOTO_ERROR(H5E_SYM, H5E_CANTDECODE, FAIL, "can't decode link") + + /* Compare the string values */ + udata->cmp = HDstrcmp(udata->name, lnk->name); + + /* Check for correct link & callback to make */ + if(udata->cmp == 0 && udata->found_op) { + if((udata->found_op)(lnk, udata->found_op_data) < 0) + HGOTO_ERROR(H5E_SYM, H5E_CANTOPERATE, FAIL, "link found callback failed") + } /* end if */ + + /* Release the space allocated for the link */ + H5O_free(H5O_LINK_ID, lnk); + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5G_dense_fh_name_cmp() */ + + +/*------------------------------------------------------------------------- + * Function: H5G_dense_btree2_name_store + * + * Purpose: Store user information into native record for v2 B-tree + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Quincey Koziol + * Saturday, September 9, 2006 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5G_dense_btree2_name_store(void *_nrecord, const void *_udata) +{ + const H5G_bt2_ud_ins_t *udata = (const H5G_bt2_ud_ins_t *)_udata; + H5G_dense_bt2_name_rec_t *nrecord = (H5G_dense_bt2_name_rec_t *)_nrecord; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5G_dense_btree2_name_store) + + /* Copy user information info native record */ + nrecord->hash = udata->common.name_hash; + HDmemcpy(nrecord->id, udata->id, (size_t)H5G_DENSE_FHEAP_ID_LEN); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* H5G_dense_btree2_name_store() */ + + +/*------------------------------------------------------------------------- + * Function: H5G_dense_btree2_name_retrieve + * + * Purpose: Retrieve native information from record for v2 B-tree + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Quincey Koziol + * Monday, September 11, 2006 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5G_dense_btree2_name_retrieve(void *udata, const void *nrecord) +{ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5G_dense_btree2_name_retrieve) + + *(H5G_dense_bt2_name_rec_t *)udata = *(const H5G_dense_bt2_name_rec_t *)nrecord; + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* H5G_dense_btree2_name_retrieve() */ + + +/*------------------------------------------------------------------------- + * Function: H5G_dense_btree2_name_compare + * + * Purpose: Compare two native information records, according to some key + * + * Return: <0 if rec1 < rec2 + * =0 if rec1 == rec2 + * >0 if rec1 > rec2 + * + * Programmer: Quincey Koziol + * Monday, September 11, 2006 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5G_dense_btree2_name_compare(const void *_bt2_udata, const void *_bt2_rec) +{ + const H5G_bt2_ud_common_t *bt2_udata = (const H5G_bt2_ud_common_t *)_bt2_udata; + const H5G_dense_bt2_name_rec_t *bt2_rec = (const H5G_dense_bt2_name_rec_t *)_bt2_rec; + herr_t ret_value; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5G_dense_btree2_name_compare) + + /* Sanity check */ + HDassert(bt2_udata); + HDassert(bt2_rec); + +#ifdef QAK +{ +unsigned u; + +HDfprintf(stderr, "%s: bt2_udata = {'%s', %x}\n", "H5G_dense_btree2_name_compare", bt2_udata->name, (unsigned)bt2_udata->name_hash); +HDfprintf(stderr, "%s: bt2_rec = {%x, ", "H5G_dense_btree2_name_compare", (unsigned)bt2_rec->hash); +for(u = 0; u < H5G_DENSE_FHEAP_ID_LEN; u++) + HDfprintf(stderr, "%02x%s", bt2_rec->id[u], (u < (H5G_DENSE_FHEAP_ID_LEN - 1) ? " " : "}\n")); +} +#endif /* QAK */ + /* Check hash value */ + if(bt2_udata->name_hash < bt2_rec->hash) + HGOTO_DONE(-1) + else if(bt2_udata->name_hash > bt2_rec->hash) + HGOTO_DONE(1) + else { + H5G_fh_ud_cmp_t fh_udata; /* User data for fractal heap 'op' callback */ + herr_t status; /* Status from fractal heap 'op' routine */ + + /* Sanity check */ + HDassert(bt2_udata->name_hash == bt2_rec->hash); + + /* Prepare user data for callback */ + /* down */ + fh_udata.f = bt2_udata->f; + fh_udata.dxpl_id = bt2_udata->dxpl_id; + fh_udata.name = bt2_udata->name; + fh_udata.found_op = bt2_udata->found_op; + fh_udata.found_op_data = bt2_udata->found_op_data; + + /* up */ + fh_udata.cmp = 0; + + /* Check if the user's link and the B-tree's link have the same name */ + status = H5HF_op(bt2_udata->fheap, bt2_udata->dxpl_id, bt2_rec->id, + H5G_dense_fh_name_cmp, &fh_udata); + HDassert(status >= 0); + + /* Callback will set comparison value */ + HGOTO_DONE(fh_udata.cmp) + } /* end else */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* H5G_dense_btree2_name_compare() */ + + +/*------------------------------------------------------------------------- + * Function: H5G_dense_btree2_name_encode + * + * Purpose: Encode native information into raw form for storing on disk + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Quincey Koziol + * Monday, September 11, 2006 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5G_dense_btree2_name_encode(const H5F_t UNUSED *f, uint8_t *raw, const void *_nrecord) +{ + const H5G_dense_bt2_name_rec_t *nrecord = (const H5G_dense_bt2_name_rec_t *)_nrecord; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5G_dense_btree2_name_encode) + + /* Encode the record's fields */ + UINT32ENCODE(raw, nrecord->hash) + HDmemcpy(raw, nrecord->id, (size_t)H5G_DENSE_FHEAP_ID_LEN); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* H5G_dense_btree2_name_encode() */ + + +/*------------------------------------------------------------------------- + * Function: H5G_dense_btree2_name_decode + * + * Purpose: Decode raw disk form of record into native form + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Quincey Koziol + * Monday, September 11, 2006 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5G_dense_btree2_name_decode(const H5F_t UNUSED *f, const uint8_t *raw, void *_nrecord) +{ + H5G_dense_bt2_name_rec_t *nrecord = (H5G_dense_bt2_name_rec_t *)_nrecord; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5G_dense_btree2_name_decode) + + /* Decode the record's fields */ + UINT32DECODE(raw, nrecord->hash) + HDmemcpy(nrecord->id, raw, (size_t)H5G_DENSE_FHEAP_ID_LEN); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* H5G_dense_btree2_name_decode() */ + + +/*------------------------------------------------------------------------- + * Function: H5G_dense_btree2_name_debug + * + * Purpose: Debug native form of record + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Quincey Koziol + * Monday, September 11, 2006 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5G_dense_btree2_name_debug(FILE *stream, const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, + int indent, int fwidth, const void *_nrecord, + const void UNUSED *_udata) +{ + const H5G_dense_bt2_name_rec_t *nrecord = (const H5G_dense_bt2_name_rec_t *)_nrecord; + unsigned u; /* Local index variable */ + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5G_dense_btree2_name_debug) + + HDfprintf(stream, "%*s%-*s {%lx, ", indent, "", fwidth, "Record:", + nrecord->hash); + for(u = 0; u < H5G_DENSE_FHEAP_ID_LEN; u++) + HDfprintf(stderr, "%02x%s", nrecord->id[u], (u < (H5G_DENSE_FHEAP_ID_LEN - 1) ? " " : "}\n")); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* H5G_dense_btree2_name_debug() */ + |