o
    hA.                     @   s   d Z ddlZddlZddl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	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Setcastc                   @   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   O/var/www/html/pro-man-master/venv/lib/python3.10/site-packages/dns/versioned.pyr      s    r   c                       sn  e Zd ZU g dZeZeg ejjf e	d< ej
jddfdejjeB dB dej
jdeded egedB f dB f fd	d
Z	d<dedB dedB 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dB ddfddZded egedB f dB 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jjeB d-edejjf fd.d/Z"d,ejjeB ddfd0d1Z#ej$j%dfd,ejjeB d2ej$j&eB d3ej$j&eB d-edej'j(f
 fd4d5Z)ej$j%dfd,ejjeB d2ej$j&eB d3ej$j&eB d-edej'j(dB f
 fd6d7Z*ej$j%fd,ejjeB d2ej$j&eB d3ej$j&eB ddfd8d9Z+d,ejjeB dej'j(ddfd:d;Z,  Z-S )>Zone)	_versions_versions_lock
_write_txn_write_waiters_write_event_pruning_policy_readersnode_factoryTN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   sR  |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nZ|d ur| jr<tjj	}n
| j
d usCJ | j
}d }t| jD ].}|j|}|r{|| jtjj}|d u reqMttjjjj|d }|r{|j|kr{|} nqM|d u rt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   	rdatatypeSOAr   rdtypesANYr*   Transactionr   add)
r&   r)   r*   versionvonamenrdssoatxnr   r   r   readerR   sL   


$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)make_immutable)
r!   r   r   r:   r   Eventr   appendwait_setup_version)r&   r   eventr   r   r   writery   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&   zoner<   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)r<   r)   ).0rB   r   r   r   	<genexpr>   s    z0Zone._prune_versions_unlocked.<locals>.<genexpr>r,   )rK   r   r   minr)   r   rL   )r&   
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   rN   )NFr   rO   _r   r   r   policy   rP   z%Zone.set_max_versions.<locals>.policyc                    s   t | j kS rQ   )rK   r   rY   rW   r   r   r[      s   )r-   set_pruning_policy)r&   rW   r[   r   r\   r   set_max_versions   s   
zZone.set_max_versionsr[   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   rV   )r&   r[   r   r   r   r]      s   
"zZone.set_pruning_policyc                 C   s@   | j  | j| |   W d    d S 1 sw   Y  d S rQ   )r!   r   removerV   r&   rB   r   r   r   	_end_read   s   
"zZone._end_readc                 C   s    | j |ksJ d | _ |   d S rQ   )r   rM   r`   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 rQ   )r!   rb   r`   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 rQ   )r   rF   rV   r3   r   rb   r&   rB   r<   r   r   r   r   r$      s   
zZone._commit_version_unlockedc                 C   s:   | j  | ||| W d    d S 1 sw   Y  d S rQ   )r!   r$   rd   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,   rX   )rK   r   r)   )r&   r)   r   r   r   _get_next_version_id	  s
   zZone._get_next_version_idr1   createc                    s   |rt t |S rQ   )r   r   	find_node)r&   r1   rg   r'   r   r   rh     s   zZone.find_nodec                 C      t rQ   r   )r&   r1   r   r   r   delete_node  rP   zZone.delete_noderdtypecoversc                    s$   |rt t |||}tj|S rQ   )r   r   find_rdatasetr0   rdatasetImmutableRdatasetr&   r1   rl   rm   rg   ro   r'   r   r   rn     s   zZone.find_rdatasetc                    s0   |rt t |||}|d urtj|S d S rQ   )r   r   r5   r0   ro   rp   rq   r'   r   r   r5   &  s   zZone.get_rdatasetc                 C   ri   rQ   rj   )r&   r1   rl   rm   r   r   r   delete_rdataset5  s   zZone.delete_rdatasetc                 C   ri   rQ   rj   )r&   r1   r   r   r   r   replace_rdataset=  s   zZone.replace_rdataset)NN)F).r   r   r	   	__slots__Noder   r   r0   node__annotations__
rdataclassINr1   Namestr
RdataClassboolVersionr   intr:   rC   rJ   rM   r"   rV   r^   r]   ra   rb   rc   r$   re   rf   rh   rk   r6   NONE	RdataTypero   Rdatasetrn   r5   rr   rs   __classcell__r   r   r'   r   r       s   
 
&
'1














r   )r
   r   r   typingr   r   r   r   dns.exceptionr0   dns.namedns.nodedns.rdataclassdns.rdatasetdns.rdatatypedns.rdtypes.ANY.SOAdns.zone	exceptionDNSExceptionr   rO   VersionedNoderu   ImmutableVersionedNodeImmutableNoder~   r%   ImmutableVersionr:   r   r   r   r   r   <module>   s(   