B
    `q                 @   s   d dl mZ d dlZd dlZd dlmZ d dlmZmZ d dlmZm	Z	 d dl
mZmZ d dlmZmZ eeZdaG dd	 d	eZG d
d deZdddZdS )    )pickleN)datetime)OpenResourceNamespaceManager	Container)InvalidCacheBackendErrorMissingCacheParameter)file_synchronizernull_synchronizer)verify_directorySyncDictc               @   s~   e Zd Ze Ze Zedd ZdddZdd Z	dd	 Z
d
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )SqlaNamespaceManagerc             C   s:   t d k	rd S ydd la W n tk
r4   tdY nX d S )Nr   z?SQLAlchemy, which is required by this backend, is not installed)saZ
sqlalchemyImportErrorr   )cls r   W/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/beaker/ext/sqla.py_init_dependencies   s    z'SqlaNamespaceManager._init_dependenciesNc                s   t | | |r|| _n|r&|d | _| jr6t| j | jjt j fdd| _	| jj
d jjf fdd| _i | _d| _d| _dS )aQ  Create a namespace manager for use with a database table via
        SQLAlchemy.

        ``bind``
            SQLAlchemy ``Engine`` or ``Connection`` object

        ``table``
            SQLAlchemy ``Table`` object in which to store namespace data.
            This should usually be something created by ``make_cache_table``.
        z/container_db_lockc                  s    S )Nr   r   )bindr   r   <lambda>6       z/SqlaNamespaceManager.__init__.<locals>.<lambda>z%s:%sc                  s    S )Nr   r   )tabler   r   r   8   r   FN)r   __init__lock_dirr
   	__class__bindsgetstrurlr   tablesnamer   hash_is_newloaded)self	namespacer   r   data_dirr   kwargsr   )r   r   r   r   !   s    

 zSqlaNamespaceManager.__init__c             C   s   t  S )N)r	   )r#   r   r   r   get_access_lock=   s    z$SqlaNamespaceManager.get_access_lockc             C   s   t d| j | jdS )Nzdatabasecontainer/funclock/%s)
identifierr   )r   r$   r   )r#   keyr   r   r   get_creation_lock@   s    z&SqlaNamespaceManager.get_creation_lockc             C   s   | j r|| _d S t| jjjg| jjj| jk}| j	|
 }|sRd| _i | _nNd| _y|d | _W n8 ttttjtjfk
r   td i | _d| _Y nX || _d| _ d S )NTFdataz.Couln't load pickle data, creating new storage)r"   flagsr   selectr   cr+   r$   r   executeZfetchoner!   r    IOErrorOSErrorEOFErrorr   PickleErrorlogdebug)r#   r,   replacer-   resultr   r   r   do_openE   s&    
zSqlaNamespaceManager.do_openc             C   s   | j d k	r| j dks| j dkr| jrX| j }| jj|| j| jt	 t	 d d| _n0| j
| jjj| jk}| jj|| jt	 d d | _ d S )Nr.   w)r$   r+   accessedcreatedF)r+   r:   )r,   r!   r   insertr   r/   r$   r    r   nowupdater.   )r#   r<   r>   r   r   r   do_close[   s    
zSqlaNamespaceManager.do_closec             C   s4   | j | j jj| jk}| j| i | _d| _d S )NT)r   deleter.   r$   r   r/   r    r!   )r#   r@   r   r   r   	do_removeg   s    zSqlaNamespaceManager.do_removec             C   s
   | j | S )N)r    )r#   r)   r   r   r   __getitem__m   s    z SqlaNamespaceManager.__getitem__c             C   s
   || j kS )N)r    )r#   r)   r   r   r   __contains__p   s    z!SqlaNamespaceManager.__contains__c             C   s   || j |< d S )N)r    )r#   r)   valuer   r   r   __setitem__s   s    z SqlaNamespaceManager.__setitem__c             C   s   | j |= d S )N)r    )r#   r)   r   r   r   __delitem__v   s    z SqlaNamespaceManager.__delitem__c             C   s
   | j  S )N)r    keys)r#   r   r   r   rG   y   s    zSqlaNamespaceManager.keys)NN)__name__
__module____qualname__r   r   r   classmethodr   r   r'   r*   r8   r?   rA   rB   rC   rE   rF   rG   r   r   r   r   r      s   
r   c               @   s   e Zd ZeZdS )SqlaContainerN)rH   rI   rJ   r   Znamespace_managerr   r   r   r   rL   }   s   rL   beaker_cachec             C   s^   t j|| t jdt dddt jdt jddt jdt jddt jd	t jdd|rT|n| jd
S )zuReturn a ``Table`` object suitable for storing cached values for the
    namespace manager.  Do not create the table.r$      T)Zprimary_keyr:   F)Znullabler;   r+   )schema)r   ZTableZColumnStringDateTimeZ
PickleTyperO   )metadataZ
table_nameZschema_namer   r   r   make_cache_table   s    rS   )rM   N)Zbeaker._compatr   loggingr   Zbeaker.containerr   r   Zbeaker.exceptionsr   r   Zbeaker.synchronizationr   r	   Zbeaker.utilr
   r   	getLoggerrH   r4   r   r   rL   rS   r   r   r   r   <module>   s   
k