Add the OBIObject concept

This commit is contained in:
2017-01-10 14:07:10 +01:00
parent 4a1d3167a7
commit 4b02ba73ac
5 changed files with 91 additions and 46 deletions

View File

@ -190,19 +190,26 @@ cdef class OBIDMS_column_line_bool(OBIDMS_column_line) :
cdef class OBIDMS_column_bool(OBIDMS_column):
cdef class Column_bool(Column):
@staticmethod
cdef OBIDMS_column _new(OBIView view,
bytes column_name,
def new(OBIView view,
object column_name,
index_t nb_elements_per_line=1,
object elements_names=None,
bytes comments=b""):
object comments=b""):
cdef bytes column_name_b = tobytes(column_name)
cdef bytes comments_b
cdef bytes elements_names_b
cdef char* elements_names_p
cdef OBIDMS_column new_column
if comments is not None:
comments_b = tobytes(comments)
else:
comments_b = b''
if elements_names is not None:
elements_names_b = b''.join([tobytes(x) for x in elements_names])
elements_names_p = elements_names_b
@ -210,7 +217,7 @@ cdef class OBIDMS_column_bool(OBIDMS_column):
elements_names_p = NULL
if (obi_view_add_column(view = view._pointer,
column_name = column_name,
column_name = column_name_b,
version_number = -1,
alias = NULL,
data_type = OBI_BOOL,
@ -220,7 +227,7 @@ cdef class OBIDMS_column_bool(OBIDMS_column):
indexer_name = NULL,
associated_column_name = NULL,
associated_column_version = -1,
comments = comments,
comments = comments_b,
create = True)<0):
raise RuntimeError("Cannot create column %s in view %s" % (bytes2str(column_name),
bytes2str(view.name)))
@ -230,20 +237,7 @@ cdef class OBIDMS_column_bool(OBIDMS_column):
return new_column
@staticmethod
def new(OBIView view,
object column_name,
index_t nb_elements_per_line=1,
object elements_names=None,
object comments=b""):
return OBIDMS_column_bool._new(view,
tobytes(column_name),
nb_elements_per_line,
elements_names,
tobytes(comments))
cpdef add_to_view(self,
def add_to_view(self,
OBIView view,
object column_name=None,
object comments=b""):
@ -256,7 +250,7 @@ cdef class OBIDMS_column_bool(OBIDMS_column):
else:
alias = tobytes(column_name)
obi_view_add_column(view = view._ponter,
if (obi_view_add_column(view = view._ponter,
column_name = column_p.header.name,
version_number = column_p.header.version,
alias = alias,
@ -268,7 +262,13 @@ cdef class OBIDMS_column_bool(OBIDMS_column):
associated_column_name = NULL,
associated_column_version = NULL,
comments = tobytes(comments),
create = False)
create = False) < 0):
raise RuntimeError("Cannot insert column %s (%s@%d) into view %s" %
( bytes2str(alias),
bytes2str(column_p.header.name),
column_p.header.version,
bytes2str(view.name)
))
cpdef object get_line(self, index_t line_nb):
cdef obibool_t value
@ -291,4 +291,4 @@ cdef class OBIDMS_column_bool(OBIDMS_column):
raise Exception("Problem setting a value in a column")
register_column_class(OBI_BOOL,OBIDMS_column_bool)
register_column_class(OBI_BOOL,Column_bool,bool)

View File

@ -5,10 +5,12 @@ from .capi.obitypes cimport obiversion_t, \
obitype_t, \
index_t
from .object cimport OBIObject
cdef dict __OBIDMS_COLUMN_CLASS__
cdef dict __OBIDMS_VIEW_CLASS__
cdef class DMS:
cdef class DMS(OBIObject):
cdef OBIDMS_p _pointer

View File

@ -33,7 +33,7 @@ from pathlib import Path
__OBIDMS_COLUMN_CLASS__ = {}
__OBIDMS_VIEW_CLASS__= {}
cdef class DMS :
cdef class DMS(OBIObject):
@staticmethod
cdef type get_column_class(obitype_t obitype):
@ -64,6 +64,8 @@ cdef class DMS :
@type dms_name: a `str` or a `bytes` instance
'''
OBIObject.__init__(self)
# Declarations
cdef bytes dms_name_b = tobytes(dms_name)
@ -95,15 +97,18 @@ cdef class DMS :
"""
return <bytes> self._pointer.dms_name
cpdef close(self) :
def close(self) :
"""
Closes the DNS instance and free the associated memory
the `close` method is automatically called by the object destructor.
"""
if self._pointer!=NULL:
if (obi_close_dms(self._pointer)) < 0 :
raise Exception("Problem closing an OBIDMS")
else:
raise OBIObjectClosedInstance()
def keys(self):
cdef const_char_p path = obi_dms_get_full_path(self._pointer,

View File

@ -0,0 +1,10 @@
#cython: language_level=3
cdef class OBIObject:
cdef dict _dependent_object
cpdef register(self, OBIObject object)
cpdef close(self)
cdef class OBIObjectClosedInstance(Exception):
pass

View File

@ -0,0 +1,28 @@
#cython: language_level=3
cdef class OBIObject:
cpdef register(self, OBIObject object):
self._dependent_object[id(object)]=object
cpdef close(self):
cdef OBIObject object
for object in self._dependent_object.values():
object.close()
def __init__(self):
self._dependent_object={}
def __dealloc__(self):
"""
Destructor of the DMS instance.
The destructor automatically call the `close` method and
therefore free all the associated memory.
"""
self.close()
cdef class OBIObjectClosedInstance(Exception):
pass