[svn-r14155] Copy user block when repack a file by defualt.

(need to add more options as stated in bug 173)
This commit is contained in:
Peter Cao 2007-09-25 17:55:21 -05:00
parent 68c01f91d9
commit 8f84b136fc

View File

@ -41,7 +41,7 @@ extern char *progname;
static void print_dataset_info(hid_t dcpl_id,char *objname,double per);
static int do_copy_objects(hid_t fidin,hid_t fidout,trav_table_t *travt,pack_opt_t *options);
static int copy_attr(hid_t loc_in,hid_t loc_out,pack_opt_t *options);
static int copy_user_block(char *infile, char *outfile, hsize_t size);
/*-------------------------------------------------------------------------
* Function: copy_objects
@ -57,6 +57,11 @@ static int copy_attr(hid_t loc_in,hid_t loc_out,pack_opt_t *options);
* Modification:
* Peter Cao, June 13, 2007
* Add "-L, --latest" and other options to pack a file with the latest file format
*
* Modification:
* Peter Cao, September 25, 2007
* Copy user block when repacking a file
*
*-------------------------------------------------------------------------
*/
@ -67,6 +72,7 @@ int copy_objects(const char* fnamein,
hid_t fidin;
hid_t fidout=-1;
trav_table_t *travt=NULL;
hsize_t ub_size=0; /* Size of user block */
hid_t fapl=H5P_DEFAULT; /* File access property list ID */
hid_t fcpl=H5P_DEFAULT; /* File creation property list ID */
@ -79,14 +85,28 @@ int copy_objects(const char* fnamein,
goto out;
}
if (options->latest) {
unsigned i=0, nindex=0, mesg_type_flags[5], min_mesg_sizes[5];
/* get user block size */
{
hid_t fcpl_in = H5Fget_create_plist(fidin);
H5Pget_userblock(fcpl_in, &ub_size);
if (fcpl_in != H5P_DEFAULT)
H5Pclose(fcpl_in);
}
if (options->latest || ub_size>=512) {
/* Create file creation property list */
if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0){
error_msg(progname, "fail to create a file creation property list\n");
goto out;
}
}
if (ub_size>=512) {
H5Pset_userblock(fcpl, ub_size);
}
if (options->latest) {
unsigned i=0, nindex=0, mesg_type_flags[5], min_mesg_sizes[5];
/* Adjust group creation parameters for root group */
/* (So that it is created in "dense storage" form) */
@ -188,6 +208,10 @@ int copy_objects(const char* fnamein,
H5Fclose(fidin);
H5Fclose(fidout);
if (ub_size >= 512)
copy_user_block(fnamein, fnameout, ub_size);
return 0;
/*-------------------------------------------------------------------------
@ -1093,5 +1117,64 @@ static void print_dataset_info(hid_t dcpl_id,
}
}
/*-------------------------------------------------------------------------
* Function: copy_user_block
*
* Purpose: copy user block from one file to another
*
* Return: 0, ok, -1 no
*
* Programmer: Peter Cao
*
* Date: October, 25, 2007
*
*-------------------------------------------------------------------------
*/
static int copy_user_block(char *infile, char *outfile, hsize_t size)
{
int infid=-1, outfid=-1, status=0;
off_t offset;
ssize_t how_much_left = (ssize_t)size;
ssize_t nchars;
char buf[512];
/* User block must be any power of 2 equal to 512 or greater (512, 1024, 2048, etc.) */
if (size<512)
return 0;
if ((infid = HDopen(infile,O_RDONLY,0)) < 0) {
status = -1;
goto done;
}
if ((outfid = HDopen(outfile,O_WRONLY,0644)) < 0) {
status = -1;
goto done;
}
offset = 0;
while (how_much_left > 0) {
HDlseek(infid,offset,SEEK_SET);
if (how_much_left > 512)
nchars = HDread(infid,buf,(unsigned)512);
else
nchars = HDread(infid,buf,(unsigned)how_much_left);
HDlseek(outfid, offset, SEEK_SET);
HDwrite(outfid, buf, (unsigned)nchars);
how_much_left -= nchars;
offset += nchars;
}
done:
if (infid > 0)
close(infid);
if (outfid > 0)
close (outfid);
return status;
}