
sU                 @   s   d  Z  d d l m Z d d l m Z e e  Z Gd d   d e  Z Gd d   d e j	  Z	 Gd	 d
   d
 e	  Z
 Gd d   d e	  Z Gd d   d e
  Z Gd d   d e	  Z Gd d   d e j  Z d S)zB
.. module:: sqlite_backend
   :synopsis: SQLite storage backend.
   )base_backend    )	getLoggerc               @   s(   e  Z d  Z d d   Z d d   Z d S)SqlRowProxyc             C   sY   d d   t  | j d d   | d d    D } t j |  |  | |  _ | |  _ d  S)Nc             s   s'   |  ] \ \ } } } | | f Vq d  S)N ).0kZktypevr   r   D/home/fede/newhome/projects/bottle-cork/tests/cork/sqlite_backend.py	<genexpr>   s    z'SqlRowProxy.__init__.<locals>.<genexpr>r   )zip_columnsdict__init___table_key)selftablekeyrowZlir   r   r
   r      s    3	zSqlRowProxy.__init__c             C   s'   t  j |  | |  |  |  j |  j <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 d   Z d S)Tablez0Provides dictionary-like access to an SQL table.c             C   sj   | |  _  | j |  _ | |  _ d d   |  j D |  _ d |  _ |  j |  j |  _ |  j |  j |  _ d  S)Nc             S   s   g  |  ] \ } } |  q Sr   r   )r   ntr   r   r
   
<listcomp>"   s   	 z"Table.__init__.<locals>.<listcomp>r   )	_backend
connection_engine_table_namer   _column_names_key_col_numZ_key_col_name_key_col)r   backend
table_namer   r   r
   r      s    			zTable.__init__c             C   s>   t  | t  s t  | |  j } t |  | |  } | | f S)N)
isinstancetupleAssertionErrorr$   r   )r   r   r   row_key	row_valuer   r   r
   _row_to_value'   s    zTable._row_to_valuec             C   s-   d |  j  } |  j j |  } | j   d S)NzSELECT count() FROM %sr   )r"   r   	run_queryfetchone)r   queryretr   r   r
   __len__-   s    zTable.__len__c             C   s5   d |  j  |  j | f } |  j j |  } | d  k	 S)NzSELECT * FROM %s WHERE %s='%s')r"   r%   r   	fetch_one)r   r   r0   r   r   r   r
   __contains__2   s    zTable.__contains__c       
         sg  t    t  s t  t    t |  j d d   } } | | s\ t t | |    | | s} t t | |    t    t |  j d d   k s t d t t     t t |  j d d    f   | g   f d d   |  j d d  D } d j |  j  } d j d d   | D  } d	 |  j | | f } |  j j	 | |  }	 d S)
zCreate or update a rowr   Nz%s %sc                s   g  |  ] }   |  q Sr   r   )r   r   )r   r   r
   r   C   s   	 z%Table.__setitem__.<locals>.<listcomp>z, c             s   s   |  ] } d  Vq d S)?Nr   )r   xr   r   r
   r   F   s    z$Table.__setitem__.<locals>.<genexpr>z*INSERT OR REPLACE INTO %s (%s) VALUES (%s))
r(   r   r*   setr#   reprjoinr"   r   run_query_using_conversion)
r   r   r   r	   Zcn
col_valuesZ	col_namesZquestion_marksr0   r1   r   )r   r
   r   9   s    &!!+5-zTable.__setitem__c             C   sZ   d |  j  |  j | f } |  j j |  } | d  k rF t |   n  |  j | |  d S)NzSELECT * FROM %s WHERE %s='%s'r   )r"   r%   r   r3   KeyErrorr-   )r   r   r0   r   r   r   r
   __getitem__M   s    zTable.__getitem__c             c   sF   d |  j  |  j f } |  j j |  } x | D] } | d Vq/ Wd S)z#Iterate over table index key valueszSELECT %s FROM %sr   N)r%   r"   r   r.   )r   r0   resultr   r   r   r
   __iter__W   s    zTable.__iter__c             c   sj   d |  j  } |  j j |  } xD | D]< } t t |  j |   } | j |  j  |  j | f Vq& Wd S)zIterate over table rowszSELECT * FROM %sN)r"   r   r.   r   r   r#   popr%   )r   r0   r>   r   dr   r   r
   	iteritems^   s    zTable.iteritemsc             C   s<   |  j  |  } d |  j |  j | f } |  j j |  | S)NzDELETE FROM %s WHERE %s='%s')r=   r"   r%   r   r3   )r   r   rA   r0   r   r   r
   r@   h   s
    z	Table.popc             C   s
   t   d  S)N)NotImplementedError)r   rA   r   r   r
   insertp   s    zTable.insertc             C   s
   t   d  S)N)rC   )r   r   r   r
   empty_tables   s    zTable.empty_tablec             C   s   g  } xy |  j  D]n \ } } | t k r1 d } n | t k rF d } n  | |  j k r^ d } n d } | j d | | | f  q Wd j |  } d |  j | f } |  j j |  d S)	zIssue table creationINTEGERTEXTzPRIMARY KEY ASC z%s %s %s,zCREATE TABLE %s (%s)N)	r   intstrr%   appendr9   r"   r   r.   )r   Zcccol_nameZcol_typeextrasr0   r   r   r
   create_tablev   s    			zTable.create_tableN)r   r   r   __doc__r   r-   r2   r4   r   r=   r?   rB   r@   rD   rE   rO   r   r   r   r
   r      s   	

