o 3aR$@sdZddlZddlZddlZddlZddlmZmZmZm Z ddl m Z ddl m Z GdddeZGdd d eZGd d d eZGd d d eZdS)zMemcached cache backendN)DEFAULT_TIMEOUT BaseCacheInvalidCacheKeymemcache_key_warnings)RemovedInDjango41Warning)cached_propertycseZdZfddZeddZeddZefddZ ed fd d Z d%d d Z ed fddZ ed fddZ d&ddZd&ddZddZd'ddZd'ddZed fddZd&dd Zd!d"Zd#d$ZZS)(BaseMemcachedCachecsTt|t|trtd||_n||_||_||_|j |_ | dp&i|_ dS)Nz[;,]OPTIONS) super__init__ isinstancestrresplit_serversLibraryValueNotFoundException_libClient_classget_options)selfserverparamslibraryvalue_not_found_exception __class__F/usr/lib/python3/dist-packages/django/core/cache/backends/memcached.pyr s  zBaseMemcachedCache.__init__cCs|jSN)rrrrrclient_serverssz!BaseMemcachedCache.client_serverscCs|j|jfi|jS)zQ Implement transparent thread-safe access to a memcached client. )rr"rr!rrr_cache#szBaseMemcachedCache._cachecCsJ|tkr|j}|dur dSt|dkrd}|dkr!|tt7}t|S)z Memcached deals with long (> 30 days) timeouts in a special way. Call this function to obtain a safe value for your timeout. Nri')rdefault_timeoutinttime)rtimeoutrrrget_backend_timeout*s z&BaseMemcachedCache.get_backend_timeoutNcCs.|j||d}|||j||||SNversion)make_key validate_keyr#addr)rkeyvaluer(r,rrrr/Es zBaseMemcachedCache.addcCs&|j||d}|||j||Sr*r-r.r#r)rr1defaultr,rrrrJs zBaseMemcachedCache.getcCsB|j||d}|||j||||s|j|dSdSr*)r-r.r#setr)deleter0rrrr5Os  zBaseMemcachedCache.setcCs0|j||d}||t|j|||Sr*)r-r.boolr#touchr)rr1r(r,rrrr8Vs zBaseMemcachedCache.touchcCs(|j||d}||t|j|Sr*)r-r.r7r#r6rr1r,rrrr6[s zBaseMemcachedCache.deletecsNfdd|DD]}|q j}fdd|DS)Ncsi|] }j|d|qSr+r-.0r1rr,rr asz/BaseMemcachedCache.get_many..csi|] \}}||qSrr)r>kv)key_maprrr@e)r.r# get_multikeysitems)rrFr,r1retr)rCrr,rget_many`s  zBaseMemcachedCache.get_manycK|jdSr )r#disconnect_allrkwargsrrrclosegszBaseMemcachedCache.closecCt|j||d}|||dkr|j|| Sz |j||}Wn |jy-d}Ynw|dur8td||SNr+rzKey '%s' not found)r-r.r#decrincrr ValueErrorrr1deltar,valrrrrSk  zBaseMemcachedCache.incrcCrPrQ)r-r.r#rSrRrrTrUrrrrR|rXzBaseMemcachedCache.decrc shi}i|D]\}}|j||d}|||||<||<q|j|||}fdd|DS)Nr+csg|]}|qSrr)r>rA original_keysrr sz/BaseMemcachedCache.set_many..)rGr-r.r# set_multir)) rdatar(r, safe_datar1r2safe_key failed_keysrrYrset_manys  zBaseMemcachedCache.set_manycs8fdd|D}|D]}|q j|dS)Ncsg|] }j|dqSr;r<r=r?rrr[rDz2BaseMemcachedCache.delete_many..)r.r# delete_multi)rrFr,r1rr?r delete_manys zBaseMemcachedCache.delete_manycCrJr )r# flush_allr!rrrclearszBaseMemcachedCache.clearcCst|D]}t|dSr )rr)rr1warningrrrr.s zBaseMemcachedCache.validate_keyNNr )rON)__name__ __module__ __qualname__r propertyr"rr#rr)r/rr5r8r6rIrNrSrRrarcrer. __classcell__rrrrrs(          rcs8eZdZdZdZfddZd ddZd ddZZS) MemcachedCachez;An implementation of a cache binding using python-memcachedNcsBtjdtddddl}tj|||tddtji|j |_ dS)NzJMemcachedCache is deprecated in favor of PyMemcacheCache and PyLibMCCache.) stacklevelrrrpickleProtocol) warningswarnrmemcacher r rTpickleHIGHEST_PROTOCOLr)rrrrtrrrr szMemcachedCache.__init__cCs4|j||d}|||j|}|dur|S|Sr*r3)rr1r4r,rWrrrrs   zMemcachedCache.getcCs.|j||d}||t|jdgd|S)Nr+sDELETEDr6)r-r.r7r# _deletetouchr:rrrr6s zMemcachedCache.deletergr ) rhrirj__doc__ _missing_keyr rr6rlrrrrrms    rmcsBeZdZdZfddZeddZedfddZd d Z Z S) PyLibMCCachez2An implementation of a cache binding using pylibmccs"ddl}tj||||jddS)Nrrp)pylibmcr r NotFound)rrrr{rrrr szPyLibMCCache.__init__cCs4g}|jD]}||dr|ddn|q|S)Nzunix:)rappend startswith)routputrrrrr"s "zPyLibMCCache.client_serversNcCs@|j||d}|||dkr|j|S|j|||S)Nr+r)r-r.r#r6r8r)r9rrrr8s   zPyLibMCCache.touchcKsdSr rrLrrrrNszPyLibMCCache.close) rhrirjrxr rkr"rr8rNrlrrrrrzs  rzcs eZdZdZfddZZS)PyMemcacheCachez6An implementation of a cache binding using pymemcache.csBddl}tj|||td|jj|_dd|jjd|j |_ dS)NrrpTF)allow_unicode_keysdefault_noreplyserde) pymemcache.serder r KeyErrorr HashClientrr pickle_serder)rrr pymemcacherrrr s  zPyMemcacheCache.__init__)rhrirjrxr rlrrrrrsr)rxrurr'rrdjango.core.cache.backends.baserrrrdjango.utils.deprecationrdjango.utils.functionalrrrmrzrrrrrs  '