U
    <{f-                     @   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   L/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/dns/versioned.pyr      s   r   c                	       sb  e Zd Zdddddddg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d=e	e e	e edddZd>e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!d?e
ejjef eej"jd, fd-d.Z#e
ejjef d	d/d0d1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)d2 fd3d4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) d2 fd5d6Z+ej%j&fe
ejjef e
ej%j'ef e
ej%j'ef d	d7d8d9Z,e
ejjef ej(j)d	d:d;d<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k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 k	r|d k	rt d| j |d k	rbd }t| jD ]}|j|kr8|} qPq8|d krtdn|d k	r| jrztjj	}n| j
d k	st| j
}d }t| jD ]@}|j|}|r|| jtjj}|r|d j|kr|} qq|d krtdn
| jd }t| d|}| j| |W  5 Q R  S Q R X d S )Nz!cannot specify both id and serialzversion not foundr   zserial not foundF)
ValueErrorr    reversedr   r(   KeyErrorr   dnsnameemptyr   AssertionError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   sz   d }| j P | jd krB|| jkrBt| |dd| _d | _W 5 Q R  qjt }| j| W 5 Q R X |  q| j	  | jS )NT)Zmake_immutable)
r    r   r   r7   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%   zoner9   r   r   r   r!      s    zZone._default_pruning_policyc                 C   st   t | jdkst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)r9   r(   ).0r<   r   r   r   	<genexpr>   s     z0Zone._prune_versions_unlocked.<locals>.<genexpr>r+   )rC   r   r2   r   minr(   r   rD   )r%   Z
least_keptr   r   r   _prune_versions_unlocked   s     zZone._prune_versions_unlocked)max_versionsr*   c                    sD    dk	r dk rt d dk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   rF   _r   r   r   policy   s    z%Zone.set_max_versions.<locals>.policyc                    s   t | j kS rG   )rC   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   s2   |dkr| j }| j || _|   W 5 Q R X 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 5 Q R X d S rG   )r    r   removerK   r%   r<   r   r   r   	_end_read   s    zZone._end_readc                 C   s    | j |kstd | _ |   d S rG   )r   r2   rE   rU   r   r   r   _end_write_unlocked   s    zZone._end_write_unlockedc              	   C   s    | j  | | W 5 Q R X d S rG   )r    rW   rU   r   r   r   
_end_write   s    zZone._end_writec                 C   sB   | j | |   |j| _| jd kr,|| _|d k	r>| | d S rG   )r   r?   rK   r3   r   rW   r%   r<   r9   r   r   r   r   r#      s    
zZone._commit_version_unlockedc              	   C   s$   | j  | ||| W 5 Q R X d S rG   )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   )rC   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 rG   )r   r   	find_node)r%   r0   r\   r&   r   r   r]     s    zZone.find_node)r0   r*   c                 C   s   t d S rG   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 rG   )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 k	r,tj|S d S d S rG   )r   r   r5   r/   rc   rd   re   r&   r   r   r5   $  s    zZone.get_rdataset)r0   r`   ra   r*   c                 C   s   t d S rG   r^   )r%   r0   r`   ra   r   r   r   delete_rdataset3  s    zZone.delete_rdataset)r0   r   r*   c                 C   s   t d S rG   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   intr7   r=   rB   rE   r!   rK   rS   rR   rV   rW   rX   r#   rZ   r[   noder]   r_   r6   NONEZ	RdataTyperc   ZRdatasetrb   r5   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   rF   ZVersionedNoderi   ZImmutableVersionedNodeZImmutableNodern   r$   ZImmutableVersionr7   r   r   r   r   r   <module>   s(   