From 051d47d21197f4095a6e9f0b2bda0540ad0f771e Mon Sep 17 00:00:00 2001 From: Nico Jehle Date: Wed, 6 Aug 2025 14:24:32 +0000 Subject: [PATCH] dim/rpc: quick path for simple wildcard in rr_list() special handling for simple widcards (`*.some.zone.`) so DIM does not have to do a full table scan on the resource records table filter by the views of the record's zone to avoid that --- dim/dim/rpc.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/dim/dim/rpc.py b/dim/dim/rpc.py index 3617c73..8d2723d 100644 --- a/dim/dim/rpc.py +++ b/dim/dim/rpc.py @@ -2296,7 +2296,19 @@ def rr_list(self, pattern=None, type=None, zone=None, view=None, profile=False, .join(RR.view).join(ZoneView.zone).filter(Zone.profile == profile)\ .outerjoin(RR.ipblock).outerjoin(Ipblock.layer3domain) soa_query = ZoneView.query.join(ZoneView.zone).options(contains_eager(ZoneView.zone)).filter(Zone.profile == profile) - if zone: + if pattern and not zone and pattern.startswith('*') and pattern.endswith('.') and pattern.count('*') == 1 and pattern.count('?') == 0: + _zone = get_rr_zone(pattern, zone=None, profile=profile) + _zones = [_zone] + if _zone and pattern == f'*.{_zone.name}': + _zones += list(db.session.query(Zone).filter(Zone.name.like(f'%.{_zone.name}')).filter(Zone.profile==profile).all()) + _zones = [z for z in _zones if z] + if len(_zones) >= 1: + _views = [get_view(_z, profile) for _z in _zones] + if len(_views) >= 1: + rr_query = rr_query.filter(RR.zoneview_id.in_([_view.id for _view in _views])) + soa_query = soa_query.filter(RR.zoneview_id.in_([_view.id for _view in _views])) + reverse_zone_sorting = False + elif zone: zone = get_zone(zone, profile) view = get_view(zone, view) rr_query = rr_query.filter(RR.view == view)