예제 #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