
1L>V                 @   s  d  Z  d d l Z d d l m Z d d l m Z e e  Z e j j	 d k Z
 yP d d l m Z m Z m Z m Z m Z m Z m Z m Z m Z m Z d Z Wn e k
 r d	 Z Yn XGd
 d   d e  Z Gd d   d e j  Z Gd d   d e  Z Gd d   d e j  Z d S)zJ
.. module:: sqlalchemy_backend
   :synopsis: SQLAlchemy storage backend.
    N)	getLogger   )base_backend   )
create_enginedeleteselectColumn
ForeignKeyIntegerMetaDataStringTableUnicodeTFc               @   s(   e  Z d  Z d d   Z d d   Z d S)SqlRowProxyc             O   s)   t  j |  | |  | |  _ | |  _ d  S)N)dict__init__sql_dictkey)selfr   r   argskwargs r   H/home/fede/newhome/projects/bottle-cork/tests/cork/sqlalchemy_backend.pyr      s    	zSqlRowProxy.__init__c             C   s@   t  j |  | |  |  j d  k	 r< i | | 6|  j |  j <n  d  S)N)r   __setitem__r   r   )r   r   valuer   r   r   r       s    zSqlRowProxy.__setitem__N)__name__
__module____qualname__r   r   r   r   r   r   r      s   r   c               @   s   e  Z d  Z 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 d   Z d S)SqlTablez0Provides dictionary-like access to an SQL table.c             C   s&   | |  _  | |  _ | j | |  _ d  S)N)_engine_tablec_key_col)r   enginetablekey_col_namer   r   r   r   )   s    		zSqlTable.__init__c                sE      j  } t  |    f d d     j   D  } | | f S)Nc             3   s1   |  ]' } |  j  j k r |   | f Vq d  S)N)r#   name).0k)rowr   r   r   	<genexpr>1   s    z)SqlTable._row_to_value.<locals>.<genexpr>)r#   r   keys)r   r*   Zrow_keyZ	row_valuer   )r*   r   r   _row_to_value.   s    	%zSqlTable._row_to_valuec             C   s1   |  j  j   } |  j j |  j   } t |  S)N)r!   countr    executeZscalarint)r   queryr"   r   r   r   __len__4   s    zSqlTable.__len__c             C   s@   t  |  j g |  j | k  } |  j j |  j   } | d  k	 S)N)r   r#   r    r/   fetchone)r   r   r1   r*   r   r   r   __contains__9   s    zSqlTable.__contains__c             C   s   | |  k r6 | } |  j  j   j |  j | k  } n/ i | |  j j 6} | j |  |  j  j   } |  j j | j |    d  S)N)	r!   updatewherer#   r'   insertr    r/   values)r   r   r   r8   r1   r   r   r   r   >   s    $zSqlTable.__setitem__c             C   sb   t  |  j g |  j | k  } |  j j |  j   } | d  k rQ t |   n  |  j |  d S)Nr   )r   r!   r#   r    r/   r3   KeyErrorr-   )r   r   r1   r*   r   r   r   __getitem__J   s
    zSqlTable.__getitem__c             c   sH   t  |  j g  } |  j j |  } x | D] } | d } | Vq+ Wd S)z#Iterate over table index key valuesr   N)r   r#   r    r/   )r   r1   resultr*   r   r   r   r   __iter__Q   s
    
