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')
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]'), }
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)
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()