The data size in bytes is now stored in the header of a column.
This commit is contained in:
@ -547,11 +547,11 @@ size_t obi_get_platform_header_size()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
OBIDMS_column_p obi_create_column(OBIDMS_p dms,
|
OBIDMS_column_p obi_create_column(OBIDMS_p dms,
|
||||||
const char* column_name,
|
const char* column_name,
|
||||||
OBIType_t data_type,
|
OBIType_t data_type,
|
||||||
index_t nb_lines,
|
index_t nb_lines,
|
||||||
index_t nb_elements_per_line,
|
index_t nb_elements_per_line,
|
||||||
const char* elements_names,
|
const char* elements_names,
|
||||||
const char* array_name)
|
const char* array_name)
|
||||||
{
|
{
|
||||||
@ -733,6 +733,7 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms,
|
|||||||
header = new_column->header;
|
header = new_column->header;
|
||||||
header->little_endian = obi_is_little_endian();
|
header->little_endian = obi_is_little_endian();
|
||||||
header->header_size = header_size;
|
header->header_size = header_size;
|
||||||
|
header->data_size = data_size;
|
||||||
header->line_count = nb_lines;
|
header->line_count = nb_lines;
|
||||||
header->lines_used = 0;
|
header->lines_used = 0;
|
||||||
header->nb_elements_per_line = nb_elements_per_line;
|
header->nb_elements_per_line = nb_elements_per_line;
|
||||||
@ -781,7 +782,6 @@ OBIDMS_column_p obi_open_column(OBIDMS_p dms,
|
|||||||
char* column_file_name;
|
char* column_file_name;
|
||||||
int column_file_descriptor;
|
int column_file_descriptor;
|
||||||
size_t header_size;
|
size_t header_size;
|
||||||
size_t data_size;
|
|
||||||
|
|
||||||
column = NULL;
|
column = NULL;
|
||||||
|
|
||||||
@ -856,12 +856,9 @@ OBIDMS_column_p obi_open_column(OBIDMS_p dms,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Compute data size from the informations in the header
|
|
||||||
data_size = obi_array_sizeof((column->header)->data_type, (column->header)->line_count, (column->header)->nb_elements_per_line);
|
|
||||||
|
|
||||||
// Map the data
|
// Map the data
|
||||||
column->data = mmap(NULL,
|
column->data = mmap(NULL,
|
||||||
data_size,
|
(column->header)->data_size,
|
||||||
PROT_READ,
|
PROT_READ,
|
||||||
MAP_PRIVATE,
|
MAP_PRIVATE,
|
||||||
column_file_descriptor,
|
column_file_descriptor,
|
||||||
@ -901,16 +898,15 @@ OBIDMS_column_p obi_open_column(OBIDMS_p dms,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
OBIDMS_column_p obi_clone_column(OBIDMS_p dms,
|
OBIDMS_column_p obi_clone_column(OBIDMS_p dms,
|
||||||
const char* column_name,
|
const char* column_name,
|
||||||
obiversion_t version_number,
|
obiversion_t version_number,
|
||||||
bool clone_data)
|
bool clone_data)
|
||||||
{
|
{
|
||||||
OBIDMS_column_p column_to_clone;
|
OBIDMS_column_p column_to_clone;
|
||||||
OBIDMS_column_p new_column;
|
OBIDMS_column_p new_column;
|
||||||
index_t nb_lines;
|
index_t nb_lines;
|
||||||
index_t nb_elements_per_line;
|
index_t nb_elements_per_line;
|
||||||
size_t data_size;
|
|
||||||
OBIType_t data_type;
|
OBIType_t data_type;
|
||||||
|
|
||||||
column_to_clone = obi_open_column(dms, column_name, version_number);
|
column_to_clone = obi_open_column(dms, column_name, version_number);
|
||||||
@ -953,8 +949,7 @@ OBIDMS_column_p obi_clone_column(OBIDMS_p dms,
|
|||||||
|
|
||||||
if (clone_data)
|
if (clone_data)
|
||||||
{
|
{
|
||||||
data_size = obi_array_sizeof(data_type, nb_lines, nb_elements_per_line);
|
memcpy(new_column->data, column_to_clone->data, (column_to_clone->header)->data_size);
|
||||||
memcpy(new_column->data, column_to_clone->data, data_size);
|
|
||||||
(new_column->header)->lines_used = (column_to_clone->header)->lines_used;
|
(new_column->header)->lines_used = (column_to_clone->header)->lines_used;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -971,11 +966,8 @@ OBIDMS_column_p obi_clone_column(OBIDMS_p dms,
|
|||||||
|
|
||||||
int obi_close_column(OBIDMS_column_p column)
|
int obi_close_column(OBIDMS_column_p column)
|
||||||
{
|
{
|
||||||
size_t data_size;
|
|
||||||
|
|
||||||
// Munmap data
|
// Munmap data
|
||||||
data_size = obi_array_sizeof((column->header)->data_type, (column->header)->line_count, (column->header)->nb_elements_per_line);
|
if (munmap(column->data, (column->header)->data_size) < 0)
|
||||||
if (munmap(column->data, data_size) < 0)
|
|
||||||
{
|
{
|
||||||
obi_set_errno(OBICOL_UNKNOWN_ERROR);
|
obi_set_errno(OBICOL_UNKNOWN_ERROR);
|
||||||
obidebug(1, "\nError munmapping column data");
|
obidebug(1, "\nError munmapping column data");
|
||||||
@ -1035,8 +1027,7 @@ int obi_truncate_column_to_lines_used(OBIDMS_column_p column) // TODO is it nece
|
|||||||
free(column_file_name);
|
free(column_file_name);
|
||||||
|
|
||||||
// Unmap the data before truncating the file
|
// Unmap the data before truncating the file
|
||||||
data_size = obi_array_sizeof((column->header)->data_type, (column->header)->line_count, (column->header)->nb_elements_per_line);
|
if (munmap(column->data, (column->header)->data_size) < 0)
|
||||||
if (munmap(column->data, data_size) < 0)
|
|
||||||
{
|
{
|
||||||
obi_set_errno(OBICOL_UNKNOWN_ERROR);
|
obi_set_errno(OBICOL_UNKNOWN_ERROR);
|
||||||
obidebug(1, "\nError munmapping the data of a column before truncating");
|
obidebug(1, "\nError munmapping the data of a column before truncating");
|
||||||
@ -1072,8 +1063,9 @@ int obi_truncate_column_to_lines_used(OBIDMS_column_p column) // TODO is it nece
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set line_count to the new line count
|
// Set new line_count and new data size
|
||||||
(column->header)->line_count = new_line_count;
|
(column->header)->line_count = new_line_count;
|
||||||
|
(column->header)->data_size = data_size;
|
||||||
|
|
||||||
close(column_file_descriptor);
|
close(column_file_descriptor);
|
||||||
|
|
||||||
@ -1123,7 +1115,7 @@ int obi_enlarge_column(OBIDMS_column_p column)
|
|||||||
close(column_file_descriptor);
|
close(column_file_descriptor);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
old_data_size = obi_array_sizeof((column->header)->data_type, old_line_count, (column->header)->nb_elements_per_line);
|
old_data_size = (column->header)->data_size;
|
||||||
new_data_size = old_data_size * COLUMN_GROWTH_FACTOR;
|
new_data_size = old_data_size * COLUMN_GROWTH_FACTOR;
|
||||||
header_size = (column->header)->header_size;
|
header_size = (column->header)->header_size;
|
||||||
file_size = header_size + new_data_size;
|
file_size = header_size + new_data_size;
|
||||||
@ -1185,8 +1177,9 @@ int obi_enlarge_column(OBIDMS_column_p column)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set new line count
|
// Set new line count and new data size
|
||||||
(column->header)->line_count = new_line_count;
|
(column->header)->line_count = new_line_count;
|
||||||
|
(column->header)->data_size = new_data_size;
|
||||||
|
|
||||||
// Initialize new data lines to NA
|
// Initialize new data lines to NA
|
||||||
obi_ini_to_NA_values(column, old_line_count, new_line_count - old_line_count);
|
obi_ini_to_NA_values(column, old_line_count, new_line_count - old_line_count);
|
||||||
|
@ -55,6 +55,8 @@ typedef struct OBIDMS_column_header {
|
|||||||
*/
|
*/
|
||||||
size_t header_size; /**< Size of the header in bytes.
|
size_t header_size; /**< Size of the header in bytes.
|
||||||
*/
|
*/
|
||||||
|
size_t data_size; /**< Size of the data in bytes.
|
||||||
|
*/
|
||||||
index_t line_count; /**< Number of lines of data allocated.
|
index_t line_count; /**< Number of lines of data allocated.
|
||||||
*/
|
*/
|
||||||
index_t lines_used; /**< Number of lines of data used.
|
index_t lines_used; /**< Number of lines of data used.
|
||||||
|
Reference in New Issue
Block a user