Cython column API: fixed a memory leak, optimized the reading of
elements names, added a __len__ method to Column_line, and the API for columns with character strings to evaluate
This commit is contained in:
@ -18,6 +18,7 @@ cdef class Column(OBIWrapper) :
|
|||||||
|
|
||||||
cdef View _view
|
cdef View _view
|
||||||
cdef bytes _alias
|
cdef bytes _alias
|
||||||
|
cdef list elements_names
|
||||||
|
|
||||||
cdef inline OBIDMS_column_p pointer(self)
|
cdef inline OBIDMS_column_p pointer(self)
|
||||||
|
|
||||||
|
@ -28,6 +28,8 @@ from obitools3.utils cimport tobytes, \
|
|||||||
|
|
||||||
from obitools3.dms.column import typed_column
|
from obitools3.dms.column import typed_column
|
||||||
|
|
||||||
|
from libc.stdlib cimport free
|
||||||
|
|
||||||
import importlib
|
import importlib
|
||||||
import inspect
|
import inspect
|
||||||
import pkgutil
|
import pkgutil
|
||||||
@ -75,6 +77,7 @@ cdef class Column(OBIWrapper) :
|
|||||||
index_t nb_elements_per_line=1,
|
index_t nb_elements_per_line=1,
|
||||||
list elements_names=None,
|
list elements_names=None,
|
||||||
bint tuples=False,
|
bint tuples=False,
|
||||||
|
bint to_eval=False,
|
||||||
object comments=b"",
|
object comments=b"",
|
||||||
object alias=b""):
|
object alias=b""):
|
||||||
# TODO indexer_name?
|
# TODO indexer_name?
|
||||||
@ -114,7 +117,9 @@ cdef class Column(OBIWrapper) :
|
|||||||
nb_lines = len(view),
|
nb_lines = len(view),
|
||||||
nb_elements_per_line = nb_elements_per_line,
|
nb_elements_per_line = nb_elements_per_line,
|
||||||
elements_names = elements_names_p,
|
elements_names = elements_names_p,
|
||||||
|
elt_names_formatted = False,
|
||||||
tuples = tuples,
|
tuples = tuples,
|
||||||
|
to_eval = to_eval,
|
||||||
indexer_name = NULL,
|
indexer_name = NULL,
|
||||||
associated_column_name = NULL,
|
associated_column_name = NULL,
|
||||||
associated_column_version = -1,
|
associated_column_version = -1,
|
||||||
@ -155,6 +160,7 @@ cdef class Column(OBIWrapper) :
|
|||||||
|
|
||||||
column._view = view
|
column._view = view
|
||||||
column._alias = column_name_b
|
column._alias = column_name_b
|
||||||
|
column.elements_names = column._elements_names
|
||||||
view.register(column)
|
view.register(column)
|
||||||
|
|
||||||
return column
|
return column
|
||||||
@ -184,7 +190,9 @@ cdef class Column(OBIWrapper) :
|
|||||||
nb_lines = -1,
|
nb_lines = -1,
|
||||||
nb_elements_per_line = -1,
|
nb_elements_per_line = -1,
|
||||||
elements_names = NULL,
|
elements_names = NULL,
|
||||||
|
elt_names_formatted = False,
|
||||||
tuples = False,
|
tuples = False,
|
||||||
|
to_eval = False,
|
||||||
indexer_name = NULL,
|
indexer_name = NULL,
|
||||||
associated_column_name = NULL,
|
associated_column_name = NULL,
|
||||||
associated_column_version = -1,
|
associated_column_version = -1,
|
||||||
@ -280,10 +288,17 @@ cdef class Column(OBIWrapper) :
|
|||||||
|
|
||||||
# elements_names property getter
|
# elements_names property getter
|
||||||
@property
|
@property
|
||||||
def elements_names(self):
|
def _elements_names(self):
|
||||||
|
cdef char* elts_names_b
|
||||||
|
cdef list elts_names_list
|
||||||
if not self.active() :
|
if not self.active() :
|
||||||
raise OBIDeactivatedInstanceError()
|
raise OBIDeactivatedInstanceError()
|
||||||
return obi_get_elements_names(self.pointer()).split(b';')
|
elts_names_b = obi_get_elements_names(self.pointer())
|
||||||
|
if elts_names_b == NULL:
|
||||||
|
raise Exception("Error reading the elements names of a column")
|
||||||
|
elts_names_list = elts_names_b.split(b';')
|
||||||
|
free(elts_names_b)
|
||||||
|
return elts_names_list
|
||||||
|
|
||||||
# nb_elements_per_line property getter
|
# nb_elements_per_line property getter
|
||||||
@property
|
@property
|
||||||
@ -334,6 +349,13 @@ cdef class Column(OBIWrapper) :
|
|||||||
raise OBIDeactivatedInstanceError()
|
raise OBIDeactivatedInstanceError()
|
||||||
return self.pointer().header.tuples
|
return self.pointer().header.tuples
|
||||||
|
|
||||||
|
# to_eval property getter
|
||||||
|
@property
|
||||||
|
def to_eval(self):
|
||||||
|
if not self.active() :
|
||||||
|
raise OBIDeactivatedInstanceError()
|
||||||
|
return self.pointer().header.to_eval
|
||||||
|
|
||||||
# comments property getter
|
# comments property getter
|
||||||
@property
|
@property
|
||||||
def comments(self):
|
def comments(self):
|
||||||
@ -395,7 +417,11 @@ cdef class Column_line :
|
|||||||
return self._column.get_item(self._index, elt_id)
|
return self._column.get_item(self._index, elt_id)
|
||||||
else:
|
else:
|
||||||
return default
|
return default
|
||||||
|
|
||||||
|
|
||||||
|
def __len__(self):
|
||||||
|
return self._column.nb_elements_per_line
|
||||||
|
|
||||||
|
|
||||||
def __contains__(self, object elt_id):
|
def __contains__(self, object elt_id):
|
||||||
if type(elt_id) == int:
|
if type(elt_id) == int:
|
||||||
|
Reference in New Issue
Block a user