U
     WhzM                 K   @   s  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Zd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZzd dlmZ W n  ek
r   d dlmZ Y nX zd d	lmZ  W nB ek
rL   zd d	l!mZ  W n ek
rF   dZ Y nX Y nX zd dl"Z"W n ek
rt   e Z"Y nX e re j#e"j#kre Z"zd d
l$m%Z% e%&  W n ek
r   Y nX zDd dl'Z'd dl'm(Z) zd dl'm*Z+ W n ek
r   dZ+Y nX W n ek
r    d Z'Z+Y nX zd dl,m-Z. e.  W n e/k
rN   Y nX zd dl0m*Z1 W n ek
rz   dZ1Y nX dZ2zd dl3Z4W nB ek
r   zd dl5Z4dZ2W n ek
r   dZ4Y nX Y nX dZ6dddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[gKZ7zd d\lm8Z8 W n( ek
r   G d]d^ d^ej9Z8Y nX e:d_Z;e;<e8  ej=d  d`kre>Z?e@ZAeBZCejDZDeEZFeGeHeIeJfZKeLda dbdc ZMnd dlNZNzd ddlmOZO W n" ek
r<   d ddlmOZO Y nX d delmPZP dfdg ZFe@Z?eQZAeRZCe@ZSeTZUeGeHeIeJeVfZKeWeNdhZMejXZDd!didjZYej=dkk rejjZZZejj[Z[ndldm ZZdndo Z[e"r@e"\ej]e@ e"\ej^e@ e"\eje@ ej=dkkr8dpdq Z_drds Z`dtdu Zae"\eje_ e"bdve` e"bdwea e"j#ZcndxZceJdyZddzZed{d|d}d~dddyZfef Zgdegd< degd< dd Zhdd Zidd ZjG dd dekZlem ZnelddddddddddddddddddddddddddddZoelejpejqejrejsejtejuejvddg ddg ddg ddg dZwelddddddddddddddddddddZxelddddddddddō	Zyeldd`ddddʍZzeldd`dˍZ{dZ|d`Z}dZ~dZdZd ZdZd`ZedΡZedϡZdZemfdd҄ZddԄ Zddք Zddg Zddل Zddۄ Zdd݄ Zdd  ZG dd demZG ddL dLemZG dd& d&eZG dd demZG dd demZG dd deddZdd ZG dd# d#emZdd Zdd ZG dd demZG dd demZG dd demZG dd demZG dd deZG dd deZG dd demZd d ZeyjdfddZG dd deZG dd demZG ddS dSeeZG d	d
 d
eZG ddZ dZeeZG dd deeZG dd deZG dd! d!eZG dd deZG dd demZG dd demZG dd deZG dd deZG dd deZG dd demZG dd  d eeZG d!dY dYeZG d"d# d#eZd$d ZG d%d deZG d&d' d'eZd"d(d)Zd#d*d+ZG d,d- d-eZG d.d/ d/eZG d0d1 d1eZG d2dQ dQeZd$d3dZG d4d5 d5eZeddZG d6d[ d[eZG d7d8 d8eZG d9d: d:eZG d;d deZG d<d= d=eZG d>d? d?eZȐd@dA ZɐdBdC ZG dDdE dEeZG dFdG dGeZed1ZG dHd0 d0eZΐdIdg ZG dJdM dMeZАdKdL ZG dMdN dNeZҐdOdP ZG dQdR dReZG dSdT dTeԃZG dUdV dVeԃZ֐d%dWdXZG dYdZ dZeփZG d[d\ d\eee؃ZG d]d^ d^eكZG d_dP dPeكZG d`da daeփZG dbdc dce܃ZG ddde dee܃ZG dfdg dge܃ZG dhd9 d9eZG didB dBeZd&dkdlZG dmdn dne/ZG dod8 d8eZG dpd% d%eZG dqd' d'eZG drd; d;eZG dsd< d<eZG dtd= d=eZG dudD dDeZG dvdF dFeZG dwdK dKeZG dxdy dyemZeeeeeeeeeeeedzZeeZed{d|Zed}d~ZeddZeddZG dd demZG dd deejZG dd demZG dd demZG dd$ d$eZdd ZG ddR dReZG ddG dGeZG ddC dCeZG dd demZG dd demZG dd demZ G dd demZG dd demZG dd deZG dd deZG dd deZG dd demZG dd demZG dd deZG dd demZ	G dd demZ
G dd2 d2eZG dd deZG dd: d:eZG dd deZG ddO dOeZG dd deZG dd deZG dd7 d7eZG ddH dHeZG dd4 d4eZG dd/ d/eZG dd* d*eZG dd deZG dd deZG dd3 d3eZG ddT dTeZG dd deZG dd deeZG dd demZG dd deZG dd deZG ddX dXeZ G dd deZ!dŐdƄ Z"d'dǐdȄZ#dɐdʄ Z$G dːd̄ d̐eZ%G dd) d)e%Z&G dd( d(e%Z'G ddU dUe%Z(dАdф Z)G ddV dVeZ*G dd> d>eZ+G dd deZ,G dd deZ-G dd6 d6eZ.G dd+ d+eZ/G dd, d,emZ0G dِdڄ dڐeZ1G dېd܄ dܐeZ2G dd@ d@e1Z3G dސd߄ dߐe1Z4G dd" d"e1Z5G dd demZ6G ddN dNemZ7G dd demZ8G dd de8Z9G dd. d.e/Z:G dd de;Z<G dd demZ=G ddA dAee<eZ>G dd deZ?G dd deZ@dd ZAG dd demZBG dd deBeՃZCG dd deBZDG dd deDeڃZEdd ZFG dd deDeۃZGG d d deGZHG dd deBZIG dd deIe݃ZJG dd deIeރZKG dd	 d	eIe߃ZLG d
d deGZMdd ZNG dd deZOG dd deOZPG dd dePZQG dd deQZRG dd dePZSG dd deOZTG dd deddZUdd ZVd dI ZWdS ((      )bisect_left)bisect_rightcontextmanager)deepcopywraps)isclassN)Mapping)dbapi2)compat)
extensions)errors)register_uuidFTz3.18.1AnyFieldAsIs	AutoField	BareFieldBigAutoFieldBigBitFieldBigIntegerFieldBinaryUUIDFieldBitField	BlobFieldBooleanFieldCaseCast	CharFieldCheckchunkedColumnCompositeKeyContextDatabaseDatabaseErrorDatabaseProxy	DataError	DateFieldDateTimeFieldDecimalFieldDeferredForeignKeyDeferredThroughModel
DJANGO_MAPDoesNotExistDoubleFieldDQEXCLUDEDFieldFixedCharField
FloatFieldfnForeignKeyFieldIdentityFieldImproperlyConfiguredIndexIntegerFieldIntegrityErrorInterfaceErrorInternalErrorIPFieldJOINManyToManyFieldModel
ModelIndexMySQLDatabaseNotSupportedErrorOPOperationalErrorPostgresqlDatabasePrimaryKeyFieldprefetchPREFETCH_TYPEProgrammingErrorProxyQualifiedNamesSchemaManagerSmallIntegerFieldSelectSQLSqliteDatabaseTable	TextField	TimeFieldTimestampFieldTuple	UUIDFieldValue
ValuesListWindow)NullHandlerc                   @   s   e Zd Zdd ZdS )r[   c                 C   s   d S N )selfrecordr]   r]   H/var/www/html/arya_register/venvv2/lib/python3.8/site-packages/peewee.pyemit   s    zNullHandler.emitN)__name__
__module____qualname__ra   r]   r]   r]   r`   r[      s   r[   peewee   z4def reraise(tp, value, tb=None): raise tp, value, tbc                 C   s   t j|  t jd d S )N
)sysstdoutwritesr]   r]   r`   print_   s    rm   )Callable)reducec                 C   s
   t | tS r\   )
isinstancern   )cr]   r]   r`   <lambda>       rr   printc                 C   s   |j |k	r|||d S r\   )__traceback__with_traceback)tpvaluetbr]   r]   r`   reraise   s    

rz   )      c                 C   s   t j j| t jjdjd dS )N)tztzinfo)datetimefromtimestamptimezoneutcreplace)tsr]   r]   r`   utcfromtimestamp   s     r   c                   C   s   t j t jjjd dS )Nr~   )r   nowr   r   r   r]   r]   r]   r`   utcnow   s
    r   c                 C   s
   |  dS N )	isoformatdr]   r]   r`   datetime_adapter   rs   r   c                 C   s   t jtt| d S )N   -)r   datemapintsplitr   r]   r]   r`   convert_date   rs   r   c              	   C   s   |  d\}}tt| d\}}}| d}tt|d  d\}}}	t|dkrltd|d  }
nd}
t||||||	|
S )	N    r      .r      :rf   z{:0<6.6}   )r   r   r   lenformatdecoder   )tr   timeymr   Zt_fullhourminutesecondZusecr]   r]   r`   convert_timestamp   s    
r   r   	timestampr   r   r   )yearmonthdayr   r   r   )%Y-%m-%d %H:%M:%S%Y-%m-%d %H:%M:%S.%f%Y-%m-%d%H:%M:%S%H:%M:%S.%f%H:%Mz%Y-01-01 00:00:00z%Y-%m-01 00:00:00z%Y-%m-%d 00:00:00z%Y-%m-%d %H:00:00z%Y-%m-%d %H:%M:00r   z%Y-%m-%d %H:%i:00r   z%Y-%m-%d %H:%i:%Sr   c                 C   s(   | t kst|sd S t|t}t|| S r\   )__date_parts__AssertionErrorformat_date_time__sqlite_datetime_formats__getattrZlookup_typeZdatetime_stringdtr]   r]   r`   _sqlite_date_part	  s
    
r   c                 C   s,   | t kst|sd S t|t}|t |  S r\   )__sqlite_date_trunc__r   r   r   strftimer   r]   r]   r`   _sqlite_date_trunc  s
    
r   c                 C   s   t | t d S r\   )warningswarnDeprecationWarningrk   r]   r]   r`   __deprecated__  s    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
attrdictc                 C   s,   z
| | W S  t k
r&   t|Y nX d S r\   )KeyErrorAttributeErrorr^   attrr]   r]   r`   __getattr__  s    
zattrdict.__getattr__c                 C   s   || |< d S r\   r]   r^   r   rx   r]   r]   r`   __setattr__"  rs   zattrdict.__setattr__c                 C   s   |  | | S r\   updater^   rhsr]   r]   r`   __iadd__#  s   
 zattrdict.__iadd__c                 C   s   t | }|| |S r\   )r   r   )r^   r   r   r]   r]   r`   __add__$  s    
 zattrdict.__add__N)rb   rc   rd   r   r   r   r   r]   r]   r]   r`   r     s   r   ANDOR+-*/&|#%=<z<=>z>=z!=INzNOT INISzIS NOTLIKEILIKEBETWEENREGEXPIREGEXPz||~)r   r   ADDSUBMULDIVBIN_ANDBIN_ORXORZMODEQLTLTEGTGTENEr   NOT_INr   IS_NOTr   r   r   r   r   CONCATZBITWISE_NEGATIONc                 C   s   t | tj|S r\   )
ExpressionrD   r   lrr]   r]   r`   rr   P  rs   c                 C   s   t | tj|S r\   )r   rD   r   r   r]   r]   r`   rr   Q  rs   c                 C   s   t | tj|S r\   )r   rD   r   r   r]   r]   r`   rr   R  rs   c                 C   s   t | tj|S r\   )r   rD   r   r   r]   r]   r`   rr   S  rs   )eqltZltegtZgteneinislikeilikeregexpZINTEGERBIGINTBLOBSMALLINTCHARDATEDATETIMEDECIMAL ZREALTEXTTIMEVARCHAR)AUTOBIGAUTOr   r   BOOLr  r  r  r  DEFAULTDOUBLEFLOATINTr   r  r  UUIDUUIDBr  z
INNER JOINzLEFT OUTER JOINzRIGHT OUTER JOINz	FULL JOINzFULL OUTER JOINz
CROSS JOINzNATURAL JOINLATERALzLEFT JOIN LATERAL)	INNER
LEFT_OUTERRIGHT_OUTERZFULL
FULL_OUTERCROSSZNATURALr  LEFT_LATERALr   r{         )TUPLEDICTNAMED_TUPLECONSTRUCTORMODEL)WHEREr>         z(.)_*([A-Z][a-z]+)z([a-z0-9])_*([A-Z])Z_metaclass_helper_c                 C   s   | t |fi S r\   )
MODEL_BASE)metabaser]   r]   r`   with_metaclass  s    r&  c                 C   s   |   }|r|| |S r\   )copyr   )source	overridesZmergedr]   r]   r`   
merge_dict  s    
r*  c                    s2   t | dkr| d  S d fdd| D S )Nr   r   .c                    s   g | ]}|  qS r]   join.0partquote_charsr]   r`   
<listcomp>  s     zquote.<locals>.<listcomp>)r   r-  )pathr2  r]   r1  r`   quote  s    r5  c                 C   s   t | ot| tS r\   )r	   
issubclassr@   )or]   r]   r`   rr     rs   c                 C   s$   | d k	r t | ttfr| S | fS d S r\   )rp   listtuplerx   r]   r]   r`   ensure_tuple  s    r;  c                 C   s"   | d k	rt | tr| S t| S d S r\   )rp   NodeEntityr:  r]   r]   r`   ensure_entity  s    r>  c                 C   s   t d| }td| S )Nz\1_\2)SNAKE_CASE_STEP1subSNAKE_CASE_STEP2lower)rl   firstr]   r]   r`   make_snake_case  s    rD  c                 c   sT   t  }dd tt| g| d|iD D ]&}|d |krH|||d = |V  q(d S )Nc                 s   s   | ]}t |V  qd S r\   )r8  )r/  gr]   r]   r`   	<genexpr>  s     zchunked.<locals>.<genexpr>	fillvalue)objectizip_longestiterindex)itnZmarkergroupr]   r]   r`   r     s    c                   @   s   e Zd Zdd ZdS )_callable_context_managerc                    s   t   fdd}|S )Nc               
      s&     | |W  5 Q R  S Q R X d S r\   r]   argskwargsr4   r^   r]   r`   inner  s    z1_callable_context_manager.__call__.<locals>.innerr   r^   r4   rU  r]   rT  r`   __call__  s    z"_callable_context_manager.__call__N)rb   rc   rd   rW  r]   r]   r]   r`   rP    s   rP  c                       s\   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZedZ	edZ
dd Z fddZ  ZS )rK   z;
    Create a proxy or placeholder for another object.
    obj
_callbacksc                 C   s   g | _ | d  d S r\   )rZ  
initializer^   r]   r]   r`   __init__  s    zProxy.__init__c                 C   s   || _ | jD ]}|| qd S r\   rX  )r^   rY  callbackr]   r]   r`   r[    s    
zProxy.initializec                 C   s   | j | |S r\   )rZ  append)r^   r^  r]   r]   r`   attach_callback  s    zProxy.attach_callbackc                    s    fdd}|S )Nc                    s$   | j d krtdt| j  ||S NzCannot use uninitialized Proxy.rY  r   r   r^   rR  rS  methodr]   r`   rU    s    
z Proxy.passthrough.<locals>.innerr]   re  rU  r]   rd  r`   passthrough  s    zProxy.passthrough	__enter____exit__c                 C   s   | j d krtdt| j |S ra  rb  r   r]   r]   r`   r     s    
zProxy.__getattr__c                    s$   || j krtdtt| ||S )NzCannot set attribute on proxy.)	__slots__r   superrK   r   r   	__class__r]   r`   r     s    
zProxy.__setattr__)rb   rc   rd   __doc__rj  r]  r[  r`  rg  rh  ri  r   r   __classcell__r]   r]   rl  r`   rK     s   c                   @   sH   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	e
dd ZdS )r%   zL
    Proxy implementation specifically for proxying `Database` objects.
    )rY  rZ  _Modelc                 C   s   t | S r\   ConnectionContextr\  r]   r]   r`   connection_context  s    z DatabaseProxy.connection_contextc                 O   s   t | f||S r\   _atomicrc  r]   r]   r`   atomic  s    zDatabaseProxy.atomicc                 C   s   t | S r\   _manualr\  r]   r]   r`   manual_commit  s    zDatabaseProxy.manual_commitc                 O   s   t | f||S r\   _transactionrc  r]   r]   r`   transaction  s    zDatabaseProxy.transactionc                 C   s   t | S r\   
_savepointr\  r]   r]   r`   	savepoint  s    zDatabaseProxy.savepointc                    s6   t  ds0G  fddd}tdtfd|i _ jS )Nrp  c                       s   e Zd Z ZdS )z!DatabaseProxy.Model.<locals>.MetaNrb   rc   rd   databaser]   r\  r]   r`   Meta  s    r  	BaseModelhasattrtyper@   rp  r^   r  r]   r\  r`   r@     s    
zDatabaseProxy.ModelN)rb   rc   rd   rn  rj  rs  rv  ry  r|  r  propertyr@   r]   r]   r]   r`   r%     s   c                   @   s   e Zd ZdS )ModelDescriptorNrb   rc   rd   r]   r]   r]   r`   r    s    r  c                   @   sV   e Zd ZdZdd Zedd Zdd Zdd	d
Zdd Z	dd Z
dd Zdd ZdS )AliasManager)_counter_current_index_mappingc                 C   s   d| _ d| _g | _|   d S Nr   )r  r  r  pushr\  r]   r]   r`   r]    s    zAliasManager.__init__c                 C   s   | j | jd  S Nr   )r  r  r\  r]   r]   r`   mapping  s    zAliasManager.mappingc                 C   s0   || j kr&|  jd7  _d| j | |< | j | S )Nr   zt%d)r  r  r^   r(  r]   r]   r`   add  s    
zAliasManager.addFc                 C   sB   |r8t t| jD ]$}|| j| kr| j| |   S q| |S r\   )reversedranger  r  r  )r^   r(  Z	any_depthidxr]   r]   r`   get%  s
    zAliasManager.getc                 C   s
   |  |S r\   )r  r  r]   r]   r`   __getitem__,  s    zAliasManager.__getitem__c                 C   s   || j |< d S r\   )r  )r^   r(  aliasr]   r]   r`   __setitem__/  s    zAliasManager.__setitem__c                 C   s.   |  j d7  _ | j t| jkr*| ji  d S r  )r  r   r  r_  r\  r]   r]   r`   r  2  s    zAliasManager.pushc                 C   s$   | j dkrtd|  j d8  _ d S )Nr   z&Cannot pop() from empty alias manager.)r  
ValueErrorr\  r]   r]   r`   pop7  s    
zAliasManager.popN)F)rb   rc   rd   rj  r]  r  r  r  r  r  r  r  r  r]   r]   r]   r`   r    s   

r  c                       s4   e Zd Zedf fdd	Zd	ddZdd Z  ZS )
StateFc                    s   t t| | |||S r\   )rk  r  __new__)clsscopeparenthesesrS  rl  r]   r`   r  ?  s    zState.__new__Nc                 K   sP   |d kr| j n|}|r2| jr2| j }|| n|r<|}n| j}t||f|S r\   )r  settingsr'  r   r  )r^   r  r  rS  r  r]   r]   r`   rW  B  s    

zState.__call__c                 C   s   | j |S r\   )r  r  )r^   	attr_namer]   r]   r`   r   P  s    zState.__getattr__)NN)rb   rc   rd   SCOPE_NORMALr  rW  r   ro  r]   r]   rl  r`   r  =  s   
r  _State)r  r  r  c                    s   t  fdd}|S )Nc              	   ;   s(   | f d i| | V  W 5 Q R X d S Nr  r]   r^   rS  r  r]   r`   rU  U  s    z __scope_context__.<locals>.innerr   )r  rU  r]   r  r`   __scope_context__T  s    r  c                   @   s   e Zd ZdZdd Zdd Zdd Zedd	 Zed
d Z	edd Z
dd ZeeZeeZeeZeeZeeZdd Zdd Zedd Zdd Zdd Zd$ddZdd Zd d! Zd"d# Z dS )%r"   )stack_sql_valuesalias_managerstatec                 K   s*   g | _ g | _g | _t | _tf || _d S r\   )r  r  r  r  r  r  r  )r^   r  r]   r]   r`   r]  _  s
    zContext.__init__c                 C   s   t f | jjS r\   )r"   r  r  r\  r]   r]   r`   as_newf  s    zContext.as_newc                 C   s   |d  | S r  get_sort_keyr^   itemr]   r]   r`   column_sort_keyi  s    zContext.column_sort_keyc                 C   s   | j jS r\   )r  r  r\  r]   r]   r`   r  l  s    zContext.scopec                 C   s   | j jS r\   )r  r  r\  r]   r]   r`   r  p  s    zContext.parenthesesc                 C   s   | j jS r\   )r  subqueryr\  r]   r]   r`   r  t  s    zContext.subqueryc                 K   s:   |r| d| jkr|d= | j| j | jf || _| S r  )r  r  r  r_  r  )r^   r)  r]   r]   r`   rW  x  s
    zContext.__call__c                 C   s   | j r| d | S )N()r  literalr\  r]   r]   r`   rh    s    
zContext.__enter__c                 C   s    | j r| d | j | _d S )N))r  r  r  r  r  r^   exc_typeexc_valexc_tbr]   r]   r`   ri    s    
zContext.__exit__c                 c   s   | j   d V  | j   d S r\   )r  r  r  r\  r]   r]   r`   
push_alias  s    
zContext.push_aliasc                 C   s@   t |ttfr|| S t|r.|jj| S | t|S d S r\   )	rp   r<  r"   __sql__is_model_metatablesqlrX   r^   rY  r]   r]   r`   r    s
    
zContext.sqlc                 C   s   | j | | S r\   )r  r_  )r^   keywordr]   r]   r`   r    s    zContext.literalNTc              
   C   s   |r||}n|d kr*| j jr*| j |}t|tr^| d d | |W  5 Q R  S Q R X n.t|r|   | |W  5 Q R  S Q R X | j jr| t	|S | j
| |r| | j jpdS | S )N	converter?)r  r  rp   r<  r  r  scope_columnvalue_literalsr  _query_val_transformr  r_  param)r^   rx   r  	add_paramr]   r]   r`   rx     s    


zContext.valuec                 C   s    |j | j  |j| j |S r\   )r  extendr  r^   ctxr]   r]   r`   r    s    zContext.__sql__c                 C   s   |  | S r\   )r  queryr^   noder]   r]   r`   parse  s    zContext.parsec                 C   s   d | j| jfS )Nr  )r-  r  r  r\  r]   r]   r`   r    s    zContext.query)NT)!rb   rc   rd   rj  r]  r  r  r  r  r  r  rW  r  r  scope_normalSCOPE_SOURCEscope_sourceSCOPE_VALUESscope_values	SCOPE_CTE	scope_cteSCOPE_COLUMNr  rh  ri  r   r  r  r  rx   r  r  r  r]   r]   r]   r`   r"   \  s4   




c                 C   sp   t | dd }|d k	r| }nt }||  \}}|s>|S |jjpHd}|dkr^|dd}|tt	t
| S )N	_databaser  %s)r   get_sql_contextr"   r  r  r  r  r   r9  r   r  )r  dbr  r  paramsr  r]   r]   r`   query_to_string  s    
r  c                 C   s   t | ttjtjtjfr"d|  } npt | trdz| d} W n tk
rX   | d} Y nX d|  } n.t | tr|dt|  } n| d krd} nt	| } | S )Nz'%s'utf8raw_unicode_escaper  NULL)
rp   	text_typer   r   r   
bytes_typer   UnicodeDecodeErrorr   str)vr]   r]   r`   r    s     



r  c                   @   sJ   e Zd ZdZdZdd Zdd Zedd Zdd	d
Z	dd Z
dd ZdS )r<  TFc                 C   s   | j | j }| j |_|S r\   )rm  r  __dict__r'  r  r]   r]   r`   clone  s    z
Node.clonec                 C   s   t d S r\   NotImplementedErrorr  r]   r]   r`   r    s    zNode.__sql__c                    s    fdd}|S )Nc                    s   |   } |f|| |S r\   r  )r^   rR  rS  r  rd  r]   r`   rU     s    zNode.copy.<locals>.innerr]   rf  r]   rd  r`   r'    s    z	Node.copyc                 C   s    || j kr|  }||_ |S | S r\   )_coercer  )r^   r  r  r]   r]   r`   coerce  s
    
zNode.coercec                 C   s   dS NFr]   r\  r]   r]   r`   is_alias  s    zNode.is_aliasc                 C   s   | S r\   r]   r\  r]   r]   r`   unwrap  s    zNode.unwrapN)T)rb   rc   rd   r  __isabstractmethod__r  r  staticmethodr'  r  r  r  r]   r]   r]   r`   r<    s   

r<  c                   @   s$   e Zd ZdZdd Zdd ZeZdS )ColumnFactoryr  c                 C   s
   || _ d S r\   r  r  r]   r]   r`   r]    s    zColumnFactory.__init__c                 C   s   t | j|S r\   )r    r  r   r]   r]   r`   r     s    zColumnFactory.__getattr__Nrb   rc   rd   rj  r]  r   r  r]   r]   r]   r`   r    s   r  c                   @   s   e Zd ZdZdddZdS )_DynamicColumnr]   Nc                 C   s   |d k	rt |S | S r\   )r  r^   instanceinstance_typer]   r]   r`   __get__"  s    z_DynamicColumn.__get__)Nrb   rc   rd   rj  r  r]   r]   r]   r`   r    s   r  c                   @   s   e Zd ZdZdddZdS )_ExplicitColumnr]   Nc                 C   s   |d k	rt d| | S )NzM%s specifies columns explicitly, and does not support dynamic column lookups.r   r  r]   r]   r`   r  +  s    z_ExplicitColumn.__get__)Nr  r]   r]   r]   r`   r   (  s   r   c                   @   s   e Zd Zdd Zdd ZdS )Starc                 C   s
   || _ d S r\   )r(  r  r]   r]   r`   r]  4  s    zStar.__init__c                 C   s   | t| jdS )Nz.*)r  rL   r(  r  r  r]   r]   r`   r  6  s    zStar.__sql__Nrb   rc   rd   r]  r  r]   r]   r]   r`   r  3  s   r  c                       s   e Zd Ze Zd fdd	Zejdd Zdd Z	e
dd	 Zejdfd
dZdddZdddZdd Zdd Zdd Z  ZS )SourceNc                    s   t t|   || _d S r\   )rk  r  r]  _aliasr^   r  rl  r]   r`   r]  =  s    zSource.__init__c                 C   s
   || _ d S r\   r  r^   namer]   r]   r`   r  A  s    zSource.aliasc                 G   s   |st df}t| f|S )Nr   )rP   rO   r^   columnsr]   r]   r`   selectE  s    
zSource.selectc                 C   s   t | S r\   )r  r\  r]   r]   r`   __star__J  s    zSource.__star__c                 C   s   t | |||S r\   Join)r^   dest	join_typeonr]   r]   r`   r-  N  s    zSource.joinc                 C   s   t | |tj|S r\   )r  r>   r  r^   r  r  r]   r]   r`   left_outer_joinQ  s    zSource.left_outer_joinFc                 C   s   t || |||dS N)	recursiver  materializedCTEr^   r	  r  r  r  r]   r]   r`   cteT  s    
z
Source.ctec                 C   s   | j r| j fS |j|  fS r\   )r  r  r  r]   r]   r`   r  X  s    zSource.get_sort_keyc                 C   s:   |j tkr6| jr| j|j| < |dt|j|   |S N AS )r  r  r  r  r  r  r=  r  r]   r]   r`   apply_alias]  s
    
zSource.apply_aliasc                 C   s&   | j r| j |j| < |t|j|  S r\   )r  r  r  r=  r  r]   r]   r`   apply_columnf  s    zSource.apply_column)N)N)FNN)rb   rc   rd   r  rq   r]  r<  r'  r  r  r  r  r>   r  r-  r  r  r  r  r  ro  r]   r]   rl  r`   r  :  s   



	r  c                       s   e Zd Z fddZejdd Zdd Zdd Zd	d
 Z	dd Z
dd Zdd ZeejZeejZeejZeejZ  ZS )_HashableSourcec                    s   t t| j|| |   d S r\   )rk  r   r]  _update_hashrc  rl  r]   r`   r]  m  s    z_HashableSource.__init__c                 C   s   || _ |   d S r\   )r  r!  r  r]   r]   r`   r  q  s    z_HashableSource.aliasc                 C   s   |   | _d S r\   )	_get_hash_hashr\  r]   r]   r`   r!  v  s    z_HashableSource._update_hashc                 C   s   t | j| j| jfS r\   )hashrm  _pathr  r\  r]   r]   r`   r"  y  s    z_HashableSource._get_hashc                 C   s   | j S r\   )r#  r\  r]   r]   r`   __hash__|  s    z_HashableSource.__hash__c                 C   s$   t |tr| j|jkS t| tj|S r\   )rp   r   r#  r   rD   r   r^   otherr]   r]   r`   __eq__  s    
z_HashableSource.__eq__c                 C   s$   t |tr| j|jkS t| tj|S r\   )rp   r   r#  r   rD   r   r'  r]   r]   r`   __ne__  s    
z_HashableSource.__ne__c                    s    fdd}|S )Nc                    s   t |  |S r\   r   r   opr]   r`   rU    s    z!_HashableSource._e.<locals>.innerr]   )r-  rU  r]   r,  r`   _e  s    z_HashableSource._e)rb   rc   rd   r]  r<  r'  r  r!  r"  r&  r)  r*  r.  rD   r   __lt__r   __le__r   __gt__r   __ge__ro  r]   r]   rl  r`   r   l  s   



r   c                    s   t   fdd}|S )Nc                    s&    | f||}| j r"|| j S |S r\   )r  bind)r^   rR  rS  resultmethr]   r`   rU    s    z __bind_database__.<locals>.innerr   )r6  rU  r]   r5  r`   __bind_database__  s    r7  c                    s    fdd}|S )Nc                    s    r||  } }t | |dS )N)r  r  r'  invertedr  r]   r`   re    s    
z__join__.<locals>.methodr]   )r  r9  re  r]   r8  r`   __join__  s    r:  c                   @   s   e Zd ZeejZeejZeej	Z
eejZeejZeejddZeejddZeej	ddZeejddZeejddZdS )	BaseTableTr9  N)rb   rc   rd   r:  r>   r  __and__r  r   r  __sub__r  __or__r  __mul____rand____radd____rsub____ror____rmul__r]   r]   r]   r`   r;    s   




r;  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_BoundTableContextc                 C   s   || _ || _d S r\   )r  r  )r^   r  r  r]   r]   r`   r]    s    z_BoundTableContext.__init__c                    s   t   fdd}|S )Nc               
      s0   t jj  | |W  5 Q R  S Q R X d S r\   )rF  r  r  rQ  rT  r]   r`   rU    s    z*_BoundTableContext.__call__.<locals>.innerr   rV  r]   rT  r`   rW    s    z_BoundTableContext.__call__c                 C   s:   | j j| _| j | j | j jd k	r4| j j| j | j S r\   )r  r  _orig_databaser3  r  _modelr\  r]   r]   r`   rh    s
    
z_BoundTableContext.__enter__c                 C   s.   | j | j | j jd k	r*| j j| j d S r\   )r  r3  rG  rH  r  r]   r]   r`   ri    s    z_BoundTableContext.__exit__Nrb   rc   rd   r]  rW  rh  ri  r]   r]   r]   r`   rF    s   rF  c                       s   e Zd Zd fdd	Zdd ZdddZddd	Zd
d Zedd Z	edddZ
edddZedddZedd Zdd Z  ZS )rR   Nc           
         s   || _ || _|| _|| _|r$||fn|f| _|| _|| _tt| j	|d |d k	rvt
 | _|D ]}t| |t| | q^|r| jr| n| j}	t|	|| _nd | _d S Nr  )rb   _columns_primary_key_schemar%  rH  r  rk  rR   r]  r   rq   setattrr    r   primary_key)
r^   r	  r  rP  schemar  rH  r  columnZcol_srcrl  r]   r`   r]    s     zTable.__init__c              	   C   s$   t | j| j| j| j| j| j| jdS )N)r  rP  rQ  r  rH  r  )rR   rb   rL  rM  rN  r  rH  r  r\  r]   r]   r`   r    s    zTable.clonec                 C   s
   || _ | S r\   r  r^   r  r]   r]   r`   r3    s    z
Table.bindc                 C   s
   t | |S r\   )rF  rT  r]   r]   r`   bind_ctx  s    zTable.bind_ctxc                 C   s   t | j| j| j| jfS r\   )r$  rm  r%  r  rH  r\  r]   r]   r`   r"    s    zTable._get_hashc                    s*   |s j r fdd j D }t f|S )Nc                    s   g | ]}t  |qS r]   )r    r/  rR  r\  r]   r`   r3    s     z Table.select.<locals>.<listcomp>)rL  rO   r
  r]   r\  r`   r    s    
zTable.selectc                 K   sR   |rD|d kri n|}| j r| n| j}| D ]\}}||t||< q,t| ||dS Ninsertr  )rL  rq   itemsr   Insert)r^   rY  r  rS  srckeyrx   r]   r]   r`   rY    s    zTable.insertc                 K   s   | j ||ddS )NrX  REPLACErY  on_conflict)r^   rY  r  rS  r]   r]   r`   r     s     zTable.replacec                 K   sP   |rD|d kri n|}|  D ]&\}}| jr.| n| j}||t||< qt| |dS )Nr   )rZ  rL  rq   r   Update)r^   r   rS  r]  rx   r\  r]   r]   r`   r     s    zTable.updatec                 C   s   t | S r\   )Deleter\  r]   r]   r`   delete  s    zTable.deletec                 C   sZ   |j tkr|t| j S | jr,| j|j| < |j tkrL| |t| j S | 	|S d S r\   )
r  r  r  r=  r%  r  r  r  r  r  r  r]   r]   r`   r    s    

