|
|
@ -47,7 +47,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Internal function building the file name where the informations about an obiview are stored.
|
|
|
|
* Internal function building the file name where the informations about a finished, read-only obiview are stored.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @warning The returned pointer has to be freed by the caller.
|
|
|
|
* @warning The returned pointer has to be freed by the caller.
|
|
|
|
*
|
|
|
|
*
|
|
|
@ -63,7 +63,23 @@ static char* build_obiview_file_name(const char* view_name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Internal function checking if a view with a given name already exists in a DMS.
|
|
|
|
* Internal function building the file name where the informations about an unfinished, writable obiview are stored.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @warning The returned pointer has to be freed by the caller.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param view_name The name of the view.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @returns A pointer to the file name.
|
|
|
|
|
|
|
|
* @retval NULL if an error occurred.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @since February 2017
|
|
|
|
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
static char* build_unfinished_obiview_file_name(const char* view_name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Internal function checking if a view (either finished or unfinished) with a given name already exists in a DMS.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @param dms The DMS.
|
|
|
|
* @param dms The DMS.
|
|
|
|
* @param view_name The name of the view.
|
|
|
|
* @param view_name The name of the view.
|
|
|
@ -73,7 +89,7 @@ static char* build_obiview_file_name(const char* view_name);
|
|
|
|
* @since September 2016
|
|
|
|
* @since September 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
bool view_exists(OBIDMS_p dms, const char* view_name);
|
|
|
|
static bool view_exists(OBIDMS_p dms, const char* view_name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -84,7 +100,7 @@ bool view_exists(OBIDMS_p dms, const char* view_name);
|
|
|
|
* @since June 2016
|
|
|
|
* @since June 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
size_t get_platform_view_file_size();
|
|
|
|
static size_t get_platform_view_file_size();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -99,7 +115,7 @@ size_t get_platform_view_file_size();
|
|
|
|
* @since August 2016
|
|
|
|
* @since August 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
int enlarge_view_file(Obiview_p view, size_t new_size);
|
|
|
|
static int enlarge_view_file(Obiview_p view, size_t new_size);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -117,7 +133,7 @@ int enlarge_view_file(Obiview_p view, size_t new_size);
|
|
|
|
* @since August 2016
|
|
|
|
* @since August 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
int write_comments_to_view_file(Obiview_p view, const char* comments);
|
|
|
|
static int write_comments_to_view_file(Obiview_p view, const char* comments);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -134,7 +150,7 @@ int write_comments_to_view_file(Obiview_p view, const char* comments);
|
|
|
|
* @since June 2016
|
|
|
|
* @since June 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
int create_obiview_file(OBIDMS_p dms, const char* view_name);
|
|
|
|
static int create_obiview_file(OBIDMS_p dms, const char* view_name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -156,7 +172,7 @@ int create_obiview_file(OBIDMS_p dms, const char* view_name);
|
|
|
|
* @since June 2016
|
|
|
|
* @since June 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
void update_column_refs(Obiview_p view);
|
|
|
|
static void update_column_refs(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -175,7 +191,7 @@ void update_column_refs(Obiview_p view);
|
|
|
|
* @since July 2016
|
|
|
|
* @since July 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
int create_column_dict(Obiview_p view);
|
|
|
|
static int create_column_dict(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -194,7 +210,7 @@ int create_column_dict(Obiview_p view);
|
|
|
|
* @since July 2016
|
|
|
|
* @since July 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
int update_column_dict(Obiview_p view);
|
|
|
|
static int update_column_dict(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -219,7 +235,7 @@ int update_column_dict(Obiview_p view);
|
|
|
|
* @since July 2016
|
|
|
|
* @since July 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
int update_column_refs_and_dict(Obiview_p view);
|
|
|
|
static int update_column_refs_and_dict(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -239,7 +255,7 @@ int update_column_refs_and_dict(Obiview_p view);
|
|
|
|
* @since February 2016
|
|
|
|
* @since February 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
int update_lines(Obiview_p view, index_t line_count);
|
|
|
|
static int update_lines(Obiview_p view, index_t line_count);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -257,7 +273,71 @@ int update_lines(Obiview_p view, index_t line_count);
|
|
|
|
* @since February 2016
|
|
|
|
* @since February 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
OBIDMS_column_p clone_column_in_view(Obiview_p view, const char* column_name);
|
|
|
|
static OBIDMS_column_p clone_column_in_view(Obiview_p view, const char* column_name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @brief Saves a view, updating its informations in the view file.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @warning The view must be writable.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param view A pointer on the view.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @returns A value indicating the success of the operation.
|
|
|
|
|
|
|
|
* @retval 0 if the operation was successfully completed.
|
|
|
|
|
|
|
|
* @retval -1 if an error occurred.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @since February 2016
|
|
|
|
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
static int save_view(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @brief Rename a view file once the view is finished, replacing the '*.obiview_unfinished' extension with '*.obiview'.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param view A pointer on the view.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @returns A value indicating the success of the operation.
|
|
|
|
|
|
|
|
* @retval 0 if the operation was successfully completed.
|
|
|
|
|
|
|
|
* @retval -1 if an error occurred.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @since February 2017
|
|
|
|
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
static int rename_finished_view(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @brief Finishes a view: check the predicates, save all the informations, rename the view file.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param view A pointer on the view.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @returns A value indicating the success of the operation.
|
|
|
|
|
|
|
|
* @retval 0 if the operation was successfully completed.
|
|
|
|
|
|
|
|
* @retval -1 if an error occurred.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @since February 2017
|
|
|
|
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
static int finish_view(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* @brief Closes an opened view.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @warning Doesn't save the view.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param view A pointer on the view.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @returns A value indicating the success of the operation.
|
|
|
|
|
|
|
|
* @retval 0 if the operation was successfully completed.
|
|
|
|
|
|
|
|
* @retval -1 if an error occurred.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @see obi_save_and_close_view()
|
|
|
|
|
|
|
|
* @since February 2016
|
|
|
|
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
static int close_view(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -276,7 +356,7 @@ OBIDMS_column_p clone_column_in_view(Obiview_p view, const char* column_name);
|
|
|
|
* @since April 2016
|
|
|
|
* @since April 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
int prepare_to_set_value_in_column(Obiview_p view, OBIDMS_column_p* column_pp, index_t* line_nb_p);
|
|
|
|
static int prepare_to_set_value_in_column(Obiview_p view, OBIDMS_column_p* column_pp, index_t* line_nb_p);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -294,7 +374,7 @@ int prepare_to_set_value_in_column(Obiview_p view, OBIDMS_column_p* column_pp, i
|
|
|
|
* @since April 2016
|
|
|
|
* @since April 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
int prepare_to_get_value_from_column(Obiview_p view, index_t* line_nb_p);
|
|
|
|
static int prepare_to_get_value_from_column(Obiview_p view, index_t* line_nb_p);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****** PREDICATE FUNCTIONS *******/
|
|
|
|
/****** PREDICATE FUNCTIONS *******/
|
|
|
@ -313,7 +393,7 @@ int prepare_to_get_value_from_column(Obiview_p view, index_t* line_nb_p);
|
|
|
|
* @since July 2016
|
|
|
|
* @since July 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
char* view_has_nuc_sequence_column(Obiview_p view);
|
|
|
|
static char* view_has_nuc_sequence_column(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -330,7 +410,7 @@ char* view_has_nuc_sequence_column(Obiview_p view);
|
|
|
|
* @since July 2016
|
|
|
|
* @since July 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
char* view_has_quality_column(Obiview_p view);
|
|
|
|
static char* view_has_quality_column(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -347,7 +427,7 @@ char* view_has_quality_column(Obiview_p view);
|
|
|
|
* @since July 2016
|
|
|
|
* @since July 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
char* view_has_id_column(Obiview_p view);
|
|
|
|
static char* view_has_id_column(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -364,7 +444,7 @@ char* view_has_id_column(Obiview_p view);
|
|
|
|
* @since July 2016
|
|
|
|
* @since July 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
char* view_has_definition_column(Obiview_p view);
|
|
|
|
static char* view_has_definition_column(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -381,7 +461,7 @@ char* view_has_definition_column(Obiview_p view);
|
|
|
|
* @since July 2016
|
|
|
|
* @since July 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
char* view_check_qual_match_seqs(Obiview_p view);
|
|
|
|
static char* view_check_qual_match_seqs(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -396,7 +476,7 @@ char* view_check_qual_match_seqs(Obiview_p view);
|
|
|
|
* @since July 2016
|
|
|
|
* @since July 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
char* view_check_one_predicate(Obiview_p view, char* (*predicate_function)(Obiview_p view));
|
|
|
|
static char* view_check_one_predicate(Obiview_p view, char* (*predicate_function)(Obiview_p view));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -410,7 +490,7 @@ char* view_check_one_predicate(Obiview_p view, char* (*predicate_function)(Obivi
|
|
|
|
* @since July 2016
|
|
|
|
* @since July 2016
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
char* view_check_all_predicates(Obiview_p view);
|
|
|
|
static char* view_check_all_predicates(Obiview_p view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
/************************************************************************
|
|
|
@ -443,11 +523,35 @@ static char* build_obiview_file_name(const char* view_name)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool view_exists(OBIDMS_p dms, const char* view_name)
|
|
|
|
static char* build_unfinished_obiview_file_name(const char* view_name)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
char* file_name;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Build file name
|
|
|
|
|
|
|
|
file_name = (char*) malloc((strlen(view_name) + 19 + 1)*sizeof(char));
|
|
|
|
|
|
|
|
if (file_name == NULL)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obi_set_errno(OBI_MALLOC_ERROR);
|
|
|
|
|
|
|
|
obidebug(1, "\nError allocating memory for a view file name");
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sprintf(file_name, "%s.obiview_unfinished", view_name) < 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obi_set_errno(OBIVIEW_ERROR);
|
|
|
|
|
|
|
|
obidebug(1, "\nProblem building an unfinished obiview file name");
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return file_name;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static bool view_exists(OBIDMS_p dms, const char* view_name)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
struct dirent* dp;
|
|
|
|
struct dirent* dp;
|
|
|
|
char* file_name;
|
|
|
|
char* file_name;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check finished views
|
|
|
|
// Create file name
|
|
|
|
// Create file name
|
|
|
|
file_name = build_obiview_file_name(view_name);
|
|
|
|
file_name = build_obiview_file_name(view_name);
|
|
|
|
if (file_name == NULL)
|
|
|
|
if (file_name == NULL)
|
|
|
@ -458,13 +562,38 @@ bool view_exists(OBIDMS_p dms, const char* view_name)
|
|
|
|
if ((dp->d_name)[0] == '.')
|
|
|
|
if ((dp->d_name)[0] == '.')
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
if (strcmp(dp->d_name, file_name) == 0)
|
|
|
|
if (strcmp(dp->d_name, file_name) == 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
free(file_name);
|
|
|
|
return true;
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
size_t get_platform_view_file_size()
|
|
|
|
static size_t get_platform_view_file_size()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
size_t obiview_size;
|
|
|
|
size_t obiview_size;
|
|
|
|
size_t rounded_obiview_size;
|
|
|
|
size_t rounded_obiview_size;
|
|
|
@ -480,7 +609,7 @@ size_t get_platform_view_file_size()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int enlarge_view_file(Obiview_p view, size_t new_size)
|
|
|
|
static int enlarge_view_file(Obiview_p view, size_t new_size)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int obiview_file_descriptor;
|
|
|
|
int obiview_file_descriptor;
|
|
|
|
double multiple;
|
|
|
|
double multiple;
|
|
|
@ -488,7 +617,7 @@ int enlarge_view_file(Obiview_p view, size_t new_size)
|
|
|
|
char* file_name;
|
|
|
|
char* file_name;
|
|
|
|
|
|
|
|
|
|
|
|
// Create file name
|
|
|
|
// Create file name
|
|
|
|
file_name = build_obiview_file_name((view->infos)->name);
|
|
|
|
file_name = build_unfinished_obiview_file_name((view->infos)->name);
|
|
|
|
if (file_name == NULL)
|
|
|
|
if (file_name == NULL)
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
@ -556,7 +685,7 @@ int enlarge_view_file(Obiview_p view, size_t new_size)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int write_comments_to_view_file(Obiview_p view, const char* comments)
|
|
|
|
static int write_comments_to_view_file(Obiview_p view, const char* comments)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
size_t new_size;
|
|
|
|
size_t new_size;
|
|
|
|
|
|
|
|
|
|
|
@ -580,14 +709,14 @@ int write_comments_to_view_file(Obiview_p view, const char* comments)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int create_obiview_file(OBIDMS_p dms, const char* view_name)
|
|
|
|
static int create_obiview_file(OBIDMS_p dms, const char* view_name)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char* file_name;
|
|
|
|
char* file_name;
|
|
|
|
int obiview_file_descriptor;
|
|
|
|
int obiview_file_descriptor;
|
|
|
|
size_t file_size;
|
|
|
|
size_t file_size;
|
|
|
|
|
|
|
|
|
|
|
|
// Create file name
|
|
|
|
// Create file name
|
|
|
|
file_name = build_obiview_file_name(view_name);
|
|
|
|
file_name = build_unfinished_obiview_file_name(view_name);
|
|
|
|
if (file_name == NULL)
|
|
|
|
if (file_name == NULL)
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
@ -634,7 +763,7 @@ int create_obiview_file(OBIDMS_p dms, const char* view_name)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void update_column_refs(Obiview_p view)
|
|
|
|
static void update_column_refs(Obiview_p view)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
@ -646,7 +775,7 @@ void update_column_refs(Obiview_p view)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int create_column_dict(Obiview_p view)
|
|
|
|
static int create_column_dict(Obiview_p view)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
@ -681,7 +810,7 @@ int create_column_dict(Obiview_p view)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int update_column_dict(Obiview_p view)
|
|
|
|
static int update_column_dict(Obiview_p view)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// Re-initialize the dictionary to rebuild it from scratch
|
|
|
|
// Re-initialize the dictionary to rebuild it from scratch
|
|
|
|
ht_free(view->column_dict);
|
|
|
|
ht_free(view->column_dict);
|
|
|
@ -693,14 +822,14 @@ int update_column_dict(Obiview_p view)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int update_column_refs_and_dict(Obiview_p view)
|
|
|
|
static int update_column_refs_and_dict(Obiview_p view)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
update_column_refs(view);
|
|
|
|
update_column_refs(view);
|
|
|
|
return update_column_dict(view);
|
|
|
|
return update_column_dict(view);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int update_lines(Obiview_p view, index_t line_count)
|
|
|
|
static int update_lines(Obiview_p view, index_t line_count)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
@ -739,7 +868,7 @@ int update_lines(Obiview_p view, index_t line_count)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OBIDMS_column_p clone_column_in_view(Obiview_p view, const char* column_name)
|
|
|
|
static OBIDMS_column_p clone_column_in_view(Obiview_p view, const char* column_name)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
OBIDMS_column_p column = NULL;
|
|
|
|
OBIDMS_column_p column = NULL;
|
|
|
@ -799,7 +928,161 @@ OBIDMS_column_p clone_column_in_view(Obiview_p view, const char* column_name)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int prepare_to_set_value_in_column(Obiview_p view, OBIDMS_column_p* column_pp, index_t* line_nb_p)
|
|
|
|
static int save_view(Obiview_p view)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// Check that the view is not read-only
|
|
|
|
|
|
|
|
if (view->read_only)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obi_set_errno(OBIVIEW_ERROR);
|
|
|
|
|
|
|
|
obidebug(1, "\nError trying to save a read-only view");
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Store reference for the line selection associated with that view if there is one
|
|
|
|
|
|
|
|
if (view->line_selection != NULL) // Unnecessary in theory, the line selection references are already saved
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
strcpy(((view->infos)->line_selection).column_name, ((view->line_selection)->header)->name);
|
|
|
|
|
|
|
|
((view->infos)->line_selection).version = ((view->line_selection)->header)->version;
|
|
|
|
|
|
|
|
(view->infos)->all_lines = false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else // Necessary because line selection could have been deleted if a column was cloned
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
(((view->infos)->line_selection).column_name)[0] = '\0';
|
|
|
|
|
|
|
|
((view->infos)->line_selection).version = -1;
|
|
|
|
|
|
|
|
(view->infos)->all_lines = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
update_column_refs(view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int rename_finished_view(Obiview_p view)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
char* old_name;
|
|
|
|
|
|
|
|
char* new_name;
|
|
|
|
|
|
|
|
char* path_old_name;
|
|
|
|
|
|
|
|
char* path_new_name;
|
|
|
|
|
|
|
|
char* full_path_old_name;
|
|
|
|
|
|
|
|
char* full_path_new_name;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
old_name = build_unfinished_obiview_file_name((view->infos)->name);
|
|
|
|
|
|
|
|
new_name = build_obiview_file_name((view->infos)->name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
path_old_name = malloc(MAX_PATH_LEN);
|
|
|
|
|
|
|
|
path_new_name = malloc(MAX_PATH_LEN);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
strcpy(path_old_name, "VIEWS/");
|
|
|
|
|
|
|
|
strcat(path_old_name, old_name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
strcpy(path_new_name, "VIEWS/");
|
|
|
|
|
|
|
|
strcat(path_new_name, new_name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
full_path_old_name = obi_dms_get_full_path(view->dms, path_old_name);
|
|
|
|
|
|
|
|
full_path_new_name = obi_dms_get_full_path(view->dms, path_new_name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (rename(full_path_old_name, full_path_new_name) < 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obi_set_errno(OBIVIEW_ERROR);
|
|
|
|
|
|
|
|
obidebug(1, "\nError renaming the file of a finished view: %s", full_path_new_name);
|
|
|
|
|
|
|
|
free(old_name);
|
|
|
|
|
|
|
|
free(new_name);
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
free(old_name);
|
|
|
|
|
|
|
|
free(new_name);
|
|
|
|
|
|
|
|
free(path_new_name);
|
|
|
|
|
|
|
|
free(path_old_name);
|
|
|
|
|
|
|
|
free(full_path_old_name);
|
|
|
|
|
|
|
|
free(full_path_new_name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int finish_view(Obiview_p view)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
char* predicates;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check that the view is not read-only
|
|
|
|
|
|
|
|
if (view->read_only)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obi_set_errno(OBIVIEW_ERROR);
|
|
|
|
|
|
|
|
obidebug(1, "\nError trying to save a read-only view");
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check predicates
|
|
|
|
|
|
|
|
predicates = view_check_all_predicates(view);
|
|
|
|
|
|
|
|
if (predicates == NULL)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obidebug(1, "\nView predicates not respected");
|
|
|
|
|
|
|
|
return -1; // TODO reverse view (delete files)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
write_comments_to_view_file(view, predicates);
|
|
|
|
|
|
|
|
free(predicates);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (save_view(view) < 0)
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (rename_finished_view(view) < 0)
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Flag the view as finished
|
|
|
|
|
|
|
|
(view->infos)->finished = true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int close_view(Obiview_p view)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
int ret_value;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret_value = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (i=0; i < ((view->infos)->column_count); i++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (obi_close_column((view->columns)[i]) < 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obidebug(1, "\nError closing a column while closing a view");
|
|
|
|
|
|
|
|
ret_value = -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Close line selection if there is one
|
|
|
|
|
|
|
|
if (view->line_selection != NULL)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (obi_close_column(view->line_selection) < 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obidebug(1, "\nError closing a line selection while closing a view");
|
|
|
|
|
|
|
|
ret_value = -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Free the column dictionary
|
|
|
|
|
|
|
|
ht_free(view->column_dict);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Unmap view file
|
|
|
|
|
|
|
|
if (obi_view_unmap_file(view->dms, view->infos) < 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obidebug(1, "\nError unmaping a view file while closing a view");
|
|
|
|
|
|
|
|
ret_value = -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
free(view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ret_value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int prepare_to_set_value_in_column(Obiview_p view, OBIDMS_column_p* column_pp, index_t* line_nb_p)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
char* column_name = NULL;
|
|
|
|
char* column_name = NULL;
|
|
|
@ -846,7 +1129,7 @@ int prepare_to_set_value_in_column(Obiview_p view, OBIDMS_column_p* column_pp, i
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int prepare_to_get_value_from_column(Obiview_p view, index_t* line_nb_p)
|
|
|
|
static int prepare_to_get_value_from_column(Obiview_p view, index_t* line_nb_p)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (((*line_nb_p)+1) > ((view->infos)->line_count))
|
|
|
|
if (((*line_nb_p)+1) > ((view->infos)->line_count))
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -865,7 +1148,7 @@ int prepare_to_get_value_from_column(Obiview_p view, index_t* line_nb_p)
|
|
|
|
|
|
|
|
|
|
|
|
/****** PREDICATE FUNCTIONS *******/
|
|
|
|
/****** PREDICATE FUNCTIONS *******/
|
|
|
|
|
|
|
|
|
|
|
|
char* view_has_nuc_sequence_column(Obiview_p view)
|
|
|
|
static char* view_has_nuc_sequence_column(Obiview_p view)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char* predicate;
|
|
|
|
char* predicate;
|
|
|
|
|
|
|
|
|
|
|
@ -889,7 +1172,7 @@ char* view_has_nuc_sequence_column(Obiview_p view)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char* view_has_quality_column(Obiview_p view)
|
|
|
|
static char* view_has_quality_column(Obiview_p view)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char* predicate;
|
|
|
|
char* predicate;
|
|
|
|
|
|
|
|
|
|
|
@ -913,7 +1196,7 @@ char* view_has_quality_column(Obiview_p view)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char* view_has_id_column(Obiview_p view)
|
|
|
|
static char* view_has_id_column(Obiview_p view)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char* predicate;
|
|
|
|
char* predicate;
|
|
|
|
|
|
|
|
|
|
|
@ -936,7 +1219,8 @@ char* view_has_id_column(Obiview_p view)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
char* view_has_definition_column(Obiview_p view)
|
|
|
|
|
|
|
|
|
|
|
|
static char* view_has_definition_column(Obiview_p view)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char* predicate;
|
|
|
|
char* predicate;
|
|
|
|
|
|
|
|
|
|
|
@ -960,7 +1244,7 @@ char* view_has_definition_column(Obiview_p view)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char* view_check_qual_match_seqs(Obiview_p view)
|
|
|
|
static char* view_check_qual_match_seqs(Obiview_p view)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
index_t i, j, k;
|
|
|
|
index_t i, j, k;
|
|
|
|
index_t nb_elements_per_line;
|
|
|
|
index_t nb_elements_per_line;
|
|
|
@ -1053,13 +1337,13 @@ char* view_check_qual_match_seqs(Obiview_p view)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char* view_check_one_predicate(Obiview_p view, char* (*predicate_function)(Obiview_p view))
|
|
|
|
static char* view_check_one_predicate(Obiview_p view, char* (*predicate_function)(Obiview_p view))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return predicate_function(view);
|
|
|
|
return predicate_function(view);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char* view_check_all_predicates(Obiview_p view)
|
|
|
|
static char* view_check_all_predicates(Obiview_p view)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
int i, j;
|
|
|
|
size_t size_to_allocate;
|
|
|
|
size_t size_to_allocate;
|
|
|
@ -1195,7 +1479,7 @@ Obiview_p obi_new_view(OBIDMS_p dms, const char* view_name, Obiview_p view_to_cl
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Map view file
|
|
|
|
// Map view file
|
|
|
|
view->infos = obi_view_map_file(dms, view_name);
|
|
|
|
view->infos = obi_view_map_file(dms, view_name, false);
|
|
|
|
if (view->infos == NULL)
|
|
|
|
if (view->infos == NULL)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
obidebug(1, "\nError mapping the informations of a new view");
|
|
|
|
obidebug(1, "\nError mapping the informations of a new view");
|
|
|
@ -1305,7 +1589,7 @@ Obiview_p obi_new_view(OBIDMS_p dms, const char* view_name, Obiview_p view_to_cl
|
|
|
|
if (write_comments_to_view_file(view, clone_comment) < 0)
|
|
|
|
if (write_comments_to_view_file(view, clone_comment) < 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
obidebug(1, "\nError writing comments when creating a view");
|
|
|
|
obidebug(1, "\nError writing comments when creating a view");
|
|
|
|
obi_close_view(view);
|
|
|
|
close_view(view);
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1341,7 +1625,7 @@ Obiview_p obi_new_view(OBIDMS_p dms, const char* view_name, Obiview_p view_to_cl
|
|
|
|
if (write_comments_to_view_file(view, comments) < 0)
|
|
|
|
if (write_comments_to_view_file(view, comments) < 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
obidebug(1, "\nError writing comments when creating a view");
|
|
|
|
obidebug(1, "\nError writing comments when creating a view");
|
|
|
|
obi_close_view(view);
|
|
|
|
close_view(view);
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -1360,7 +1644,7 @@ Obiview_p obi_new_view(OBIDMS_p dms, const char* view_name, Obiview_p view_to_cl
|
|
|
|
// Create the column dictionary (hash table) associating column names (or aliases) to column pointers
|
|
|
|
// Create the column dictionary (hash table) associating column names (or aliases) to column pointers
|
|
|
|
if (create_column_dict(view) < 0)
|
|
|
|
if (create_column_dict(view) < 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
obi_close_view(view);
|
|
|
|
close_view(view);
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -1409,7 +1693,7 @@ Obiview_p obi_new_view_cloned_from_name(OBIDMS_p dms, const char* view_name, con
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
view = obi_new_view(dms, view_name, view_to_clone, line_selection, comments);
|
|
|
|
view = obi_new_view(dms, view_name, view_to_clone, line_selection, comments);
|
|
|
|
|
|
|
|
|
|
|
|
obi_close_view(view_to_clone);
|
|
|
|
close_view(view_to_clone);
|
|
|
|
|
|
|
|
|
|
|
|
return view;
|
|
|
|
return view;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1511,26 +1795,43 @@ Obiview_p obi_new_view_nuc_seqs_cloned_from_name(OBIDMS_p dms, const char* view_
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
view = obi_new_view_nuc_seqs(dms, view_name, view_to_clone, line_selection, comments, quality_column);
|
|
|
|
view = obi_new_view_nuc_seqs(dms, view_name, view_to_clone, line_selection, comments, quality_column);
|
|
|
|
|
|
|
|
|
|
|
|
obi_close_view(view_to_clone);
|
|
|
|
close_view(view_to_clone);
|
|
|
|
|
|
|
|
|
|
|
|
return view;
|
|
|
|
return view;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Obiview_infos_p obi_view_map_file(OBIDMS_p dms, const char* view_name)
|
|
|
|
Obiview_infos_p obi_view_map_file(OBIDMS_p dms, const char* view_name, bool finished)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char* file_name;
|
|
|
|
char* file_name;
|
|
|
|
Obiview_infos_p view_infos;
|
|
|
|
Obiview_infos_p view_infos;
|
|
|
|
int obiview_file_descriptor;
|
|
|
|
int obiview_file_descriptor;
|
|
|
|
size_t file_size;
|
|
|
|
size_t file_size;
|
|
|
|
|
|
|
|
int open_flag;
|
|
|
|
|
|
|
|
int mmap_flag;
|
|
|
|
|
|
|
|
|
|
|
|
// Create file name
|
|
|
|
// Create file name
|
|
|
|
|
|
|
|
if (finished)
|
|
|
|
file_name = build_obiview_file_name(view_name);
|
|
|
|
file_name = build_obiview_file_name(view_name);
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
file_name = build_unfinished_obiview_file_name(view_name);
|
|
|
|
if (file_name == NULL)
|
|
|
|
if (file_name == NULL)
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Set flags (read-only or not)
|
|
|
|
|
|
|
|
if (finished)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
open_flag = O_RDONLY;
|
|
|
|
|
|
|
|
mmap_flag = PROT_READ;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
open_flag = O_RDWR;
|
|
|
|
|
|
|
|
mmap_flag = PROT_READ | PROT_WRITE;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Open view file
|
|
|
|
// Open view file
|
|
|
|
obiview_file_descriptor = openat(dms->view_dir_fd, file_name, O_RDWR, 0777);
|
|
|
|
obiview_file_descriptor = openat(dms->view_dir_fd, file_name, open_flag, 0777);
|
|
|
|
if (obiview_file_descriptor < 0)
|
|
|
|
if (obiview_file_descriptor < 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (errno == ENOENT)
|
|
|
|
if (errno == ENOENT)
|
|
|
@ -1560,7 +1861,7 @@ Obiview_infos_p obi_view_map_file(OBIDMS_p dms, const char* view_name)
|
|
|
|
// Map the view infos structure
|
|
|
|
// Map the view infos structure
|
|
|
|
view_infos = mmap(NULL,
|
|
|
|
view_infos = mmap(NULL,
|
|
|
|
file_size,
|
|
|
|
file_size,
|
|
|
|
PROT_READ | PROT_WRITE,
|
|
|
|
mmap_flag,
|
|
|
|
MAP_SHARED,
|
|
|
|
MAP_SHARED,
|
|
|
|
obiview_file_descriptor,
|
|
|
|
obiview_file_descriptor,
|
|
|
|
0
|
|
|
|
0
|
|
|
@ -1590,12 +1891,15 @@ int obi_view_unmap_file(OBIDMS_p dms, Obiview_infos_p view_infos)
|
|
|
|
size_t file_size;
|
|
|
|
size_t file_size;
|
|
|
|
|
|
|
|
|
|
|
|
// Get file name
|
|
|
|
// Get file name
|
|
|
|
|
|
|
|
if (view_infos->finished)
|
|
|
|
file_name = build_obiview_file_name(view_infos->name);
|
|
|
|
file_name = build_obiview_file_name(view_infos->name);
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
file_name = build_unfinished_obiview_file_name(view_infos->name);
|
|
|
|
if (file_name == NULL)
|
|
|
|
if (file_name == NULL)
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
// Open view file
|
|
|
|
// Open view file
|
|
|
|
obiview_file_descriptor = openat(dms->view_dir_fd, file_name, O_RDWR, 0777);
|
|
|
|
obiview_file_descriptor = openat(dms->view_dir_fd, file_name, O_RDONLY, 0777);
|
|
|
|
if (obiview_file_descriptor < 0)
|
|
|
|
if (obiview_file_descriptor < 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
obi_set_errno(OBIVIEW_ERROR);
|
|
|
|
obi_set_errno(OBIVIEW_ERROR);
|
|
|
@ -1661,13 +1965,9 @@ Obiview_p obi_open_view(OBIDMS_p dms, const char* view_name)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Map view file
|
|
|
|
// Map view file
|
|
|
|
view->infos = obi_view_map_file(dms, view_name);
|
|
|
|
view->infos = obi_view_map_file(dms, view_name, true);
|
|
|
|
|
|
|
|
if ((view->infos) == NULL)
|
|
|
|
// Check that the view is finished and can be opened
|
|
|
|
|
|
|
|
if ((view->infos)->finished == false)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
obidebug(1, "\nError opening a view: the view is not finished");
|
|
|
|
|
|
|
|
obi_view_unmap_file(view->dms, view->infos);
|
|
|
|
|
|
|
|
free(view);
|
|
|
|
free(view);
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1697,7 +1997,7 @@ Obiview_p obi_open_view(OBIDMS_p dms, const char* view_name)
|
|
|
|
if (column_pointer == NULL)
|
|
|
|
if (column_pointer == NULL)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
obidebug(1, "\nError opening a column for a view: column %d: %s, version %d", i, column_name, column_version);
|
|
|
|
obidebug(1, "\nError opening a column for a view: column %d: %s, version %d", i, column_name, column_version);
|
|
|
|
obi_close_view(view);
|
|
|
|
close_view(view);
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
(view->columns)[i] = column_pointer;
|
|
|
|
(view->columns)[i] = column_pointer;
|
|
|
@ -1713,7 +2013,7 @@ Obiview_p obi_open_view(OBIDMS_p dms, const char* view_name)
|
|
|
|
if (create_column_dict(view) < 0)
|
|
|
|
if (create_column_dict(view) < 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
obidebug(1, "\nError creating the column dictionary when opening a view");
|
|
|
|
obidebug(1, "\nError creating the column dictionary when opening a view");
|
|
|
|
obi_close_view(view);
|
|
|
|
close_view(view);
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -1963,103 +2263,16 @@ int obi_view_create_column_alias(Obiview_p view, const char* current_name, const
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int obi_save_view(Obiview_p view)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// Check that the view is not read-only
|
|
|
|
|
|
|
|
if (view->read_only)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obi_set_errno(OBIVIEW_ERROR);
|
|
|
|
|
|
|
|
obidebug(1, "\nError trying to save a read-only view");
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Store reference for the line selection associated with that view if there is one
|
|
|
|
|
|
|
|
if (view->line_selection != NULL) // Unnecessary in theory, the line selection references are already saved
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
strcpy(((view->infos)->line_selection).column_name, ((view->line_selection)->header)->name);
|
|
|
|
|
|
|
|
((view->infos)->line_selection).version = ((view->line_selection)->header)->version;
|
|
|
|
|
|
|
|
(view->infos)->all_lines = false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else // Necessary because line selection could have been deleted if a column was cloned
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
(((view->infos)->line_selection).column_name)[0] = '\0';
|
|
|
|
|
|
|
|
((view->infos)->line_selection).version = -1;
|
|
|
|
|
|
|
|
(view->infos)->all_lines = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
update_column_refs(view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int obi_close_view(Obiview_p view)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
int ret_value;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret_value = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (i=0; i < ((view->infos)->column_count); i++)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (obi_close_column((view->columns)[i]) < 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obidebug(1, "\nError closing a column while closing a view");
|
|
|
|
|
|
|
|
ret_value = -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Close line selection if there is one
|
|
|
|
|
|
|
|
if (view->line_selection != NULL)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (obi_close_column(view->line_selection) < 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obidebug(1, "\nError closing a line selection while closing a view");
|
|
|
|
|
|
|
|
ret_value = -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Flag the view as finished
|
|
|
|
|
|
|
|
(view->infos)->finished = true;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Free the column dictionary
|
|
|
|
|
|
|
|
ht_free(view->column_dict);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Unmap view file
|
|
|
|
|
|
|
|
if (obi_view_unmap_file(view->dms, view->infos) < 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obidebug(1, "\nError unmaping a view file while closing a view");
|
|
|
|
|
|
|
|
ret_value = -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
free(view);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return ret_value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int obi_save_and_close_view(Obiview_p view)
|
|
|
|
int obi_save_and_close_view(Obiview_p view)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char* predicates;
|
|
|
|
// Finish and save the view if it is not read-only
|
|
|
|
|
|
|
|
if ( ! (view->read_only))
|
|
|
|
|
|
|
|
if (finish_view(view) < 0)
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
if (!(view->read_only))
|
|
|
|
if (close_view(view) < 0)
|
|
|
|
{
|
|
|
|
|
|
|
|
predicates = view_check_all_predicates(view);
|
|
|
|
|
|
|
|
if (predicates == NULL)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
obidebug(1, "\nView predicates not respected");
|
|
|
|
|
|
|
|
return -1; // TODO reverse view (delete files)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
write_comments_to_view_file(view, predicates);
|
|
|
|
|
|
|
|
free(predicates);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (obi_save_view(view) < 0)
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (obi_close_view(view) < 0)
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|