o
    iA.                     @   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   D/home/app/Keep/.python/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)	_versionsZ_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   	rdatatypeZSOAr   ZrdtypesANYr)   Transactionr   add)
r%   r(   r)   versionvZonamenZrdsZ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)Zmake_immutable)
r    r   r   r7   r   Eventr   appendwaitZ_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%   zoner9   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)r9   r(   ).0r<   r   r   r   	<genexpr>   s    z0Zone._prune_versions_unlocked.<locals>.<genexpr>r+   )rC   r   r   minr(   r   rD   )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   rF   )NFr   rG   _r   r   r   policy   rH   z%Zone.set_max_versions.<locals>.policyc                    s   t | j kS rI   )rC   r   rP   rN   r   r   rR      s   )r,   set_pruning_policy)r%   rN   rR   r   rS   r   set_max_versions   s   
zZone.set_max_versionsrR   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   rM   )r%   rR   r   r   r   rT      s   
"zZone.set_pruning_policyc                 C   s@   | j  | j| |   W d    d S 1 sw   Y  d S rI   )r    r   removerM   r%   r<   r   r   r   	_end_read   s   
"zZone._end_readc                 C   s    | j |ksJ d | _ |   d S rI   )r   rE   rW   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 rI   )r    rY   rW   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 rI   )r   r?   rM   r2   r   rY   r%   r<   r9   r   r   r   r   r#      s   
zZone._commit_version_unlockedc                 C   s:   | j  | ||| W d    d S 1 sw   Y  d S rI   )r    r#   r[   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+   rO   )rC   r   r(   )r%   r(   r   r   r   _get_next_version_id	  s
   zZone._get_next_version_idr0   createc                    s   |rt t |S rI   )r   r   	find_node)r%   r0   r^   r&   r   r   r_     s   zZone.find_nodec                 C      t rI   r   )r%   r0   r   r   r   delete_node  rH   zZone.delete_noderdtypecoversc                    s$   |rt t |||}tj|S rI   )r   r   find_rdatasetr/   rdatasetImmutableRdatasetr%   r0   rc   rd   r^   rf   r&   r   r   re     s   zZone.find_rdatasetc                    s0   |rt t |||}|d urtj|S d S rI   )r   r   r4   r/   rf   rg   rh   r&   r   r   r4   &  s   zZone.get_rdatasetc                 C   r`   rI   ra   )r%   r0   rc   rd   r   r   r   delete_rdataset5  s   zZone.delete_rdatasetc                 C   r`   rI   ra   )r%   r0   r   r   r   r   replace_rdataset=  s   zZone.replace_rdataset)NN)F).r   r   r	   	__slots__Noder   r   r/   node__annotations__Z
rdataclassINr0   NamestrZ
RdataClassboolVersionr   intr7   r=   rB   rE   r!   rM   rU   rT   rX   rY   rZ   r#   r\   r]   r_   rb   r5   NONEZ	RdataTyperf   ZRdatasetre   r4   ri   rj   __classcell__r   r   r&   r   r       s   
 
&
'1














r   )r
   r   r   typingr   r   r   r   Zdns.exceptionr/   Zdns.nameZdns.nodeZdns.rdataclassZdns.rdatasetZdns.rdatatypeZdns.rdtypes.ANY.SOAZdns.zone	exceptionZDNSExceptionr   rG   ZVersionedNoderl   ZImmutableVersionedNodeZImmutableNoders   r$   ZImmutableVersionr7   r   r   r   r   r   <module>   s(   