r   c                   s:   e  Z d  Z   f d d   Z d d   Z d d   Z   S)SingleValueTablec                s*   t  t |   j |   |  j d |  _ d  S)Nr   )superrQ   r   r#   
_value_col)r   args)	__class__r   r
   r      s    zSingleValueTable.__init__c             C   sW   t  | t  s t  d |  j |  j |  j f } | | f } |  j j | |  } d S)zCreate or update a rowz0INSERT OR REPLACE INTO %s (%s, %s) VALUES (?, ?)N)r(   r   r*   r"   r%   rS   r   r:   )r   r   r   r0   r;   r1   r   r   r
   r      s
    zSingleValueTable.__setitem__c             C   sT   d |  j  |  j |  j | f } |  j j |  } | d  k rL t |   n  | d S)NzSELECT %s FROM %s WHERE %s='%s'r   )rS   r"   r%   r   r3   r<   )r   r   r0   r   r   r   r
   r=      s    zSingleValueTable.__getitem__)r   r   r   r   r   r=   r   r   )rU   r
   rQ      s   	rQ   c                   s"   e  Z d  Z   f d d   Z   S)
UsersTablec                se   d t  f d t  f d t  f d t  f d t  f d t  f d t  f f |  _ t t |   j | |   d  S)Nusernamerolehash
email_addrdesccreation_date
last_login)rK   r   rR   rV   r   )r   rT   kwargs)rU   r   r
   r      s    						zUsersTable.__init__)r   r   r   r   r   r   )rU   r
   rV      s   rV   c                   s"   e  Z d  Z   f d d   Z   S)
RolesTablec                s8   d t  f d t f f |  _ t t |   j | |   d  S)NrX   level)rK   rJ   r   rR   r_   r   )r   rT   r^   )rU   r   r
   r      s    	zRolesTable.__init__)r   r   r   r   r   r   )rU   r
   r_      s   r_   c                   s"   e  Z d  Z   f d d   Z   S)PendingRegistrationsTablec                se   d t  f d t  f d t  f d t  f d t  f d t  f d t  f f |  _ t t |   j | |   d  S)NcoderW   rX   rY   rZ   r[   r\   )rK   r   rR   ra   r   )r   rT   r^   )rU   r   r
   r      s    						z"PendingRegistrationsTable.__init__)r   r   r   r   r   r   )rU   r
   ra      s   ra   c               @   s   e  Z d  Z d d d d d d  Z e 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)SQLiteBackendusersrolesregisterFc             C   s   | |  _  t |  |  |  _ t |  |  |  _ t |  |  |  _ | r| |  j j   |  j j   |  j j   t j	 d  n  d  S)NzTables created)
	_filenamerV   rd   r_   re   ra   pending_registrationsrO   logdebug)r   filenameusers_tnameroles_tnamepending_reg_tname
initializer   r   r
   r      s    	zSQLiteBackend.__init__c             C   sR   y |  j  SWn@ t k
 rM d d  l } | j |  j d d  |  _  |  j  SYn Xd  S)Nr   isolation_level)_connectionAttributeErrorsqlite3connectrg   )r   rs   r   r   r
   r       s    zSQLiteBackend.connectionc             C   s   |  j  j |  S)N)rq   execute)r   r0   r   r   r
   r.      s    zSQLiteBackend.run_queryc             C   s   |  j  j | |  S)N)rq   ru   )r   r0   rT   r   r   r
   r:      s    z(SQLiteBackend.run_query_using_conversionc             C   s   |  j  j |  j   S)N)rq   ru   r/   )r   r0   r   r   r
   r3      s    zSQLiteBackend.fetch_onec             C   s
   t   d  S)N)rC   )r   db_namer   r   r
   _initialize_storage   s    z!SQLiteBackend._initialize_storagec             C   s
   t   d  S)N)rC   )r   r   r   r
   _drop_all_tables   s    zSQLiteBackend._drop_all_tablesc             C   s   d  S)Nr   )r   r   r   r
   
save_users   s    zSQLiteBackend.save_usersc             C   s   d  S)Nr   )r   r   r   r
   
save_roles   s    zSQLiteBackend.save_rolesc             C   s   d  S)Nr   )r   r   r   r
   save_pending_registrations   s    z(SQLiteBackend.save_pending_registrationsN)r   r   r   r   propertyr    r.   r:   r3   rw   rx   ry   rz   r{   r   r   r   r
   rc      s   	rc   N)rP   rH   r   loggingr   r   ri   r   r   r   rQ   rV   r_   ra   Backendrc   r   r   r   r
   <module>   s   p