o 3a7+@sdZddlZddlZddlmZddlmZddlmZmZddl m Z m Z m Z m Z mZddlmZGdd d ZGd d d eZGd d d eZdS)zDatabase cache backend.N)datetime)settings)DEFAULT_TIMEOUT BaseCache) DatabaseError connectionsmodelsrouter transaction)timezonec@seZdZdZddZdS)Optionsz~A class that will quack like a Django model _meta class. This allows cache operations to be controlled by the router cCs@||_d|_d|_d|_d|_d|_d|_d|_d|_d|_ dS)N django_cache cacheentryz cache entryz cache entries CacheEntryFT) db_table app_label model_name verbose_nameverbose_name_plural object_nameabstractmanagedproxyswapped)selftabler?/usr/lib/python3/dist-packages/django/core/cache/backends/db.py__init__s zOptions.__init__N)__name__ __module__ __qualname____doc__rrrrrr s r cseZdZfddZZS)BaseDatabaseCachecs.t||_Gfddd}||_dS)NcseZdZeZdS)z.BaseDatabaseCache.__init__..CacheEntryN)rr r!r _metarrrrr#s r)superr_tablecache_model_class)rrparamsr __class__r%rrs  zBaseDatabaseCache.__init__)rr r!r __classcell__rrr*rr#sr#c@seZdZejZdddZdddZedfddZ edfdd Z edfd d Z efd d Z dddZ dddZddZdddZddZddZdS) DatabaseCacheNcCs||g|||SN)get_manyget)rkeydefaultversionrrrr02szDatabaseCache.getcCsn|siSi}|D]}|||||||<qt|j}t|}|jj}||j}| ,} | d|d|d|d||dd dgt |ft || } Wdn1s^wYi} g} tjtd} |j| | |}| D]3\}}}|D]}||| |}q|tkr| |q||j|}tt|}|| ||<q||| | S)Nz*SELECT %s, %s, %s FROM %s WHERE %s IN (%s) cache_keyvalueexpires, %s output_field) validate_keymake_keyr db_for_readr(rops quote_namer'cursorexecutejoinlenlistfetchallr Expression DateTimeFieldget_db_convertersr nowappend process_clobpickleloadsbase64 b64decodeencoder0_base_delete_many)rkeysr3key_mapr1db connectionr?rr@rowsresult expired_keys expression convertersr5r6 converterrrrr/5sL         zDatabaseCache.get_manycCs,|j||d}|||d|||dS)Nr3setr<r; _base_setrr1r5timeoutr3rrrr]as zDatabaseCache.setcCs(|j||d}|||d|||S)Nr\addr^r`rrrrbf zDatabaseCache.addcCs(|j||d}|||d|d|S)Nr\touchr^)rr1rar3rrrrdkrczDatabaseCache.touchc Cs||}t|j}t|}|jj}||j}|)} | d|| d} t } | j dd} |dur=tj} ntjrFt|} nt|} | j dd} | |jkr]||| | t||j} t| d}ztj|d| d|d|d||df|g| }|r|d }tjt d }|j!||!|D]}||||}q|j"| } |r|d kr| d ||d|df| |gnO|r|d ks|dkr|| kr| d||d|d|df|| |gn+|d kr | d||d|d|df||| gn WdWWddSWdn 1s%wYWnt#y<YWddSw WddS1sJwYdS)NSELECT COUNT(*) FROM %sr microsecondlatin1)usingz$SELECT %s, %s FROM %s WHERE %s = %%sr4r6r9rdz%UPDATE %s SET %s = %%s WHERE %s = %%sr]rbz/UPDATE %s SET %s = %%s, %s = %%s WHERE %s = %%sr5z2INSERT INTO %s (%s, %s, %s) VALUES (%%s, %%s, %%s)FT)$get_backend_timeoutr db_for_writer(rr>r?r'r@rAfetchoner rIreplacermaxrUSE_TZutcfromtimestamp fromtimestamp _max_entries_cullrLdumpspickle_protocolrN b64encodedecoder atomicrrFrGrHadapt_datetimefield_valuer)rmoder1r5rarTrUr?rr@numrIexppickled b64encodedrWcurrent_expiresrYr[rrrr_ps                3J&zDatabaseCache._base_setcCs||||||gSr.)r;rQr<)rr1r3rrrdeletes zDatabaseCache.deletecCs8g}|D]}||||||q||dSr.)r;rJr<rQ)rrRr3key_listr1rrr delete_manys  zDatabaseCache.delete_manyc Cs|sdSt|j}t|}|jj}||j}|}|d||dd dgt |f|Wdn1s;wYt |j S)NFzDELETE FROM %s WHERE %s IN (%s)r4r7r8) r rlr(rr>r?r'r@rArBrCboolrowcount)rrRrTrUr?rr@rrrrQs"    zDatabaseCache._base_delete_manycCs|j||d}||t|j}t|}|jj}tj r"t }nt }|j dd}|&}|d|d||j|df||j|g|duWdS1sYwYdS)Nr\rrfz2SELECT %s FROM %s WHERE %s = %%s and expires > %%sr4)r<r;r r=r(rr>r?rrprutcnowrIrnr@rAr'rzrm)rr1r3rTrUr?rIr@rrrhas_keys(      $zDatabaseCache.has_keyc Cs|jdkr |dSt|}|j|j}|d||j|g|d||d}||j krY||j}||j ||g|}|r[|d||dgdSdSdS)Nrz"DELETE FROM %s WHERE expires < %%srez$DELETE FROM %s WHERE cache_key < %%s) _cull_frequencyclearrr>r?r'rArzrmrscache_key_culling_sql) rrTr@rIrUrr|cull_numlast_cache_keyrrrrts.        zDatabaseCache._cullcCs^t|j}t|}|j|j}|}|d|WddS1s(wYdS)NzDELETE FROM %s) r rlr(rr>r?r'r@rA)rrTrUrr@rrrrs  "zDatabaseCache.clear)NNr.)rr r!rLHIGHEST_PROTOCOLrvr0r/rr]rbrdr_rrrQrrtrrrrrr-(s  ,  W   r-)r"rNrLr django.confrdjango.core.cache.backends.baserr django.dbrrrr r django.utilsr r r#r-rrrrs