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

@ -60,7 +60,7 @@ cdef extern from "obiview.h" nogil:
ctypedef Obiview_t* Obiview_p
Obiview_p obi_new_view_nuc_seqs(OBIDMS_p dms, const_char_p view_name, Obiview_p view_to_clone, index_t* line_selection, const_char_p comments, bint quality_column)
Obiview_p obi_new_view_nuc_seqs(OBIDMS_p dms, const_char_p view_name, Obiview_p view_to_clone, index_t* line_selection, const_char_p comments, bint quality_column, bint create_default_columns)
Obiview_p obi_new_view(OBIDMS_p dms, const_char_p view_name, Obiview_p view_to_clone, index_t* line_selection, const_char_p comments)
@ -113,6 +113,8 @@ cdef extern from "obiview.h" nogil:
int obi_rollback_view(Obiview_p view)
int obi_delete_view(OBIDMS_p dms, const char* view_name)
# OBI_INT
int obi_set_int_with_elt_name_and_col_p_in_view(Obiview_p view,

View File

@ -43,7 +43,8 @@ cdef class View_NUC_SEQS(View):
NULL,
NULL,
comments_b,
quality)
quality,
True)
if pointer == NULL :
message = "Error : Cannot create view %s" % bytes2str(view_name_b)

View File

@ -15,7 +15,8 @@ from ..capi.obiview cimport Alias_column_pair_p, \
obi_view_get_pointer_on_column_in_view, \
obi_view_delete_column, \
obi_view_create_column_alias, \
obi_view_write_comments
obi_view_write_comments, \
obi_delete_view
from ..capi.obidmscolumn cimport OBIDMS_column_p
from ..capi.obidms cimport OBIDMS_p
@ -68,6 +69,12 @@ cdef class View(OBIWrapper) :
raise Exception("Error importing a view")
@staticmethod
def delete_view(DMS dms, object view_name):
if (obi_delete_view(dms.pointer(), tobytes(view_name)) < 0):
raise Exception("Error deleting a view")
@staticmethod
def new(DMS dms,
object view_name,
@ -533,6 +540,8 @@ cdef class View(OBIWrapper) :
for i in range(len(element.comments[b"input_dms_name"])) :
if element.comments[b"input_dms_name"][i] == element.dms.name and b"/" not in element.comments[b"input_view_name"][i]: # Same DMS and not a special element like a taxonomy
top_level.append(element.dms[element.comments[b"input_view_name"][i]])
else:
top_level.append(None)
else:
top_level.append(None)
level_dict[tuple(element.comments[b"input_str"])] = {}

View File

@ -765,7 +765,7 @@ int obi_ecopcr(const char* i_dms_name,
}
// Create output view
o_view = obi_new_view_nuc_seqs(o_dms, o_view_name, NULL, NULL, o_view_comments, false);
o_view = obi_new_view_nuc_seqs(o_dms, o_view_name, NULL, NULL, o_view_comments, false, true);
if (o_view == NULL)
{
obidebug(1, "\nError creating the output view");

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;

View File

@ -203,6 +203,7 @@ Obiview_p obi_new_view_cloned_from_name(OBIDMS_p dms, const char* view_name, con
* if there is one. NULL if there is no line selection or no view to clone.
* @param comments Eventually, comments to associate with the view. NULL if not.
* @param quality_column Whether or not a sequence quality column is associated with the view.
* @param create_default_columns Whether to create the default columns associated with the view type (false when importing all columns from a view for example).
*
* @returns A pointer to the newly created view structure.
* @retval NULL if an error occurred.
@ -210,7 +211,7 @@ Obiview_p obi_new_view_cloned_from_name(OBIDMS_p dms, const char* view_name, con
* @since February 2016
* @author Celine Mercier (celine.mercier@metabarcoding.org)
*/
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);
/**
@ -579,6 +580,29 @@ int obi_clean_unfinished_views(OBIDMS_p dms);
int obi_rollback_view(Obiview_p view);
/**
* @brief Deletes a finished view file.
*
* Only the view informations file is deleted.
* This function should only be used to delete 'temporary views' not meant to appear in the DMS history.
*
* @warning The view needs to be closed. The function checks that the view exists and is finished, but not that it is closed.
* If it was not closed, memory errors will be generated when the system tries to read the deleted file.
* // TODO maybe take opened view as argument in order to close it? but doesn't guarantee that it isn't open elsewhere.
*
* @param dms A pointer on the DMS to which the view belongs.
* @param view_name The name of the view to delete.
*
* @returns A value indicating the success of the operation.
* @retval 0 if the operation was successfully completed.
* @retval -1 if an error occurred.
*
* @since October 2018
* @author Celine Mercier (celine.mercier@metabarcoding.org)
*/
int obi_delete_view(OBIDMS_p dms, const char* view_name);
/**
* @brief Creates an OBI_INT column with the line count of the view it belongs to, and sets all lines to 1.
*