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
5f62cd85
Commit
5f62cd85
authored
Jul 31, 2015
by
celinemercier
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
C sources modified to add the handling of OBIDM columns with the type
OBI_INT, and the handling of multiple types in general
parent
a6abc745
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
684 additions
and
10 deletions
+684
-10
src/obidms.c
src/obidms.c
+48
-0
src/obidms.h
src/obidms.h
+17
-0
src/obidmscolumn.c
src/obidmscolumn.c
+375
-4
src/obidmscolumn.h
src/obidmscolumn.h
+136
-6
src/obidmscolumn_int.c
src/obidmscolumn_int.c
+49
-0
src/obidmscolumn_int.h
src/obidmscolumn_int.h
+59
-0
No files found.
src/obidms.c
View file @
5f62cd85
...
...
@@ -14,6 +14,10 @@
#include "obidms.h"
#include "obierrno.h"
#include "obidebug.h"
#include "obidmscolumn.h"
#define DEBUG_LEVEL 0
/**************************************************************************
...
...
@@ -148,6 +152,7 @@ OBIDMS_p obi_open_dms(const char* dms_name)
directory
=
opendir
(
directory_name
);
if
(
directory
==
NULL
)
{
obidebug
(
1
,
"Can't open DMS"
);
switch
(
errno
)
{
case
ENOENT
:
...
...
@@ -206,6 +211,49 @@ OBIDMS_p obi_dms(const char* dms_name)
}
int
obi_list_columns
(
OBIDMS_p
dms
)
{
DIR
*
d
;
struct
dirent
*
dir
;
char
*
dir_name
;
char
*
extension
;
OBIType_t
data_type
;
obiversion_t
latest_version
;
d
=
dms
->
directory
;
dir
=
readdir
(
d
);
fprintf
(
stderr
,
"Column name
\t
Data type
\t
Latest version"
);
while
(
dir
!=
NULL
)
{
dir_name
=
strdup
(
dir
->
d_name
);
if
(
dir_name
==
NULL
)
{
obidebug
(
1
,
"
\n
Error strdup-ing a directory name"
);
return
-
1
;
}
dir_name
=
strtok
(
dir_name
,
"."
);
extension
=
strtok
(
NULL
,
"."
);
if
((
extension
!=
NULL
)
&&
(
strcmp
(
"obicol"
,
extension
)
==
0
))
// Found a column directory
{
data_type
=
obi_column_get_data_type_from_name
(
dms
,
dir_name
);
latest_version
=
obi_column_get_latest_version_from_name
(
dms
,
dir_name
);
fprintf
(
stderr
,
"
\n
%s
\t
%d
\t
%d"
,
dir_name
,
data_type
,
latest_version
);
}
dir
=
readdir
(
d
);
}
rewinddir
(
d
);
return
(
0
);
}
int
obi_close_dms
(
OBIDMS_p
dms
)
{
if
(
dms
!=
NULL
)
...
...
src/obidms.h
View file @
5f62cd85
...
...
@@ -126,6 +126,23 @@ OBIDMS_p obi_open_dms(const char *dms_name);
OBIDMS_p
obi_dms
(
const
char
*
dms_name
);
/**
* @brief Lists all the column directories in the OBIDMS, their data type and
* their latest version.
*
* @param dms a pointer as returned by obi_create_dms() or obi_open_dms().
*
* @return an integer value indicating the success of the operation.
*
* @retvalue 0 on success
* @retvalue -1 on failure and the `obi_errno` variable is set.
*
* @since July 2015
* @author Celine Mercier (celine.mercier@metabarcoding.org)
*/
int
obi_list_columns
(
OBIDMS_p
dms
);
/**
* @brief Closes an opened OBITools Data Management instance (OBIDMS).
*
...
...
src/obidmscolumn.c
View file @
5f62cd85
...
...
@@ -3,7 +3,7 @@
****************************************************************************/
/**
* @file
OBIDMS_column.h
* @file
obidmscolumn.c
* @author Celine Mercier
* @date 22 May 2015
* @brief Functions for the shared elements of all the OBIColumn structures.
...
...
@@ -12,6 +12,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
...
...
@@ -27,6 +28,11 @@
#include "obidebug.h"
#include "obilittlebigman.h"
#include "obidmscolumn_int.h"
#define DEBUG_LEVEL 0
/**************************************************************************
*
...
...
@@ -115,13 +121,28 @@ static obiversion_t obi_get_new_version_number(OBIDMS_column_directory_p column_
static
int
create_version_file
(
OBIDMS_column_directory_p
column_directory
);
/**
* @brief Internal function setting the elements names of the lines of a
* column in the header of the OBIDMS column structure.
*
* @param column a pointer as returned by obi_create_column()
* @param elements_names the names of the elements with ';' as separator
*
* @return 0 if the operation was successfully completed
* @retvalue -1 if an error occurred
*
* @since July 2015
* @author Celine Mercier (celine.mercier@metabarcoding.org)
*/
int
obi_column_set_elements_names
(
OBIDMS_column_p
column
,
const
char
*
elements_names
);
/************************************************************************
*
* D E F I N I T I O N O F T H E P R I V A T E F U N C T I O N S
*
************************************************************************/
#define DEBUG_LEVEL 0
static
char
*
build_column_file_name
(
const
char
*
column_name
,
obiversion_t
version_number
)
{
...
...
@@ -423,6 +444,16 @@ static int create_version_file(OBIDMS_column_directory_p column_directory)
}
int
obi_column_set_elements_names
(
OBIDMS_column_p
column
,
const
char
*
elements_names
)
{
(
column
->
header
)
->
elements_names
=
malloc
(
strlen
(
elements_names
)
*
sizeof
(
char
)
+
1
);
if
((
column
->
header
)
->
elements_names
==
NULL
)
return
-
1
;
strcpy
((
column
->
header
)
->
elements_names
,
elements_names
);
return
0
;
}
/**********************************************************************
*
* D E F I N I T I O N O F T H E P U B L I C F U N C T I O N S
...
...
@@ -521,6 +552,32 @@ obiversion_t obi_get_latest_version_number(OBIDMS_column_directory_p column_dire
}
obiversion_t
obi_column_get_latest_version_from_name
(
OBIDMS_p
dms
,
const
char
*
column_name
)
{
OBIDMS_column_directory_p
column_directory
;
obiversion_t
latest_version
;
// Get the column directory structure associated to the column
column_directory
=
obi_open_column_directory
(
dms
,
column_name
);
if
(
column_directory
==
NULL
)
{
obidebug
(
1
,
"
\n
Problem opening column directory"
);
return
-
1
;
}
// Get the latest version number
latest_version
=
obi_get_latest_version_number
(
column_directory
);
if
(
latest_version
<
0
)
{
obidebug
(
1
,
"
\n
Problem getting the latest version number"
);
obi_close_column_directory
(
column_directory
);
return
-
1
;
}
return
latest_version
;
}
size_t
obi_get_platform_header_size
()
{
return
getpagesize
()
*
1
;
...
...
@@ -547,6 +604,8 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms,
new_column
=
NULL
;
// TODO check that informations are not NULL/invalid
// Get the column directory structure associated to the column
column_directory
=
obi_column_directory
(
dms
,
column_name
);
if
(
column_directory
==
NULL
)
...
...
@@ -673,8 +732,7 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms,
header
->
version
=
version_number
;
header
->
comments
[
0
]
=
0x0
;
header
->
elements_names
=
malloc
(
strlen
(
elements_names
)
*
sizeof
(
char
)
+
1
);
strcpy
(
header
->
elements_names
,
elements_names
);
obi_column_set_elements_names
(
new_column
,
elements_names
);
strncpy
(
header
->
name
,
column_name
,
OBIDMS_MAX_COLNAME
);
...
...
@@ -683,3 +741,316 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms,
return
new_column
;
}
OBIDMS_column_p
obi_open_column
(
OBIDMS_p
dms
,
const
char
*
column_name
,
obiversion_t
version_number
)
{
OBIDMS_column_p
column
;
OBIDMS_column_directory_p
column_directory
;
char
*
column_file_name
;
int
column_file_descriptor
;
int
column_dir_file_descriptor
;
size_t
header_size
;
size_t
data_size
;
column
=
NULL
;
// Get the column directory structure associated to the column
column_directory
=
obi_open_column_directory
(
dms
,
column_name
);
if
(
column_directory
==
NULL
)
{
obidebug
(
1
,
"
\n
Problem opening column directory"
);
return
NULL
;
}
// Get the file descriptor associated to the column directory
column_dir_file_descriptor
=
dirfd
(
column_directory
->
directory
);
if
(
column_dir_file_descriptor
<
0
)
{
obidebug
(
1
,
"
\n
Problem opening column directory"
);
obi_set_errno
(
OBICOLDIR_UNKNOWN_ERROR
);
obi_close_column_directory
(
column_directory
);
return
NULL
;
}
// Calculate the header size
header_size
=
obi_get_platform_header_size
();
// Get the latest version number if it has the value -1 (not given by user)
if
(
version_number
==
-
1
)
{
version_number
=
obi_get_latest_version_number
(
column_directory
);
if
(
version_number
<
0
)
{
obidebug
(
1
,
"
\n
Problem getting the latest version number"
);
obi_close_column_directory
(
column_directory
);
close
(
column_dir_file_descriptor
);
return
NULL
;
}
}
// Get the column file name
column_file_name
=
build_column_file_name
(
column_name
,
version_number
);
if
(
column_file_name
==
NULL
)
{
obidebug
(
1
,
"Problem building column file name"
);
obi_close_column_directory
(
column_directory
);
close
(
column_dir_file_descriptor
);
return
NULL
;
}
// Open the column file, ALWAYS READ-ONLY
column_file_descriptor
=
openat
(
column_dir_file_descriptor
,
column_file_name
,
O_RDONLY
);
if
(
column_file_descriptor
<
0
)
{
obidebug
(
1
,
"
\n
Can't open column file"
);
obi_set_errno
(
OBICOL_UNKNOWN_ERROR
);
obi_close_column_directory
(
column_directory
);
close
(
column_dir_file_descriptor
);
free
(
column_file_name
);
return
NULL
;
}
// Allocate the memory for the column structure
column
=
(
OBIDMS_column_p
)
malloc
(
sizeof
(
OBIDMS_column_t
));
if
(
column
==
NULL
)
{
obi_set_errno
(
OBICOL_UNKNOWN_ERROR
);
obi_close_column_directory
(
column_directory
);
close
(
column_dir_file_descriptor
);
close
(
column_file_descriptor
);
free
(
column_file_name
);
return
NULL
;
}
// Fill the column structure
column
->
dms
=
dms
;
column
->
column_directory
=
column_directory
;
column
->
header
=
mmap
(
NULL
,
header_size
,
PROT_READ
,
MAP_SHARED
,
column_file_descriptor
,
0
);
if
(
column
->
header
==
MAP_FAILED
)
{
obi_set_errno
(
OBICOL_UNKNOWN_ERROR
);
obi_close_column_directory
(
column_directory
);
close
(
column_dir_file_descriptor
);
close
(
column_file_descriptor
);
free
(
column_file_name
);
free
(
column
);
return
NULL
;
}
// Check endianness?
// Compute data size from the informations in the header
data_size
=
((
column
->
header
)
->
line_count
)
*
sizeof
((
column
->
header
)
->
data_type
);
// TODO line_count for tests, change to lines_used later
column
->
data
=
mmap
(
NULL
,
data_size
,
PROT_READ
,
MAP_SHARED
,
column_file_descriptor
,
header_size
);
if
(
column
->
data
==
MAP_FAILED
)
{
munmap
(
column
->
header
,
header_size
);
obi_set_errno
(
OBICOL_UNKNOWN_ERROR
);
obi_close_column_directory
(
column_directory
);
close
(
column_dir_file_descriptor
);
close
(
column_file_descriptor
);
free
(
column_file_name
);
free
(
column
);
return
NULL
;
}
column
->
writable
=
false
;
free
(
column_file_name
);
close
(
column_file_descriptor
);
return
column
;
}
int
obi_close_column
(
OBIDMS_column_p
column
)
{
//munmap?
free
(
column
);
return
0
;
}
void
obi_column_make_unwritable
(
OBIDMS_column_p
column
)
{
column
->
writable
=
false
;
}
size_t
obi_column_get_line_count
(
OBIDMS_column_p
column
)
{
return
(
column
->
header
)
->
line_count
;
}
OBIType_t
obi_column_get_data_type
(
OBIDMS_column_p
column
)
{
return
(
column
->
header
)
->
data_type
;
}
OBIType_t
obi_column_get_data_type_from_name
(
OBIDMS_p
dms
,
const
char
*
column_name
)
{
OBIDMS_column_header_p
header
;
OBIDMS_column_directory_p
column_directory
;
char
*
column_file_name
;
int
column_file_descriptor
;
int
column_dir_file_descriptor
;
size_t
header_size
;
OBIType_t
data_type
;
obiversion_t
version_number
;
// Get the column directory structure associated to the column
column_directory
=
obi_open_column_directory
(
dms
,
column_name
);
if
(
column_directory
==
NULL
)
{
obidebug
(
1
,
"
\n
Problem opening column directory"
);
return
-
1
;
}
// Get the file descriptor associated to the column directory
column_dir_file_descriptor
=
dirfd
(
column_directory
->
directory
);
if
(
column_dir_file_descriptor
<
0
)
{
obidebug
(
1
,
"
\n
Problem opening column directory"
);
obi_set_errno
(
OBICOLDIR_UNKNOWN_ERROR
);
obi_close_column_directory
(
column_directory
);
return
-
1
;
}
// Calculate the header size
header_size
=
obi_get_platform_header_size
();
// Get the latest version number
version_number
=
obi_get_latest_version_number
(
column_directory
);
if
(
version_number
<
0
)
{
obidebug
(
1
,
"
\n
Problem getting the latest version number"
);
obi_close_column_directory
(
column_directory
);
close
(
column_dir_file_descriptor
);
return
-
1
;
}
// Get the column file name
column_file_name
=
build_column_file_name
(
column_name
,
version_number
);
if
(
column_file_name
==
NULL
)
{
obidebug
(
1
,
"Problem building column file name"
);
obi_close_column_directory
(
column_directory
);
close
(
column_dir_file_descriptor
);
return
-
1
;
}
// Open the column file (READ-ONLY)
column_file_descriptor
=
openat
(
column_dir_file_descriptor
,
column_file_name
,
O_RDONLY
);
if
(
column_file_descriptor
<
0
)
{
obidebug
(
1
,
"
\n
Can't open column file"
);
obi_set_errno
(
OBICOL_UNKNOWN_ERROR
);
obi_close_column_directory
(
column_directory
);
close
(
column_dir_file_descriptor
);
free
(
column_file_name
);
return
-
1
;
}
// Fill the header structure
header
=
mmap
(
NULL
,
header_size
,
PROT_READ
,
MAP_SHARED
,
column_file_descriptor
,
0
);
if
(
header
==
MAP_FAILED
)
{
obi_set_errno
(
OBICOL_UNKNOWN_ERROR
);
obi_close_column_directory
(
column_directory
);
close
(
column_dir_file_descriptor
);
close
(
column_file_descriptor
);
free
(
column_file_name
);
free
(
header
);
return
-
1
;
}
// Check endianness?
data_type
=
header
->
data_type
;
free
(
column_file_name
);
close
(
column_file_descriptor
);
munmap
(
header
,
header_size
);
return
data_type
;
}
const
char
*
obi_column_get_elements_names
(
OBIDMS_column_p
column
)
{
return
(
column
->
header
)
->
elements_names
;
}
// to be rewritten in an optimized and safe way
size_t
obi_column_get_element_index_from_name
(
OBIDMS_column_p
column
,
const
char
*
element_name
)
{
char
*
elements_names
;
char
*
name
;
size_t
element_index
;
elements_names
=
strdup
((
column
->
header
)
->
elements_names
);
if
(
elements_names
==
NULL
)
{
obidebug
(
1
,
"
\n
Error strdup-ing the elements names"
);
return
-
1
;
}
element_index
=
0
;
name
=
strtok
(
elements_names
,
";"
);
// not thread safe, see strtok_r maybe
if
(
strcmp
(
element_name
,
name
)
==
0
)
{
free
(
elements_names
);
return
element_index
;
}
element_index
++
;
while
(
name
!=
NULL
)
{
name
=
strtok
(
NULL
,
";"
);
// not thread safe, see strtok_r maybe
if
(
strcmp
(
element_name
,
name
)
==
0
)
{
free
(
elements_names
);
return
element_index
;
}
element_index
++
;
}
obidebug
(
1
,
"
\n
Can't find element name"
);
free
(
elements_names
);
return
-
1
;
}
size_t
obi_column_get_nb_elements_per_line
(
OBIDMS_column_p
column
)
{
return
(
column
->
header
)
->
nb_elements_per_line
;
}
src/obidmscolumn.h
View file @
5f62cd85
...
...
@@ -86,6 +86,28 @@ typedef struct OBIDMS_column {
}
OBIDMS_column_t
,
*
OBIDMS_column_p
;
/**
* @brief Returns the latest version of a column in a column directory
*
* @param column_directory
*
* @return the latest version number kept in the version file
* @return -1 if an error occurred
*/
obiversion_t
obi_get_latest_version_number
(
OBIDMS_column_directory_p
column_directory
);
/**
* @brief Returns the latest version of a column in a column directory
*
* @param column_name
*
* @return the latest version number kept in the version file
* @return -1 if an error occurred
*/
obiversion_t
obi_column_get_latest_version_from_name
(
OBIDMS_p
dms
,
const
char
*
column_name
);
/**
* @brief Returns the header size in bytes of a column on this platform.
*
...
...
@@ -103,7 +125,7 @@ size_t obi_get_platform_header_size();
/**
* @brief Creates a column.
*
* @param dms a pointer on an OBIDMS
column
* @param dms a pointer on an OBIDMS
* @param column_name the name of the new column
* @param type the OBIType code used to create the column
* @param nb_elements the number of elements to be stored
...
...
@@ -120,15 +142,123 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms,
/**
* @brief
Returns the latest column version in the `dms` database
* @brief
Opens a column in read-only mode.
*
* @param dms a pointer
as returned by obi_create_dms() or obi_open_dms()
* @param dms a pointer
on an OBIDMS
* @param column_name the name of the column
* @param version_number the version of the column that should be opened
*
* @return a pointer to the opened column
*
* @
return the bigger version number used for this column
* @
return -1 if the column does not exist
* @
since July 2015
* @
author Celine Mercier (celine.mercier@metabarcoding.org)
*/
obiversion_t
obi_get_latest_version_number
(
OBIDMS_column_directory_p
column_directory
);
OBIDMS_column_p
obi_open_column
(
OBIDMS_p
dms
,
const
char
*
column_name
,
obiversion_t
version_number
);
/**
* @brief Closes a column.
*
* @param column a pointer on an OBIDMS column
*
* @return 0 if the operation was successfully completed
* @return -1 if an error occurred
*
* @since July 2015
* @author Celine Mercier (celine.mercier@metabarcoding.org)
*/
int
obi_close_column
(
OBIDMS_column_p
column
);
/**
* @brief Sets the 'writable' header attribute of an OBIDMS column to False.
*
* @param column a pointer on an OBIDMS column
*
* @since July 2015
* @author Celine Mercier (celine.mercier@metabarcoding.org)
*/
void
obi_column_make_unwritable
(
OBIDMS_column_p
column
);
/**
* @brief Recovers the line count of an OBIDMS column.
*
* @param column a pointer on an OBIDMS column
*
* @return the line count of the column
*
* @since July 2015
* @author Celine Mercier (celine.mercier@metabarcoding.org)
*/
size_t
obi_column_get_line_count
(
OBIDMS_column_p
column
);
/**
* @brief Recovers the data type of an OBIDMS column.
*
* @param column a pointer on an OBIDMS column
*
* @return the data type of the column
*
* @since July 2015
* @author Celine Mercier (celine.mercier@metabarcoding.org)
*/
OBIType_t
obi_column_get_data_type
(
OBIDMS_column_p
column
);