
    Vh                        d dl mZ dZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZ 	 d dlZd
Z e       Z G d de      Z G d de      Z G d de      Zy# e$ r dZY 2w xY w)    )annotationsaG  
author: Unknown (!UNKNOWN)
name: memcached
short_description: Use memcached DB for cache
description:
  - This cache uses JSON formatted, per host records saved in memcached.
requirements:
  - memcache (python lib)
options:
  _uri:
    description:
      - List of connection information for the memcached DBs.
    default: ['127.0.0.1:11211']
    type: list
    elements: string
    env:
      - name: ANSIBLE_CACHE_PLUGIN_CONNECTION
    ini:
      - key: fact_caching_connection
        section: defaults
  _prefix:
    description: User defined prefix to use when creating the DB entries.
    type: string
    default: ansible_facts
    env:
      - name: ANSIBLE_CACHE_PLUGIN_PREFIX
    ini:
      - key: fact_caching_prefix
        section: defaults
  _timeout:
    default: 86400
    type: integer
        # TODO: determine whether it is OK to change to: type: float
    description: Expiration timeout in seconds for the cache plugin data. Set to 0 to never expire.
    env:
      - name: ANSIBLE_CACHE_PLUGIN_TIMEOUT
    ini:
      - key: fact_caching_timeout
        section: defaults
N)Lock)chain)AnsibleError)
MutableSet)BaseCacheModule)DisplayTFc                  F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)ProxyClientPoolz
    Memcached connection pooling for thread/fork safety. Inspired by py-redis
    connection pool.

    Available connections are maintained in a deque and released in a FIFO manner.
    c                n    |j                  dd      | _        || _        || _        | j	                          y )Nmax_connectionsi   )popr   connection_argsconnection_kwargsreset)selfargskwargss      m/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/cache/memcached.py__init__zProxyClientPool.__init__N   s/    %zz*;TB#!'

    c                    t        j                         | _        d| _        t	        j
                  | j                        | _        t               | _	        t               | _        y )Nr   )maxlen)osgetpidpid_num_connectionscollectionsdequer   _available_connectionsset_locked_connectionsr   _lockr   s    r   r   zProxyClientPool.resetT   sC    99; !&1&7&7t?S?S&T##&5 V
r   c                    | j                   t        j                         k7  ra| j                  5  | j                   t        j                         k(  r
	 d d d        y | j	                          | j                          d d d        y y # 1 sw Y   y xY wN)r   r   r   r#   disconnect_allr   r$   s    r   _check_safezProxyClientPool._check_safe[   sp    88ryy{" 88ryy{*  ##%

  # s   #B BBc                    | j                          	 | j                  j                         }| j
                  j                  |       |S # t        $ r | j	                         }Y 8w xY wr&   )r(   r    popleft
IndexErrorcreate_connectionr"   addr   
connections     r   get_connectionzProxyClientPool.get_connectiond   sb    	244<<>J 	  $$Z0  	2//1J	2s   A	 	A%$A%c                    | j                   | j                  k\  rt        d      | xj                   dz  c_         t        j                  | j
                  i | j                  S )NzToo many memcached connections   )r   r   RuntimeErrormemcacheClientr   r   r$   s    r   r,   z!ProxyClientPool.create_connectionm   sS      D$8$88?@@" 4 4O8N8NOOr   c                    | j                          | j                  j                  |       | j                  j	                  |       y r&   )r(   r"   remover    appendr.   s     r   release_connectionz"ProxyClientPool.release_connections   s6      ''
