Exemple #1
0
point_t*
insert_(quadtree_t* tree, node_t *root, point_t *point, bool update) {
  if (node_isempty(root)) {
    root->point = point;
    return point;
  } else if (node_isleaf(root)) {
    if (root->point->x == point->x && root->point->y == point->y) {
      if(update) {
        reset_node_(tree, root);
        root->point = point;
        point = NULL;
        return root->point;
      } else {
        return root->point;
      }
    } else {
      if (!split_node_(tree, root)) return NULL;
      return insert_(tree, root, point, update);
    }
  } else if (node_ispointer(root)) {
    node_t* quadrant = get_quadrant_(root, point);
    if(!quadrant) return NULL;
    return insert_(tree, quadrant, point, update);
  }
  return NULL;
}
/* TODO: Add 'tainted' flag to the LDAP instance if something went wrong. */
static isc_result_t
subtractrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
		 dns_rdataset_t *rdataset, unsigned int options,
		 dns_rdataset_t *newrdataset)
{
	ldapdb_t *ldapdb = (ldapdb_t *) db;
	dns_fixedname_t fname;
	dns_name_t *zname = NULL;
	dns_rdatalist_t *rdlist = NULL;
	isc_boolean_t empty_node = ISC_FALSE;
	isc_result_t substract_result;
	isc_result_t result;

	REQUIRE(VALID_LDAPDB(ldapdb));

	dns_fixedname_init(&fname);
	zname = dns_db_origin(ldapdb->rbtdb);

	result = dns_db_subtractrdataset(ldapdb->rbtdb, node, version,
					 rdataset, options, newrdataset);
	/* DNS_R_NXRRSET mean that whole RRset was deleted. */
	if (result != ISC_R_SUCCESS && result != DNS_R_NXRRSET)
		goto cleanup;

	substract_result = result;
	/* TODO: Could it create some race-condition? What about unprocessed
	 * changes in synrepl queue? */
	if (substract_result == DNS_R_NXRRSET) {
		CHECK(node_isempty(ldapdb->rbtdb, node, version, 0,
				   &empty_node));
	}

	result = dns_rdatalist_fromrdataset(rdataset, &rdlist);
	INSIST(result == ISC_R_SUCCESS);
	CHECK(ldapdb_name_fromnode(node, dns_fixedname_name(&fname)));
	CHECK(remove_values_from_ldap(dns_fixedname_name(&fname), zname, ldapdb->ldap_inst,
				      rdlist, empty_node));

cleanup:
	if (result == ISC_R_SUCCESS)
		result = substract_result;
	return result;
}
/* This function is usually not called for non-cache DBs, so we don't need to
 * care about performance.
 * TODO: Add 'tainted' flag to the LDAP instance if something went wrong. */
static isc_result_t
deleterdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
	       dns_rdatatype_t type, dns_rdatatype_t covers)
{
	ldapdb_t *ldapdb = (ldapdb_t *) db;
	dns_fixedname_t fname;
	dns_name_t *zname = NULL;
	isc_boolean_t empty_node;
	isc_result_t result;

	REQUIRE(VALID_LDAPDB(ldapdb));

	dns_fixedname_init(&fname);
	zname = dns_db_origin(ldapdb->rbtdb);

	result = dns_db_deleterdataset(ldapdb->rbtdb, node, version, type,
				       covers);
	/* DNS_R_UNCHANGED mean that there was no RRset with given type. */
	if (result != ISC_R_SUCCESS)
		goto cleanup;

	/* TODO: Could it create some race-condition? What about unprocessed
	 * changes in synrepl queue? */
	CHECK(node_isempty(ldapdb->rbtdb, node, version, 0, &empty_node));
	CHECK(ldapdb_name_fromnode(node, dns_fixedname_name(&fname)));

	if (empty_node == ISC_TRUE) {
		CHECK(remove_entry_from_ldap(dns_fixedname_name(&fname), zname,
					     ldapdb->ldap_inst));
	} else {
		CHECK(remove_rdtype_from_ldap(dns_fixedname_name(&fname), zname,
					    ldapdb->ldap_inst, type));
	}

cleanup:
	return result;
}