a
    PҚh-                     @   s   d Z ddlZddlZddlmZmZmZmZmZ ddl	Z
ddlZ
ddlZ
ddlZ
ddlZ
ddlZ
ddlZ
ddlZ
ddlZ
G dd de
jjZe
jjZe
jjZe
jjZe
jjZe
jjZe
jjZG dd de
jjZdS )zDNS Versioned Zones.    N)CallableDequeOptionalSetUnionc                   @   s   e Zd ZdZdS )UseTransactionz-To alter a versioned zone, use a transaction.N)__name__
__module____qualname____doc__ r   r   H/wd/webapps/venvs/v2025_4um/lib/python3.9/site-packages/dns/versioned.pyr      s   r   c                	       sX  e Zd Zg dZeZejjddfe	e
ejjef  ejjee	ed ege	e f  d fddZd7e	e e	e eddd	Zd8eedddZdd Zdd Zdd Ze	e ddddZe	ed ege	e f  ddddZdd Zdd Zdd Zd d! Zd"d# Z d$d% Z!d9e
ejjef eej"jd& fd'd(Z#e
ejjef dd)d*d+Z$ej%j&d
fe
ejjef e
ej%j'ef e
ej%j'ef eej(j)d, fd-d.Z*ej%j&d
fe
ejjef e
ej%j'ef e
ej%j'ef ee	ej(j) d, fd/d0Z+ej%j&fe
ejjef e
ej%j'ef e
ej%j'ef dd1d2d3Z,e
ejjef ej(j)dd4d5d6Z-  Z.S ):Zone)	_versionsZ_versions_lock
_write_txn_write_waiters_write_event_pruning_policy_readersTN)originrdclass
relativizepruning_policyc                    st   t  ||| t | _t | _|du r6| j| _	n|| _	d| _
d| _t | _t | _| dt| dd| dS )a  Initialize a versioned zone object.

        *origin* is the origin of the zone.  It may be a ``dns.name.Name``,
        a ``str``, or ``None``.  If ``None``, then the zone's origin will
        be set by the first ``$ORIGIN`` line in a zone file.

        *rdclass*, an ``int``, the zone's rdata class; the default is class IN.

        *relativize*, a ``bool``, determine's whether domain names are
        relativized to the zone's origin.  The default is ``True``.

        *pruning policy*, a function taking a ``Zone`` and a ``Version`` and returning
        a ``bool``, or ``None``.  Should the version be pruned?  If ``None``,
        the default policy, which retains one version is used.
        NT)replacement)super__init__collectionsdequer   	threadingLock_version_lock_default_pruning_policyr   r   r   r   setr   _commit_version_unlockedWritableVersion)selfr   r   r   r   	__class__r   r   r   .   s    



zZone.__init__)idserialreturnc           	      C   s:  |d ur|d urt d| j |d urbd }t| jD ]}|j|kr8|} qPq8|d u rtdn|d ur| jrztjj	}n| j
d usJ | j
}d }t| jD ]@}|j|}|r|| jtjj}|r|d j|kr|} qq|d u rtdn
| jd }t| d|}| j| |W  d    S 1 s,0    Y  d S )Nz!cannot specify both id and serialzversion not foundr   zserial not foundF)
ValueErrorr    reversedr   r(   KeyErrorr   dnsnameemptyr   nodesgetget_rdatasetr   	rdatatypeZSOAr)   Transactionr   add)	r%   r(   r)   versionvZonamenZrdstxnr   r   r   readerS   s<    





zZone.readerF)r   r*   c                 C   s   d }| j \ | jd u rD|| jkrDt| |dd| _d | _W d    qt }| j| W d    n1 sl0    Y  |  q| j	  | jS )NT)Zmake_immutable)
r    r   r   r6   r   Eventr   appendwaitZ_setup_version)r%   r   eventr   r   r   writerw   s    *

