Cython sources modified to add the handling of OBIDMS columns with the

type OBI_INT
This commit is contained in:
celinemercier
2015-07-31 18:02:40 +02:00
parent 5c674715ee
commit a6abc74500
10 changed files with 186 additions and 23 deletions

View File

@ -1,5 +1,9 @@
../../../src/obidms.h
../../../src/obidms.c
../../../src/obidmscolumn.h
../../../src/obidmscolumn.c
../../../src/obidmscolumndir.h
../../../src/obidmscolumndir.c
../../../src/obierrno.h
../../../src/obierrno.c
../../../src/obilittlebigman.h

View File

@ -1,15 +1,6 @@
cdef extern from *:
ctypedef char* const_char_p "const char*"
## Put somewhere else probably
cdef extern from "obitypes.h" nogil:
enum OBIType:
pass
ctypedef OBIType OBIType_t
cdef extern from "obidms.h" nogil:
struct OBIDMS_t:
pass
@ -17,13 +8,10 @@ cdef extern from "obidms.h" nogil:
ctypedef OBIDMS_t* OBIDMS_p
OBIDMS_p obi_create_dms(const_char_p dms_name)
OBIDMS_p obi_open_dms(const_char_p dms_name)
OBIDMS_p obi_dms(const_char_p dms_name)
int obi_close_dms(OBIDMS_p dms)
int obi_list_columns(OBIDMS_p dms)
cdef class OBIDMS:
cdef OBIDMS_p pointer

View File

@ -5,7 +5,11 @@ from .capidms cimport *
cdef class OBIDMS :
def __init__(self, dms_name) :
self.pointer = obi_dms(dms_name)
dms_name_b = dms_name.encode(encoding='UTF-8')
self.pointer = obi_dms(dms_name_b)
def __del__(self) :
obi_close_dms(self.pointer)
def list(self):
obi_list_columns(self.pointer)

View File

@ -1,3 +1,5 @@
../../../../src/obidmscolumn_int.c
../../../../src/obidmscolumn_int.h
../../../../src/obidmscolumn.h
../../../../src/obidmscolumn.c
../../../../src/obidmscolumndir.h

View File

@ -1,4 +1,16 @@
from obitools3.obidms.capidms cimport *
from libc.stdint cimport *
cdef extern from "obitypes.h" nogil:
enum OBIType:
pass
ctypedef OBIType OBIType_t
ctypedef int32_t obiint_t
ctypedef double obifloat_t
ctypedef char obichar_t
ctypedef size_t obiidx_t
cdef extern from "obidmscolumn.h" nogil:
@ -6,10 +18,23 @@ cdef extern from "obidmscolumn.h" nogil:
pass
ctypedef OBIDMS_column_t* OBIDMS_column_p
ctypedef int32_t obiversion_t
OBIDMS_column_p obi_create_column(OBIDMS_p dms, const char* column_name, OBIType_t type, size_t nb_elements, size_t nb_elements_per_line, const char* elements_names)
size_t obi_column_get_line_count(OBIDMS_column_p column)
const char* obi_column_get_elements_names(OBIDMS_column_p column)
void obi_column_make_unwritable(OBIDMS_column_p column)
size_t obi_column_get_element_index_from_name(OBIDMS_column_p column, const char* element_name)
OBIDMS_column_p obi_open_column(OBIDMS_p dms, const char* column_name, obiversion_t version_number)
size_t obi_column_get_nb_elements_per_line(OBIDMS_column_p column)
OBIType_t obi_column_get_type(OBIDMS_column_p column)
int obi_close_column(OBIDMS_column_p column)
OBIType_t obi_column_get_data_type_from_name(OBIDMS_p dms, const char* column_name)
cdef class OBIDMS_column:
cdef OBIDMS_column_p pointer
cdef OBIDMS_p dms
cdef OBIType_t data_type
cdef str dms_name
cdef str column_name

View File

