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; }