zZone.writerc                 C   s(   t | jdkr$| j | _| j  d S )Nr   )lenr   popleftr   r"   )r%   r   r   r   !_maybe_wakeup_one_waiter_unlocked   s    z&Zone._maybe_wakeup_one_waiter_unlockedc                 C   s   dS )NTr   )r%   zoner8   r   r   r   r!      s    zZone._default_pruning_policyc                 C   st   t | jdksJ t | jdkr6tdd | jD }n| jd j}| jd j|k rp| | | jd rp| j  qBd S )Nr   c                 s   s   | ]}|j jV  qd S N)r8   r(   ).0r;   r   r   r   	<genexpr>       z0Zone._prune_versions_unlocked.<locals>.<genexpr>r+   )rB   r   r   minr(   r   rC   )r%   Z
least_keptr   r   r   _prune_versions_unlocked   s    
zZone._prune_versions_unlocked)max_versionsr*   c                    sD    dur dk rt d du r*dd }n fdd}| | dS )zYSet a pruning policy that retains up to the specified number
        of versions
        N   zmax versions must be at least 1c                 S   s   dS )NFr   rE   _r   r   r   policy   s    z%Zone.set_max_versions.<locals>.policyc                    s   t | j kS rF   )rB   r   rN   rL   r   r   rP      s    )r,   set_pruning_policy)r%   rL   rP   r   rQ   r   set_max_versions   s    
zZone.set_max_versions)rP   r*   c                 C   sF   |du r| j }| j || _|   W d   n1 s80    Y  dS )a  Set the pruning policy for the zone.

        The *policy* function takes a `Version` and returns `True` if
        the version should be pruned, and `False` otherwise.  `None`
        may also be specified for policy, in which case the default policy
        is used.

        Pruning checking proceeds from the least version and the first
        time the function returns `False`, the checking stops.  I.e. the
        retained versions are always a consecutive sequence.
        N)r!   r    r   rK   )r%   rP   r   r   r   rR      s
    zZone.set_pruning_policyc                 C   s>   | j $ | j| |   W d    n1 s00    Y  d S rF   )r    r   removerK   r%   r;   r   r   r   	_end_read   s    zZone._end_readc                 C   s    | j |ksJ d | _ |   d S rF   )r   rD   rU   r   r   r   _end_write_unlocked   s    zZone._end_write_unlockedc                 C   s4   | j  | | W d    n1 s&0    Y  d S rF   )r    rW   rU   r   r   r   
_end_write   s    zZone._end_writec                 C   sB   | j | |   |j| _| jd u r,|| _|d ur>| | d S rF   )r   r>   rK   r2   r   rW   r%   r;   r8   r   r   r   r   r#      s    
zZone._commit_version_unlockedc                 C   s8   | j  | ||| W d    n1 s*0    Y  d S rF   )r    r#   rY   r   r   r   _commit_version  s    zZone._commit_versionc                 C   s(   t | jdkr | jd jd }nd}|S )Nr   r+   rM   )rB   r   r(   )r%   r(   r   r   r   _get_next_version_id  s    zZone._get_next_version_id)r0   creater*   c                    s   |rt t |S rF   )r   r   	find_node)r%   r0   r\   r&   r   r   r]     s    zZone.find_node)r0   r*   c                 C   s   t d S rF   r   )r%   r0   r   r   r   delete_node  s    zZone.delete_node)r0   rdtypecoversr\   r*   c                    s$   |rt t |||}tj|S rF   )r   r   find_rdatasetr/   rdatasetImmutableRdatasetr%   r0   r`   ra   r\   rc   r&   r   r   rb     s    zZone.find_rdatasetc                    s4   |rt t |||}|d ur,tj|S d S d S rF   )r   r   r4   r/   rc   rd   re   r&   r   r   r4   $  s    zZone.get_rdataset)r0   r`   ra   r*   c                 C   s   t d S rF   r^   )r%   r0   r`   ra   r   r   r   delete_rdataset3  s    zZone.delete_rdataset)r0   r   r*   c                 C   s   t d S rF   r^   )r%   r0   r   r   r   r   replace_rdataset;  s    zZone.replace_rdataset)NN)F)F)/r   r	   r
   	__slots__NodeZnode_factoryr/   Z
rdataclassINr   r   r0   NamestrZ
RdataClassboolr   Versionr   intr6   r<   rA   rD   r!   rK   rS   rR   rV   rW   rX   r#   rZ   r[   noder]   r_   r5   NONEZ	RdataTyperc   ZRdatasetrb   r4   rf   rg   __classcell__r   r   r&   r   r   !   s   
& $1
 
	r   ) r   r   r   typingr   r   r   r   r   Zdns.exceptionr/   Zdns.immutableZdns.nameZdns.nodeZdns.rdataclassZdns.rdatasetZdns.rdatatypeZdns.rdtypes.ANY.SOAZdns.zone	exceptionZDNSExceptionr   rE   ZVersionedNoderi   ZImmutableVersionedNodeZImmutableNodern   r$   ZImmutableVersionr6   r   r   r   r   r   <module>   s(   