
    hA.                        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e	j"                  j$                        Ze	j(                  j*                  Ze	j(                  j.                  Ze	j(                  j2                  Ze	j(                  j4                  Ze	j(                  j6                  Ze	j(                  j8                  Z G d de	j(                  j:                        Zy)zDNS Versioned Zones.    N)CallableDequeSetcastc                       e Zd ZdZy)UseTransactionz-To alter a versioned zone, use a transaction.N)__name__
__module____qualname____doc__     K/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/dns/versioned.pyr   r      s    7r   r   c                       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z  dz  dej                  j                  deded egedz  f   dz  f fd	Z	 d(d
edz  dedz  defdZd)dedefdZd Zd Zd Zdedz  ddfdZded egedz  f   dz  ddfdZd Zd Zd Zd Zd Z d Z!	 d)dej                  j                  ez  dedej                  j                  f fd Z"dej                  j                  ez  ddfd!Z#ejH                  jJ                  dfdej                  j                  ez  d"ejH                  jL                  ez  d#ejH                  jL                  ez  dedejN                  jP                  f
 fd$Z)ejH                  jJ                  dfdej                  j                  ez  d"ejH                  jL                  ez  d#ejH                  jL                  ez  dedejN                  jP                  dz  f
 fd%Z*ejH                  jJ                  fdej                  j                  ez  d"ejH                  jL                  ez  d#ejH                  jL                  ez  ddfd&Z+dej                  j                  ez  dejN                  jP                  ddfd'Z, xZ-S )*Zone)	_versions_versions_lock
_write_txn_write_waiters_write_event_pruning_policy_readersnode_factoryTNoriginrdclass
relativizepruning_policyc                 j   t         |   |||       t        j                         | _        t        j                         | _        || j                  | _	        n|| _	        d| _
        d| _        t        j                         | _        t               | _        | j                  dt!        | d      |       y)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__s        r   r!   zZone.__init__-   s    , 	*5)4):):)<&^^-!#'#?#?D #1D .2486A6G6G6I*-%%%/$D96	
r   idserialreturnc                 z   ||t        d      | j                  5  |=d }t        | j                        D ]  }|j                  |k(  s|} n |-t        d      || j                  rt        j                  j                  }n| j                  J | j                  }d }t        | j                        D ]  }|j                  j                  |      }|s!|j                  | j                  t        j                  j                         }|Xt#        t        j$                  j&                  j                   j                   |d         }|s|j(                  |k(  s|} n |t        d      | j                  d   }t+        | d|      }	| j,                  j/                  |	       |	cd d d        S # 1 sw Y   y xY w)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txns
             r   readerzZone.readerR   s    >f0@AA  	~!$..1 Attrz"# ?"#677#??HHNNE;;222 KKE!$..1 	"AE*AnnT\\3==;L;LM;$"3;;??#6#6#:#:CFC3::#7&'G!	" ?"#566..,dE73CMMc"A 	  	  	s&   ,F1	BF1A4F1F1A
F11F:Fr   c                    d }	 | j                   5  | j                  3|| j                  k(  r$t        | |d      | _        d | _        	 d d d        nHt	        j
                         }| j                  j                  |       d d d        |j                          | j                  j                          | j                  S # 1 sw Y   @xY w)NT)make_immutable)
r&   r   r   r?   r$   Eventr   appendwait_setup_version)r+   r   events      r   writerzZone.writery   s    ## 2
 ??*u8I8I/I '2k$'DO )-D%!2 2( ")##**51+2R JJLU X 	&&(Y2 2s   7B>/B>>Cc                     t        | j                        dkD  r:| j                  j                         | _        | j                  j	                          y y )Nr   )lenr   popleftr   r(   )r+   s    r   !_maybe_wakeup_one_waiter_unlockedz&Zone._maybe_wakeup_one_waiter_unlocked   sC    t""#a' $ 3 3 ; ; =D!!# (r   c                      y)NTr   )r+   zonerA   s      r   r'   zZone._default_pruning_policy   s    r   c                    t        | j                        dkD  sJ t        | j                        dkD  rt        d | j                  D              }n| j                  d   j                  }| j                  d   j                  |k  rx| j                  | | j                  d         rX| j                  j                          | j                  d   j                  |k  r!| j                  | | j                  d         rVy y y y )Nr   c              3   H   K   | ]  }|j                   j                    y wN)rA   r-   ).0rG   s     r   	<genexpr>z0Zone._prune_versions_unlocked.<locals>.<genexpr>   s     ES[[^^Es    "r1   )rR   r   r   minr-   r   rS   )r+   
least_kepts     r   _prune_versions_unlockedzZone._prune_versions_unlocked   s    4>>"Q&&& t}}!Et}}EEJ+..JnnQ""Z/D4H4H$..#5
 NN""$ nnQ""Z/D4H4H$..#5
