Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
O
OBITools3
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
23
Issues
23
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
Operations
Operations
Incidents
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
OBITools
OBITools3
Commits
344566d9
Commit
344566d9
authored
Aug 03, 2017
by
Celine Mercier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
AVLs: made some functions public and changed some rights to be able to
import AVLs from a DMS to another
parent
407f61a4
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
191 additions
and
188 deletions
+191
-188
src/obiavl.c
src/obiavl.c
+136
-187
src/obiavl.h
src/obiavl.h
+55
-1
No files found.
src/obiavl.c
View file @
344566d9
...
...
@@ -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.
*
...
...
@@ -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
);
/**
* @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,
* 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
,
"
\n
Error 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
,
"
\n
Error 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
,
"
\n
Error 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
)
{
...
...
@@ -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
,
"
\n
Error 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
,
"
\n
Error 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
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
)
{
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
);
obidebug
(
1
,
"
\n
Error creating a hard link to an existing AVL tree file"
);
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
);
obidebug
(
1
,
"
\n
Error 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
,
"
\n
Error 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
,
"
\n
Error 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
,
"
\n
Error 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
,
"
\n
Error 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
,
"
\n
Error 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
)
{
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
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
)
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
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
)
return
NULL
;
}
...
...
@@ -1794,7 +1743,7 @@ OBIDMS_avl_p obi_open_avl(OBIDMS_p dms, const char* avl_name, int avl_idx)
return
NULL
;
// Open file
avl_data_file_descriptor
=
openat
(
avl_dir_file_descriptor
,
avl_data_file_name
,
O_RD
ONLY
,
0777
);
avl_data_file_descriptor
=
openat
(
avl_dir_file_descriptor
,
avl_data_file_name
,
O_RD
WR
,
0777
);
if
(
avl_data_file_descriptor
<
0
)
{
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
avl_data
->
header
=
mmap
(
NULL
,
header_size
,
PROT_READ
,
PROT_READ
|
PROT_WRITE
,
MAP_SHARED
,
avl_data_file_descriptor
,
0
...
...
@@ -1881,7 +1830,7 @@ OBIDMS_avl_p obi_open_avl(OBIDMS_p dms, const char* avl_name, int avl_idx)
}
// Open file
avl_file_descriptor
=
openat
(
avl_dir_file_descriptor
,
avl_file_name
,
O_RD
ONLY
,
0777
);
avl_file_descriptor
=
openat
(
avl_dir_file_descriptor
,
avl_file_name
,
O_RD
WR
,
0777
);
if
(
avl_file_descriptor
<
0
)
{
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
avl
->
header
=
mmap
(
NULL
,
header_size
,
PROT_READ
,
PROT_READ
|
PROT_WRITE
,
MAP_SHARED
,
avl_file_descriptor
,
0
...
...
src/obiavl.h
View file @
344566d9
...
...
@@ -169,11 +169,65 @@ typedef struct OBIDMS_avl_group {
}
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.
*
* @param dms The OBIDMS to which the AVL tree or AVL tree group belongs.
* @param avl_name The name of the AVL treeor the base name of the AVL tree group.
* @param avl_name The name of the AVL tree
or the base name of the AVL tree group.
*
* @returns A value indicating whether the AVL tree or AVL tree group exists or not.
* @retval 1 if the AVL tree or AVL tree group exists.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment