
v^t*                 @   s   d  Z  d d l Z d d l Z d d l m Z d d l m Z d d l m Z m Z d d l	 m
 Z
 m Z m Z m Z m Z d d l m Z Gd d	   d	  Z Gd
 d   d e  Z Gd d   d e  Z d S)zDatabase cache backend.    N)datetime)settings)DEFAULT_TIMEOUT	BaseCache)DatabaseErrorconnectionsmodelsroutertransaction)timezonec               @   s"   e  Z d  Z d Z d d   Z d S)Optionsz~A class that will quack like a Django model _meta class.

    This allows cache operations to be controlled by the router
    c             C   s^   | |  _  d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _	 d  S)NZdjango_cacheZ
cacheentryzcache entryzcache entries
CacheEntryFT)
Zdb_tableZ	app_labelZ
model_nameZverbose_nameZverbose_name_pluralZobject_nameZabstractZmanagedproxyZswapped)selftable r   ?/tmp/pip-build-8lau8j11/django/django/core/cache/backends/db.py__init__   s    									zOptions.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r      s   r   c                   s"   e  Z d  Z   f d d   Z   S)BaseDatabaseCachec                s?   t    j |    |  _ G  f d d   d  } | |  _ d  S)Nc                   s   e  Z d  Z e    Z d S)z.BaseDatabaseCache.__init__.<locals>.CacheEntryN)r   r   r   r   Z_metar   )r   r   r   r   #   s   r   )superr   _tablecache_model_class)r   r   paramsr   )	__class__)r   r   r      s    	zBaseDatabaseCache.__init__)r   r   r   r   r   r   )r   r   r      s   r   c               @   s   e  Z d  Z e j Z d d d d  Z d d d  Z e d d d  Z	 e d d d	  Z
 e d d
 d  Z e d d  Z d d d  Z d d d  Z d d   Z d d d  Z d d   Z d d   Z d S)DatabaseCacheNc             C   s   |  j  | g |  j | |  S)N)get_manyget)r   keydefaultversionr   r   r   r    2   s    zDatabaseCache.getc             C   s  | s
 i  Si  } x1 | D]) } |  j  |  | | |  j | |  <q Wt j |  j  } t | } | j j } | |  j  } | j	   m }	 |	 j
 d | d  | d  | d  | | d  d j d g t |   f t |   |	 j   }
 Wd  QRXi  } g  } t j d t j    } | j j |  | j |  } x |
 D] \ } } } x  | D] } | | | |  } qWW| t j   k  r| j |  qA| j j |  } t j t j | j     } | | | j |  <qAW|  j |  | S)Nz*SELECT %s, %s, %s FROM %s WHERE %s IN (%s)	cache_keyvalueexpiresz, z%soutput_field)validate_keymake_keyr	   db_for_readr   r   ops
quote_namer   cursorexecutejoinlenlistZfetchallr   
ExpressionDateTimeFieldget_db_convertersr   nowappendZprocess_clobpickleloadsbase64	b64decodeencoder    _base_delete_many)r   keysr#   Zkey_mapr!   db
connectionr,   r   r-   ZrowsresultZexpired_keys
expression
convertersr%   r&   	converterr   r   r   r   5   sF    
				zDatabaseCache.get_manyc             C   s<   |  j  | d | } |  j |  |  j d | | |  d  S)Nr#   set)r)   r(   	_base_set)r   r!   r%   timeoutr#   r   r   r   rD   a   s    zDatabaseCache.setc             C   s8   |  j  | d | } |  j |  |  j d | | |  S)Nr#   add)r)   r(   rE   )r   r!   r%   rF   r#   r   r   r   rG   f   s    zDatabaseCache.addc             C   s8   |  j  | d | } |  j |  |  j d | d  |  S)Nr#   touch)r)   r(   rE   )r   r!   rF   r#   r   r   r   rH   k   s    zDatabaseCache.touchc             C   s.  |  j  |  } t j |  j  } t | } | j j } | |  j  } | j   }	 |	 j	 d |  |	 j
   d }
 t j   } | j d d  } | d  k r t j } n* t j r t j |  } n t j |  } | j d d  } |
 |  j k r
