Пример #1
0
    def info(self):
        '''
		Return the corresponding cpl_object_version_info for this specific
		version of the object.
		'''

        infopp = CPLDirect.new_cpl_version_info_tpp()

        ret = CPLDirect.cpl_get_version_info(
            self.object.id, self.version,
            CPLDirect.cpl_convert_pp_cpl_version_info_t(infopp))
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_cpl_version_info_tpp(infopp)
            raise Exception('Unable to get object version info: ' +
                            CPLDirect.cpl_error_string(ret))

        op = CPLDirect.cpl_dereference_pp_cpl_version_info_t(infopp)
        info = CPLDirect.cpl_version_info_tp_value(op)

        _info = cpl_object_version_info(self, cpl_session(info.session),
                                        info.creation_time)

        CPLDirect.cpl_free_version_info(op)
        CPLDirect.delete_cpl_version_info_tpp(infopp)

        return _info
Пример #2
0
    def info(self):
        '''
        Return cpl_object_info_t corresponding to the current object.
        '''
        objectpp = CPLDirect.new_cpl_object_info_tpp()

        ret = CPLDirect.cpl_get_object_info(self.id,
            CPLDirect.cpl_convert_pp_cpl_object_info_t(objectpp))
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_cpl_object_info_tpp(objectpp)
            raise CPLException('Unable to get object info: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        op = CPLDirect.cpl_dereference_pp_cpl_object_info_t(objectpp)
        object = CPLDirect.cpl_object_info_tp_value(op)

        if object.bundle_id == NONE:
            bundle = None
        else:
            bundle = cpl_bundle(object.bundle_id)

        _info = cpl_object_info(self,
                object.creation_time,
                object.prefix, object.name, object.type, bundle)

        CPLDirect.cpl_free_object_info(op)
        CPLDirect.delete_cpl_object_info_tpp(objectpp)

        return _info
Пример #3
0
    def properties(self, key=None, version=None):
        '''
		Return all the properties associated with the current object.

		If key is set to something other than None, return only those
		properties matching key.

		By default, returns properties for the current version of
		the object, but if version is set to a value other than
		CPL.VERSION_NONE, then will return properties for that version.
		'''
        if version is None:
            version = VERSION_NONE
        vp = CPLDirect.new_std_vector_cplxx_property_entry_tp()

        ret = CPLDirect.cpl_get_properties(
            self.id, version, key, CPLDirect.cpl_cb_collect_properties_vector,
            vp)
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cplxx_property_entry_tp(vp)
            raise Exception('Error retrieving properties: ' +
                            CPLDirect.cpl_error_string(ret))

        v = CPLDirect.cpl_dereference_p_std_vector_cplxx_property_entry_t(vp)
        l = []
        for e in v:
            l.append([e.key, e.value])
        CPLDirect.delete_std_vector_cplxx_property_entry_tp(vp)
        return l
Пример #4
0
    def relations(self, direction=D_ANCESTORS, flags=0):
        '''
        Return a list of cpl_relations
        '''
        vp = CPLDirect.new_std_vector_cpl_relation_tp()

        ret = CPLDirect.cpl_get_object_relations(self.id,
            direction, flags, CPLDirect.cpl_cb_collect_relation_vector, vp)
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cpl_relation_tp(vp)
            raise CPLException('Error retrieving relations: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        v = CPLDirect.cpl_dereference_p_std_vector_cpl_relation_t(vp)
        l = []
        if direction == D_ANCESTORS:
            for entry in v:
                a = cpl_relation(entry.id, entry.other_object_id,
                    entry.query_object_id, entry.type, direction)
                l.append(a)
        else:
            for entry in v:
                a = cpl_relation(entry.id, entry.query_object_id,
                    entry.other_object_id, entry.type, direction)
                l.append(a)

        CPLDirect.delete_std_vector_cpl_relation_tp(vp)
        return l
Пример #5
0
    def lookup_by_property(self, prefix, key, value):
        '''
        Return all objects that have the key/value property specified; raise
        LookupError if no such object is found.
        '''
        vp = CPLDirect.new_std_vector_cpl_id_tp()
        ret = CPLDirect.cpl_lookup_object_by_property(
            prefix, key, value,
            CPLDirect.cpl_cb_collect_property_lookup_vector, vp)

        if ret == E_NOT_FOUND:
            CPLDirect.delete_std_vector_cpl_id_tp(vp)
            raise LookupError('Not found')
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cpl_id_tp(vp)
            raise CPLException(
                'Unable to lookup by property ' +
                CPLDirect.cpl_error_string(ret), ret)

        v = CPLDirect.cpl_dereference_p_std_vector_cpl_id_t(vp)
        l = []
        for e in v:
            l.append(cpl_object(e))

        CPLDirect.delete_std_vector_cpl_id_tp(vp)
        return l
Пример #6
0
    def info(self):
        '''
		Return cpl_object_info_t corresponding to the current object.
		'''
        objectpp = CPLDirect.new_cpl_object_info_tpp()

        ret = CPLDirect.cpl_get_object_info(
            self.id, CPLDirect.cpl_convert_pp_cpl_object_info_t(objectpp))
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_cpl_object_info_tpp(objectpp)
            raise Exception('Unable to get object info: ' +
                            CPLDirect.cpl_error_string(ret))

        op = CPLDirect.cpl_dereference_pp_cpl_object_info_t(objectpp)
        object = CPLDirect.cpl_object_info_tp_value(op)

        if object.container_id == NONE or object.container_version < 0:
            container = None
        else:
            container = cpl_object_version(cpl_object(object.container_id),
                                           object.container_version)

        _info = cpl_object_info(self, object.version,
                                cpl_session(object.creation_session),
                                object.creation_time, object.originator,
                                object.name, object.type, container)

        CPLDirect.cpl_free_object_info(op)
        CPLDirect.delete_cpl_object_info_tpp(objectpp)

        return _info
Пример #7
0
    def lookup_all_objects(self, prefix, name, type, bundle):
        '''
        Return all objects that have the specified prefix, name,
        type, or bundle.
        '''

        bundle = bundle.id
        vp = CPLDirect.new_std_vector_cpl_id_timestamp_tp()
        ret = CPLDirect.cpl_lookup_object_ext(
            prefix, name, type, bundle, L_NO_FAIL,
            CPLDirect.cpl_cb_collect_id_timestamp_vector, vp)

        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cpl_id_timestamp_tp(vp)
            raise CPLException(
                'Unable to lookup all objects: ' +
                CPLDirect.cpl_error_string(ret), ret)

        v = CPLDirect.cpl_dereference_p_std_vector_cpl_id_timestamp_t(vp)
        l = []
        if v != S_NO_DATA:
            for e in v:
                l.append(cpl_object(e.id))

        CPLDirect.delete_std_vector_cpl_id_timestamp_tp(vp)
        return l
Пример #8
0
    def control_flow_from(self, src, type=CONTROL_OP, version=None):
        '''
		Add control flow edge of the given type from src to self. If version
		is specified, then add flow to dest with explicit version, else add
		to most recent version.

		Allowed types:
			CPL.CONTROL_OP (default)
			CPL.CONTROL_START

		CPL.CONTROL_GENERIC is an alias for CPL.CONTROL_OP.
		'''

        if isinstance(src, cpl_object_version):
            if version is not None and version != VERSION_NONE:
                raise Exception('The version argument must be None if ' +
                                'src is of type cpl_object_version')
            _version = src.version
            _src = src.object
        elif version is None or version == VERSION_NONE:
            _version = src.version()
            _src = src
        else:
            _version = version
            _src = src

        ret = CPLDirect.cpl_control_flow_ext(self.id, _src.id, _version, type)
        if not CPLDirect.cpl_is_ok(ret):
            raise Exception('Could not add control dependency: ' +
                            CPLDirect.cpl_error_string(ret))
        return not ret == S_DUPLICATE_IGNORED
	def info(self):
		'''
		Return cpl_object_info_t corresponding to the current object.
		'''
		objectpp = CPLDirect.new_cpl_object_info_tpp()

		ret = CPLDirect.cpl_get_object_info(self.id,
		    CPLDirect.cpl_convert_pp_cpl_object_info_t(objectpp))
		if not CPLDirect.cpl_is_ok(ret):
			CPLDirect.delete_cpl_object_info_tpp(objectpp)
			raise Exception('Unable to get object info: ' +
					CPLDirect.cpl_error_string(ret))

		op = CPLDirect.cpl_dereference_pp_cpl_object_info_t(objectpp)
		object = CPLDirect.cpl_object_info_tp_value(op)

		if object.container_id == NONE or object.container_version < 0:
			container = None
		else:
			container = cpl_object_version(cpl_object(object.container_id),
					object.container_version)

		_info = cpl_object_info(self, object.version,
				cpl_session(object.creation_session), object.creation_time,
				object.originator, object.name, object.type, container)

		CPLDirect.cpl_free_object_info(op)
		CPLDirect.delete_cpl_object_info_tpp(objectpp)

		return _info
Пример #10
0
    def info(self):
        '''
        Return cpl_object_info_t corresponding to the current object.
        '''
        objectpp = CPLDirect.new_cpl_object_info_tpp()

        ret = CPLDirect.cpl_get_object_info(
            self.id, CPLDirect.cpl_convert_pp_cpl_object_info_t(objectpp))
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_cpl_object_info_tpp(objectpp)
            raise CPLException(
                'Unable to get object info: ' +
                CPLDirect.cpl_error_string(ret), ret)

        op = CPLDirect.cpl_dereference_pp_cpl_object_info_t(objectpp)
        object = CPLDirect.cpl_object_info_tp_value(op)

        if object.bundle_id == NONE:
            bundle = None
        else:
            bundle = cpl_bundle(object.bundle_id)

        _info = cpl_object_info(self, object.creation_time, object.prefix,
                                object.name, object.type, bundle)

        CPLDirect.cpl_free_object_info(op)
        CPLDirect.delete_cpl_object_info_tpp(objectpp)

        return _info
	def ancestry(self, version=None, direction=D_ANCESTORS, flags=0):
		'''
		Return a list of cpl_ancestor objects
		'''
		if version is None:
			version = VERSION_NONE
		vp = CPLDirect.new_std_vector_cpl_ancestry_entry_tp()

		ret = CPLDirect.cpl_get_object_ancestry(self.id, version,
		    direction, flags, CPLDirect.cpl_cb_collect_ancestry_vector, vp)
		if not CPLDirect.cpl_is_ok(ret):
			CPLDirect.delete_std_vector_cpl_ancestry_entry_tp(vp)
			raise Exception('Error retrieving ancestry: ' +
					CPLDirect.cpl_error_string(ret))
			return None

		v = CPLDirect.cpl_dereference_p_std_vector_cpl_ancestry_entry_t(vp)
		l = []
		if direction == D_ANCESTORS:
			for entry in v:
				a = cpl_ancestor(entry.other_object_id,
					entry.other_object_version,
					entry.query_object_id,
					entry.query_object_version, entry.type, direction)
				l.append(a)
		else:
			for entry in v:
				a = cpl_ancestor(entry.query_object_id,
					entry.query_object_version,
					entry.other_object_id,
					entry.other_object_version, entry.type, direction)
				l.append(a)

		CPLDirect.delete_std_vector_cpl_ancestry_entry_tp(vp)
		return l
Пример #12
0
    def get_all_objects(self, fast=False):
        '''
        Return all objects in the provenance database. If fast = True, then
        fetch only incomplete information about each object, so that it is
        faster.
        '''

        if fast:
            flags = CPLDirect.CPL_I_FAST
        else:
            flags = 0

        vp = CPLDirect.new_std_vector_cplxx_object_info_tp()
        ret = CPLDirect.cpl_get_all_objects(flags,
            CPLDirect.cpl_cb_collect_object_info_vector, vp)

        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cplxx_object_info_tp(vp)
            raise CPLException('Unable to get all objects: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        v = CPLDirect.cpl_dereference_p_std_vector_cplxx_object_info_t(vp)
        l = []
        if v != S_NO_DATA :
            for e in v:
                if e.bundle_id == NONE:
                    bundle = None
                else:
                    bundle = cpl_object(e.bundle_id)
                l.append(cpl_object_info(cpl_object(e.id),
                    e.creation_time, e.prefix, e.name,
                    e.type, bundle))

        CPLDirect.delete_std_vector_cplxx_object_info_tp(vp)
        return l
Пример #13
0
    def relations(self, direction=D_ANCESTORS, flags=0):
        '''
        Return a list of cpl_relations
        '''
        vp = CPLDirect.new_std_vector_cpl_relation_tp()

        ret = CPLDirect.cpl_get_object_relations(self.id,
            direction, flags, CPLDirect.cpl_cb_collect_relation_vector, vp)
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cpl_relation_tp(vp)
            raise CPLException('Error retrieving relations: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        v = CPLDirect.cpl_dereference_p_std_vector_cpl_relation_t(vp)
        l = []
        if direction == D_ANCESTORS:
            for entry in v:
                a = cpl_relation(entry.id, entry.other_object_id,
                    entry.query_object_id, entry.type, 
                    entry.bundle_id, direction)
                l.append(a)
        else:
            for entry in v:
                a = cpl_relation(entry.id, entry.query_object_id,
                    entry.other_object_id, entry.type, 
                    entry.bundle_id, direction)
                l.append(a)

        CPLDirect.delete_std_vector_cpl_relation_tp(vp)
        return l
	def properties(self, key=None, version=None):
		'''
		Return all the properties associated with the current object.

		If key is set to something other than None, return only those
		properties matching key.

		By default, returns properties for the current version of
		the object, but if version is set to a value other than
		CPL.VERSION_NONE, then will return properties for that version.
		'''
		if version is None:
			version = VERSION_NONE
		vp = CPLDirect.new_std_vector_cplxx_property_entry_tp()

		ret = CPLDirect.cpl_get_properties(self.id, version,
		    key, CPLDirect.cpl_cb_collect_properties_vector, vp)
		if not CPLDirect.cpl_is_ok(ret):
			CPLDirect.delete_std_vector_cplxx_property_entry_tp(vp)
			raise Exception('Error retrieving properties: ' +
					CPLDirect.cpl_error_string(ret))

		v = CPLDirect.cpl_dereference_p_std_vector_cplxx_property_entry_t(vp)
		l = []
		for e in v:
			l.append([e.key, e.value])
		CPLDirect.delete_std_vector_cplxx_property_entry_tp(vp)
		return l
Пример #15
0
    def __create_or_lookup_cpl_object(self, prefix,
             name, type=None, create=None):
        '''
        Create or lookup a CPL object

        ** Parameters **
            prefix 
            name: name
            type: type, type can be none for lookup
            create:
                None: lookup or create
                True: create only
                False: lookup only
        '''

        if create == None:
            ret, idp = CPLDirect.cpl_lookup_or_create_object(prefix, name,
                              type)
            if ret == S_OBJECT_CREATED:
                ret = S_OK
        elif create:
            ret, idp = CPLDirect.cpl_create_object(prefix,
                        name, type)
        else:
            ret, idp = CPLDirect.cpl_lookup_object(prefix, name, type)
            if ret == E_NOT_FOUND:
                raise LookupError('Not found')
        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException('Could not find or create' +
                ' provenance object: ' + CPLDirect.cpl_error_string(ret), ret)
        
        r = cpl_object(idp)
        return r
	def info(self):
		'''
		Return the corresponding cpl_object_version_info for this specific
		version of the object.
		'''

		infopp = CPLDirect.new_cpl_version_info_tpp()

		ret = CPLDirect.cpl_get_version_info(self.object.id, self.version,
		    CPLDirect.cpl_convert_pp_cpl_version_info_t(infopp))
		if not CPLDirect.cpl_is_ok(ret):
			CPLDirect.delete_cpl_version_info_tpp(infopp)
			raise Exception('Unable to get object version info: ' +
					CPLDirect.cpl_error_string(ret))

		op = CPLDirect.cpl_dereference_pp_cpl_version_info_t(infopp)
		info = CPLDirect.cpl_version_info_tp_value(op)

		_info = cpl_object_version_info(self, cpl_session(info.session),
				info.creation_time)

		CPLDirect.cpl_free_version_info(op)
		CPLDirect.delete_cpl_version_info_tpp(infopp)

		return _info
Пример #17
0
    def import_document_json(self,
                             json,
                             bundle_name,
                             anchor_objects=None,
                             flags=0):
        '''
        Imports a Prov-JSON document into the CPL as a bundle.

        ** Parameters **
            json the JSON document in string format
            prefix
            bundle_name
            anchor_objects: a list of cpl_object, name tuples, can be None
            flags: a logical combination of CPL_J_* flags
        '''
        if anchor_objects == None:
            id_name_vector = CPLDirect.cplxx_id_name_pair_vector()
        else:
            id_name_pairs = [(entry.get(0).id, entry.get(1))
                             for entry in anchor_objects]
            id_name_vector = CPLDirect.cplxx_id_name_pair_vector(id_name_pairs)
        ret, idp = CPLDirect.import_document_json(json, bundle_name,
                                                  id_name_vector, flags)
        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException(
                'Error importing document:' + CPLDirect.cpl_error_string(ret),
                ret)
        return cpl_bundle(idp)
Пример #18
0
    def get_all_objects(self, prefix, type = 0, fast=False):
        '''
        Return all objects in the provenance database. If fast = True, then
        fetch only incomplete information about each object, so that it is
        faster.
        '''

        if fast:
            flags = CPLDirect.CPL_I_FAST
        else:
            flags = 0

        vp = CPLDirect.new_std_vector_cplxx_object_info_tp()
        ret = CPLDirect.cpl_get_all_objects(prefix, flags, type,
            CPLDirect.cpl_cb_collect_object_info_vector, vp)

        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cplxx_object_info_tp(vp)
            raise CPLException('Unable to get all objects: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        v = CPLDirect.cpl_dereference_p_std_vector_cplxx_object_info_t(vp)
        l = []
        if v != S_NO_DATA :
            for e in v:
                l.append(cpl_object_info(cpl_object(e.id),
                    e.creation_time, e.prefix, e.name,
                    e.type))

        CPLDirect.delete_std_vector_cplxx_object_info_tp(vp)
        return l
	def data_flow_from(self, src, type=DATA_INPUT, version=None):
		'''
		Add data flow edge of the given type from src to self. If version
		is specified, then add flow to dest with explicit version, else add
		to most recent version.

		Allowed types:
			CPL.DATA_INPUT (default)
			CPL.DATA_IPC
			CPL.DATA_TRANSLATION
			CPL.DATA_COPY

		CPL.DATA_GENERIC is an alias for CPL.DATA_INPUT.
		'''

		if isinstance(src, cpl_object_version):
			if version is not None and version != VERSION_NONE:
				raise Exception('The version argument must be None if ' +
					'src is of type cpl_object_version')
			_version = src.version
			_src = src.object
		elif version is None or version == VERSION_NONE:
			_version = src.version()
			_src = src
		else:
			_version = version
			_src = src

		ret = CPLDirect.cpl_data_flow_ext(self.id, _src.id, _version, type)
		if not CPLDirect.cpl_is_ok(ret):
			raise Exception('Could not add data dependency ' +
					CPLDirect.cpl_error_string(ret))
		return not ret == S_DUPLICATE_IGNORED
Пример #20
0
    def __init__(self, cstring="DSN=CPL;"):
        '''
		Constructor for CPL connection.

		** Parameters **
			** cstring **
			Connection string for database backend

		** Note **
		Currently the python bindings support only ODBC connection.
		RDF connector coming soon.
		'''
        global _cpl_connection

        self.connection_string = cstring
        self.closed = False

        def get_current_session():
            idp = CPLDirect.new_cpl_id_tp()
            ret = CPLDirect.cpl_get_current_session(idp)

            if not CPLDirect.cpl_is_ok(ret):
                CPLDirect.delete_cpl_id_tp(idp)
                raise Exception("Could not get current session" +
                                CPLDirect.cpl_error_string(ret))

            s = CPLDirect.cpl_id_tp_value(idp)
            i = copy_id(s)
            CPLDirect.delete_cpl_id_tp(idp)
            return i

        backend = CPLDirect.new_cpl_db_backend_tpp()
        ret = CPLDirect.cpl_create_odbc_backend(cstring,
                                                CPLDirect.CPL_ODBC_GENERIC,
                                                backend)
        if not CPLDirect.cpl_is_ok(ret):
            raise Exception("Could not create ODBC connection" +
                            CPLDirect.cpl_error_string(ret))
        self.db = CPLDirect.cpl_dereference_pp_cpl_db_backend_t(backend)
        ret = CPLDirect.cpl_attach(self.db)
        CPLDirect.delete_cpl_db_backend_tpp(backend)
        if not CPLDirect.cpl_is_ok(ret):
            raise Exception("Could not open ODBC connection" +
                            CPLDirect.cpl_error_string(ret))
        self.session = cpl_session(get_current_session())

        _cpl_connection = self
Пример #21
0
        def get_current_session():
            ret, id = CPLDirect.cpl_get_current_session()

            if not CPLDirect.cpl_is_ok(ret):
                raise CPLException("Could not get current session " +
                       CPLDirect.cpl_error_string(ret), ret)

            return id
Пример #22
0
        def get_current_session():
            ret, id = CPLDirect.cpl_get_current_session()

            if not CPLDirect.cpl_is_ok(ret):
                raise CPLException("Could not get current session " +
                       CPLDirect.cpl_error_string(ret), ret)

            return id
Пример #23
0
    def lookup_object_property_wildcard(self, value):
        ret, idp = CPLDirect.cpl_lookup_object_property_wildcard(value)

        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException('Could not find' +
                               ' object property: ' + CPLDirect.cpl_error_string(ret), ret)
        r = cpl_object(idp)
        return r
	def __init__(self, cstring="DSN=CPL;"):
		'''
		Constructor for CPL connection.

		** Parameters **
			** cstring **
			Connection string for database backend

		** Note **
		Currently the python bindings support only ODBC connection.
		RDF connector coming soon.
		'''
		global _cpl_connection

		self.connection_string = cstring
		self.closed = False

		def get_current_session():
			idp = CPLDirect.new_cpl_id_tp()
			ret = CPLDirect.cpl_get_current_session(idp)

			if not CPLDirect.cpl_is_ok(ret):
				CPLDirect.delete_cpl_id_tp(idp)
				raise Exception("Could not get current session" +
				       CPLDirect.cpl_error_string(ret))

			s = CPLDirect.cpl_id_tp_value(idp)
			i = copy_id(s)
			CPLDirect.delete_cpl_id_tp(idp)
			return i

		backend = CPLDirect.new_cpl_db_backend_tpp()
		ret = CPLDirect.cpl_create_odbc_backend(cstring,
		    CPLDirect.CPL_ODBC_GENERIC, backend)
		if not CPLDirect.cpl_is_ok(ret):
			raise Exception("Could not create ODBC connection" +
			       CPLDirect.cpl_error_string(ret))
		self.db = CPLDirect.cpl_dereference_pp_cpl_db_backend_t(backend)
		ret = CPLDirect.cpl_attach(self.db)
		CPLDirect.delete_cpl_db_backend_tpp(backend)
		if not CPLDirect.cpl_is_ok(ret):
			raise Exception("Could not open ODBC connection" +
			       CPLDirect.cpl_error_string(ret))
		self.session = cpl_session(get_current_session())

		_cpl_connection = self
Пример #25
0
 def delete_bundle(self, bundle):
     '''
     Delete the specified bundle and everything in it.
     '''
     ret = CPLDirect.cpl_delete_bundle(bundle.id)
     if not CPLDirect.cpl_is_ok(ret):
         raise CPLException('Error deleting bundle: ' +
                 CPLDirect.cpl_error_string(ret), ret)
     return None
Пример #26
0
    def lookup_bundle(self, name):
        ret, idp = CPLDirect.cpl_lookup_bundle(name)

        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException('Could not find' +
                ' provenance bundle: ' + CPLDirect.cpl_error_string(ret), ret)
        
        r = cpl_bundle(idp)
        return r
Пример #27
0
    def lookup_bundle(self, name, prefix):
        ret, idp = CPLDirect.cpl_lookup_object(prefix, name, BUNDLE)

        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException('Could not find' +
                ' provenance bundle: ' + CPLDirect.cpl_error_string(ret), ret)
        
        r = cpl_object(idp)
        return r
Пример #28
0
 def delete_bundle(self, bundle):
     '''
     Delete the specified bundle and everything in it.
     '''
     ret = CPLDirect.cpl_delete_bundle(bundle.id)
     if not CPLDirect.cpl_is_ok(ret):
         raise CPLException(
             'Error deleting bundle: ' + CPLDirect.cpl_error_string(ret),
             ret)
     return None
Пример #29
0
    def lookup_bundle(self, name):
        ret, idp = CPLDirect.cpl_lookup_bundle(name)

        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException(
                'Could not find' + ' provenance bundle: ' +
                CPLDirect.cpl_error_string(ret), ret)

        r = cpl_bundle(idp)
        return r
Пример #30
0
 def export_bundle_json(self, bundles):
     '''
     Exports bundles as a Prov-JSON document. Only works with single bundles currently.
     '''
     bundle_ids = [bundle.id for bundle in bundles]
     bundles_vec = CPLDirect.cpl_id_t_vector(bundle_ids)
     ret = CPLDirect.export_bundle_json(bundles_vec)
     if not CPLDirect.cpl_is_ok(ret.return_code):
         raise CPLException('Error exporting bundle:' +
                 CPLDirect.cpl_error_string(ret.return_code), ret)
     return ret.out_string
Пример #31
0
 def export_bundle_json(self, bundles):
     '''
     Exports bundles as a Prov-JSON document. Only works with single bundles currently.
     '''
     bundle_ids = [bundle.id for bundle in bundles]
     bundles_vec = CPLDirect.cpl_id_t_vector(bundle_ids)
     ret = CPLDirect.export_bundle_json(bundles_vec)
     if not CPLDirect.cpl_is_ok(ret.return_code):
         raise CPLException('Error exporting bundle:' +
                 CPLDirect.cpl_error_string(ret.return_code), ret)
     return ret.out_string
Пример #32
0
    def lookup_relation_from(self, src, type):
        '''
        Lookup relation from src to self.
        '''

        ret, idp = CPLDirect.cpl_lookup_relation(src.id, self.id, type)

        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException('Could not find' +
                               ' relation: ' + CPLDirect.cpl_error_string(ret), ret)
        r = cpl_relation(idp, self.id, src.id, type, D_DESCENDANTS)
        return r
Пример #33
0
    def lookup_relation_to(self, dest, type):
        '''
        Lookup relation from self to dest.
        '''

        ret, idp = CPLDirect.cpl_lookup_relation(self.id, dest.id, type)

        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException('Could not find' +
                               ' relation: ' + CPLDirect.cpl_error_string(ret), ret)
        r = cpl_relation(idp, dest.id, self.id, type, D_ANCESTORS)
        return r
Пример #34
0
    def relation_to(self, dest, type):
        '''
        Add relation type from self to dest.
        '''

        ret, idp = CPLDirect.cpl_add_relation(self.id, dest.id, type)
        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException('Could not add relation: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        r = cpl_relation(idp, dest.id, self.id, type, D_ANCESTORS)

        return r
		def get_current_session():
			idp = CPLDirect.new_cpl_id_tp()
			ret = CPLDirect.cpl_get_current_session(idp)

			if not CPLDirect.cpl_is_ok(ret):
				CPLDirect.delete_cpl_id_tp(idp)
				raise Exception("Could not get current session" +
				       CPLDirect.cpl_error_string(ret))

			s = CPLDirect.cpl_id_tp_value(idp)
			i = copy_id(s)
			CPLDirect.delete_cpl_id_tp(idp)
			return i
Пример #36
0
        def get_current_session():
            idp = CPLDirect.new_cpl_id_tp()
            ret = CPLDirect.cpl_get_current_session(idp)

            if not CPLDirect.cpl_is_ok(ret):
                CPLDirect.delete_cpl_id_tp(idp)
                raise Exception("Could not get current session" +
                                CPLDirect.cpl_error_string(ret))

            s = CPLDirect.cpl_id_tp_value(idp)
            i = copy_id(s)
            CPLDirect.delete_cpl_id_tp(idp)
            return i
Пример #37
0
    def relation_from(self, src, type):
        '''
        Add relation type from src to self.
        '''

        ret, idp = CPLDirect.cpl_add_relation(src.id, self.id, type)
        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException('Could not add relation: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        r = cpl_relation(idp, self.id, src.id, type, D_DESCENDANTS)

        return r
Пример #38
0
    def __create_or_lookup_cpl_object(self,
                                      originator,
                                      name,
                                      type,
                                      create=None,
                                      container=None):
        '''
		Create or lookup a CPL object

		** Parameters **
			originator 
			name: originator-local name
			type: originator-local type
			create:
				None: lookup or create
				True: create only
				False: lookup only
			container:
				Id of container into which to place this object.
				Only applies to create
		'''
        if container is None:
            container_id = NONE
        else:
            container_id = container.id

        idp = CPLDirect.new_cpl_id_tp()
        if create == None:
            ret = CPLDirect.cpl_lookup_or_create_object(
                originator, name, type, container_id, idp)
            if ret == S_OBJECT_CREATED:
                ret = S_OK
        elif create:
            ret = CPLDirect.cpl_create_object(originator, name, type,
                                              container_id, idp)
        else:
            ret = CPLDirect.cpl_lookup_object(originator, name, type, idp)

        if ret == E_NOT_FOUND:
            CPLDirect.delete_cpl_id_tp(idp)
            raise LookupError('Not found')
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_cpl_id_tp(idp)
            raise Exception('Could not find or create' +
                            ' provenance object: ' +
                            CPLDirect.cpl_error_string(ret))

        r = cpl_object(idp)

        CPLDirect.delete_cpl_id_tp(idp)
        return r
Пример #39
0
    def relation_to(self, dest, type, bundle):
        '''
        Add relation type from self to dest.
        '''

        bundle = bundle.id
        ret, idp = CPLDirect.cpl_add_relation(self.id, dest.id, type, bundle)
        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException('Could not add relation: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        r = cpl_relation(idp, dest.id, self.id, type, bundle, D_ANCESTORS)

        return r
Пример #40
0
    def relation_from(self, src, type, bundle):
        '''
        Add relation type from src to self.
        '''

        bundle = bundle.id
        ret, idp = CPLDirect.cpl_add_relation(src.id, self.id, type, bundle)
        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException('Could not add relation: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        r = cpl_relation(idp, self.id, src.id, type, bundle, D_DESCENDANTS)

        return r
Пример #41
0
    def version(self):
        '''
		Determine the current version of this provenance object
		'''
        vp = CPLDirect.new_cpl_version_tp()

        ret = CPLDirect.cpl_get_version(self.id, vp)
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_cpl_version_tp(vp)
            raise Exception('Could not determine the version of an object: ' +
                            CPLDirect.cpl_error_string(ret))

        v = CPLDirect.cpl_version_tp_value(vp)
        CPLDirect.delete_cpl_version_tp(vp)
        return v
Пример #42
0
    def new_version(self):
        '''
		Create a new version of this object and return the new version.
		'''
        vp = CPLDirect.new_cpl_version_tp()

        ret = CPLDirect.cpl_new_version(self.id, vp)
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_cpl_version_tp(vp)
            raise Exception('Could not createa a new version of an object: ' +
                            CPLDirect.cpl_error_string(ret))

        v = CPLDirect.cpl_version_tp_value(vp)
        CPLDirect.delete_cpl_version_tp(vp)
        return v
	def version(self):
		'''
		Determine the current version of this provenance object
		'''
		vp = CPLDirect.new_cpl_version_tp()

		ret = CPLDirect.cpl_get_version(self.id, vp)
		if not CPLDirect.cpl_is_ok(ret):
			CPLDirect.delete_cpl_version_tp(vp)
			raise Exception('Could not determine the version of an object: ' +
					CPLDirect.cpl_error_string(ret))

		v = CPLDirect.cpl_version_tp_value(vp)
		CPLDirect.delete_cpl_version_tp(vp)
		return v
	def new_version(self):
		'''
		Create a new version of this object and return the new version.
		'''
		vp = CPLDirect.new_cpl_version_tp()

		ret = CPLDirect.cpl_new_version(self.id, vp)
		if not CPLDirect.cpl_is_ok(ret):
			CPLDirect.delete_cpl_version_tp(vp)
			raise Exception('Could not createa a new version of an object: ' +
					CPLDirect.cpl_error_string(ret))

		v = CPLDirect.cpl_version_tp_value(vp)
		CPLDirect.delete_cpl_version_tp(vp)
		return v
	def close(self):
		'''
		Close database connection and session
		'''
		global _cpl_connection
		
		if self != _cpl_connection or self.closed:
			return

		ret = CPLDirect.cpl_detach()
		if not CPLDirect.cpl_is_ok(ret):
			raise Exception('Could not detach ' +
					CPLDirect.cpl_error_string(ret))

		_cpl_connection = None
		self.closed = True
Пример #46
0
    def __lookup_by_property_helper(self, vp, ret):
        if ret == E_NOT_FOUND:
            CPLDirect.delete_std_vector_cpl_id_tp(vp)
            raise LookupError('Not found')
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cpl_id_tp(vp)
            raise CPLException('Unable to lookup by property ' +
                               CPLDirect.cpl_error_string(ret), ret)

        v = CPLDirect.cpl_dereference_p_std_vector_cpl_id_t(vp)
        l = []
        for e in v:
            l.append(cpl_object(e))

        CPLDirect.delete_std_vector_cpl_id_tp(vp)
        return l
Пример #47
0
    def close(self):
        '''
        Close database connection and session
        '''
        global _cpl_connection
        
        if self != _cpl_connection or self.closed:
            return

        ret = CPLDirect.cpl_detach()
        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException('Could not detach ' +
                    CPLDirect.cpl_error_string(ret), ret)

        _cpl_connection = None
        self.closed = True
	def __create_or_lookup_cpl_object(self, originator,
		     name, type, create=None, container=None):
		'''
		Create or lookup a CPL object

		** Parameters **
			originator 
			name: originator-local name
			type: originator-local type
			create:
				None: lookup or create
				True: create only
				False: lookup only
			container:
				Id of container into which to place this object.
				Only applies to create
		'''
		if container is None:
			container_id = NONE
		else:
			container_id = container.id

		idp = CPLDirect.new_cpl_id_tp()
		if create == None:
			ret = CPLDirect.cpl_lookup_or_create_object(originator, name,
							  type, container_id, idp)
			if ret == S_OBJECT_CREATED:
				ret = S_OK
		elif create:
			ret = CPLDirect.cpl_create_object(originator,
						name, type, container_id, idp)
		else:
			ret = CPLDirect.cpl_lookup_object(originator, name, type, idp)

		if ret == E_NOT_FOUND:
			CPLDirect.delete_cpl_id_tp(idp)
			raise LookupError('Not found')
		if not CPLDirect.cpl_is_ok(ret):
			CPLDirect.delete_cpl_id_tp(idp)
			raise Exception('Could not find or create' +
			    ' provenance object: ' + CPLDirect.cpl_error_string(ret))
			
		r = cpl_object(idp)

		CPLDirect.delete_cpl_id_tp(idp)
		return r
Пример #49
0
    def get_bundle_objects(self, bundle):
        '''
        Return all objects in the specified bundle.
        '''
        vp = CPLDirect.new_std_vector_cplxx_object_info_tp()
        ret = CPLDirect.cpl_get_bundle_objects(bundle.id, CPLDirect.cpl_cb_collect_object_info_vector, vp)

        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cplxx_object_info_tp(vp)
            raise CPLException('Unable to lookup all objects: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        v = CPLDirect.cpl_dereference_p_std_vector_cplxx_object_info_t(vp)
        l = []
        if v != S_NO_DATA :
            for e in v:
                l.append(cpl_object(e.id))

        CPLDirect.delete_std_vector_cplxx_object_info_tp(vp)
        return l
Пример #50
0
    def get_bundle_objects(self, bundle):
        '''
        Return all objects in the specified bundle.
        '''
        vp = CPLDirect.new_std_vector_cplxx_object_info_tp()
        ret = CPLDirect.cpl_get_bundle_objects(bundle.id, CPLDirect.cpl_cb_collect_object_info_vector, vp)

        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cplxx_object_info_tp(vp)
            raise CPLException('Unable to lookup all objects: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        v = CPLDirect.cpl_dereference_p_std_vector_cplxx_object_info_t(vp)
        l = []
        if v != S_NO_DATA :
            for e in v:
                l.append(cpl_object(e.id))

        CPLDirect.delete_std_vector_cplxx_object_info_tp(vp)
        return l
Пример #51
0
    def get_all_objects(self, fast=False):
        '''
		Return all objects in the provenance database. If fast = True, then
		fetch only incomplete information about each object, so that it is
		faster.
		'''

        if fast:
            flags = CPLDirect.CPL_I_FAST
        else:
            flags = 0

        vp = CPLDirect.new_std_vector_cplxx_object_info_tp()
        ret = CPLDirect.cpl_get_all_objects(
            flags, CPLDirect.cpl_cb_collect_object_info_vector, vp)

        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cplxx_object_info_tp(vp)
            raise Exception('Unable to get all objects: ' +
                            CPLDirect.cpl_error_string(ret))

        v = CPLDirect.cpl_dereference_p_std_vector_cplxx_object_info_t(vp)
        l = []
        if v != S_NO_DATA:
            for e in v:
                if e.container_id == NONE or e.container_version < 0:
                    container = None
                else:
                    container = cpl_object_version(cpl_object(e.container_id),
                                                   e.container_version)
                if e.creation_session == NONE:
                    creation_session = None
                else:
                    creation_session = cpl_session(e.creation_session)
                l.append(
                    cpl_object_info(cpl_object(e.id), e.version,
                                    creation_session, e.creation_time,
                                    e.originator, e.name, e.type, container))

        CPLDirect.delete_std_vector_cplxx_object_info_tp(vp)
        return l
	def control_flow_to(self, dest, type=CONTROL_OP, version=None):
		'''
		Add control flow edge of type from self to dest. If version
		is specified, then add flow to dest with explicit version,
		else add to most recent version.

		Allowed types:
			CPL.CONTROL_OP (default)
			CPL.CONTROL_START

		CPL.CONTROL_GENERIC is an alias for CPL.CONTROL_OP.
		'''

		if version is None or version == VERSION_NONE:
			version = self.version()

		ret = CPLDirect.cpl_control_flow_ext(dest.id, self.id, version, type)
		if not CPLDirect.cpl_is_ok(ret):
			raise Exception('Could not add control dependency: ' +
					CPLDirect.cpl_error_string(ret))
		return not ret == S_DUPLICATE_IGNORED
Пример #53
0
    def prefixes(self, prefix):
        '''
        Return all the prefixes associated with the current bundle.

        If prefix return only those properties matching prefix.
        '''
        vp = CPLDirect.new_std_vector_cplxx_prefix_entry_tp()

        ret = CPLDirect.cpl_get_prefixes(self.id, prefix,
            CPLDirect.cpl_cb_collect_prefixes_vector, vp)
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cplxx_prefix_entry_tp(vp)
            raise CPLException('Error retrieving properties: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        v = CPLDirect.cpl_dereference_p_std_vector_cplxx_prefix_entry_t(vp)
        l = []
        for e in v:
            l.append((e.prefix, e.iri))
        CPLDirect.delete_std_vector_cplxx_prefix_entry_tp(vp)
        return l
	def get_all_objects(self, fast=False):
		'''
		Return all objects in the provenance database. If fast = True, then
		fetch only incomplete information about each object, so that it is
		faster.
		'''

		if fast:
			flags = CPLDirect.CPL_I_FAST
		else:
			flags = 0

		vp = CPLDirect.new_std_vector_cplxx_object_info_tp()
		ret = CPLDirect.cpl_get_all_objects(flags,
			CPLDirect.cpl_cb_collect_object_info_vector, vp)

		if not CPLDirect.cpl_is_ok(ret):
			CPLDirect.delete_std_vector_cplxx_object_info_tp(vp)
			raise Exception('Unable to get all objects: ' +
					CPLDirect.cpl_error_string(ret))

		v = CPLDirect.cpl_dereference_p_std_vector_cplxx_object_info_t(vp)
		l = []
		if v != S_NO_DATA :
			for e in v:
				if e.container_id == NONE or e.container_version < 0:
					container = None
				else:
					container = cpl_object_version(cpl_object(e.container_id),
							e.container_version)
				if e.creation_session == NONE:
					creation_session = None
				else:
					creation_session = cpl_session(e.creation_session)
				l.append(cpl_object_info(cpl_object(e.id), e.version,
					creation_session, e.creation_time, e.originator, e.name,
					e.type, container))

		CPLDirect.delete_std_vector_cplxx_object_info_tp(vp)
		return l
	def lookup_all(self, originator, name, type):
		'''
		Return all objects that have the specified originator, name,
		and type (they might differ by container).
		'''
		vp = CPLDirect.new_std_vector_cpl_id_timestamp_tp()
		ret = CPLDirect.cpl_lookup_object_ext(originator, name, type,
			L_NO_FAIL, CPLDirect.cpl_cb_collect_id_timestamp_vector, vp)

		if not CPLDirect.cpl_is_ok(ret):
			CPLDirect.delete_std_vector_cpl_id_timestamp_tp(vp)
			raise Exception('Unable to lookup all objects: ' +
					CPLDirect.cpl_error_string(ret))

		v = CPLDirect.cpl_dereference_p_std_vector_cpl_id_timestamp_t(vp)
		l = []
		if v != S_NO_DATA :
			for e in v:
				l.append(cpl_object(e.id))

		CPLDirect.delete_std_vector_cpl_id_timestamp_tp(vp)
		return l
Пример #56
0
    def properties(self, prefix=None, key=None):
        '''
        Return all the properties associated with the current relation.

        If key is set to something other than None, return only those
        properties matching key.
        '''
        vp = CPLDirect.new_std_vector_cplxx_property_entry_tp()

        ret = CPLDirect.cpl_get_relation_properties(self.id, prefix, key,
            CPLDirect.cpl_cb_collect_properties_vector, vp)
        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cplxx_property_entry_tp(vp)
            raise CPLException('Error retrieving properties: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        v = CPLDirect.cpl_dereference_p_std_vector_cplxx_property_entry_t(vp)
        l = []
        for e in v:
            l.append([e.prefix, e.key, e.value])
        CPLDirect.delete_std_vector_cplxx_property_entry_tp(vp)
        return l
Пример #57
0
    def __create_or_lookup_cpl_object(self, prefix,
             name, type=None, create=None, bundle=None):
        '''
        Create or lookup a CPL object

        ** Parameters **
            prefix 
            name: name
            type: type, type can be none for lookup
            create:
                None: lookup or create
                True: create only
                False: lookup only
            bundle:
                Id of bundle into which to place this object, can be none
        '''
        if bundle == None:
            bundle_id = NONE
        else:
            bundle_id = bundle.id

        if create == None:
            ret, idp = CPLDirect.cpl_lookup_or_create_object(prefix, name,
                              type, bundle_id)
            if ret == S_OBJECT_CREATED:
                ret = S_OK
        elif create:
            ret, idp = CPLDirect.cpl_create_object(prefix,
                        name, type, bundle_id)
        else:
            ret, idp = CPLDirect.cpl_lookup_object(prefix, name, type, bundle_id)
            if ret == E_NOT_FOUND:
                raise LookupError('Not found')
        if not CPLDirect.cpl_is_ok(ret):
            raise CPLException('Could not find or create' +
                ' provenance object: ' + CPLDirect.cpl_error_string(ret), ret)
        
        r = cpl_object(idp)
        return r
Пример #58
0
    def lookup_all_bundles(self, name):
        '''
        Return all bundles that have the specified name
        '''

        vp = CPLDirect.new_std_vector_cpl_id_timestamp_tp()
        ret = CPLDirect.cpl_lookup_bundle_ext(name,
            L_NO_FAIL, CPLDirect.cpl_cb_collect_id_timestamp_vector, vp)

        if not CPLDirect.cpl_is_ok(ret):
            CPLDirect.delete_std_vector_cpl_id_timestamp_tp(vp)
            raise CPLException('Unable to lookup all bundles: ' +
                    CPLDirect.cpl_error_string(ret), ret)

        v = CPLDirect.cpl_dereference_p_std_vector_cpl_id_timestamp_t(vp)
        l = []
        if v != S_NO_DATA :
            for e in v:
                l.append(cpl_object(e.id))

        CPLDirect.delete_std_vector_cpl_id_timestamp_tp(vp)
        return l
	def data_flow_to(self, dest, type=DATA_INPUT, version=None):
		'''
		Add data flow edge of type from self to dest. If version
		is specified, then add flow to dest with explicit version,
		else add to most recent version.

		Allowed types:
			CPL.DATA_INPUT (default)
			CPL.DATA_IPC
			CPL.DATA_TRANSLATION
			CPL.DATA_COPY

		CPL.DATA_GENERIC is an alias for CPL.DATA_INPUT.
		'''

		if version is None or version == VERSION_NONE:
			version = self.version()

		ret = CPLDirect.cpl_data_flow_ext(dest.id, self.id, version, type)
		if not CPLDirect.cpl_is_ok(ret):
			raise Exception('Could not add data dependency ' +
					CPLDirect.cpl_error_string(ret))
		return not ret == S_DUPLICATE_IGNORED
	def info(self):
		'''
		Return the cpl_session_info object associated with this session.
		'''

		sessionpp = CPLDirect.new_cpl_session_info_tpp()
		ret = CPLDirect.cpl_get_session_info(self.id,
		    CPLDirect.cpl_convert_pp_cpl_session_info_t(sessionpp))
		if not CPLDirect.cpl_is_ok(ret):
			CPLDirect.delete_cpl_session_info_tpp(sessionpp)
			raise Exception('Could not find session information: ' +
					CPLDirect.cpl_error_string(ret))

		sessionp = CPLDirect.cpl_dereference_pp_cpl_session_info_t(sessionpp)
		info = CPLDirect.cpl_session_info_tp_value(sessionp)

		_info = cpl_session_info(self, info.mac_address, info.user,
				info.pid, info.program, info.cmdline, info.start_time)
		
		CPLDirect.cpl_free_session_info(sessionp)
		CPLDirect.delete_cpl_session_info_tpp(sessionpp)
		
		return _info