AVLs: made some functions public and changed some rights to be able to
import AVLs from a DMS to another
This commit is contained in:
323
src/obiavl.c
323
src/obiavl.c
@ -41,23 +41,6 @@
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Internal function building the complete AVL name for an AVL with an associated index (for AVL groups).
|
|
||||||
*
|
|
||||||
* @warning The returned pointer has to be freed by the caller.
|
|
||||||
*
|
|
||||||
* @param avl_name The base name of the AVL tree.
|
|
||||||
* @param avl_idx The index associated with that AVL.
|
|
||||||
*
|
|
||||||
* @returns A pointer to the complete name of the AVL.
|
|
||||||
* @retval NULL if an error occurred.
|
|
||||||
*
|
|
||||||
* @since April 2016
|
|
||||||
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
||||||
*/
|
|
||||||
static char* build_avl_name_with_idx(const char* avl_name, int avl_idx);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Internal function building the full path of an AVL directory containing an AVL or an AVL group.
|
* @brief Internal function building the full path of an AVL directory containing an AVL or an AVL group.
|
||||||
*
|
*
|
||||||
@ -107,42 +90,6 @@ static char* build_avl_file_name(const char* avl_name);
|
|||||||
static char* build_avl_data_file_name(const char* avl_name);
|
static char* build_avl_data_file_name(const char* avl_name);
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Internal function building the full path of an AVL tree file.
|
|
||||||
*
|
|
||||||
* @warning The returned pointer has to be freed by the caller.
|
|
||||||
*
|
|
||||||
* @param dms A pointer to the OBIDMS to which the AVL tree belongs.
|
|
||||||
* @param avl_name The name of the AVL tree.
|
|
||||||
* @param avl_idx The index of the AVL if it's part of an AVL group, or -1 if not.
|
|
||||||
*
|
|
||||||
* @returns A pointer to the full path of the file where the AVL tree is stored.
|
|
||||||
* @retval NULL if an error occurred.
|
|
||||||
*
|
|
||||||
* @since May 2016
|
|
||||||
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
||||||
*/
|
|
||||||
static char* get_full_path_of_avl_file_name(OBIDMS_p dms, const char* avl_name, int avl_idx);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Internal function building the file name for an AVL data file.
|
|
||||||
*
|
|
||||||
* @warning The returned pointer has to be freed by the caller.
|
|
||||||
*
|
|
||||||
* @param dms A pointer to the OBIDMS to which the AVL tree belongs.
|
|
||||||
* @param avl_name The name of the AVL tree.
|
|
||||||
* @param avl_idx The index of the AVL if it's part of an AVL group, or -1 if not.
|
|
||||||
*
|
|
||||||
* @returns A pointer to the full path of the file where the data referred to by the AVL tree is stored.
|
|
||||||
* @retval NULL if an error occurred.
|
|
||||||
*
|
|
||||||
* @since May 2016
|
|
||||||
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
|
||||||
*/
|
|
||||||
static char* get_full_path_of_avl_data_file_name(OBIDMS_p dms, const char* avl_name, int avl_idx);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Internal function returning the size of an AVL tree header on this platform,
|
* @brief Internal function returning the size of an AVL tree header on this platform,
|
||||||
* including the size of the bloom filter associated with the AVL tree.
|
* including the size of the bloom filter associated with the AVL tree.
|
||||||
@ -501,36 +448,6 @@ void avl_print(OBIDMS_avl_p avl);
|
|||||||
*
|
*
|
||||||
************************************************************************/
|
************************************************************************/
|
||||||
|
|
||||||
static char* build_avl_name_with_idx(const char* avl_name, int avl_idx)
|
|
||||||
{
|
|
||||||
char* avl_name_with_idx;
|
|
||||||
int avl_idx_length;
|
|
||||||
|
|
||||||
if (avl_idx < 0)
|
|
||||||
{
|
|
||||||
obi_set_errno(OBI_AVL_ERROR);
|
|
||||||
obidebug(1, "\nError building an AVL tree name with index: index < 0");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
avl_idx_length = avl_idx == 0 ? 1 : (int)(log10(avl_idx)+1);
|
|
||||||
avl_name_with_idx = malloc((strlen(avl_name) + avl_idx_length + 2)*sizeof(char));
|
|
||||||
if (avl_name_with_idx == NULL)
|
|
||||||
{
|
|
||||||
obi_set_errno(OBI_MALLOC_ERROR);
|
|
||||||
obidebug(1, "\nError allocating memory for an AVL name");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (sprintf(avl_name_with_idx, "%s_%u", avl_name, avl_idx) < 0)
|
|
||||||
{
|
|
||||||
obi_set_errno(OBI_AVL_ERROR);
|
|
||||||
obidebug(1, "\nError building an AVL tree name with index");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return avl_name_with_idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char* get_full_path_of_avl_dir(OBIDMS_p dms, const char* avl_name)
|
char* get_full_path_of_avl_dir(OBIDMS_p dms, const char* avl_name)
|
||||||
{
|
{
|
||||||
@ -604,102 +521,6 @@ static char* build_avl_data_file_name(const char* avl_name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static char* get_full_path_of_avl_file_name(OBIDMS_p dms, const char* avl_name, int avl_idx)
|
|
||||||
{
|
|
||||||
char* complete_avl_name;
|
|
||||||
char* full_path;
|
|
||||||
char* avl_file_name;
|
|
||||||
|
|
||||||
if (avl_idx >= 0)
|
|
||||||
{
|
|
||||||
complete_avl_name = build_avl_name_with_idx(avl_name, avl_idx);
|
|
||||||
if (complete_avl_name == NULL)
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
complete_avl_name = (char*) malloc((strlen(avl_name)+1)*sizeof(char));
|
|
||||||
if (complete_avl_name == NULL)
|
|
||||||
{
|
|
||||||
obi_set_errno(OBI_MALLOC_ERROR);
|
|
||||||
obidebug(1, "\nError allocating memory for an AVL name");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
strcpy(complete_avl_name, avl_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
avl_file_name = build_avl_file_name(complete_avl_name);
|
|
||||||
if (avl_file_name == NULL)
|
|
||||||
{
|
|
||||||
free(complete_avl_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
full_path = get_full_path_of_avl_dir(dms, avl_name);
|
|
||||||
if (full_path == NULL)
|
|
||||||
{
|
|
||||||
free(complete_avl_name);
|
|
||||||
free(avl_file_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcat(full_path, "/");
|
|
||||||
strcat(full_path, avl_file_name);
|
|
||||||
|
|
||||||
free(complete_avl_name);
|
|
||||||
|
|
||||||
return full_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static char* get_full_path_of_avl_data_file_name(OBIDMS_p dms, const char* avl_name, int avl_idx)
|
|
||||||
{
|
|
||||||
char* complete_avl_name;
|
|
||||||
char* full_path;
|
|
||||||
char* avl_data_file_name;
|
|
||||||
|
|
||||||
if (avl_idx >= 0)
|
|
||||||
{
|
|
||||||
complete_avl_name = build_avl_name_with_idx(avl_name, avl_idx);
|
|
||||||
if (complete_avl_name == NULL)
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
complete_avl_name = (char*) malloc((strlen(avl_name)+1)*sizeof(char));
|
|
||||||
if (complete_avl_name == NULL)
|
|
||||||
{
|
|
||||||
obi_set_errno(OBI_MALLOC_ERROR);
|
|
||||||
obidebug(1, "\nError allocating memory for an AVL name");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
strcpy(complete_avl_name, avl_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
avl_data_file_name = build_avl_data_file_name(complete_avl_name);
|
|
||||||
if (avl_data_file_name == NULL)
|
|
||||||
{
|
|
||||||
free(complete_avl_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
full_path = get_full_path_of_avl_dir(dms, avl_name);
|
|
||||||
if (full_path == NULL)
|
|
||||||
{
|
|
||||||
free(complete_avl_name);
|
|
||||||
free(avl_data_file_name);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcat(full_path, "/");
|
|
||||||
strcat(full_path, avl_data_file_name);
|
|
||||||
|
|
||||||
free(complete_avl_name);
|
|
||||||
|
|
||||||
return full_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
size_t get_avl_header_size()
|
size_t get_avl_header_size()
|
||||||
{
|
{
|
||||||
size_t header_size;
|
size_t header_size;
|
||||||
@ -1103,13 +924,13 @@ int add_new_avl_in_group(OBIDMS_avl_group_p avl_group)
|
|||||||
|
|
||||||
int add_existing_avl_in_group(OBIDMS_avl_group_p avl_group_dest, OBIDMS_avl_group_p avl_group_source, int avl_idx)
|
int add_existing_avl_in_group(OBIDMS_avl_group_p avl_group_dest, OBIDMS_avl_group_p avl_group_source, int avl_idx)
|
||||||
{
|
{
|
||||||
if (link(get_full_path_of_avl_file_name(avl_group_source->dms, avl_group_source->name, avl_idx), get_full_path_of_avl_file_name(avl_group_dest->dms, avl_group_dest->name, avl_idx)) < 0)
|
if (link(obi_get_full_path_of_avl_file_name(avl_group_source->dms, avl_group_source->name, avl_idx), obi_get_full_path_of_avl_file_name(avl_group_dest->dms, avl_group_dest->name, avl_idx)) < 0)
|
||||||
{
|
{
|
||||||
obi_set_errno(OBI_AVL_ERROR);
|
obi_set_errno(OBI_AVL_ERROR);
|
||||||
obidebug(1, "\nError creating a hard link to an existing AVL tree file");
|
obidebug(1, "\nError creating a hard link to an existing AVL tree file");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (link(get_full_path_of_avl_data_file_name(avl_group_source->dms, avl_group_source->name, avl_idx), get_full_path_of_avl_data_file_name(avl_group_dest->dms, avl_group_dest->name, avl_idx)) < 0)
|
if (link(obi_get_full_path_of_avl_data_file_name(avl_group_source->dms, avl_group_source->name, avl_idx), obi_get_full_path_of_avl_data_file_name(avl_group_dest->dms, avl_group_dest->name, avl_idx)) < 0)
|
||||||
{
|
{
|
||||||
obi_set_errno(OBI_AVL_ERROR);
|
obi_set_errno(OBI_AVL_ERROR);
|
||||||
obidebug(1, "\nError creating a hard link to an existing AVL data file");
|
obidebug(1, "\nError creating a hard link to an existing AVL data file");
|
||||||
@ -1400,6 +1221,134 @@ void avl_print(OBIDMS_avl_p avl)
|
|||||||
*
|
*
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
char* obi_build_avl_name_with_idx(const char* avl_name, int avl_idx)
|
||||||
|
{
|
||||||
|
char* avl_name_with_idx;
|
||||||
|
int avl_idx_length;
|
||||||
|
|
||||||
|
if (avl_idx < 0)
|
||||||
|
{
|
||||||
|
obi_set_errno(OBI_AVL_ERROR);
|
||||||
|
obidebug(1, "\nError building an AVL tree name with index: index < 0");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
avl_idx_length = avl_idx == 0 ? 1 : (int)(log10(avl_idx)+1);
|
||||||
|
avl_name_with_idx = malloc((strlen(avl_name) + avl_idx_length + 2)*sizeof(char));
|
||||||
|
if (avl_name_with_idx == NULL)
|
||||||
|
{
|
||||||
|
obi_set_errno(OBI_MALLOC_ERROR);
|
||||||
|
obidebug(1, "\nError allocating memory for an AVL name");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (sprintf(avl_name_with_idx, "%s_%u", avl_name, avl_idx) < 0)
|
||||||
|
{
|
||||||
|
obi_set_errno(OBI_AVL_ERROR);
|
||||||
|
obidebug(1, "\nError building an AVL tree name with index");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return avl_name_with_idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char* obi_get_full_path_of_avl_file_name(OBIDMS_p dms, const char* avl_name, int avl_idx)
|
||||||
|
{
|
||||||
|
char* complete_avl_name;
|
||||||
|
char* full_path;
|
||||||
|
char* avl_file_name;
|
||||||
|
|
||||||
|
if (avl_idx >= 0)
|
||||||
|
{
|
||||||
|
complete_avl_name = obi_build_avl_name_with_idx(avl_name, avl_idx);
|
||||||
|
if (complete_avl_name == NULL)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
complete_avl_name = (char*) malloc((strlen(avl_name)+1)*sizeof(char));
|
||||||
|
if (complete_avl_name == NULL)
|
||||||
|
{
|
||||||
|
obi_set_errno(OBI_MALLOC_ERROR);
|
||||||
|
obidebug(1, "\nError allocating memory for an AVL name");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
strcpy(complete_avl_name, avl_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
avl_file_name = build_avl_file_name(complete_avl_name);
|
||||||
|
if (avl_file_name == NULL)
|
||||||
|
{
|
||||||
|
free(complete_avl_name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
full_path = get_full_path_of_avl_dir(dms, avl_name);
|
||||||
|
if (full_path == NULL)
|
||||||
|
{
|
||||||
|
free(complete_avl_name);
|
||||||
|
free(avl_file_name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcat(full_path, "/");
|
||||||
|
strcat(full_path, avl_file_name);
|
||||||
|
|
||||||
|
free(complete_avl_name);
|
||||||
|
|
||||||
|
return full_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char* obi_get_full_path_of_avl_data_file_name(OBIDMS_p dms, const char* avl_name, int avl_idx)
|
||||||
|
{
|
||||||
|
char* complete_avl_name;
|
||||||
|
char* full_path;
|
||||||
|
char* avl_data_file_name;
|
||||||
|
|
||||||
|
if (avl_idx >= 0)
|
||||||
|
{
|
||||||
|
complete_avl_name = obi_build_avl_name_with_idx(avl_name, avl_idx);
|
||||||
|
if (complete_avl_name == NULL)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
complete_avl_name = (char*) malloc((strlen(avl_name)+1)*sizeof(char));
|
||||||
|
if (complete_avl_name == NULL)
|
||||||
|
{
|
||||||
|
obi_set_errno(OBI_MALLOC_ERROR);
|
||||||
|
obidebug(1, "\nError allocating memory for an AVL name");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
strcpy(complete_avl_name, avl_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
avl_data_file_name = build_avl_data_file_name(complete_avl_name);
|
||||||
|
if (avl_data_file_name == NULL)
|
||||||
|
{
|
||||||
|
free(complete_avl_name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
full_path = get_full_path_of_avl_dir(dms, avl_name);
|
||||||
|
if (full_path == NULL)
|
||||||
|
{
|
||||||
|
free(complete_avl_name);
|
||||||
|
free(avl_data_file_name);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcat(full_path, "/");
|
||||||
|
strcat(full_path, avl_data_file_name);
|
||||||
|
|
||||||
|
free(complete_avl_name);
|
||||||
|
|
||||||
|
return full_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int obi_avl_exists(OBIDMS_p dms, const char* avl_name)
|
int obi_avl_exists(OBIDMS_p dms, const char* avl_name)
|
||||||
{
|
{
|
||||||
struct stat buffer;
|
struct stat buffer;
|
||||||
@ -1443,7 +1392,7 @@ OBIDMS_avl_p obi_create_avl(OBIDMS_p dms, const char* avl_name, int avl_idx)
|
|||||||
// Get complete name of AVL if index
|
// Get complete name of AVL if index
|
||||||
if (avl_idx >= 0)
|
if (avl_idx >= 0)
|
||||||
{
|
{
|
||||||
complete_avl_name = build_avl_name_with_idx(avl_name, avl_idx);
|
complete_avl_name = obi_build_avl_name_with_idx(avl_name, avl_idx);
|
||||||
if (complete_avl_name == NULL)
|
if (complete_avl_name == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1740,7 +1689,7 @@ OBIDMS_avl_p obi_open_avl(OBIDMS_p dms, const char* avl_name, int avl_idx)
|
|||||||
// Get complete name of AVL if index
|
// Get complete name of AVL if index
|
||||||
if (avl_idx >= 0)
|
if (avl_idx >= 0)
|
||||||
{
|
{
|
||||||
complete_avl_name = build_avl_name_with_idx(avl_name, avl_idx);
|
complete_avl_name = obi_build_avl_name_with_idx(avl_name, avl_idx);
|
||||||
if (complete_avl_name == NULL)
|
if (complete_avl_name == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1794,7 +1743,7 @@ OBIDMS_avl_p obi_open_avl(OBIDMS_p dms, const char* avl_name, int avl_idx)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// Open file
|
// Open file
|
||||||
avl_data_file_descriptor = openat(avl_dir_file_descriptor, avl_data_file_name, O_RDONLY, 0777);
|
avl_data_file_descriptor = openat(avl_dir_file_descriptor, avl_data_file_name, O_RDWR, 0777);
|
||||||
if (avl_data_file_descriptor < 0)
|
if (avl_data_file_descriptor < 0)
|
||||||
{
|
{
|
||||||
obi_set_errno(OBI_AVL_ERROR);
|
obi_set_errno(OBI_AVL_ERROR);
|
||||||
@ -1832,7 +1781,7 @@ OBIDMS_avl_p obi_open_avl(OBIDMS_p dms, const char* avl_name, int avl_idx)
|
|||||||
// Fill the avl data structure
|
// Fill the avl data structure
|
||||||
avl_data->header = mmap(NULL,
|
avl_data->header = mmap(NULL,
|
||||||
header_size,
|
header_size,
|
||||||
PROT_READ,
|
PROT_READ | PROT_WRITE,
|
||||||
MAP_SHARED,
|
MAP_SHARED,
|
||||||
avl_data_file_descriptor,
|
avl_data_file_descriptor,
|
||||||
0
|
0
|
||||||
@ -1881,7 +1830,7 @@ OBIDMS_avl_p obi_open_avl(OBIDMS_p dms, const char* avl_name, int avl_idx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Open file
|
// Open file
|
||||||
avl_file_descriptor = openat(avl_dir_file_descriptor, avl_file_name, O_RDONLY, 0777);
|
avl_file_descriptor = openat(avl_dir_file_descriptor, avl_file_name, O_RDWR, 0777);
|
||||||
if (avl_file_descriptor < 0)
|
if (avl_file_descriptor < 0)
|
||||||
{
|
{
|
||||||
obi_set_errno(OBI_AVL_ERROR);
|
obi_set_errno(OBI_AVL_ERROR);
|
||||||
@ -1921,7 +1870,7 @@ OBIDMS_avl_p obi_open_avl(OBIDMS_p dms, const char* avl_name, int avl_idx)
|
|||||||
// Fill the avl structure
|
// Fill the avl structure
|
||||||
avl->header = mmap(NULL,
|
avl->header = mmap(NULL,
|
||||||
header_size,
|
header_size,
|
||||||
PROT_READ,
|
PROT_READ | PROT_WRITE,
|
||||||
MAP_SHARED,
|
MAP_SHARED,
|
||||||
avl_file_descriptor,
|
avl_file_descriptor,
|
||||||
0
|
0
|
||||||
|
54
src/obiavl.h
54
src/obiavl.h
@ -169,6 +169,60 @@ typedef struct OBIDMS_avl_group {
|
|||||||
} OBIDMS_avl_group_t, *OBIDMS_avl_group_p;
|
} OBIDMS_avl_group_t, *OBIDMS_avl_group_p;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function building the complete AVL name for an AVL with an associated index (for AVL groups).
|
||||||
|
*
|
||||||
|
* @warning The returned pointer has to be freed by the caller.
|
||||||
|
*
|
||||||
|
* @param avl_name The base name of the AVL tree.
|
||||||
|
* @param avl_idx The index associated with that AVL.
|
||||||
|
*
|
||||||
|
* @returns A pointer to the complete name of the AVL.
|
||||||
|
* @retval NULL if an error occurred.
|
||||||
|
*
|
||||||
|
* @since April 2016
|
||||||
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
||||||
|
*/
|
||||||
|
char* obi_build_avl_name_with_idx(const char* avl_name, int avl_idx);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function building the full path of an AVL tree file.
|
||||||
|
*
|
||||||
|
* @warning The returned pointer has to be freed by the caller.
|
||||||
|
*
|
||||||
|
* @param dms A pointer to the OBIDMS to which the AVL tree belongs.
|
||||||
|
* @param avl_name The name of the AVL tree.
|
||||||
|
* @param avl_idx The index of the AVL if it's part of an AVL group, or -1 if not.
|
||||||
|
*
|
||||||
|
* @returns A pointer to the full path of the file where the AVL tree is stored.
|
||||||
|
* @retval NULL if an error occurred.
|
||||||
|
*
|
||||||
|
* @since May 2016
|
||||||
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
||||||
|
*/
|
||||||
|
char* obi_get_full_path_of_avl_file_name(OBIDMS_p dms, const char* avl_name, int avl_idx);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function building the file name for an AVL data file.
|
||||||
|
*
|
||||||
|
* @warning The returned pointer has to be freed by the caller.
|
||||||
|
*
|
||||||
|
* @param dms A pointer to the OBIDMS to which the AVL tree belongs.
|
||||||
|
* @param avl_name The name of the AVL tree.
|
||||||
|
* @param avl_idx The index of the AVL if it's part of an AVL group, or -1 if not.
|
||||||
|
*
|
||||||
|
* @returns A pointer to the full path of the file where the data referred to by the AVL tree is stored.
|
||||||
|
* @retval NULL if an error occurred.
|
||||||
|
*
|
||||||
|
* @since May 2016
|
||||||
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
||||||
|
*/
|
||||||
|
char* obi_get_full_path_of_avl_data_file_name(OBIDMS_p dms, const char* avl_name, int avl_idx);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks if an AVL tree or AVL tree group already exists or not.
|
* @brief Checks if an AVL tree or AVL tree group already exists or not.
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user