Made the handling of listing and unlisting opened columns and indexers

functions in the obidms files.
This commit is contained in:
Celine Mercier
2016-04-15 10:49:12 +02:00
parent 73d64e5aff
commit 71492ad229
8 changed files with 323 additions and 215 deletions

View File

@ -745,8 +745,9 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms,
close(column_file_descriptor);
// Add in the list of opened columns
*(((dms->opened_columns)->columns)+((dms->opened_columns)->nb_opened_columns)) = new_column;
((dms->opened_columns)->nb_opened_columns)++;
obi_dms_list_column(dms, new_column);
// Set counter to 1 // TODO Discuss counters
new_column->counter = 1;
return new_column;
@ -762,7 +763,6 @@ OBIDMS_column_p obi_open_column(OBIDMS_p dms,
char* column_file_name;
int column_file_descriptor;
size_t header_size;
size_t i;
column = NULL;
@ -786,14 +786,12 @@ OBIDMS_column_p obi_open_column(OBIDMS_p dms,
}
// Check if the column is already in the list of opened columns
for (i=0; i < ((dms->opened_columns)->nb_opened_columns); i++)
column = obi_dms_get_column_from_list(dms, column_name, version_number);
// If it's found, increment its counter and return it
if (column != NULL)
{
if (!strcmp(((*(((dms->opened_columns)->columns)+i))->header)->name, column_name)
&& (((*(((dms->opened_columns)->columns)+i))->header)->version == version_number))
{ // Found the column already opened, increase its counter and return the column
((*(((dms->opened_columns)->columns)+i))->counter)++;
return *(((dms->opened_columns)->columns)+i);
}
(column->counter)++;
return column;
}
// Get the column file name
@ -892,9 +890,10 @@ OBIDMS_column_p obi_open_column(OBIDMS_p dms,
close(column_file_descriptor);
// Add in the list of opened columns and set column counter to 1
*(((dms->opened_columns)->columns)+((dms->opened_columns)->nb_opened_columns)) = column;
((dms->opened_columns)->nb_opened_columns)++;
// Add in the list of opened columns
obi_dms_list_column(dms, column);
// Set counter to 1
column->counter = 1;
return column;
@ -985,57 +984,35 @@ OBIDMS_column_p obi_clone_column(OBIDMS_p dms,
int obi_close_column(OBIDMS_column_p column)
{
size_t i;
bool close_dir;
Opened_columns_list_p columns_list;
bool close_dir;
int ret_val = 0;
// Truncate the column to the number of lines used if it's not read-only
if (column->writable)
{
if (obi_truncate_column(column) < 0)
return -1;
}
columns_list = (column->dms)->opened_columns;
ret_val = obi_truncate_column(column);
(column->counter)--;
if (column->counter == 0)
{
// Delete from the list of opened columns
for (i=0; i < (columns_list)->nb_opened_columns; i++)
{
if (!strcmp(((*((columns_list->columns)+i))->header)->name, (column->header)->name)
&& (((*((columns_list->columns)+i))->header)->version == (column->header)->version))
{ // Found the column. Rearrange list
(columns_list->nb_opened_columns)--;
(columns_list->columns)[i] = (columns_list->columns)[columns_list->nb_opened_columns];
}
}
if (obi_dms_unlist_column(column->dms, column) < 0)
ret_val = -1;
// Close column directory if it was the last column opened from that directory
close_dir = 1;
for (i=0; i < (columns_list->nb_opened_columns); i++)
{
if (!strcmp(((*((columns_list->columns)+i))->header)->name, (column->header)->name))
{ // Not the last column from that directory
close_dir = 0;
}
}
close_dir = obi_dms_is_column_name_in_list(column->dms, (column->header)->name);
// If the data type is OBI_STR or OBI_SEQ, the associated indexer is closed
if (((column->header)->returned_data_type == OBI_STR) || ((column->header)->returned_data_type == OBI_SEQ))
{
if (obi_close_indexer(column->indexer) < 0)
return -1;
}
ret_val = -1;
// Munmap data
if (munmap(column->data, (column->header)->data_size) < 0)
{
obi_set_errno(OBICOL_UNKNOWN_ERROR);
obidebug(1, "\nError munmapping column data");
return -1;
ret_val = -1;
}
// Munmap header
@ -1043,16 +1020,18 @@ int obi_close_column(OBIDMS_column_p column)
{
obi_set_errno(OBICOL_UNKNOWN_ERROR);
obidebug(1, "\nError munmapping a column header");
return -1;
ret_val = -1;
}
// Close column directory
if (close_dir)
obi_close_column_directory(column->column_directory);
if (obi_close_column_directory(column->column_directory) < 0)
ret_val = -1;
free(column);
}
return 0;
return ret_val;
}