zSqlTable.__iter__c             c   sa   t  |  j g  } |  j j |  } x6 | D]. } | d } |  j |  d } | | f Vq+ Wd S)zIterate over table rowsr   r   N)r   r!   r    r/   r-   )r   r1   r;   r*   r   dr   r   r   	iteritemsY   s    
zSqlTable.iteritemsc             C   sz   t  |  j g |  j | k  } |  j j |  j   } | d  k rK t  n  t |  j |  j | k  } |  j j |  | S)N)r   r!   r#   r    r/   r3   r9   r   )r   r   r1   r*   r   r   r   popb   s    	zSqlTable.popc             C   s=   |  j  j |  } |  j j |  t j d t |   d  S)Nz%s inserted)r!   r7   r    r/   logdebugrepr)r   r=   r1   r   r   r   r7   l   s    zSqlTable.insertc             C   s0   |  j  j   } |  j j |  t j d  d  S)NzTable purged)r!   r   r    r/   r@   info)r   r1   r   r   r   empty_tableq   s    zSqlTable.empty_tableN)r   r   r   __doc__r   r-   r2   r4   r   r:   r<   r>   r?   r7   rD   r   r   r   r   r   &   s   	
r   c               @   s4   e  Z d  Z d d   Z d d   Z d d   Z d S)SqlSingleValueTablec             C   s#   t  j |  | | |  | |  _ d  S)N)r   r   	_col_name)r   r$   r%   r&   Zcol_namer   r   r   r   x   s    zSqlSingleValueTable.__init__c             C   s   | |  j  | |  j f S)N)r#   rG   )r   r*   r   r   r   r-   |   s    z!SqlSingleValueTable._row_to_valuec             C   s!   t  j |  | i | |  j 6 d  S)N)r   r   rG   )r   r   r   r   r   r   r      s    zSqlSingleValueTable.__setitem__N)r   r   r   r   r-   r   r   r   r   r   rF   w   s   rF   c               @   sd   e  Z d  Z d d d d d d  Z d d   Z d	 d
   Z d d   Z d d   Z d d   Z d S)SqlAlchemyBackendusersrolesregisterFc       
      K   s0  t  s t d   n  t   |  _ | r | j d d  \ } } t ra | j d  ra t d  n  t | d d | |  _	 y |  j	 j
 d |  Wn6 t k
 r }	 z t j d	 |	  WYd  d  }	 ~	 Xn X| d
 k r| j d  r|  j	 j
 d |  qn t | d d | |  _	 t | |  j t d t d  d d t d t | d   t d t d  d d t d t d   t d t d   t d t d  d d t d t d  d d 	 |  _ t | |  j t d t d  d d t d t d d  |  _ t | |  j t d t d  d d t d t d  d d t d t | d   t d t d  d d t d t d   t d t d   t d t d  d d 	 |  _ t |  j	 |  j d  |  _ t |  j	 |  j d d  |  _ t |  j	 |  j d  |  _ | r,|  j |  t j d  n  d  S)Nz(The SQLAlchemy library is not available./r   Zmysqlz-WARNING: MySQL is not supported under Python3encodingzutf-8zCREATE DATABASE %szFailed DB creation: %sz:memory:Z
postgresqlzUSE %susername   Zprimary_keyTrolez.rolehash   ZnullableF
email_addrdesccreation_date
last_loginlevelcodezTables created)sqlalchemy_availableRuntimeErrorr   	_metadatarsplitis_py3
startswithprintr   r    r/   	Exceptionr@   rC   r   r	   r   r
   r   Z_usersr   Z_rolesZ_pending_regr   rI   rF   rJ   pending_registrations_initialize_storagerA   )
r   Zdb_full_urlZusers_tnameZroles_tnameZpending_reg_tname
initializer   Zdb_urldb_nameer   r   r   r      sP    $!!zSqlAlchemyBackend.__init__c             C   s   |  j  j |  j  d  S)N)r[   Z
create_allr    )r   rd   r   r   r   rb      s    z%SqlAlchemyBackend._initialize_storagec             C   sQ   xJ t  |  j j  D]6 } t j d t | j   |  j j | j	    q Wd  S)NzDropping table %s)
reversedr[   Zsorted_tablesr@   rC   rB   r'   r    r/   r   )r   r%   r   r   r   _drop_all_tables   s    z"SqlAlchemyBackend._drop_all_tablesc             C   s   d  S)Nr   )r   r   r   r   
save_users   s    zSqlAlchemyBackend.save_usersc             C   s   d  S)Nr   )r   r   r   r   
save_roles   s    zSqlAlchemyBackend.save_rolesc             C   s   d  S)Nr   )r   r   r   r   save_pending_registrations   s    z,SqlAlchemyBackend.save_pending_registrationsN)	r   r   r   r   rb   rg   rh   ri   rj   r   r   r   r   rH      s   ;rH   )rE   sysloggingr    r   r   r@   version_infomajorr]   Z
sqlalchemyr   r   r   r	   r
   r   r   r   r   r   rY   ImportErrorr   r   r   rF   BackendrH   r   r   r   r   <module>   s   F
Q