[svn-r12953] h5repack code revision, avoid one unnecessary call to file open/close in the cheking of objects when there are none requested by the user

This commit is contained in:
Pedro Vicente Nunes 2006-11-20 16:31:06 -05:00
parent 335978f235
commit 51da322882
2 changed files with 351 additions and 336 deletions

View File

@ -38,125 +38,128 @@ extern char *progname;
int check_objects(const char* fname,
pack_opt_t *options)
{
hid_t fid;
unsigned int i;
trav_table_t *travt=NULL;
/*-------------------------------------------------------------------------
* open the file
*-------------------------------------------------------------------------
*/
if ((fid=h5tools_fopen(fname, NULL, NULL, 0))<0){
printf("<%s>: %s\n", fname, H5FOPENERROR );
return -1;
}
/*-------------------------------------------------------------------------
* get the list of objects in the file
*-------------------------------------------------------------------------
*/
/* init table */
trav_table_init(&travt);
/* get the list of objects in the file */
if (h5trav_gettable(fid,travt)<0)
goto out;
/*-------------------------------------------------------------------------
* compare with user supplied list
*-------------------------------------------------------------------------
*/
if (options->verbose)
{
printf("Opening file <%s>. Searching for objects to modify...\n",fname);
}
for ( i = 0; i < options->op_tbl->nelems; i++)
{
char* name=options->op_tbl->objs[i].path;
if (options->verbose)
printf(" <%s>",name);
/* the input object names are present in the file and are valid */
if (h5trav_getindext(name,travt)<0)
{
error_msg(progname, "%s Could not find <%s> in file <%s>. Exiting...\n",
(options->verbose?"\n":""),name,fname);
goto out;
}
if (options->verbose)
printf("...Found\n");
/* check for extra filter conditions */
switch (options->op_tbl->objs[i].filter->filtn)
{
/* chunk size must be smaller than pixels per block */
case H5Z_FILTER_SZIP:
{
int j;
int csize=1;
int ppb=options->op_tbl->objs[i].filter->cd_values[0];
hsize_t dims[H5S_MAX_RANK];
int rank;
hid_t did;
hid_t sid;
if (options->op_tbl->objs[i].chunk.rank>0)
{
rank=options->op_tbl->objs[i].chunk.rank;
for (j=0; j<rank; j++)
csize*=(int)options->op_tbl->objs[i].chunk.chunk_lengths[j];
hid_t fid;
unsigned int i;
trav_table_t *travt=NULL;
/* nothing to do */
if (options->op_tbl->nelems==0)
return 0;
/*-------------------------------------------------------------------------
* open the file
*-------------------------------------------------------------------------
*/
if ((fid=h5tools_fopen(fname, NULL, NULL, 0))<0){
printf("<%s>: %s\n", fname, H5FOPENERROR );
return -1;
}
else
/*-------------------------------------------------------------------------
* get the list of objects in the file
*-------------------------------------------------------------------------
*/
/* init table */
trav_table_init(&travt);
/* get the list of objects in the file */
if (h5trav_gettable(fid,travt)<0)
goto out;
/*-------------------------------------------------------------------------
* compare with user supplied list
*-------------------------------------------------------------------------
*/
if (options->verbose)
{
if ((did=H5Dopen(fid,travt->objs[i].name))<0)
goto out;
if ((sid=H5Dget_space(did))<0)
goto out;
if ( (rank=H5Sget_simple_extent_ndims(sid))<0)
goto out;
HDmemset(dims, 0, sizeof dims);
if ( H5Sget_simple_extent_dims(sid,dims,NULL)<0)
goto out;
for (j=0; j<rank; j++)
csize*=(int)dims[j];
if (H5Sclose(sid)<0)
goto out;
if (H5Dclose(did)<0)
goto out;
printf("Opening file <%s>. Searching for objects to modify...\n",fname);
}
if (csize < ppb )
for ( i = 0; i < options->op_tbl->nelems; i++)
{
printf(" <warning: SZIP settins, chunk size is smaller than pixels per block>\n");
goto out;
}
}
break;
}
} /* i */
/*-------------------------------------------------------------------------
* close
*-------------------------------------------------------------------------
*/
H5Fclose(fid);
trav_table_free(travt);
return 0;
char* name=options->op_tbl->objs[i].path;
if (options->verbose)
printf(" <%s>",name);
/* the input object names are present in the file and are valid */
if (h5trav_getindext(name,travt)<0)
{
error_msg(progname, "%s Could not find <%s> in file <%s>. Exiting...\n",
(options->verbose?"\n":""),name,fname);
goto out;
}
if (options->verbose)
printf("...Found\n");
/* check for extra filter conditions */
switch (options->op_tbl->objs[i].filter->filtn)
{
/* chunk size must be smaller than pixels per block */
case H5Z_FILTER_SZIP:
{
int j;
int csize=1;
int ppb=options->op_tbl->objs[i].filter->cd_values[0];
hsize_t dims[H5S_MAX_RANK];
int rank;
hid_t did;
hid_t sid;
if (options->op_tbl->objs[i].chunk.rank>0)
{
rank=options->op_tbl->objs[i].chunk.rank;
for (j=0; j<rank; j++)
csize*=(int)options->op_tbl->objs[i].chunk.chunk_lengths[j];
}
else
{
if ((did=H5Dopen(fid,travt->objs[i].name))<0)
goto out;
if ((sid=H5Dget_space(did))<0)
goto out;
if ( (rank=H5Sget_simple_extent_ndims(sid))<0)
goto out;
HDmemset(dims, 0, sizeof dims);
if ( H5Sget_simple_extent_dims(sid,dims,NULL)<0)
goto out;
for (j=0; j<rank; j++)
csize*=(int)dims[j];
if (H5Sclose(sid)<0)
goto out;
if (H5Dclose(did)<0)
goto out;
}
if (csize < ppb )
{
printf(" <warning: SZIP settins, chunk size is smaller than pixels per block>\n");
goto out;
}
}
break;
}
} /* i */
/*-------------------------------------------------------------------------
* close
*-------------------------------------------------------------------------
*/
H5Fclose(fid);
trav_table_free(travt);
return 0;
out:
H5Fclose(fid);
trav_table_free(travt);
return -1;
H5Fclose(fid);
trav_table_free(travt);
return -1;
}
@ -178,33 +181,33 @@ void print_objlist(const char *filename,
int nobjects,
trav_info_t *info )
{
int i;
printf("File <%s>: # of entries = %d\n", filename, nobjects );
for ( i = 0; i < nobjects; i++)
{
switch ( info[i].type )
{
case H5G_GROUP:
printf(" %-10s %s\n", "group", info[i].name );
break;
case H5G_DATASET:
printf(" %-10s %s\n", "dataset", info[i].name );
break;
case H5G_TYPE:
printf(" %-10s %s\n", "datatype", info[i].name );
break;
case H5G_LINK:
printf(" %-10s %s\n", "link", info[i].name );
break;
case H5G_UDLINK:
printf(" %-10s %s\n", "User defined link", info[i].name );
break;
default:
printf(" %-10s %s\n", "User defined object", info[i].name );
break;
}
}
int i;
printf("File <%s>: # of entries = %d\n", filename, nobjects );
for ( i = 0; i < nobjects; i++)
{
switch ( info[i].type )
{
case H5G_GROUP:
printf(" %-10s %s\n", "group", info[i].name );
break;
case H5G_DATASET:
printf(" %-10s %s\n", "dataset", info[i].name );
break;
case H5G_TYPE:
printf(" %-10s %s\n", "datatype", info[i].name );
break;
case H5G_LINK:
printf(" %-10s %s\n", "link", info[i].name );
break;
case H5G_UDLINK:
printf(" %-10s %s\n", "User defined link", info[i].name );
break;
default:
printf(" %-10s %s\n", "User defined object", info[i].name );
break;
}
}
}

