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   I/var/www/html/olx_land/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)	_versions_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   	rdatatypeSOAr*   Transactionr   add)	r&   r)   r*   versionvonamen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)make_immutable)
r!   r   r   r8   r   Eventr   appendwait_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&   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)   ).0r?   r   r   r   	<genexpr>   s    z0Zone._prune_versions_unlocked.<locals>.<genexpr>r,   )rH   r   r   minr)   r   rI   )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   rK   )NFr   rL   _r   r   r   policy   rM   z%Zone.set_max_versions.<locals>.policyc                    s   t | j kS rN   )rH   r   rV   rT   r   r   rX      s   )r-   set_pruning_policy)r&   rT   rX   r   rY   r   set_max_versions   s   
zZone.set_max_versionsrX   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   rS   )r&   rX   r   r   r   rZ      s   
"zZone.set_pruning_policyc                 C   s@   | j  | j| |   W d    d S 1 sw   Y  d S rN   )r!   r   removerS   r&   r?   r   r   r   	_end_read   s   
"zZone._end_readc                 C   s    | j |ksJ d | _ |   d S rN   )r   rJ   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 rN   )r!   r_   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 rN   )r   rC   rS   r3   r   r_   r&   r?   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 rN   )r!   r$   ra   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,   rU   )rH   r   r)   )r&   r)   r   r   r   _get_next_version_id  s
   zZone._get_next_version_idr1   createc                    s   |rt t |S rN   )r   r   	find_node)r&   r1   rd   r'   r   r   re     s   zZone.find_nodec                 C      t rN   r   )r&   r1   r   r   r   delete_node  rM   zZone.delete_noderdtypecoversc                    s$   |rt t |||}tj|S rN   )r   r   find_rdatasetr0   rdatasetImmutableRdatasetr&   r1   ri   rj   rd   rl   r'   r   r   rk     s   zZone.find_rdatasetc                    s0   |rt t |||}|d urtj|S d S rN   )r   r   r5   r0   rl   rm   rn   r'   r   r   r5   $  s   zZone.get_rdatasetc                 C   rf   rN   rg   )r&   r1   ri   rj   r   r   r   delete_rdataset3  s   zZone.delete_rdatasetc                 C   rf   rN   rg   )r&   r1   r   r   r   r   replace_rdataset;  s   zZone.replace_rdataset)NN)F)/r   r	   r
   	__slots__Nodenode_factoryr0   
rdataclassINr   r   r1   Namestr
RdataClassboolr   Versionr   intr8   r@   rG   rJ   r"   rS   r[   rZ   r^   r_   r`   r$   rb   rc   nodere   rh   r6   NONE	RdataTyperl   Rdatasetrk   r5   ro   rp   __classcell__r   r   r'   r   r   !   s    
&
$1



r   ) r   r   r   typingr   r   r   r   r   dns.exceptionr0   dns.immutabledns.namedns.nodedns.rdataclassdns.rdatasetdns.rdatatypedns.rdtypes.ANY.SOAdns.zone	exceptionDNSExceptionr   rL   VersionedNoderr   ImmutableVersionedNodeImmutableNoderz   r%   ImmutableVersionr8   r   r   r   r   r   <module>   s*   