Views: Added argument to not automatically create default columns in

typed views, a function to delete a view and fixed view history bug
This commit is contained in:
Celine Mercier
2018-10-31 14:38:05 +01:00
parent 92c0fbc9bf
commit 320561a582
6 changed files with 171 additions and 15 deletions

View File

@ -97,6 +97,21 @@ static char* build_unfinished_obiview_file_name(const char* view_name);
static bool view_exists(OBIDMS_p dms, const char* view_name);
/**
* Internal function checking if a view is finished.
*
* @param dms The DMS.
* @param view_name The name of the view.
*
* @returns A boolean value indicating whether the view is finished or not.
* @retval -1 if the view does not exist or if an error occurred.
*
* @since October 2018
* @author Celine Mercier (celine.mercier@metabarcoding.org)
*/
static bool view_is_finished(OBIDMS_p dms, const char* view_name);
/**
* Internal function calculating the initial size of the file where the informations about an obiview are stored.
*
@ -586,6 +601,55 @@ static bool view_exists(OBIDMS_p dms, const char* view_name)
}
static bool view_is_finished(OBIDMS_p dms, const char* view_name)
{
struct dirent* dp;
char* file_name;
// Check finished views
// Create file name
file_name = build_obiview_file_name(view_name);
if (file_name == NULL)
return -1;
rewinddir(dms->view_directory);
while ((dp = readdir(dms->view_directory)) != NULL)
{
if ((dp->d_name)[0] == '.')
continue;
if (strcmp(dp->d_name, file_name) == 0)
{
free(file_name);
return true;
}
}
free(file_name);
// Check unfinished views
// Create file name
file_name = build_unfinished_obiview_file_name(view_name);
if (file_name == NULL)
return -1;
rewinddir(dms->view_directory);
while ((dp = readdir(dms->view_directory)) != NULL)
{
if ((dp->d_name)[0] == '.')
continue;
if (strcmp(dp->d_name, file_name) == 0)
{
free(file_name);
return false;
}
}
free(file_name);
return -1;
}
static size_t get_platform_view_file_size()
{
size_t obiview_size;
@ -746,7 +810,6 @@ static int update_column_refs(Obiview_p view)
obidebug(1, "\nError getting a column from the linked list of column pointers of a view");
return -1;
}
strcpy(((((view->infos)->column_references)[i]).column_refs).column_name, (column->header)->name);
((((view->infos)->column_references)[i]).column_refs).version = (column->header)->version;
}
@ -1757,7 +1820,7 @@ Obiview_p obi_new_view_cloned_from_name(OBIDMS_p dms, const char* view_name, con
}
Obiview_p obi_new_view_nuc_seqs(OBIDMS_p dms, const char* view_name, Obiview_p view_to_clone, index_t* line_selection, const char* comments, bool quality_column)
Obiview_p obi_new_view_nuc_seqs(OBIDMS_p dms, const char* view_name, Obiview_p view_to_clone, index_t* line_selection, const char* comments, bool quality_column, bool create_default_columns)
{
Obiview_p view;
OBIDMS_column_p associated_nuc_column;
@ -1784,7 +1847,7 @@ Obiview_p obi_new_view_nuc_seqs(OBIDMS_p dms, const char* view_name, Obiview_p v
strcpy((view->infos)->view_type, VIEW_TYPE_NUC_SEQS);
if (view_to_clone == NULL)
if ((view_to_clone == NULL) && create_default_columns)
{
// Adding sequence column
if (obi_view_add_column(view, NUC_SEQUENCE_COLUMN, -1, NULL, OBI_SEQ, 0, 1, NULL, false, false, false, NULL, NULL, -1, "Nucleotide sequences", true) < 0) // discuss using same indexer "NUC_SEQ_INDEXER"
@ -1856,7 +1919,7 @@ Obiview_p obi_new_view_nuc_seqs_cloned_from_name(OBIDMS_p dms, const char* view_
view_to_clone = obi_open_view(dms, view_to_clone_name);
if (view_to_clone == NULL)
return NULL;
view = obi_new_view_nuc_seqs(dms, view_name, view_to_clone, line_selection, comments, false);
view = obi_new_view_nuc_seqs(dms, view_name, view_to_clone, line_selection, comments, false, false);
close_view(view_to_clone);
@ -1874,7 +1937,7 @@ Obiview_p obi_clone_view(OBIDMS_p dms, Obiview_p view_to_clone, const char* view
}
if (strcmp((view_to_clone->infos)->view_type, VIEW_TYPE_NUC_SEQS) == 0)
return obi_new_view_nuc_seqs(dms, view_name, view_to_clone, line_selection, comments, false);
return obi_new_view_nuc_seqs(dms, view_name, view_to_clone, line_selection, comments, false, false);
else // Non-typed view
return obi_new_view(dms, view_name, view_to_clone, line_selection, comments);
}
@ -2002,7 +2065,7 @@ int obi_view_unmap_file(OBIDMS_p dms, Obiview_infos_p view_infos)
if (obiview_file_descriptor < 0)
{
obi_set_errno(OBIVIEW_ERROR);
obidebug(1, "\nError opening an obiview file");
obidebug(1, "\nError opening an obiview file (%s) >%s<", file_name, dms->dms_name);
free(file_name);
return -1;
}
@ -2230,7 +2293,7 @@ int obi_view_add_column(Obiview_p view,
column = obi_open_column(view->dms, column_name, version_number);
if (column == NULL)
{
obidebug(1, "\nError opening a column to add to a view");
obidebug(1, "\nError opening a column to add to a view: %s, version %d", column_name, version_number);
return -1;
}
// - If there is a line selection:
@ -2285,10 +2348,10 @@ int obi_view_add_column(Obiview_p view,
return -1;
}
// // Print dict
// Print dict
// for (i=0; i<((view->infos)->column_count); i++)
// {
// fprintf(stderr, "\n\nalias: %s", (((view->infos)->column_references)[i]).alias);
// fprintf(stderr, "\n\n2305 alias: %s", (((view->infos)->column_references)[i]).alias);
// fprintf(stderr, "\npointer: %x\n", obi_view_get_column(view, (((view->infos)->column_references)[i]).alias));
// }
@ -2775,6 +2838,63 @@ int obi_rollback_view(Obiview_p view)
}
int obi_delete_view(OBIDMS_p dms, const char* view_name)
{
char* view_file_name;
char* view_relative_path;
char* view_full_path;
struct dirent* dp;
// Check that the view exists
if (view_exists(dms, view_name) == false)
{
obi_set_errno(OBIVIEW_ERROR);
obidebug(1, "\nError trying to delete a view: view '%s' does not exist", view_name);
return -1;
}
// Check that the view is finished
if (view_is_finished(dms, view_name) == false)
{
obi_set_errno(OBIVIEW_ERROR);
obidebug(1, "\nError trying to delete a view: view '%s' is not finished", view_name);
return -1;
}
// Delete view file
view_file_name = (char*) malloc(strlen(view_name) + strlen(".obiview") + 1);
if (view_file_name == NULL)
{
obi_set_errno(OBI_MALLOC_ERROR);
obidebug(1, "\nError allocating memory for a view file name");
return -1;
}
strcpy(view_file_name, view_name);
strcat(view_file_name, ".obiview");
rewinddir(dms->view_directory);
while ((dp = readdir(dms->view_directory)) != NULL)
{
if ((dp->d_name)[0] == '.')
continue;
if (strcmp(dp->d_name, view_file_name) == 0)
{
view_relative_path = (char*) malloc(strlen(VIEW_DIR_NAME) + strlen(view_file_name) + 2);
strcpy(view_relative_path, VIEW_DIR_NAME);
strcat(view_relative_path, "/");
strcat(view_relative_path, view_file_name);
view_full_path = obi_dms_get_full_path(dms, view_relative_path);
remove(view_full_path);
free(view_relative_path);
free(view_full_path);
}
}
free(view_file_name);
return 0;
}
int obi_create_auto_count_column(Obiview_p view)
{
index_t i;