From f31d8983bb3f96b3c8d7a5f36dfb6d30fd2429c1 Mon Sep 17 00:00:00 2001 From: Celine Mercier Date: Tue, 1 Sep 2015 17:38:08 +0200 Subject: [PATCH] Columns are now enlarged if needed when setting a value --- .../obidmscolumn_bool/capidmscolumn_bool.pxd | 4 +- .../obidmscolumn_bool/capidmscolumn_bool.pyx | 4 +- .../obidmscolumn_char/capidmscolumn_char.pxd | 4 +- .../obidmscolumn_char/capidmscolumn_char.pyx | 4 +- .../capidmscolumn_float.pxd | 4 +- .../capidmscolumn_float.pyx | 4 +- .../obidmscolumn_idx/capidmscolumn_idx.pxd | 4 +- .../obidmscolumn_idx/capidmscolumn_idx.pyx | 4 +- .../obidmscolumn_int/capidmscolumn_int.pxd | 4 +- .../obidmscolumn_int/capidmscolumn_int.pyx | 4 +- src/obidmscolumn.c | 216 +++++++++++++++--- src/obidmscolumn.h | 29 +++ src/obidmscolumn_bool.c | 37 ++- src/obidmscolumn_bool.h | 8 +- src/obidmscolumn_char.c | 45 +++- src/obidmscolumn_char.h | 8 +- src/obidmscolumn_float.c | 37 ++- src/obidmscolumn_float.h | 8 +- src/obidmscolumn_idx.c | 37 ++- src/obidmscolumn_idx.h | 8 +- src/obidmscolumn_int.c | 36 ++- src/obidmscolumn_int.h | 8 +- 22 files changed, 406 insertions(+), 111 deletions(-) diff --git a/python/obitools3/obidms/obidmscolumn/obidmscolumn_bool/capidmscolumn_bool.pxd b/python/obitools3/obidms/obidmscolumn/obidmscolumn_bool/capidmscolumn_bool.pxd index cb9b503..b4fc65c 100644 --- a/python/obitools3/obidms/obidmscolumn/obidmscolumn_bool/capidmscolumn_bool.pxd +++ b/python/obitools3/obidms/obidmscolumn/obidmscolumn_bool/capidmscolumn_bool.pxd @@ -3,5 +3,5 @@ from obitools3.obidms.obidmscolumn.capidmscolumn cimport * cdef extern from "obidmscolumn_bool.h" nogil: - int obi_column_set_bool_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obibool_t value); - obibool_t obi_column_get_bool_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); + int obi_column_set_obibool_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obibool_t value); + obibool_t obi_column_get_obibool_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); diff --git a/python/obitools3/obidms/obidmscolumn/obidmscolumn_bool/capidmscolumn_bool.pyx b/python/obitools3/obidms/obidmscolumn/obidmscolumn_bool/capidmscolumn_bool.pyx index 929523f..e3ac95a 100644 --- a/python/obitools3/obidms/obidmscolumn/obidmscolumn_bool/capidmscolumn_bool.pyx +++ b/python/obitools3/obidms/obidmscolumn/obidmscolumn_bool/capidmscolumn_bool.pyx @@ -6,7 +6,7 @@ from .capidmscolumn_bool cimport * cdef class OBIDMS_column_bool(OBIDMS_column) : def get_item(self, line_nb, element_name): - return obi_column_get_bool_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8')) + return obi_column_get_obibool_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8')) cdef class OBIDMS_column_bool_read(OBIDMS_column_bool) : @@ -22,7 +22,7 @@ cdef class OBIDMS_column_bool_read(OBIDMS_column_bool) : cdef class OBIDMS_column_bool_writable(OBIDMS_column_bool) : def set_item(self, line_nb, element_name, value): - return obi_column_set_bool_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8'), value) + return obi_column_set_obibool_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8'), value) def close(self): if obi_truncate_and_close_column(self.pointer) < 0 : diff --git a/python/obitools3/obidms/obidmscolumn/obidmscolumn_char/capidmscolumn_char.pxd b/python/obitools3/obidms/obidmscolumn/obidmscolumn_char/capidmscolumn_char.pxd index a56e84d..c2384bb 100644 --- a/python/obitools3/obidms/obidmscolumn/obidmscolumn_char/capidmscolumn_char.pxd +++ b/python/obitools3/obidms/obidmscolumn/obidmscolumn_char/capidmscolumn_char.pxd @@ -3,5 +3,5 @@ from obitools3.obidms.obidmscolumn.capidmscolumn cimport * cdef extern from "obidmscolumn_char.h" nogil: - int obi_column_set_char_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obichar_t* value) - obichar_t* obi_column_get_char_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name) + int obi_column_set_obichar_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obichar_t* value) + obichar_t* obi_column_get_obichar_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name) diff --git a/python/obitools3/obidms/obidmscolumn/obidmscolumn_char/capidmscolumn_char.pyx b/python/obitools3/obidms/obidmscolumn/obidmscolumn_char/capidmscolumn_char.pyx index 6e9bf52..500a292 100644 --- a/python/obitools3/obidms/obidmscolumn/obidmscolumn_char/capidmscolumn_char.pyx +++ b/python/obitools3/obidms/obidmscolumn/obidmscolumn_char/capidmscolumn_char.pyx @@ -6,7 +6,7 @@ from .capidmscolumn_char cimport * cdef class OBIDMS_column_char(OBIDMS_column) : def get_item(self, line_nb, element_name): - return (obi_column_get_char_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8'))).decode(encoding='utf-8')[:1] + return (obi_column_get_obichar_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8'))).decode(encoding='utf-8')[:1] cdef class OBIDMS_column_char_read(OBIDMS_column_char) : @@ -22,7 +22,7 @@ cdef class OBIDMS_column_char_read(OBIDMS_column_char) : cdef class OBIDMS_column_char_writable(OBIDMS_column_char) : def set_item(self, line_nb, element_name, value): - return obi_column_set_char_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8'), value.encode('utf-8')) + return obi_column_set_obichar_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8'), value.encode('utf-8')) def close(self): if obi_truncate_and_close_column(self.pointer) < 0 : diff --git a/python/obitools3/obidms/obidmscolumn/obidmscolumn_float/capidmscolumn_float.pxd b/python/obitools3/obidms/obidmscolumn/obidmscolumn_float/capidmscolumn_float.pxd index 65e775d..f250281 100644 --- a/python/obitools3/obidms/obidmscolumn/obidmscolumn_float/capidmscolumn_float.pxd +++ b/python/obitools3/obidms/obidmscolumn/obidmscolumn_float/capidmscolumn_float.pxd @@ -3,5 +3,5 @@ from obitools3.obidms.obidmscolumn.capidmscolumn cimport * cdef extern from "obidmscolumn_float.h" nogil: - int obi_column_set_float_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obifloat_t value); - obifloat_t obi_column_get_float_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); + int obi_column_set_obifloat_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obifloat_t value); + obifloat_t obi_column_get_obifloat_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); diff --git a/python/obitools3/obidms/obidmscolumn/obidmscolumn_float/capidmscolumn_float.pyx b/python/obitools3/obidms/obidmscolumn/obidmscolumn_float/capidmscolumn_float.pyx index 273d75a..9f36fee 100644 --- a/python/obitools3/obidms/obidmscolumn/obidmscolumn_float/capidmscolumn_float.pyx +++ b/python/obitools3/obidms/obidmscolumn/obidmscolumn_float/capidmscolumn_float.pyx @@ -6,7 +6,7 @@ from .capidmscolumn_float cimport * cdef class OBIDMS_column_float(OBIDMS_column) : def get_item(self, line_nb, element_name): - return obi_column_get_float_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8')) + return obi_column_get_obifloat_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8')) cdef class OBIDMS_column_float_read(OBIDMS_column_float) : @@ -22,7 +22,7 @@ cdef class OBIDMS_column_float_read(OBIDMS_column_float) : cdef class OBIDMS_column_float_writable(OBIDMS_column_float) : def set_item(self, line_nb, element_name, value): - return obi_column_set_float_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8'), value) + return obi_column_set_obifloat_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8'), value) def close(self): if obi_truncate_and_close_column(self.pointer) < 0 : diff --git a/python/obitools3/obidms/obidmscolumn/obidmscolumn_idx/capidmscolumn_idx.pxd b/python/obitools3/obidms/obidmscolumn/obidmscolumn_idx/capidmscolumn_idx.pxd index 020c044..200f037 100644 --- a/python/obitools3/obidms/obidmscolumn/obidmscolumn_idx/capidmscolumn_idx.pxd +++ b/python/obitools3/obidms/obidmscolumn/obidmscolumn_idx/capidmscolumn_idx.pxd @@ -3,5 +3,5 @@ from obitools3.obidms.obidmscolumn.capidmscolumn cimport * cdef extern from "obidmscolumn_idx.h" nogil: - int obi_column_set_idx_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obiidx_t value); - obiidx_t obi_column_get_idx_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); + int obi_column_set_obiidx_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obiidx_t value); + obiidx_t obi_column_get_obiidx_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); diff --git a/python/obitools3/obidms/obidmscolumn/obidmscolumn_idx/capidmscolumn_idx.pyx b/python/obitools3/obidms/obidmscolumn/obidmscolumn_idx/capidmscolumn_idx.pyx index bfafb0b..a4474a3 100644 --- a/python/obitools3/obidms/obidmscolumn/obidmscolumn_idx/capidmscolumn_idx.pyx +++ b/python/obitools3/obidms/obidmscolumn/obidmscolumn_idx/capidmscolumn_idx.pyx @@ -6,7 +6,7 @@ from .capidmscolumn_idx cimport * cdef class OBIDMS_column_idx(OBIDMS_column) : def get_item(self, line_nb, element_name): - return obi_column_get_idx_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8')) + return obi_column_get_obiidx_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8')) cdef class OBIDMS_column_idx_read(OBIDMS_column_idx) : @@ -22,7 +22,7 @@ cdef class OBIDMS_column_idx_read(OBIDMS_column_idx) : cdef class OBIDMS_column_idx_writable(OBIDMS_column_idx) : def set_item(self, line_nb, element_name, value): - return obi_column_set_idx_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8'), value) + return obi_column_set_obiidx_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8'), value) def close(self): if obi_truncate_and_close_column(self.pointer) < 0 : diff --git a/python/obitools3/obidms/obidmscolumn/obidmscolumn_int/capidmscolumn_int.pxd b/python/obitools3/obidms/obidmscolumn/obidmscolumn_int/capidmscolumn_int.pxd index 6af0835..292eee1 100644 --- a/python/obitools3/obidms/obidmscolumn/obidmscolumn_int/capidmscolumn_int.pxd +++ b/python/obitools3/obidms/obidmscolumn/obidmscolumn_int/capidmscolumn_int.pxd @@ -3,5 +3,5 @@ from obitools3.obidms.obidmscolumn.capidmscolumn cimport * cdef extern from "obidmscolumn_int.h" nogil: - int obi_column_set_int_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obiint_t value); - obiint_t obi_column_get_int_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); + int obi_column_set_obiint_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obiint_t value); + obiint_t obi_column_get_obiint_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); diff --git a/python/obitools3/obidms/obidmscolumn/obidmscolumn_int/capidmscolumn_int.pyx b/python/obitools3/obidms/obidmscolumn/obidmscolumn_int/capidmscolumn_int.pyx index 4146f9f..9e2a96e 100644 --- a/python/obitools3/obidms/obidmscolumn/obidmscolumn_int/capidmscolumn_int.pyx +++ b/python/obitools3/obidms/obidmscolumn/obidmscolumn_int/capidmscolumn_int.pyx @@ -6,7 +6,7 @@ from .capidmscolumn_int cimport * cdef class OBIDMS_column_int(OBIDMS_column) : def get_item(self, line_nb, element_name): - return obi_column_get_int_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8')) + return obi_column_get_obiint_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8')) cdef class OBIDMS_column_int_read(OBIDMS_column_int) : @@ -22,7 +22,7 @@ cdef class OBIDMS_column_int_read(OBIDMS_column_int) : cdef class OBIDMS_column_int_writable(OBIDMS_column_int) : def set_item(self, line_nb, element_name, value): - return obi_column_set_int_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8'), value) + return obi_column_set_obiint_with_elt_name(self.pointer, line_nb, element_name.encode('utf-8'), value) def close(self): if obi_truncate_and_close_column(self.pointer) < 0 : diff --git a/src/obidmscolumn.c b/src/obidmscolumn.c index b4e7075..4506113 100644 --- a/src/obidmscolumn.c +++ b/src/obidmscolumn.c @@ -600,7 +600,6 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms, int column_dir_file_descriptor; size_t header_size; size_t data_size; - size_t i, nb_elements; new_column = NULL; @@ -732,41 +731,7 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms, strncpy(header->name, column_name, OBIDMS_MAX_COLNAME); // Fill the data with NA values - nb_elements = nb_lines*nb_elements_per_line; - switch (type) { - case OBI_VOID: // TODO; - break; - - case OBI_INT: for (i=0;idata)) + i) = OBIInt_NA; - } - break; - - case OBI_FLOAT: for (i=0;idata)) + i) = OBIFloat_NA; - } - break; - - case OBI_BOOL: for (i=0;idata)) + i) = OBIBool_NA; - } - break; - - case OBI_CHAR: for (i=0;idata)) + i) = OBIChar_NA; - } - break; - - case OBI_IDX: for (i=0;idata)) + i) = OBIIdx_NA; - } - break; - } + obi_ini_to_NA_values (new_column, 0, nb_lines); free(column_file_name); close(column_file_descriptor); @@ -1006,7 +971,7 @@ int obi_truncate_column_to_lines_used(OBIDMS_column_p column) } // Open the column file - column_file_descriptor = openat(column_dir_file_descriptor, column_file_name, O_RDWR | O_CREAT); + column_file_descriptor = openat(column_dir_file_descriptor, column_file_name, O_RDWR); if (column_file_descriptor < 0) { obi_set_errno(OBICOL_UNKNOWN_ERROR); @@ -1066,6 +1031,139 @@ int obi_truncate_column_to_lines_used(OBIDMS_column_p column) } +int obi_enlarge_column(OBIDMS_column_p column) +{ + size_t file_size; + size_t old_data_size; + size_t new_data_size; + size_t header_size; + size_t old_line_count; + size_t new_line_count; + int column_dir_file_descriptor; + int column_file_descriptor; + char* column_file_name; + + // Get the file descriptor associated to the column directory + column_dir_file_descriptor = dirfd((column->column_directory)->directory); + if (column_dir_file_descriptor < 0) + { + obi_set_errno(OBICOLDIR_UNKNOWN_ERROR); + obidebug(1, "\nError getting the file descriptor for a column directory"); + return -1; + } + + // Get the column file name + column_file_name = build_column_file_name((column->header)->name, (column->header)->version); + if (column_file_name == NULL) + { + return -1; + } + + // Open the column file + column_file_descriptor = openat(column_dir_file_descriptor, column_file_name, O_RDWR | O_CREAT); + if (column_file_descriptor < 0) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError getting the file descriptor of a column file"); + free(column_file_name); + return -1; + } + + // Calculate the new file size + old_line_count = (column->header)->line_count; + new_line_count = old_line_count * GROWTH_FACTOR; + if (new_line_count > MAXIMUM_LINE_COUNT) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError enlarging a column file: new line count greater than the maximum allowed"); + free(column_file_name); + close(column_file_descriptor); + return -1; + } + old_data_size = (column->header)->line_count * (column->header)->nb_elements_per_line * sizeof((column->header)->data_type); + new_data_size = old_data_size * GROWTH_FACTOR; + header_size = (column->header)->header_size; + file_size = header_size + new_data_size; + + // Unmap the data + if (munmap(column->data, old_data_size) < 0) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError munmapping the data of a column before enlarging"); + free(column_file_name); + close(column_file_descriptor); + return -1; + } + + // Unmap the header + if (munmap(column->header, header_size) < 0) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError munmapping the header of a column before enlarging"); + free(column_file_name); + close(column_file_descriptor); + return -1; + } + + // Enlarge the file + if (ftruncate(column_file_descriptor, file_size) < 0) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError enlarging a column file"); + free(column_file_name); + close(column_file_descriptor); + return -1; + } + + // Remap the header (TODO not sure if necessary??) + column->header = mmap(NULL, + header_size, + PROT_READ | PROT_WRITE, + MAP_SHARED, + column_file_descriptor, + 0 + ); + + if (column->header == MAP_FAILED) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError mmapping the header of a column after enlarging file"); + close(column_file_descriptor); + free(column_file_name); + return -1; + } + + // Remap the data + column->data = mmap(NULL, + new_data_size, + PROT_READ | PROT_WRITE, + MAP_SHARED, + column_file_descriptor, + (column->header)->header_size + ); + + if (column->data == MAP_FAILED) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError re-mmapping the data of a column after enlarging the file"); + free(column_file_name); + close(column_file_descriptor); + return -1; + } + + // Set new line count + (column->header)->line_count = new_line_count; + + // Initialize new data lines to NA + obi_ini_to_NA_values(column, old_line_count, new_line_count - old_line_count); + + free(column_file_name); + close(column_file_descriptor); + + return 0; +} + + int obi_truncate_and_close_column(OBIDMS_column_p column) { if (obi_truncate_column_to_lines_used(column) < 0) @@ -1077,6 +1175,50 @@ int obi_truncate_and_close_column(OBIDMS_column_p column) } +void obi_ini_to_NA_values(OBIDMS_column_p column, size_t start, size_t nb_lines) +{ + size_t i, end, nb_elements; + + nb_elements = nb_lines*((column->header)->nb_elements_per_line); + end = start + nb_elements; + + switch ((column->header)->data_type) { + case OBI_VOID: // TODO; + break; + + case OBI_INT: for (i=start;idata)) + i) = OBIInt_NA; + } + break; + + case OBI_FLOAT: for (i=start;idata)) + i) = OBIFloat_NA; + } + break; + + case OBI_BOOL: for (i=start;idata)) + i) = OBIBool_NA; + } + break; + + case OBI_CHAR: for (i=start;idata)) + i) = OBIChar_NA; + } + break; + + case OBI_IDX: for (i=start;idata)) + i) = OBIIdx_NA; + } + break; + } +} + + void obi_column_make_unwritable(OBIDMS_column_p column) { column->writable = false; diff --git a/src/obidmscolumn.h b/src/obidmscolumn.h index cfe77ec..deb917e 100644 --- a/src/obidmscolumn.h +++ b/src/obidmscolumn.h @@ -27,6 +27,8 @@ #define ELEMENTS_NAMES_MAX (2048) #define INITIAL_LINE_COUNT (1000) +#define GROWTH_FACTOR (2) +#define MAXIMUM_LINE_COUNT (1000000) typedef int32_t obiversion_t; /**< Used to store the column version number @@ -205,6 +207,20 @@ int obi_close_column(OBIDMS_column_p column); int obi_truncate_column_to_lines_used(OBIDMS_column_p column); +/** + * @brief Enlarges a column file. + * + * @param column a pointer on an OBIDMS column + * + * @return 0 if the operation was successfully completed + * @return -1 if an error occurred + * + * @since August 2015 + * @author Celine Mercier (celine.mercier@metabarcoding.org) + */ +int obi_enlarge_column(OBIDMS_column_p column); + + /** * @brief Truncates a column file to the number of lines used and closes it. * @@ -219,6 +235,19 @@ int obi_truncate_column_to_lines_used(OBIDMS_column_p column); int obi_truncate_and_close_column(OBIDMS_column_p column); +/* + * @brief Sets the data in a column to the NA value of the data type. + * + * @param column a pointer on an OBIDMS column + * @param start the first line number of the block that should be set + * @param nb_lines the number of lines that should be set + * + * @since August 2015 + * @author Celine Mercier (celine.mercier@metabarcoding.org) + */ +void obi_ini_to_NA_values(OBIDMS_column_p column, size_t start, size_t nb_lines); + + /** * @brief Sets the 'writable' header attribute of an OBIDMS column to False. * diff --git a/src/obidmscolumn_bool.c b/src/obidmscolumn_bool.c index 9d5d3c6..f272706 100644 --- a/src/obidmscolumn_bool.c +++ b/src/obidmscolumn_bool.c @@ -28,23 +28,47 @@ * **********************************************************************/ -int obi_column_set_bool_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obibool_t value) +int obi_column_set_obibool_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obibool_t value) { + // Check that the line number is not greater than the maximum allowed + if (line_nb >= MAXIMUM_LINE_COUNT) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError trying to set a value at a line number greater than the maximum allowed"); + return -1; + } + + // Check if the file needs to be enlarged + while ((line_nb+1) > (column->header)->line_count) + { + // Enlarge the file + if (obi_enlarge_column(column) < 0) + return -1; + } + // Update lines used if ((line_nb+1) > (column->header)->lines_used) (column->header)->lines_used = line_nb+1; + + // Set the value *(((obibool_t*) (column->data)) + (line_nb * ((column->header)->nb_elements_per_line)) + element_idx) = value; + return 0; } -obibool_t obi_column_get_bool_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx) +obibool_t obi_column_get_obibool_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx) { + if ((line_nb+1) > (column->header)->line_count) + { + obidebug(1, "\nError trying to get a value that is beyond the current line count"); + return -1; // TODO return NA value? + } return *(((obibool_t*) (column->data)) + (line_nb * ((column->header)->nb_elements_per_line)) + element_idx); } -int obi_column_set_bool_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obibool_t value) +int obi_column_set_obibool_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obibool_t value) { size_t element_idx; @@ -66,13 +90,13 @@ int obi_column_set_bool_with_elt_name(OBIDMS_column_p column, size_t line_nb, ch return -1; } - obi_column_set_bool_with_elt_idx(column, line_nb, element_idx, value); + obi_column_set_obibool_with_elt_idx(column, line_nb, element_idx, value); return 0; } -obibool_t obi_column_get_bool_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name) +obibool_t obi_column_get_obibool_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name) { size_t element_idx; @@ -94,5 +118,6 @@ obibool_t obi_column_get_bool_with_elt_name(OBIDMS_column_p column, size_t line_ return -1; } - return obi_column_get_bool_with_elt_idx(column, line_nb, element_idx); + return obi_column_get_obibool_with_elt_idx(column, line_nb, element_idx); } + diff --git a/src/obidmscolumn_bool.h b/src/obidmscolumn_bool.h index bd1aea0..928a7f6 100644 --- a/src/obidmscolumn_bool.h +++ b/src/obidmscolumn_bool.h @@ -37,7 +37,7 @@ * @since July 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -int obi_column_set_bool_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obibool_t value); +int obi_column_set_obibool_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obibool_t value); /** @@ -54,7 +54,7 @@ int obi_column_set_bool_with_elt_idx(OBIDMS_column_p column, size_t line_nb, siz * @since July 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -obibool_t obi_column_get_bool_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx); +obibool_t obi_column_get_obibool_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx); /** @@ -78,7 +78,7 @@ obibool_t obi_column_get_bool_with_elt_idx(OBIDMS_column_p column, size_t line_n * @since August 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -int obi_column_set_bool_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obibool_t value); +int obi_column_set_obibool_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obibool_t value); /** @@ -97,5 +97,5 @@ int obi_column_set_bool_with_elt_name(OBIDMS_column_p column, size_t line_nb, ch * @since August 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -obibool_t obi_column_get_bool_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); +obibool_t obi_column_get_obibool_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); diff --git a/src/obidmscolumn_char.c b/src/obidmscolumn_char.c index 88b5ba2..adedb67 100644 --- a/src/obidmscolumn_char.c +++ b/src/obidmscolumn_char.c @@ -28,23 +28,47 @@ * **********************************************************************/ -int obi_column_set_char_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obichar_t* value) +int obi_column_set_obichar_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obichar_t value) { + // Check that the line number is not greater than the maximum allowed + if (line_nb >= MAXIMUM_LINE_COUNT) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError trying to set a value at a line number greater than the maximum allowed"); + return -1; + } + + // Check if the file needs to be enlarged + while ((line_nb+1) > (column->header)->line_count) + { + // Enlarge the file + if (obi_enlarge_column(column) < 0) + return -1; + } + // Update lines used if ((line_nb+1) > (column->header)->lines_used) (column->header)->lines_used = line_nb+1; - *(((obichar_t*) (column->data)) + (line_nb * ((column->header)->nb_elements_per_line)) + element_idx) = value[0]; + + // Set the value + *(((obichar_t*) (column->data)) + (line_nb * ((column->header)->nb_elements_per_line)) + element_idx) = value; + return 0; } -obichar_t* obi_column_get_char_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx) +obichar_t obi_column_get_obichar_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx) { - return ((obichar_t*) (column->data)) + (line_nb * ((column->header)->nb_elements_per_line)) + element_idx; + if ((line_nb+1) > (column->header)->line_count) + { + obidebug(1, "\nError trying to get a value that is beyond the current line count"); + return '\0'; // TODO return NA value? + } + return *(((obichar_t*) (column->data)) + (line_nb * ((column->header)->nb_elements_per_line)) + element_idx); } -int obi_column_set_char_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obichar_t* value) +int obi_column_set_obichar_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obichar_t value) { size_t element_idx; @@ -66,13 +90,13 @@ int obi_column_set_char_with_elt_name(OBIDMS_column_p column, size_t line_nb, ch return -1; } - obi_column_set_char_with_elt_idx(column, line_nb, element_idx, value); + obi_column_set_obichar_with_elt_idx(column, line_nb, element_idx, value); return 0; } -obichar_t* obi_column_get_char_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name) +obichar_t obi_column_get_obichar_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name) { size_t element_idx; @@ -84,15 +108,16 @@ obichar_t* obi_column_get_char_with_elt_name(OBIDMS_column_p column, size_t line { obi_set_errno(OBICOL_UNKNOWN_ERROR); obidebug(1, "\nAn element name must be specified"); - return NULL; + return '\0'; // TODO } } else { element_idx = obi_column_get_element_index_from_name(column, element_name); if (element_idx == -1) - return NULL; + return '\0'; // TODO } - return obi_column_get_char_with_elt_idx(column, line_nb, element_idx); + return obi_column_get_obichar_with_elt_idx(column, line_nb, element_idx); } + diff --git a/src/obidmscolumn_char.h b/src/obidmscolumn_char.h index bbf76de..e973b76 100644 --- a/src/obidmscolumn_char.h +++ b/src/obidmscolumn_char.h @@ -37,7 +37,7 @@ * @since July 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -int obi_column_set_char_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obichar_t* value); +int obi_column_set_obichar_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obichar_t* value); /** @@ -54,7 +54,7 @@ int obi_column_set_char_with_elt_idx(OBIDMS_column_p column, size_t line_nb, siz * @since July 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -obichar_t* obi_column_get_char_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx); +obichar_t* obi_column_get_obichar_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx); /** @@ -78,7 +78,7 @@ obichar_t* obi_column_get_char_with_elt_idx(OBIDMS_column_p column, size_t line_ * @since August 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -int obi_column_set_char_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obichar_t* value); +int obi_column_set_obichar_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obichar_t* value); /** @@ -97,5 +97,5 @@ int obi_column_set_char_with_elt_name(OBIDMS_column_p column, size_t line_nb, ch * @since August 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -obichar_t* obi_column_get_char_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); +obichar_t* obi_column_get_obichar_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); diff --git a/src/obidmscolumn_float.c b/src/obidmscolumn_float.c index 60e1788..319aa53 100644 --- a/src/obidmscolumn_float.c +++ b/src/obidmscolumn_float.c @@ -28,23 +28,47 @@ * **********************************************************************/ -int obi_column_set_float_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obifloat_t value) +int obi_column_set_obifloat_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obifloat_t value) { + // Check that the line number is not greater than the maximum allowed + if (line_nb >= MAXIMUM_LINE_COUNT) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError trying to set a value at a line number greater than the maximum allowed"); + return -1; + } + + // Check if the file needs to be enlarged + while ((line_nb+1) > (column->header)->line_count) + { + // Enlarge the file + if (obi_enlarge_column(column) < 0) + return -1; + } + // Update lines used if ((line_nb+1) > (column->header)->lines_used) (column->header)->lines_used = line_nb+1; + + // Set the value *(((obifloat_t*) (column->data)) + (line_nb * ((column->header)->nb_elements_per_line)) + element_idx) = value; + return 0; } -obifloat_t obi_column_get_float_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx) +obifloat_t obi_column_get_obifloat_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx) { + if ((line_nb+1) > (column->header)->line_count) + { + obidebug(1, "\nError trying to get a value that is beyond the current line count"); + return -1; // TODO return NA value? + } return *(((obifloat_t*) (column->data)) + (line_nb * ((column->header)->nb_elements_per_line)) + element_idx); } -int obi_column_set_float_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obifloat_t value) +int obi_column_set_obifloat_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obifloat_t value) { size_t element_idx; @@ -66,13 +90,13 @@ int obi_column_set_float_with_elt_name(OBIDMS_column_p column, size_t line_nb, c return -1; } - obi_column_set_float_with_elt_idx(column, line_nb, element_idx, value); + obi_column_set_obifloat_with_elt_idx(column, line_nb, element_idx, value); return 0; } -obifloat_t obi_column_get_float_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name) +obifloat_t obi_column_get_obifloat_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name) { size_t element_idx; @@ -94,5 +118,6 @@ obifloat_t obi_column_get_float_with_elt_name(OBIDMS_column_p column, size_t lin return -1; } - return obi_column_get_float_with_elt_idx(column, line_nb, element_idx); + return obi_column_get_obifloat_with_elt_idx(column, line_nb, element_idx); } + diff --git a/src/obidmscolumn_float.h b/src/obidmscolumn_float.h index 9ef3d4b..13de51f 100644 --- a/src/obidmscolumn_float.h +++ b/src/obidmscolumn_float.h @@ -37,7 +37,7 @@ * @since July 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -int obi_column_set_float_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obifloat_t value); +int obi_column_set_obifloat_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obifloat_t value); /** @@ -54,7 +54,7 @@ int obi_column_set_float_with_elt_idx(OBIDMS_column_p column, size_t line_nb, si * @since July 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -obifloat_t obi_column_get_float_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx); +obifloat_t obi_column_get_obifloat_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx); /** @@ -78,7 +78,7 @@ obifloat_t obi_column_get_float_with_elt_idx(OBIDMS_column_p column, size_t line * @since August 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -int obi_column_set_float_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obifloat_t value); +int obi_column_set_obifloat_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obifloat_t value); /** @@ -97,5 +97,5 @@ int obi_column_set_float_with_elt_name(OBIDMS_column_p column, size_t line_nb, c * @since August 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -obifloat_t obi_column_get_float_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); +obifloat_t obi_column_get_obifloat_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); diff --git a/src/obidmscolumn_idx.c b/src/obidmscolumn_idx.c index e958d34..aeac350 100644 --- a/src/obidmscolumn_idx.c +++ b/src/obidmscolumn_idx.c @@ -28,23 +28,47 @@ * **********************************************************************/ -int obi_column_set_idx_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obiidx_t value) +int obi_column_set_obiidx_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obiidx_t value) { + // Check that the line number is not greater than the maximum allowed + if (line_nb >= MAXIMUM_LINE_COUNT) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError trying to set a value at a line number greater than the maximum allowed"); + return -1; + } + + // Check if the file needs to be enlarged + while ((line_nb+1) > (column->header)->line_count) + { + // Enlarge the file + if (obi_enlarge_column(column) < 0) + return -1; + } + // Update lines used if ((line_nb+1) > (column->header)->lines_used) (column->header)->lines_used = line_nb+1; + + // Set the value *(((obiidx_t*) (column->data)) + (line_nb * ((column->header)->nb_elements_per_line)) + element_idx) = value; + return 0; } -obiidx_t obi_column_get_idx_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx) +obiidx_t obi_column_get_obiidx_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx) { + if ((line_nb+1) > (column->header)->line_count) + { + obidebug(1, "\nError trying to get a value that is beyond the current line count"); + return -1; // TODO return NA value? + } return *(((obiidx_t*) (column->data)) + (line_nb * ((column->header)->nb_elements_per_line)) + element_idx); } -int obi_column_set_idx_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obiidx_t value) +int obi_column_set_obiidx_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obiidx_t value) { size_t element_idx; @@ -66,13 +90,13 @@ int obi_column_set_idx_with_elt_name(OBIDMS_column_p column, size_t line_nb, cha return -1; } - obi_column_set_idx_with_elt_idx(column, line_nb, element_idx, value); + obi_column_set_obiidx_with_elt_idx(column, line_nb, element_idx, value); return 0; } -obiidx_t obi_column_get_idx_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name) +obiidx_t obi_column_get_obiidx_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name) { size_t element_idx; @@ -94,5 +118,6 @@ obiidx_t obi_column_get_idx_with_elt_name(OBIDMS_column_p column, size_t line_nb return -1; } - return obi_column_get_idx_with_elt_idx(column, line_nb, element_idx); + return obi_column_get_obiidx_with_elt_idx(column, line_nb, element_idx); } + diff --git a/src/obidmscolumn_idx.h b/src/obidmscolumn_idx.h index e043d5a..86a69fa 100644 --- a/src/obidmscolumn_idx.h +++ b/src/obidmscolumn_idx.h @@ -37,7 +37,7 @@ * @since July 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -int obi_column_set_idx_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obiidx_t value); +int obi_column_set_obiidx_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obiidx_t value); /** @@ -54,7 +54,7 @@ int obi_column_set_idx_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size * @since July 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -obiidx_t obi_column_get_idx_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx); +obiidx_t obi_column_get_obiidx_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx); /** @@ -78,7 +78,7 @@ obiidx_t obi_column_get_idx_with_elt_idx(OBIDMS_column_p column, size_t line_nb, * @since August 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -int obi_column_set_idx_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obiidx_t value); +int obi_column_set_obiidx_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obiidx_t value); /** @@ -97,5 +97,5 @@ int obi_column_set_idx_with_elt_name(OBIDMS_column_p column, size_t line_nb, cha * @since August 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -obiidx_t obi_column_get_idx_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); +obiidx_t obi_column_get_obiidx_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); diff --git a/src/obidmscolumn_int.c b/src/obidmscolumn_int.c index 15476c2..ae022fe 100644 --- a/src/obidmscolumn_int.c +++ b/src/obidmscolumn_int.c @@ -28,23 +28,47 @@ * **********************************************************************/ -int obi_column_set_int_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obiint_t value) +int obi_column_set_obiint_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obiint_t value) { + // Check that the line number is not greater than the maximum allowed + if (line_nb >= MAXIMUM_LINE_COUNT) + { + obi_set_errno(OBICOL_UNKNOWN_ERROR); + obidebug(1, "\nError trying to set a value at a line number greater than the maximum allowed"); + return -1; + } + + // Check if the file needs to be enlarged + while ((line_nb+1) > (column->header)->line_count) + { + // Enlarge the file + if (obi_enlarge_column(column) < 0) + return -1; + } + // Update lines used if ((line_nb+1) > (column->header)->lines_used) (column->header)->lines_used = line_nb+1; + + // Set the value *(((obiint_t*) (column->data)) + (line_nb * ((column->header)->nb_elements_per_line)) + element_idx) = value; + return 0; } -obiint_t obi_column_get_int_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx) +obiint_t obi_column_get_obiint_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx) { + if ((line_nb+1) > (column->header)->line_count) + { + obidebug(1, "\nError trying to get a value that is beyond the current line count"); + return -1; // TODO return NA value? + } return *(((obiint_t*) (column->data)) + (line_nb * ((column->header)->nb_elements_per_line)) + element_idx); } -int obi_column_set_int_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obiint_t value) +int obi_column_set_obiint_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obiint_t value) { size_t element_idx; @@ -66,13 +90,13 @@ int obi_column_set_int_with_elt_name(OBIDMS_column_p column, size_t line_nb, cha return -1; } - obi_column_set_int_with_elt_idx(column, line_nb, element_idx, value); + obi_column_set_obiint_with_elt_idx(column, line_nb, element_idx, value); return 0; } -obiint_t obi_column_get_int_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name) +obiint_t obi_column_get_obiint_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name) { size_t element_idx; @@ -94,6 +118,6 @@ obiint_t obi_column_get_int_with_elt_name(OBIDMS_column_p column, size_t line_nb return -1; } - return obi_column_get_int_with_elt_idx(column, line_nb, element_idx); + return obi_column_get_obiint_with_elt_idx(column, line_nb, element_idx); } diff --git a/src/obidmscolumn_int.h b/src/obidmscolumn_int.h index ca71653..a3e64d2 100644 --- a/src/obidmscolumn_int.h +++ b/src/obidmscolumn_int.h @@ -37,7 +37,7 @@ * @since July 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -int obi_column_set_int_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obiint_t value); +int obi_column_set_obiint_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obiint_t value); /** @@ -54,7 +54,7 @@ int obi_column_set_int_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size * @since July 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -obiint_t obi_column_get_int_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx); +obiint_t obi_column_get_obiint_with_elt_idx(OBIDMS_column_p column, size_t line_nb, size_t element_idx); /** @@ -78,7 +78,7 @@ obiint_t obi_column_get_int_with_elt_idx(OBIDMS_column_p column, size_t line_nb, * @since August 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -int obi_column_set_int_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obiint_t value); +int obi_column_set_obiint_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name, obiint_t value); /** @@ -97,5 +97,5 @@ int obi_column_set_int_with_elt_name(OBIDMS_column_p column, size_t line_nb, cha * @since August 2015 * @author Celine Mercier (celine.mercier@metabarcoding.org) */ -obiint_t obi_column_get_int_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name); +obiint_t obi_column_get_obiint_with_elt_name(OBIDMS_column_p column, size_t line_nb, char* element_name);