/ 5
/r   max_versionsc                 b    dk  rt        d      d }nfd}| j                  |       y)zYSet a pruning policy that retains up to the specified number
        of versions
        N   zmax versions must be at least 1c                      y)NFr   )rV   _s     r   policyz%Zone.set_max_versions.<locals>.policy   s    r   c                 4    t        | j                        kD  S rY   )rR   r   )rV   rc   r_   s     r   rd   z%Zone.set_max_versions.<locals>.policy   s    4>>*\99r   )r2   set_pruning_policy)r+   r_   rd   s    ` r   set_max_versionszZone.set_max_versions   s>     #q(8>??
: 	'r   rd   c                     || j                   }| j                  5  || _        | j                          ddd       y# 1 sw Y   yxY w)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   r^   )r+   rd   s     r   rf   zZone.set_pruning_policy   sF     >11F 	,#)D ))+	, 	, 	,s	   <Ac                     | j                   5  | j                  j                  |       | j                          d d d        y # 1 sw Y   y xY wrY   )r&   r   remover^   r+   rG   s     r   	_end_readzZone._end_read   s>     	,MM  %))+	, 	, 	,s   ,AAc                 T    | j                   |k(  sJ d | _         | j                          y rY   )r   rT   rk   s     r   _end_write_unlockedzZone._end_write_unlocked   s'    #%%%..0r   c                 h    | j                   5  | j                  |       d d d        y # 1 sw Y   y xY wrY   )r&   rn   rk   s     r   
_end_writezZone._end_write   s.     	*$$S)	* 	* 	*s   (1c                     | j                   j                  |       | j                          |j                  | _        | j                  || _        || j                  |       y y rY   )r   rL   r^   r8   r   rn   r+   rG   rA   r   s       r   r)   zZone._commit_version_unlocked   sT    g&%%']]
;; DK?$$S) r   c                 l    | j                   5  | j                  |||       d d d        y # 1 sw Y   y xY wrY   )r&   r)   rr   s       r   _commit_versionzZone._commit_version  s6     	@))#w?	@ 	@ 	@s   *3c                 v    t        | j                        dkD  r| j                  d   j                  dz   }|S d}|S )Nr   r1   ra   )rR   r   r-   )r+   r-   s     r   _get_next_version_idzZone._get_next_version_id	  s?    t~~"#&&*B 	 B	r   r6   createc                 2    |rt         t        | 	  |      S rY   )r   r    	find_node)r+   r6   rw   r,   s      r   ry   zZone.find_node  s       w &&r   c                     t         rY   r   )r+   r6   s     r   delete_nodezZone.delete_node  s    r   rdtypecoversc                 t    |rt         t        | 	  |||      }t        j                  j                  |      S rY   )r   r    find_rdatasetr5   rdatasetImmutableRdatasetr+   r6   r}   r~   rw   r   r,   s         r   r   zZone.find_rdataset  s6       7(vv>||--h77r   c                 z    |rt         t        | 	  |||      }|t        j                  j                  |      S y rY   )r   r    r:   r5   r   r   r   s         r   r:   zZone.get_rdataset&  s?       7'ff=<<11(;;r   c                     t         rY   r{   )r+   r6   r}   r~   s       r   delete_rdatasetzZone.delete_rdataset5  s
     r   c                     t         rY   r{   )r+   r6   r   s      r   replace_rdatasetzZone.replace_rdataset=  s
     r   )NN)F).r	   r
   r   	__slots__Noder   r   r5   node__annotations__
rdataclassINr6   Namestr
RdataClassboolVersionr!   intr?   rH   rP   rT   r'   r^   rg   rf   rl   rn   rp   r)   rt   rv   ry   r|   r;   NONE	RdataTyper   Rdatasetr   r:   r   r   __classcell__)r,   s   @r   r   r       s;   I 15L(2sxx}},-4
 .1^^->->JN#
#d*#
 **#
 	#

 !&'!2D4K!?@4G#
L ;?%*%-04Z%	%N/$ /; /b$
%$(S4Z (D ($,0$+=>E,	,(,
1
**@ 9>'HHMMC''15'	' 3   140B0B
8hhmmc!
8 ''#-
8 ''#-	
8
 
8 
		
8  140B0Bhhmmc! ''#- ''#-	
  
			%& 140B0B	hhmmc! ''#- ''#-	
 
HHMMC'69ll6K6K	r   r   )r   r"   r$   typingr   r   r   r   dns.exceptionr5   dns.namedns.nodedns.rdataclassdns.rdatasetdns.rdatatypedns.rdtypes.ANY.SOAdns.zone	exceptionDNSExceptionr   rV   VersionedNoder   ImmutableVersionedNodeImmutableNoder   r*   ImmutableVersionr?   r   r   r   r   <module>r      s       - -        8S]]// 8
 xx//
((

((**88,, hh""`388== `r   