o
    Þý°jA.  ã                   @   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   ú€/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/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 r„tdƒ‚n| jd }t| d|ƒ}	| j |	¡ |	W  d   ƒ S 1 s¢w   Y  d S )Nz!cannot specify both id and serialzversion not foundr   zserial not foundéÿÿÿÿF)Ú
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(   