示例#1
0
class _CouchdbCommon(object):

    def __init__(self, log=log):
        self.log = log
        self._zclient = ZeitgeistClient()
        self._zdclient = ZeitgeistDBusInterface()
        self._database = DesktopDatabase(DATABASE_NAME, create=True)

        self._user = os.environ.get('USERNAME')
        self._machine = os.uname()

    def _add_view(self, view):
        #create views if not exist
        if not self._database.view_exists(view.name, DATABASE_NAME):
            self.log(logging.DEBUG, """adding in %s view %s with: %s""", DATABASE_NAME, view.name, view.view)
            self._database.add_view(view.name, view.view, None, DATABASE_NAME)
            self._database.execute_view(view.name)
        else:
            self.log(logging.DEBUG, """view %s exist in %s""", view.name, DATABASE_NAME)

    def _execute_view(self, view):
        self._add_view(view)
        return self._database.execute_view(view.name, DATABASE_NAME)

    def last_transaction(self, when=None):
        '''
            Getter or Setter for last_transaction
            event: dict, last sync item
            return dict 
        '''
        if when:
            self.save_config("last_transaction", when)
        else:
            when = self.config("last_transaction")
            if not when:
                self._database.execute_view(VIEW.TIMESTAMP.name)
        return when

    def save_config(self, attr, val):
        self.log(logging.DEBUG, "setting value %s for %s", attr, val)
        if self._database.record_exists(attr):
            record = self._database.get_record(attr)
            self._database.update_fields(attr, {'value': val})
        else:
            record = CouchRecord({'value': val}, COUCH_CFG_TYPE, attr)
            self.put_record(record)


    def config(self, attr):
        self.log(logging.DEBUG, "getting info: %s", attr)
        if self._database.record_exists(attr):
            cfg = self._database.get_record(attr)
            self.log(logging.DEBUG, "value of info %s is %s", attr, cfg['value'])
            return cfg['value']
        self.log(logging.DEBUG, "can't get config %s", attr)

    def dbToZg(self, obj):
        '''
            Convert courchrecord in zeiteist event
        '''
        return Event.new_for_values(**obj)

    def zgToDb(self, obj):
        '''
            Convert zeitgeist event in couchrecord
        '''
        result = {
                    'application_annotations':{
                        'zeitgeist':{
                                'user': self._user,
                                'machine': self._machine
                        }
                    }
                 }
        if obj.get_actor(): result['actor'] = obj.get_actor()
        if obj.get_id(): result['id'] = int(obj.get_id())
        if obj.get_interpretation(): result['interpretation'] = obj.get_interpretation()
        if obj.get_manifestation(): result['manifestation'] = obj.get_manifestation()
        if obj.get_origin(): result['origin'] = obj.get_origin()
        if obj.get_payload(): result['payload'] = obj.get_payload()
        if obj.get_timestamp(): result['timestamp'] = int(obj.get_timestamp())
        result['subjects'] = []
        for subject in obj.get_subjects():
            sub = {}
            if subject.get_interpretation(): sub['interpretation'] = subject.get_interpretation()
            if subject.get_manifestation(): sub['manifestation'] = subject.get_manifestation()
            if subject.get_mimetype(): sub['mimetype'] = subject.get_mimetype()
            if subject.get_origin(): sub['origin'] = subject.get_origin()
            if subject.get_storage(): sub['storage'] = subject.get_storage()
            if subject.get_text(): sub['text'] = subject.get_text()
            if subject.get_uri(): sub['uri'] = subject.get_uri()
            result['subjects'].append(sub)
        return CouchRecord(result, COUCH_OBJ_TYPE)

    def put_record(self, record):
        self._database.put_record(record)

    def put_records(self, records):
        self._database.put_records_batch(records)