|  j | |	 |  t j | |  j  } t j |  j d  } yt j d |  |	 j	 d | d  | d  | | d  f | g  |	 j
   } | r| d	 } t j d
 t j     } x9 | j j! |  | j! |  D] } | | | |  } qW| j j" |  } | rH| d k rH|	 j	 d | | d  | d  f | | g  n | r| d k sr| d k r| | k  r|	 j	 d | | d  | d  | d  f | | | g  nN | d k r|	 j	 d | | d  | d  | d  f | | | g  n d SWd  QRXWn t# k
 rd SYn Xd SWd  QRXd  S)NzSELECT COUNT(*) FROM %sr   microsecondlatin1Zusingz$SELECT %s, %s FROM %s WHERE %s = %%sr$   r&      r'   rH   z%UPDATE %s SET %s = %%s WHERE %s = %%srD   rG   z/UPDATE %s SET %s = %%s, %s = %%s WHERE %s = %%sr%   z2INSERT INTO %s (%s, %s, %s) VALUES (%%s, %%s, %%s)FT)$Zget_backend_timeoutr	   db_for_writer   r   r+   r,   r   r-   r.   fetchoner   r5   replacer   maxr   USE_TZutcfromtimestampfromtimestamp_max_entries_cullr7   dumpspickle_protocolr9   	b64encodedecoder
   Zatomicr   r2   r3   r4   adapt_datetimefield_valuer   )r   moder!   r%   rF   r>   r?   r,   r   r-   numr5   expZpickledZ
b64encodedr@   Zcurrent_expiresrA   rC   r   r   r   rE   p   s    
			

	*					zDatabaseCache._base_setc             C   s   |  j  | g |  d  S)N)delete_many)r   r!   r#   r   r   r   delete   s    zDatabaseCache.deletec             C   sN   g  } x4 | D], } |  j  |  | j |  j | |   q W|  j |  d  S)N)r(   r6   r)   r<   )r   r=   r#   Zkey_listr!   r   r   r   r]      s
    zDatabaseCache.delete_manyc             C   s   | s
 d  St  j |  j  } t | } | j j } | |  j  } | j   @ } | j d | | d  d j	 d g t
 |   f |  Wd  QRXd  S)NzDELETE FROM %s WHERE %s IN (%s)r$   z, z%s)r	   rL   r   r   r+   r,   r   r-   r.   r/   r0   )r   r=   r>   r?   r,   r   r-   r   r   r   r<      s    
	zDatabaseCache._base_delete_manyc             C   s   |  j  | d | } |  j |  t j |  j  } t | } | j j } t j	 rb t
 j   } n t
 j   } | j d d  } | j   [ } | j d | d  | |  j  | d  f | | j j |  g  | j   d  k	 SWd  QRXd  S)Nr#   rI   r   z2SELECT %s FROM %s WHERE %s = %%s and expires > %%sr$   )r)   r(   r	   r*   r   r   r+   r,   r   rP   r   utcnowr5   rN   r-   r.   r   rY   rM   )r   r!   r#   r>   r?   r,   r5   r-   r   r   r   has_key   s"    
		zDatabaseCache.has_keyc             C   s   |  j  d k r |  j   n t | } | j j |  j  } | j d | | j j |  g  | j d |  | j   d } | |  j	 k r | |  j  } | j | j j
   | | g  | j d | | j   d g  d  S)Nr   z"DELETE FROM %s WHERE expires < %%szSELECT COUNT(*) FROM %sz$DELETE FROM %s WHERE cache_key < %%s)Z_cull_frequencyclearr   r+   r,   r   r.   rY   rM   rS   Zcache_key_culling_sql)r   r>   r-   r5   r?   r   r[   Zcull_numr   r   r   rT      s     

	zDatabaseCache._cullc          
   C   s\   t  j |  j  } t | } | j j |  j  } | j    } | j d |  Wd  QRXd  S)NzDELETE FROM %s)	r	   rL   r   r   r+   r,   r   r-   r.   )r   r>   r?   r   r-   r   r   r   ra     s
    
zDatabaseCache.clear)r   r   r   r7   HIGHEST_PROTOCOLrV   r    r   r   rD   rG   rH   rE   r^   r]   r<   r`   rT   ra   r   r   r   r   r   (   s   	,Wr   )r   r9   r7   r   Zdjango.confr   Zdjango.core.cache.backends.baser   r   Z	django.dbr   r   r   r	   r
   Zdjango.utilsr   r   r   r   r   r   r   r   <module>   s   (
