o
    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   @/var/www/html/venv/lib/python3.10/site-packages/dns/versioned.pyr      s    r   c                       s  e Zd Zg dZeZejjddfde	e
ejjef  dejjdede	ed ege	e f  f fdd	Z	d;d
e	e de	e defddZd<dedefddZdd Zdd Zdd Zde	e ddfddZde	ed ege	e f  ddfddZdd  Zd!d" Zd#d$ Zd%d& Zd'd( Z d)d* Z!	d<d+e
ejjef d,edej"jf fd-d.Z#d+e
ejjef ddfd/d0Z$ej%j&dfd+e
ejjef d1e
ej%j'ef d2e
ej%j'ef d,edej(j)f
 fd3d4Z*ej%j&dfd+e
ejjef d1e
ej%j'ef d2e
ej%j'ef d,ede	ej(j) f
 fd5d6Z+ej%j&fd+e
ejjef d1e
ej%j'ef d2e
ej%j'ef ddfd7d8Z,d+e
ejjef dej(j)ddfd9d: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 r| 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   s6  |d ur|d urt d| j |d ur0d }t| jD ]}|j|kr&|} nq|d u r/tdnL|d urw| jr<tjj	}n
| j
d usCJ | j
}d }t| jD ] }|j|}|rm|| jtjj}|rm|d j|krm|} nqM|d u rvtdn| jd }t| d|}| j| |W  d    S 1 sw   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   sF   


$zZone.readerFr   c                 C   s   d }	 | j / | jd u r$|| jkr$t| |dd| _d | _	 W d    nt }| j| W d    n1 s8w   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 d S )Nr   )lenr   popleftr   r"   )r%   r   r   r   !_maybe_wakeup_one_waiter_unlocked   s   z&Zone._maybe_wakeup_one_waiter_unlockedc                 C      dS )NTr   )r%   zoner8   r   r   r   r!         zZone._default_pruning_policyc                 C   s   t | jdks	J t | jdkrtdd | jD }n| jd j}| jd j|k rJ| | | jd rN| j  | jd j|k rL| | | jd s2d S d S d S d S )Nr   c                 s   s    | ]}|j jV  qd S N)r8   r(   ).0r;   r   r   r   	<genexpr>   s    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_versionsc                    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   rE   )NFr   rF   _r   r   r   policy   rG   z%Zone.set_max_versions.<locals>.policyc                    s   t | j kS rH   )rB   r   rO   rM   r   r   rQ      s   )r,   set_pruning_policy)r%   rM   rQ   r   rR   r   set_max_versions   s   
zZone.set_max_versionsrQ   c                 C   sH   |du r| j }| j || _|   W d   dS 1 sw   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   rL   )r%   rQ   r   r   r   rS      s   
"zZone.set_pruning_policyc                 C   s@   | j  | j| |   W d    d S 1 sw   Y  d S rH   )r    r   removerL   r%   r;   r   r   r   	_end_read   s   
"zZone._end_readc                 C   s    | j |ksJ d | _ |   d S rH   )r   rD   rV   r   r   r   _end_write_unlocked   s   zZone._end_write_unlockedc                 C   s6   | j  | | W d    d S 1 sw   Y  d S rH   )r    rX   rV   r   r   r   
_end_write   s   "zZone._end_writec                 C   sF   | j | |   |j| _| jd u r|| _|d ur!| | d S d S rH   )r   r>   rL   r2   r   rX   r%   r;   r8   r   r   r   r   r#      s   
zZone._commit_version_unlockedc                 C   s:   | j  | ||| W d    d S 1 sw   Y  d S rH   )r    r#   rZ   r   r   r   _commit_version  s   "zZone._commit_versionc                 C   s*   t | jdkr| jd jd }|S d}|S )Nr   r+   rN   )rB   r   r(   )r%   r(   r   r   r   _get_next_version_id  s
   zZone._get_next_version_idr0   createc                    s   |rt t |S rH   )r   r   	find_node)r%   r0   r]   r&   r   r   r^     s   zZone.find_nodec                 C      t rH   r   )r%   r0   r   r   r   delete_node  rG   zZone.delete_noderdtypecoversc                    s$   |rt t |||}tj|S rH   )r   r   find_rdatasetr/   rdatasetImmutableRdatasetr%   r0   rb   rc   r]   re   r&   r   r   rd     s   zZone.find_rdatasetc                    s0   |rt t |||}|d urtj|S d S rH   )r   r   r4   r/   re   rf   rg   r&   r   r   r4   $  s   zZone.get_rdatasetc                 C   r_   rH   r`   )r%   r0   rb   rc   r   r   r   delete_rdataset3  s   zZone.delete_rdatasetc                 C   r_   rH   r`   )r%   r0   r   r   r   r   replace_rdataset;  s   zZone.replace_rdataset)NN)F)/r   r	   r
   	__slots__NodeZnode_factoryr/   Z
rdataclassINr   r   r0   NamestrZ
RdataClassboolr   Versionr   intr6   r<   rA   rD   r!   rL   rT   rS   rW   rX   rY   r#   r[   r\   noder^   ra   r5   NONEZ	RdataTypere   ZRdatasetrd   r4   rh   ri   __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   rF   ZVersionedNoderk   ZImmutableVersionedNodeZImmutableNoderp   r$   ZImmutableVersionr6   r   r   r   r   r   <module>   s*   