B
    `                 @   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dadaG dd	 d	eZG d
d de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 )DatabaseNamespaceManagerc             C   sR   t d k	rd S y$dd la dd lma ddlma W n tk
rL   tdY nX d S )Nr   )typesz8Database cache backend requires the 'sqlalchemy' library)saZ
sqlalchemyZsqlalchemy.poolpoolr   ImportErrorr   )cls r   [/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/beaker/ext/database.py_init_dependencies   s    z+DatabaseNamespaceManager._init_dependenciesNFbeaker_cachec	                s   t | |  dkri  d| _|r*|| _n|r8|d | _| jrHt| j pR d  }
 fdd}i | _d| _d| _tj	|
|| _
dS )aT  Creates a database namespace manager

        ``url``
            SQLAlchemy compliant db url
        ``sa_opts``
            A dictionary of SQLAlchemy keyword options to initialize the engine
            with.
        ``optimistic``
            Use optimistic session locking, note that this will result in an
            additional select when updating a cache value to compare version
            numbers.
        ``table_name``
            The table name to use in the database for the cache.
        ``schema_name``
            The schema name to use in the database for the cache.
        Nz/container_db_lockzsa.urlc                 s    }  fdd}t j| |}tj|tjdtjdd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	tdrn|jd	}|jdd |S )Nc                 s&    d< t  d} t  }| |_|S )Nzsa.urlzsa.)r   Zengine_from_configZMetaDatabind)Zenginemeta)sa_optsurlr   r   	make_metaM   s
    zHDatabaseNamespaceManager.__init__.<locals>.make_cache.<locals>.make_metaidT)Zprimary_key	namespace   F)Znullableaccessedcreateddata)schema)Z
checkfirst)r   	metadatasgetr   ZTableZColumnr   ZIntegerStringDateTimeZ
PickleTypeZUniqueConstraintr!   create)Zmeta_keyr   r   cache)r   schema_name
table_namer   r   r   
make_cacheI   s    z5DatabaseNamespaceManager.__init__.<locals>.make_cacheF)r   __init__lock_dirr
   hash_is_newloadedr   tablesr#   r'   )selfr   r   r   Z
optimisticr)   data_dirr,   r(   paramsZ	table_keyr*   r   )r   r(   r)   r   r   r+   $   s"    

z!DatabaseNamespaceManager.__init__c             C   s   t  S )N)r	   )r1   r   r   r   get_access_lockg   s    z(DatabaseNamespaceManager.get_access_lockc             C   s   t d| j|f | jdS )Nz databasecontainer/funclock/%s/%s)
identifierr,   )r   r   r,   )r1   keyr   r   r   get_creation_lockj   s    
z*DatabaseNamespaceManager.get_creation_lockc             C   s   | j r|| _d S | j}t|jjg|jj| jk }|	 }|
  |sXd| _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 )NTFr    z.Couln't load pickle data, creating new storage)r/   flagsr'   r   selectcr    r   executeZfetchonecloser.   r-   IOErrorOSErrorEOFErrorr   PickleErrorlogdebug)r1   r8   replacer'   Zresult_proxyresultr   r   r   do_openq   s*    
z DatabaseNamespaceManager.do_openc             C   s   | j d k	rx| j dks| j dkrx| j}| jrT| j| j| jt t d d| _n$|	|j
j| jkj| jt d d | _ d S )Nr:   w)r   r    r   r   F)r    r   )r8   r'   r.   insertr;   r   r-   r   nowupdater:   )r1   r'   r   r   r   do_close   s    z!DatabaseNamespaceManager.do_closec             C   s.   | j }||jj| jk  i | _d| _d S )NT)r'   deleter:   r   r;   r-   r.   )r1   r'   r   r   r   	do_remove   s    z"DatabaseNamespaceManager.do_removec             C   s
   | j | S )N)r-   )r1   r6   r   r   r   __getitem__   s    z$DatabaseNamespaceManager.__getitem__c             C   s
   || j kS )N)r-   )r1   r6   r   r   r   __contains__   s    z%DatabaseNamespaceManager.__contains__c             C   s   || j |< d S )N)r-   )r1   r6   valuer   r   r   __setitem__   s    z$DatabaseNamespaceManager.__setitem__c             C   s   | j |= d S )N)r-   )r1   r6   r   r   r   __delitem__   s    z$DatabaseNamespaceManager.__delitem__c             C   s
   | j  S )N)r-   keys)r1   r   r   r   rR      s    zDatabaseNamespaceManager.keys)NNFr   NNN)__name__
__module____qualname__r   r"   r0   classmethodr   r+   r4   r7   rE   rJ   rL   rM   rN   rP   rQ   rR   r   r   r   r   r      s      
A	r   c               @   s   e Zd ZeZdS )DatabaseContainerN)rS   rT   rU   r   Znamespace_managerr   r   r   r   rW      s   rW   )Zbeaker._compatr   loggingr   Zbeaker.containerr   r   Zbeaker.exceptionsr   r   Zbeaker.synchronizationr   r	   Zbeaker.utilr
   r   	getLoggerrS   rA   r   r   r   r   rW   r   r   r   r   <module>   s   
 !