From 0e08fc486a95a629cce040e39ea0bfac963a6e42 Mon Sep 17 00:00:00 2001 From: Celine Mercier Date: Fri, 14 Apr 2017 16:19:18 +0200 Subject: [PATCH] Cython API: fixed bug when deleting a column from a view where the Cython wrapper wasn't closed, and fixed the Line selection materialization --- python/obitools3/dms/view/view.pyx | 49 +++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/python/obitools3/dms/view/view.pyx b/python/obitools3/dms/view/view.pyx index fcaf06e..7a896d1 100644 --- a/python/obitools3/dms/view/view.pyx +++ b/python/obitools3/dms/view/view.pyx @@ -209,15 +209,22 @@ cdef class View(OBIWrapper) : cpdef delete_column(self, object column_name) : - + + cdef bytes column_name_b = tobytes(column_name) + if not self.active() : raise OBIObjectClosedInstance() - cdef bytes column_name_b = tobytes(column_name) + # Close the cython instance first + col = self[column_name] + col.close() + # Remove the column from the view which closes the C structure if obi_view_delete_column(self.pointer(), column_name_b) < 0 : raise Exception("Problem deleting column %s from a view", bytes2str(column_name_b)) + + cpdef rename_column(self, @@ -465,21 +472,35 @@ cdef class Line_selection(list): cpdef View materialize(self, object view_name, object comments=""): - - cdef View view = View(987654) - cdef bytes view_name_b=tobytes(view_name) + + cdef bytes view_name_b = tobytes(view_name) + cdef bytes comments_b + cdef Obiview_p pointer + cdef View view + + if not self._view.active() : + raise OBIObjectClosedInstance() + + if comments is not None: + comments_b = tobytes(comments) + else: + comments_b = b'' - view._pointer = obi_new_view(self._view._dms.pointer(), - view_name_b, - self._view.pointer(), - self.__build_binary_list__(), - tobytes(comments)) + pointer = obi_new_view(self._view._dms.pointer(), + view_name_b, + self._view.pointer(), + self.__build_binary_list__(), + comments_b) - if view._pointer == NULL : - raise RuntimeError("Error : Cannot clone view %s into view %s" - % (str(self._view_name), - view_name) + if pointer == NULL : + raise RuntimeError("Error : Cannot clone view %s into view %s with new line selection" + % (str(self._view.name), + bytes2str(view_name_b)) ) + view = OBIWrapper.new(type(self._view), pointer) + view._dms = self._view._dms + view._dms.register(view) + return view