U
    h                     @   s   d Z ddlZddlT ddlmZ ddlmZ ddlmZ ddlmZ	 ddlm
Z dd	lmZ dd
lmZ ddlmZ ddlmZ G dd deZdd ZG dd deZG dd deZG dd deZG dd de	ZG dd deZ
dS )an  
Peewee integration with APSW, "another python sqlite wrapper".

Project page: https://rogerbinns.github.io/apsw/

APSW is a really neat library that provides a thin wrapper on top of SQLite's
C interface.

Here are just a few reasons to use APSW, taken from the documentation:

* APSW gives all functionality of SQLite, including virtual tables, virtual
  file system, blob i/o, backups and file control.
* Connections can be shared across threads without any additional locking.
* Transactions are managed explicitly by your code.
* APSW can handle nested transactions.
* Unicode is handled correctly.
* APSW is faster.
    N)*)__exception_wrapper__)BooleanField)	DateField)DateTimeField)DecimalField)Insert)	TimeField)logger)SqliteExtDatabasec                       s   e Zd Zedd e dD Z fddZdd Z	dd	 Z
d
d Z fddZdd Zdd Zdd Zdd Zdd Zdd Zd(ddZdd Zd)d d!Zd"d# Zd$d% Zd*d&d'Z  ZS )+APSWDatabasec                 c   s   | ]}t |V  qd S N)int).0i r   6/tmp/pip-unpacked-wheel-5j60pwdk/playhouse/apsw_ext.py	<genexpr>"   s     zAPSWDatabase.<genexpr>.c                    s   i | _ tt| j|f| d S r   )_modulessuperr   __init__)selfdatabasekwargs	__class__r   r   r   $   s    zAPSWDatabase.__init__c                 C   s&   || j |< |  s"|  || d S r   )r   	is_closed
connectioncreatemodule)r   mod_namemod_instr   r   r   register_module(   s    
zAPSWDatabase.register_modulec                 C   s   | j |= d S r   )r   )r   r    r   r   r   unregister_module-   s    zAPSWDatabase.unregister_modulec                 C   sV   t j| jf| j}| jd k	r,|| jd  z| | W n   |   Y nX |S )Ni  )apsw
Connectionr   Zconnect_params_timeoutZsetbusytimeout_add_conn_hookscloser   connr   r   r   _connect0   s    
zAPSWDatabase._connectc                    s   t t| | | | d S r   )r   r   r'   _load_modulesr)   r   r   r   r'   ;   s    zAPSWDatabase._add_conn_hooksc                 C   s$   | j  D ]\}}||| q
|S r   )r   itemsr   )r   r*   r    r!   r   r   r   r,   ?   s    zAPSWDatabase._load_modulesc                    s4   | j  D ]$\}\ } fdd}||| q
d S )Nc                      s      j  jfS r   )stepfinalizer   klassr   r   make_aggregateF   s    z5APSWDatabase._load_aggregates.<locals>.make_aggregate)Z_aggregatesr-   Zcreateaggregatefunction)r   r*   name
num_paramsr2   r   r0   r   _load_aggregatesD   s    zAPSWDatabase._load_aggregatesc                 C   s$   | j  D ]\}}||| q
d S r   )Z_collationsr-   Zcreatecollation)r   r*   r3   fnr   r   r   _load_collationsJ   s    zAPSWDatabase._load_collationsc                 C   s@   | j  D ]0\}\}}}|r"|fnd}|j|||f|  q
d S Nr   )Z
_functionsr-   Zcreatescalarfunction)r   r*   r3   r6   r4   Zdeterministicargsr   r   r   _load_functionsN   s    zAPSWDatabase._load_functionsc                 C   s$   | d | jD ]}|| qd S NT)enableloadextension_extensionsloadextension)r   r*   	extensionr   r   r   _load_extensionsS   s    

zAPSWDatabase._load_extensionsc                 C   s4   | j | |  s0|  }|d || d S r;   )r=   addr   r   r<   r>   )r   r?   r*   r   r   r   load_extensionX   s
    
zAPSWDatabase.load_extensionNc              
   C   sJ   | j s|  S |tjkrFz|d d W S  tttfk
rD   Y nX |S )Nr   )Zreturning_clausegetconnectionZlast_insert_rowidr   ZSIMPLEAttributeError
IndexError	TypeError)r   cursorZ
query_typer   r   r   last_insert_id_   s    
zAPSWDatabase.last_insert_idc                 C   s6   z|   W S  tk
r0   |j    Y S X d S r   )rC   changesrD   rG   )r   rG   r   r   r   rows_affectedi   s    zAPSWDatabase.rows_affecteddeferredc                 C   s   |   d|  d S )Nz	begin %s;)rG   execute)r   Z	lock_typer   r   r   begino   s    zAPSWDatabase.beginc              	   C   s@   t 2 |  }|  r(W 5 Q R  dS |d W 5 Q R X dS )NFzcommit;Tr   rG   rC   ZgetautocommitrL   r   Zcursr   r   r   commitr   s    zAPSWDatabase.commitc              	   C   s@   t 2 |  }|  r(W 5 Q R  dS |d W 5 Q R X dS )NFz	rollback;TrN   rO   r   r   r   rollbackz   s    zAPSWDatabase.rollbackc              	   C   s:   t ||f t |  }|||p(d W 5 Q R X |S r8   )r
   debugr   rG   rL   )r   ZsqlparamsrG   r   r   r   execute_sql   s
    zAPSWDatabase.execute_sql)N)rK   )N)__name__
__module____qualname__tupler$   ZsqlitelibversionsplitZserver_versionr   r"   r#   r+   r'   r,   r5   r7   r:   r@   rB   rH   rJ   rM   rP   rQ   rT   __classcell__r   r   r   r   r   !   s$   


r   c                 C   s   |d k	rt |S d S r   )str)svr   r   r   nh   s    r^   c                       s   e Zd Z fddZ  ZS )r   c                    s(   t t| |}|d k	r$|r dp"dS d S )N   r   )r   r   db_value)r   r]   r   r   r   r`      s    zBooleanField.db_value)rU   rV   rW   r`   rZ   r   r   r   r   r      s   r   c                   @   s   e Zd ZeZdS )r   NrU   rV   rW   r^   r`   r   r   r   r   r      s   r   c                   @   s   e Zd ZeZdS )r	   Nra   r   r   r   r   r	      s   r	   c                   @   s   e Zd ZeZdS )r   Nra   r   r   r   r   r      s   r   c                   @   s   e Zd ZeZdS )r   Nra   r   r   r   r   r      s   r   )__doc__r$   Zpeeweer   r   Z_BooleanFieldr   Z
_DateFieldr   Z_DateTimeFieldr   Z_DecimalFieldr   r	   Z
_TimeFieldr
   Zplayhouse.sqlite_extr   r   r^   r   r   r   r   <module>   s$   i