Exemple #1
0
    def wait(self, callback, **params):
        if 'since' not in params:
            params['since'] = 0

        self._params = params

        consumer = Consumer(db)

        def process(change):
            seq = change.get('seq')
            last_seq = change.get('last_seq')

            if seq is not None:
                if seq > self._params['since']:
                    self._params['since'] = seq

                callback(change)
            elif last_seq is not None:
                self._params['since'] = last_seq

        while True:
            try:
                consumer.wait(process, **self._params)
            except NoMoreData:
                pass
def main(db_name, db_user, db_pass, db_host, sequence_file, zone_dir, **tls_args):
    # Starting Sequence for change stream
    sequence = sequence_read(sequence_file)
    click.echo('Skipping %s changes.' % sequence)
    # CouchDB Connection
    tls_args['cert_reqs'] = ssl.CERT_REQUIRED
    tls_args['ssl_version'] = ssl.PROTOCOL_TLSv1_2
    auth = CouchdbResource(filters=[BasicAuth(db_user, db_pass)], **tls_args)
    server = Server(uri=db_host, resource_instance=auth)
    db = server[db_name]

    if sequence == 0:
        click.echo('Fast track syncing all zones...')
        c = Consumer(db)
        result = c.fetch(descending=True, limit=1)
        # Fast track to this sequence
        sequence = result['last_seq']
        # Go get all the current zones.
        zones = c.fetch()
        for zone in zones['results']:
            domain = zone['id']
            try:
                doc = db.get(docid=domain)
            except ResourceNotFound, e:
                click.echo('%s not found (this is normal if the zone was deleted)' % domain)
            else:
                zone_update(domain, doc['data'], zone_dir)
        sequence_write(sequence_file, sequence)  # Keep track of our sync point
        click.echo('Fast track syncing done')
Exemple #3
0
def get_recent_changes(db, limit=500):
    c = Consumer(db)
    changes = c.fetch(limit=limit, descending=True,
                      include_docs=True)['results']
    for row in changes:
        yield {
            'id': row['id'],
            'rev': row['changes'][0]['rev'],
            'domain': row['doc'].get('domain', '[no domain]'),
            'doc_type': row['doc'].get('doc_type', '[no doc_type]'),
        }
Exemple #4
0
def main():
    s = Server('http://*****:*****@127.0.0.1:5984')
    db = s['datadb']
    c = Consumer(db)

    #start listening since = current update sequence.
    #callback function is run.main
    #heartbeat every minute to keep the connection alive.
    c.wait(callback,
           since=db.info()['update_seq'],
           filter='proc/newproc0',
           feed='continuous',
           heartbeat=60000)
Exemple #5
0
def process_couchdb_changes():
    server = Server(settings.COUCHDB_SERVER)
    db = server.get_or_create_db('openelm')
    consumer = Consumer(db)
    sequence = SyncSequenceCache.objects.get(pk=1)
    changes = consumer.fetch(filter='record/new_records', since=sequence.last_sequence_id)
    if changes:
        for change in changes['results']:
            record_id = change['id']
            copy_photo_for_record.delay(record_id)
            send_new_record_email.delay(record_id)
        sequence.last_sequence_id = changes['last_seq']
        sequence.save()