Lines Matching defs:rbtdbiter

5718 	rbtdb_dbiterator_t *rbtdbiter;
5722 rbtdbiter = isc_mem_get(rbtdb->common.mctx, sizeof(*rbtdbiter));
5723 if (rbtdbiter == NULL)
5726 rbtdbiter->common.methods = &dbiterator_methods;
5727 rbtdbiter->common.db = NULL;
5728 dns_db_attach(db, &rbtdbiter->common.db);
5729 rbtdbiter->common.relative_names =
5731 rbtdbiter->common.magic = DNS_DBITERATOR_MAGIC;
5732 rbtdbiter->common.cleaning = ISC_FALSE;
5733 rbtdbiter->paused = ISC_TRUE;
5734 rbtdbiter->tree_locked = isc_rwlocktype_none;
5735 rbtdbiter->result = ISC_R_SUCCESS;
5736 dns_fixedname_init(&rbtdbiter->name);
5737 dns_fixedname_init(&rbtdbiter->origin);
5738 rbtdbiter->node = NULL;
5739 rbtdbiter->delcnt = 0;
5740 rbtdbiter->nsec3only = ISC_TF((options & DNS_DB_NSEC3ONLY) != 0);
5741 rbtdbiter->nonsec3 = ISC_TF((options & DNS_DB_NONSEC3) != 0);
5742 memset(rbtdbiter->deletions, 0, sizeof(rbtdbiter->deletions));
5743 dns_rbtnodechain_init(&rbtdbiter->chain, db->mctx);
5744 dns_rbtnodechain_init(&rbtdbiter->nsec3chain, db->mctx);
5745 if (rbtdbiter->nsec3only)
5746 rbtdbiter->current = &rbtdbiter->nsec3chain;
5748 rbtdbiter->current = &rbtdbiter->chain;
5750 *iteratorp = (dns_dbiterator_t *)rbtdbiter;
9249 reference_iter_node(rbtdb_dbiterator_t *rbtdbiter) {
9250 dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db;
9251 dns_rbtnode_t *node = rbtdbiter->node;
9256 INSIST(rbtdbiter->tree_locked != isc_rwlocktype_none);
9257 reactivate_node(rbtdb, node, rbtdbiter->tree_locked);
9261 dereference_iter_node(rbtdb_dbiterator_t *rbtdbiter) {
9262 dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db;
9263 dns_rbtnode_t *node = rbtdbiter->node;
9272 rbtdbiter->tree_locked, ISC_FALSE);
9275 rbtdbiter->node = NULL;
9279 flush_deletions(rbtdb_dbiterator_t *rbtdbiter) {
9281 dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db;
9286 if (rbtdbiter->delcnt != 0) {
9296 rbtdbiter->delcnt,
9299 if (rbtdbiter->tree_locked == isc_rwlocktype_read) {
9304 rbtdbiter->tree_locked = isc_rwlocktype_write;
9306 for (i = 0; i < rbtdbiter->delcnt; i++) {
9307 node = rbtdbiter->deletions[i];
9313 rbtdbiter->tree_locked, ISC_FALSE);
9317 rbtdbiter->delcnt = 0;
9322 rbtdbiter->tree_locked = isc_rwlocktype_read;
9325 rbtdbiter->tree_locked = isc_rwlocktype_none;
9331 resume_iteration(rbtdb_dbiterator_t *rbtdbiter) {
9332 dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db;
9334 REQUIRE(rbtdbiter->paused);
9335 REQUIRE(rbtdbiter->tree_locked == isc_rwlocktype_none);
9338 rbtdbiter->tree_locked = isc_rwlocktype_read;
9340 rbtdbiter->paused = ISC_FALSE;
9345 rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)(*iteratorp);
9346 dns_rbtdb_t *rbtdb = (dns_rbtdb_t *)rbtdbiter->common.db;
9349 if (rbtdbiter->tree_locked == isc_rwlocktype_read) {
9351 rbtdbiter->tree_locked = isc_rwlocktype_none;
9353 INSIST(rbtdbiter->tree_locked == isc_rwlocktype_none);
9355 dereference_iter_node(rbtdbiter);
9357 flush_deletions(rbtdbiter);
9359 dns_db_attach(rbtdbiter->common.db, &db);
9360 dns_db_detach(&rbtdbiter->common.db);
9362 dns_rbtnodechain_reset(&rbtdbiter->chain);
9363 dns_rbtnodechain_reset(&rbtdbiter->nsec3chain);
9364 isc_mem_put(db->mctx, rbtdbiter, sizeof(*rbtdbiter));
9373 rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator;
9377 if (rbtdbiter->result != ISC_R_SUCCESS &&
9378 rbtdbiter->result != ISC_R_NOTFOUND &&
9379 rbtdbiter->result != DNS_R_PARTIALMATCH &&
9380 rbtdbiter->result != ISC_R_NOMORE)
9381 return (rbtdbiter->result);
9383 if (rbtdbiter->paused)
9384 resume_iteration(rbtdbiter);
9386 dereference_iter_node(rbtdbiter);
9388 name = dns_fixedname_name(&rbtdbiter->name);
9389 origin = dns_fixedname_name(&rbtdbiter->origin);
9390 dns_rbtnodechain_reset(&rbtdbiter->chain);
9391 dns_rbtnodechain_reset(&rbtdbiter->nsec3chain);
9393 if (rbtdbiter->nsec3only) {
9394 rbtdbiter->current = &rbtdbiter->nsec3chain;
9395 result = dns_rbtnodechain_first(rbtdbiter->current,
9398 rbtdbiter->current = &rbtdbiter->chain;
9399 result = dns_rbtnodechain_first(rbtdbiter->current,
9401 if (!rbtdbiter->nonsec3 && result == ISC_R_NOTFOUND) {
9402 rbtdbiter->current = &rbtdbiter->nsec3chain;
9403 result = dns_rbtnodechain_first(rbtdbiter->current,
9409 result = dns_rbtnodechain_current(rbtdbiter->current, NULL,
9410 NULL, &rbtdbiter->node);
9412 rbtdbiter->new_origin = ISC_TRUE;
9413 reference_iter_node(rbtdbiter);
9420 rbtdbiter->result = result;
9423 ENSURE(!rbtdbiter->paused);
9431 rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator;
9435 if (rbtdbiter->result != ISC_R_SUCCESS &&
9436 rbtdbiter->result != ISC_R_NOTFOUND &&
9437 rbtdbiter->result != DNS_R_PARTIALMATCH &&
9438 rbtdbiter->result != ISC_R_NOMORE)
9439 return (rbtdbiter->result);
9441 if (rbtdbiter->paused)
9442 resume_iteration(rbtdbiter);
9444 dereference_iter_node(rbtdbiter);
9446 name = dns_fixedname_name(&rbtdbiter->name);
9447 origin = dns_fixedname_name(&rbtdbiter->origin);
9448 dns_rbtnodechain_reset(&rbtdbiter->chain);
9449 dns_rbtnodechain_reset(&rbtdbiter->nsec3chain);
9452 if (rbtdbiter->nsec3only && !rbtdbiter->nonsec3) {
9453 rbtdbiter->current = &rbtdbiter->nsec3chain;
9454 result = dns_rbtnodechain_last(rbtdbiter->current,
9457 if (!rbtdbiter->nsec3only && result == ISC_R_NOTFOUND) {
9458 rbtdbiter->current = &rbtdbiter->chain;
9459 result = dns_rbtnodechain_last(rbtdbiter->current, rbtdb->tree,
9463 result = dns_rbtnodechain_current(rbtdbiter->current, NULL,
9464 NULL, &rbtdbiter->node);
9466 rbtdbiter->new_origin = ISC_TRUE;
9467 reference_iter_node(rbtdbiter);
9474 rbtdbiter->result = result;
9482 rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator;
9486 if (rbtdbiter->result != ISC_R_SUCCESS &&
9487 rbtdbiter->result != ISC_R_NOTFOUND &&
9488 rbtdbiter->result != DNS_R_PARTIALMATCH &&
9489 rbtdbiter->result != ISC_R_NOMORE)
9490 return (rbtdbiter->result);
9492 if (rbtdbiter->paused)
9493 resume_iteration(rbtdbiter);
9495 dereference_iter_node(rbtdbiter);
9497 iname = dns_fixedname_name(&rbtdbiter->name);
9498 origin = dns_fixedname_name(&rbtdbiter->origin);
9499 dns_rbtnodechain_reset(&rbtdbiter->chain);
9500 dns_rbtnodechain_reset(&rbtdbiter->nsec3chain);
9502 if (rbtdbiter->nsec3only) {
9503 rbtdbiter->current = &rbtdbiter->nsec3chain;
9505 &rbtdbiter->node,
9506 rbtdbiter->current,
9508 } else if (rbtdbiter->nonsec3) {
9509 rbtdbiter->current = &rbtdbiter->chain;
9511 &rbtdbiter->node,
9512 rbtdbiter->current,
9518 rbtdbiter->current = &rbtdbiter->chain;
9520 &rbtdbiter->node,
9521 rbtdbiter->current,
9526 &node, &rbtdbiter->nsec3chain,
9530 rbtdbiter->node = node;
9531 rbtdbiter->current = &rbtdbiter->nsec3chain;
9538 tresult = dns_rbtnodechain_current(rbtdbiter->current, iname,
9541 rbtdbiter->new_origin = ISC_TRUE;
9542 reference_iter_node(rbtdbiter);
9545 rbtdbiter->node = NULL;
9548 rbtdbiter->node = NULL;
9550 rbtdbiter->result = (result == DNS_R_PARTIALMATCH) ?
9559 rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator;
9563 REQUIRE(rbtdbiter->node != NULL);
9565 if (rbtdbiter->result != ISC_R_SUCCESS)
9566 return (rbtdbiter->result);
9568 if (rbtdbiter->paused)
9569 resume_iteration(rbtdbiter);
9571 name = dns_fixedname_name(&rbtdbiter->name);
9572 origin = dns_fixedname_name(&rbtdbiter->origin);
9573 result = dns_rbtnodechain_prev(rbtdbiter->current, name, origin);
9574 if (result == ISC_R_NOMORE && !rbtdbiter->nsec3only &&
9575 !rbtdbiter->nonsec3 &&
9576 &rbtdbiter->nsec3chain == rbtdbiter->current) {
9577 rbtdbiter->current = &rbtdbiter->chain;
9578 dns_rbtnodechain_reset(rbtdbiter->current);
9579 result = dns_rbtnodechain_last(rbtdbiter->current, rbtdb->tree,
9585 dereference_iter_node(rbtdbiter);
9588 rbtdbiter->new_origin = ISC_TF(result == DNS_R_NEWORIGIN);
9589 result = dns_rbtnodechain_current(rbtdbiter->current, NULL,
9590 NULL, &rbtdbiter->node);
9594 reference_iter_node(rbtdbiter);
9596 rbtdbiter->result = result;
9604 rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator;
9608 REQUIRE(rbtdbiter->node != NULL);
9610 if (rbtdbiter->result != ISC_R_SUCCESS)
9611 return (rbtdbiter->result);
9613 if (rbtdbiter->paused)
9614 resume_iteration(rbtdbiter);
9616 name = dns_fixedname_name(&rbtdbiter->name);
9617 origin = dns_fixedname_name(&rbtdbiter->origin);
9618 result = dns_rbtnodechain_next(rbtdbiter->current, name, origin);
9619 if (result == ISC_R_NOMORE && !rbtdbiter->nsec3only &&
9620 !rbtdbiter->nonsec3 && &rbtdbiter->chain == rbtdbiter->current) {
9621 rbtdbiter->current = &rbtdbiter->nsec3chain;
9622 dns_rbtnodechain_reset(rbtdbiter->current);
9623 result = dns_rbtnodechain_first(rbtdbiter->current,
9629 dereference_iter_node(rbtdbiter);
9632 rbtdbiter->new_origin = ISC_TF(result == DNS_R_NEWORIGIN);
9633 result = dns_rbtnodechain_current(rbtdbiter->current, NULL,
9634 NULL, &rbtdbiter->node);
9637 reference_iter_node(rbtdbiter);
9639 rbtdbiter->result = result;
9649 rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator;
9650 dns_rbtnode_t *node = rbtdbiter->node;
9652 dns_name_t *nodename = dns_fixedname_name(&rbtdbiter->name);
9653 dns_name_t *origin = dns_fixedname_name(&rbtdbiter->origin);
9655 REQUIRE(rbtdbiter->result == ISC_R_SUCCESS);
9656 REQUIRE(rbtdbiter->node != NULL);
9658 if (rbtdbiter->paused)
9659 resume_iteration(rbtdbiter);
9662 if (rbtdbiter->common.relative_names)
9667 if (rbtdbiter->common.relative_names && rbtdbiter->new_origin)
9676 *nodep = rbtdbiter->node;
9686 if (rbtdbiter->delcnt == DELETION_BATCH_MAX)
9687 flush_deletions(rbtdbiter);
9697 rbtdbiter->deletions[rbtdbiter->delcnt++] = node;
9711 rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator;
9713 if (rbtdbiter->result != ISC_R_SUCCESS &&
9714 rbtdbiter->result != ISC_R_NOTFOUND &&
9715 rbtdbiter->result != DNS_R_PARTIALMATCH &&
9716 rbtdbiter->result != ISC_R_NOMORE)
9717 return (rbtdbiter->result);
9719 if (rbtdbiter->paused)
9722 rbtdbiter->paused = ISC_TRUE;
9724 if (rbtdbiter->tree_locked != isc_rwlocktype_none) {
9725 INSIST(rbtdbiter->tree_locked == isc_rwlocktype_read);
9727 rbtdbiter->tree_locked = isc_rwlocktype_none;
9730 flush_deletions(rbtdbiter);
9737 rbtdb_dbiterator_t *rbtdbiter = (rbtdb_dbiterator_t *)iterator;
9738 dns_name_t *origin = dns_fixedname_name(&rbtdbiter->origin);
9740 if (rbtdbiter->result != ISC_R_SUCCESS)
9741 return (rbtdbiter->result);