U
    h                     @   s   d dl Z d dlT d dlmZ d dlmZ d dlmZ zd dlmZ W n  e	k
rd   d dlmZ Y nX e
defi ZG d	d
 d
eZdS )    N)*)sqlite3)
Expression)PickleField)CSqliteExtDatabase)SqliteExtDatabaseSentinelc                   @   s   e Zd Z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d Zdd Zdd  Zd!d" Zd0d#d$Zd1d%d&Zd2d'd(Zd3d)d*Zefd+d,Zd-d. ZdS )4KeyValueav  
    Persistent dictionary.

    :param Field key_field: field to use for key. Defaults to CharField.
    :param Field value_field: field to use for value. Defaults to PickleField.
    :param bool ordered: data should be returned in key-sorted order.
    :param Database database: database where key/value data is stored.
    :param str table_name: table name for data.
    NFkeyvaluec                 C   s   |d krt ddd}|js"td|d kr0t }|| _|| _|| _|pLtd| _|| _	t
| jtpxt
| jtox| jjdk}|r| j| _| j| _n| j| _| j| _|  | _| jj| _| jj| _| j  d S )N   T)
max_lengthprimary_keyz%key_field must have primary_key=True.z:memory:)      )Z	CharFieldr   
ValueErrorr   
_key_field_value_field_orderedr   	_database_table_name
isinstanceZPostgresqlDatabaseZSqliteDatabaseZserver_version_postgres_upsertupsert_postgres_updateupdate_upsert_updatecreate_modelmodelkeyvalueZcreate_table)selfZ	key_fieldZvalue_fieldZordereddatabase
table_nameZsupport_on_conflict r$   0/tmp/pip-unpacked-wheel-5j60pwdk/playhouse/kv.py__init__   s0    




zKeyValue.__init__c                    s   G  fdddt }|S )Nc                       s*   e Zd Z jZ jZG  fdddZdS )z'KeyValue.create_model.<locals>.KeyValuec                       s   e Zd Z jZ jZdS )z,KeyValue.create_model.<locals>.KeyValue.MetaN)__name__
__module____qualname__r   r"   r   r#   r$   r!   r$   r%   Meta>   s   r+   N)r'   r(   r)   r   r   r   r    r+   r$   r*   r$   r%   r	   ;   s   r	   )ZModel)r!   r	   r$   r*   r%   r   :   s    zKeyValue.create_modelc                 G   s&   | j j|  }| jr"|| j}|S N)r   selectZtuplesr   Zorder_byr   )r!   r-   queryr$   r$   r%   r.   C   s    zKeyValue.queryc                 C   s    t |ts| j|kdfS |dfS )NTF)r   r   r   )r!   exprr$   r$   r%   convert_expressionI   s    
zKeyValue.convert_expressionc                 C   s"   |  |\}}| j | S r,   )r0   r   r-   whereexists)r!   r   r/   _r$   r$   r%   __contains__N   s    zKeyValue.__contains__c                 C   s
   t | jS r,   )lenr   r*   r$   r$   r%   __len__R   s    zKeyValue.__len__c                    sf   |  |\}}| | j|}td  fdd|D }t|dkrV|rVt|n|rb|d S |S )Nr   c                    s   g | ]} |qS r$   r$   ).0rowZitem_getterr$   r%   
<listcomp>Y   s     z(KeyValue.__getitem__.<locals>.<listcomp>)r0   r.   r    r1   operator
itemgetterr5   KeyError)r!   r/   	convertedZ	is_singler.   resultr$   r9   r%   __getitem__U   s    

zKeyValue.__getitem__c                 C   s   | j j||dd  d S )Nr   r    replace)r   inserton_conflictexecuter!   r   r    r$   r$   r%   r   `   s     zKeyValue._upsertc                 C   s*   | j j||dj| jg| jgd  d S )NrA   Zconflict_targetpreserve)r   rC   rD   r   r    rE   rF   r$   r$   r%   r   f   s     zKeyValue._postgres_upsertc                 C   s4   t |tr$| jj|d|  n| || d S )N)r    )r   r   r   r   r1   rE   r   )r!   r/   r    r$   r$   r%   __setitem__m   s    
zKeyValue.__setitem__c                 C   s&   |  |\}}| j |  d S r,   )r0   r   deleter1   rE   )r!   r/   r>   r3   r$   r$   r%   __delitem__s   s    zKeyValue.__delitem__c                 C   s   t |   S r,   iterr.   rE   r*   r$   r$   r%   __iter__w   s    zKeyValue.__iter__c                 C   s   t td| | jS Nr   )mapr;   r<   r.   r   r*   r$   r$   r%   keysz   s    zKeyValue.keysc                 C   s   t td| | jS rO   )rP   r;   r<   r.   r    r*   r$   r$   r%   values}   s    zKeyValue.valuesc                 C   s   t |   S r,   rL   r*   r$   r$   r%   items   s    zKeyValue.itemsc                 K   s<   |d k	r| | | jjt| | j| jgdd S )NfieldsrB   	r   r   Zinsert_manylistrS   r   r    rD   rE   r!   Z_KeyValue__datamappingr$   r$   r%   r      s    


zKeyValue._updatec                 K   sH   |d k	r| | | jjt| | j| jgdj| jg| jgd S )NrT   rG   rV   rX   r$   r$   r%   r      s    


zKeyValue._postgres_updatec                 C   s(   z
| | W S  t k
r"   | Y S X d S r,   r=   r!   r   defaultr$   r$   r%   get   s    
zKeyValue.getc                 C   s0   z
| | W S  t k
r*   || |< | Y S X d S r,   rZ   r[   r$   r$   r%   
setdefault   s
    
zKeyValue.setdefaultc              
   C   s\   | j  H z| | }W n. tk
rF   |tkr2 | Y W  5 Q R  S X | |= W 5 Q R X |S r,   )r   Zatomicr=   r   )r!   r   r\   r?   r$   r$   r%   pop   s    zKeyValue.popc                 C   s   | j    d S r,   )r   rJ   rE   r*   r$   r$   r%   clear   s    zKeyValue.clear)NNFNr
   )N)N)N)N)r'   r(   r)   __doc__r&   r   r.   r0   r4   r6   r@   r   r   rI   rK   rN   rQ   rR   rS   r   r   r]   r^   r   r_   r`   r$   r$   r$   r%   r	      s2   	    
 	
	



r	   )r;   Zpeeweer   r   Zplayhouse.fieldsr   Zplayhouse.sqlite_extr   r   ImportErrortypeobjectr   r	   r$   r$   r$   r%   <module>   s   