
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    S¤ðWˆ4  ã                    @   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 ddlmZ zddlmZ e ¡  W n ek
r¸   Y nX ddlmZ ddlmZ ddlmZ ddlmZ zddlmZ W n   dZY nX ejdd�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G d"d#„ d#eƒZ d$d%„ Z!ee e!ƒ G d&d'„ d'eƒZ"G d(d)„ d)e"e#ƒZ$G d*d+„ d+e%ƒZ&G d,d-„ d-e"e#ƒZ'G d.d/„ d/e#ƒZ(G d0d1„ d1e"e(ƒZ)G d2d3„ d3e"e*ƒZ+d4d5„ Z,ej-d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdE� G dFdG„ dGe
ƒZ.G dHdI„ dIe/ƒZ0G dJdK„ dKeƒZ1e0 2dLdMdNdOdPdQœ¡ e0 3ej4dRej5dSej6dTej7dUej8dVej9dWej:dRej;dXej<dYej=dRej>dZej?dUej@dSejAdTejBdDi¡ d[d\„ ZCdad_d`„ZDdS )bzr
Collection of postgres-specific extensions, currently including:

* Support for hstore, a key/value type storage
é    N)Ú*)Ú
Expression)Úlogger)ÚNode)ÚOP)ÚParam)ÚPassthrough)Úreturns_clone)ÚQueryCompiler)ÚSelectQuery)Ú	UUIDField)Úcompat)Úadapt)ÚAsIs)Úregister_adapter)Úregister_hstore)ÚJsonF)Úclonec                 C   s   t | tjt|ƒƒS ©N)r   r   ÚCASTÚSQL©ÚselfZas_type© r   úI/opt/alt/python38/lib64/python3.8/site-packages/playhouse/postgres_ext.pyÚcast#   s    r   c                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )Ú_LookupNodec                    s   || _ || _tt| ƒ ¡  d S r   )ÚnodeÚpartsÚsuperr   Ú__init__)r   r   r   ©Ú	__class__r   r   r    (   s    z_LookupNode.__init__c                 C   s   t | ƒ| jt| jƒƒS r   )Útyper   Úlistr   ©r   r   r   r   Ú
clone_base-   s    z_LookupNode.clone_basec                 C   s   t t| dd�tjt|ƒƒS )NT)Úparens)r   ÚClauser   r   r   r   r   r   r   r   0   s    z_LookupNode.cast)Ú__name__Ú
__module__Ú__qualname__r    r&   r   Ú__classcell__r   r   r!   r   r   '   s   r   c                       sL   e Zd Zd‡ fdd„	Zdd„ Zeddd„ƒZd	d
„ Zdd„ Zdd„ Z	‡  Z
S )Ú_JsonLookupBaseFc                    s   t t| ƒ ||¡ || _d S r   )r   r-   r    Ú_as_json)r   r   r   Úas_jsonr!   r   r   r    4   s    z_JsonLookupBase.__init__c                 C   s   t | ƒ| jt| jƒ| jƒS r   )r#   r   r$   r   r.   r%   r   r   r   r&   8   s    z_JsonLookupBase.clone_baseTc                 C   s
   || _ d S r   )r.   )r   r/   r   r   r   r/   ;   s    z_JsonLookupBase.as_jsonc                 C   s8   |   d¡}t|ttfƒr*t|tjt|ƒƒS t|tj|ƒS ©NT)	r/   Ú
isinstancer$   Údictr   r   ÚJSONB_CONTAINSr   ÚJSONB_EXISTS)r   Úotherr   r   r   r   Úcontains?   s    
z_JsonLookupBase.containsc                 G   s   t |  d¡tjtt|ƒƒƒS r0   )r   r/   r   ÚJSONB_CONTAINS_ANY_KEYr   r$   ©r   Úkeysr   r   r   Úcontains_anyE   s
    
ýz_JsonLookupBase.contains_anyc                 G   s   t |  d¡tjtt|ƒƒƒS r0   )r   r/   r   ÚJSONB_CONTAINS_ALL_KEYSr   r$   r8   r   r   r   Úcontains_allK   s
    
ýz_JsonLookupBase.contains_all)F)T)r)   r*   r+   r    r&   r	   r/   r6   r:   r<   r,   r   r   r!   r   r-   3   s   r-   c                   @   s   e Zd ZdZdd„ ZdS )Ú
JsonLookupÚjson_lookupc                 C   s   t | j| j|g | jƒS r   )r=   r   r   r.   ©r   Úvaluer   r   r   Ú__getitem__T   s    zJsonLookup.__getitem__N)r)   r*   r+   Ú
_node_typerA   r   r   r   r   r=   Q   s   r=   c                   @   s   e Zd ZdZdS )ÚJsonPathÚ	json_pathN)r)   r*   r+   rB   r   r   r   r   rC   W   s   rC   c                   @   s$   e Zd ZdZedd„ ƒZdd„ ZdS )ÚObjectSliceÚobject_slicec                 C   sL   t |tƒr |jpd|jpdg}n"t |tƒr2|g}ntt| d¡ƒ}| ||ƒS )Nr   ú:)r1   ÚsliceÚstartÚstopÚintÚmapÚsplit)Úclsr   r@   r   r   r   r   Úcreate]   s    

zObjectSlice.createc                 C   s   t  | |¡S r   ©rE   rO   r?   r   r   r   rA   g   s    zObjectSlice.__getitem__N)r)   r*   r+   rB   ÚclassmethodrO   rA   r   r   r   r   rE   Z   s   
	rE   c                   @   s   e Zd Zdd„ ZdS )Ú_Arrayc                 C   s   || _ || _d S r   )ÚfieldÚitems)r   rS   rT   r   r   r   r    k   s    z_Array.__init__N)r)   r*   r+   r    r   r   r   r   rR   j   s   rR   c                 C   sD   | j jjj ¡ }t| jƒ}| |¡ td|| j  	¡ d| j j
 f ƒS )Nz%s::%s%sú[])rS   Úmodel_classÚ_metaÚdatabaseÚget_connr   rT   Zpreparer   Úget_column_typeÚ
dimensions)ZarrÚconnrT   r   r   r   Úadapt_arrayo   s    


ýr]   c                       s"   e Zd ZdZd‡ fdd„	Z‡  ZS )ÚIndexedFieldMixinZGiSTNc                    s<   |  dd¡ tt| ƒj||Ž | jr2|p,| j| _nd | _d S )NÚindexT)Ú
setdefaultr   r^   r    r_   Údefault_index_typeÚ
index_type)r   rb   ÚargsÚkwargsr!   r   r   r    }   s
    zIndexedFieldMixin.__init__)N)r)   r*   r+   ra   r    r,   r   r   r!   r   r^   z   s   r^   c                       sN   e Zd ZdZedf‡ fdd„	Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
‡  ZS )Ú
ArrayFieldÚGINé   c                    s4   |||Ž| _ || _| j  ¡ | _tt| ƒj||Ž d S r   )Ú_ArrayField__fieldr[   Úget_db_fieldÚdb_fieldr   re   r    )r   Zfield_classr[   rc   rd   r!   r   r   r    ‰   s    zArrayField.__init__c                 C   s$   | j  |¡}| jd| j 7  _|S )NrU   )rh   Ú__ddl_column__r@   r[   )r   Úcolumn_typeÚsqlr   r   r   rk   �   s    zArrayField.__ddl_column__c                 C   s,   |d krd S t |ttfƒs"t|ƒ}t| |ƒS r   )r1   r$   rR   r?   r   r   r   Údb_value•   s
    zArrayField.db_valuec                 C   s   t  | |¡S r   rP   r?   r   r   r   rA   œ   s    zArrayField.__getitem__c                 G   s   t | tjt|ƒƒS r   )r   r   Ú	ACONTAINSr   ©r   rT   r   r   r   r6   Ÿ   s    zArrayField.containsc                 G   s   t | tjt|ƒƒS r   )r   r   ÚACONTAINS_ANYr   rp   r   r   r   r:   ¢   s    zArrayField.contains_any)r)   r*   r+   ra   ÚIntegerFieldr    rk   rn   rA   r6   r:   r,   r   r   r!   r   re   †   s   re   c                   @   s   e Zd ZdZdS )ÚDateTimeTZFieldÚdatetime_tzN)r)   r*   r+   rj   r   r   r   r   rs   ¦   s   rs   c                   @   sh   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 )ÚHStoreFieldÚhashc                 C   s   t | tjt|ƒƒS r   )r   r   ÚHKEYr   ©r   Úkeyr   r   r   rA   ­   s    zHStoreField.__getitem__c                 C   s
   t  | ¡S r   )ÚfnZakeysr%   r   r   r   r9   °   s    zHStoreField.keysc                 C   s
   t  | ¡S r   )rz   Zavalsr%   r   r   r   Úvalues³   s    zHStoreField.valuesc                 C   s
   t  | ¡S r   )rz   Zhstore_to_matrixr%   r   r   r   rT   ¶   s    zHStoreField.itemsc                 G   s   t  | tt|ƒƒ¡S r   )rz   rH   r   r$   )r   rc   r   r   r   rH   ¹   s    zHStoreField.slicec                 C   s   t  | |¡S r   )rz   Zexistrx   r   r   r   Úexists¼   s    zHStoreField.existsc                 C   s   t  | |¡S r   )rz   Údefinedrx   r   r   r   r}   ¿   s    zHStoreField.definedc                 K   s   t | tj|ƒS r   )r   r   ÚHUPDATE)r   Údatar   r   r   ÚupdateÂ   s    zHStoreField.updatec                 G   s   t  | tt|ƒƒ¡S r   )rz   Údeleter   r$   r8   r   r   r   r�   Å   s    zHStoreField.deletec                 C   sJ   t |tƒrt| tjt|ƒƒS t |ttfƒr<t| tjt|ƒƒS t| tj	|ƒS r   )
r1   r2   r   r   ÚHCONTAINS_DICTr   r$   ÚtupleÚHCONTAINS_KEYSÚHCONTAINS_KEYr?   r   r   r   r6   È   s
    
zHStoreField.containsc                 G   s   t | tjtt|ƒƒƒS r   )r   r   ÚHCONTAINS_ANY_KEYr   r$   r8   r   r   r   r:   Ï   s    zHStoreField.contains_anyN)r)   r*   r+   rj   rA   r9   r{   rT   rH   r|   r}   r€   r�   r6   r:   r   r   r   r   ru   ª   s   ru   c                       s:   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Z‡  ZS )Ú	JSONFieldÚjsonNc                    s,   t d krtdƒ‚|| _tt| ƒj||Ž d S )Nz/Your version of psycopg2 does not support JSON.)r   Ú	ExceptionÚdumpsr   r‡   r    )r   rŠ   rc   rd   r!   r   r   r    Ö   s    zJSONField.__init__c                 C   s(   |d kr|S t |tƒs$t|| jd�S |S )N)rŠ   )r1   r   rŠ   r?   r   r   r   rn   Ý   s
    
zJSONField.db_valuec                 C   s   t | |gƒS r   )r=   r?   r   r   r   rA   ä   s    zJSONField.__getitem__c                 G   s
   t | |ƒS r   )rC   r8   r   r   r   Úpathç   s    zJSONField.path)N)	r)   r*   r+   rj   r    rn   rA   r‹   r,   r   r   r!   r   r‡   Ó   s
   r‡   c                   @   s4   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚBinaryJSONFieldÚjsonbrf   c                 C   s2   t |ttfƒr t| tjt|ƒƒS t| tjt|ƒƒS r   )	r1   r$   r2   r   r   r3   r   r4   r   ©r   r5   r   r   r   r6   ï   s    zBinaryJSONField.containsc                 C   s   t | tjt|ƒƒS r   )r   r   ÚJSONB_CONTAINED_BYr   rŽ   r   r   r   Úcontained_byô   s    zBinaryJSONField.contained_byc                 G   s   t | tjtt|ƒƒƒS r   )r   r   r7   r   r$   rp   r   r   r   r:   ÷   s
    
ýzBinaryJSONField.contains_anyc                 G   s   t | tjtt|ƒƒƒS r   )r   r   r;   r   r$   rp   r   r   r   r<   ý   s
    
ýzBinaryJSONField.contains_allN)	r)   r*   r+   rj   ra   r6   r�   r:   r<   r   r   r   r   rŒ   ë   s   rŒ   c                   @   s   e Zd ZdZdZdd„ ZdS )ÚTSVectorFieldÚtsvectorrf   c                 C   s   t | tjt |¡ƒS r   )r   r   ÚTS_MATCHrz   Ú
to_tsquery)r   Úqueryr   r   r   Úmatch  s    zTSVectorField.matchN)r)   r*   r+   rj   ra   r–   r   r   r   r   r‘     s   r‘   c                 C   s   t t | ¡tjt |¡ƒS r   )r   rz   Zto_tsvectorr   r“   r”   )rS   r•   r   r   r   ÚMatch  s    r—   ry   zH@>zH?&zH?zH?|zH||zA@>zA||zT@@zJB@>zJB<@zJB?|zJB?&zJB?z::)rw   r~   r‚   r„   r…   r†   ro   rq   r“   r3   r�   r7   r;   r4   r   c                       sB   e Zd Zd‡ fdd„	Zdd„ Zdd„ Zdd	„ Z‡ fd
d„Z‡  ZS )ÚPostgresqlExtCompilerFc                    sP   t t| ƒ |||¡}d }|D ]}t|tƒr|j}q|rL|j dtd| ƒ¡ |S )NéÿÿÿÿzUSING %s)	r   r˜   Ú_create_indexr1   r^   rb   ÚnodesÚinsertr   )r   rV   ÚfieldsÚuniqueÚclauserb   rS   r!   r   r   rš   $  s    
  ÿ
z#PostgresqlExtCompiler._create_indexc                 C   s>   |   |j||¡\}}dd„ |jD ƒ}d|d |¡f }||fS )Nc                 S   s   g | ]}t |d  ƒ‘qS )rg   )Ústr)Ú.0Úpartr   r   r   Ú
<listcomp>4  s     z=PostgresqlExtCompiler._parse_object_slice.<locals>.<listcomp>z%s[%s]rG   )Ú
parse_noder   r   Újoin)r   r   Ú	alias_mapÚconvrm   Úparamsr   r   r   r   Ú_parse_object_slice1  s    z)PostgresqlExtCompiler._parse_object_slicec                 C   s�   |   |j||¡\}}|g}|jD ]*}|   |||¡\}}	| |¡ | |	¡ q |jr^d |¡}n*|d d… |d  }
}d d |
¡|f¡}||fS )Nú->r™   z->>)r¤   r   r   ÚappendÚextendr.   r¥   )r   r   r¦   r§   rm   r¨   Zlookupsr¢   Zpart_sqlZpart_paramsÚheadÚtailr   r   r   Ú_parse_json_lookup8  s    
  ÿ
z(PostgresqlExtCompiler._parse_json_lookupc                 C   sT   |   |j||¡\}}|jr d}nd}| dd tt|jƒ¡ ¡ | || jf¡|fS )Nz#>z#>>z{%s}ú,)	r¤   r   r.   r«   r¥   rL   r    r   Úinterpolation)r   r   r¦   r§   rm   r¨   Zoperandr   r   r   Ú_parse_json_pathJ  s    z&PostgresqlExtCompiler._parse_json_pathc                    s(   t t| ƒ ¡ }|j| j| j| jd� |S )N)rF   r>   rD   )r   r˜   Úget_parse_mapr€   r©   r¯   r²   )r   Z	parse_mapr!   r   r   r³   S  s    ýz#PostgresqlExtCompiler.get_parse_map)F)	r)   r*   r+   rš   r©   r¯   r²   r³   r,   r   r   r!   r   r˜   #  s
   	r˜   c                       s@   e Zd ZeZ‡ fdd„Zddd„Zddd	„Z‡ fd
d„Z‡  Z	S )ÚPostgresqlExtDatabasec                    s2   |  dd¡| _|  dd¡| _tt| ƒj||Ž d S )NÚserver_side_cursorsFr   T)Úpoprµ   r   r   r´   r    )r   rc   rd   r!   r   r   r    _  s    zPostgresqlExtDatabase.__init__Nc                 C   s    |r|   ¡ j|d�S |   ¡  ¡ S )N©Úname)rY   Úcursor)r   r¸   r   r   r   Ú
get_cursord  s    z PostgresqlExtDatabase.get_cursorTFc                 C   sÈ   t  ||f¡ |p$| jo$| ¡  d¡}|  ¡ �� |rN| jtt 	¡ ƒd�}d}n|  ¡ }z| 
||pdd¡ W n: tk
r¤ } z|  ¡ r’| jr’|  ¡  ‚ W 5 d }~X Y nX |rº|  ¡ rº|  ¡  W 5 Q R X |S )NÚselectr·   Fr   )r   Údebugrµ   ÚlowerÚ
startswithÚexception_wrapperrº   r    ÚuuidÚuuid1Úexecuter‰   Úget_autocommitÚautorollbackÚrollbackÚcommit)r   rm   r¨   Úrequire_commitÚnamed_cursorZuse_named_cursorr¹   Úexcr   r   r   Úexecute_sqli  s&    þ
z!PostgresqlExtDatabase.execute_sqlc                    s*   t t| ƒj|f|Ž}| jr&t|dd� |S )NT)Zglobally)r   r´   Ú_connectr   )r   rX   rd   r\   r!   r   r   rË   €  s    zPostgresqlExtDatabase._connect)N)NTF)
r)   r*   r+   r˜   Úcompiler_classr    rº   rÊ   rË   r,   r   r   r!   r   r´   \  s   
  ÿ
r´   c                   @   s    e Zd Zedd„ ƒZdd„ ZdS )ÚServerSideSelectQueryc                 C   s   t |jƒ}| |¡S r   )rÍ   rV   Ú_clone_attributes)rN   r•   r   r   r   r   Úclone_from_queryˆ  s    
z&ServerSideSelectQuery.clone_from_queryc                 C   s    |   ¡ \}}| jj||ddd�S )NFT)rÇ   rÈ   )rm   rX   rÊ   )r   rm   r¨   r   r   r   Ú_execute�  s       ÿzServerSideSelectQuery._executeN)r)   r*   r+   rQ   rÏ   rÐ   r   r   r   r   rÍ   ‡  s   
rÍ   ztimestamp with time zoneZhstorerˆ   r�   r’   )rt   rv   rˆ   r�   r’   z@>z?&ú?z?|rª   z||z&&z@@z<@c              	   c   sF   t  | ¡}|j ¡ �( | ¡ }|| _| ¡ D ]
}|V  q,W 5 Q R X d S r   )rÍ   rÏ   rX   ÚtransactionrÂ   Ú_qrÚiterator)Úselect_queryr   Zquery_resultÚobjr   r   r   Ú
ServerSide¬  s    
r×   ÚLEFTTc                 C   s   t | td| ƒ|td|ƒƒS )Nz%s JOIN LATERALzON %s)r(   r   )ÚlhsÚrhsÚ	join_typeZ	conditionr   r   r   ÚLateralJoin»  s    
ürÜ   )rØ   T)EÚ__doc__rÀ   Úpeeweer   r   r   r   r   r   r	   r
   r   r   Zpsycopg2cffir   ÚregisterÚImportErrorZpsycopg2.extensionsr   r   r   Zpsycopg2.extrasr   r   r¬   r   r   r-   r=   rC   rE   ÚobjectrR   r]   r^   ÚFieldre   ÚDateTimeFieldrs   ru   r‡   rŒ   Ú	TextFieldr‘   r—   r€   r˜   ÚPostgresqlDatabaser´   rÍ   Úregister_fieldsÚregister_opsr‚   r„   r…   r†   rw   r~   ro   rq   r“   r3   r�   r7   r;   r4   r   r×   rÜ   r   r   r   r   Ú<module>   sÐ   



 )ñ9+û               ñ