From b5b7995411c1490bf9861f65b710404c1a9b0eab Mon Sep 17 00:00:00 2001 From: Celine Mercier Date: Thu, 6 Apr 2017 14:41:26 +0200 Subject: [PATCH] new Cython DMS API --- python/obitools3/dms/capi/obidms.pxd | 2 + python/obitools3/dms/dms.pxd | 18 +--- python/obitools3/dms/dms.pyx | 143 ++++++++++++--------------- 3 files changed, 65 insertions(+), 98 deletions(-) diff --git a/python/obitools3/dms/capi/obidms.pxd b/python/obitools3/dms/capi/obidms.pxd index 5f30088..787c60a 100644 --- a/python/obitools3/dms/capi/obidms.pxd +++ b/python/obitools3/dms/capi/obidms.pxd @@ -9,6 +9,8 @@ cdef extern from "obidms.h" nogil: ctypedef OBIDMS_t* OBIDMS_p OBIDMS_p obi_dms(const_char_p dms_name) + OBIDMS_p obi_open_dms(const char* dms_path) + OBIDMS_p obi_create_dms(const char* dms_path) int obi_close_dms(OBIDMS_p dms) char* obi_dms_get_dms_path(OBIDMS_p dms) char* obi_dms_get_full_path(OBIDMS_p dms, const_char_p path_name) diff --git a/python/obitools3/dms/dms.pxd b/python/obitools3/dms/dms.pxd index 64d4d5f..7de427c 100644 --- a/python/obitools3/dms/dms.pxd +++ b/python/obitools3/dms/dms.pxd @@ -1,25 +1,11 @@ #cython: language_level=3 - -from .capi.obidms cimport OBIDMS_p -from .capi.obitypes cimport obiversion_t, \ - obitype_t, \ - index_t from .object cimport OBIWrapper - -cdef dict __OBIDMS_COLUMN_CLASS__ -cdef dict __OBIDMS_VIEW_CLASS__ +from .capi.obidms cimport OBIDMS_p cdef class DMS(OBIWrapper): - - @staticmethod - cdef type get_python_type(obitype_t obitype) - @staticmethod - cdef DMS new(object dms_name) - - cpdef close(self) + cdef inline OBIDMS_p pointer(self) cpdef int view_count(self) - cpdef bint is_view_writable(self, object view_name) diff --git a/python/obitools3/dms/dms.pyx b/python/obitools3/dms/dms.pyx index 66c2666..be61f3b 100644 --- a/python/obitools3/dms/dms.pyx +++ b/python/obitools3/dms/dms.pyx @@ -1,14 +1,16 @@ #cython: language_level=3 + from libc.stdlib cimport free from cpython.list cimport PyList_Size -from .capi.obidms cimport obi_dms, \ +from .capi.obidms cimport obi_open_dms, \ + obi_create_dms, \ obi_close_dms, \ obi_dms_get_full_path - + from .capi.obitypes cimport const_char_p - + from obitools3.utils cimport bytes2str, \ str2bytes, \ tobytes, \ @@ -18,115 +20,96 @@ from .object cimport OBIObjectClosedInstance from pathlib import Path - -__OBIDMS_COLUMN_CLASS__ = {} +from .view import view cdef class DMS(OBIWrapper): - @staticmethod - cdef type get_python_type(obitype_t obitype): - """ - Internal function returning the python type representing - an instance for a given obitype. - """ - return __OBIDMS_COLUMN_CLASS__[obitype][1] - - -# def __init__(self, size_t pointer) : -# ''' -# Constructor of a obitools3.dms.DMS instance. -# -# @param dms_name: The name of the DMS -# @type dms_name: a `str` or a `bytes` instance -# ''' -# -# print("hmmmm") + cdef inline OBIDMS_p pointer(self): + return (self._pointer) @staticmethod - cdef DMS new(object dms_name) : + def new(object dms_name) : cdef OBIDMS_p pointer cdef DMS dms cdef bytes dms_name_b = tobytes(dms_name) - pointer = obi_dms( dms_name_b) + pointer = obi_create_dms( dms_name_b) if pointer == NULL : - raise Exception("Failed opening or creating an OBIDMS") - dms = OBIWrapper.new_wrapper(DMS, pointer) + raise Exception("Failed creating an OBIDMS") + dms = OBIWrapper.new(DMS, pointer) return dms - - - # name property getter - @property - def name(self): - """ - Returns the name of the DMS instance - - @rtype: bytes - """ - cdef OBIDMS_p pointer = (self._pointer) - return pointer.dms_name - + + + @staticmethod + def open(object dms_name) : + cdef OBIDMS_p pointer + cdef DMS dms + cdef bytes dms_name_b = tobytes(dms_name) + pointer = obi_open_dms( dms_name_b) + if pointer == NULL : + raise Exception("Failed opening an OBIDMS") + dms = OBIWrapper.new(DMS, pointer) + return dms + def close(self) : - """ + ''' Closes the DMS instance and free the associated memory The `close` method is automatically called by the object destructor. - """ - cdef OBIDMS_p pointer = (self._pointer) + ''' + cdef OBIDMS_p pointer = self.pointer() - if pointer!=NULL: + if self.active() : OBIWrapper.close(self) if (obi_close_dms(pointer)) < 0 : raise Exception("Problem closing an OBIDMS") - self._pointer=NULL - else: - raise OBIObjectClosedInstance() - - - def keys(self): - - cdef OBIDMS_p pointer = (self._pointer) - cdef const_char_p path = obi_dms_get_full_path(pointer, - b"VIEWS" - ) + + # name property getter + @property + def name(self) : + ''' + Returns the name of the DMS instance - if path==NULL: - raise RuntimeError("Cannot retreive the Dataabase path") + @rtype: bytes + ''' + return self.pointer().dms_name + + + def keys(self) : + + cdef const_char_p path = obi_dms_get_full_path(self.pointer(), b"VIEWS") + + if path == NULL: + raise RuntimeError("Cannot retrieve the view database path") p = Path(bytes2str(path)) free(path) - for v in p.glob("*.obiview"): + for v in p.glob("*.obiview") : yield str2bytes(v.stem) - - - def values(self): + + + def values(self) : cdef bytes view_name - for view_name in self.keys(): yield self.get_view(view_name) - - def items(self): + + def items(self) : cdef bytes view_name - for view_name in self.keys(): - yield (view_name,self.get_view(view_name)) + yield (view_name, self.get_view(view_name)) - def __contains__(self, key): + def __contains__(self, key) : - cdef OBIDMS_p pointer = (self._pointer) - cdef str key_s = tostr(key) - cdef const_char_p path = obi_dms_get_full_path(pointer, - b"VIEWS" - ) + cdef const_char_p path = obi_dms_get_full_path(self.pointer(), b"VIEWS") p = Path(bytes2str(path),key_s) free(path) @@ -134,15 +117,11 @@ cdef class DMS(OBIWrapper): return p.with_suffix(".obiview").is_file() - cpdef int view_count(self): + cpdef int view_count(self) : return PyList_Size(list(self.keys())) - def get_view(self): - raise NotImplemented - - - def __len__(self): + def __len__(self) : return self.view_count() @@ -150,11 +129,11 @@ cdef class DMS(OBIWrapper): return self.get_view(view_name) - def __iter__(self): + def __iter__(self) : return self.keys() - cpdef bint is_view_writable(self, object view_name): - raise NotImplemented + def get_view(self, object view_name) : + return view.View.open(self, view_name) - \ No newline at end of file + \ No newline at end of file