2
0
mirror of https://github.com/HDFGroup/hdf5.git synced 2025-03-19 16:50:46 +08:00

[svn-r16133] H5TBdelete_record was not handlong correctly records at the end of the table

added a ckeck that avoids to read these records if they are not needed (for pushing down the table)

tested: windows, linux
This commit is contained in:
Pedro Vicente Nunes 2008-11-25 14:42:49 -05:00
parent 7653aa4a6a
commit bd3e89868a
2 changed files with 90 additions and 56 deletions

@ -1294,20 +1294,19 @@ herr_t H5TBdelete_record( hid_t loc_id,
hsize_t ntotal_records;
hsize_t read_start;
hsize_t read_nrecords;
hid_t did;
hid_t tid;
hid_t did=-1;
hid_t tid=-1;
hid_t sid=-1;
hid_t m_sid=-1;
hsize_t count[1];
hsize_t offset[1];
hid_t sid;
hid_t m_sid;
hsize_t mem_size[1];
unsigned char *tmp_buf;
unsigned char *tmp_buf=NULL;
size_t src_size;
size_t *src_offset;
size_t *src_sizes;
hsize_t dims[1];
/*-------------------------------------------------------------------------
* first we get information about type size and offsets on disk
*-------------------------------------------------------------------------
@ -1322,10 +1321,16 @@ herr_t H5TBdelete_record( hid_t loc_id,
if (src_offset == NULL )
return -1;
if (src_sizes == NULL )
return -1;
/* get field info */
if (H5TBget_field_info( loc_id, dset_name, NULL, src_sizes, src_offset, &src_size ) < 0)
return -1;
/* open the dataset. */
if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
return -1;
/*-------------------------------------------------------------------------
* read the records after the deleted one(s)
@ -1334,53 +1339,54 @@ herr_t H5TBdelete_record( hid_t loc_id,
read_start = start + nrecords;
read_nrecords = ntotal_records - read_start;
tmp_buf = (unsigned char *)calloc((size_t) read_nrecords, src_size );
if (tmp_buf == NULL )
return -1;
/* read the records after the deleted one(s) */
if (H5TBread_records( loc_id, dset_name, read_start, read_nrecords, src_size, src_offset, src_sizes, tmp_buf ) < 0)
return -1;
/*-------------------------------------------------------------------------
* write the records in another position
*-------------------------------------------------------------------------
*/
/* open the dataset. */
if ((did = H5Dopen2(loc_id, dset_name, H5P_DEFAULT)) < 0)
return -1;
/* get the datatype */
if ((tid = H5Dget_type( did )) < 0)
goto out;
/* get the dataspace handle */
if ((sid = H5Dget_space( did )) < 0)
goto out;
/* define a hyperslab in the dataset of the size of the records */
offset[0] = start;
count[0] = read_nrecords;
if (H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
goto out;
/* create a memory dataspace handle */
mem_size[0] = count[0];
if ((m_sid = H5Screate_simple( 1, mem_size, NULL )) < 0)
goto out;
if (H5Dwrite( did, tid, m_sid, sid, H5P_DEFAULT, tmp_buf ) < 0)
goto out;
/* close */
if (H5Sclose( m_sid ) < 0)
goto out;
if (H5Sclose( sid ) < 0)
goto out;
if (H5Tclose( tid ) < 0)
goto out;
if ( read_nrecords )
{
tmp_buf = (unsigned char *)calloc((size_t) read_nrecords, src_size );
if (tmp_buf == NULL )
return -1;
/* read the records after the deleted one(s) */
if (H5TBread_records( loc_id, dset_name, read_start, read_nrecords, src_size, src_offset, src_sizes, tmp_buf ) < 0)
return -1;
/*-------------------------------------------------------------------------
* write the records in another position
*-------------------------------------------------------------------------
*/
/* get the datatype */
if ((tid = H5Dget_type( did )) < 0)
goto out;
/* get the dataspace handle */
if ((sid = H5Dget_space( did )) < 0)
goto out;
/* define a hyperslab in the dataset of the size of the records */
offset[0] = start;
count[0] = read_nrecords;
if (H5Sselect_hyperslab( sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
goto out;
/* create a memory dataspace handle */
mem_size[0] = count[0];
if ((m_sid = H5Screate_simple( 1, mem_size, NULL )) < 0)
goto out;
if (H5Dwrite( did, tid, m_sid, sid, H5P_DEFAULT, tmp_buf ) < 0)
goto out;
/* close */
if (H5Sclose( m_sid ) < 0)
goto out;
if (H5Sclose( sid ) < 0)
goto out;
if (H5Tclose( tid ) < 0)
goto out;
} /* read_nrecords */
/*-------------------------------------------------------------------------
@ -1395,16 +1401,28 @@ herr_t H5TBdelete_record( hid_t loc_id,
if (H5Dclose( did ) < 0)
return -1;
free( tmp_buf );
if (tmp_buf !=NULL)
free( tmp_buf );
free( src_offset );
free( src_sizes );
return 0;
/* error zone */
out:
H5Dclose( did );
if (tmp_buf !=NULL )
free( tmp_buf );
H5E_BEGIN_TRY
{
H5Dclose(did);
H5Tclose(tid);
H5Sclose(sid);
} H5E_END_TRY;
return -1;
}
/*-------------------------------------------------------------------------

@ -818,6 +818,22 @@ int test_table(hid_t fid, int write)
goto out;
}
}
/*-------------------------------------------------------------------------
* Delete records, start at 0, delete 1
* pos = 0
* data= empty
*-------------------------------------------------------------------------
*/
dstart=0; drecords=1;
if (H5TBdelete_record(fid,"table3",dstart,drecords)<0)
goto out;
if (H5TBget_table_info(fid,"table3",&rfields,&rrecords)<0)
goto out;
if (rrecords)
goto out;
PASSED();
}