@ -1,13 +1,100 @@
#cython: language_level=3
from .capidmscolumn cimport *
from obitools3.obidms.obidmscolumn.obidmscolumn_int.capidmscolumn_int import OBIDMS_column_int
cdef class OBIDMS_column:
def __init__(self, dms_name, column_name, type, nb_elements, nb_elements_per_line=1, elements_names=None):
def __init__(self, dms_name, column_name,
create, version_number,
type, nb_elements,
nb_elements_per_line, elements_names):
column_name_b = column_name.encode(encoding='UTF-8')
dms_name_b = dms_name.encode(encoding='UTF-8')
self.dms_name = dms_name
self.column_name = column_name
self.data_type = type
if create :
dms = obi_dms(dms_name_b)
self.dms = dms
if elements_names == None :
elements_names = "[\""+column_name.decode('utf-8')+"\"]"
elements_names = bytes(elements_names, 'utf-8')
elements_names_b = column_name_b
else :
elements_names_b = elements_names.encode(encoding='UTF-8')
self.pointer = obi_create_column(self.dms, column_name_b, type, nb_elements, nb_elements_per_line, elements_names_b)
else :
dms = obi_open_dms(dms_name_b)
self.dms = dms
self.pointer = obi_open_column(self.dms, column_name_b, version_number)
def create(self, dms_name, column_name, type, nb_elements, nb_elements_per_line=1, elements_names=None):
if elements_names == None :
elements_names = column_name
self.dms = obi_dms(dms_name)
self.pointer = obi_create_column(self.dms, column_name, type, nb_elements, nb_elements_per_line, elements_names)
def __iter__(self):
elements_names = self.get_elements_names()
if len(elements_names) > 1 :
multiple_elements = True
else :
element_name = elements_names[0]
line_count = obi_column_get_line_count(self.pointer)
for line_nb in xrange(line_count):
if multiple_elements :
line = []
for element_name in elements_names :
line.append(self.get_item(line_nb, element_name))
else :
line = self.get_item(line_nb, element_name)
yield line
def __setitem__(self, line_nb, value):
self.set_item(line_nb, "", value)
def __getitem__(self, line_nb):
return self.get_item(line_nb, "")
def get_elements_names(self):
elements_names = obi_column_get_elements_names(self.pointer)
return (elements_names.decode('UTF-8')).split(';')
def get_element_index_from_name(self, element_name):
element_name = element_name.encode(encoding='UTF-8')
return obi_column_get_element_index_from_name(self.pointer, element_name)
def get_data_type(self):
return self.data_type
def __del__(self):
if obi_close_column(self.pointer) != 0 :
raise Exception("Problem closing a column")
@staticmethod
def open(dms_name, column_name,
create=False, version_number=-1,
type=None, nb_elements=None,
nb_elements_per_line=1, elements_names=None):
column_name_b = column_name.encode(encoding='UTF-8')
dms_name_b = dms_name.encode(encoding='UTF-8')
dms = obi_dms(dms_name_b)
if type is None :
type = obi_column_get_data_type_from_name(dms, column_name_b)
if type == 1 :
column = OBIDMS_column_int(dms_name, column_name,
create, version_number,
type, nb_elements,
nb_elements_per_line, elements_names)
else :
"Problem with the data type"
return column

View File

@ -0,0 +1,16 @@
../../../../../src/obidmscolumn_int.c
../../../../../src/obidmscolumn_int.h
../../../../../src/obidmscolumn.h
../../../../../src/obidmscolumn.c
../../../../../src/obidmscolumndir.h
../../../../../src/obidmscolumndir.c
../../../../../src/obidms.h
../../../../../src/obidms.c
../../../../../src/obierrno.h
../../../../../src/obierrno.c
../../../../../src/obilittlebigman.h
../../../../../src/obilittlebigman.c
../../../../../src/obitypes.h
../../../../../src/obitypes.c
../../../../../src/private_at_functions.h
../../../../../src/private_at_functions.c

View File

@ -0,0 +1,7 @@
from obitools3.obidms.obidmscolumn.capidmscolumn cimport *
cdef extern from "obidmscolumn_int.h" nogil:
int obi_column_set_int(OBIDMS_column_p column, size_t line_nb, size_t element_idx, obiint_t value)
obiint_t obi_column_get_int(OBIDMS_column_p column, size_t line_nb, size_t element_idx)

View File

@ -0,0 +1,30 @@
#cython: language_level=3
from .capidmscolumn_int cimport *
cdef class OBIDMS_column_int(OBIDMS_column) :
def set_item(self, line_nb, element_name, value):
if element_name != "" :
element_idx = self.get_element_index_from_name(element_name)
else :
if obi_column_get_nb_elements_per_line(self.pointer) == 1 :
element_idx = 0
else :
print("An element name must be specified")
return -1
return obi_column_set_int(self.pointer, line_nb, element_idx, value)
def get_item(self, line_nb, element_name):
if element_name != "" :
element_idx = self.get_element_index_from_name(element_name)
else :
if obi_column_get_nb_elements_per_line(self.pointer) == 1 :
element_idx = 0
else :
print("An element name must be specified")
return -1
return obi_column_get_int(self.pointer, line_nb, element_idx)