3##**:6r   c                n    t        | j                  | j                        D ]  }|j                           y r&   )r   r    r"   r'   )r   conns     r   r'   zProxyClientPool.disconnect_allx   s0    $55t7O7OP 	"D!	"r   c                      fd}|S )Nc                 0     j                   g| i |S r&   )_proxy_client)r   r   namer   s     r   wrappedz,ProxyClientPool.__getattr__.<locals>.wrapped}   s     %4%%d<T<V<<r    )r   r?   r@   s   `` r   __getattr__zProxyClientPool.__getattr__|   s    	=r   c                    | j                         }	  t        ||      |i || j                  |       S # | j                  |       w xY wr&   )r0   getattrr9   )r   r?   r   r   r;   s        r   r>   zProxyClientPool._proxy_client   sH    ""$	*&74&77##D)D##D)s	   5 AN)__name__
__module____qualname____doc__r   r   r(   r0   r,   r9   r'   rB   r>   rA   r   r   r   r   F   s5    P7
"
*r   r   c                  >    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zy
)CacheModuleKeyszb
    A set subclass that keeps track of insertion time and persists
    the set in memcached.
    ansible_cache_keysc                2    || _         t        |i || _        y r&   )_cachedict_keyset)r   cacher   r   s       r   r   zCacheModuleKeys.__init__   s    T,V,r   c                    || j                   v S r&   )rO   r   keys     r   __contains__zCacheModuleKeys.__contains__   s    dll""r   c                ,    t        | j                        S r&   )iterrO   r$   s    r   __iter__zCacheModuleKeys.__iter__   s    DLL!!r   c                ,    t        | j                        S r&   )lenrO   r$   s    r   __len__zCacheModuleKeys.__len__   s    4<<  r   c                    t        j                          | j                  |<   | j                  j                  | j                  | j                         y r&   )timerO   rM   r!   PREFIXr   values     r   r-   zCacheModuleKeys.add   s0    "iikUT\\2r   c                ~    | j                   |= | j                  j                  | j                  | j                          y r&   )rO   rM   r!   r]   r^   s     r   discardzCacheModuleKeys.discard   s(    LLT\\2r   c                
   t        | j                  j                               D ]-  }| j                  |   }||cxk  r|k  sn !| j                  |= / | j                  j	                  | j
                  | j                         y r&   )listrO   keysrM   r!   r]   )r   s_mins_maxkts        r   remove_by_timerangez#CacheModuleKeys.remove_by_timerange   sd    dll'')* 	$AQAq 5 LLO	$ 	T\\2r   N)rE   rF   rG   rH   r]   r   rT   rW   rZ   r-   ra   ri   rA   r   r   rJ   rJ      s1     "F-#"!333r   rJ   c                  `     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Z xZS )CacheModulec                   dg}t        t        | 
  |i | | j                  d      r| j                  d      }| j                  d      | _        | j                  d      | _        t        st        d      i | _        t        |d      | _
        t        | j                  | j                  j                  t        j                        xs g       | _        y )Nz127.0.0.1:11211_uri_timeout_prefixz9python-memcached is required for the memcached fact cacher   )debug)superrk   r   
get_optionrn   ro   HAS_MEMCACHEr   rM   r   _dbrJ   getr]   _keys)r   r   r   r/   	__class__s       r   r   zCacheModule.__init__   s    '(
k4)4:6:??6"0J
3y1Z[[":Q7$TXXtxx||O<R<R/S/YWYZ
r   c                "    | j                    | S r&   )ro   rR   s     r   	_make_keyzCacheModule._make_key   s    ,,u%%r   c                    | j                   dkD  r>t        j                         | j                   z
  }| j                  j                  d|       y y )Nr   )rn   r\   rv   ri   )r   
expiry_ages     r   _expire_keyszCacheModule._expire_keys   s;    ==1t}}4JJJ**1j9 r   c                    || j                   vrR| j                  j                  | j                  |            }|| j	                  |       t
        || j                   |<   | j                   j                  |      S r&   )rM   rt   ru   ry   deleteKeyErrorr   rS   r_   s      r   ru   zCacheModule.get   sb    dkk!HHLL!45E }C $DKK{{s##r   c                    | j                   j                  | j                  |      || j                  d       || j                  |<   | j
                  j                  |       y )Nr2   )r\   min_compress_len)rt   r!   ry   rn   rM   rv   r-   r   s      r   r!   zCacheModule.set   sF    T^^C(%dmmVWX C

sr   c                ^    | j                          t        t        | j                              S r&   )r|   rc   rV   rv   r$   s    r   rd   zCacheModule.keys   s"    D$%%r   c                >    | j                          || j                  v S r&   )r|   rv   rR   s     r   containszCacheModule.contains   s    djj  r   c                    | j                   |= | j                  j                  | j                  |             | j                  j                  |       y r&   )rM   rt   r~   ry   rv   ra   rR   s     r   r~   zCacheModule.delete   s9    KKs+,

3r   c                P    | j                         D ]  }| j                  |        y r&   )rd   r~   rR   s     r   flushzCacheModule.flush   s#    99; 	CKK	r   c                6    | j                   j                         S r&   )rv   copyr$   s    r   r   zCacheModule.copy   s    zz  r   c                    t               S r&   )rN   r$   s    r   __getstate__zCacheModule.__getstate__   s	    vr   c                $    | j                          y r&   )r   )r   datas     r   __setstate__zCacheModule.__setstate__   s    r   )rE   rF   rG   r   ry   r|   ru   r!   rd   r   r~   r   r   r   r   __classcell__)rw   s   @r   rk   rk      s@    [ &:
$
&! 
!r   rk   )
__future__r   DOCUMENTATIONr   r   r\   multiprocessingr   	itertoolsr   ansible.errorsr   /ansible.module_utils.common._collections_compatr   ansible.plugins.cacher   ansible.utils.displayr	   r4   rs   ImportErrordisplayobjectr   rJ   rk   rA   r   r   <module>r      s    #'R  	     ' F 1 )L )A*f A*H!3j !3HD/ D]  Ls   A) )A32A3