Reworked obiview code and added more comments

This commit is contained in:
Celine Mercier
2016-04-25 11:37:53 +02:00
parent 68a8509c12
commit 0a55e26520

View File

@ -10,20 +10,15 @@
*/ */
// TODO
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <stdbool.h> #include <stdbool.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/mman.h> #include <sys/mman.h>
#include "obidms.h"
#include "obiview.h" #include "obiview.h"
#include "obierrno.h" #include "obidms.h"
#include "obidebug.h"
#include "obidmscolumn.h" #include "obidmscolumn.h"
#include "utils.h"
#include "obilittlebigman.h"
#include "obidmscolumn_idx.h" #include "obidmscolumn_idx.h"
#include "obidmscolumn_bool.h" #include "obidmscolumn_bool.h"
#include "obidmscolumn_char.h" #include "obidmscolumn_char.h"
@ -31,6 +26,10 @@
#include "obidmscolumn_int.h" #include "obidmscolumn_int.h"
#include "obidmscolumn_seq.h" #include "obidmscolumn_seq.h"
#include "obidmscolumn_str.h" #include "obidmscolumn_str.h"
#include "obierrno.h"
#include "obidebug.h"
#include "obilittlebigman.h"
#include "utils.h"
#define DEBUG_LEVEL 0 // TODO has to be defined somewhere else (cython compil flag?) #define DEBUG_LEVEL 0 // TODO has to be defined somewhere else (cython compil flag?)
@ -59,7 +58,7 @@
static char* build_obiview_file_name(); static char* build_obiview_file_name();
/** TODO public /** TODO public?
* Internal function creating the file containing basic informations on the OBIDMS. * Internal function creating the file containing basic informations on the OBIDMS.
* *
* This file contains: * This file contains:
@ -99,6 +98,12 @@ static char* build_obiview_file_name()
// Build file name // Build file name
file_name = (char*) malloc((strlen(OBIVIEW_FILE_NAME) + 1)*sizeof(char)); file_name = (char*) malloc((strlen(OBIVIEW_FILE_NAME) + 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, OBIVIEW_FILE_NAME) < 0) if (sprintf(file_name, OBIVIEW_FILE_NAME) < 0)
{ {
obi_set_errno(OBIVIEW_ERROR); obi_set_errno(OBIVIEW_ERROR);
@ -147,7 +152,6 @@ int create_obiview_file(int dms_file_descriptor)
char* file_name; char* file_name;
int obiview_file_descriptor; int obiview_file_descriptor;
size_t header_size; size_t header_size;
// size_t view_size;
size_t file_size; size_t file_size;
Obiviews_header_p header; Obiviews_header_p header;
@ -170,8 +174,7 @@ int create_obiview_file(int dms_file_descriptor)
// Truncate file to the right size // Truncate file to the right size
header_size = get_platform_header_size(); header_size = get_platform_header_size();
//view_size = get_platform_views_size(1); file_size = header_size;
file_size = header_size; // + view_size;
if (ftruncate(obiview_file_descriptor, file_size) < 0) if (ftruncate(obiview_file_descriptor, file_size) < 0)
{ {
@ -281,7 +284,7 @@ Obiview_p obi_new_view_nuc_seqs(OBIDMS_p dms, const char* view_name, Obiview_p v
Obiview_p view; Obiview_p view;
if (view_to_clone != NULL) if (view_to_clone != NULL)
{ // TODO check that the view to clone is already a NUC_SEQS view (discuss possibility of transforming type of a view) { // Check that the view to clone is already a NUC_SEQS view (TODO discuss possibility of transforming type of a view)
if (strcmp(view_to_clone->view_type, VIEW_TYPE_NUC_SEQS)) if (strcmp(view_to_clone->view_type, VIEW_TYPE_NUC_SEQS))
{ {
obi_set_errno(OBIVIEW_ERROR); obi_set_errno(OBIVIEW_ERROR);
@ -329,7 +332,7 @@ Obiview_p obi_new_view(OBIDMS_p dms, const char* view_name, Obiview_p view_to_cl
index_t line_nb; index_t line_nb;
Obiviews_infos_all_p views_infos; Obiviews_infos_all_p views_infos;
// Check uniqueness of name TODO but problem if view not written yet has the same name // Check uniqueness of name TODO but problem if view not written yet has the same name. Save lists of open views in DMS ?
views_infos = obi_read_views(dms); views_infos = obi_read_views(dms);
if (views_infos != NULL) if (views_infos != NULL)
{ {
@ -367,13 +370,16 @@ Obiview_p obi_new_view(OBIDMS_p dms, const char* view_name, Obiview_p view_to_cl
view->dms = dms; view->dms = dms;
view->column_count = view_to_clone->column_count; view->column_count = view_to_clone->column_count;
if ((view_to_clone->line_selection != NULL) && (line_selection == NULL)) // reorder conditions
// If the view to clone has an associated line selection and there is no new line selection, open the associated line selection
if ((view_to_clone->line_selection != NULL) && (line_selection == NULL))
{ {
view->line_selection = obi_open_column(dms, ((view_to_clone->line_selection)->header)->name, ((view_to_clone->line_selection)->header)->version); view->line_selection = obi_open_column(dms, ((view_to_clone->line_selection)->header)->name, ((view_to_clone->line_selection)->header)->version);
if (view->line_selection == NULL) if (view->line_selection == NULL)
return NULL; return NULL;
view->line_count = view_to_clone->line_count; view->line_count = view_to_clone->line_count;
} }
// If there is a new line selection, build it by combining it with the pre-existing one if there is one
else if (line_selection != NULL) else if (line_selection != NULL)
{ {
view->line_selection = obi_create_column(view->dms, LINES_COLUMN_NAME, OBI_IDX, 0, 1, LINES_COLUMN_NAME, NULL, NULL); view->line_selection = obi_create_column(view->dms, LINES_COLUMN_NAME, OBI_IDX, 0, 1, LINES_COLUMN_NAME, NULL, NULL);
@ -411,7 +417,7 @@ Obiview_p obi_new_view(OBIDMS_p dms, const char* view_name, Obiview_p view_to_cl
(view->line_count)++; (view->line_count)++;
} }
} }
else else // If there is no line selection associated with the view to clone or the new view
{ {
view->line_selection = NULL; view->line_selection = NULL;
view->line_count = view_to_clone->line_count; view->line_count = view_to_clone->line_count;
@ -442,7 +448,7 @@ Obiview_p obi_new_view(OBIDMS_p dms, const char* view_name, Obiview_p view_to_cl
view->new_line_selection = NULL; view->new_line_selection = NULL;
(view->created_from)[0] = '\0'; (view->created_from)[0] = '\0';
(view->view_type)[0] = '\0'; (view->view_type)[0] = '\0';
//view->columns = NULL; TODO //view->columns = NULL; // TODO
} }
strcpy(view->name, view_name); strcpy(view->name, view_name);
@ -639,7 +645,7 @@ Obiview_p obi_open_view(OBIDMS_p dms, const char* view_name)
view->column_count++; view->column_count++;
} }
// Munmap and close things TODO // Munmap and close things
munmap(views, header->views_size); munmap(views, header->views_size);
munmap(header, header_size); munmap(header, header_size);
close(obiview_file_descriptor); close(obiview_file_descriptor);
@ -648,7 +654,7 @@ Obiview_p obi_open_view(OBIDMS_p dms, const char* view_name)
} }
Obiviews_infos_all_p obi_read_views(OBIDMS_p dms) Obiviews_infos_all_p obi_read_view_infos(OBIDMS_p dms)
{ {
char* view_file_name; char* view_file_name;
int obiview_file_descriptor; int obiview_file_descriptor;
@ -733,7 +739,7 @@ Obiviews_infos_all_p obi_read_views(OBIDMS_p dms)
} }
int obi_unmap_read_views(Obiviews_infos_all_p views) int obi_close_view_infos(Obiviews_infos_all_p views)
{ {
if (munmap(views->view_infos, (views->header)->views_size) < 0) if (munmap(views->view_infos, (views->header)->views_size) < 0)
{ {
@ -822,7 +828,7 @@ OBIDMS_column_p obi_view_clone_column(Obiview_p view, const char* column_name)
return NULL; return NULL;
} }
if (view->new_line_selection != NULL) // TODO Probably shouldn't happen if (view->new_line_selection != NULL) // TODO Probably shouldn't happen, trigger error?
current_line_selection = view->new_line_selection; current_line_selection = view->new_line_selection;
else else
current_line_selection = view->line_selection; current_line_selection = view->line_selection;
@ -830,8 +836,12 @@ OBIDMS_column_p obi_view_clone_column(Obiview_p view, const char* column_name)
for (i=0; i<(view->column_count); i++) for (i=0; i<(view->column_count); i++)
{ {
if ((current_line_selection != NULL) || (!(strcmp((((view->columns)[i])->header)->name, column_name)))) if ((current_line_selection != NULL) || (!(strcmp((((view->columns)[i])->header)->name, column_name))))
{ // Clone with the right line selection and replace { // Clone with the right line selection and replace (for all columns if there is a line selection)
// Save pointer to close column after cloning
column_buffer = (view->columns)[i]; column_buffer = (view->columns)[i];
// Clone and replace the column in the view
(view->columns)[i] = obi_clone_column(view->dms, current_line_selection, (((view->columns)[i])->header)->name, (((view->columns)[i])->header)->version, 1); (view->columns)[i] = obi_clone_column(view->dms, current_line_selection, (((view->columns)[i])->header)->name, (((view->columns)[i])->header)->version, 1);
if ((view->columns)[i] == NULL) if ((view->columns)[i] == NULL)
{ {
@ -839,14 +849,17 @@ OBIDMS_column_p obi_view_clone_column(Obiview_p view, const char* column_name)
obidebug(1, "\nError cloning a column to replace in a view"); obidebug(1, "\nError cloning a column to replace in a view");
return NULL; return NULL;
} }
// Found the column to return
// Close old cloned column
obi_close_column(column_buffer);
if (!(strcmp((((view->columns)[i])->header)->name, column_name))) if (!(strcmp((((view->columns)[i])->header)->name, column_name)))
// Found the column to return
column = (view->columns)[i]; column = (view->columns)[i];
else
obi_close_column(column_buffer); // TODO weird closing after cloning but can't think of cleaner yet
} }
} }
// Close old line selections
if (view->line_selection != NULL) if (view->line_selection != NULL)
{ {
obi_close_column(view->line_selection); obi_close_column(view->line_selection);
@ -1204,7 +1217,7 @@ int obi_close_view(Obiview_p view)
int obi_save_and_close_view(Obiview_p view) int obi_save_and_close_view(Obiview_p view)
{ {
if (!(view->read_only)) // TODO discuss if (!(view->read_only))
{ {
if (obi_save_view(view) < 0) if (obi_save_view(view) < 0)
return -1; return -1;