zTable.__sql__)NNNNNN)N)N)NN)NN)N)rb   rc   rd   r]  r  r3  rU  r"  r7  r  rY  r   r   rc  r  ro  r]   r]   rl  r`   rR     s(         



c                       s6   e Zd Zejddf fdd	Zdd Zdd Z  ZS )r  Nc                    s.   t t| j|d || _|| _|| _|| _d S rJ  )rk  r  r]  lhsr   r  _on)r^   rd  r   r  r  r  rl  r]   r`   r]  +  s
    zJoin.__init__c                 C   s
   || _ | S r\   )re  )r^   	predicater]   r]   r`   r  2  s    zJoin.onc                 C   s@   | | jd| j  | j | jd k	r<|d | j |S )N %s  ON )r  rd  r  r  r   re  r  r]   r]   r`   r  6  s    
zJoin.__sql__)	rb   rc   rd   r>   r  r]  r  r  ro  r]   r]   rl  r`   r  *  s   r  c                       s<   e Zd Zd
 fdd	Zdd Zejdd Zdd	 Z  Z	S )rY   Nc                    s"   || _ || _tt| j|d d S rJ  )r  rL  rk  rY   r]  )r^   valuesr  r  rl  r]   r`   r]  A  s    zValuesList.__init__c                 C   s   t | jt| j| jfS r\   )r$  rm  idr  r  r\  r]   r]   r`   r"  F  s    zValuesList._get_hashc                 G   s
   || _ d S r\   )rL  )r^   namesr]   r]   r`   r  I  s    zValuesList.columnsc              	   C   s   | j r| j |j| < |jtks&|jtkr||j d& |dtdd | j	D }W 5 Q R X |jtkr|dt
|j|   | jrdd | jD }|t| n|t
|j|   |S )Nr  zVALUES c                 S   s   g | ]}t |qS r]   EnclosedNodeListr/  rowr]   r]   r`   r3  U  s    z&ValuesList.__sql__.<locals>.<listcomp>r  c                 S   s   g | ]}t |qS r]   )r=  r/  rq   r]   r]   r`   r3  [  s     )r  r  r  r  r  r  r  r  CommaNodeListr  r=  rL  rn  )r^   r  entitiesr]   r]   r`   r  M  s$    
zValuesList.__sql__)NN)
rb   rc   rd   r]  r"  r<  r'  r  r  ro  r]   r]   rl  r`   rY   @  s
   
c                       sN   e Zd Zd fdd	Zdd Zdd Zd	d
 ZeZdd ZeZ	dd Z
  ZS )r  FNc                    sP   || _ || _|| _|| _|d k	r.dd |D }|| _d|_tt| j|d d S )Nc                 S   s"   g | ]}t |trt|n|qS r]   rp   
basestringr=  rq  r]   r]   r`   r3  k  s   z CTE.__init__.<locals>.<listcomp>r]   rK  )	r  _query
_recursive_materializedrL  	_cte_listrk  r  r]  )r^   r	  r  r  r  r  rl  r]   r`   r]  d  s    zCTE.__init__c                 G   sT   |st dt| f|| | jj}z|| jj}W n tk
rN   Y nX |S )NzFselect_from() must specify one or more columns from the CTE to select.)	r  rO   with_cter3  rv  r  objectsmodelr   r^   r  r  r]   r]   r`   select_fromq  s    zCTE.select_fromc                 C   s   t | j| jt| jfS r\   )r$  rm  r  rj  rv  r\  r]   r]   r`   r"    s    zCTE._get_hashc                 C   s"   | j  }t| j|| | j| jS r\   rv  r  r  r  rw  rL  r^   r   r  r]   r]   r`   	union_all  s    
zCTE.union_allc                 C   s"   | j  }t| j||B | j| jS r\   r  r  r]   r]   r`   union  s    
z	CTE.unionc              
   C   s   |j tkr|t| jS |  | j|j| < |t| j | jr\|dt	| j |d | j
rx|d n| j
dkr|d |jdd || j W 5 Q R X W 5 Q R X |S )Nr   r  zMATERIALIZED FzNOT MATERIALIZED Trl  )r  r  r  r=  r  r  r  rL  r  rn  rx  r  rv  r  r]   r]   r`   r    s    




 zCTE.__sql__)FNN)rb   rc   rd   r]  r~  r"  r  r   r  r?  r  ro  r]   r]   rl  r`   r  c  s     r  c                   @   s,  e Zd ZdZejd1ddZdd Zdd Zdd	 Z	d
d Z
d2ddZeZd3ddZeZdd Zd4ddZeejZeejZeejZeejZeejZeej ZZeejZ eejddZ!eejddZ"eejddZ#eejdd Z$Z%eejddZ&eejddZ'eejddZ(dd Z)dd Z*eej+Z,eej-Z.eej/Z0eej1Z2eej3Z4eej5Z6eej7Z8eej9Z:eej7Z;eej9Z<eej=Z>eej?Z@eej3ZAeejBZCeejDZEeejFZGd5ddZHdd ZIdd  ZJd!d" ZKd#d$ ZLd%d& ZMd'd( ZNd)d* ZOdZPd+d, ZQd-d. ZRd/d0 ZSdS )6
ColumnBaseNc                 C   s
   || _ d S r\   )
_converter)r^   r  r]   r]   r`   r    s    zColumnBase.converterc                 C   s   |rt | |S | S r\   )Aliasr  r]   r]   r`   r    s    
zColumnBase.aliasc                 C   s   | S r\   r]   r\  r]   r]   r`   unalias  s    zColumnBase.unaliasc                 C   s
   t | |S r\   )BindTo)r^   r  r]   r]   r`   bind_to  s    zColumnBase.bind_toc                 C   s
   t | |S r\   )r   )r^   Zas_typer]   r]   r`   cast  s    zColumnBase.castc                 C   s   t | ||dS N)	collationnulls)Ascr^   r  r  r]   r]   r`   asc  s    zColumnBase.ascc                 C   s   t | ||dS r  )Descr  r]   r]   r`   desc  s    zColumnBase.descc                 C   s   t | S r\   )Negatedr\  r]   r]   r`   
__invert__  s    zColumnBase.__invert__Fc                    s    fdd}|S )z
        Lightweight factory which returns a method that builds an Expression
        consisting of the left-hand and right-hand operands, using `op`.
        c                    s    rt || S t | |S r\   r+  r   invr-  r]   r`   rU    s    zColumnBase._e.<locals>.innerr]   )r-  r  rU  r]   r  r`   r.    s    zColumnBase._eT)r  c                 C   s    |d krt jnt j}t| ||S r\   )rD   r   r   r   r^   r   r-  r]   r]   r`   r)    s    zColumnBase.__eq__c                 C   s    |d krt jnt j}t| ||S r\   )rD   r   r   r   r  r]   r]   r`   r*    s    zColumnBase.__ne__c                 C   s   |r
t jnt j}t| |d S r\   )rD   r   r   r   )r^   is_nullr-  r]   r]   r`   r    s    zColumnBase.is_nullc                 C   st   | ddks*| ddks*| ddkrl|dddddd}tt|| dd	td
tddd	fS || S )N_r   r   \z\\z\_z\%Fr  ESCAPE)findr   NodeListrX   rP   )r^   rl   templater]   r]   r`   _escape_like_expr  s    *
zColumnBase._escape_like_exprc                 C   s>   t |tr$tdtjt|tjd}n| |d}t| tj|S )Nr   z%%%s%%rp   r<  r   rD   r   r  r   r   r]   r]   r`   contains  s    
zColumnBase.containsc                 C   s4   t |trt|tjd}n| |d}t| tj|S )Nr   z%s%%r  r   r]   r]   r`   
startswith  s    
zColumnBase.startswithc                 C   s4   t |trtdtj|}n| |d}t| tj|S )Nr   z%%%sr  r   r]   r]   r`   endswith  s    
zColumnBase.endswithc                 C   s   t | tjt|td|fS )Nr   )r   rD   r   r  rP   )r^   lohir]   r]   r`   between  s    zColumnBase.betweenc                 C   s   t | tj|S r\   StringExpressionrD   r   r   r]   r]   r`   concat  s    zColumnBase.concatc                 C   s>   t |tr6|jd ks|jd kr&td| |j|jS | |kS )Nz4BETWEEN range must have both a start- and end-point.)rp   slicestartstopr  r  r  r]   r]   r`   r    s
    
zColumnBase.__getitem__c                 C   s   t td| fS )NZDISTINCTr  rP   r\  r]   r]   r`   distinct&  s    zColumnBase.distinctc                 C   s   t | td| fS )N
COLLATE %sr  r^   r  r]   r]   r`   collate)  s    zColumnBase.collatec                 C   s   dS Nr]   r]   r  r]   r]   r`   r  ,  s    zColumnBase.get_sort_key)N)NN)NN)F)T)Trb   rc   rd   r  r<  r'  r  r  r  r  r  r  __pos__r  __neg__r  r.  rD   r   r=  r   r?  r   r   r   r>  r   r@  r   __div____truediv__r   __xor__rB  rC  rE  Z__rdiv____rtruediv__rA  rD  __rxor__r)  r*  r   r/  r   r0  r   r1  r   r2  r   
__lshift__r   
__rshift__r   __mod__r   __pow__r   r   r   bin_andr   bin_orin_r   Znot_inr   r   r   Ziregexpr  r  r  r  r  r  r  r  __iter__r  r  r  r]   r]   r]   r`   r    sr   


























r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r    c                 C   s   || _ || _d S r\   )r(  r	  )r^   r(  r	  r]   r]   r`   r]  1  s    zColumn.__init__c                 C   s*   |j tkr| jfS | j|| jf S d S r\   )r  r  r	  r(  r  r  r]   r]   r`   r  5  s    
zColumn.get_sort_keyc                 C   s   t | j| jfS r\   )r$  r(  r	  r\  r]   r]   r`   r&  ;  s    zColumn.__hash__c              
   C   sX   |j tkr|t| jS | , || jdt| jW  5 Q R  S Q R X d S Nr+  )r  r  r  r=  r	  r  r(  r  r  r]   r]   r`   r  >  s    

zColumn.__sql__N)rb   rc   rd   r]  r  r&  r  r]   r]   r]   r`   r    0  s   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )WrappedNodec                 C   s&   || _ t|dd| _t|dd | _d S )Nr  Tr  )r  r   r  r  r  r]   r]   r`   r]  G  s    zWrappedNode.__init__c                 C   s
   | j  S r\   )r  r  r\  r]   r]   r`   r  L  s    zWrappedNode.is_aliasc                 C   s
   | j  S r\   )r  r  r\  r]   r]   r`   r  O  s    zWrappedNode.unwrapN)rb   rc   rd   r]  r  r  r]   r]   r]   r`   r  F  s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )EntityFactoryr  c                 C   s
   || _ d S r\   r  r  r]   r]   r`   r]  U  s    zEntityFactory.__init__c                 C   s   t | j|S r\   )r=  r  r   r]   r]   r`   r   W  s    zEntityFactory.__getattr__N)rb   rc   rd   rj  r]  r   r]   r]   r]   r`   r  S  s   r  c                   @   s   e Zd ZdZdddZdS )_DynamicEntityr]   Nc                 C   s   |d k	rt |jS | S r\   )r  r  r  r]   r]   r`   r  ]  s    
z_DynamicEntity.__get__)Nr  r]   r]   r]   r`   r  [  s   r  c                       sf   e Zd Ze Z fddZdd Zedd Zej	dd Zdd	d
Z
dd Zdd Zdd Z  ZS )r  c                    s   t t| | || _d S r\   )rk  r  r]  r  )r^   r  r  rl  r]   r`   r]  f  s    zAlias.__init__c                 C   s
   t | jS r\   )r$  r  r\  r]   r]   r`   r&  j  s    zAlias.__hash__c                 C   s   | j S r\   r  r\  r]   r]   r`   r	  m  s    z
Alias.namec                 C   s
   || _ d S r\   r  r^   rx   r]   r]   r`   r	  p  s    Nc                 C   s   |d kr| j S t| j |S d S r\   )r  r  r  r]   r]   r`   r  t  s    zAlias.aliasc                 C   s   | j S r\   r  r\  r]   r]   r`   r  z  s    zAlias.unaliasc                 C   s   dS NTr]   r\  r]   r]   r`   r  }  s    zAlias.is_aliasc                 C   s<   |j tkr(|| jdt| jS |t| jS d S r  )r  r  r  r  r  r=  r  r  r]   r]   r`   r    s    
zAlias.__sql__)N)rb   rc   rd   r  rq   r]  r&  r  r	  setterr  r  r  r  ro  r]   r]   rl  r`   r  c  s   


r  c                       s$   e Zd Z fddZdd Z  ZS )r  c                    s   t t| | || _d S r\   )rk  r  r]  r  )r^   r  r  rl  r]   r`   r]    s    zBindTo.__init__c                 C   s   | | jS r\   r  r  r  r]   r]   r`   r    s    zBindTo.__sql__rb   rc   rd   r]  r  ro  r]   r]   rl  r`   r    s   r  c                   @   s   e Zd Zdd Zdd ZdS )r  c                 C   s   | j S r\   r  r\  r]   r]   r`   r    s    zNegated.__invert__c                 C   s   | d| jS )NzNOT )r  r  r  r  r]   r]   r`   r    s    zNegated.__sql__Nrb   rc   rd   r  r  r]   r]   r]   r`   r    s   r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
BitwiseMixinc                 C   s
   |  |S r\   )r  r'  r]   r]   r`   r=    s    zBitwiseMixin.__and__c                 C   s
   |  |S r\   )r  r'  r]   r]   r`   r?    s    zBitwiseMixin.__or__c                 C   s   |  | S r\   )r  Zbin_negatedr'  r]   r]   r`   r>    s    zBitwiseMixin.__sub__c                 C   s   t | S r\   )BitwiseNegatedr\  r]   r]   r`   r    s    zBitwiseMixin.__invert__N)rb   rc   rd   r=  r?  r>  r  r]   r]   r]   r`   r    s   r  c                   @   s   e Zd Zdd Zdd ZdS )r  c                 C   s   | j S r\   r  r\  r]   r]   r`   r    s    zBitwiseNegated.__invert__c                 C   s6   |j jr|j j| j| j}n| j}||| jS r\   )r  
operationsr  r-  r  r  r  )r^   r  op_sqlr]   r]   r`   r    s    zBitwiseNegated.__sql__Nr  r]   r]   r]   r`   r    s   r  c                   @   s   e Zd ZdddZdd ZdS )rX   NTc                 C   sf   || _ || _|ot| j t| _| jrbg | _| j D ]0}t|trL| j| q0| jt|| j q0d S r\   )	rx   r  rp   multi_typesmultiri  r<  r_  rX   )r^   rx   r  unpackr  r]   r]   r`   r]    s    

zValue.__init__c                 C   s&   | j r|t| jS || j| jS r\   )r  r  rn  ri  rx   r  r  r]   r]   r`   r    s    zValue.__sql__)NTr  r]   r]   r]   r`   rX     s   
c                   @   s   e Zd Zdd ZdS )ValueLiteralsc              
   C   s.   |dd | | jW  5 Q R  S Q R X d S )NT)r  r  r  r]   r]   r`   r    s    zValueLiterals.__sql__Nrb   rc   rd   r  r]   r]   r]   r`   r    s   r  c                 C   s   t | ddS NFr  )rX   r:  r]   r]   r`   r     s    c                       s$   e Zd Z fddZdd Z  ZS )r   c                    s    t t| | || _d| _d S r  )rk  r   r]  _castr  )r^   r  r  rl  r]   r`   r]    s    zCast.__init__c                 C   s   | d| j d| j S )NzCAST(z AS %s))r  r  r  r  r  r]   r]   r`   r    s    zCast.__sql__r  r]   r]   rl  r`   r     s   c                       s8   e Zd Zd
 fdd	ZdddZdd Zdd	 Z  ZS )OrderingNc                    sB   t t| | || _|| _|| _|r>| dkr>td| d S )N)rC  lastz<Ordering nulls= parameter must be "first" or "last", got: %s)rk  r  r]  	directionr  r  rB  r  )r^   r  r  r  r  rl  r]   r`   r]    s    zOrdering.__init__c                 C   s   t | j| j|S r\   )r  r  r  r  r]   r]   r`   r    s    zOrdering.collatec                 C   sL   |  dkrd\}}n|  dkr,d\}}ntdtd | j |ff|S )Nr  )r   r   rC  )r   r   z&unsupported value for nulls= ordering.)rB  r  r   r  r  )r^   r  ZifnullZnotnullr]   r]   r`   _null_ordering_case  s    

zOrdering._null_ordering_casec                 C   sv   | j r&|jjs&|| | j d || jd| j  | jrT|d| j  | j rr|jjrr|d| j   |S )N,  %sz COLLATE %sz	 NULLS %s)	r  r  nulls_orderingr  r  r  r  r  r  r  r]   r]   r`   r    s    zOrdering.__sql__)NN)N)rb   rc   rd   r]  r  r  r  ro  r]   r]   rl  r`   r    s   	
	r  c                 C   s   t | d||S )NZASCr  r  r  r  r]   r]   r`   r    s    r  c                 C   s   t | d||S )NZDESCr  r  r]   r]   r`   r    s    r  c                   @   s   e Zd ZdddZdd ZdS )r   Fc                 C   s   || _ || _|| _|| _d S r\   )rd  r-  r   flat)r^   rd  r-  r   r  r]   r]   r`   r]    s    zExpression.__init__c              
   C   sL  | j  dd}| j }}t|tr*| }t|trT|jrT|j|d< t|t|d< nd |d< |j	j
rz|j	j
| j| j}n| j}|f | | jtjkp| jtjk}|r| | jd dkr|| jtjkrdndW  5 Q R  S | j}|d kr| jtjks| jtjkrtd	}|| jd
| |W  5 Q R  S Q R X d S )NT)r  in_exprr  
is_fk_exprr   ()z0 = 1z1 = 1r  rg  )r  rd  rp   r  r  r1   r  db_valuer5   r  r  r  r-  rD   r   r   r  r  r   r  r   r   rP   r  )r^   r  r)  r  raw_noder  Zop_inr   r]   r]   r`   r    s2    