View File

@ -16,22 +16,31 @@
#include "h5trav.h"
#include "H5private.h"
/* functions for traversal */
/*-------------------------------------------------------------------------
* local functions
*-------------------------------------------------------------------------
*/
static int traverse( hid_t loc_id,
const char *group_name,
trav_table_t *table,
trav_info_t *info,
int *idx,
int print);
const char *group_name,
trav_table_t *table,
trav_info_t *info,
int *idx,
int print);
static hssize_t get_nnames( hid_t loc_id,
const char *group_name );
const char *group_name );
herr_t get_name_type( hid_t loc_id,
const char *group_name,
int idx,
char **name,
H5G_obj_t *type );
static herr_t get_name_type( hid_t loc_id,
const char *group_name,
int idx,
char **name,
H5G_obj_t *type );
/*-------------------------------------------------------------------------
* "h5trav info" public functions. used in h5diff
*-------------------------------------------------------------------------
*/
/*-------------------------------------------------------------------------
* Function: h5trav_getinfo
@ -67,37 +76,8 @@ int h5trav_getinfo(hid_t file_id,
trav_table_free( table );
return nnames;
}
/*-------------------------------------------------------------------------
* Function: h5trav_gettable
*
* Purpose: get the trav_table_t struct
*
* Return: 0, -1 on error
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: December 17, 2003
*
*-------------------------------------------------------------------------
*/
int h5trav_gettable(hid_t fid, trav_table_t *travt)
{
int nnames=0;
/* iterate starting on the root group */
if (( nnames = traverse(fid,"/",travt,NULL,&nnames,0))<0)
return -1;
return 0;
}
/*-------------------------------------------------------------------------
* Function: h5trav_getindex
*
@ -133,8 +113,6 @@ int h5trav_getindex( const char *obj, int nobjs, trav_info_t *info )
return -1;
}
/*-------------------------------------------------------------------------
* Function: h5trav_freeinfo
*
@ -157,6 +135,182 @@ void h5trav_freeinfo( trav_info_t *info, int nobjs )
}
}
/*-------------------------------------------------------------------------
* Function: h5trav_printinfo
*
* Purpose: print list of names in file
*
* Return: void
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: May 9, 2003
*
*-------------------------------------------------------------------------
*/
void h5trav_printinfo(int nobjs, trav_info_t *travi)
{
int i;
for ( i = 0; i < nobjs; i++)
{
switch ( travi[i].type )
{
case H5G_GROUP:
printf(" %-10s %s\n", "group", travi[i].name );
break;
case H5G_DATASET:
printf(" %-10s %s\n", "dataset", travi[i].name );
break;
case H5G_TYPE:
printf(" %-10s %s\n", "datatype", travi[i].name );
break;
case H5G_LINK:
printf(" %-10s %s\n", "link", travi[i].name );
break;
case H5G_UDLINK:
printf(" %-10s %s\n", "User defined link", travi[i].name );
break;
default:
printf(" %-10s %s\n", "User defined object", travi[i].name );
break;
}
}
}
/*-------------------------------------------------------------------------
* "h5trav table" public functions. used in h5repack
*-------------------------------------------------------------------------
*/
/*-------------------------------------------------------------------------
* Function: h5trav_getindext
*
* Purpose: get index of NAME in list
*
* Return: index, -1 if not found
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: December 18, 2003
*
*-------------------------------------------------------------------------
*/
int h5trav_getindext(const char *name, trav_table_t *table)
{
char *pdest;
int result;
unsigned int i, j;
for ( i = 0; i < table->nobjs; i++)
{
if ( strcmp(name,table->objs[i].name)==0 )
return i;
pdest = strstr( table->objs[i].name, name );
result = (int)(pdest - table->objs[i].name);
/* found at position 1, meaning without '/' */
if( pdest != NULL && result==1 && strlen(table->objs[i].name)-1==strlen(name))
return i;
/* search also in the list of links */
if (table->objs[i].nlinks)
{
for ( j=0; j<table->objs[i].nlinks; j++)
{
if ( strcmp(name,table->objs[i].links[j].new_name)==0 )
return i;
pdest = strstr( table->objs[i].links[j].new_name, name );
result = (int)(pdest - table->objs[i].links[j].new_name);
/* found at position 1, meaning without '/' */
if( pdest != NULL && result==1 )
return i;
}
}
}
return -1;
}
/*-------------------------------------------------------------------------
* Function: h5trav_gettable
*
* Purpose: get the trav_table_t struct
*
* Return: 0, -1 on error
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: December 17, 2003
*
*-------------------------------------------------------------------------
*/
int h5trav_gettable(hid_t fid, trav_table_t *travt)
{
int nnames=0;
/* iterate starting on the root group */
if (( nnames = traverse(fid,"/",travt,NULL,&nnames,0))<0)
return -1;
return 0;
}
/*-------------------------------------------------------------------------
* Function: h5trav_printtable
*
* Purpose: print list of objects in file
*
* Return: void
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: May 9, 2003
*
*-------------------------------------------------------------------------
*/
void h5trav_printtable(trav_table_t *table)
{
unsigned int i, j;
for ( i = 0; i < table->nobjs; i++)
{
switch ( table->objs[i].type )
{
case H5G_GROUP:
printf(" %-10s %s\n", "group", table->objs[i].name );
break;
case H5G_DATASET:
printf(" %-10s %s\n", "dataset", table->objs[i].name );
break;
case H5G_TYPE:
printf(" %-10s %s\n", "datatype", table->objs[i].name );
break;
case H5G_LINK:
printf(" %-10s %s\n", "link", table->objs[i].name );
break;
default:
printf(" %-10s %s\n", "User defined object", table->objs[i].name );
break;
}
if (table->objs[i].nlinks)
{
for ( j=0; j<table->objs[i].nlinks; j++)
{
printf(" %-10s %s\n", " hardlink", table->objs[i].links[j].new_name );
}
}
}
}
/*-------------------------------------------------------------------------
* Function: get_nnames
@ -253,11 +407,11 @@ static herr_t opget_info( hid_t loc_id, const char *name, void *op_data)
*-------------------------------------------------------------------------
*/
herr_t get_name_type( hid_t loc_id,
const char *group_name,
int idx,
char **name,
H5G_obj_t *type )
static herr_t get_name_type( hid_t loc_id,
const char *group_name,
int idx,
char **name,
H5G_obj_t *type )
{
trav_info_t info;
@ -286,11 +440,11 @@ herr_t get_name_type( hid_t loc_id,
*/
static int traverse( hid_t loc_id,
const char *group_name,
trav_table_t *table,
trav_info_t *info,
int *idx,
int print)
const char *group_name,
trav_table_t *table,
trav_info_t *info,
int *idx,
int print)
{
haddr_t objno; /* Compact form of object's location */
char *name=NULL;
@ -566,151 +720,9 @@ static int traverse( hid_t loc_id,
/*-------------------------------------------------------------------------
* Function: h5trav_printinfo
*
* Purpose: print list of names in file
*
* Return: void
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: May 9, 2003
*
*-------------------------------------------------------------------------
*/
void h5trav_printinfo(int nobjs, trav_info_t *travi)
{
int i;
for ( i = 0; i < nobjs; i++)
{
switch ( travi[i].type )
{
case H5G_GROUP:
printf(" %-10s %s\n", "group", travi[i].name );
break;
case H5G_DATASET:
printf(" %-10s %s\n", "dataset", travi[i].name );
break;
case H5G_TYPE:
printf(" %-10s %s\n", "datatype", travi[i].name );
break;
case H5G_LINK:
printf(" %-10s %s\n", "link", travi[i].name );
break;
case H5G_UDLINK:
printf(" %-10s %s\n", "User defined link", travi[i].name );
break;
default:
printf(" %-10s %s\n", "User defined object", travi[i].name );
break;
}
}
}
/*-------------------------------------------------------------------------
* Function: h5trav_printtable
*
* Purpose: print list of objects in file
*
* Return: void
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: May 9, 2003
*
*-------------------------------------------------------------------------
*/
void h5trav_printtable(trav_table_t *table)
{
unsigned int i, j;
for ( i = 0; i < table->nobjs; i++)
{
switch ( table->objs[i].type )
{
case H5G_GROUP:
printf(" %-10s %s\n", "group", table->objs[i].name );
break;
case H5G_DATASET:
printf(" %-10s %s\n", "dataset", table->objs[i].name );
break;
case H5G_TYPE:
printf(" %-10s %s\n", "datatype", table->objs[i].name );
break;
case H5G_LINK:
printf(" %-10s %s\n", "link", table->objs[i].name );
break;
default:
printf(" %-10s %s\n", "User defined object", table->objs[i].name );
break;
}
if (table->objs[i].nlinks)
{
for ( j=0; j<table->objs[i].nlinks; j++)
{
printf(" %-10s %s\n", " hardlink", table->objs[i].links[j].new_name );
}
}
}
}
/*-------------------------------------------------------------------------
* Function: h5trav_getindext
*
* Purpose: get index of NAME in list
*
* Return: index, -1 if not found
*
* Programmer: Pedro Vicente, pvn@ncsa.uiuc.edu
*
* Date: December 18, 2003
*
*-------------------------------------------------------------------------
*/
int h5trav_getindext(const char *name, trav_table_t *table)
{
char *pdest;
int result;
unsigned int i, j;
for ( i = 0; i < table->nobjs; i++)
{
if ( strcmp(name,table->objs[i].name)==0 )
return i;
pdest = strstr( table->objs[i].name, name );
result = (int)(pdest - table->objs[i].name);
/* found at position 1, meaning without '/' */
if( pdest != NULL && result==1 && strlen(table->objs[i].name)-1==strlen(name))
return i;
/* search also in the list of links */
if (table->objs[i].nlinks)
{
for ( j=0; j<table->objs[i].nlinks; j++)
{
if ( strcmp(name,table->objs[i].links[j].new_name)==0 )
return i;
pdest = strstr( table->objs[i].links[j].new_name, name );
result = (int)(pdest - table->objs[i].links[j].new_name);
/* found at position 1, meaning without '/' */
if( pdest != NULL && result==1 )
return i;
}
}
}
return -1;
}