&&zExpression.__sql__N)Fr  r]   r]   r]   r`   r     s   
r   c                   @   s   e Zd Zdd Zdd ZdS )r  c                 C   s
   |  |S r\   )r  r   r]   r]   r`   r   8  s    zStringExpression.__add__c                 C   s   t |tj| S r\   r  )r^   rd  r]   r]   r`   rB  :  s    zStringExpression.__radd__N)rb   rc   rd   r   rB  r]   r]   r]   r`   r  7  s   r  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r=  c                 G   s   dd |D | _ d S )Nc                 S   s   g | ]}|r| d dqS )""")r   r.  r]   r]   r`   r3  @  s      z#Entity.__init__.<locals>.<listcomp>)r%  )r^   r4  r]   r]   r`   r]  ?  s    zEntity.__init__c                 C   s   t | j|g  S r\   )r=  r%  r   r]   r]   r`   r   B  s    zEntity.__getattr__c                 C   s
   t | jS r\   )r9  r%  r  r]   r]   r`   r  E  s    zEntity.get_sort_keyc                 C   s   t | jjt| jfS r\   )r$  rm  rb   r9  r%  r\  r]   r]   r`   r&  H  s    zEntity.__hash__c                 C   s   | t| j|jjpdS )Nr  )r  r5  r%  r  r  r]   r]   r`   r  K  s    zEntity.__sql__N)rb   rc   rd   r]  r   r  r&  r  r]   r]   r]   r`   r=  >  s
   r=  c                   @   s   e Zd ZdddZdd ZdS )rP   Nc                 C   s   || _ || _d S r\   r  r  r^   r  r  r]   r]   r`   r]  P  s    zSQL.__init__c                 C   s2   | | j | jr.| jD ]}|j|ddd q|S NF)r  )r  r  r  rx   r^   r  r  r]   r]   r`   r  T  s
    
zSQL.__sql__)Nr  r]   r]   r]   r`   rP   O  s   
c                 C   s*   t d|  }|s|S tt dt||fS )Nz
CHECK (%s)
CONSTRAINT)rP   r  r=  )
constraintr	  checkr]   r]   r`   r   \  s    c                   @   sf   e Zd ZedZdddZdd Zejddd	Z	ejd
d Z
ejdddZdddZdd ZdS )Function)sumcountavgr  Z	array_aggTNc                 C   sB   || _ || _d | _d | _|| _|r8| | jkr8d| _n|| _d S r  )r	  	arguments_filter	_order_by_python_valuerB  no_coerce_functionsr  )r^   r	  r  r  python_valuer]   r]   r`   r]  f  s    zFunction.__init__c                    s    fdd}|S )Nc                     s   t  | f|S r\   )r  rQ  r   r]   r`   	decoratorr  s    z'Function.__getattr__.<locals>.decoratorr]   )r^   r   r  r]   r  r`   r   q  s    zFunction.__getattr__c                 C   s
   || _ d S r\   )r  )r^   wherer]   r]   r`   filterv  s    zFunction.filterc                 G   s
   || _ d S r\   r  )r^   orderingr]   r]   r`   order_byz  s    zFunction.order_byc                 C   s
   || _ d S r\   )r  )r^   funcr]   r]   r`   r  ~  s    zFunction.python_valuec           	   	   C   sP   t |tr|d kr|}|d k	r(t|}nt||||||dd}t| td|fS )NT)partition_byr  r  end
frame_typeexclude_inlineZOVER)rp   rZ   WindowAliasr  rP   )	r^   r  r  r  r  r  windowr  r  r]   r]   r`   over  s    
   zFunction.overc              	   C   s   | | j t| js"| d nj| j}| jrVt|}t|d tdt| jf|d< |dt| jd |	t
dd |D  W 5 Q R X | jr| d	| j d	 |S )
Nr  rH  ORDER BYT)in_functionfunction_arg_countc                 S   s$   g | ]}t |tr|nt|d qS F)rp   r<  rX   )r/  argr]   r]   r`   r3    s   z$Function.__sql__.<locals>.<listcomp>z FILTER (WHERE r  )r  r	  r   r  r  r8  r  rP   rr  r  rn  r  )r^   r  rR  r]   r]   r`   r    s     

zFunction.__sql__)TN)N)N)NNNNNNN)rb   rc   rd   setr  r]  r   r<  r'  r  r  r  r  r  r]   r]   r]   r`   r  c  s   

      
r  c                	       s   e Zd ZedZedZedZedZdZdZ	dZ
d fd
d	ZdddZejdd Zejdd Zejdd Zejd ddZejd!ddZed"ddZed#ddZdd Z  ZS )$rZ   zCURRENT ROWGROUPTIESz	NO OTHERSGROUPSRANGEROWSNFc
           
         s   t t|   |d k	r(t|ts(t|}|d k	rBt|tsBt|}t|| _t|| _|| _|| _	| jd kr~| j	d k	r~t
d|pd| _|	| _|| _|| _|| _d S )Nz(Cannot specify WINDOW end without start.w)rk  rZ   r]  rp   rP   r;  r  r  r  r  r  r  r  r  _extends_exclude)
r^   r  r  r  r  r  extendsr  r  r  rl  r]   r`   r]    s     


zWindow.__init__c                 C   s   |pd| _ | S Nr  r  r  r]   r]   r`   r    s    
zWindow.aliasc                 C   s   t j| _d S r\   )rZ   r  r  r\  r]   r]   r`   as_range  s    zWindow.as_rangec                 C   s   t j| _d S r\   )rZ   r  r  r\  r]   r]   r`   as_rows  s    zWindow.as_rowsc                 C   s   t j| _d S r\   )rZ   r  r  r\  r]   r]   r`   	as_groups  s    zWindow.as_groupsc                 C   s
   || _ d S r\   )r  r^   r  r]   r]   r`   r    s    zWindow.extendsc                 C   s   t |trt|}|| _d S r\   )rp   ru  rP   r  )r^   Zframe_exclusionr]   r]   r`   r    s    
zWindow.excludec                 C   s   | d krt dS t d|  S )NzUNBOUNDED FOLLOWINGz%d FOLLOWINGrP   r:  r]   r]   r`   	following  s    zWindow.followingc                 C   s   | d krt dS t d|  S )NzUNBOUNDED PRECEDINGz%d PRECEDINGr  r:  r]   r]   r`   	preceding  s    zWindow.precedingc              	   C   s~  |j tkr&| js&|| j |d |ddB g }| jd k	rz| j}t|tr^t|j}nt|t	rpt|}|
| | jr|tdt| jf | jr|tdt| jf | jd k	r| jd k	r| jpd}|td| | jtd| jf nJ| jd k	r"|t| jpd| jf n | jd k	rB|
td	| j  | jd k	rb|td
| jf |t| W 5 Q R X |S )Nr  Trl  zPARTITION BYr	  r  z
%s BETWEENr   z%s UNBOUNDED PRECEDINGZEXCLUDE)r  r  r  r  r  r  rp   rZ   rP   ru  r_  r  r  rr  r  r  r  r  r  r  r  )r^   r  partsextframer]   r]   r`   r    sL    






zWindow.__sql__)	NNNNNNNNF)N)N)N)N)N)rb   rc   rd   rP   ZCURRENT_ROWr  r  Z	NO_OTHERSr  r  r  r]  r  r<  r'  r  r  r  r  r  r  r  r  r  ro  r]   r]   rl  r`   rZ     s<            



c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r  c                 C   s
   || _ d S r\   )r  r  r]   r]   r`   r]    s    zWindowAlias.__init__c                 C   s   || j _| S r\   )r  r  )r^   Zwindow_aliasr]   r]   r`   r    s    zWindowAlias.aliasc                 C   s   | | jjpdS r  )r  r  r  r  r]   r]   r`   r  "  s    zWindowAlias.__sql__N)rb   rc   rd   r]  r  r  r]   r]   r]   r`   r    s   r  c                   @   s   e Zd ZdddZdd ZdS )_InFunctionTc                 C   s   || _ || _d S r\   )r  r
  )r^   r  r
  r]   r]   r`   r]  '  s    z_InFunction.__init__c              
   C   s0   || j d || jW  5 Q R  S Q R X d S )Nr
  )r
  r  r  r  r]   r]   r`   r  +  s    z_InFunction.__sql__N)Tr  r]   r]   r]   r`   r#  &  s   
r#  c                   @   s   e Zd ZdddZdd ZdS )r   Nc                 C   s   || _ || _|| _d S r\   )rf  expression_tuplesdefault)r^   rf  r%  r&  r]   r]   r`   r]  1  s    zCase.__init__c              
   C   s   t dg}| jd k	r || j | jD ]&\}}|t d|t dt|f q&| jd k	rp|t dt| jf |t d |dd |t|W  5 Q R  S Q R X d S )NZCASEZWHENZTHENELSEENDFr$  )	rP   rf  r_  r%  r  r#  r&  r  r  )r^   r  Zclausesexprrx   r]   r]   r`   r  6  s    

 
zCase.__sql__)Nr  r]   r]   r]   r`   r   0  s   
c                   @   s   e Zd ZdddZdd ZdS )	ForUpdateNc                 C   sb   |dkrdn|}|  dr.|d d }d}|| _|d k	rRt|tttfsR|f}|| _|| _d S )NTz
FOR UPDATEnowaiti)	rB  r  _exprrp   r8  r  r9  _of_nowait)r^   r)  ofr+  r]   r]   r`   r]  E  s    zForUpdate.__init__c                 C   s@   | | j | jd k	r,| dt| j | jr<| d |S )Nz OF z NOWAIT)r  r,  r-  r  rr  r.  r  r]   r]   r`   r  Q  s    

zForUpdate.__sql__)NNr  r]   r]   r]   r`   r*  D  s   
r*  c                   @   s   e Zd ZdddZdd ZdS )	r  r   Fc                 C   sb   || _ || _|| _|r^t| j dkr^t| j d tr^| j d js^| j d  f| _ d| j d _d S )Nr   r   T)nodesglueparensr   rp   r   r  r  )r^   r0  r1  r2  r]   r]   r`   r]  [  s    
zNodeList.__init__c              	   C   s   t | j}|dkr&| jr"|dS |S || jdH t|d D ] }|| j|  || j q@|| j|d   W 5 Q R X |S )Nr   r  rl  r   )r   r0  r2  r  r  r  r1  )r^   r  Zn_nodesir]   r]   r`   r  f  s    
zNodeList.__sql__N)r   Fr  r]   r]   r]   r`   r  Z  s   
r  c                 C   s
   t | dS )Nr  r  r0  r]   r]   r`   rr  r  s    rr  c                 C   s   t | ddS )Nr  Tr4  r5  r]   r]   r`   rn  v  s    rn  c                   @   s$   e Zd ZdZdd Zdd ZeZdS )
_Namespace_namec                 C   s
   || _ d S r\   r7  r  r]   r]   r`   r]  |  s    z_Namespace.__init__c                 C   s
   t | |S r\   )NamespaceAttributer   r]   r]   r`   r   ~  s    z_Namespace.__getattr__Nr  r]   r]   r]   r`   r6  z  s   r6  c                   @   s   e Zd Zdd Zdd ZdS )r9  c                 C   s   || _ || _d S r\   )
_namespace
_attribute)r^   	namespace	attributer]   r]   r`   r]    s    zNamespaceAttribute.__init__c                 C   s   | | jjd t| jS r  )r  r:  r8  r  r=  r;  r  r]   r]   r`   r    s
    
zNamespaceAttribute.__sql__Nr  r]   r]   r]   r`   r9    s   r9  c                       s2   e Zd Z fddZejdd Zdd Z  ZS )r/   c                    s   t t|   || _d| _d S r  )rk  r/   r]  r  _negatedr^   r  rl  r]   r`   r]    s    zDQ.__init__c                 C   s   | j  | _ d S r\   )r>  r\  r]   r]   r`   r    s    zDQ.__invert__c                 C   s   t f | j}| j|_|S r\   )r/   r  r>  r  r]   r]   r`   r    s    zDQ.clone)	rb   rc   rd   r]  r<  r'  r  r  ro  r]   r]   rl  r`   r/     s   
c                  G   s   t | S r\   rm  )ar]   r]   r`   rr     rs   c                   @   s   e Zd Zdd ZdS )rL   c              
   C   s,   |   || jW  5 Q R  S Q R X d S r\   )r  r  r  r  r]   r]   r`   r    s    
zQualifiedNames.__sql__Nr  r]   r]   r]   r`   rL     s   c                 C   s@   t | tr*| t| j| jt| j| jS t | tr<t	| S | S r\   )
rp   r   rm  qualify_namesrd  r-  r   r  r  rL   r  r]   r]   r`   rA    s    
 
rA  c                   @   s|   e Zd ZdddZdd Zdd Zejdd	 Zejdd
dZ	ejdd Z
ejdd Zejdd Zejdd ZdS )
OnConflictNc                 C   sN   || _ || _t|| _|| _|d k	r4|d k	r4tdt|| _|| _|| _d S )NzIonly one of "conflict_target" and "conflict_constraint" may be specified.)	_action_updater;  	_preserve_wherer  _conflict_target_conflict_where_conflict_constraint)r^   actionr   preserver  conflict_targetconflict_whereconflict_constraintr]   r]   r`   r]    s    

zOnConflict.__init__c                 C   s   |j | |S r\   )r  conflict_statementr^   r  r  r]   r]   r`   get_conflict_statement  s    z!OnConflict.get_conflict_statementc                 C   s   |j | |S r\   )r  conflict_updaterP  r]   r]   r`   get_conflict_update  s    zOnConflict.get_conflict_updatec                 G   s
   || _ d S r\   )rE  r
  r]   r]   r`   rK    s    zOnConflict.preservec                 K   s:   |r|rt |tstd|p i }|r0|| || _d S )NzGCannot mix data with keyword arguments in the OnConflict update method.)rp   dictr  r   rD  )r^   _datarS  r]   r]   r`   r     s    
zOnConflict.updatec                 G   s(   | j d k	r| j f| }ttj|| _ d S r\   rF  ro   operatorand_r^   expressionsr]   r]   r`   r    s    
zOnConflict.wherec                 G   s   d | _ || _d S r\   rI  rG  )r^   constraintsr]   r]   r`   rL    s    zOnConflict.conflict_targetc                 G   s(   | j d k	r| j f| }ttj|| _ d S r\   )rH  ro   rW  rX  rY  r]   r]   r`   rM    s    
zOnConflict.conflict_wherec                 C   s   || _ d | _d S r\   r[  )r^   r  r]   r]   r`   rN    s    zOnConflict.conflict_constraint)NNNNNNN)N)rb   rc   rd   r]  rQ  rS  r<  r'  rK  r   r  rL  rM  rN  r]   r]   r]   r`   rB    s&        

	


rB  c                    s   t  d fdd	}|S )Nc                    s6   |d kr| j n|}|s$td j  | |f||S )Nz8Query must be bound to a database in order to call "%s".)r  r;   rb   r^   r  rR  rS  rd  r]   r`   rU    s    z database_required.<locals>.inner)Nr   rf  r]   rd  r`   database_required  s    r^  c                       s   e Zd ZejZd' fdd	Zd(ddZ fddZe	j
d)d	d
Ze	j
d*ddZe	j
d+ddZe	j
d,ddZdd Zdd Zdd Zedd Zdd Zd-ddZdd Zdd  Zd!d" Zd#d$ Zd%d& Z  ZS ).	BaseQueryNc                    s.   || _ d | _d | _d | _tt| jf | d S r\   )r  _cursor_wrapper	_row_type_constructorrk  r_  r]  )r^   r  rS  rl  r]   r`   r]    s
    zBaseQuery.__init__c                 C   s
   || _ | S r\   rS  rT  r]   r]   r`   r3    s    zBaseQuery.bindc                    s   t t|  }d |_|S r\   )rk  r_  r  r`  r?  rl  r]   r`   r    s    zBaseQuery.cloneTc                 C   s   |r
t jnd | _| S r\   )ROWr  ra  )r^   as_dictr]   r]   r`   dicts  s    zBaseQuery.dictsc                 C   s   |r
t jnd | _| S r\   )rc  r  ra  )r^   as_tupler]   r]   r`   tuples  s    zBaseQuery.tuplesc                 C   s   |r
t jnd | _| S r\   )rc  r  ra  )r^   Zas_namedtupler]   r]   r`   namedtuples  s    zBaseQuery.namedtuplesc                 C   s   |r
t jnd | _|| _| S r\   )rc  r  ra  rb  r^   constructorr]   r]   r`   r{    s    zBaseQuery.objectsc                 C   sh   | j p
| j}|tjkrt|S |tjkr0t|S |tjkrBt|S |tj	krXt
|| jS td| d S NzUnrecognized row type: "%s".)ra  default_row_typerc  r  DictCursorWrapperr  CursorWrapperr  NamedTupleCursorWrapperr  ObjectCursorWrapperrb  r  r^   cursorZrow_typer]   r]   r`   _get_cursor_wrapper!  s    



zBaseQuery._get_cursor_wrapperc                 C   s   t d S r\   r  r  r]   r]   r`   r  /  s    zBaseQuery.__sql__c                 C   s"   | j r| j  }nt }|| S r\   )r  r  r"   r  )r^   contextr]   r]   r`   r  2  s    zBaseQuery.sqlc                 C   s
   |  |S r\   )_executerT  r]   r]   r`   execute9  s    zBaseQuery.executec                 C   s   t d S r\   r  rT  r]   r]   r`   ru  =  s    zBaseQuery._executec                 C   s   t | | S r\   )rK  rv  iteratorrT  r]   r]   r`   rw  @  s    zBaseQuery.iteratorc                 C   s$   | j d kr | jstd|   d S )NzQuery has not been executed.)r`  r  r  rv  r\  r]   r]   r`   _ensure_executionC  s    
zBaseQuery._ensure_executionc                 C   s   |    t| jS r\   )rx  rK  r`  r\  r]   r]   r`   r  I  s    zBaseQuery.__iter__c                 C   sR   |    t|tr|j}n|}|d k	r:|dkr6|d nd}| j| | jj| S Nr   r   )rx  rp   r  r  r`  
fill_cache	row_cache)r^   rx   rL  r]   r]   r`   r  M  s    
zBaseQuery.__getitem__c                 C   s   |    t| jS r\   )rx  r   r`  r\  r]   r]   r`   __len__X  s    zBaseQuery.__len__c                 C   s   t | S r\   )r  r\  r]   r]   r`   __str__\  s    zBaseQuery.__str__)N)N)T)T)T)N)N)rb   rc   rd   rc  r  rl  r]  r3  r  r<  r'  re  rg  rh  r{  rs  r  r  r^  rv  ru  rw  rx  r  r  r|  r}  ro  r]   r]   rl  r`   r_    s0   


r_  c                       s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	RawQueryNc                    s"   t t| jf | || _|| _d S r\   )rk  r~  r]  r  _params)r^   r  r  rS  rl  r]   r`   r]  a  s    zRawQuery.__init__c                 C   s0   | | j | jr,| jD ]}|j|dd q|S r  )r  r  r  rx   r  r]   r]   r`   r  f  s
    
zRawQuery.__sql__c                 C   s&   | j d kr || }| || _ | j S r\   r`  rv  rs  r^   r  rr  r]   r]   r`   ru  m  s    

zRawQuery._execute)NN)rb   rc   rd   r]  r  ru  ro  r]   r]   rl  r`   r~  `  s   r~  c                       s   e Zd Zd fdd	Zejdd Zejdd Zejdd	 Zejd
d Z	ejdd Z
ejdddZejdddZejdddZdd Zdd Z  ZS )QueryNc                    s4   t t| jf | || _|| _|| _|| _d | _d S r\   )rk  r  r]  rF  r  _limit_offsetry  )r^   r  r  limitoffsetrS  rl  r]   r`   r]  u  s    zQuery.__init__c                 G   s
   || _ d S r\   )ry  )r^   Zcte_listr]   r]   r`   rz    s    zQuery.with_ctec                 G   s(   | j d k	r| j f| }ttj|| _ d S r\   rV  rY  r]   r]   r`   r    s    
zQuery.wherec                 G   s(   | j d k	r| j f| }ttj|| _ d S r\   )rF  ro   rW  or_rY  r]   r]   r`   orwhere  s    
zQuery.orwherec                 G   s
   || _ d S r\   r  r^   ri  r]   r]   r`   r    s    zQuery.order_byc                 G   s   | j pd| pd | _ d S r  r  r  r]   r]   r`   order_by_extend  s    zQuery.order_by_extendc                 C   s
   || _ d S r\   )r  r  r]   r]   r`   r    s    zQuery.limitc                 C   s
   || _ d S r\   )r  r  r]   r]   r`   r    s    zQuery.offset   c                 C   s$   |dkr|d8 }|| _ || | _d S ry  )r  r  )r^   pageZpaginate_byr]   r]   r`   paginate  s    zQuery.paginatec                 C   s   | j r|dt| j  | jd k	s8| jd k	r`|jjr`| jd krJ|jjn| j}|d| | jd k	r||d| j |S )Nz
 ORDER BY z LIMIT z OFFSET )r  r  r  rr  r  r  r  	limit_max)r^   r  r  r]   r]   r`   _apply_ordering  s    
zQuery._apply_orderingc              	   C   sZ   | j rVtdd | j D }|jdd* ||r4dndt| j d W 5 Q R X |S )Nc                 s   s   | ]}|j V  qd S r\   )rw  )r/  r  r]   r]   r`   rF    s     z Query.__sql__.<locals>.<genexpr>Fr  zWITH RECURSIVE zWITH r   )ry  anyr  r  r  rr  )r^   r  r  r]   r]   r`   r    s    
zQuery.__sql__)NNNN)N)N)r  )rb   rc   rd   r]  r<  r'  rz  r  r  r  r  r  r  r  r  r  ro  r]   r]   rl  r`   r  t  s&   





r  c                    s   t  fdd}|S )Nc                    s    r||  } }t | |S r\   )CompoundSelectQueryr'  r9  	operationr]   r`   re    s    
z#__compound_select__.<locals>.method)r7  )r  r9  re  r]   r  r`   __compound_select__  s    r  c                   @   st   e Zd Zed ZZed ZZed ZZ	ed Z
ZedddZedddZedddZedddZdd Zd	S )
SelectQuery	UNION ALLUNION	INTERSECTEXCEPTTr<  c                 G   s@   |st dt| f|| j}t| dd d k	r<|| j}|S )Nz/select_from() must specify one or more columns.r|  )r  rO   r3  r  r   r{  r|  r}  r]   r]   r`   r~    s    zSelectQuery.select_fromN)rb   rc   rd   r  r  r   r  r?  	intersectr=  except_r>  rB  rD  rA  rC  r~  r]   r]   r]   r`   r    s   r  c                   @   sx   e Zd Zdd Zdd ZedddZeddd	ZedddZedd Z	edddZ
edd Zedd ZdS )
SelectBasec                 C   s   t | j| jpt| fS r\   )r$  rm  r  rj  r\  r]   r]   r`   r"    s    zSelectBase._get_hashc                 C   s&   | j d kr || }| || _ | j S r\   r  r  r]   r]   r`   ru    s    

zSelectBase._executer   c                 C   s.   |  |d | }|r*|dkr&|d S |S d S Nr   r   )rv  )r^   r  rN  rowsr]   r]   r`   peek  s    zSelectBase.peekc                 C   s$   | j |kr|| _ d | _| j||dS )N)rN  )r  r`  r  )r^   r  rN  r]   r]   r`   rC    s    
zSelectBase.firstFc                 C   s4   |r|   |S |  |}|r0|s0|d S |S r  )re  r  rg  )r^   r  rf  rd  rp  r]   r]   r`   scalar  s    zSelectBase.scalarc                 c   s"   |   |D ]}|d V  qd S r  )rg  rv  )r^   r  rp  r]   r]   r`   scalars 	  s    zSelectBase.scalarsc                 C   s   |   d}|rd  |_|_zD|jd kr`|jd kr`|jd kr`|jd kr`|jdk	r`|	t
d}W n tk
rv   Y nX t|gtt
dg|S )NZ_wrappedT1)r  r  r  r  _having	_group_by_windows	_distinct_simple_distinctr  rP   r   rO   r4   ZCOUNTr  )r^   r  Zclear_limitr  r]   r]   r`   r  	  s    zSelectBase.countc                 C   s&   |  td}d|_d |_t| S )Nr  r   )r  rP   r  r  boolr  )r^   r  r  r]   r]   r`   exists	  s    zSelectBase.existsc                 C   s0   d | _ z| |d W S  tk
r*   Y nX d S r  )r`  rv  
IndexErrorrT  r]   r]   r`   r  	  s
    zSelectBase.getN)r   )r   )FF)F)rb   rc   rd   r"  ru  r^  r  rC  r  r  r  r  r  r]   r]   r]   r`   r    s    

r  c                       sP   e Zd Z fddZedd Zedd Zdd Zd	d
 Z	 fddZ
  ZS )r  c                    s$   t t|   || _|| _|| _d S r\   )rk  r  r]  rd  r-  r   )r^   rd  r-  r   rl  r]   r`   r]  '	  s    zCompoundSelectQuery.__init__c                 C   s   | j jS r\   )rd  
_returningr\  r]   r]   r`   r  -	  s    zCompoundSelectQuery._returningc                 C   s*   t | dftdf|}t| S )Nr   r  )rO   r  rP   r3  r  r  )r^   r  r  r]   r]   r`   r  1	  s    zCompoundSelectQuery.existsc                 C   s   | j  | j fS r\   )rd  Zget_query_keyr   r\  r]   r]   r`   _get_query_key6	  s    z"CompoundSelectQuery._get_query_keyc                 C   sP   |j j}|r|tkrdS |tkr$dS |tkrL|j js<|j jr@dS t|t S d S NFT)	r  compound_select_parenthesesCSQ_PARENTHESES_NEVERCSQ_PARENTHESES_ALWAYSCSQ_PARENTHESES_UNNESTEDr  r
  rp   r  )r^   r  ZsubqZcsq_settingr]   r]   r`   _wrap_parens9	  s    z CompoundSelectQuery._wrap_parensc                    s   |j tkr| |S tt| | |jp2|j tk}||d | || j	}|j
|dd || j	 W 5 Q R X |d| j  | : | || j}|j
|dd || j W 5 Q R X W 5 Q R X |  | | W 5 Q R X W 5 Q R X | |S )Nrl  F)r  r  rg  )r  r  r  rk  r  r  r  r  r  rd  r  r  r  r-  r  r   r  r  r  )r^   r  Zouter_parensZ
lhs_parensZ
rhs_parensrl  r]   r`   r  K	  s     


 
zCompoundSelectQuery.__sql__)rb   rc   rd   r]  r  r  r^  r  r  r  r  ro  r]   r]   rl  r`   r  &	  s   

r  c                
       s  e Zd Zd) fdd	Z fddZejdd ZeZejdd	 Z	e
d
d Zejdd Zejdd ZejejdfddZd*ddZejdd Zdd Zejdd Zejdd Zejdd Zejd+ddZejd,d d!Zd"d# Zd-d%d&Z fd'd(Z  ZS ).rO   Nc                    s   t t| jf | t|tr$t|n|p*g | _|| _|| _|| _	d | _
|| _|| _|	| _|
| _d  | _| _|rt|tr|| _n|| _d | _d S r\   )rk  rO   r]  rp   r9  r8  
_from_listr  r  r  r  _for_update_for_update_of_for_update_nowait_lateralr  r  r  r`  )r^   	from_listr  group_byhavingr  windows
for_updateZfor_update_ofr+  lateralrS  rl  r]   r`   r]  j	  s(    
zSelect.__init__c                    s$   t t|  }|jr t|j|_|S r\   )rk  rO   r  r  r8  r^   r  rl  r]   r`   r  	  s    zSelect.clonec                 O   s
   || _ d S r\   r  )r^   r  rS  r]   r]   r`   r  	  s    zSelect.columnsc                 G   s   t | j| | _d S r\   )r9  r  r
  r]   r]   r`   select_extend	  s    zSelect.select_extendc                 C   s   | j S r\   r  r\  r]   r]   r`   selected_columns	  s    zSelect.selected_columnsc                 C   s
   || _ d S r\   r  r  r]   r]   r`   r  	  s    c                 G   s   t || _d S r\   )r8  r  r^   sourcesr]   r]   r`   from_	  s    zSelect.from_c                 C   s2   | j std| j  }| j t|||| d S )NNo sources to join on.)r  r  r  r_  r  )r^   r  r  r  r  r]   r]   r`   r-  	  s    
zSelect.joinc                 C   s   |  |tj|S r\   r-  r>   r  r  r]   r]   r`   r  	  s    zSelect.left_outer_joinc                    sV   g }|D ]B t  tr@ js$td| fdd jD  q|  q|| _d S )NQCannot pass a table to group_by() that does not have columns explicitly declared.c                    s   g | ]}t  |qS r]   r   r/  Zcol_namerR  r]   r`   r3  	  s   z#Select.group_by.<locals>.<listcomp>)rp   rR   rL  r  r  r_  r  r^   r  groupingr]   r  r`   r  	  s    

zSelect.group_byc                 G   s   t | jp
d| }| j| S )z$@Node.copy used from group_by() callr]   )r9  r  r  )r^   ri  r  r]   r]   r`   group_by_extend	  s    zSelect.group_by_extendc                 G   s(   | j d k	r| j f| }ttj|| _ d S r\   )r  ro   rW  rX  rY  r]   r]   r`   r  	  s    
zSelect.havingc                 G   s@   t |dkr0|d dks$|d dkr0|d | _nd| _|| _d S )Nr   r   TF)r   r  r  r
  r]   r]   r`   r  	  s    $zSelect.distinctc                 G   s   |r|nd | _ d S r\   )r  )r^   r  r]   r]   r`   r  	  s    zSelect.windowTc                 C   s*   |s|d k	s|rd}|| _ || _|| _d S r  )r  r  r  )r^   r  r/  r+  r]   r]   r`   r  	  s
    zSelect.for_updatec                 C   s
   || _ d S r\   )r  )r^   r  r]   r]   r`   r  	  s    zSelect.lateralc                 C   s   | j S r\   r  r\  r]   r]   r`   r  	  s    zSelect._get_query_keyFc                 C   s   | t| jS r\   )r  rr  r  r^   r  is_subqueryr]   r]   r`   __sql_selection__	  s    zSelect.__sql_selection__c              
      s"  |j tkr| |S | jr.|j tkr.|d |j}d d|pD|j tkdd}|jjrh|jj	dkrhd|d< |j
f |x tt| | |d | js| jd k	r|d | jr|d	t| jd
 |  | ||}W 5 Q R X | jr$|jdd |dt| j W 5 Q R X | jd k	rB|d| j | jr`|dt| j | jd k	r~|d| j | jd k	r|d |t| j | | | jr|jjstd|d
 |t| j| j| j  W 5 Q R X |jjs|jj!r| j"d kr|S | #|S )NzLATERAL FT)r  r
  r  r  r   r  zSELECT z	DISTINCT zON r   rl   FROM  WHERE z
 GROUP BY z HAVING z WINDOW z3FOR UPDATE specified but not supported by database.)$r  r  r  r  r  r  r  r  r
  r  r  rk  rO   r  r  r  r  rn  r  r  r  rr  rF  r  r  r  r  r  r  r  r*  r  r  r  r  r  )r^   r  r  r  rl  r]   r`   r  	  sh    





 



zSelect.__sql__)
NNNNNNNNNN)N)TNN)T)F)rb   rc   rd   r]  r  r<  r'  r  r  r  r  r  r  r  r>   r  r-  r  r  r  r  r  r  r  r  r  r  r  ro  r]   r]   rl  r`   rO   i	  sP                










c                       sj   e Zd Zd fdd	ZdddZejdd Zd	d
 Zdd Z	dd Z
dd Zdd Z fddZ  ZS )_WriteQueryNc                    s0   || _ || _|rdnd| _tt| jf | d S NTF)r  r  _return_cursorrk  r  r]  )r^   r  	returningrS  rl  r]   r`   r]  (
  s    z_WriteQuery.__init__Fc                 C   s   t || |||dS r  r  r  r]   r]   r`   r  .
  s    
z_WriteQuery.ctec                 G   s   || _ |rdnd| _d S r  )r  r  r^   r  r]   r]   r`   r  2
  s    z_WriteQuery.returningc              	   C   s4   | j r0|  |dt| j  W 5 Q R X |S )Nz RETURNING )r  r  r  r  rr  r  r]   r]   r`   apply_returning7
  s    
 z_WriteQuery.apply_returningc                 C   s(   | j r| |}n
|| }| ||S r\   )r  execute_returningrv  handle_resultr  r]   r]   r`   ru  =
  s    
z_WriteQuery._executec                 C   s&   | j d kr || }| || _ | j S r\   r  r  r]   r]   r`   r  D
  s    

z_WriteQuery.execute_returningc                 C   s   | j r
|S ||S r\   )r  rows_affectedr  r]   r]   r`   r  J
  s    z_WriteQuery.handle_resultc                 C   s   | j j|j| j < d S r\   )r  rb   r  r  r]   r]   r`   _set_table_aliasO
  s    z_WriteQuery._set_table_aliasc                    s   t t| | | | |S r\   )rk  r  r  r  r  rl  r]   r`   r  R
  s    
z_WriteQuery.__sql__)N)FNN)rb   rc   rd   r]  r  r<  r'  r  r  ru  r  r  r  r  ro  r]   r]   rl  r`   r  '
  s   

r  c                       s8   e Zd Zd fdd	Zejdd Z fddZ  ZS )	ra  Nc                    s$   t t| j|f| || _d | _d S r\   )rk  ra  r]  rD  _from)r^   r  r   rS  rl  r]   r`   r]  \
  s    zUpdate.__init__c                 G   s
   || _ d S r\   )r  r  r]   r]   r`   r  a
  s    zUpdate.from_c              
      sl  t t| | |jddD |d g }t| j |jdD ]~\}}t	|t
sxt	|trj||}qt|dd}nt	|trt	|tr||}t	|tst|}|t|td|f qB|| jdt| | jr|jdd	 |d
t| j W 5 Q R X | jrB|  |d| j W 5 Q R X | | | |W  5 Q R  S Q R X d S )NTr  zUPDATE r]  Fr  r   z SET rl  r  r  )rk  ra  r  r  r  sortedrD  rZ  r  rp   r<  r1   to_valuerX   r@   r5   rA  r_  r  rP   r  r  rr  r  r  rF  r  r  r  )r^   r  rZ  kr  rl  r]   r`   r  e
  s:    




 

zUpdate.__sql__)N)	rb   rc   rd   r]  r<  r'  r  r  ro  r]   r]   rl  r`   ra  [
  s   
ra  c                       s   e Zd ZdZdZdZG dd deZd& fdd	Zd	d
 Z	e
jd'ddZe
jd(ddZe
jd)ddZe
jdd Zdd Zdd Zdd Zdd Zdd Zdd Z fd d!Z fd"d#Zd$d% Z  ZS )*r[  r   r   rf   c                   @   s   e Zd ZdS )zInsert.DefaultValuesExceptionNr  r]   r]   r]   r`   DefaultValuesException
  s    r  Nc                    s6   t t| j|f| || _|| _|| _d | _d| _d S r  )rk  r[  r]  _insertrL  _on_conflict_query_type_as_rowcount)r^   r  rY  r  r`  rS  rl  r]   r`   r]  
  s    zInsert.__init__c                 G   s   t dd S )Nz*INSERT queries cannot have a WHERE clause.r  rY  r]   r]   r`   r  
  s    zInsert.whereTc                 C   s
   || _ d S r\   )r  )r^   r  r]   r]   r`   as_rowcount
  s    zInsert.as_rowcountc                 C   s   |rt dnd | _d S )NZIGNORErB  r  )r^   ignorer]   r]   r`   on_conflict_ignore
  s    zInsert.on_conflict_ignorec                 C   s   |rt dnd | _d S Nr^  r  )r^   r   r]   r]   r`   on_conflict_replace
  s    zInsert.on_conflict_replacec                 O   s   |s|rt ||nd | _d S r\   r  rc  r]   r]   r`   r`  
  s    zInsert.on_conflictc                 C   s    | j s| d| | j f|S )NError: no data to insert.)r  r  _generate_insertr  r]   r]   r`   _simple_insert
  s    
zInsert._simple_insertc                 C   s   i S r\   r]   r\  r]   r]   r`   get_default_data
  s    zInsert.get_default_datac                    s"    j jr fdd j jD S d S )Nc                    s$   g | ]}| j jkrt j |qS r]   )r  rM  r   r/  colr\  r]   r`   r3  
  s    z.Insert.get_default_columns.<locals>.<listcomp>)r  rL  r\  r]   r\  r`   get_default_columns
  s    zInsert.get_default_columnsc                    sn  t |}| j}|  }|szt|}W n tk
rD   | dY nX t|tsj|  }|d krt	dnfg }|D ]$}t|t
rt| j|}|| qrt|}	t||	 D ]}
||
 qt| fddd}tt |f|}nzg }t }|D ]6}t|t
rt| j|}n|}|| || q|}t| fdddD ]}
|
|krB||
 qBt }t }i }|D ]f}||jg}t|tr|j|jkr||j |jr|| t|tr|| |||< qr t|d dd	 |D }g }|D ]$}g }t|t}t|D ]\}\}}zR|rt|| D ]0}z|| }W n tk
rb   Y nX  q|q<tn|| }W n\ ttfk
r   ||kr|| }t|r| }n||krd }nt	d
|j Y nX t|trt|t r||krt!||dd}|| q |t| q|s<| d j"dd  t#|W  5 Q R  S Q R X d S )NzError: no rows to insert.z!Bulk insert must specify columns.c                    s
   |   S r\   r  rY  r  r]   r`   rr   
  rs   z)Insert._generate_insert.<locals>.<lambda>r  c                    s
   |   S r\   r  r  r  r]   r`   rr   
  rs   z VALUES c                 S   s$   g | ]}|t |tr|jnd fqS r\   )rp   r1   r  rV  r]   r]   r`   r3  
  s   z+Insert._generate_insert.<locals>.<listcomp>zMissing value for %s.F)r  r  r  Tr  )$rK  rL  r  nextStopIterationr  rp   r
   r  r  ru  r   r  r_  r  r  	itertoolschainr  r	  r1   column_namenullr5   r  rn  r  	enumerater   r  	callable_r<  r@   rX   r  rr  )r^   rY  r  Z	rows_iterr  defaultsrp  accumrR  Z
column_setr  Zclean_columnsseenZ
column_obj	fk_fieldsZnullable_columnsZvalue_lookupsZlookupsZcolumns_convertersZ
all_valuesri  is_dictr3  r  lookupvalr]   r  r`   r  
  s    









 




zInsert._generate_insertc                 C   s   | t| jd | jS r   )r  rn  rL  r  r  r  r]   r]   r`   _query_insert/  s    zInsert._query_insertc                 C   s   | j s|dS | j |S NzDEFAULT VALUES)r  r  default_values_insertr  r]   r]   r`   _default_values5  s    
zInsert._default_valuesc              
      s8  t t| | |  d }| jd k	r8| j|| }||pFtdd| j	d t
| jtr| jsz| | W n  | jk
r   | | Y nX tj| _n:t
| jttfr| | tj| _n| | j| tj| _| jd k	r| j|| }|d k	r|d| | |W  5 Q R  S Q R X d S )NZINSERTz INTO r   )rk  r[  r  r  r  rQ  r  rP   r  r  rp   r  r
   rL  r  r  r	  SIMPLEr  r  r  QUERYr  MULTIrS  r  )r^   r  stmtr   rl  r]   r`   r  :  s<    





zInsert.__sql__c                    sR   | j d kr$|jr$| jjr$| jjf| _ ztt| |W S  | jk
rL   Y nX d S r\   )r  returning_clauser  rM  rk  r[  ru  r  rT  rl  r]   r`   ru  [  s    zInsert._executec                 C   s(   | j r
|S | jr||S ||| jS r\   )r  r  r  last_insert_idr  r  r]   r]   r`   r  d  s
    
zInsert.handle_result)NNN)T)T)T)rb   rc   rd   r
  r  r  	Exceptionr  r]  r  r<  r'  r  r  r  r`  r  r  r  r  r  r	  r  ru  r  ro  r]   r]   rl  r`   r[  
  s.   	
r!	r[  c                       s   e Zd Z fddZ  ZS )rb  c              
      s   t t| | |jddd |d| j | jd k	r`|  |d| j W 5 Q R X | 	| | 
|W  5 Q R  S Q R X d S )NTr  DELETE FROM r  )rk  rb  r  r  r  r  r  rF  r  r  r  r  rl  r]   r`   r  m  s    


zDelete.__sql__)rb   rc   rd   r  ro  r]   r]   rl  r`   rb  l  s   rb  c                   @   sL   e Zd ZdddZejdddZejdd	 Zejdd
dZdd Z	dS )r8   FNc                 C   s@   || _ t|tst|n|| _|| _|| _|| _|| _|| _	d S r\   )
r8  rp   rR   r=  _table_expressionsrF  _unique_safe_using)r^   r	  r  rZ  uniquesafer  usingr]   r]   r`   r]  {  s    zIndex.__init__Tc                 C   s
   || _ d S r\   )r  )r^   r  r]   r]   r`   r    s    z
Index.safec                 G   s(   | j d k	r| j f| }ttj|| _ d S r\   rV  rY  r]   r]   r`   r    s    
zIndex.wherec                 C   s
   || _ d S r\   )r  )r^   r  r]   r]   r`   r    s    zIndex.usingc              	   C   s,  | j r
dnd}|jdd || | jr8|d |jjrrt| jtrr| jj	rrt
| jj	| j}t
| jj}nt
| j}| j}|| | jd k	r|jjr|d| j  |d|d | jd k	r|jjs|d	| j  |td
d | jD  | jd k	r|d| j W 5 Q R X |S )NzCREATE UNIQUE INDEX zCREATE INDEX Tr  IF NOT EXISTS z	 USING %srh  r   z	USING %s c                 S   s"   g | ]}t |trt|n|qS r]   )rp   ru  rP   )r/  r)  r]   r]   r`   r3    s   z!Index.__sql__.<locals>.<listcomp>r  )r  r  r  r  r  index_schema_prefixrp   r  rR   rN  r=  r8  rb   r  r  index_using_precedes_tablern  r  rF  )r^   r  	statement
index_name
table_namer]   r]   r`   r    sH    







zIndex.__sql__)FFNN)T)N)
rb   rc   rd   r]  r<  r'  r  r  r  r  r]   r]   r]   r`   r8   z  s       


c                       s&   e Zd Zd fdd	Zdd Z  ZS )	rA   FTNc           	   	      sl   || _ |d kr| ||}|d krF|D ]}t|tr&t|dr&|j}q&tt| j||j	j
|||||d d S )N
index_type)r	  r  rZ  r  r  r  r  )rH  _generate_name_from_fieldsrp   r1   r  r   rk  rA   r]  r  r  )	r^   r|  fieldsr  r  r  r  r	  fieldrl  r]   r`   r]    s     
zModelIndex.__init__c                 C   s   g }|D ]T}t |tr*|| d  qt |trFt |tsF| }t |tr||j q|sjtdt	
ddd|}|j}|jr|jn|j}td||fS )Nr   zJUnable to generate a name for the index, please explicitly specify a name.[^\w]+r  r  )rp   ru  r_  r   r<  r1   r  r  r  rer@  r-  r  legacy_table_namesr	  r  _truncate_constraint_name)r^   r|  r"  r   r#  Zclean_field_namesr$  prefixr]   r]   r`   r!    s    

z%ModelIndex._generate_name_from_fields)FTNNN)rb   rc   rd   r]  r!  ro  r]   r]   rl  r`   rA     s
       @   c                 C   sD   t | |kr@t| d }d| d |d  |d d f } | S )Nutf-8z%s_%sr!     )r   hashlibmd5encode	hexdigest)r  maxlenZ	name_hashr]   r]   r`   r'    s     r'  c                       s   e Zd Z fddZ  ZS )PeeweeExceptionc                    s>   |r*t |d tr*|d |dd   | _}tt| j|  d S ry  )rp   r  origrk  r1  r]  )r^   rR  rl  r]   r`   r]    s    zPeeweeException.__init__rb   rc   rd   r]  ro  r]   r]   rl  r`   r1    s   r1  c                   @   s   e Zd ZdS )r7   Nr  r]   r]   r]   r`   r7     s    c                   @   s   e Zd ZdS )r$   Nr  r]   r]   r]   r`   r$     s    c                   @   s   e Zd ZdS )r&   Nr  r]   r]   r]   r`   r&     s    c                   @   s   e Zd ZdS )r:   Nr  r]   r]   r]   r`   r:     s    c                   @   s   e Zd ZdS )r;   Nr  r]   r]   r]   r`   r;     s    c                   @   s   e Zd ZdS )r<   Nr  r]   r]   r]   r`   r<     s    c                   @   s   e Zd ZdS )rC   Nr  r]   r]   r]   r`   rC     s    c                   @   s   e Zd ZdS )rE   Nr  r]   r]   r]   r`   rE     s    c                   @   s   e Zd ZdS )rJ   Nr  r]   r]   r]   r`   rJ     s    c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	ExceptionWrapper
exceptionsc                 C   s
   || _ d S r\   r5  )r^   r6  r]   r]   r`   r]    s    zExceptionWrapper.__init__c                 C   s   d S r\   r]   r\  r]   r]   r`   rh    rs   zExceptionWrapper.__enter__c                 C   s   |d krd S t d k	r8|j| jkr8t|t jr8|jd }n*td k	rb|j| jkrbt|tjrb|jd }|j| jkr| j|j }|j}t|||f| | d S r  )		pg_errorsrb   r6  r6  Error	__bases__
pg3_errorsrR  rz   )r^   r  	exc_value	tracebacknew_typeZexc_argsr]   r]   r`   ri    s     



zExceptionWrapper.__exit__N)rb   rc   rd   rj  r]  rh  ri  r]   r]   r]   r`   r4    s   r4  )ZConstraintErrorr$   r&   r:   r;   r<   rC   rE   rJ   ZTransactionRollbackErrorZUndefinedFunctionZUniqueViolationIndexMetadata)r	  r  r  r  r  ColumnMetadata)r	  	data_typer  rP  r  r&  ForeignKeyMetadata)rR  
dest_tabledest_columnr  ViewMetadata)r	  r  c                       s,   e Zd Z fddZdd Zdd Z  ZS )_ConnectionStatec                    s   t t| jf | |   d S r\   )rk  rE  r]  resetr  rl  r]   r`   r]  4  s    z_ConnectionState.__init__c                 C   s   d| _ d | _g | _g | _d S r  )closedconnr  transactionsr\  r]   r]   r`   rF  8  s    z_ConnectionState.resetc                 C   s   || _ d| _g | _g | _d S r  )rH  rG  r  rI  r^   rH  r]   r]   r`   set_connection>  s    z_ConnectionState.set_connection)rb   rc   rd   r]  rF  rK  ro  r]   r]   rl  r`   rE  3  s   rE  c                   @   s   e Zd ZdS )_ConnectionLocalNr  r]   r]   r]   r`   rL  E  s    rL  c                   @   s    e Zd ZdZdd Zdd ZdS )	_NoopLockr]   c                 C   s   | S r\   r]   r\  r]   r]   r`   rh  H  rs   z_NoopLock.__enter__c                 C   s   d S r\   r]   r  r]   r]   r`   ri  I  rs   z_NoopLock.__exit__N)rb   rc   rd   rj  rh  ri  r]   r]   r]   r`   rM  F  s   rM  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )rr  r  c                 C   s
   || _ d S r\   rN  r^   r  r]   r]   r`   r]  N  rs   zConnectionContext.__init__c                 C   s   | j  r| j   d S r\   )r  	is_closedconnectr\  r]   r]   r`   rh  O  s    
zConnectionContext.__enter__c                 C   s   | j   d S r\   )r  closer  r]   r]   r`   ri  R  rs   zConnectionContext.__exit__c                    s   t   fdd}|S )Nc               
      s,   t j  | |W  5 Q R  S Q R X d S r\   )rr  r  rQ  rT  r]   r`   rU  T  s    z)ConnectionContext.__call__.<locals>.innerr   rV  r]   rT  r`   rW  S  s    zConnectionContext.__call__N)rb   rc   rd   rj  r]  rh  ri  rW  r]   r]   r]   r`   rr  L  s
   rr  c                   @   sH  e Zd ZeZi Zi ZdZdZdZ	e
ZdZdZdZdZdZdZdZd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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"d#Z$dd$d%Z%dd&d'Z&d(d) Z'd*d+ Z(d,d- Z)d.d/ Z*d0d1 Z+dd2d3Z,d4d5 Z-d6d7 Z.d8d9 Z/d:d; Z0d<d= Z1d>d? Z2d@dA Z3dBdC Z4dDdE Z5dFdG Z6dHdI Z7dJdK Z8dLdM Z9dNdO Z:dPdQ Z;dRdS Z<dTdU Z=dVdW Z>ddXdYZ?ddZd[Z@dd\d]ZAdd^d_ZBdd`daZCddbdcZDddde ZEdfdg ZFdhdi ZGdjdk ZHdldm ZIdndo ZJdpdq ZKdrds ZLddtduZMddvdwZNdxdy ZOePdzd{ ZQdS )r#   r  r  NFTc           	      K   s   t t| j| _t t| j| _|r,| j| |r<| j| || _|| _	|r`t
 | _t | _nt | _t | _|r|td |d k	rtd i | _| j|f| d S )NzPeewee no longer uses the "autorollback" option, as we always run in autocommit-mode now. This changes psycopg2's semantics so that the conn is not left in a transaction-aborted state.a^  Peewee no longer uses the "autocommit" option, as the semantics now require it to always be True. Because some database-drivers also use the "autocommit" parameter, you are receiving a warning so you may update your code and remove the parameter, as in the future, specifying autocommit could impact the behavior of the database driver you are using.)r*  FIELDfield_types_field_typesrD   r  _operationsr   autoconnectthread_saferL  _state	threadingLock_lockrE  rM  r   connect_paramsinit)	r^   r  rX  ZautorollbackrT  r  
autocommitrW  rS  r]   r]   r`   r]  p  s&    	zDatabase.__init__c                 K   s2   |   s|   || _| j| t| | _d S r\   )rP  rR  r  r]  r   r  deferred)r^   r  rS  r]   r]   r`   r^    s
    zDatabase.initc                 C   s2   |   r|   |  }| jj| |  | S r\   )rP  rQ  rv  rY  r  r_  rh  r  r]   r]   r`   rh    s    zDatabase.__enter__c                 C   s6   | j j }z|||| W 5 | j js0|   X d S r\   )rY  r  r  rR  ri  )r^   r  r  r  r  r]   r]   r`   ri    s
    zDatabase.__exit__c                 C   s   t | S r\   rq  r\  r]   r]   r`   rs    s    zDatabase.connection_contextc                 C   s   t d S r\   r  r\  r]   r]   r`   _connect  s    zDatabase._connectc              
   C   s   | j  | jrtd| jjs8|r0W 5 Q R  dS td| j  t< | j| 	  | j
d krp| | jj | | jj W 5 Q R X W 5 Q R X dS )N@Error, database must be initialized before opening a connection.FzConnection already opened.T)r\  r`  r;   rY  rG  rE   rF  __exception_wrapper__rK  ra  server_version_set_server_versionrH  _initialize_connection)r^   Zreuse_if_openr]   r]   r`   rQ    s    

"zDatabase.connectc                 C   s   d S r\   r]   rJ  r]   r]   r`   rf    s    zDatabase._initialize_connectionc                 C   s
   d| _ d S r  )rd  rJ  r]   r]   r`   re    s    zDatabase._set_server_versionc              
   C   s~   | j n | jrtd|  r&td| jj }z&|rTt | 	| jj
 W 5 Q R X W 5 | j  X |W  5 Q R  S Q R X d S )Nrb  z7Attempting to close database while transaction is open.)r\  r`  r;   in_transactionrE   rY  rG  rF  rc  _closerH  )r^   Zis_openr]   r]   r`   rR    s    
zDatabase.closec                 C   s   |   d S r\   )rR  rJ  r]   r]   r`   rh    s    zDatabase._closec                 C   s   | j jS r\   rY  rG  r\  r]   r]   r`   rP    s    zDatabase.is_closedc                 C   s
   | j j S r\   ri  r\  r]   r]   r`   is_connection_usable  s    zDatabase.is_connection_usablec                 C   s   |   r|   | jjS r\   )rP  rQ  rY  rH  r\  r]   r]   r`   
connection  s    zDatabase.connectionc                 C   s<   |d k	rt d |  r0| jr(|   ntd| jj S )N,"commit" has been deprecated and is a no-op.z&Error, database connection not opened.)r   rP  rW  rQ  r;   rY  rH  rr  )r^   commitZnamed_cursorr]   r]   r`   rr    s    
zDatabase.cursorc              	   C   sJ   |d k	rt d t||f t |  }|||p8d W 5 Q R X |S )Nrl  r]   )r   loggerdebugrc  rr  rv  )r^   r  r  rm  rr  r]   r]   r`   execute_sql  s    zDatabase.execute_sqlc                 K   s:   |d k	rt d | jf |}|| \}}| ||S )Nrl  )r   r  r  r  rp  )r^   r  rm  context_optionsr  r  r  r]   r]   r`   rv    s
    zDatabase.executec                 C   s6   | j | j| j| j| j| j| j| j| j| j	| j
| jdS )N)rT  r  r  r5  r  rO  rR  r  r  r  r  r  )rU  rV  r  r5  r  rO  rR  r  r  r  r  r  r\  r]   r]   r`   get_context_options  s    zDatabase.get_context_optionsc                 K   s"   |   }|r|| | jf |S r\   )rr  r   context_class)r^   rq  rt  r]   r]   r`   r    s    
zDatabase.get_sql_contextc                 C   s   t d S r\   r  r^   r`  r  r]   r]   r`   rO    s    zDatabase.conflict_statementc                 C   s   t d S r\   r  rt  r]   r]   r`   rR    s    zDatabase.conflict_updatec                 C   st  |j rBtd}tdd |j D }|jd k	rbt|td|jg}n td}|j}t|trbt|}g }|j	r|j	D ]<}ttdt
|fdd}tt
|td	|f}|| qr|jr8|j D ]t\}	}
t|
tst|	trt|j|	}	t|	tr|	|
}
nt|
d
d}
nt|
}
|tt
|	td	|
f q||tdt|g}|jrl|tdt|jf t|S )NON CONFLICTc                 S   s"   g | ]}t |trt|n|qS r]   rt  r  r]   r]   r`   r3  #  s   z6Database._build_on_conflict_update.<locals>.<listcomp>r   zON CONFLICT ON CONSTRAINTr0   r+  r1  r   Fr  zDO UPDATE SET)rG  rP   rn  rH  r  rI  rp   ru  r=  rE  r>  r_  rD  rZ  r<  r   r  r1   r  rX   rL   rr  rF  r  )r^   r`  r  r  targetupdatesrR  Zexcluded
expressionr  r  r   r]   r]   r`   _build_on_conflict_update   sJ    




z"Database._build_on_conflict_updatec                 C   s   |j S r\   )	lastrowidr^   rr  Z
query_typer]   r]   r`   r  M  s    zDatabase.last_insert_idc                 C   s   |j S r\   )rowcountr^   rr  r]   r]   r`   r  P  s    zDatabase.rows_affectedc                 C   s
   | dS r  r  r  r]   r]   r`   r  S  s    zDatabase.default_values_insertc                 C   s   |    S r\   )r|  rh  r\  r]   r]   r`   session_startV  s    zDatabase.session_startc                 C   s8   z|   }W n tk
r"   Y dS X |j|  d dS NFbeginT)pop_transactionr  rm  rg  r^   Ztxnr]   r]   r`   session_commitY  s    zDatabase.session_commitc                 C   s8   z|   }W n tk
r"   Y dS X |j|  d dS r  )r  r  rollbackrg  r  r]   r]   r`   session_rollbacka  s    zDatabase.session_rollbackc                 C   s   t | jjS r\   )r  rY  rI  r\  r]   r]   r`   rg  i  s    zDatabase.in_transactionc                 C   s   | j j| d S r\   )rY  rI  r_  )r^   r|  r]   r]   r`   push_transactionl  s    zDatabase.push_transactionc                 C   s   | j j S r\   )rY  rI  r  r\  r]   r]   r`   r  o  s    zDatabase.pop_transactionc                 C   s   t | jjS r\   )r   rY  rI  r\  r]   r]   r`   transaction_depthr  s    zDatabase.transaction_depthc                 C   s   | j jr| j jd S d S NrH  )rY  rI  r\  r]   r]   r`   top_transactionu  s    zDatabase.top_transactionc                 O   s   t | f||S r\   rt  rc  r]   r]   r`   rv  y  s    zDatabase.atomicc                 C   s   t | S r\   rw  r\  r]   r]   r`   ry  |  s    zDatabase.manual_commitc                 O   s   t | f||S r\   rz  rc  r]   r]   r`   r|    s    zDatabase.transactionc                 C   s   t | S r\   r}  r\  r]   r]   r`   r    s    zDatabase.savepointc              	   C   s2   |   r|   t |  d W 5 Q R X d S )NBEGINrP  rQ  rc  rr  rv  r\  r]   r]   r`   r    s    zDatabase.beginc              	   C   s"   t  |  d W 5 Q R X d S )NZROLLBACKrc  rr  rv  r\  r]   r]   r`   r    s    zDatabase.rollbackc              	   C   s"   t  |  d W 5 Q R X d S )NZCOMMITr  r\  r]   r]   r`   rm    s    zDatabase.commitc              
   c   s8   t ||D ](}|   |D ]
}|V  qW 5 Q R X q
d S r\   )r   rv  )r^   rM  rN  rO  rY  r]   r]   r`   batch_commit  s    
zDatabase.batch_commitc                 C   s,   t |r|}|jj}|jj}|| j|dkS )N)rQ  )r  r  r  rQ  
get_tables)r^   r  rQ  r|  r]   r]   r`   table_exists  s
    zDatabase.table_existsc                 C   s   t d S r\   r  )r^   rQ  r]   r]   r`   r    s    zDatabase.get_tablesc                 C   s   t d S r\   r  r^   r  rQ  r]   r]   r`   get_indexes  s    zDatabase.get_indexesc                 C   s   t d S r\   r  r  r]   r]   r`   get_columns  s    zDatabase.get_columnsc                 C   s   t d S r\   r  r  r]   r]   r`   get_primary_keys  s    zDatabase.get_primary_keysc                 C   s   t d S r\   r  r  r]   r]   r`   get_foreign_keys  s    zDatabase.get_foreign_keysc                 C   s   t d S r\   r  )r^   seqr]   r]   r`   sequence_exists  s    zDatabase.sequence_existsc                 K   s   t |D ]}|jf | qd S r\   )sort_modelscreate_table)r^   modelsoptionsr|  r]   r]   r`   create_tables  s    zDatabase.create_tablesc                 K   s"   t t|D ]}|jf | qd S r\   )r  r  
drop_table)r^   r  rS  r|  r]   r]   r`   drop_tables  s    zDatabase.drop_tablesc                 C   s   t d S r\   r  r^   	date_part
date_fieldr]   r]   r`   extract_date  s    zDatabase.extract_datec                 C   s   t d S r\   r  r  r]   r]   r`   truncate_date  s    zDatabase.truncate_datec                 C   s   t d S r\   r  r^   r  r]   r]   r`   to_timestamp  s    zDatabase.to_timestampc                 C   s   t d S r\   r  r  r]   r]   r`   from_timestamp  s    zDatabase.from_timestampc                 C   s   t  S r\   )r4   randomr\  r]   r]   r`   r    s    zDatabase.randomc                 C   s   |D ]}|j | ||d qd S )N)	bind_refsbind_backrefs)r3  )r^   r  r  r  r|  r]   r]   r`   r3    s    zDatabase.bindc                 C   s   t || ||S r\   _BoundModelsContext)r^   r  r  r  r]   r]   r`   rU    s    zDatabase.bind_ctxc                 C   s    | t tdtdS )N0r  rO   r  rP   r  r  r]   r]   r`   get_noop_select  s    zDatabase.get_noop_selectc                    s6   t  ds0G  fddd}tdtfd|i _ jS )Nrp  c                       s   e Zd Z ZdS )zDatabase.Model.<locals>.MetaNr  r]   r\  r]   r`   r    s    r  r  r  r  r]   r\  r`   r@     s    
zDatabase.Model)TFNNNT)F)NN)NN)N)N)N)N)N)N)N)N)TT)TT)Rrb   rc   rd   r"   rs  rT  r  r  r5  rd  r  r  r  r  r  r  r  r  safe_create_indexsafe_drop_index	sequencestruncate_tabler]  r^  rh  ri  rs  ra  rQ  rf  re  rR  rh  rP  rj  rk  rr  rp  rv  rr  r  rO  rR  rz  r  r  r  r  r  r  rg  r  r  r  r  rv  ry  r|  r  r  r  rm  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r3  rU  r  r  r@   r]   r]   r]   r`   r#   [  s          
&



	
-








c                    s"    fdd} fdd}t ||S )Nc                    s
   |   S r\   pragmar\  r	  r]   r`   r    s    z__pragma__.<locals>.__get__c                    s   |   |S r\   r  r  r  r]   r`   __set__  s    z__pragma__.<locals>.__set__)r  )r	  r  r  r]   r  r`   
__pragma__  s    r  c                       s  e Zd ZejejejejejejdZdddZ	dZ
dZeZdZ fdd	Zd} fdd	Zdd Zdd Zdd Zdd Zdd Zedd
fddZedZedZedZedZedZedZed Zed!Z ed"Z!ed#Z"ed$Z#ed%Z$e%d&d' Z&e&j'd(d' Z&d)d* Z(d+d, Z)d-d. Z*d/d0 Z+d~d1d2Z,dd3d4Z-dd5d6Z.dd7d8Z/dd9d:Z0dd;d<Z1dd=d>Z2dd?d@Z3ddAdBZ4ddCdDZ5dEdF Z6dGdH Z7dIdJ Z8dKdL Z9dMdN Z:dOdP Z;dQdR Z<dSdT Z=dUdV Z>dWdX Z?ddYdZZ@d[d\ ZAdd]d^ZBd_d` ZCdadb ZDddcddZEddedfZFddgdhZGddidjZHddkdlZIddmdnZJdodp ZKdqdr ZLdsdt ZMdudv ZNdwdx ZOdydz ZPd{d| ZQ  ZRS )rQ   )r
  r   r  r  r   r  ZGLOBr   )r   r   TrH  Fc                    s~   | dd| _tt| j|f|| i | _i | _i | _i | _g | _	t
 | _i | _| tdd | tdd | jdk| _d S )Npragmasr]   r  rf   
date_trunc)r{      r   )r  _pragmasrk  rQ   r]  _aggregates_collations
_functions_window_functions_table_functionsr  _extensions	_attachedregister_functionr   r   rd  r  r]  rl  r]   r`   r]    s    zSqliteDatabase.__init__Nr  c                    sh   |d k	r|| _ t| j tr*t| j  | _ |d k	rJtdk rDtd || _|| _	t
t| j|f| d S )N)r{   #   r   z.RETURNING clause requires Sqlite 3.35 or newer)r  rp   rT  r8  rZ  __sqlite_version__r   r   r  _timeoutrk  rQ   r^  )r^   r  r  timeoutr  rS  rl  r]   r`   r^    s    
zSqliteDatabase.initc                 C   s   d S r\   r]   rJ  r]   r]   r`   re    s    z"SqliteDatabase._set_server_versionc                 C   sX   t d krtdt j| jf| jd d| j}z| | W n   |   Y nX |S )NzSQLite driver not installed!)r  isolation_level)sqlite3r7   rQ  r  r  r]  _add_conn_hooksrR  rJ  r]   r]   r`   ra    s    zSqliteDatabase._connectc                 C   s   | j r| | | jr | | | | | | | | | jdkrR| | | j	rn| j	D ]}|
| q^| jr~| | d S )N)r{      r   )r  _attach_databasesr  _set_pragmas_load_aggregates_load_collations_load_functionsrd  _load_window_functionsr  registerr  _load_extensions)r^   rH  table_functionr]   r]   r`   r    s    







zSqliteDatabase._add_conn_hooksc                 C   s6   |  }| jD ]\}}|d||f  q|  d S )NzPRAGMA %s = %s;)rr  r  rv  rR  )r^   rH  rr  r  rx   r]   r]   r`   r  -  s    zSqliteDatabase._set_pragmasc                 C   s:   |  }| j D ]\}}|d||f  q|  d S )NATTACH DATABASE "%s" AS "%s")rr  r  rZ  rv  rR  )r^   rH  rr  r	  r  r]   r]   r`   r  3  s    z SqliteDatabase._attach_databasesc                 C   s   |d k	rd||f }d| }|t k	r^|d|p.d 7 }|rjt| jpBd}|||< t| | _n|rjtd| | }|r|d S d S )Nz"%s".%sz	PRAGMA %sz = %sr   r]   z/Cannot specify a permanent pragma without value)SENTINELrT  r  r8  rZ  r  rp  fetchone)r^   r]  rx   	permanentrQ  r  r  rp  r]   r]   r`   r  9  s    zSqliteDatabase.pragma
cache_sizeforeign_keysjournal_modejournal_size_limit	mmap_size	page_sizeread_uncommittedsynchronouswal_autocheckpointapplication_iduser_versiondata_versionc                 C   s   | j S r\   )r  r\  r]   r]   r`   r  V  s    zSqliteDatabase.timeoutc                 C   s2   | j |krd S || _ |  s.| d|d   d S )NzPRAGMA busy_timeout=%d;i  )r  rP  rp  )r^   secondsr]   r]   r`   r  Z  s
    
c                 C   s*   | j  D ]\}\}}|||| q
d S r\   )r  rZ  create_aggregater^   rH  r	  klass
num_paramsr]   r]   r`   r  e  s    zSqliteDatabase._load_aggregatesc                 C   s$   | j  D ]\}}||| q
d S r\   )r  rZ  create_collation)r^   rH  r	  r4   r]   r]   r`   r  i  s    zSqliteDatabase._load_collationsc                 C   s@   | j  D ]0\}\}}}|r$d|ini }|j|||f| q
d S )Ndeterministic)r  rZ  create_function)r^   rH  r	  r4   Zn_paramsr  rS  r]   r]   r`   r  m  s    zSqliteDatabase._load_functionsc                 C   s*   | j  D ]\}\}}|||| q
d S r\   )r  rZ  Zcreate_window_functionr  r]   r]   r`   r  r  s    z%SqliteDatabase._load_window_functionsc                 C   s2   ||f| j |p|j < |  s.| |   d S r\   )r  rb   rB  rP  r  rk  r^   r  r	  r  r]   r]   r`   register_aggregatev  s    z!SqliteDatabase.register_aggregatec                    s    fdd}|S )Nc                    s    |   | S r\   )r  r  r	  r  r^   r]   r`   r  |  s    z+SqliteDatabase.aggregate.<locals>.decoratorr]   r^   r	  r  r  r]   r  r`   	aggregate{  s    zSqliteDatabase.aggregatec                    s@    p|j   fdd}||_|| j < |  s<| |   d S )Nc                     s   | t d  f }t|S )Nz
collate %s)rP   r  )rR  rZ  r  r]   r`   
_collation  s    z5SqliteDatabase.register_collation.<locals>._collation)rb   r  r  rP  r  rk  )r^   r4   r	  r  r]   r  r`   register_collation  s    

z!SqliteDatabase.register_collationc                    s    fdd}|S )Nc                    s    |   | S r\   )r  r4   r	  r^   r]   r`   r    s    z+SqliteDatabase.collation.<locals>.decoratorr]   r^   r	  r  r]   r  r`   r    s    zSqliteDatabase.collationc                 C   s0   |||f| j |p|j< |  s,| |   d S r\   )r  rb   rP  r  rk  )r^   r4   r	  r  r  r]   r]   r`   r    s    z SqliteDatabase.register_functionc                    s    fdd}|S )Nc                    s    |   | S r\   )r  r  r  r	  r  r^   r]   r`   r    s    z&SqliteDatabase.func.<locals>.decoratorr]   )r^   r	  r  r  r  r]   r  r`   r     s    zSqliteDatabase.funcc                 C   s6   |p|j  }||f| j|< |  s2| |   d S r\   )rb   rB  r  rP  r  rk  r  r]   r]   r`   register_window_function  s    z'SqliteDatabase.register_window_functionc                    s    fdd}|S )Nc                    s    |   | S r\   )r  r  r  r]   r`   r    s    z1SqliteDatabase.window_function.<locals>.decoratorr]   r  r]   r  r`   window_function  s    zSqliteDatabase.window_functionc                 C   s4   |d k	r||_ | j| |  s0||   d S r\   )r	  r  r_  rP  r  rk  )r^   r  r	  r]   r]   r`   register_table_function  s
    z&SqliteDatabase.register_table_functionc                    s    fdd}|S )Nc                    s    |   | S r\   )r  r  r  r]   r`   r    s    z0SqliteDatabase.table_function.<locals>.decoratorr]   r  r]   r  r`   r    s    zSqliteDatabase.table_functionc                 C   s   | j |= d S r\   )r  r  r]   r]   r`   unregister_aggregate  s    z#SqliteDatabase.unregister_aggregatec                 C   s   | j |= d S r\   )r  r  r]   r]   r`   unregister_collation  s    z#SqliteDatabase.unregister_collationc                 C   s   | j |= d S r\   )r  r  r]   r]   r`   unregister_function  s    z"SqliteDatabase.unregister_functionc                 C   s   | j |= d S r\   )r  r  r]   r]   r`   unregister_window_function  s    z)SqliteDatabase.unregister_window_functionc                 C   s6   t | jD ]\}}|j|kr
 q&q
dS | j| dS r  )r  r  r	  r  )r^   r	  r  r  r]   r]   r`   unregister_table_function  s    
z(SqliteDatabase.unregister_table_functionc                 C   s$   | d | jD ]}|| qd S r  )enable_load_extensionr  load_extension)r^   rH  	extensionr]   r]   r`   r    s    

zSqliteDatabase._load_extensionsc                 C   s4   | j | |  s0|  }|d || d S r  )r  r  rP  rk  r  r  )r^   r  rH  r]   r]   r`   r    s
    
zSqliteDatabase.load_extensionc                 C   s   | j | d S r\   )r  remove)r^   r  r]   r]   r`   unload_extension  s    zSqliteDatabase.unload_extensionc                 C   sP   || j kr(| j | |krdS td| || j |< |  sL| d||f  dS )NFzschema "%s" already attached.r  T)r  rE   rP  rp  )r^   filenamer	  r]   r]   r`   attach  s    

zSqliteDatabase.attachc                 C   s0   || j krdS | j |= |  s,| d|  dS )NFzDETACH DATABASE "%s"T)r  rP  rp  r  r]   r]   r`   detach  s    
zSqliteDatabase.detachc              
   C   sD   | j s|jS |tjkr@z|d d W S  tttfk
r>   Y nX |S r  )r  r{  r[  r
  r  r   	TypeErrorr|  r]   r]   r`   r    s    
zSqliteDatabase.last_insert_idc                 C   s*   z|j W S  tk
r$   |jj  Y S X d S r\   r}  r   rr  r~  r]   r]   r`   r    s    zSqliteDatabase.rows_affectedc                 C   s   |rd| nd}|  | d S )NzBEGIN %sr  rp  )r^   Z	lock_typer  r]   r]   r`   r    s    zSqliteDatabase.beginc              
   C   s(   t  | jj W  5 Q R  S Q R X d S r\   )rc  rY  rH  rm  r\  r]   r]   r`   rm    s    zSqliteDatabase.commitc              
   C   s(   t  | jj W  5 Q R  S Q R X d S r\   )rc  rY  rH  r  r\  r]   r]   r`   r    s    zSqliteDatabase.rollbackc                 C   s*   |pd}|  d| d}dd | D S )Nmainz>SELECT name FROM "%s".sqlite_master WHERE type=? ORDER BY namer  c                 S   s   g | ]
\}|qS r]   r]   ro  r]   r]   r`   r3    s     z-SqliteDatabase.get_tables.<locals>.<listcomp>rp  fetchall)r^   rQ  rr  r]   r]   r`   r  
  s    zSqliteDatabase.get_tablesc                 C   s"   d|pd }dd |  |dD S )NzCSELECT name, sql FROM "%s".sqlite_master WHERE type=? ORDER BY namer  c                 S   s   g | ]}t | qS r]   rD  ro  r]   r]   r`   r3    s     z,SqliteDatabase.get_views.<locals>.<listcomp>)viewr  )r^   rQ  r  r]   r]   r`   	get_views  s    zSqliteDatabase.get_viewsc           	         s   |pd}d| }|  |df}t| t |  d|f }| D ]*}|d }t|d dk}|rL| qLi  tD ],}|  d||f }dd	 | D  |< q fd
d	tD S )Nr  zVSELECT name, sql FROM "%s".sqlite_master WHERE tbl_name = ? AND type = ? ORDER BY namerL  zPRAGMA "%s".index_list("%s")r   rf   zPRAGMA "%s".index_info("%s")c                 S   s   g | ]}|d  qS )rf   r]   ro  r]   r]   r`   r3  +  s     z.SqliteDatabase.get_indexes.<locals>.<listcomp>c                    s(   g | ] }t ||  | |kqS r]   r>  r/  r	  Zindex_columnsZindex_to_sqlr  Zunique_indexesr]   r`   r3  -  s   )rp  rT  r  r  r   r  r  )	r^   r  rQ  r  rr  rp  r	  	is_uniquer  r]   r  r`   r    s0    zSqliteDatabase.get_indexesc                    s,   |  d|pd f } fdd| D S )NPRAGMA "%s".table_info("%s")r  c              
      s8   g | ]0}t |d  |d |d  t|d  |d qS )r   rf   r{   r  r  )r?  r  )r/  r   r  r]   r`   r3  9  s   z.SqliteDatabase.get_columns.<locals>.<listcomp>r  r^   r  rQ  rr  r]   r  r`   r  6  s    

zSqliteDatabase.get_columnsc                 C   s2   |  d|pd|f }dd tdd | D S )Nr  r  c                 S   s   g | ]}|d  qS )r   r]   ro  r]   r]   r`   r3  ?  s     z3SqliteDatabase.get_primary_keys.<locals>.<listcomp>c                 S   s   | d S r  r]   )r   r]   r]   r`   rr   ?  rs   z1SqliteDatabase.get_primary_keys.<locals>.<lambda>rp  r  r  r  r]   r]   r`   r  <  s    
zSqliteDatabase.get_primary_keysc                    s,   |  d|pd f } fdd| D S )Nz"PRAGMA "%s".foreign_key_list("%s")r  c                    s&   g | ]}t |d  |d |d  qS )r{   rf   r  rA  ro  r  r]   r`   r3  D  s   z3SqliteDatabase.get_foreign_keys.<locals>.<listcomp>r  r  r]   r  r`   r  A  s    

zSqliteDatabase.get_foreign_keysc                 C   s   t jS r\   )r  Binaryr\  r]   r]   r`   get_binary_typeG  s    zSqliteDatabase.get_binary_typec                 C   s6   |j r|j  nd}|r2|dkr2td|j   S d S )Nr  )nothingr   zINSERT OR %s)rC  rB  rP   upperr^   r`  r  rJ  r]   r]   r`   rO  J  s    z!SqliteDatabase.conflict_statementc                 C   s   | j dk r.t|j|j|j|j|jfr.td|jr>|j	 nd}|rR|dkrRd S |dkrbt
dS |jsx|jsxtdn|jrtdn|jstd	| ||S )
N)r{      r   zFSQLite does not support specifying which values to preserve or update.r  )r  r   r  r  zON CONFLICT DO NOTHINGzIf you are not performing any updates (or preserving any INSERTed values), then the conflict resolution action should be set to "NOTHING".zMSQLite does not support specifying named constraints for conflict resolution.zISQLite requires that a conflict target be specified when doing an upsert.)rd  r  rE  rD  rF  rG  rI  r  rC  rB  rP   rz  )r^   ocr  rJ  r]   r]   r`   rR  O  s$    


zSqliteDatabase.conflict_updatec                 C   s   t j||tdS N)r  )r4   r  r   r  r]   r]   r`   r  k  s    zSqliteDatabase.extract_datec                 C   s   t j||tdS r$  )r4   r  simple_date_timer  r]   r]   r`   r  n  s    zSqliteDatabase.truncate_datec                 C   s   t d|dS )Nr  integer)r4   r   r  r  r]   r]   r`   r  r  s    zSqliteDatabase.to_timestampc                 C   s   t |dS )NZ	unixepoch)r4   r   r  r]   r]   r`   r  u  s    zSqliteDatabase.from_timestamp)Nr  N)NrH  )NrH  )N)N)NrH  N)NrH  N)NrH  )NrH  )N)N)N)N)N)N)N)N)N)N)Srb   rc   rd   rS  r	  r  r  r  rT  r  r  r  r  rd  r  r]  r^  re  ra  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r   r  r  r  r  r  r	  r
  r  r  r  rm  r  r  r  r  r  r  r  r  rO  rR  r  r  r  r  ro  r]   r]   rl  r`   rQ     s   







  





		





!


c                
       s  e Zd Zdddddddddd		Zd
ddZdZeZdZdZ	dZ
dZdZd? fdd	Zdd Zdd Zdd Zd@ddZdd ZdAddZdBdd ZdCd!d"ZdDd#d$ZdEd%d&ZdFd'd(ZdGd)d*Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Z d9d: Z!d;d< Z"d=d> Z#  Z$S )HrF   ZSERIALZ	BIGSERIALZBYTEAZBOOLEANZ	TIMESTAMPNUMERICDOUBLE PRECISIONr  )	r	  r
  r   r  r  r  r  r  r  r   z~*)r   r   r  TFNc                    s*   || _ || _|| _tt| j|f| d S r\   )_register_unicode	_encoding_isolation_levelrk  rF   r^  )r^   r  Zregister_unicodeencodingr  rS  rl  r]   r`   r^    s    zPostgresqlDatabase.initc                 C   s   t d krtd| j }| jdr6|d| j n|d| j t jf |}| jrrt	
t	j| t	
t	j| | jr|| j | jr|| j d|_|S )NzPostgres driver not installed!zpostgresql://ZdsnZdbnameT)psycopg2r7   r]  r'  r  r  
setdefaultrQ  r)  pg_extensionsregister_typeUNICODEZUNICODEARRAYr*  Zset_client_encodingr+  Zset_isolation_levelr_  )r^   r  rH  r]   r]   r`   ra    s     
zPostgresqlDatabase._connectc                 C   s   |j | _ | j dkrd| _d S )Nia T)rd  r  rJ  r]   r]   r`   re    s    
z&PostgresqlDatabase._set_server_versionc                 C   s"   | j jrdS | j j }|tjk S r  )rY  rG  rH  Zget_transaction_statusr/  ZTRANSACTION_STATUS_INERROR)r^   Z
txn_statusr]   r]   r`   rj    s    z'PostgresqlDatabase.is_connection_usablec              
   C   s<   z|t jkr|n
|d d W S  tttfk
r6   Y nX d S r  )r[  r
  r  r   r  r|  r]   r]   r`   r    s    z!PostgresqlDatabase.last_insert_idc                 C   s*   z|j W S  tk
r$   |jj  Y S X d S r\   r  r~  r]   r]   r`   r    s    z PostgresqlDatabase.rows_affectedc              	   C   sD   |   r|   |rd| }nd}t |  | W 5 Q R X d S )Nz$BEGIN TRANSACTION ISOLATION LEVEL %sr  r  )r^   r  r  r]   r]   r`   r    s    
zPostgresqlDatabase.beginc                 C   s(   d}|  ||pdf}dd | D S )NzSSELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = %s ORDER BY tablenamepublicc                 S   s   g | ]
\}|qS r]   r]   r/  r  r]   r]   r`   r3    s     z1PostgresqlDatabase.get_tables.<locals>.<listcomp>r  r^   rQ  r  rr  r]   r]   r`   r    s    zPostgresqlDatabase.get_tablesc                 C   s(   d}|  ||pdf}dd | D S )Nz\SELECT viewname, definition FROM pg_catalog.pg_views WHERE schemaname = %s ORDER BY viewnamer2  c                 S   s    g | ]\}}t ||d qS )z 	;)rD  strip)r/  Z	view_namer  r]   r]   r`   r3    s   z0PostgresqlDatabase.get_views.<locals>.<listcomp>r  r4  r]   r]   r`   r    s
    zPostgresqlDatabase.get_viewsc                    s0   d}|  | d|pdf} fdd| D S )Na  
            SELECT
                i.relname, idxs.indexdef, idx.indisunique,
                array_to_string(ARRAY(
                    SELECT pg_get_indexdef(idx.indexrelid, k + 1, TRUE)
                    FROM generate_subscripts(idx.indkey, 1) AS k
                    ORDER BY k), ',')
            FROM pg_catalog.pg_class AS t
            INNER JOIN pg_catalog.pg_index AS idx ON t.oid = idx.indrelid
            INNER JOIN pg_catalog.pg_class AS i ON idx.indexrelid = i.oid
            INNER JOIN pg_catalog.pg_indexes AS idxs ON
                (idxs.tablename = t.relname AND idxs.indexname = i.relname)
            WHERE t.relname = %s AND t.relkind = %s AND idxs.schemaname = %s
            ORDER BY idx.indisunique DESC, i.relname;r   r2  c                    s0   g | ](\}}}}t ||d |d| qS )z ;,)r>  rstripr   )r/  r	  r  r  r  r  r]   r`   r3    s
   
 z2PostgresqlDatabase.get_indexes.<locals>.<listcomp>r  r^   r  rQ  r  rr  r]   r  r`   r    s
    
zPostgresqlDatabase.get_indexesc                    s@   d}|  ||pdf}t| |  fdd| D S )Nz
            SELECT column_name, is_nullable, data_type, column_default
            FROM information_schema.columns
            WHERE table_name = %s AND table_schema = %s
            ORDER BY ordinal_positionr2  c              	      s.   g | ]&\}}}}t |||d k| k|qS ZYESr?  r/  r	  r  r   dfpksr  r]   r`   r3    s   
z2PostgresqlDatabase.get_columns.<locals>.<listcomp>rp  r  r  r  r8  r]   r=  r`   r    s    zPostgresqlDatabase.get_columnsc                 C   s0   d}d}|  ||||pdf}dd | D S )Na  
            SELECT kc.column_name
            FROM information_schema.table_constraints AS tc
            INNER JOIN information_schema.key_column_usage AS kc ON (
                tc.table_name = kc.table_name AND
                tc.table_schema = kc.table_schema AND
                tc.constraint_name = kc.constraint_name)
            WHERE
                tc.constraint_type = %s AND
                tc.table_name = %s AND
                tc.table_schema = %sPRIMARY KEYr2  c                 S   s   g | ]
\}|qS r]   r]   )r/  pkr]   r]   r`   r3    s     z7PostgresqlDatabase.get_primary_keys.<locals>.<listcomp>r  )r^   r  rQ  r  ctyperr  r]   r]   r`   r    s    z#PostgresqlDatabase.get_primary_keysc                    s.   d}|  | |pdf} fdd| D S )Na%  
            SELECT DISTINCT
                kcu.column_name, ccu.table_name, ccu.column_name
            FROM information_schema.table_constraints AS tc
            JOIN information_schema.key_column_usage AS kcu
                ON (tc.constraint_name = kcu.constraint_name AND
                    tc.constraint_schema = kcu.constraint_schema AND
                    tc.table_name = kcu.table_name AND
                    tc.table_schema = kcu.table_schema)
            JOIN information_schema.constraint_column_usage AS ccu
                ON (ccu.constraint_name = tc.constraint_name AND
                    ccu.constraint_schema = tc.constraint_schema)
            WHERE
                tc.constraint_type = 'FOREIGN KEY' AND
                tc.table_name = %s AND
                tc.table_schema = %sr2  c                    s&   g | ]}t |d  |d |d  qS )r   r   rf   r  ro  r  r]   r`   r3    s   z7PostgresqlDatabase.get_foreign_keys.<locals>.<listcomp>r  r^   r  rQ  r  rr  r]   r  r`   r    s
    
z#PostgresqlDatabase.get_foreign_keysc                 C   s   |  d|f}t| d S )Nz
            SELECT COUNT(*) FROM pg_class, pg_namespace
            WHERE relkind='S'
                AND pg_class.relnamespace = pg_namespace.oid
                AND relname=%sr   )rp  r  r  )r^   sequenceresr]   r]   r`   r  "  s    z"PostgresqlDatabase.sequence_existsc                 C   s   t jS r\   )r-  r  r\  r]   r]   r`   r  *  s    z"PostgresqlDatabase.get_binary_typec                 C   s   d S r\   r]   rt  r]   r]   r`   rO  -  s    z%PostgresqlDatabase.conflict_statementc                 C   s   |j r|j  nd}|dkr\tdg}|jrF|tdd |jD  |td t|S |rr|dkrrtdn*|js|j	std	n|js|j
std
| ||S )Nr  )r  r  ru  c                 S   s"   g | ]}t |trt|n|qS r]   rt  r  r]   r]   r`   r3  5  s   z6PostgresqlDatabase.conflict_update.<locals>.<listcomp>z
DO NOTHINGr   z\The only supported actions for conflict resolution with Postgresql are "ignore" or "update".zIf you are not performing any updates (or preserving any INSERTed values), then the conflict resolution action should be set to "IGNORE".zKPostgres requires that a conflict target be specified when doing an upsert.)rC  rB  rP   rG  r_  rn  r  r  rD  rE  rI  rz  )r^   r#  r  rJ  r   r]   r]   r`   rR  0  s     



z"PostgresqlDatabase.conflict_updatec                 C   s   t t|td|fS NFROMr4   ZEXTRACTr  rP   r  r]   r]   r`   r  I  s    zPostgresqlDatabase.extract_datec                 C   s   t ||S r\   )r4   Z
DATE_TRUNCr  r]   r]   r`   r  L  s    z PostgresqlDatabase.truncate_datec                 C   s   |  d|S )NEPOCH)r  r  r]   r]   r`   r  O  s    zPostgresqlDatabase.to_timestampc                 C   s
   t |S r\   )r4   r  r  r]   r]   r`   r  R  s    z!PostgresqlDatabase.from_timestampc                 C   s    | t tdtdS )Nr  falser  r  r]   r]   r`   r  V  s    z"PostgresqlDatabase.get_noop_selectc                 C   s   |  d|  d S )Nzset time zone "%s";r  )r^   r   r]   r]   r`   set_time_zoneY  s    z PostgresqlDatabase.set_time_zone)TNN)N)N)N)N)N)N)N)N)%rb   rc   rd   rT  r  r  r  r  r  r  r  r  r  r^  ra  re  rj  r  r  r  r  r  r  r  r  r  r  r  rO  rR  r  r  r  r  r  rK  ro  r]   r]   rl  r`   rF   y  sV   

  









c                	       s  e Zd Zddddddddd	Zd
dddddZdZdZeZdZ	dZ
dZdZdZdZ fddZdd Zdd Zdd Zdd Zd d! ZdCd#d$ZdDd%d&ZdEd'd(ZdFd)d*ZdGd+d,ZdHd-d.ZdId/d0Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Z d;d< Z!d=d> Z"d?d@ Z#dAdB Z$  Z%S )JrB   zINTEGER AUTO_INCREMENTzBIGINT AUTO_INCREMENTr  r'  r(  r  zVARCHAR(40)zVARBINARY(16))r	  r
  r  r  r  r  r  r  zLIKE BINARYr   zREGEXP BINARYr   r   )r   r   r   r   r   r  z``Tl    FZPIPES_AS_CONCATc                    sJ   d| j dd}|| d|kr2tr2|d|d< tt| j|f| d S )Nr  T)charsetsql_modeZuse_unicodepasswordpasswd)rM  r   mysql_passwdr  rk  rB   r^  )r^   r  rS  r  rl  r]   r`   r^  x  s    
zMySQLDatabase.initc                 C   s.   t d krtdt jf | jdd| j}|S )NzMySQL driver not installed!T)r  r_  )mysqlr7   rQ  r  r]  rJ  r]   r]   r`   ra    s    zMySQLDatabase._connectc                 C   s8   z
|j }W n tk
r&   | }Y nX | || _ d S r\   )rd  r   Zget_server_info_extract_server_version)r^   rH  Zversion_rawr]   r]   r`   re    s
    
z!MySQLDatabase._set_server_versionc                 C   sd   |  }d|krtd|}ntd|}|d k	rRtdd | d dD S td|  d	S )
NZmariaz(1\d\.\d+\.\d+)z(\d\.\d+\.\d+)c                 s   s   | ]}t |V  qd S r\   )r   )r/  numr]   r]   r`   rF    s     z8MySQLDatabase._extract_server_version.<locals>.<genexpr>r   r+  z'Unable to determine MySQL version: "%s"r   )rB  r%  searchr9  groupsr   r   r   )r^   versionZ	match_objr]   r]   r`   rR    s     z%MySQLDatabase._extract_server_versionc                 C   s`   | j jrdS | j j}t|dr\| jd dkr2d}nd}z|j|  W n tk
rZ   Y dS X dS )NFpingr   r!  r]   r  T)rY  rG  rH  r  rd  rW  r  )r^   rH  rR  r]   r]   r`   rj    s    
z"MySQLDatabase.is_connection_usablec                 C   s
   | dS )Nz() VALUES ()r  r  r]   r]   r`   r    s    z#MySQLDatabase.default_values_insertNc              	   C   sH   |   r|   t* |  }|r0|d|  |d W 5 Q R X d S )Nz"SET TRANSACTION ISOLATION LEVEL %sr  r  )r^   r  Zcursr]   r]   r`   r    s    zMySQLDatabase.beginc                 C   s   d}dd |  |dD S )NzySELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_type != %s ORDER BY table_namec                 S   s   g | ]
\}|qS r]   r]   r3  r]   r]   r`   r3    s     z,MySQLDatabase.get_tables.<locals>.<listcomp>)ZVIEWr  )r^   rQ  r  r]   r]   r`   r    s    zMySQLDatabase.get_tablesc                 C   s    d}|  |}dd | D S )NztSELECT table_name, view_definition FROM information_schema.views WHERE table_schema = DATABASE() ORDER BY table_namec                 S   s   g | ]}t | qS r]   r  ro  r]   r]   r`   r3    s     z+MySQLDatabase.get_views.<locals>.<listcomp>r  r4  r]   r]   r`   r    s    
zMySQLDatabase.get_viewsc                    sx   |  d }t i  | D ]@}|d s:|d   |d g   |d  |d  q  fdd D S )NSHOW INDEX FROM `%s`r   rf   r  c                    s$   g | ]}t |d  | |kqS r\   r  r  indexesr  r  r]   r`   r3    s   z-MySQLDatabase.get_indexes.<locals>.<listcomp>)rp  r  r  r  r.  r_  )r^   r  rQ  rr  rp  r]   rY  r`   r    s    zMySQLDatabase.get_indexesc                    s8   d}|  |f}t|   fdd| D S )Nz
            SELECT column_name, is_nullable, data_type, column_default
            FROM information_schema.columns
            WHERE table_name = %s AND table_schema = DATABASE()
            ORDER BY ordinal_positionc              	      s.   g | ]&\}}}}t |||d k| k|qS r9  r:  r;  r=  r]   r`   r3    s   
z-MySQLDatabase.get_columns.<locals>.<listcomp>r?  rC  r]   r=  r`   r    s    zMySQLDatabase.get_columnsc                 C   s*   |  d| }dd tdd | D S )NrX  c                 S   s   g | ]}|d  qS )r  r]   ro  r]   r]   r`   r3    s     z2MySQLDatabase.get_primary_keys.<locals>.<listcomp>c                 S   s   | d dkS )Nrf   ZPRIMARYr]   rp  r]   r]   r`   rr     rs   z0MySQLDatabase.get_primary_keys.<locals>.<lambda>r  r  r]   r]   r`   r    s    zMySQLDatabase.get_primary_keysc                    s(   d}|  | f} fdd| D S )Na@  
            SELECT column_name, referenced_table_name, referenced_column_name
            FROM information_schema.key_column_usage
            WHERE table_name = %s
                AND table_schema = DATABASE()
                AND referenced_table_name IS NOT NULL
                AND referenced_column_name IS NOT NULLc                    s    g | ]\}}}t ||| qS r]   r  )r/  rR  rB  rC  r  r]   r`   r3    s   z2MySQLDatabase.get_foreign_keys.<locals>.<listcomp>r  r8  r]   r  r`   r    s
    
zMySQLDatabase.get_foreign_keysc                 C   s   t jS r\   )rQ  r  r\  r]   r]   r`   r    s    zMySQLDatabase.get_binary_typec                 C   sH   |j s
d S |j  }|dkr$tdS |dkr4tdS |dkrDtdd S )Nr   r^  r  zINSERT IGNOREr   zWUn-supported action for conflict resolution. MySQL supports REPLACE, IGNORE and UPDATE.)rC  rB  rP   r  r!  r]   r]   r`   rO    s     
z MySQLDatabase.conflict_statementc                 C   s   |j s|js|jrtdg }|jr| jp,d}|d dkrJ|dkrJtj}ntj}|jD ]0}t	|}t
t	|td||f}|| qV|jr|j D ]f\}	}
t|
tst|	trt|j|	}	t|	tr|	|
}
nt|
dd}
|t
t	|	td|
f q|rt
td	t|fS d S )
NzfMySQL does not support the specification of where clauses or conflict targets for conflict resolution.)r   r   
   )r\  r{   r{   r   Fr  zON DUPLICATE KEY UPDATE)rF  rG  rI  r  rE  rd  r4   VALUEZVALUESr>  r  rP   r_  rD  rZ  rp   r<  ru  r   r  r1   r  rX   rr  )r^   r`  r  rx  rV  ZVALUE_FNrR  entityry  r  r  r]   r]   r`   rR    s>    




zMySQLDatabase.conflict_updatec                 C   s   t tt|td|fS rF  rH  r  r]   r]   r`   r  )  s    zMySQLDatabase.extract_datec                 C   s   t j|t| tdS r$  )r4   ZDATE_FORMAT__mysql_date_trunc__r%  r  r]   r]   r`   r  ,  s    zMySQLDatabase.truncate_datec                 C   s
   t |S r\   )r4   ZUNIX_TIMESTAMPr  r]   r]   r`   r  0  s    zMySQLDatabase.to_timestampc                 C   s
   t |S r\   )r4   ZFROM_UNIXTIMEr  r]   r]   r`   r  3  s    zMySQLDatabase.from_timestampc                 C   s   t  S r\   )r4   randr\  r]   r]   r`   r  6  s    zMySQLDatabase.randomc                 C   s
   | dS )NzDO 0r  r  r]   r]   r`   r  9  s    zMySQLDatabase.get_noop_select)N)N)N)N)N)N)N)&rb   rc   rd   rT  r  r  r5  r  r  r  r  r  r  r  rM  r^  ra  re  rR  rj  r  r  r  r  r  r  r  r  r  rO  rR  r  r  r  r  r  r  ro  r]   r]   rl  r`   rB   ]  s\   









+c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
rx  c                 C   s
   || _ d S r\   rN  rO  r]   r]   r`   r]  A  s    z_manual.__init__c                    s   t   fdd}|S )Nc               
      s,   t j  | |W  5 Q R  S Q R X d S r\   )rx  r  rQ  rT  r]   r`   rU  E  s    z_manual.__call__.<locals>.innerr   rV  r]   rT  r`   rW  D  s    z_manual.__call__c                 C   s4   | j  }|d k	r$t|ts$td| j |  d S )Nz?Cannot enter manual commit block while a transaction is active.)r  r  rp   rx  r  r  )r^   topr]   r]   r`   rh  K  s    
z_manual.__enter__c                 C   s   | j  | k	rtdd S )Nz>Transaction stack corrupted while exiting manual commit block.)r  r  r  r  r]   r]   r`   ri  R  s    z_manual.__exit__NrI  r]   r]   r]   r`   rx  @  s   rx  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ru  c                 O   s   || _ ||f| _d S r\   )r  _transaction_argsr^   r  rR  rS  r]   r]   r`   r]  Y  s    z_atomic.__init__c                    s   t   fdd}|S )Nc               
      s>   j \}}tjf||  | |W  5 Q R  S Q R X d S r\   )rb  ru  r  rR  rS  r@  r  rT  r]   r`   rU  ^  s    
z_atomic.__call__.<locals>.innerr   rV  r]   rT  r`   rW  ]  s    z_atomic.__call__c                 C   sZ   | j  dkr*| j\}}| j j||| _n&t| j  trDtdn| j 	 | _| j
 S )Nr   z=Cannot enter atomic commit block while in manual commit mode.)r  r  rb  r|  _helperrp   r  rx  r  r  rh  rc  r]   r]   r`   rh  e  s    

z_atomic.__enter__c                 C   s   | j |||S r\   )re  ri  r  r]   r]   r`   ri  p  s    z_atomic.__exit__NrI  r]   r]   r]   r`   ru  X  s   ru  c                   @   sH   e Zd Zdd Zdd Zdd Zddd	Zdd
dZdd Zdd Z	dS )r{  c                 O   s   || _ ||f| _d S r\   )r  _begin_argsrc  r]   r]   r`   r]  u  s    z_transaction.__init__c                    s   t   fdd}|S )Nc               
      s>   j \}}tjf||  | |W  5 Q R  S Q R X d S r\   )rf  r{  r  rd  rT  r]   r`   rU  z  s    
z$_transaction.__call__.<locals>.innerr   rV  r]   rT  r`   rW  y  s    z_transaction.__call__c                 C   s   | j \}}| jj|| d S r\   )rf  r  r  rc  r]   r]   r`   _begin  s    
z_transaction._beginTc                 C   s   | j   |r|   d S r\   )r  rm  rg  r^   r  r]   r]   r`   rm    s    
z_transaction.commitc                 C   s   | j   |r|   d S r\   )r  r  rg  rh  r]   r]   r`   r    s    
z_transaction.rollbackc                 C   s&   | j  dkr|   | j |  | S r  )r  r  rg  r  r\  r]   r]   r`   rh    s    z_transaction.__enter__c                 C   sh   | j  }zL|r$|dkr$| d n0|dkrTz| d W n   | d  Y nX W 5 | j   X d S Nr   F)r  r  r  r  rm  )r^   r  r  r  depthr]   r]   r`   ri    s    

z_transaction.__exit__N)T)T
rb   rc   rd   r]  rW  rg  rm  r  rh  ri  r]   r]   r]   r`   r{  t  s   

r{  c                   @   sH   e Zd ZdddZdd Zdd Zdd	d
Zdd Zdd Zdd Z	dS )r~  Nc                 C   s0   || _ |pdt j | _| j| j j| _d S )Nrl   )r  uuiduuid4hexsidr-  r5  
quoted_sid)r^   r  ro  r]   r]   r`   r]    s    z_savepoint.__init__c                    s   t   fdd}|S )Nc               
      s,   t j  | |W  5 Q R  S Q R X d S r\   )r~  r  rQ  rT  r]   r`   rU    s    z"_savepoint.__call__.<locals>.innerr   rV  r]   rT  r`   rW    s    z_savepoint.__call__c                 C   s   | j d| j  d S )NzSAVEPOINT %s;r  rp  rp  r\  r]   r]   r`   rg    s    z_savepoint._beginTc                 C   s"   | j d| j  |r|   d S )NzRELEASE SAVEPOINT %s;)r  rp  rp  rg  rh  r]   r]   r`   rm    s     z_savepoint.commitc                 C   s   | j d| j  d S )NzROLLBACK TO SAVEPOINT %s;rq  r\  r]   r]   r`   r    s    z_savepoint.rollbackc                 C   s   |    | S r\   )rg  r\  r]   r]   r`   rh    s    z_savepoint.__enter__c                 C   s:   |r|    n(z| jdd W n   |     Y nX d S )NFr  )r  rm  r  r]   r]   r`   ri    s    
z_savepoint.__exit__)N)Trk  r]   r]   r]   r`   r~    s   

r~  c                   @   sX   e Z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 Z
dddZdS )rn  c                 C   s(   || _ d| _d| _d| _d| _g | _d S )Nr   F)rr  r  rL  initialized	populatedr{  r~  r]   r]   r`   r]    s    zCursorWrapper.__init__c                 C   s   | j rt| jS t| S r\   )rs  rK  r{  ResultIteratorr\  r]   r]   r`   r    s    
zCursorWrapper.__iter__c                 C   st   t |tr>|j}|d ks |dk r*|   n
| | | j| S t |trh| |dkrX|nd | j| S tdd S )Nr   z6CursorWrapper only supports integer and slice indexes.)rp   r  r  rz  r{  r   r  )r^   r  r  r]   r]   r`   r    s    





zCursorWrapper.__getitem__c                 C   s   |    | jS r\   )rz  r  r\  r]   r]   r`   r|    s    zCursorWrapper.__len__c                 C   s   d S r\   r]   r\  r]   r]   r`   r[    s    zCursorWrapper.initializeTc                 C   sh   | j  }|d kr(d| _| j   tn| js<|   d| _|  jd7  _| |}|rd| j	
| |S )NTr   )rr  r  rs  rR  r  rr  r[  r  process_rowr{  r_  )r^   cacherp  r4  r]   r]   r`   iterate  s    


zCursorWrapper.iteratec                 C   s   |S r\   r]   r^   rp  r]   r]   r`   ru     s    zCursorWrapper.process_rowc                 c   s.   z|  dV  W q  tk
r&   Y dS X q dS )z1Efficient one-pass iteration over the result set.FN)rw  r  r\  r]   r]   r`   rw    s    zCursorWrapper.iteratorr   c                 C   sh   |p
t d}|dk rtdt| }| j|_| jsd|| jkrdz|  W q, tk
r`   Y qdY q,X q,d S )NZInfr   z"Negative values are not supported.)floatr  rt  r  rL  rs  r  r  )r^   rN  rw  r]   r]   r`   rz    s    zCursorWrapper.fill_cacheN)T)r   )rb   rc   rd   r]  r  r  r|  r[  rw  ru  rw  rz  r]   r]   r]   r`   rn    s   
rn  c                   @   s$   e Zd Zdd ZeZdd ZeZdS )rm  c                 C   s&   | j j}dd |D | _t|| _d S )Nc                 S   s0   g | ](}|d  |d   dd d dqS r   r+  r   N()"`rfindr5  r/  r   r]   r]   r`   r3    s   z9DictCursorWrapper._initialize_columns.<locals>.<listcomp>)rr  descriptionr  r   ncolsr^   r  r]   r]   r`   _initialize_columns  s
    z%DictCursorWrapper._initialize_columnsc                 C   s.   i }t | jD ]}|| j| ||  q|S r\   )r  r  r.  r  )r^   rp  r4  r3  r]   r]   r`   _row_to_dict"  s    zDictCursorWrapper._row_to_dictN)rb   rc   rd   r  r[  r  ru  r]   r]   r]   r`   rm    s   rm  c                   @   s   e Zd Zdd Zdd ZdS )ro  c                 C   s$   | j j}tddd |D | _d S )NRowc                 S   s0   g | ](}|d  |d   dd d dqS rz  r|  r~  r]   r]   r`   r3  .  s    z6NamedTupleCursorWrapper.initialize.<locals>.<listcomp>)rr  r  collections
namedtupletuple_classr  r]   r]   r`   r[  ,  s    z"NamedTupleCursorWrapper.initializec                 C   s
   | j | S r\   r  rx  r]   r]   r`   ru  1  s    z#NamedTupleCursorWrapper.process_rowN)rb   rc   rd   r[  ru  r]   r]   r]   r`   ro  +  s   ro  c                       s$   e Zd Z fddZdd Z  ZS )rp  c                    s   t t| | || _d S r\   )rk  rp  r]  rj  )r^   rr  rj  rl  r]   r`   r]  6  s    zObjectCursorWrapper.__init__c                 C   s   |  |}| jf |S r\   )r  rj  )r^   rp  Zrow_dictr]   r]   r`   ru  :  s    
zObjectCursorWrapper.process_rowrb   rc   rd   r]  ru  ro  r]   r]   rl  r`   rp  5  s   rp  c                   @   s(   e Zd Zdd Zdd Zdd ZeZdS )rt  c                 C   s   || _ d| _d S r  )cursor_wrapperrL  )r^   r  r]   r]   r`   r]  @  s    zResultIterator.__init__c                 C   s   | S r\   r]   r\  r]   r]   r`   r  D  s    zResultIterator.__iter__c                 C   sV   | j | jjk r| jj| j  }n&| jjs@| j  | jj| j  }nt|  j d7  _ |S r  )rL  r  r  r{  rs  rw  r  r  r]   r]   r`   r  G  s    
zResultIterator.nextN)rb   rc   rd   r]  r  r  __next__r]   r]   r]   r`   rt  ?  s   rt  c                   @   s&   e Zd Zdd ZdddZdd ZdS )	FieldAccessorc                 C   s   || _ || _|| _d S r\   )r|  r#  r	  r^   r|  r#  r	  r]   r]   r`   r]  W  s    zFieldAccessor.__init__Nc                 C   s   |d k	r|j | jS | jS r\   )__data__r  r	  r#  r  r]   r]   r`   r  \  s    zFieldAccessor.__get__c                 C   s   ||j | j< |j| j d S r\   )r  r	  _dirtyr  r^   r  rx   r]   r]   r`   r  a  s    zFieldAccessor.__set__)N)rb   rc   rd   r]  r  r  r]   r]   r]   r`   r  V  s   
r  c                       s6   e Zd Z fddZdd Zd
ddZdd	 Z  ZS )ForeignKeyAccessorc                    s    t t| ||| |j| _d S r\   )rk  r  r]  	rel_modelr  rl  r]   r`   r]  g  s    zForeignKeyAccessor.__init__c                 C   s   |j | j}|d k	s"| j|jkrf| j|jkrV| jjrV| j| jj|k}||j| j< |j| j|S | jjs~| jjr~| jj	|S r\   )
r  r  r	  __rel__r#  	lazy_loadr  	rel_fieldr  r-   )r^   r  rx   rY  r]   r]   r`   get_rel_instancek  s    z#ForeignKeyAccessor.get_rel_instanceNc                 C   s   |d k	r|  |S | jS r\   )r  r#  r  r]   r]   r`   r  v  s    
zForeignKeyAccessor.__get__c                 C   s   t || jr2t|| jjj|j| j< ||j| j< n@|j| j}||j| j< ||ks\|d krr| j|jkrr|j| j= |j	
| j d S r\   )rp   r  r   r#  r  r	  r  r  r  r  r  )r^   r  rY  Zfk_valuer]   r]   r`   r  {  s    

zForeignKeyAccessor.__set__)N)rb   rc   rd   r]  r  r  r  ro  r]   r]   rl  r`   r  f  s   
r  c                   @   s   e Zd Zdd ZdddZdS )BackrefAccessorc                 C   s   || _ |j| _|j| _d S r\   )r#  r  r|  r^   r#  r]   r]   r`   r]    s    zBackrefAccessor.__init__Nc                 C   s2   |d k	r.| j jj}| j | j t||kS | S r\   )r#  r  r	  r  r  r  r   )r^   r  r  r  r]   r]   r`   r    s    

zBackrefAccessor.__get__)N)rb   rc   rd   r]  r  r]   r]   r]   r`   r    s   r  c                   @   s*   e Zd ZdZdd Zd	ddZdd ZdS )
ObjectIdAccessorz(Gives direct access to the underlying idc                 C   s
   || _ d S r\   )r#  r  r]   r]   r`   r]    s    zObjectIdAccessor.__init__Nc                 C   sV   |d k	rP|j | jj}|d krL| jj|jkrL|j| jj }t|| jjj}|S | jS r\   )r  r  r#  r	  r  r   r  )r^   r  r  rx   Zrel_objr]   r]   r`   r    s    zObjectIdAccessor.__get__c                 C   s   t || jj| d S r\   )rO  r#  r	  r  r]   r]   r`   r    s    zObjectIdAccessor.__set__)N)rb   rc   rd   rn  r]  r  r  r]   r]   r]   r`   r    s   

r  c                   @   s   e Zd ZdZdZeZdZdZdZ	dZ
d"ddZdd	 Zd
d Z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 d! ZdS )$r1   r   FNr  Tc                 C   s   |d k	rt d |}|| _|| _|| _|| _|| _|| _|| _|| _|	| _	|
| _
|| _|| _|| _|pj| j| _|| _t jd7  _tj| _| jrdpd| jf| _d S )NzL"db_column" has been deprecated in favor of "column_name" for Field objects.r   rf   )r   r  rL  r  r  r&  rP  r\  rD  r  	unindexedchoices	help_textverbose_namedefault_index_typer   _hiddenr1   _field_counter_order	_sort_key)r^   r  rL  r  r  r&  rP  r\  rD  r  r  r  r  r  r   Z	db_columnr  r]   r]   r`   r]    s*    zField.__init__c                 C   s   t | jd | jj S r  )r$  r	  r|  rb   r\  r]   r]   r`   r&    s    zField.__hash__c                 C   s>   t | dr0t| dd r0dt| j| jj| jf S dt| j S )Nr|  r	  z<%s: %s.%s>z<%s: (unbound)>)r  r   r  rb   r|  r	  r\  r]   r]   r`   __repr__  s    
zField.__repr__c                 C   s<   || _ | | _| _| jp|| _|r8t||| || | d S r\   )r|  r	  	safe_namer  rO  accessor_classr^   r|  r	  set_attributer]   r]   r`   r3    s
    z
Field.bindc                 C   s   t | jjj| jS r\   )r    r|  r  r  r  r\  r]   r]   r`   rR    s    zField.columnc                 C   s   |S r\   r]   r  r]   r]   r`   adapt  s    zField.adaptc                 C   s   |d kr|S |  |S r\   r  r  r]   r]   r`   r    s    zField.db_valuec                 C   s   |d kr|S |  |S r\   r  r  r]   r]   r`   r    s    zField.python_valuec                 C   s   t || jddS r  )rX   r  r  r]   r]   r`   r    s    zField.to_valuec                 C   s   | j S r\   )r  r  r]   r]   r`   r    s    zField.get_sort_keyc                 C   s   | | jS r\   )r  rR  r  r]   r]   r`   r    s    zField.__sql__c                 C   s   d S r\   r]   r\  r]   r]   r`   get_modifiers  s    zField.get_modifiersc                 C   sh   |r"|j jr"|j j| j| j}n| j}|  }|r\|r\ddd |D }td||f S t|S d S )Nr  c                 S   s   g | ]}t |qS r]   r  )r/  r   r]   r]   r`   r3    s     z&Field.ddl_datatype.<locals>.<listcomp>z%s(%s))r  rT  r  
field_typer  r-  rP   )r^   r  Zcolumn_type	modifiersZmodifier_literalr]   r]   r`   ddl_datatype  s    zField.ddl_datatypec                 C   s   t | jg}| |}|r$|| | jr8|td | jsL|td | jr`|td | jrz|td| j  | j	r|
| j	 | jr|td| j  t|S )NZ	UNINDEXEDzNOT NULLr@  zDEFAULT NEXTVAL('%s')r  )r=  r  r  r_  r  rP   r  rP  rD  r\  r  r  r  )r^   r  r   r@  r]   r]   r`   ddl  s"    

z	Field.ddl)FFFNNFNNNFNNNNNF)T)rb   rc   rd   r  r  r  r  auto_incrementr  r  r  r]  r&  r  r3  r  rR  r  r  r  r  r  r  r  r  r  r]   r]   r]   r`   r1     sF                        
 

c                   @   s   e Zd ZdZdS )r   ANYNrb   rc   rd   r  r]   r]   r]   r`   r     s   c                   @   s   e Zd ZdZdd ZdS )r9   r  c                 C   s(   z
t |W S  tk
r"   | Y S X d S r\   )r   r  r  r]   r]   r`   r  &  s    
zIntegerField.adaptNrb   rc   rd   r  r  r]   r]   r]   r`   r9   #  s   c                   @   s   e Zd ZdZdS )r   r   Nr  r]   r]   r]   r`   r   -  s   c                   @   s   e Zd ZdZdS )rN   r   Nr  r]   r]   r]   r`   rN   1  s   c                       s$   e Zd ZdZdZ fddZ  ZS )r   Tr	  c                    s<   | ddkrtdt|  d|d< tt| j|| d S )NrP  Fz %s must always be a primary key.T)r  r  r  rk  r   r]  rc  rl  r]   r`   r]  9  s    zAutoField.__init__)rb   rc   rd   r  r  r]  ro  r]   r]   rl  r`   r   5  s   c                   @   s   e Zd ZdZdS )r   r
  Nr  r]   r]   r]   r`   r   @  s   c                       s"   e Zd ZdZd fdd	Z  ZS )r6   z$INT GENERATED BY DEFAULT AS IDENTITYFc                    s    |r
d| _ tt| jf | d S )Nz INT GENERATED ALWAYS AS IDENTITY)r  rk  r6   r]  )r^   Zgenerate_alwaysrS  rl  r]   r`   r]  G  s    zIdentityField.__init__)F)rb   rc   rd   r  r]  ro  r]   r]   rl  r`   r6   D  s   c                       s   e Zd Z fddZ  ZS )rG   c                    s   t d tt| j|| d S )Nz"PrimaryKeyField" has been renamed to "AutoField". Please update your code accordingly as this will be completely removed in a subsequent release.)r   rk  rG   r]  rc  rl  r]   r`   r]  N  s    zPrimaryKeyField.__init__r3  r]   r]   rl  r`   rG   M  s   c                   @   s   e Zd ZdZdd ZdS )r3   r  c                 C   s(   z
t |W S  tk
r"   | Y S X d S r\   )ry  r  r  r]   r]   r`   r  X  s    
zFloatField.adaptNr  r]   r]   r]   r`   r3   U  s   c                   @   s   e Zd ZdZdS )r.   r  Nr  r]   r]   r]   r`   r.   _  s   c                       s:   e Zd ZdZd fdd	Zdd	 Zd
d Zdd Z  ZS )r)   r  r\  r  FNc                    sJ   || _ || _|| _|ptjj| _td| j  | _tt	| j
|| d S )Nr\  )
max_digitsdecimal_places
auto_rounddecimalDefaultContextroundingDecimal_exprk  r)   r]  )r^   r  r  r  r  rR  rS  rl  r]   r`   r]  f  s    zDecimalField.__init__c                 C   s   | j | jgS r\   )r  r  r\  r]   r]   r`   r  o  s    zDecimalField.get_modifiersc                 C   sF   t j}|s|d kr|S |dS | jrB|t|}|j| j| jdS |S )Nr   )r  )r  r  r  r  quantizer  r  )r^   rx   DZdecimal_valuer]   r]   r`   r  r  s    zDecimalField.db_valuec                 C   s*   |d k	r&t |tjr|S tt|S d S r\   )rp   r  r  r  r  r]   r]   r`   r  {  s    zDecimalField.python_value)r\  r  FN)	rb   rc   rd   r  r]  r  r  r  ro  r]   r]   rl  r`   r)   c  s     		c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_StringFieldc                 C   s*   t |tr|S t |tr"|dS t|S )Nr*  )rp   r  r  r   r  r]   r]   r`   r    s
    


z_StringField.adaptc                 C   s   t | tj|S r\   r  r'  r]   r]   r`   r     rs   z_StringField.__add__c                 C   s   t |tj| S r\   r  r'  r]   r]   r`   rB    rs   z_StringField.__radd__N)rb   rc   rd   r  r   rB  r]   r]   r]   r`   r    s   r  c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )r   r     c                    s   || _ tt| j|| d S r\   )
max_lengthrk  r   r]  )r^   r  rR  rS  rl  r]   r`   r]    s    zCharField.__init__c                 C   s   | j r| j gpd S r\   )r  r\  r]   r]   r`   r    s    zCharField.get_modifiers)r  )rb   rc   rd   r  r]  r  ro  r]   r]   rl  r`   r     s   c                       s    e Zd ZdZ fddZ  ZS )r2   r  c                    s    t t| |}|r| }|S r\   )rk  r2   r  r5  r  rl  r]   r`   r    s    zFixedCharField.python_value)rb   rc   rd   r  r  ro  r]   r]   rl  r`   r2     s   c                   @   s   e Zd ZdZdS )rS   r  Nr  r]   r]   r]   r`   rS     s   c                       s2   e Zd ZdZdd Zd	 fdd	Zdd Z  ZS )
r   r   c                 C   s   |d krt | _n
| | _d S r\   )	bytearrayrb  r  rT  r]   r]   r`   _db_hook  s    zBlobField._db_hookTc                    s`   t | _|jjr<t|jjtr.|jj| j n| |jj |jj	| j t
t| |||S r\   )r  rb  r  r  rp   rK   r`  r  	_db_hooksr_  rk  r   r3  r  rl  r]   r`   r3    s    zBlobField.bindc                 C   s,   t |tr|d}t |tr(| |S |S )Nr  )rp   r  r.  r  rb  r  r]   r]   r`   r    s
    



zBlobField.db_value)T)rb   rc   rd   r  r  r3  r  ro  r]   r]   rl  r`   r     s   c                       s&   e Zd Z fddZdddZ  ZS )r   c                    s(   | dd tt| j|| d| _d S )Nr&  r   r   )r.  rk  r   r]  _BitField__current_flagrc  rl  r]   r`   r]    s    zBitField.__init__Nc                    sF   |d kr| j }|  j dK  _ n
|d> | _ G  fdddt  | |S )Nr   c                       sH   e Zd Z fddZdd Zdd Zddd	Zd
d Zdd Z  Z	S )z%BitField.flag.<locals>.FlagDescriptorc                    s   || _ || _t |   d S r\   )_field_valuerk  r]  )r^   r#  rx   )FlagDescriptorrm  r]   r`   r]    s    z.BitField.flag.<locals>.FlagDescriptor.__init__c                 S   s   | j | j S r\   )r  r  r  r\  r]   r]   r`   clear  s    z+BitField.flag.<locals>.FlagDescriptor.clearc                 S   s   | j | jS r\   )r  r  r  r\  r]   r]   r`   r    s    z)BitField.flag.<locals>.FlagDescriptor.setNc                 S   s,   |d kr| S t || jjpd}|| j@ dkS r  )r   r  r	  r  )r^   r  r  rx   r]   r]   r`   r    s    z-BitField.flag.<locals>.FlagDescriptor.__get__c                 S   sR   |dkrt dt|| jjp d}|r2|| jO }n|| j M }t|| jj| d S )N)TFz"Value must be either True or Falser   )r  r   r  r	  r  rO  )r^   r  is_setrx   r]   r]   r`   r    s    z-BitField.flag.<locals>.FlagDescriptor.__set__c                 S   s   | | j| jdkS r  )r  r  r  r  r  r]   r]   r`   r    s    z-BitField.flag.<locals>.FlagDescriptor.__sql__)N)
rb   rc   rd   r]  r  r  r  r  r  ro  r]   r  rl  r`   r    s   
	r  )r  r  r  r]   r  r`   flag  s    
zBitField.flag)N)rb   rc   rd   r]  r  ro  r]   r]   rl  r`   r     s   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	e	Z
dd Ze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ejd! d"k rd#d$ Znd%d& Zd'S )(BigBitFieldDatac                 C   sR   || _ || _| j j| j}|s(t }nt|ts:t|}| | _| j j| j< d S r\   )r  r	  r  r  r  rp   _buffer)r^   r  r	  rx   r]   r]   r`   r]    s    
zBigBitFieldData.__init__c                 C   s   | j   d S r\   )r  r  r\  r]   r]   r`   r    s    zBigBitFieldData.clearc                 C   s@   t |d\}}t| j}||kr8| jd|d |   ||fS )Nr!      r   )divmodr   r  r  r^   r  byte_numbyte_offsetZcur_sizer]   r]   r`   _ensure_length  s
    
zBigBitFieldData._ensure_lengthc                 C   s(   |  |\}}| j|  d|> O  < d S r  r  r  r^   r  r  r  r]   r]   r`   set_bit  s    zBigBitFieldData.set_bitc                 C   s*   |  |\}}| j|  d|>  M  < d S r  r  r  r]   r]   r`   	clear_bit  s    zBigBitFieldData.clear_bitc                 C   s:   |  |\}}| j|  d|> N  < t| j| d|> @ S r  )r  r  r  r  r]   r]   r`   
toggle_bit  s    zBigBitFieldData.toggle_bitc                 C   s:   t |d\}}t| j}||kr$dS t| j| d|> @ S )Nr!  Fr   )r  r   r  r  r  r]   r]   r`   r    s
    
zBigBitFieldData.is_setc                 C   s   |r|  |n| | d S r\   )r  r  )r^   r  rx   r]   r]   r`   r    s    zBigBitFieldData.__setitem__c                 C   s
   t | jS r\   )r   r  r\  r]   r]   r`   r|    s    zBigBitFieldData.__len__c                 C   s\   t |tr|j}nt |tttfr(|}ntdt|t|  }|dkrX| jd|  |S )NIncompatible data-typer   r  )	rp   r  r  bytesr  
memoryviewr  r   r  )r^   r(  datadiffr]   r]   r`   _get_compatible_data   s    
 z$BigBitFieldData._get_compatible_datac           	      C   s   t |tr|j}nt |tttfr(|}ntdtdtt| t| }t	j
| j|dd}t|D ]\}\}}|||||< qd|S )Nr  r  r   )rG  )rp   r  r  r  r  r  r  maxr   r  zip_longestr  )	r^   r(  r-  r  bufrM  r3  r@  br]   r]   r`   _bitwise_op+  s    
zBigBitFieldData._bitwise_opc                 C   s   |  |tjS r\   )r  rW  rX  r'  r]   r]   r`   r=  8  s    zBigBitFieldData.__and__c                 C   s   |  |tjS r\   )r  rW  r  r'  r]   r]   r`   r?  :  s    zBigBitFieldData.__or__c                 C   s   |  |tjS r\   )r  rW  xorr'  r]   r]   r`   r  <  s    zBigBitFieldData.__xor__c                 c   s4   | j D ](}tdD ]}|d|> @ r&dndV  qqd S )Nr!  r   r   )r  r  )r^   r  jr]   r]   r`   r  ?  s    
zBigBitFieldData.__iter__c                 C   s
   t | jS r\   )reprr  r\  r]   r]   r`   r  D  s    zBigBitFieldData.__repr__r   r{   c                 C   s
   t | jS r\   r  r  r\  r]   r]   r`   r}  G  s    zBigBitFieldData.__str__c                 C   s
   t | jS r\   r  r\  r]   r]   r`   	__bytes__J  s    zBigBitFieldData.__bytes__N)rb   rc   rd   r]  r  r  r  r  r  r  r  r  __delitem__r|  r  r  r=  r?  r  r  r  rh   version_infor}  r  r]   r]   r]   r`   r    s*   

r  c                       s&   e Zd ZdddZ fddZ  ZS )BigBitFieldAccessorNc                 C   s   |d kr| j S t|| jS r\   )r#  r  r	  r  r]   r]   r`   r  O  s    zBigBitFieldAccessor.__get__c                    s   t |tr| }nft |tr(t|}nRt |tr<t|}n>t |trRt|j}n(t |t	rh|
d}nt |tsztdtt| || d S )Nr*  zEValue must be either a bytes, memoryview or BigBitFieldData instance.)rp   r  tobytesbuffer_typer  r  r  r  r  r  r.  r  rk  r  r  r  rl  r]   r`   r  S  s    








zBigBitFieldAccessor.__set__)N)rb   rc   rd   r  r  ro  r]   r]   rl  r`   r  N  s   
r  c                       s(   e Zd ZeZ fddZdd Z  ZS )r   c                    s"   | dt tt| j|| d S )Nr&  )r.  r  rk  r   r]  rc  rl  r]   r`   r]  g  s    zBigBitField.__init__c                 C   s   |d k	rt |S |S r\   )r  r  r]   r]   r`   r  k  s    zBigBitField.db_value)rb   rc   rd   r  r  r]  r  ro  r]   r]   rl  r`   r   d  s   c                   @   s    e Zd ZdZdd Zdd ZdS )rW   r  c                 C   sr   t |trt|dkr|S t |tr<t|dkr<tj|d}t |tjrN|jS zt|jW S    | Y S X d S )N    r"  r  )rp   ru  r   r  rl  r  rn  r  r]   r]   r`   r  r  s    zUUIDField.db_valuec                 C   s&   t |tjr|S |d k	r"t|S d S r\   )rp   rl  r  r  r]   r]   r`   r    s    zUUIDField.python_valueNrb   rc   rd   r  r  r  r]   r]   r]   r`   rW   o  s   c                   @   s    e Zd ZdZdd Zdd ZdS )r   r  c                 C   sn   t |tr t|dkr | |S t |trBt|dkrBtj|d}t |tjrZ| |jS |d k	rjtdd S )Nr"  r  )rn  zTvalue for binary UUID field must be UUID(), a hexadecimal string, or a bytes object.)rp   r  r   rb  ru  rl  r  r  r  r]   r]   r`   r    s    
zBinaryUUIDField.db_valuec                 C   sR   t |tjr|S t |tr$| }n|r:t |ts:t|}|d k	rNtj|dS d S )Nr  )rp   rl  r  r  r  r  r  r]   r]   r`   r    s    

zBinaryUUIDField.python_valueNr  r]   r]   r]   r`   r     s   c                    s    fdd}|S )Nc                    s   | j jj | S r\   )r|  r  r  r  r\  r  r]   r`   dec  s    z_date_part.<locals>.decr]   r  r  r]   r  r`   
_date_part  s    r  c              	   C   sH   |p
dd }|D ]2}z|t j | |W   S  tk
r@   Y qX q| S )Nc                 S   s   | S r\   r]   xr]   r]   r`   rr     rs   z"format_date_time.<locals>.<lambda>)r   strptimer  )rx   formatsZpost_processfmtr]   r]   r`   r     s    r   c              	   C   s2   zt j | dW S  ttfk
r,   |  Y S X d S )Nr   )r   r  r  r  r:  r]   r]   r`   r%    s    r%  c                       s"   e Zd ZdZd fdd	Z  ZS )_BaseFormattedFieldNc                    s$   |d k	r|| _ tt| j|| d S r\   )r  rk  r  r]  )r^   r  rR  rS  rl  r]   r`   r]    s    z_BaseFormattedField.__init__)N)rb   rc   rd   r  r]  ro  r]   r]   rl  r`   r    s   r  c                   @   sz   e Zd ZdZdddgZdd Zdd Zd	d
 Zee	dZ
ee	dZee	dZee	dZee	dZee	dZdS )r(   r  r   r   r   c                 C   s   |rt |trt|| jS |S r\   )rp   ru  r   r  r  r]   r]   r`   r    s    zDateTimeField.adaptc                 C   s   | j jj| S r\   r|  r  r  r  r\  r]   r]   r`   r    s    zDateTimeField.to_timestampc                 C   s   | j jj|| S r\   r|  r  r  r  r^   r0  r]   r]   r`   truncate  s    zDateTimeField.truncater   r   r   r   r   r   N)rb   rc   rd   r  r  r  r  r  r  r  r   r   r   r   r   r   r]   r]   r]   r`   r(     s   c                   @   sV   e Zd ZdZdddgZdd Zdd Zd	d
 Zee	dZ
ee	dZee	dZdS )r'   r  r   r   r   c                 C   s@   |r$t |tr$dd }t|| j|S |r<t |tjr<| S |S )Nc                 S   s   |   S r\   )r   r  r]   r]   r`   rr     rs   z!DateField.adapt.<locals>.<lambda>)rp   ru  r   r  r   r   r^   rx   ppr]   r]   r`   r    s    zDateField.adaptc                 C   s   | j jj| S r\   r  r\  r]   r]   r`   r    s    zDateField.to_timestampc                 C   s   | j jj|| S r\   r  r  r]   r]   r`   r    s    zDateField.truncater   r   r   N)rb   rc   rd   r  r  r  r  r  r  r  r   r   r   r]   r]   r]   r`   r'     s   c                   @   sJ   e Zd ZdZdddddgZdd Zeed	Zeed
Z	eedZ
dS )rT   r  r   r   r   r   r   c                 C   s`   |r8t |tr$dd }t|| j|S t |tjr8| S |d k	r\t |tjr\tjj|  S |S )Nc                 S   s   |   S r\   )r   r  r]   r]   r`   rr     rs   z!TimeField.adapt.<locals>.<lambda>)rp   ru  r   r  r   r   	timedeltaminr  r]   r]   r`   r    s    
zTimeField.adaptr   r   r   N)rb   rc   rd   r  r  r  r  r  r   r   r   r]   r]   r]   r`   rT     s   c                    s    fdd}|S )Nc                    s<   | j jj}| jdkr&| t| jdd n| }| ||S Nr   Fr  )r|  r  r  
resolutionrX   r  r  )r^   r  r)  r  r]   r`   r    s    
z!_timestamp_date_part.<locals>.decr]   r  r]   r  r`   _timestamp_date_part  s    r  c                       s   e Zd Zdd e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eedZeedZeedZeedZeedZeedZ  ZS )rU   c                 C   s   g | ]}d | qS )r\  r]   r/  r3  r]   r]   r`   r3    s     zTimestampField.<listcomp>r+  c                    s   | dd | _| jsd| _nH| jtddkr:d| j | _n*| j| jkrdtdddd	 | jD  d
| j | _| ddp~d| _| jrtnt	j	j
}|d| tt| j|| d S )Nr  r   rf   r+  r\  z,TimestampField resolution must be one of: %sr  c                 s   s   | ]}t |V  qd S r\   r  r  r]   r]   r`   rF  $  s     z*TimestampField.__init__.<locals>.<genexpr>i@B r   Fr&  )r  r  r  valid_resolutionsr  r-  ticks_to_microsecondr   r   r   r   r.  rk  rU   r]  )r^   rR  rS  Zdfltrl  r]   r`   r]    s    zTimestampField.__init__c                 C   s"   t j tt| d d  S )N   )r   r   gmtimemktime	timetuple)r^   r   r]   r]   r`   local_to_utc,  s    zTimestampField.local_to_utcc                 C   s   t | }tj|S r\   )calendartimegmutctimetupler   r   )r^   r   r   r]   r]   r`   utc_to_local3  s    zTimestampField.utc_to_localc                 C   s&   | j rt| S t| S d S r\   )r   r  r  r  r   r  r  r  r]   r]   r`   get_timestamp;  s    zTimestampField.get_timestampc                 C   s   |d krd S t |tjrn4t |tjr<t|j|j|j}ntt|| j S | 	|}| jdkrz||j
d 7 }|| j9 }tt|S )Nr   gư>)rp   r   r   r   r   r   r   roundr  r  microsecond)r^   rx   r   r]   r]   r`   r  B  s    


zTimestampField.db_valuec                 C   sv   |d k	rrt |tttfrr| jdkrBt|| j\}}t|| j }nd}| jrVt|}nt	j	
|}|rr|j|d}|S )Nr   r   )r  )rp   r   ry  longr  r  r  r   r   r   r   r   )r^   rx   ticksmicrosecondsr]   r]   r`   r  S  s    

zTimestampField.python_valuec                 C   s0   | j dkr| t| j dd n| }| jjj|S r  )r  rX   r|  r  r  r  )r^   r)  r]   r]   r`   r  e  s
    zTimestampField.from_timestampr   r   r   r   r   r   )rb   rc   rd   r  r  r]  r  r  r  r  r  r  r  r  r   r   r   r   r   r   ro  r]   r]   rl  r`   rU     s   c                   @   s   e Zd Zdd Zdd ZdS )r=   c                 C   s"   |d k	rt dt|d S d S )N!Ir   )structr  socket	inet_atonr^   r  r]   r]   r`   r  s  s    zIPField.db_valuec                 C   s   |d k	rt td|S d S )Nr  )r  	inet_ntoar  packr  r]   r]   r`   r  w  s    zIPField.python_valueN)rb   rc   rd   r  r  r]   r]   r]   r`   r=   r  s   c                   @   s   e Zd ZdZeZdS )r   r  N)rb   rc   rd   r  r  r  r]   r]   r]   r`   r   |  s   c                       s&   e Zd Zd fdd	Zdd Z  ZS )r   Nc                    s$   t t| j|| |d k	r || _d S r\   )rk  r   r]  r  )r^   r  rR  rS  rl  r]   r`   r]    s    zBareField.__init__c                 C   s   d S r\   r]   r  r]   r]   r`   r    s    zBareField.ddl_datatype)N)rb   rc   rd   r]  r  ro  r]   r]   rl  r`   r     s   c                       s~   e Zd ZeZeZd fdd	Zedd Z	 fddZ
d	d
 Zdd Zdd Zdd Zd fdd	ZdddZdd Z  ZS )r5   NTc                    s   | dd tt| j|| |d k	r2td |}|	d k	rFtd |	}|d k	rZtd |}|dk| _|| _|| _|| _d | _	|| _
|| _|| _|| _|
| _|| _|| _d S )NrL  TzP"rel_model" has been deprecated in favor of "model" for ForeignKeyField objects.zO"to_field" has been deprecated in favor of "field" for ForeignKeyField objects.zK"related_name" has been deprecated in favor of "backref" for Field objects.r^   )r.  rk  r5   r]  r   _is_self_referencer  r  declared_backrefbackref	on_delete	on_update
deferrabler`  object_id_namer  constraint_name)r^   r|  r#  r!  r"  r#  r$  	_deferredr  to_fieldr%  r  r&  Zrelated_namerR  rS  rl  r]   r`   r]    s.    
zForeignKeyField.__init__c                 C   s,   t | jts| jjS t | jtr&tjS tjS r\   )rp   r  r   r  r   r   r9   r\  r]   r]   r`   r    s
    zForeignKeyField.field_typec                    s$   t | jts| j S tt|  S r\   )rp   r  r   r  rk  r5   r\  rl  r]   r`   r    s    
zForeignKeyField.get_modifiersc                 C   s"   | j p d| jjj| j| jjjf S )Nzfk_%s_%s_refs_%s)r&  r|  r  r  r  r  r\  r]   r]   r`   get_constraint_name  s
    z#ForeignKeyField.get_constraint_namec                 C   s   | j |S r\   )r  r  r  r]   r]   r`   r    s    zForeignKeyField.adaptc                 C   s&   t || jrt|| jj}| j|S r\   )rp   r  r   r  r	  r  r  r]   r]   r`   r    s    zForeignKeyField.db_valuec                 C   s   t || jr|S | j|S r\   )rp   r  r  r  r  r]   r]   r`   r    s    zForeignKeyField.python_valuec                    s:  | j s|dr|n|d | _ | jsF| j | _| j|krd|  jd7  _n| j|krdtd|jj|f | jrp|| _t| j	t
rt| j| j	| _	n| j	d kr| jjj| _	tt| ||| | j| _t| jr| | | _n| jd  | _| _| jsd|jj | _|r6t|| jt|  | jdkr6t| j| j| |  d S )N_idzYForeignKeyField "%s"."%s" specifies an object_id_name that conflicts with its field name.z%s_setz!+)r  r  r%  r  r  r	  r  r  rp   r  ru  r   rP  rk  r5   r3  r  r  r   r!  rO  r  backref_accessor_classr  rl  r]   r`   r3    s:    





zForeignKeyField.bindFc                 C   s   g }| j s|r0|  }|tdtt|g |tdt| ftd| jt| jfg | j	rv|
td| j	  | jr|
td| j  | jr|
td| j  t|S )Nr  zFOREIGN KEYZ
REFERENCESzON DELETE %szON UPDATE %szDEFERRABLE %s)r&  r)  r  rP   r=  r'  rn  r  r  r"  r_  r#  r$  r  )r^   Zexplicit_namer   r	  r]   r]   r`   foreign_key_constraint  s*    


z&ForeignKeyField.foreign_key_constraintc                 C   s>   | drtd|| jjjkr.| jjj| S td| d S )N__z)Cannot look-up non-existant "__" methods.zNForeign-key has no attribute %s, nor is it a valid field on the related model.)r  r   r  r  r"  r   r]   r]   r`   r     s    
zForeignKeyField.__getattr__)NNNNNNNNNTNN)T)F)rb   rc   rd   r  r  r  r+  r]  r  r  r  r)  r  r  r  r3  r,  r   ro  r]   r]   rl  r`   r5     s.                   #
$
c                       sF   e Zd Ze Z fddZejZd
ddZdd Z	e
dd	 Z  ZS )r*   c                    sH   || _ | | _tj|  tt| j|d|d|dd d S )Nr  r  rP  )r  r  rP  )	field_kwargsrB  rel_model_namer*   _unresolvedr  rk  r]  r  )r^   r/  rS  rl  r]   r`   r]    s    

zDeferredForeignKey.__init__Nc                 C   s   t | jf| jS r\   )r*   r/  r.  )r^   memor]   r]   r`   __deepcopy__$  s    zDeferredForeignKey.__deepcopy__c                 C   sF   t |fddi| j}|jr0| jj| j| n| jj| j| d S )Nr'  T)r5   r.  rP  r|  r  set_primary_keyr	  	add_field)r^   r  r#  r]   r]   r`   	set_model'  s    zDeferredForeignKey.set_modelc                 C   sH   t tjtdd}|D ]*}|j| j kr||  tj	| qd S )Nr  r  )
r  r*   r0  rW  
attrgetterr/  rb   rB  r5  discard)Z	model_clsZ
unresolvedZdrr]   r]   r`   resolve/  s    
zDeferredForeignKey.resolve)N)rb   rc   rd   r  r0  r]  rI  r&  r2  r5  r  r8  ro  r]   r]   rl  r`   r*     s   	
c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r+   c                 C   s
   g | _ d S r\   )_refsr\  r]   r]   r`   r]  :  s    zDeferredThroughModel.__init__c                 C   s   | j |||f d S r\   )r9  r_  r  r]   r]   r`   	set_field=  s    zDeferredThroughModel.set_fieldc                 C   s*   | j D ]\}}}||_|j|| qd S r\   )r9  through_modelr  r4  )r^   r;  	src_modelZm2mfieldr	  r]   r]   r`   r5  @  s    zDeferredThroughModel.set_modelN)rb   rc   rd   r]  r:  r5  r]   r]   r]   r`   r+   9  s   c                   @   s    e Zd Zd Z Z ZZdZdS )	MetaFieldNF)rb   rc   rd   r  r&  r|  r	  rP  r]   r]   r]   r`   r=  F  s   r=  c                       s.   e Zd Z fddZd	ddZdd Z  ZS )
ManyToManyFieldAccessorc                    s   t t| ||| |j| _|j| _|j| _| jjj| j }| jjj| j }|sftd| j| jf n|s~td| j| jf |d | _	|d | _
d S )Nz.Cannot find foreign-key to "%s" on "%s" model.r   )rk  r>  r]  r|  r  r;  r  
model_refsr  src_fkdest_fk)r^   r|  r#  r	  Zsrc_fksZdest_fksrl  r]   r`   r]  L  s     


z ManyToManyFieldAccessor.__init__NFc                    s   |d k	r|sB j jdkrBt| j j}t|trB fdd|D S t| j jj}|d krt jjrtt	d j|f t
|  j j j j |kS  jS )Nr   c                    s   g | ]}t | jjqS r]   )r   rA  r	  r/  rY  r\  r]   r`   r3  a  s     z3ManyToManyFieldAccessor.__get__.<locals>.<listcomp>z7Cannot get many-to-many "%s" for unsaved instance "%s".)r@  r!  r   rp   r8  r  r	  r#  _prevent_unsavedr  ManyToManyQueryr  r-  r;  r|  r  )r^   r  r  force_queryr!  src_idr]   r\  r`   r  \  s$    
zManyToManyFieldAccessor.__get__c                 C   sR   t || jjj}|d kr2| jjr2td| j|f | j|dd}|j|dd d S )Nz7Cannot set many-to-many "%s" for unsaved instance "%s".T)rE  )clear_existing)	r   r@  r  r	  r#  rC  r  r  r  )r^   r  rx   rF  r  r]   r]   r`   r  n  s    zManyToManyFieldAccessor.__set__)NF)rb   rc   rd   r]  r  r  ro  r]   r]   rl  r`   r>  K  s   
r>  c                       sf   e Zd ZeZdddZdd Zd fdd		Zd
d Ze	dd Z
e
jdd Z
dd Zdd Z  ZS )r?   NTFc                 C   sl   |d k	r>t |ts"t|s"td|s>|d k	s6|d k	r>td|| _|| _|| _|| _|| _	|| _
|| _d S )NzKUnexpected value for through_model. Expected Model or DeferredThroughModel.zFCannot specify on_delete or on_update when through_model is specified.)rp   r+   r  r  r  r  r!  _through_model
_on_delete
_on_updaterC  _is_backref)r^   r|  r!  r;  r"  r#  Zprevent_unsavedrK  r]   r]   r`   r]  z  s    
zManyToManyField.__init__c                 C   s   t | S r\   )r>  r\  r]   r]   r`   _get_descriptor  s    zManyToManyField._get_descriptorc                    s   t | jtr | j|| | d S tt| ||| | js|t| j|| j	| j
| jdd}| jpf|jjd | _| jj| j| d S )NT)r!  r;  r"  r#  rK  rl   )rp   rH  r+   r:  rk  r?   r3  rK  r|  r;  rI  rJ  r!  r  r	  r  r4  )r^   r|  r	  r  Zmany_to_many_fieldrl  r]   r`   r3    s    zManyToManyField.bindc                 C   s(   dd t | j| jf| j | jffD S )Nc                 S   s   g | ]\}}|qS r]   r]   )r/  r  r|  r]   r]   r`   r3    s     z.ManyToManyField.get_models.<locals>.<listcomp>)r  rK  r|  r  r\  r]   r]   r`   
get_models  s    
zManyToManyField.get_modelsc                 C   s   | j d kr|  | _ | j S r\   )rH  _create_through_modelr\  r]   r]   r`   r;    s    

zManyToManyField.through_modelc                 C   s
   || _ d S r\   )rH  r  r]   r]   r`   r;    s    c                    s     \ dd  fD G  fddd}jjd} jjt f|jjtf|d|i}d jjf }t|tf|S )Nc                 S   s   g | ]}|j jqS r]   )r  r  r/  r|  r]   r]   r`   r3    s     z9ManyToManyField._create_through_model.<locals>.<listcomp>c                       sB   e Zd ZjjjZjjjZde Z jj	jj	fdffZ
dS )z3ManyToManyField._create_through_model.<locals>.Metaz%s_%s_throughTN)rb   rc   rd   r|  r  r  rQ  r9  r  r	  rZ  r]   rd  r   r^   Ztablesr]   r`   r    s   

r  )r"  r#  z%s%sThrough)	rM  rI  rJ  r  r	  r5   rb   r  r@   )r^   r  r  attrsZ
klass_namer]   rP  r`   rN    s     
 
 z%ManyToManyField._create_through_modelc                 C   s   | j S r\   )r;  r\  r]   r]   r`   get_through_model  s    z!ManyToManyField.get_through_model)NNNNTF)T)rb   rc   rd   r>  r  r]  rL  r3  rM  r  r;  r  rN  rR  ro  r]   r]   rl  r`   r?   w  s         


c                       s<   e Zd ZdZd fdd	Zdd Zdd Zdd	d
Z  ZS )VirtualFieldNc                    s<   |d k	r|n| j }|d k	r | nd | _tt| j|| d S r\   )field_classfield_instancerk  rS  r]  )r^   rT  rR  rS  r1   rl  r]   r`   r]    s    zVirtualField.__init__c                 C   s   | j d k	r| j |S |S r\   )rU  r  r  r]   r]   r`   r    s    
zVirtualField.db_valuec                 C   s   | j d k	r| j |S |S r\   )rU  r  r  r]   r]   r`   r    s    
zVirtualField.python_valueTc                 C   s2   || _ | | _ | _| _t||| || | d S r\   )r|  r  r	  r  rO  r  r  r]   r]   r`   r3    s    zVirtualField.bind)N)T)	rb   rc   rd   rT  r]  r  r  r3  ro  r]   r]   rl  r`   rS    s
   rS  c                   @   s`   e Zd ZdZdd Zedd ZdddZdd	 Zd
d Z	dd Z
dd Zdd ZdddZdS )r!   Nc                 G   s   || _ d | _d S r\   )field_names_safe_field_names)r^   rV  r]   r]   r`   r]    s    zCompositeKey.__init__c                    s6    j d kr0 jd kr jS  fdd jD  _  j S )Nc                    s   g | ]} j jj| jqS r]   )r|  r  r"  r  r/  fr\  r]   r`   r3    s   z1CompositeKey.safe_field_names.<locals>.<listcomp>)rW  r|  rV  r\  r]   r\  r`   safe_field_names  s    


zCompositeKey.safe_field_namesc                    s$    d k	r t  fdd| jD S | S )Nc                    s   g | ]}t  |qS r]   r  rX  r  r]   r`   r3    s     z(CompositeKey.__get__.<locals>.<listcomp>)r9  rZ  r  r]   r[  r`   r    s    zCompositeKey.__get__c                 C   sX   t |ttfstdt|t| jkr0tdt|D ]\}}t|| j| | q8d S )NzIA list or tuple must be used to set the value of a composite primary key.zVThe length of the value must equal the number of columns of the composite primary key.)	rp   r8  r9  r  r   rV  r  r  rO  )r^   r  rx   r  Zfield_valuer]   r]   r`   r    s    zCompositeKey.__set__c                    s&    fddt  j|D }ttj|S )Nc                    s"   g | ]\}} j jj| |kqS r]   r|  r  r"  )r/  r#  rx   r\  r]   r`   r3    s   z'CompositeKey.__eq__.<locals>.<listcomp>)ziprV  ro   rW  rX  )r^   r(  rZ  r]   r\  r`   r)    s    

zCompositeKey.__eq__c                 C   s
   | |k S r\   r]   r'  r]   r]   r`   r*    s    zCompositeKey.__ne__c                 C   s   t | jj| jfS r\   )r$  r|  rb   rV  r\  r]   r]   r`   r&  
  s    zCompositeKey.__hash__c                    s,   |j tk}|t fdd jD d|S )Nc                    s   g | ]} j jj| qS r]   r\  r/  r#  r\  r]   r`   r3    s   z(CompositeKey.__sql__.<locals>.<listcomp>r  )r  r  r  r  rV  )r^   r  r2  r]   r\  r`   r    s    
 zCompositeKey.__sql__Tc                 C   s*   || _ | | _ | _| _t|| j|  d S r\   )r|  r  r	  r  rO  r  r]   r]   r`   r3    s    zCompositeKey.bind)N)T)rb   rc   rd   rD  r]  r  rZ  r  r  r)  r*  r&  r  r3  r]   r]   r]   r`   r!     s   
	

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S )_SortedFieldList_keys_itemsc                 C   s   g | _ g | _d S r\   r`  r\  r]   r]   r`   r]    s    z_SortedFieldList.__init__c                 C   s
   | j | S r\   )rb  )r^   r3  r]   r]   r`   r  "  s    z_SortedFieldList.__getitem__c                 C   s
   t | jS r\   )rK  rb  r\  r]   r]   r`   r  %  s    z_SortedFieldList.__iter__c                 C   s0   |j }t| j|}t| j|}|| j|| kS r\   )r  r   ra  r   rb  )r^   r  r  r3  r  r]   r]   r`   __contains__(  s    z_SortedFieldList.__contains__c                 C   s   | j |jS r\   )ra  rL  r  r  r]   r]   r`   rL  .  s    z_SortedFieldList.indexc                 C   s2   |j }t| j|}| j|| | j|| d S r\   )r  r   ra  rY  rb  )r^   r  r  r3  r]   r]   r`   rY  1  s    z_SortedFieldList.insertc                 C   s   |  |}| j|= | j|= d S r\   )rL  rb  ra  )r^   r  r  r]   r]   r`   r  7  s    
z_SortedFieldList.removeN)rb   rc   rd   rj  r]  r  r  rc  rL  rY  r  r]   r]   r]   r`   r_    s   r_  c                   @   s.  e Zd ZdAddZedd Zejdd Zdd ZdBd
dZdd Z	dCddZ
dDddZdEddZdFddZdGddZdHddZdIddZdJddZdKdd ZdLd!d"ZdMd#d$Zd%d& ZdNd'd(Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: ZdOd;d<Z d=d> Z!dPd?d@Z"dS )QrM   Nc                 K   s"   || _ || _|dt || _d S r  )r|  r  r.  r  rq  )r^   r|  r  rq  r]   r]   r`   r]  A  s    zSchemaManager.__init__c                 C   s*   | j p| jjj}|d kr&td| j |S )Nz=database attribute does not appear to be set on the model: %s)r  r|  r  r  r7   rO  r]   r]   r`   r  G  s    zSchemaManager.databasec                 C   s
   || _ d S r\   rS  r  r]   r]   r`   r  O  s    c                 C   s   | j jf | jS r\   )r  r  rq  r\  r]   r]   r`   _create_contextS  s    zSchemaManager._create_contextTc                    s  | dd}|  }||r dnd |r4|d || jd g }g }| jj  jr fdd jjD }|	t
td	t|f  jD ]2}|	|| t|tr|js|	|  q jr| j || | |t||   jd k	r@t j}	|	D ]*}
t|
ts,td
|d|
 qg } jrV|	d  jrh|	d |r|dd|  |S )N	temporaryFCREATE TEMPORARY TABLE CREATE TABLE r  r   c                    s   g | ]} j | jqS r]   )r"  rR  r/  
field_namer$  r]   r`   r3  b  s   z/SchemaManager._create_table.<locals>.<listcomp>r@  ztable_settings must be stringsZSTRICTzWITHOUT ROWIDr  r  )r  rd  r  r  r|  r  composite_keyrP  rV  r_  r  rP   rn  sorted_fieldsr  rp   r5   r`  r,  r\  r  _create_table_option_sqltable_settingsr;  ru  r  strict_tableswithout_rowidr-  )r^   r  r  Zis_tempr  r  r\  Z
pk_columnsr#  rn  settingZ
extra_optsr]   rj  r`   _create_tableV  sL    



 
 
zSchemaManager._create_tablec                 C   s|   g }t | jjjpi |}|s |S t| D ]J\}}t|ts\t|rP|jj	}nt
t|}|tt
||fdd q,|S )Nr   rv  )r*  r|  r  r  r  rZ  rp   r<  r  r  rP   r  r_  r  )r^   r  r   r]  rx   r]   r]   r`   rm    s    

z&SchemaManager._create_table_option_sqlc                 K   s    | j | jf d|i| d S Nr  )r  rv  rr  r^   r  r  r]   r]   r`   r    s    zSchemaManager.create_tablec                 K   sH   |   |drdnd}|r*|d |tt| d|S )Nre  rf  rg  r  r  )rd  r  r  r  r=  r;  r^   r  r  r  r$  r  r]   r]   r`   _create_table_as  s    

zSchemaManager._create_table_asc                 K   s(   | j ||fd|i|}| j| d S rs  )rv  r  rv  ru  r]   r]   r`   create_table_as  s    zSchemaManager.create_table_asc                 K   sL   |   |rdnd| j}|dr4|d}n|drH|d}|S )NzDROP TABLE IF EXISTS zDROP TABLE cascade CASCADErestrictz	 RESTRICT)rd  r  r  r|  r  )r^   r  r  r  r]   r]   r`   _drop_table  s    



zSchemaManager._drop_tablec                 K   s    | j | jf d|i| d S rs  )r  rv  r{  rt  r]   r]   r`   r    s    zSchemaManager.drop_tableFc                 C   sX   | j }|js"|  d| jS |  d| j}|rF|d}|rT|d}|S )Nr  zTRUNCATE TABLE z RESTART IDENTITYry  )r  r  rd  r  r  r|  )r^   restart_identityrx  r  r  r]   r]   r`   _truncate_table  s    

zSchemaManager._truncate_tablec                 C   s   | j | || d S r\   )r  rv  r}  )r^   r|  rx  r]   r]   r`   r    s    zSchemaManager.truncate_tablec                    s    fddj j D S )Nc                    s   g | ]} | qS r]   )_create_indexr/  rL  r  r^   r]   r`   r3    s   z1SchemaManager._create_indexes.<locals>.<listcomp>r|  r  fields_to_indexr^   r  r]   r  r`   _create_indexes  s    
zSchemaManager._create_indexesc                 C   sT   t |trF| jjs|d}n|j|kr2||}t | jtrFt|}| 	 
|S r  )rp   r8   r  r  r  r  r  rQ   r  rd  r  )r^   rL  r  r]   r]   r`   r~    s    


zSchemaManager._create_indexc                 C   s"   | j |dD ]}| j| qd S N)r  )r  r  rv  r^   r  r  r]   r]   r`   create_indexes  s    zSchemaManager.create_indexesc                    s    fddj j D S )Nc                    s"   g | ]}t |tr| qS r]   )rp   r8   _drop_indexr  r  r]   r`   r3    s   
z/SchemaManager._drop_indexes.<locals>.<listcomp>r  r  r]   r  r`   _drop_indexes  s    
zSchemaManager._drop_indexesc                 C   s\   d}|r| j jr|d7 }t|jtr>|jjr>t|jj|j}n
t|j}|  	|
|S )NzDROP INDEX z
IF EXISTS )r  r  rp   r  rR   rN  r=  r8  rd  r  r  )r^   rL  r  r  r  r]   r]   r`   r    s    
zSchemaManager._drop_indexc                 C   s"   | j |dD ]}| j| qd S r  )r  r  rv  r  r]   r]   r`   drop_indexes  s    zSchemaManager.drop_indexesc                 C   s    |j r| jjstd|j d S )Nz@Sequences are either not supported, or are not defined for "%s".)rD  r  r  r  r	  r  r]   r]   r`   _check_sequences  s    zSchemaManager._check_sequencesc                 C   s*   |j jjrt|j jj|jS t|jS d S r\   )r|  r  rQ  r=  rD  r  r]   r]   r`   _sequence_for_field  s    
z!SchemaManager._sequence_for_fieldc                 C   s6   |  | | j|js2|  d| |S d S )NzCREATE SEQUENCE r  r  r  rD  rd  r  r  r  r  r]   r]   r`   _create_sequence  s    
zSchemaManager._create_sequencec                 C   s"   |  |}|d k	r| j| d S r\   )r  r  rv  r^   r#  Zseq_ctxr]   r]   r`   create_sequence  s    
zSchemaManager.create_sequencec                 C   s6   |  | | j|jr2|  d| |S d S )NzDROP SEQUENCE r  r  r]   r]   r`   _drop_sequence   s    
zSchemaManager._drop_sequencec                 C   s"   |  |}|d k	r| j| d S r\   )r  r  rv  r  r]   r]   r`   drop_sequence  s    
zSchemaManager.drop_sequencec                 C   s(   |   d|jd|dS )NzALTER TABLE z ADD T)rd  r  r  r|  r,  r  r]   r]   r`   _create_foreign_key  s    z!SchemaManager._create_foreign_keyc                 C   s   | j | | d S r\   )r  rv  r  r  r]   r]   r`   create_foreign_key  s    z SchemaManager.create_foreign_keyc                 C   s,   | j jr(| jjjD ]}|jr| | qd S r\   )r  r  r|  r  rl  rD  r  r  r]   r]   r`   create_sequences  s    zSchemaManager.create_sequencesc                 K   s&   |    | j|f| | j|d d S r  )r  r  r  )r^   r  Ztable_optionsr]   r]   r`   
create_all  s    zSchemaManager.create_allc                 C   s,   | j jr(| jjjD ]}|jr| | qd S r\   )r  r  r|  r  rl  rD  r  r  r]   r]   r`   drop_sequences#  s    zSchemaManager.drop_sequencesc                 K   s   | j |f| |r|   d S r\   )r  r  )r^   r  r  r  r]   r]   r`   drop_all)  s    zSchemaManager.drop_all)N)T)T)T)T)T)T)FF)FF)T)T)T)T)T)T)TT)#rb   rc   rd   r]  r  r  r  rd  rr  rm  r  rv  rw  r{  r  r}  r  r  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r]   r]   r]   r`   rM   @  sB   



*













c                   @   s   e Zd Zd/ddZdd Zd0dd	Zd
d Zdd Zdd Zdd Z	e
dd Zejdd Zejdd Ze
dd Zejdd Ze
dd Zdd Zdd Zd1d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 )2MetadataNFTc                 K   sf  |d k	rt d |}|| _|| _i | _i | _i | _t | _g | _g | _	i | _
i | _i | _i | _g | _|j | _|| _|| _|s| jr| |n|  }|| _d | _|rt|ng | _|| _|| _|| _d  | _| _|| _|	| _|| _ || _!|| _"|| _#i | _$i | _%t&'t| _(t&'t| _)i | _*|
p*i | _+|, D ]\}}t-| || q6t.|/ | _0g | _1d S )NzC"db_table" has been deprecated in favor of "table_name" for Models.)2r   r|  r  r"  r  combinedr_  _sorted_field_listrl  sorted_field_namesr  _default_by_name_default_dict_default_callables_default_callable_listrb   rB  r	  r  r&  make_table_namer  r  r8  rZ  r\  rN  rP  rk  r  only_save_dirty
depends_onrn  rp  ro  re  refsbackrefsr  defaultdictr?  model_backrefs
manytomanyr  rZ  rO  r  keys_additional_keysr  )r^   r|  r  r  rZ  rP  r\  rQ  r  r  r  Zdb_tabler  rn  rp  re  ro  r&  rS  r]  rx   r]   r]   r`   r]  0  s^    zMetadata.__init__c                 C   s"   | j rtdd| jS t| jjS )Nr$  r  )r&  r%  r@  r	  rD  r|  rb   r\  r]   r]   r`   r  s  s    zMetadata.make_table_namec                 C   s   |s|st dd | jd fg}t }t| f}|r:|jn|j}|r| }||krTq@|| |r|j	 D ]$\}	}
|
|	|
df |
|
j ql|r@|j	 D ]$\}	}
|
|	|
df |
|
j qq@|S )Nz)One of `refs` or `backrefs` must be True.FT)r  r|  r  r  dequer  popleftr  r  rZ  r_  r  r  )r^   r  r  Zdepth_firstr   r  queuere  currfkr|  r]   r]   r`   model_graphx  s(     
zMetadata.model_graphc                 C   sF   |j }|| j|< | j| | | j|jj|< |jj| j | d S r\   )r  r  r?  r_  r|  r  r  r  r^   r#  relr]   r]   r`   add_ref  s
    
zMetadata.add_refc                 C   s@   |j }| j|= | j| | |jj|= |jj| j | d S r\   )r  r  r?  r  r  r  r  r|  r  r]   r]   r`   
remove_ref  s
    
zMetadata.remove_refc                 C   s   || j |j< d S r\   r  r	  r  r]   r]   r`   add_manytomany  s    zMetadata.add_manytomanyc                 C   s   | j |j= d S r\   r  r  r]   r]   r`   remove_manytomany  s    zMetadata.remove_manytomanyc                 C   s8   | j d kr2t| jdd | jD | j| j| jd| _ | j S )Nc                 S   s   g | ]
}|j qS r]   )r  r^  r]   r]   r`   r3    s     z"Metadata.table.<locals>.<listcomp>)rQ  rH  r  )r  rR   r  rl  rQ  r|  r  r\  r]   r]   r`   r    s    
zMetadata.tablec                 C   s   t dd S )NzCannot set the "table".r  r  r]   r]   r`   r    s    c                 C   s
   d | _ d S r\   )r  r\  r]   r]   r`   r    s    c                 C   s   | j S r\   )rN  r\  r]   r]   r`   rQ    s    zMetadata.schemac                 C   s   || _ | `d S r\   )rN  r  r  r]   r]   r`   rQ    s    c                 C   s"   | j rt| j | jS t| jS d S r\   )rN  r=  r  r\  r]   r]   r`   r^    s    zMetadata.entityc                 C   s"   t | j| _dd | jD | _d S )Nc                 S   s   g | ]
}|j qS r]   r  rX  r]   r]   r`   r3    s     z2Metadata._update_sorted_fields.<locals>.<listcomp>)r8  r  rl  r  r\  r]   r]   r`   _update_sorted_fields  s    zMetadata._update_sorted_fieldsc                 C   s4   t |tr|j}| j|g }| j|g }||fS r\   )rp   
ModelAliasr|  r?  r  r  )r^   r|  Zforwardrefsr  r]   r]   r`   get_rel_for_model  s
    
zMetadata.get_rel_for_modelc                 C   s:  || j kr| | n|| jkr0| | j|  t|ts| `|| j|| || j |j	< || j
|j< || j|j	< || j|j< | j| |   |jd k	r|j| j|< t|jr|j| j|< | j|j	|jf n|j| j|< |j| j|j	< n|| j|| t|tr| | nt|tr6|j	r6| | d S r\   )r"  remove_fieldr  r  rp   r=  r  r3  r|  r	  r  r  r  r  rY  r  r&  r  r  r  r  r_  r  r  r5   r  r?   r  )r^   ri  r#  r  r]   r]   r`   r4    s6    





zMetadata.add_fieldc                 C   s   || j krd S | `| j |}| j|j= | j|= z| j|j= W n tk
rR   Y nX | j| | 	  |j
d k	r| j|= | j|d rt| jD ]$\}\}}||kr| j|  qqn| j|d  | j|jd  t|tr| | d S r\   )r"  r  r  r  r  r  r   r  r  r  r&  r  r  r  r  r  r  r	  rp   r5   r  )r^   ri  originalr3  r	  r  r]   r]   r`   r    s.    



zMetadata.remove_fieldc                 C   s4   t |t| _| || || _|jp,t|j| _d S r\   )rp   r!   rk  r4  rP  r  r  rD  )r^   r	  r#  r]   r]   r`   r3    s    zMetadata.set_primary_keyc                    s:    j r t fdd jjD S  jdk	r2 jfS dS d S )Nc                    s   g | ]} j | qS r]   r"  rh  r\  r]   r`   r3    s   z-Metadata.get_primary_keys.<locals>.<listcomp>Fr]   )rk  r9  rP  rV  r\  r]   r\  r`   r    s
    zMetadata.get_primary_keysc                 C   s(   | j  }| jD ]\}}| ||< q|S r\   )r  r'  r  )r^   ddri  r&  r]   r]   r`   get_default_dict"  s    
zMetadata.get_default_dictc              	   C   s   g }| j D ]6}|jrq
|js"|jr
|t| j|f|j|jd q
| jD ]}t	|t
rb|| qHt	|ttfrH|\}}g }|D ]B}t	|tr|| j|  qt	|t
r|| qtd| q|t| j||d qH|S )N)r  r  z;Expected either a field name or a subclass of Node. Got: %s)r  )rl  rP  rL  r  r_  rA   r|  r   rZ  rp   r<  r8  r9  ru  r  r  )r^   rZ  rY  Z	index_objZindex_partsr  r"  r0  r]   r]   r`   r  (  s0    





zMetadata.fields_to_indexc                 C   sD   || _ || jj_| `t|tr,|jd kr,d }| jD ]}|| q2d S r\   )	r  r|  rN  r  r  rp   rK   rY  r  )r^   r  hookr]   r]   r`   set_databaseC  s    

zMetadata.set_databasec                 C   s   || _ | `d S r\   )r  r  )r^   r  r]   r]   r`   set_table_nameP  s    zMetadata.set_table_name)NNNNNNFNNNNNFFNT)TTT)T)rb   rc   rd   r]  r  r  r  r  r  r  r  r  r  deleterrQ  r^  r  r  r4  r  r3  r  r  r  r  r  r]   r]   r]   r`   r  /  sV                         
C








#r  c                       s(   e Zd Zg Z fddZdd Z  ZS )SubclassAwareMetadatac                    s(   t t| j|f|| | j| d S r\   )rk  r  r]  r  r_  r^   r|  rR  rS  rl  r]   r`   r]  X  s    zSubclassAwareMetadata.__init__c                 C   s   | j D ]}|| qd S r\   )r  )r^   r4   r|  r]   r]   r`   
map_models\  s    
z SubclassAwareMetadata.map_models)rb   rc   rd   r  r]  r  ro  r]   r]   rl  r`   r  U  s   r  c                   @   s   e Zd ZdS )r-   Nr  r]   r]   r]   r`   r-   a  s    c                       s   e Zd Zeddddddddd	d
ddg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 Zdd ZeZdd  Z  ZS )!	ModelBaser\  r  rZ  rP  r  rQ  r  re  r  r&  rn  ro  c                    s
  |t ks|d jt kr0tt j |||f|S i }|dd }|rj|j D ]\}}|dsN|||< qNt	|dd }	d  }
}|D ]}t
|dsq|j}|d krt|j} j|jB }|jD ]"}||kr||kr|j| ||< q|d|j |d|j |j D ]<\}}||krqt|tr|jjst|j||< qq|dd pVi }|d	t}|d
t}tt j |||f| d   _ _| f| _| f| _g } j D ]T\}}t|tr|jr|	rtd| n"|jr|| }	}
n|||f q|	d krT|dk	rN|d k	r>||jfnt  df\}	}
nd}	nt|	t!rld}
d j_"|	dk	r j#|
|	 |D ]\}} j$|| qt
 drd|krt% d fdd d j }d j&i}t'|t(f|}| _( )  t*+   S )Nr   r  r  rP  r  r  rQ  Zschema_optionsZmodel_metadata_classZschema_manager_classzover-determined primary key %s.Frj  Z__composite_key__Tr}  r  c                    s   d j |  f S )Nz<%s: %s>)rb   r}  r\  r  r]   r`   rr     s    z#ModelBase.__new__.<locals>.<lambda>z%sDoesNotExistrc   ),r#  rb   rk  r  r  r  r  rZ  r  r   r  r  r   rP  inheritabler  r.  r  rQ  rp   r  r#  r  r  rM   r  r  rN  r1   r  r_  r	  r   r!   rk  r3  r4  rO  rc   r  r-   validate_modelr*   r8  )r  r	  basesrQ  rS  Zmeta_optionsr$  r  r  rA  pk_nameZ	parent_pkr  	base_metaZall_inheritableZsoptsr  ZSchemar"  r]  rx   r#  Zexc_nameZ	exc_attrsZexception_classrl  r  r`   r  j  s    





 





zModelBase.__new__c                 C   s
   d| j  S )Nz<Model: %s>)rb   r\  r]   r]   r`   r    s    zModelBase.__repr__c                 C   s   t |  S r\   )rK  r  r\  r]   r]   r`   r    s    zModelBase.__iter__c                 C   s
   |  |S r\   )	get_by_idr^   r]  r]   r]   r`   r    s    zModelBase.__getitem__c                 C   s   |  || d S r\   )	set_by_id)r^   r]  rx   r]   r]   r`   r    s    zModelBase.__setitem__c                 C   s   |  | d S r\   )delete_by_idr  r]   r]   r`   r    s    zModelBase.__delitem__c                 C   s0   z|  | W n | jk
r&   Y dS X dS d S r  )r  r-   r  r]   r]   r`   rc    s
    zModelBase.__contains__c                 C   s   |    S r\   )r  r  r\  r]   r]   r`   r|    s    zModelBase.__len__c                 C   s   dS r  r]   r\  r]   r]   r`   __bool__  rs   zModelBase.__bool__c                 C   s   | | jjS r\   )r  r  r  r  r]   r]   r`   r    s    zModelBase.__sql__)rb   rc   rd   r  r  r  r  r  r  r  r  rc  r|  r  __nonzero__r  ro  r]   r]   rl  r`   r  d  s*   
     [r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r  c                 C   s   || _ || _|| _|| _d S r\   )r  r  r  r  )r^   r  r  r  r  r]   r]   r`   r]    s    z_BoundModelsContext.__init__c                 C   sF   g | _ | jD ]2}| j |jj |j| j| j| jt| jd q| jS N)r  )	rG  r  r_  r  r  r3  r  r  r  )r^   r|  r]   r]   r`   rh    s    
z_BoundModelsContext.__enter__c                 C   s8   t | j| jD ]$\}}|j|| j| jt| jd qd S r  )r]  r  rG  r3  r  r  r  )r^   r  r  r  r|  r  r]   r]   r`   ri    s    z_BoundModelsContext.__exit__N)rb   rc   rd   r]  rh  ri  r]   r]   r]   r`   r    s   r  c                   @   s0  e Zd Zdd Zdd Zedd Zedbdd	Zed
d Zedd Z	edcddZ
eddddZededdZedd ZedfddZedgddZedd Zedd Zedd Zedhd d!Zedid"d#Zed$d% Zed&d' Zed(d) Zed*d+ Zed,d- Zed.d/ Zed0d1 Zed2d3 Zd4d5 ZeeZej d6d7 Zd8d9 Z!d:d; Z"d<d= Z#djd?d@Z$dAdB Z%edCdD Z&dkdFdGZ'dldHdIZ(dJdK Z)dLdM Z*dNdO Z+dPdQ Z,edmdRdSZ-edndTdUZ.edVdW Z/edodXdYZ0edpdZd[Z1ed\d] Z2ed^d_ Z3ed`da Z4dS )qr@   c                 O   sP   | dd ri | _n| j | _t| j| _i | _|D ]}t| |||  q6d S )N__no_default__)r  r  r  r  r  r  r  rO  )r^   rR  rS  r  r]   r]   r`   r]    s    zModel.__init__c                 C   s   | j jdk	rt| jS dS )NFzn/a)r  rP  r  _pkr\  r]   r]   r`   r}    s    zModel.__str__c                 C   s   d S r\   r]   r  r]   r]   r`   r  	  s    zModel.validate_modelNc                 C   s
   t | |S r\   )r  )r  r  r]   r]   r`   r    s    zModel.aliasc                 G   s    | }|s| j j}t| ||dS )N)
is_default)r  rl  ModelSelect)r  r"  r  r]   r]   r`   r    s    zModel.selectc              	   C   s   i }|rt |ts&|r"td| |S |D ]b}zt |tr>|n
| jj| }W n2 tk
r~   t |tsvtd||f |}Y nX || ||< q*|r|D ]D}z|| || jj| < W q tk
r   || |t| |< Y qX q|S )Nz/Data cannot be mixed with keyword arguments: %sz$Unrecognized field name: "%s" in %s.)	rp   rT  r  r1   r  r  r   r<  r   )r  r  rS  
normalizedr]  r#  r]   r]   r`   _normalize_data  s6    



zModel._normalize_datac                 K   s   t | | ||S r\   )ModelUpdater  )r  _Model__datar   r]   r]   r`   r   3  s    zModel.updatec                 K   s   t | | ||S r\   )ModelInsertr  r  r  rY  r]   r]   r`   rY  7  s    zModel.insertc                 C   s   t | ||dS rW  r  r  r  r"  r]   r]   r`   insert_many;  s    zModel.insert_manyc                    s     fdd|D }t  ||dS )Nc                    s$   g | ]}t |trt |n|qS r]   )rp   ru  r   r^  r  r]   r`   r3  A  s   z%Model.insert_from.<locals>.<listcomp>rX  r  )r  r  r"  r  r]   r  r`   insert_from?  s    
zModel.insert_fromc                 K   s   | j |f|dS r  r_  r  r]   r]   r`   r   E  s    zModel.replacec                 C   s   | j ||ddS )N)r  r"  r^  )r  r`  r  r]   r]   r`   replace_manyI  s     zModel.replace_manyc                 G   s   t | ||S r\   )ModelRaw)r  r  r  r]   r]   r`   rawO  s    z	Model.rawc                 C   s   t | S r\   )ModelDeleter  r]   r]   r`   rc  S  s    zModel.deletec                 K   s   | f |}|j dd |S )NT)force_insert)save)r  r  instr]   r]   r`   createW  s    
zModel.createc                    s"  |d k	rt ||}n|g}tjj}jjrBjjj}|| jjj	rdjjdk	rdj
 }nd }fdd|D }g  |D ](}t|tr |j q |j q|D ]l}	 fdd|	D }
j|
|d }|r|d k	rt||	D ],\}}t||D ]\}}t||j| q qqd S )NFc                    s   g | ]} j j| qS r]   )r  r"  rh  r  r]   r`   r3  o  s     z%Model.bulk_create.<locals>.<listcomp>c                 3   s    | ]  fd dD V  qdS )c                    s   g | ]}t  |qS r]   r  rX  r|  r]   r`   r3  x  s     z/Model.bulk_create.<locals>.<genexpr>.<listcomp>Nr]   )r/  )rQ  r  r`   rF  x  s   z$Model.bulk_create.<locals>.<genexpr>r  )r   r8  r  r  r  rP  r	  r  r  r  r  rp   r5   r_  r%  r  rv  r]  rO  )r  
model_list
batch_sizebatchesrV  r  Z	pk_fieldsr"  r#  batchr   rE  rp  r|  pk_fieldZobj_idr]   )rQ  r  r`   bulk_create]  s6    





zModel.bulk_createc                    s  t  jjtrtd fdd|D }dd |D }|d k	rJt||}n|g}d} jj}|D ]}dd |D }	i }
t||D ]\\}}g }|D ]8}t||}t |ts|	|}|
|	|j|f qt||}||
|< q| |
 jj|	 7 }q`|S )NzGbulk_update() is not supported for models with a composite primary key.c                    s&   g | ]}t |tr jj| n|qS r]   )rp   ru  r  r"  rX  r  r]   r`   r3    s   z%Model.bulk_update.<locals>.<listcomp>c                 S   s"   g | ]}t |tr|jn|jqS r]   )rp   r5   r%  r	  r^  r]   r]   r`   r3    s   r   c                 S   s   g | ]
}|j qS r]   )r  rO  r]   r]   r`   r3    s     )rp   r  rP  r!   r  r   r]  r   r<  r  r_  r  r   r   r  r  rv  )r  r  r"  r  rQ  r  rN  rA  r  Zid_listr   r#  r   r   r|  rx   caser]   r  r`   bulk_update  s:    





zModel.bulk_updatec                 C   s
   t | dS r  )NoopModelSelectr  r]   r]   r`   noop  s    z
Model.noopc                 O   s`   |   }|rHt|dkr>t|d tr>|| jj|d k}n
|j| }|rX|jf |}| S r  )	r  r   rp   r   r  r  rP  r  r  )r  r  filterssqr]   r]   r`   r    s    
z	Model.getc                 O   s(   z| j ||W S  tk
r"   Y nX d S r\   )r  r-   )r  r  r  r]   r]   r`   get_or_none  s    zModel.get_or_nonec                 C   s   |  | jj|kS r\   )r  r  rP  r  rA  r]   r]   r`   r    s    zModel.get_by_idc                 C   s6   |d kr|  | S | || jj|k S d S r\   )rY  rv  r   r  r  rP  )r  r]  rx   r]   r]   r`   r    s
    

zModel.set_by_idc                 C   s   |   | jj|k S r\   )rc  r  r  rP  rv  r  r]   r]   r`   r    s    zModel.delete_by_idc                 K   s
  | di }|  }| D ]\}}|t| ||k}qz| dfW S  | jk
r   zH|rl|| | jj	
 $ | jf |dfW  5 Q R  W  Y S Q R X W nZ tk
 r } z:z| dfW  W Y $ Y S  | jk
r   |Y nX W 5 d }~X Y nX Y nX d S )Nr  FT)r  r  rZ  r  r   r  r-   r   r  r  rv  r  r:   )r  rS  r  r  r#  rx   excr]   r]   r`   get_or_create  s"    
,zModel.get_or_createc                 O   s   |   j||S r\   )r  r  )r  Zdq_nodesr  r]   r]   r`   r    s    zModel.filterc                 C   s    | j jdk	rt| | j jjS d S r  )r  rP  r   r  r\  r]   r]   r`   get_id  s    zModel.get_idc                 C   s   t | | jjj| d S r\   )rO  r  rP  r	  r  r]   r]   r`   r    s    z	Model._pkc                 C   s   | j j| jkS r\   )r  rP  r  r\  r]   r]   r`   _pk_expr  s    zModel._pk_exprc                 C   sB   i }|D ]4}t |tr"| jj| }|j|kr||j ||j< q|S r\   )rp   ru  r  r  r	  )r^   
field_dictonlyZnew_datar#  r]   r]   r`   _prune_fields  s    

zModel._prune_fieldsc                 C   s`   | j jD ]R}|j}||ko4|| d ko4| j|d k	}|rt| |t| | | j| ||< qd S r\   )r  r  r	  r  r  rO  r   r  )r^   r  Zforeign_key_fieldforeign_key
conditionsr]   r]   r`   _populate_unsaved_relations  s    
z!Model._populate_unsaved_relationsFc           	      C   sx  | j  }| jjdk	r&| jj}| j}nd  }}|d k	rD| ||}n,| jjrp|sp| || j}|sp| j	  dS | 
| d}| jjr|d kr||jd  |d k	r|s| jjr|jD ]}||d  qn||jd  |std| jf ||   }n^|d k	rR| jf | }|d k	rb| jjs<|d krb|| _| j|j n| jf |  |  jt|8  _|S )NFr   zno data to save!)r  r'  r  rP  r  r   r  dirty_fieldsr  r  r  r  r  r	  rk  rV  r  r   r  r  rv  rY  r7  r  )	r^   r  r  r  r  Zpk_valuer  Zpk_part_namerA  r]   r]   r`   r    sD    




z
Model.savec                 C   s
   t | jS r\   )r  r  r\  r]   r]   r`   is_dirty8  s    zModel.is_dirtyc                    s    fdd j jD S )Nc                    s   g | ]}|j  jkr|qS r]   )r	  r  rX  r\  r]   r`   r3  =  s      z&Model.dirty_fields.<locals>.<listcomp>)r  rl  r\  r]   r\  r`   r  ;  s    zModel.dirty_fieldsTc                 c   s  t | }t | d fg}i }t }|r| \}}||kr:q || |jj D ]\}	}
|
|ksh|d kr||	| j|	jj	 k}n|	|> }|

|
jj|}|	jr|rP||
g ||	f |	jr|r||
 qP||
|f qPq tt|D ]$}||dD ]\}}||fV  qqd S r  )r  r  r  r  r  r  rZ  r  r  r	  r  rP  r  r  r.  r_  r  r  r  )r^   Zsearch_nullableexclude_null_childrenZmodel_classr  Zqueriesr  r  r  r  r  r  r  r   r  qr]   r]   r`   dependencies?  s0    


zModel.dependenciesc                 C   sv   |r\| j | dD ]H\}}|j}|jrH|sH|jf |jd i|  q| |  qt|  | 	  S )N)r  )
r  r|  r  r   r	  r  rv  rc  r  r  )r^   r  Zdelete_nullabler  r  r|  r]   r]   r`   delete_instance^  s    
zModel.delete_instancec                 C   s   t | j| jfS r\   )r$  rm  r  r\  r]   r]   r`   r&  h  s    zModel.__hash__c                 C   s"   |j | j ko | jd k	o | j|jkS r\   )rm  r  r'  r]   r]   r`   r)  k  s
    
zModel.__eq__c                 C   s
   | |k S r\   r]   r'  r]   r]   r`   r*  q  s    zModel.__ne__c              	   C   sj   |j jd k	rF|j jrFz|t| |j jdW S  ttfk
rD   Y nX |tt| | jj	j
| jj	jdS )Nr  )r  r  r  r  rX   r  r  r   r  rP  r	  r  r  r]   r]   r`   r  t  s    zModel.__sql__c           
      C   sp   | j j|k	}| j | |s |rl|d kr.t }| j j||d}|D ](\}}}	||krB|j | || qB|S )N)r  r  )r  r  r  r  r  r  )
r  r  r  r  r  Zis_differentGr  r|  
is_backrefr]   r]   r`   r3    s    z
Model.bindc                 C   s   t | f|||S r\   r  )r  r  r  r  r]   r]   r`   rU    s    zModel.bind_ctxc                 C   s   | j }| jj|jj|jS r\   )r  rN  r  r  r  rb   rQ  )r  Mr]   r]   r`   r    s    zModel.table_existsc                 K   s`   d|krt d |d}|r4| jjjs4|  r4d S | jjrL|d| jj | jj	|f| d S )NZfail_silentlyzU"fail_silently" has been deprecated in favor of "safe" for the create_table() method.re  )
r   r  rN  r  r  r  r  re  r.  r  )r  r  r  r]   r]   r`   r    s    
zModel.create_tablec                 K   sH   |r| j jjs|  sd S | jjr2|d| jj | j j||f| d S )Nre  )rN  r  r  r  r  re  r.  r  )r  r  r  r  r]   r]   r`   r    s    zModel.drop_tablec                 K   s   | j jf | d S r\   )rN  r  )r  r  r]   r]   r`   r    s    zModel.truncate_tablec                 O   s   t | |f|S r\   )rA   r  r"  rS  r]   r]   r`   rL    s    zModel.indexc                 O   sN   t |dkr2t|d ttfr2| jj|d  n| jjt| |f| d S r  )r   rp   rP   r8   r  rZ  r_  rA   r  r]   r]   r`   	add_index  s    zModel.add_index)N)N)N)N)N)N)N)N)FN)TF)FF)TTN)TT)T)TT)5rb   rc   rd   r]  r}  classmethodr  r  r  r  r   rY  r  r  r   r  r  rc  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r	  r&  r)  r*  r  r3  rU  r  r  r  r  rL  r  r]   r]   r]   r`   r@     s   






"&








	
+






c                   @   sJ   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S )r  z3Provide a separate reference to a model in a query.Nc                 C   s   || j d< || j d< d S )Nr|  r  )r  )r^   r|  r  r]   r]   r`   r]    s    
zModelAlias.__init__c              	   C   s   | j f| j j D ]H}z*|j| }t|tr<|d | W   S W q tk
rV   Y qY qX qt| j |}t|trt	
| || j|< | j| S |S r\   )r|  r9  r  rp   r  r  r   r   r1   
FieldAliasr  )r^   r   r  rY  
model_attrr]   r]   r`   r     s    



zModelAlias.__getattr__c                 C   s   t dd S )Nz'Cannot set attributes on model aliases.r  r   r]   r]   r`   r     s    zModelAlias.__setattr__c                    s    fdd j jjD S )Nc                    s   g | ]}t  |qS r]   r  )r/  rN  r\  r]   r`   r3    s     z0ModelAlias.get_field_aliases.<locals>.<listcomp>)r|  r  r  r\  r]   r\  r`   get_field_aliases  s    zModelAlias.get_field_aliasesc                 G   s   |s|   }t| |S r\   )r  r  )r^   	selectionr]   r]   r`   r    s    zModelAlias.selectc                 K   s   | j f |S r\   r  r  r]   r]   r`   rW    s    zModelAlias.__call__c                 C   sp   |j tkr|| jS | jr(| j|j| < |j tkrX|| jjj	dt
|j|  S |t
|j|  S d S r  )r  r  r  r|  r  r  r  r  r^  r  r=  r  r]   r]   r`   r    s    

zModelAlias.__sql__)N)rb   rc   rd   rn  r]  r   r   r  r  rW  r  r]   r]   r]   r`   r    s   
r  c                   @   sP   e Zd Z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S )r  c                 C   s   || _ |j| _|| _d S r\   )r(  r|  r#  )r^   r(  r#  r]   r]   r`   r]    s    zFieldAlias.__init__c                 C   s    G dd d| t |}|||S )Nc                   @   s   e Zd ZdS )z&FieldAlias.create.<locals>._FieldAliasNr  r]   r]   r]   r`   _FieldAlias  s   r  )r  )r  r(  r#  r  r]   r]   r`   r    s    zFieldAlias.createc                 C   s   t | j| jS r\   )r  r(  r#  r\  r]   r]   r`   r    s    zFieldAlias.clonec                 C   s   | j |S r\   )r#  r  r  r]   r]   r`   r    rs   zFieldAlias.adaptc                 C   s   | j |S r\   )r#  r  r  r]   r]   r`   r    rs   zFieldAlias.python_valuec                 C   s   | j |S r\   )r#  r  r  r]   r]   r`   r    rs   zFieldAlias.db_valuec                 C   s   |dkr| j S t| j|S )Nr|  )r(  r   r#  r   r]   r]   r`   r     s    zFieldAlias.__getattr__c                 C   s   | t| j| jjS r\   )r  r    r(  r#  r  r  r]   r]   r`   r    s    zFieldAlias.__sql__N)rb   rc   rd   r]  r  r  r  r  r  r  r   r  r]   r]   r]   r`   r     s   
r  c                    sJ   t t  g  fdd dd }t|dD ]} | q8S )Nc                    sj   | krf| krf |  | jj D ]\}}|js& | q&| jjr\| jjD ]} | qN|  d S r\   )r  r  r  rZ  r`  r  r_  )r|  r  r  
dependencydfsr  r  r  r]   r`   r    s    


zsort_models.<locals>.dfsc                 S   s   | j j| j jfS r\   )r  r	  r  )r   r]   r]   r`   rr   *  rs   zsort_models.<locals>.<lambda>r  )r  r  )r  rk  r   r]   r  r`   r    s    
r  c                       sB   e Zd ZejZ fddZejd
ddZ	dd Z
dd	 Z  ZS )_ModelQueryHelperc                    s(   t t| j|| | js$| jjj| _d S r\   )rk  r  r]  r  r|  r  r  rc  rl  r]   r`   r]  3  s    z_ModelQueryHelper.__init__Nc                 C   s    t j| _|d kr| jn|| _d S r\   )rc  r  ra  r|  rb  ri  r]   r]   r`   r{  8  s    z_ModelQueryHelper.objectsc                 C   s   | j p
| j}|tjkr | |S |tjkr:t|| j| jS |tj	krTt
|| j| jS |tjkrnt|| j| jS |tjkrt|| j| j| jS td| d S rk  )ra  rl  rc  r  _get_model_cursor_wrapperr  ModelDictCursorWrapperr|  r  r  ModelTupleCursorWrapperr  ModelNamedTupleCursorWrapperr  ModelObjectCursorWrapperrb  r  rq  r]   r]   r`   rs  =  s"    





 z%_ModelQueryHelper._get_cursor_wrapperc                 C   s   t || jg | jS r\   )r  r|  r~  r]   r]   r`   r  N  s    z+_ModelQueryHelper._get_model_cursor_wrapper)N)rb   rc   rd   rc  r  rl  r]  r<  r'  r{  rs  r  ro  r]   r]   rl  r`   r  0  s   r  c                       s$   e Zd Z fddZdd Z  ZS )r  c                    s,   || _ d| _tt| jf ||d| d S )Nr]   r  )r|  r  rk  r  r]  )r^   r|  r  r  rS  rl  r]   r`   r]  S  s    zModelRaw.__init__c              	   C   sL   z|   d W S  tk
rF   |  \}}| jd| j||f Y nX d S )Nr   =%s instance matching query does not exist:
SQL: %s
Params: %s)rv  r  r  r|  r-   r  r]   r]   r`   r  X  s    
zModelRaw.get)rb   rc   rd   r]  r  ro  r]   r]   rl  r`   r  R  s   r  c                   @   sn   e Zd Zdd ZeZdd ZeZdd ZeZdd Z	e	Z
d	d
 Zdd ZdddZdddZejdd ZdS )BaseModelSelectc                 C   s   t | j| d|S )Nr  ModelCompoundSelectQueryr|  r   r]   r]   r`   r  c  s    zBaseModelSelect.union_allc                 C   s   t | j| d|S )Nr  r   r   r]   r]   r`   r  g  s    zBaseModelSelect.unionc                 C   s   t | j| d|S )Nr  r   r   r]   r]   r`   r  k  s    zBaseModelSelect.intersectc                 C   s   t | j| d|S )Nr  r   r   r]   r]   r`   r  o  s    zBaseModelSelect.except_c                 C   s   | j s|   t| j S r\   )r`  rv  rK  r\  r]   r]   r`   r  s  s    zBaseModelSelect.__iter__c                 O   s   t | f||S r\   )rH   )r^   
subqueriesrS  r]   r]   r`   rH   x  s    zBaseModelSelect.prefetchNc              	   C   s`   |  dd}d |_z||d W S  tk
rZ   | \}}| jd|j||f Y nX d S )Nr   r   r  )r  r`  rv  r  r  r|  r-   )r^   r  r  r  r  r]   r]   r`   r  {  s    
zBaseModelSelect.getc                 C   s,   z| j |dW S  | jjk
r&   Y nX d S )N)r  )r  r|  r-   rT  r]   r]   r`   r    s    zBaseModelSelect.get_or_nonec                    sn   g }|D ]Z t  r$| jj qt trX js<td| fdd jD  q|  q|| _	d S )Nr  c                    s   g | ]}t  |qS r]   r  r  r  r]   r`   r3    s   z,BaseModelSelect.group_by.<locals>.<listcomp>)
r  r  r  rl  rp   rR   rL  r  r_  r  r  r]   r  r`   r    s    

zBaseModelSelect.group_by)N)N)rb   rc   rd   r  r   r  r?  r  r=  r  r>  r  rH   r  r  r<  r'  r  r]   r]   r]   r`   r  b  s   

r  c                       s$   e Zd Z fddZdd Z  ZS )r!  c                    s   || _ tt| j|| d S r\   )r|  rk  r!  r]  r  rl  r]   r`   r]    s    z!ModelCompoundSelectQuery.__init__c                 C   s   | j |S r\   )rd  r  r~  r]   r]   r`   r    s    z2ModelCompoundSelectQuery._get_model_cursor_wrapper)rb   rc   rd   r]  r  ro  r]   r]   rl  r`   r!    s   r!  c                    sz   g }| D ]l t  r$| jj qt tr>|   qt trj jrj| fdd jD  q|	  q|S )Nc                    s   g | ]}t  |qS r]   r  r  fmr]   r`   r3    s     z+_normalize_model_select.<locals>.<listcomp>)
r  r  r  rl  rp   r  r  rR   rL  r_  )fields_or_modelsr"  r]   r#  r`   _normalize_model_select  s    
r&  c                       s   e Zd Zd& fdd	Z fddZ fddZ fdd	Zd'ddZdd Zdd Z	d(ddZ
ejejd
d
d
fddZd)ddZejd
d
fddZdd Zd*ddZdd Zdd  Zd+d"d#Zd,d$d%Z  ZS )-r  Fc                    s8   | | _ | _i | _|| _t|}tt| |g| d S r\   )r|  	_join_ctx_joins_is_defaultr&  rk  r  r]  )r^   r|  r%  r  r"  rl  r]   r`   r]    s
    zModelSelect.__init__c                    s   t t|  }t|j|_|S r\   )rk  r  r  rT  r(  r  rl  r]   r`   r    s    zModelSelect.clonec                    s,   |s
| j s(d| _ t|}tt| j| S | S r  )r)  r&  rk  r  r  )r^   r%  r"  rl  r]   r`   r    s
    
zModelSelect.selectc                    s   d| _ t|}tt| j| S r  )r)  r&  rk  r  r  )r^   r  r"  rl  r]   r`   r    s    zModelSelect.select_extendNc                 C   s   |d kr| j n|| _| S r\   )r|  r'  r  r]   r]   r`   switch  s    zModelSelect.switchc                 C   sV   t |r|dfS t|tr*|jr*|jdfS t|tr>|jdfS t|trR|jdfS dS )NTFr  )r  rp   rR   rH  r  r|  r  )r^   r\  r]   r]   r`   
_get_model  s    




zModelSelect._get_modelc                 C   s  t |t}|r |p|j}| }| |\}}| |\}}	|r|r|| _|}
|rZ|	st |tr|j|kr~|jj	|j
 }n,|j|kr|jj	|j
 }ntd|||f d }nt |tr|}d }nd }| ||||\}}|d krR|rdnd}|	rdnd}|r(t|t||}t|t|j|}n"t|t||}t|t|j|}||k}|sz|d k	rp|sp|j
}n|jj
}n2|r|d k	r||jkr|std||f n:t |trt}
|p|j}|st |tr|p|j}|||
fS )Nz2"on" clause Column %s does not belong to %s or %s.r	  r  zhCannot assign join alias to "%s", as this attribute is the object_id_name for the foreign-key field "%s")rp   r  r  r  r+  r'  r    r(  r  r  r	  r   r1   _generate_on_clauser   r  r%  r  r  rT  rR   rb   )r^   r\  r  r  r   Zon_aliasr<  Zsrc_is_modelZ
dest_modelZdest_is_modelrj  r(  fk_fieldr  Zsrc_attrZ	dest_attrrd  r   r]   r]   r`   _normalize_join  sn    




   

zModelSelect._normalize_joinc                    st  |j }d  }||jkr$|j| }n||jkr<|j| }d |s^|d k	rLdS td||f n2d k	rttrvjn fdd|D }t|dkr|d  fS |d kr|D ]}|j|j jkr| f  S qtd	||f d t|t	rl|j
|j }}	t|}
t|tr<t|tr(|jn|}||
krl|n0t|	trlt|	trZ|	jn|	}||
krl|dfS )
NFTr  zXUnable to find foreign key between %s and %s. Please specify an explicit join condition.c                    s&   g | ]}|ks r|j kr|qS r]   )r  rX  r  rw  r(  r]   r`   r3  7  s
     
z3ModelSelect._generate_on_clause.<locals>.<listcomp>r   r   zUMore than one foreign key between %s and %s. Please specify which you are joining on.)r  r?  r  r  rp   r  r#  r   r	  r   rd  r   r  r1   )r^   r\  r  r(  r  r$  r  r  rd  r   Zfk_setZlhs_fZrhs_fr]   r/  r`   r,     sP    




zModelSelect._generate_on_clausec                 C   s   |d kr| j n|}|tjks&|tjkr,d}n\|tjkrx| ||||\}}}|r| j|g  | j| ||||f n|d k	rt	d| j
st	d| j
 }| j
t|||| d S )NTz)Cannot specify on clause with cross join.r  )r'  r>   r  r  r  r.  r(  r.  r_  r  r  r  r  )r^   r  r  r  r\  r   rj  r  r]   r]   r`   r-  a  s    

zModelSelect.joinc                 C   s   |  |tj|||S r\   r  )r^   r  r  r\  r   r]   r]   r`   r  u  s    zModelSelect.left_outer_joinc                 C   s   |  |||||S r\   r,  )r^   r\  r  r  r  r   r]   r]   r`   	join_fromx  s    zModelSelect.join_fromc                 C   s@   t | jdkr(| js(t|| j| j| jS t|| j| j| j| jS r  )r   r  r(  r  r|  r  ModelCursorWrapperr~  r]   r]   r`   r  {  s      z%ModelSelect._get_model_cursor_wrapperc           	      K   sT   | j }| j|g D ]\}}}}||kr|   S q| |j|fd|i||S )Nr  )r'  r(  r  r*  r-  )	r^   lmrmr  Zjoin_kwargsZjoin_ctxr  r  rj  r]   r]   r`   ensure_join  s
    
zModelSelect.ensure_joinc              	   C   sD  g }g }t tf}t| D ]\}}| j}d|krb|ddd tkrb|dd\}}t| }n|d krttd }ntd }d|krt||}	n|dD ]}
| j	
|dD ]N\}}}}zt||
d }	W n   Y nX ||
kst|tr|j|
kr|} qqt||
}	|d k	rt|	|r|	j}||	 q|||	| q||fS )Nr-  r   r   r   r]   )r5   r  r  rZ  r|  rsplitr,   r   r   r(  r  rp   r  r  r  r_  )r^   Zqdictr   joinsfksr]  rx   r  r-  r  piecer  r   r  r]   r]   r`   convert_dict_to_node  s<    

  
z ModelSelect.convert_dict_to_nodec                 O   s  |r*|r*t tjdd |D tf |@ }n@|rLt tjdd |D t @ }n|rbtf |t @ }n|  S t|g}g }t }|r0|	 }t
|tsqd|jfd|jffD ]~\}}	t
|	tr"| |	j\}
}|D ] }||kr|| || qt tj|
}|	jrt|}t||| q||	 qq|r<|sB|j}|  }
|D ]T}t
|trr|j|j }}|}n t
|tr|j|j }}|j}|
|||}
qN|
|S )Nc                 S   s   g | ]}|  qS r]   r  r/  r@  r]   r]   r`   r3    s     z&ModelSelect.filter.<locals>.<listcomp>c                 S   s   g | ]}|  qS r]   r  r:  r]   r]   r`   r3    s     rd  r   )ro   rW  rX  r/   r  r  r  r  r  r  rp   r   rd  r   r9  r  r_  r  r>  r  rO  r5   r|  r  r  r#  r4  r  )r^   rR  rS  Zdq_noder  Zdq_joinsZ
seen_joinsr  sider8  r  r6  r-  ry  r#  r2  r3  Z	field_objr]   r]   r`   r    sT    

zModelSelect.filterTc                 K   s   | j jj|| |f|S r\   )r|  rN  rw  )r^   r	  r  r$  r]   r]   r`   r    s    zModelSelect.create_tablec                 C   sF   | j r6|r6t| jdkr6| jjjdk	r6|| jjjS |t| jS ri  )r)  r   r  r|  r  rP  r  rr  r  r]   r]   r`   r    s
    zModelSelect.__sql_selection__)F)N)NN)NNN)N)T)F)rb   rc   rd   r]  r  r  r  r*  r+  r.  r,  r<  r'  r>   r  r-  r  r0  r  r4  r9  r  r  r  ro  r]   r]   rl  r`   r    s$   
C
A

#3
r  c                   @   s   e Zd Zdd Zdd ZdS )r  c                 C   s   | j jj|S r\   )r|  r  r  r  r  r]   r]   r`   r    s    zNoopModelSelect.__sql__c                 C   s   t |S r\   )rn  r~  r]   r]   r`   rs    s    z#NoopModelSelect._get_cursor_wrapperN)rb   rc   rd   r  rs  r]   r]   r]   r`   r    s   r  c                       s0   e Zd Z fddZ fddZdd Z  ZS )_ModelWriteQueryHelperc                    s"   || _ tt| j|f|| d S r\   )r|  rk  r<  r]  r  rl  r]   r`   r]    s    z_ModelWriteQueryHelper.__init__c                    s@   g }|D ]&}t |r$||jj q|| qtt| j| S r\   )r  r  r  rl  r_  rk  r<  r  )r^   r  r   r  rl  r]   r`   r    s    z _ModelWriteQueryHelper.returningc                 C   s   | j jj}|j|j|< d S r\   )r|  r  r  rb   r  )r^   r  r  r]   r]   r`   r     s    
z'_ModelWriteQueryHelper._set_table_alias)rb   rc   rd   r]  r  r  ro  r]   r]   rl  r`   r<    s   	r<  c                   @   s   e Zd ZdS )r  Nr  r]   r]   r]   r`   r    s   r  c                       s>   e Zd ZejZ fddZ fddZdd Zdd Z	  Z
S )	r  c                    sH   t t| j|| | jd krD| jjjd k	rD| jjjjrD| jj | _d S r\   )	rk  r  r]  r  r|  r  r  r  r  rc  rl  r]   r`   r]    s    zModelInsert.__init__c                    s&   |r| j d krtj| _ tt| j| S r\   )ra  rc  r  rk  r  r  r  rl  r]   r`   r    s    zModelInsert.returningc                 C   s
   | j jjS r\   )r|  r  r  r\  r]   r]   r`   r    s    zModelInsert.get_default_datac                 C   s$   | j jj}| j jjr |dd  S |S r  )r|  r  rl  r  )r^   r"  r]   r]   r`   r    s    
zModelInsert.get_default_columns)rb   rc   rd   rc  r  rl  r]  r  r  r  ro  r]   r]   rl  r`   r  	  s
   	r  c                   @   s   e Zd ZdS )r  Nr  r]   r]   r]   r`   r  #  s   r  c                       s>   e Zd Z fddZdd ZdddZdd	 Zd
d Z  ZS )rD  c                    sD   || _ || _|jjj| _|jjj| _tt	| j
||ff|| d S r\   )	_instance	_accessorr@  r  r	  	_src_attrrA  
_dest_attrrk  rD  r]  )r^   r  accessorr  rR  rS  rl  r]   r`   r]  (  s
    zManyToManyQuery.__init__c                    s$   t |d tr  fdd|D S |S )Nr   c                    s   g | ]}t | jqS r]   )r   r@  rB  r\  r]   r`   r3  1  s     z,ManyToManyQuery._id_list.<locals>.<listcomp>)rp   r@   )r^   Zmodel_or_id_listr]   r\  r`   _id_list/  s    zManyToManyQuery._id_listFc                    s   |r|    | j t| j| jt|tr\|t j	j
} jj j j	g|d  n:t|}|sld S  fdd| |D } j|  d S )N)r"  r  c                    s    g | ]} j j jj|iqS r]   )r@  r	  rA  )r/  Zrel_idrA  rF  r]   r`   r3  E  s     z'ManyToManyQuery.add.<locals>.<listcomp>)r  r>  r   r=  r?  rp   r  r  rX   rA  r  r;  r  r@  rv  r;  rB  r  )r^   rx   rG  r  Zinsertsr]   rC  r`   r  4  s(    

 zManyToManyQuery.addc                 C   s   t | j| j}t|trZt |j| j}||}| jj	
 | jj|> | jj|k@  S t|}|sjd S | jj	
 | jj| |> | jj|k@  S d S r\   )r   r=  r?  rp   r  r|  r@  r  r>  r;  rc  r  rA  r@  rv  r;  rB  )r^   rx   rF  rR  r  r]   r]   r`   r  K  s"    




zManyToManyQuery.removec                 C   s,   t | j| j}| jj | jj|k S r\   )	r   r=  r?  r>  r;  rc  r  r@  rv  )r^   rF  r]   r]   r`   r  a  s    
zManyToManyQuery.clear)F)	rb   rc   rd   r]  rB  r  r  r  ro  r]   r]   rl  r`   rD  '  s
   
rD  c                    s    fdd}|S )Nc              	      s,   z
 | W S  t tfk
r&   |  Y S X d S r\   )r  r  r:  	conv_funcr]   r`   validatej  s    
z#safe_python_value.<locals>.validater]   )rE  rF  r]   rD  r`   safe_python_valuei  s    rG  c                       s0   e Zd Z fddZdd ZeZdd Z  ZS )BaseModelCursorWrapperc                    s$   t t| | || _|pg | _d S r\   )rk  rH  r]  r|  r  )r^   rr  r|  r  rl  r]   r`   r]  s  s    zBaseModelCursorWrapper.__init__c              	   C   s6  | j jj}| j jj}| jj}t| jj| _g | _d g| j  | _	}d g| j  | _
}t|D ]\}}|d  }}	|d}
|
dkr||
d d  }|d}| j| z| j| }W n. tk
r   ||kr||  }}nY q\Y n
X | }| }|r|	| j|< t|trB|jr&|j||< |||< |s0|j| j|< q\t|trb|jrb|j||< q\t|tr|jr|jd k	r|j||< nb|jr0t|jd tr0|jd  }t|tr|jd }| |}t|tr0t!|j||< q\||kr\|jr|| j||< t|t"r\|j#|kr\|| ||< q\d S )Nr   r+  rH  r   r{  )$r|  r  r  r  rr  r  r   r  r  
convertersr"  r  r}  r5  r_  r  r  r  r  rp   r1   r  r  r	  r  r  r  r  r  r<  r=  r%  r  rG  r    r(  )r^   r  r  r  rI  r"  r  Zdescription_itemrR  Zorig_columnZ	dot_indexr  r  r  rC  r4  r]   r]   r`   r  x  s^    








z*BaseModelCursorWrapper._initialize_columnsc                 C   s   t d S r\   r  rx  r]   r]   r`   ru    s    z"BaseModelCursorWrapper.process_row)rb   rc   rd   r]  r  r[  ru  ro  r]   r]   rl  r`   rH  r  s   IrH  c                   @   s   e Zd Zdd ZdS )r  c                 C   sl   i }| j | j }}| j}t| jD ]D}|| }||kr8q"|| d k	rZ|| || ||< q"|| ||< q"|S r\   )r  rI  r"  r  r  )r^   rp  r4  r  rI  r"  r3  r   r]   r]   r`   ru    s     z"ModelDictCursorWrapper.process_rowN)rb   rc   rd   ru  r]   r]   r]   r`   r    s   r  c                   @   s   e Zd ZeZdd ZdS )r  c                    s.   | j | j } |  fddt| jD S )Nc                    s0   g | ](} | d k	r$ | | n| qS r\   r]   r  rI  rp  r]   r`   r3    s   z7ModelTupleCursorWrapper.process_row.<locals>.<listcomp>)r  rI  rj  r  r  )r^   rp  r  r]   rJ  r`   ru    s    z#ModelTupleCursorWrapper.process_rowN)rb   rc   rd   r9  rj  ru  r]   r]   r]   r`   r    s   r  c                   @   s   e Zd Zdd ZdS )r  c                    sL       g }t jD ]}| j|  qtd| _ fdd _d S )Nr  c                    s
    j |  S r\   r  r[  r\  r]   r`   rr     rs   z9ModelNamedTupleCursorWrapper.initialize.<locals>.<lambda>)	r  r  r  r_  r  r  r  r  rj  )r^   
attributesr3  r]   r\  r`   r[    s    z'ModelNamedTupleCursorWrapper.initializeN)rb   rc   rd   r[  r]   r]   r]   r`   r    s   r  c                       s(   e Zd Z fddZ fddZ  ZS )r  c                    s(   || _ t|| _tt| ||| d S r\   )rj  r  rk  r  r]  )r^   rr  r|  r  rj  rl  r]   r`   r]    s    
z!ModelObjectCursorWrapper.__init__c                    sH   t t| |}| jr8| jf ddi|}|j  |S | jf |S d S )Nr  r   )rk  r  ru  r  rj  r  r  )r^   rp  r  rY  rl  r]   r`   ru    s    
z$ModelObjectCursorWrapper.process_rowr  r]   r]   rl  r`   r    s   r  c                       s,   e Zd Z fddZdd Zdd Z  ZS )r1  c                    s$   t t| ||| || _|| _d S r\   )rk  r1  r]  r  r6  )r^   rr  r|  r  r  r6  rl  r]   r`   r]    s    zModelCursorWrapper.__init__c                 C   s0  |    tdd | jD }| j| j }}| j| ji| _i | _g | _t	
| j}t }|r| }t|tr||j ||j qV|| jkrqVt|t}| j| D ]J\}}	}
}|| jkr|
| j|< | j||	|||f || || qqV|D ]:}|| jkrt|r|| j|< qt|tr|j| j|< q| jD ]2\}}}}}||kob||kpb||k| j|< q:g | _t|D ]\}}| j}| j| }|d k	rt|tr|j}n|j}nbt|tr|j| jkrtd| |j|jf |j}n&t|tr
| }t|t r|j}| j| q|d S )Nc                 S   s   g | ]}|d k	r|j qS r\   r  r^  r]   r]   r`   r3    s    z1ModelCursorWrapper.initialize.<locals>.<listcomp>zB%s specifies bind-to %s, but %s is not among the selected sources.)!r  r  r"  r  r  r|  key_to_constructorsrc_is_destsrc_to_destr  r  r  r  rp   r  r_  rd  r   r6  rT  r  r  r  column_keysr  r  r(  r  r  r  r  r<  r    )r^   Zselected_srcr  r  r   Zdestsr  r  r]  r   rj  r  r\  r  r  r  r  r#  r]   r]   r`   r[    sl    










zModelCursorWrapper.initializec              	   C   s  i }g }| j  D ]$\}}|dd||< |||  q|| j }t }t| jD ]p\}}|||}	| j| }
|| }|d k	r|	| | j
| r| j
| |}t|	tr||	|
< qRt|	|
| qR| jD ]\}}}}}|| }	z|| }W n tk
r   Y qY nX |	d ks|d ks||kr2| j|s2q|	|krT||krT|drTq|rd||	|< qt|	|| q|D ]}	t|	trv|	j  qv|| j S )NT)r  z
OUTER JOIN)rL  rZ  r_  r|  r  r  rO  r  r  r  rI  rp   rT  rO  rN  r   rM  r  r@   r  r  )r^   rp  r{  Zobject_listr]  rj  Zdefault_instanceZset_keysr  r  rR  rx   r\  r   r  r  r  Zjoined_instancer]   r]   r`   ru  H  sR    








zModelCursorWrapper.process_row)rb   rc   rd   r]  r[  ru  ro  r]   r]   rl  r`   r1    s   Er1  c                       s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	PrefetchQueryNc              	      s   |r`|r.|d krdd |D }dd |D }n$|d krDdd |D }dd |D }t t||}|j}tt| | ||||||S )Nc                 S   s   g | ]
}|j qS r]   r  r^  r]   r]   r`   r3    s     z)PrefetchQuery.__new__.<locals>.<listcomp>c                 S   s   g | ]}|j jqS r]   )r  r	  r^  r]   r]   r`   r3    s     c                 S   s   g | ]
}|j qS r]   )r  r^  r]   r]   r`   r3    s     c                 S   s   g | ]
}|j qS r]   r  r^  r]   r]   r`   r3    s     )r8  r]  r|  rk  rP  r  )r  r  r"  r  
rel_modelsfield_to_namer|  Zforeign_key_attrsrl  r]   r`   r    s&    
      zPrefetchQuery.__new__c           	      C   s   | j rB| jD ]2}|j|j }||f}||krt||j||  qn`| jD ]X\}}|j|jj }||f}||g }|D ]}t||| |j	  qvt||j
| qHd S r\   )r  r"  r  r	  rO  rR  r  r  r  r  r!  )	r^   r  id_mapr#  Z
identifierr]  attnameZrel_instancesr  r]   r]   r`   populate_instance  s    
zPrefetchQuery.populate_instancec                 C   sX   | j D ]L\}}|j|j| }||f}| jr8|||< q||g  || | qd S r\   )rR  r  r  r  r  r.  r_  )r^   r  rS  r#  rT  identityr]  r]   r]   r`   store_instance  s    
zPrefetchQuery.store_instance)NNNNN)rb   rc   rd   r  rU  rW  ro  r]   r]   rl  r`   rP    s       rP  Z_PrefetchQuery)r  r"  r  rQ  rR  r|  c                    s  t | g}t|D ]\}}t|tr0|\}}nd }t|tsFt|sPt|trX| }|jt	t
|d D ]}d  }}	|| }
|
j|
j } t|tr|j}jj|g }|r܇fdd|D } fdd|D }njj|}	|s|	rn| ks|d krn q.qn|rd| nd}td||f |r:|fnd }|r |tjkr|ttjfddt||D }||}nn|tjkrg }t }t||D ],\}}|tj|j|k || q| j j| ttj|d	}|t ||d
| q|	rg }g }|	D ].}t|j!j"}t |j"}|||f q|tjkr|D ]\}}|||>  qP|ttj|}nf|tjkrg }|D ]0\}}|| tj|j}|||k q| j j| ttj|d	}|t ||	d| q|S )Nr   c                    s   g | ]}t  |jqS r]   )r   r	  r/  r  )subquery_modelr]   r`   r3    s     z)prefetch_add_subquery.<locals>.<listcomp>c                    s   g | ]}t  |jjqS r]   )r   r  r	  rX  )last_objr]   r`   r3    s     z	 using %sr  z1Error: unable to find foreign key for query: %s%sc                    s   g | ]\}}|  |> qS r]   )r  )r/  r  rA  )
last_queryr]   r`   r3    s   )r  FT)#rP  r  rp   r9  r  r  r  r  r|  r  r  r  r  r?  r  r  r   rI   r   ro   rW  r  r]  r  r>   r  r_  r   rq   r  r  r  r-  r  r	  )r  r"  prefetch_typefixed_queriesr3  r  Ztarget_modelr  r7  r  ZfixedZ
last_modelrelsr>  Ztgt_errr  r)  Z
select_pksr  rA  r"  r!  r  r-  Z
select_fksrw  r]   )rZ  r[  rY  r`   prefetch_add_subquery  s    







r_  c                 O   s   |s| S | dtj}|r&td| t| ||}i }i }t|D ]}|j}|jrx|jD ]}	|	|	g  ||	 
| qX|	|i  || }
t||}|jD ]:}|jr|||
 |r|| D ]}||||j  qqqBt|jS )Nr\  zUnrecognized arguments: %s)r  rI   r   r  r_  r  r|  r"  rQ  r.  r_  r  r  r  rW  rU  r8  )r  r"  rS  r\  r]  depsZrel_mappqZquery_modelr  rS  Zhas_relationsr  r  r]   r]   r`   rH     s0    

)N)NN)NN)N)F)r)  )N(X  bisectr   r   
contextlibr   r'  r   	functoolsr   inspectr	   r  r  r   r  r,  r  loggingrW  r%  r  r  rh   rZ  r   rl  r   collections.abcr
   ImportErrorZ	pysqlite3r   Zpysq3Z	pysqlite2r  sqlite_version_infoZpsycopg2cffir   r  r-  r   r/  r   r7  Zpsycopg2.extrasr   Zpg_register_uuidr  Zpsycopgr:  rP  ZpymysqlrQ  ZMySQLdb__version____all__r[   Handler	getLoggerrn  
addHandlerr  unicoder  r  r  bufferr  rJ  callabler  r8  r9  	frozensetr  r  execrm   builtinsrn   ro   r  r  ru  r   r  r  r   r  rz   r   r   register_adapterr  r   r   r   r   register_converterr  r   r   r   r_  r   r   r   rT  r   rI  r  rD   r   r   ler   ger   lshiftr,   rS  r>   rc  rI   r  r  r  r  r  r  r  r  compiler?  rA  r#  r&  r*  r5  r  r;  r>  rD  r   rP  rK   r%   r  r  r  r  r  r"   r  r  r<  r  r  r   r  r  r   r7  r  r:  r;  rF  rR   r  rY   r  r  r    r  r  r  r  r  r  r  r  rX   r  r   r   r  r  r  r   r  r=  rP   r   r  r4   rZ   r  r#  r   r*  r  rr  rn  r6  r9  r0   r/   rV   rL   rA  rB  r^  r_  r~  r  r  r  r  r  rO   r  ra  r[  rb  r8   rA   r'  r1  r7   r$   r&   r:   r;   r<   rC   rE   rJ   r4  Z
EXCEPTIONSrc  r>  r?  rA  rD  rE  localrL  rM  rr  r#   r  rQ   rF   rB   rx  ru  r{  r~  rn  rm  ro  rp  rt  r  r  r  r  r1   r   r9   r   rN   r   r   r6   rG   r3   r.   r)   r  r   r2   rS   r   r   r  r  r   rW   r   r  r   r%  r  r(   r'   rT   r  rU   r=   r   r   r5   r*   r+   r=  r>  r?   rS  r!   r_  rM   r  r  r-   r  r  r  r@   r  r  r  r  r  r  r!  r&  r  r  r<  r  r  r  rD  rG  rH  r  r  r  r  r1  rP  r_  rH   r]   r]   r]   r`   <module>   sX  


N




	


		),k"	2'
_#? '	
",F
n


:gO	DC ?42 `A(
       e d0)L

"u
	

)_			[

 #,S9% p  (    O:"<	  7B	U

 $.M