[ Avaa Bypassed ]




Upload:

Command:

hmhc3928@13.59.116.142: ~ $


R6�Wh���@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
mZddl
mZddlmZddlmZyddlmZWnek
r
eZYnXddlmZddlmZdd	lmZd
Zddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=g3Zydd>lmZWn+ek
r!Gd?d@�d@ej�ZYnXej dA�Z!e!j"e��dBZ#e$dCdD�Z%ej&ddEkZ'ej&ddFkZ(ej&ddE�dEdGfkZ)e(rddl*Z*ddHlm+Z+ddIlm,Z,dJdK�Z-e.Z/e0Z1e.Z2e3e*dL�Z4dMdK�Z5e6Z7ddNdO�Z8n=e'rOe9Z/e2Z1e:Z5dPdQ�Z4e;dR�ne<dS��e)rzdTdGZ=dUdK�Z>ndVdK�Z>yddWl?m@ZAWnek
r�dZAYnXyddlBZBWnek
r�eAZBYnXeAo�eAjCeBjCkr�eAZByddXlDmEZEeEjF�Wnek
r0YnXy ddlGZGddYlGmHZIWnek
rkdZGYnXyddlJZKWn=ek
r�yddlLZKWnek
r�dZKYnXYnXy4ddZlMmNZNdd[lMmOZOdd\lMmPZPWn9ek
r+dd]d^�ZNd_d`�ZOdadb�ZPYnXyDddclMmQZQdddlMmRZRddelMmSZSddflMmTZTWn$ek
r�dZQZRZSZTYnXeBr�eBjUejVe.�eBjUejWe.�eBjUej
e.�dgdhdidjdkdlgZXeYeX�ZZdmdndodpdqdrfZ[dsdt�Z\dgdudhdvdidodjdwdkdxdldmiZ]e]j�Z^dye^dk<dze^dl<d{d|�Z_d}d~�Z`Gdd��d�e�Zaead�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�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d�d��Zbead�d�d�d�d�d�d�d��ZcecjdZeecjfZgecjhZid�ZjdEZkdFZld�Zmd�Znd�ebjod�ebjpd�ebjqd�ebjrd�ebjsd�ebjtd�ebjud�ebjvd�ebjwd�ebjxd�ebjyiZzd�d��Z{d�d��Z|d�d��Z}Gd�d3�d3e$�Z~Gd�d�de$�ZGd�d��d�e$�Z�Gd�d��d�e$�Z�Gd�d7�d7e��Z�e�Z�Gd�d��d�e��Z�Gd�d��d�e��Z�e�d�Z�Gd�d��d�e��Z�Gd�d.�d.e��Z�Gd�d��d�e��Z�Gd�d�de��Z�Gd�d��d�e��Z�Gd�d��d�e��Z�Gd�d=�d=e��Z�d�d�Z�Gd�d�de��Z�Gd�d��d�e��Z�ed�d�d�d�d�d�d�d�d�d�d�d�f�Z�Gd�d��d�ed�d�d�d�d�f��Z�Gd�d��d�e$�Z�Gd�d�de��Z�Gd�d�de��Z�Gd�d"�d"e��Z�Gd�d�de��Z�Gd�d5�d5e��Z�Gd�d1�d1e��Z�Gd�d��d�e��Z�Gd�d�de��Z�Gd�d�de��Z�Gd�d�de��Z�ddd�Z�Gdd�de��Z�Gdd�de��Z�Gdd8�d8e��Z�Gdd
�d
e��Z�Gdd<�d<e��Z�dd	�Z�Gd
d�de��Z�Gdd�de��Z�Gd
d�de��Z�Gdd9�d9e��Z�Gdd:�d:e��Z�Gdd�de��Z�Gdd�de��Z�Gdd�de$�Z�Gdd�de$�Z�Gdd �d e��Z�Gdd�de$�Z�Gdd�de$�Z�Gdd�de$�Z�Gdd�de��Z�Gdd �d e$�Z�Gd!d"�d"e$�Z�Gd#d$�d$e��Z�Gd%d&�d&e��Z�eTdkr
e�ZTGd'd(�d(e��Z�eRdkr6
e�ZRGd)d*�d*e��Z�eQdkr^
e�ZQGd+d,�d,e��Z�ed-d.d�f�Z�Gd/d0�d0e��Z�Gd1d2�d2e��Z�Gd3d4�d4e��Z�d5d6�Z�Gd7d8�d8e��Z�Gd9d:�d:e��Z�Gd;d<�d<e��Z�Gd=d>�d>e��Z�Gd?d@�d@e��Z�GdAdB�dBe��Z�GdCdD�dDe��Z�edEdFdGdHdIdJf�Z�edKdFdLdMd�dJf�Z�edNdOdPdQdJf�Z�GdRdS�dSe��Z�GdTd!�d!e��Z�GdUd�de��Z�GdVd�de��Z�GdWd#�d#e��Z�GdXd$�d$e��Z�GdYd%�d%e��Z�GdZd,�d,e��Z�Gd[d-�d-e��Z�Gd\d2�d2e��Z�Gd]d^�d^e$�Z�Gd_d`�d`e$�Z�Gdadb�dbe�e	j��Z�Gdcdd�dde$�Z�Gded6�d6e��Z�Gdfd/�d/e��Z�Gdgd+�d+e��Z�Gdhdi�die$�Z�Gdjdk�dke��Z�Gdld;�d;e��Z�Gdmdn�dne��Z�Gdodp�dpe��Z�Gdqdr�dre��Z�Gdsdt�dte��Z�Gdudv�dve��Z�Gdwdx�dxe$�Z�eSdkr,Gdydz�dze$�ZSGd{d�de��Z�eBrWe�d|�Z�ndZ�Gd}d~�d~e$�Z�Gdd��d�e��Z�Gd�d*�d*e%e���Z�d�d��Z�d�d��Z�ed�d�d�d�d�d�d�f�Z�Gd�d��d�e��Z�d�d0�Z�d�d��Z�d�d��Z�dS(��N)�bisect_left)�bisect_right)�deque)�
namedtuple)�OrderedDict)�deepcopy)�wraps)�isclassz2.8.3�	BareField�BigIntegerField�	BlobField�BooleanField�	CharField�Check�Clause�CompositeKey�
DatabaseError�	DataError�	DateField�
DateTimeField�DecimalField�DeferredRelation�DoesNotExist�DoubleField�DQ�Field�FixedCharField�
FloatField�fn�ForeignKeyField�ImproperlyConfigured�IntegerField�IntegrityError�InterfaceError�
InternalError�JOIN�	JOIN_FULL�
JOIN_INNER�JOIN_LEFT_OUTER�Model�
MySQLDatabase�NotSupportedError�OperationalError�Param�PostgresqlDatabase�prefetch�PrimaryKeyField�ProgrammingError�Proxy�R�SmallIntegerField�SqliteDatabase�SQL�	TextField�	TimeField�TimestampField�Using�	UUIDField�Window)�NullHandlerc@seZdZdd�ZdS)r=cCsdS)N�)�self�recordr>r>�
/peewee.py�emitiszNullHandler.emitN)�__name__�
__module__�__qualname__rBr>r>r>rAr=hsr=ZpeeweeZ_metaclass_helper_cCs|t|fi�S)N)�_METACLASS_)�meta�baser>r>rA�with_metaclassssrI���)�Callable)�reducecCs
t|t�S)N)�
isinstancerM)�cr>r>rA�<lambda>}srQ�printcCst|jd��S)N�raw_unicode_escape)�bytes�encode)�sr>r>rArQ�scCs(|j|k	r|j|��|�dS)N)�
__traceback__�with_traceback)�tp�value�tbr>r>rA�reraise�sr\cCs$tjj|�tjjd�dS)N�
)�sys�stdout�write)rVr>r>rA�print_�sraz4def reraise(tp, value, tb=None): raise tp, value, tbzUnsupported python version.�
cCs)|jd|j|jddttS)Ng�i)�microsecondsZsecondsZdays�_M)�tr>r>rArQ�scCs
|j�S)N)�
total_seconds)rfr>r>rArQ�s)�dbapi2)�compat)�
extensions)�format_date_time)�sort_models_topologically)�strip_parenscCsY|pdd�}x@|D]8}y|tjj||��SWqtk
rPYqXqW|S)NcSs|S)Nr>)�xr>r>rArQ�sz"format_date_time.<locals>.<lambda>)�datetime�strptime�
ValueError)rZ�formatsZpost_process�fmtr>r>rArk�s

	rkcst���t��g�����fdd��dd�}x*t�d|dd�D]}�|�q[Wtt���S)z@Sort models topologically so that parents will precede children.cs`|�kr\|�kr\�j|�x'|jjj�D]}�|j�q8W�j|�dS)N)�add�_meta�reverse_rel�values�model_class�append)�model�foreign_key)�dfs�models�ordering�seenr>rAr|�s

z&sort_models_topologically.<locals>.dfscSs|jj|jjfS)N)ru�name�db_table)�mr>r>rArQ�sz+sort_models_topologically.<locals>.<lambda>�key�reverseT)�set�sorted�list�reversed)r}�namesr�r>)r|r}r~rrArl�s	rlcCsC|s|ddkr|Sd}}t|�}xV||kr�||dkr�||ddkr�|d7}|d7}|d8}q4Pq4W|r$d}d}x{t|||�D]f}||dkr�|d7}n||dkr�|d8}|dkr	|d7}d}||kr�Pq�W||8}|dkr?|||�S|S)Nr�(��))�len�range)rV�ct�i�lZ
unbalanced_ctZrequiredr>r>rArm�s6
$






rm)�_DictQueryResultWrapper)�_ModelQueryResultWrapper)�_SortedFieldList)�_TuplesQueryResultWrapper�year�month�day�hour�minute�secondz%Y-%m-%d %H:%M:%Sz%Y-%m-%d %H:%M:%S.%fz%Y-%m-%dz%H:%M:%Sz%H:%M:%S.%fz%H:%McCs8|tkst�|sdSt|t�}t||�S)N)�DATETIME_LOOKUPS�AssertionErrorrk�SQLITE_DATETIME_FORMATS�getattr)�lookup_type�datetime_string�dtr>r>rA�_sqlite_date_parts
r�z%Yz%Y-%mz%Y-%m-%d %Hz%Y-%m-%d %H:%Mz%Y-%m-%d %H:%iz%Y-%m-%d %H:%i:%ScCs<|tkst�|sdSt|t�}|jt|�S)N)�SQLITE_DATE_TRUNC_MAPPINGr�rkr��strftime)r�r�r�r>r>rA�_sqlite_date_trunc&s
r�cCstj||tj�dk	S)N)�re�search�I)ZregexrZr>r>rA�_sqlite_regexp-sr�c@seZdZdd�ZdS)�attrdictcCs||S)Nr>)r?�attrr>r>rA�__getattr__1szattrdict.__getattr__N)rCrDrEr�r>r>r>rAr�0sr��AND�and�OR�or�ADD�+�SUB�-�MUL�*�DIV�/�BIN_AND�&�BIN_OR�|�XOR�^�MOD�%�EQ�=�LT�<�LTEz<=�GT�>�GTEz>=�NEz!=�IN�in�NOT_INznot in�IS�is�IS_NOTzis not�LIKEZlike�ILIKEZilike�BETWEEN�between�REGEXP�regexp�CONCATz||�INNER�
LEFT_OUTERz
LEFT OUTER�RIGHT_OUTERzRIGHT OUTER�FULLr����eq�ltZlte�gtZgte�necCs|j�}|j|�|S)N)�copy�update)�sourceZ	overridesZmergedr>r>rA�
merge_dictrs
r�cs�fdd�}�|_|S)z�
    Method decorator that will "clone" the object before applying the given
    method.  This ensures that state is mutated in a more predictable fashion,
    and promotes the use of method-chaining.
    cs |j�}�|||�|S)N)�clone)r?�args�kwargsr�)�funcr>rA�inner}szreturns_clone.<locals>.inner)Z
call_local)r�r�r>)r�rA�
returns_clonews	r�cs�fdd�}|S)zu
    Method decorator to indicate a method is not allowed to be called.  Will
    raise a `NotImplementedError`.
    cs#td�t|�jf��dS)Nz!%s is not allowed on %s instances)�NotImplementedError�typerC)r?r�r�)r�r>rAr��sznot_allowed.<locals>.innerr>)r�r�r>)r�rA�not_allowed�sr�csdeZdZdZddgZdd�Zdd�Zdd	�Zd
d�Z�fdd
�Z	�S)r2zg
    Proxy class useful for situations when you wish to defer the initialization
    of an object.
    �obj�
_callbackscCsg|_|jd�dS)N)r��
initialize)r?r>r>rA�__init__�s	zProxy.__init__cCs+||_x|jD]}||�qWdS)N)r�r�)r?r��callbackr>r>rAr��s	zProxy.initializecCs|jj|�|S)N)r�ry)r?r�r>r>rA�attach_callback�szProxy.attach_callbackcCs+|jdkrtd��t|j|�S)NzCannot use uninitialized Proxy.)r��AttributeErrorr�)r?r�r>r>rAr��szProxy.__getattr__cs4||jkrtd��tt|�j||�S)NzCannot set attribute on proxy.)�	__slots__r��superr2�__setattr__)r?r�rZ)�	__class__r>rAr��szProxy.__setattr__)
rCrDrE�__doc__r�r�r�r�r�r�r>r>)r�rAr2�sc@sReZdZe�Zddd�Zdd�Zdd�Zedd	��Z	dS)
rNcCs/|dk	r+|j�|_|jj|�dS)N)�lower�_rel_model_name�_unresolvedrt)r?Zrel_model_namer>r>rAr��szDeferredRelation.__init__cCs||_||_||_dS)N)rx�fieldr�)r?rxr�r�r>r>rA�	set_field�s		zDeferredRelation.set_fieldcCs)||j_|jj|j|j�dS)N)r��	rel_model�add_to_classrxr�)r?rr>r>rA�	set_model�szDeferredRelation.set_modelcCsYttj�}xC|D];}|j|jj�kr|j|�tjj|�qWdS)N)r�rr�r�rCr�r�discard)Z	model_clsZ
unresolvedZdrr>r>rA�resolve�s


zDeferredRelation.resolve)
rCrDrEr�r�r�r�r�staticmethodrr>r>r>rAr�s
	c@seZdZddd�ZdS)�_CDescriptorNcCs|dk	rt|j�S|S)N)�Entity�_alias)r?�instance�
instance_typer>r>rA�__get__�s
z_CDescriptor.__get__)rCrDrErr>r>r>rAr�src@seZdZdZe�ZdZdd�Zedddd��Z	d	d
�Z
dd�Zed
d��Z
eddd��Zedd��Zedd��Zedd��Zdd�Zdd�Zddd�Zeej�Zeej�Zeej�Zeej�Zeej�Zeej �Z!Z"eej#�Z$eejdd�Z%eejdd�Z&eejdd�Z'eej dd�Z(Z)eejdd�Z*eejdd�Z+eej#dd�Z,dd �Z-d!d"�Z.eej/�Z0eej1�Z2eej3�Z4eej5�Z6eej7�Z8eej9�Z:eej;�Z<eej=�Z>eej?�Z@eejA�ZBd#d$�ZCd%d&�ZDdd'd(�ZEd)d*�ZFd+d,�ZGd-d.�ZHd/d0�ZId1d2�ZJd3d4�ZKdS)5�Nodez=Base-class for any part of a query which shall be composable.�nodecCs(d|_d|_d|_d|_dS)NF)�_negatedr�_bind_to�	_ordering)r?r>r>rAr��s			z
Node.__init__NFcs���fdd�}|S)Ncs5�p|j}�r!t|�}t�||�|S)N)rCr��setattr)�methodZmethod_name)r��clsr�r>rA�	decorator�s
zNode.extend.<locals>.decoratorr>)rr�r�rr>)r�rr�rA�extend�szNode.extendcCs
t|��S)N)r�)r?r>r>rA�
clone_base�szNode.clone_basecCs@|j�}|j|_|j|_|j|_|j|_|S)N)rrrrr)r?�instr>r>rAr��sz
Node.clonecCs|j|_dS)N)r)r?r>r>rA�
__invert__�szNode.__invert__cCs
||_dS)N)r)r?�ar>r>rA�alias�sz
Node.aliascCs
||_dS)z�
        Bind the results of an expression to a specific model type. Useful
        when adding expressions to a select, where the result of the expression
        should be placed on a joined instance.
        N)r)r?Zbtr>r>rA�bind_to�szNode.bind_tocCs
d|_dS)NZASC)r)r?r>r>rA�asc�szNode.asccCs
d|_dS)N�DESC)r)r?r>r>rA�descsz	Node.desccCs
|j�S)N)r)r?r>r>rA�__pos__szNode.__pos__cCs
|j�S)N)r)r?r>r>rA�__neg__
szNode.__neg__cs��fdd�}|S)z�
        Lightweight factory which returns a method that builds an Expression
        consisting of the left-hand and right-hand operands, using `op`.
        cs&�rt|�|�St|�|�S)N)�
Expression)r?�rhs)�inv�opr>rAr�szNode._e.<locals>.innerr>)r$r#r�r>)r#r$rA�_e
szNode._er#TcCs2|dkrt|tjd�St|tj|�S)N)r!�OPr�r�)r?r"r>r>rA�__eq__'szNode.__eq__cCs2|dkrt|tjd�St|tj|�S)N)r!r&r�r�)r?r"r>r>rA�__ne__+szNode.__ne__cCst|tj|�S)N)r!r&r�)r?r"r>r>rA�in_=szNode.in_cCst|tj|�S)N)r!r&r�)r?r"r>r>rA�not_in?szNode.not_incCs,|rt|tjd�St|tjd�S)N)r!r&r�r�)r?�is_nullr>r>rAr+AszNode.is_nullcCst|tjd|�S)Nz%%%s%%)r!r&r�)r?r"r>r>rA�containsEsz
Node.containscCst|tjd|�S)Nz%s%%)r!r&r�)r?r"r>r>rA�
startswithGszNode.startswithcCst|tjd|�S)Nz%%%s)r!r&r�)r?r"r>r>rA�endswithIsz
Node.endswithcCs%t|tjt|td�|��S)Nr�)r!r&r�rr3)r?�low�highr>r>rAr�KszNode.betweencCst|tj|�S)N)r!r&r�)r?�
expressionr>r>rAr�MszNode.regexpcCst|tj|�S)N)r!r&r�)r?r"r>r>rA�concatOszNode.concat)LrCrDrEr�rrP�
_node_typer��classmethodrrr�r�rrrrrrr r%r&r��__and__r��__or__r��__add__r��__sub__r��__mul__r�Z__div__�__truediv__r��__xor__�__radd__�__rsub__�__rmul__Z__rdiv__�__rtruediv__�__rand__�__ror__�__rxor__r'r(r��__lt__r��__le__r��__gt__r��__ge__r��
__lshift__r��
__rshift__r��__mod__r��__pow__r�Zbin_andr�Zbin_orr)r*r+r,r-r.r�r�r2r>r>r>rAr�sh			
rcs:eZdZdZdZ�fdd�Zdd�Z�S)r6z2An unescaped SQL string, with optional parameters.�sqlcs)||_||_tt|�j�dS)N)rZ�paramsr�r6r�)r?rZrL)r�r>rAr�Vs		zSQL.__init__cCst|j|j�S)N)r6rZrL)r?r>r>rAr[szSQL.clone_base)rCrDrEr�r3r�rr>r>)r�rAr6RscsFeZdZdZdZ�fdd�Zdd�Zdd�Z�S)	rz/A quoted-name or entity, e.g. "table"."column".�entitycs tt|�j�||_dS)N)r�rr��path)r?rN)r�r>rAr�cszEntity.__init__cCs
t|j�S)N)rrN)r?r>r>rArgszEntity.clone_basecCsttd|j|f��S)N)r�filterrN)r?r�r>r>rAr�jszEntity.__getattr__)rCrDrEr�r3r�rr�r>r>)r�rAr_s
rcs|eZdZdZdZed�Z�fdd�Zeddd	��Z	d
d�Z
dddd
d�Zdd�Z�S)�FunczAn arbitrary SQL function call.r��count�sumcsM||_||_|r-|j�|jknd|_tt|�j�dS)NF)r��	argumentsr��
_no_coerce�_coercer�rPr�)r?r�rS)r�r>rAr�rs		$z
Func.__init__TcCs
||_dS)N)rU)r?�coercer>r>rArVxszFunc.coercecCs%t|j|j�}|j|_|S)N)rPr�rSrU)r?�resr>r>rAr|szFunc.clone_baseNcCspt|t�r!|dkr!|}|dkrKtd|d|�j�}nt|j�}t|td�|�S)N�partition_by�order_byZOVER)rOr<�__sql__r6rr)r?rXrY�windowrKr>r>rA�over�sz	Func.overcs�fdd�}|S)Ncst�||�S)N)rP)r�r�)r�r>rA�dec�szFunc.__getattr__.<locals>.decr>)r?r�r]r>)r�rAr��szFunc.__getattr__)rQrR)
rCrDrEr�r3r�rTr�r�rVrr\r�r>r>)r�rArPms
rPcs=eZdZdZdZd�fdd�Zdd�Z�S)r!z0A binary expression, e.g `foo + 1` or `bar < 7`.r1Fcs;tt|�j�||_||_||_||_dS)N)r�r!r��lhsr$r"�flat)r?r^r$r"r_)r�r>rAr��s
			zExpression.__init__cCst|j|j|j|j�S)N)r!r^r$r"r_)r?r>r>rAr�szExpression.clone_base)rCrDrEr�r3r�rr>r>)r�rAr!�sr!cs=eZdZdZdZd�fdd�Zdd�Z�S)r-z�
    Arbitrary parameter passed into a query. Instructs the query compiler to
    specifically treat this value as a parameter, useful for `list` which is
    special-cased for `IN` lookups.
    �paramNcs)||_||_tt|�j�dS)N)rZ�adaptr�r-r�)r?rZra)r�r>rAr��s		zParam.__init__cCst|j|j�S)N)r-rZra)r?r>r>rAr�szParam.clone_base)rCrDrEr�r3r�rr>r>)r�rAr-�sc@seZdZdZdS)�Passthrough�passthroughN)rCrDrEr3r>r>r>rArb�srbcsFeZdZdZdZdZdZ�fdd�Zdd�Z�S)	rz8A SQL clause, one or more Node objects joined by spaces.�clause� FcsXd|kr|d|_d|kr2|d|_tt|�j�t|�|_dS)N�glue�parens)rfrgr�rr�r��nodes)r?rhr�)r�r>rAr��s

zClause.__init__cCs+t|j�}|j|_|j|_|S)N)rrhrfrg)r?r�r>r>rAr�szClause.clone_base)	rCrDrEr�r3rfrgr�rr>r>)r�rAr�sc@seZdZdZdZdS)�CommaClausez5One or more Node objects joined by commas, no parens.z, N)rCrDrEr�rfr>r>r>rAri�sric@seZdZdZdZdS)�EnclosedClausezAOne or more Node objects joined by commas and enclosed in parens.TN)rCrDrEr�rgr>r>r>rArj�srjcs@eZdZdd�fdd�Zdd�Zdd�Z�S)r<Ncs;tt|�j�||_||_|jp1d|_dS)N�w)r�r<r�rXrYr)r?rXrY)r�r>rAr��s		zWindow.__init__cCsrg}|jr4|jttd�t|j���|jrb|jttd�t|j���tt|��S)NzPARTITION BYzORDER BY)rXryrr6rirYrj)r?Zover_clausesr>r>rArZ�s						zWindow.__sql__cCst|j|j�S)N)r<rXrY)r?r>r>rAr�szWindow.clone_base)rCrDrEr�rZrr>r>)r�rAr<�scCstd|�S)Nz
CHECK (%s))r6)rZr>r>rAr�scs4eZdZdZ�fdd�Zdd�Z�S)rz:A "django-style" filter expression, e.g. {'foo__eq': 'x'}.cs tt|�j�||_dS)N)r�rr��query)r?rl)r�r>rAr��szDQ.__init__cCs
t|j�S)N)rrl)r?r>r>rAr�sz
DQ.clone_base)rCrDrEr�r�rr>r>)r�rAr�scs(eZdZdZ�fdd�Z�S)�_StripParensrmcs tt|�j�||_dS)N)r�rmr�r
)r?r
)r�r>rAr��sz_StripParens.__init__)rCrDrEr3r�r>r>)r�rArm�srm�JoinMetadata�	src_model�
dest_model�src�destr��primary_keyr{�
is_backrefr�is_self_join�
is_expressionc@sUeZdZddd�Zdd�Zdd�Zdd	�Zed
d��ZdS)�JoinNcCs|t|t�st|t�r"dS|jj||�}|dk	rM|dfS|jj||�}|dk	rx|dfSdS)NFT)NN)NN)rO�SelectQueryru�
rel_for_model�reverse_rel_for_model)r?r�rrr��fk_fieldrvr>r>rA�get_foreign_key
s

zJoin.get_foreign_keycCs|jptjS)N)�	join_typer%r�)r?r>r>rA�
get_join_typeszJoin.get_join_typecCs0t|t�r|jSt|t�r,|jS|S)N)rO�
ModelAliasrxrx)r?�model_or_aliasr>r>rA�model_from_aliass
zJoin.model_from_aliasc
Cs�|j|j�}|j|j�}t|jt�rB|jjpEd}t|jttt	f�}t|jt
tf�r�|jp�d}|r�|}|j|j
jk}nQ|j|||j�\}}|dkr�|jdk	r�|j||�\}}|dk	r|j}nd}|s�|dk	rP|rD|j
j}	q�|j}	q�y|jjj}	Wq�tk
r�|j
j}	Yq�Xnd}	td|d|d|jd|jd|p�|	d|d|d|d	|d
||kd|�S)Nrorprqrrr�rsr{rtrrurv)r�rqrrrO�onrrr!rPr6r�
FieldProxyr�ru�fieldsr|�to_fieldr�r^r�rn)
r?rqrrZ
join_aliasrvZon_fieldr{rtrsZtarget_attrr>r>rA�_join_metadatasH$'
		zJoin._join_metadatacCs%t|d�s|j�|_|jS)N�_cached_metadata)�hasattrr�r�)r?r>r>rA�metadataPsz
Join.metadata)	rCrDrEr|r~r�r��propertyr�r>r>r>rArw	s
1rwZ_Joinr}r�c@s7eZdZdd�Zddd�Zdd�ZdS)�FieldDescriptorcCs||_|jj|_dS)N)r�r��att_name)r?r�r>r>rAr�Ys	zFieldDescriptor.__init__NcCs&|dk	r|jj|j�S|jS)N)�_data�getr�r�)r?r	r
r>r>rAr]szFieldDescriptor.__get__cCs'||j|j<|jj|j�dS)N)r�r��_dirtyrt)r?r	rZr>r>rA�__set__bszFieldDescriptor.__set__)rCrDrEr�rr�r>r>r>rAr�Vsr�cseZdZdZdZdZdZdZdddddddddddd�fdd�Zd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zddd�Zdd�Zdd �Zd!d"�Z�S)#rzA column on a table.rr��unknownFNc

s�||_||_||_||_||_||_||_||_|	|_|
|_	||_
||_tj
d7_
tj
|_|jr�dp�d|jf|_d|_tt|�j�dS)Nr�rJF)�null�index�unique�verbose_name�	help_text�	db_column�default�choicesrs�sequence�constraints�schemar�_field_counter�_order�	_sort_key�	_is_boundr�r�)
r?r�r�r�r�r�r�r�r�rsr�r�r�)r�r>rAr�ms"												!	zField.__init__cKs�t|�d|jd|jd|jd|jd|jd|jd|jd|jd	|j	d
|j
d|jd|j|�}|j
r�|j|_|j|_|j
|_
|S)
Nr�r�r�r�r�r�r�r�rsr�r�r�)r�r�r�r�r�r�r�r�r�rsr�r�r�r�r�rx)r?r�rr>r>rAr�s&													zField.clone_basecCs�||_||_|jp!|j|_|jsNtjdd|�j�|_|jj|�t	||t
|��d|_dS)z�
        Hook that replaces the `Field` attribute on a class with a named
        `FieldDescriptor`. Called by the metaclass during construction of the
        `Model`.
        z_+reTN)r�rxr�r�r��sub�titleru�	add_fieldrr�r�)r?rxr�r>r>rAr�s			zField.add_to_classcCs
|jjjS)N)rxru�database)r?r>r>rA�get_database�szField.get_databasecCs%|j�}|j�j�j|�S)N)�get_db_fieldr��compiler�get_column_type)r?Z
field_typer>r>rAr��szField.get_column_typecCs|jS)N)�db_field)r?r>r>rAr��szField.get_db_fieldcCsdS)Nr>)r?r>r>rA�
get_modifiers�szField.get_modifierscCs|S)Nr>)r?rZr>r>rArV�szField.coercecCs|dkr|S|j|�S)z5Convert the python value for storage in the database.N)rV)r?rZr>r>rA�db_value�szField.db_valuecCs|dkr|S|j|�S)z/Convert the database value to a pythonic value.N)rV)r?rZr>r>rA�python_value�szField.python_valuecCs,|rt|jjj|j�St|j�S)N)rrxrur�r�)r?�
with_tabler>r>rA�	as_entity�szField.as_entitycCsB|j�}|r8td|djtt|��f�St|�S)z2Return the column type, e.g. VARCHAR(255) or REAL.z%s(%s)z, )r�r6�join�map�str)r?�column_typeZ	modifiersr>r>rA�__ddl_column__�s
#zField.__ddl_column__cCs�|j�|j|�g}|js7|jtd��|jrS|jtd��|jrv|jtd|j��|jr�|j|j�|S)z8Return a list of Node instances that defines the column.zNOT NULLzPRIMARY KEYzDEFAULT NEXTVAL('%s'))	r�r�r�ryr6rsr�r�r)r?r��ddlr>r>rA�__ddl__�s				z
Field.__ddl__cCst|jd|jj�S)N�.)�hashr�rxrC)r?r>r>rA�__hash__�szField.__hash__)rCrDrEr�r�r�r3r�r�rrr�r�r�r�rVr�r�r�r�r�r�r>r>)r�rArfs,		
cs=eZdZdZd�fdd�Z�fdd�Z�S)r
�bareNcs2tt|�j||�|dk	r.||_dS)N)r�r
r�rV)r?rVr�r�)r�r>rAr��szBareField.__init__cstt|�jd|j|�S)NrV)r�r
rrV)r?r�)r�r>rAr�szBareField.clone_base)rCrDrEr�r�rr>r>)r�rAr
�sc@seZdZdZeZdS)r!�intN)rCrDrEr�r�rVr>r>r>rAr!�sc@seZdZdZdS)r�bigintN)rCrDrEr�r>r>r>rAr�sc@seZdZdZdS)r4�smallintN)rCrDrEr�r>r>r>rAr4�scs(eZdZdZ�fdd�Z�S)r0rscs'd|d<tt|�j||�dS)NTrs)r�r0r�)r?r�r�)r�r>rAr��s
zPrimaryKeyField.__init__)rCrDrEr�r�r>r>)r�rAr0�scs(eZdZdZ�fdd�Z�S)�_AutoPrimaryKeyFieldNcsH||jkr+tdt|�|f��tt|�j||�dS)Nz%s must be named `%s`.)�_column_namerqr�r�r�r)r?rxr�)r�r>rArsz!_AutoPrimaryKeyField.add_to_class)rCrDrEr�rr>r>)r�rAr��sr�c@seZdZdZeZdS)r�floatN)rCrDrEr�r�rVr>r>r>rArsc@seZdZdZdS)r�doubleN)rCrDrEr�r>r>r>rAr	scsjeZdZdZdddd�fdd�Z�fdd	�Zd
d�Zdd
�Zdd�Z�S)r�decimalrbr�FNcsM||_||_||_|p*tjj|_tt|�j||�dS)N)	�
max_digits�decimal_places�
auto_roundr��DefaultContext�roundingr�rr�)r?r�r�r�r�r�r�)r�r>rAr�s
			zDecimalField.__init__c
s:tt|�jd|jd|jd|jd|j|�S)Nr�r�r�r�)r�rrr�r�r�r�)r?r�)r�r>rArs			zDecimalField.clone_basecCs|j|jgS)N)r�r�)r?r>r>rAr�szDecimalField.get_modifierscCsrtj}|s)|dkr|S|d�S|jrn|d�|j}|j}|t|��j|d|�S|S)Nrrbr�)r��Decimalr�r�r�r�Zquantize)r?rZ�D�expr�r>r>rAr�"s			zDecimalField.db_valuecCs9|dk	r5t|tj�r"|Stjt|��SdS)N)rOr�r�r�)r?rZr>r>rAr�,szDecimalField.python_value)	rCrDrEr�r�rr�r�r�r>r>)r�rArs	
zutf-8cCs9t|t�r|St|t�r/|j|�St|�S)N)rO�unicode_type�string_type�decode)rV�encodingr>r>rA�coerce_to_unicode2s

r�csUeZdZdZd�fdd�Z�fdd�Zdd�Zd	d
�Z�S)r�string�cs&||_tt|�j||�dS)N)�
max_lengthr�rr�)r?r�r�r�)r�r>rAr�<s	zCharField.__init__cstt|�jd|j|�S)Nr�)r�rrr�)r?r�)r�r>rAr@szCharField.clone_basecCs|jr|jgpdS)N)r�)r?r>r>rAr�EszCharField.get_modifierscCst|pd�S)N�)r�)r?rZr>r>rArVHszCharField.coerce)rCrDrEr�r�rr�rVr>r>)r�rAr9s
cs(eZdZdZ�fdd�Z�S)r�
fixed_charcs.tt|�j|�}|r*|j�}|S)N)r�rr��strip)r?rZ)r�r>rAr�NszFixedCharField.python_value)rCrDrEr�r�r>r>)r�rArKsc@s"eZdZdZdd�ZdS)r7�textcCst|pd�S)Nr�)r�)r?rZr>r>rArVWszTextField.coerceN)rCrDrEr�rVr>r>r>rAr7TscsFeZdZdZeZ�fdd�Zdd�Zdd�Z�S)r�blobcsDt|jjt�r+|jjj|j�tt|�j||�S)N)	rOrur�r2r��_set_constructorr�rr)r?rxr�)r�r>rAr^szBlobField.add_to_classcCs|j�|_dS)N)�get_binary_type�_constructor)r?r�r>r>rAr�cszBlobField._set_constructorcCs>t|t�r|jd�}t|t�r:|j|�S|S)NrS)rOr�rU�
basestringr�)r?rZr>r>rAr�fs

zBlobField.db_value)	rCrDrEr��binary_constructr�rr�r�r>r>)r�rArZs
c@s.eZdZdZdd�Zdd�ZdS)r;�uuidc	Cs@t|tj�r|jSytj|�jSWn|SYnXdS)N)rOr��UUID�hex)r?rZr>r>rAr�pszUUIDField.db_valuecCs3t|tj�r|S|dkr&dStj|�S)N)rOr�r�)r?rZr>r>rAr�xszUUIDField.python_valueN)rCrDrEr�r�r�r>r>r>rAr;mscs�fdd�}|S)Ncs|jjjj�|�S)N)rxrur��extract_date)r?)�	date_partr>rAr]~sz_date_part.<locals>.decr>)r�r]r>)r�rA�
_date_part}sr�cs=eZdZdZd�fdd�Z�fdd�Z�S)�_BaseFormattedFieldNcs2|dk	r||_tt|�j||�dS)N)rrr�r�r�)r?rrr�r�)r�r>rAr��s	z_BaseFormattedField.__init__cstt|�jd|j|�S)Nrr)r�r�rrr)r?r�)r�r>rAr�sz_BaseFormattedField.clone_base)rCrDrErrr�rr>r>)r�rAr��sr�c@s�eZdZdZdddgZdd�Zeed��Zeed��Z	eed	��Z
eed
��Zeed��Zeed��Z
d
S)rroz%Y-%m-%d %H:%M:%S.%fz%Y-%m-%d %H:%M:%Sz%Y-%m-%dcCs)|r%t|t�r%t||j�S|S)N)rOr�rkrr)r?rZr>r>rAr��szDateTimeField.python_valuer�r�r�r�r�r�N)rCrDrEr�rrr�r�r�r�r�r�r�r�r�r>r>r>rAr�s	c@sgeZdZdZdddgZdd�Zeed��Zeed��Z	eed	��Z
d
S)r�datez%Y-%m-%dz%Y-%m-%d %H:%M:%Sz%Y-%m-%d %H:%M:%S.%fcCsZ|r4t|t�r4dd�}t||j|�S|rVt|tj�rV|j�S|S)NcSs
|j�S)N)r�)rnr>r>rArQ�sz(DateField.python_value.<locals>.<lambda>)rOr�rkrrror�)r?rZ�ppr>r>rAr��s
zDateField.python_valuer�r�r�N)rCrDrEr�rrr�r�r�r�r�r�r>r>r>rAr�s	c@smeZdZdZdddddgZdd�Zeed	��Zeed
��Z	eed��Z
dS)
r8�timez%H:%M:%S.%fz%H:%M:%Sz%H:%Mz%Y-%m-%d %H:%M:%S.%fz%Y-%m-%d %H:%M:%ScCs�|rPt|t�r4dd�}t||j|�St|tj�rP|j�S|dk	r�t|tj�r�tjj|j�S|S)NcSs
|j�S)N)r�)rnr>r>rArQ�sz(TimeField.python_value.<locals>.<lambda>)rOr�rkrrror�Z	timedelta�min)r?rZr�r>r>rAr��s
zTimeField.python_valuer�r�r�N)rCrDrEr�rrr�r�r�r�r�r�r>r>r>rAr8�s	cs_eZdZdd�ed�D�Z�fdd�Zdd�Zdd	�Zd
d�Z�S)r9cCsg|]}d|�qS)rbr>)�.0r�r>r>rA�
<listcomp>�s	zTimestampField.<listcomp>�cs�|jdd�pd|_|j|jkrVtddjdd�|jD����|jdd�pkd|_tj}|jr�|jn|j|_	|jr�|j
n|j}|jd	|�t
t|�j||�dS)
N�
resolutionr�z,TimestampField resolution must be one of: %sz, css|]}t|�VqdS)N)r�)r�r�r>r>rA�	<genexpr>�sz*TimestampField.__init__.<locals>.<genexpr>�utcFr�)�popr��valid_resolutionsrqr�r�roZutcfromtimestampZ
fromtimestamp�_convZutcnowZnow�
setdefaultr�r9r�)r?r�r�Z_dtZ_default)r�r>rAr��s#	zTimestampField.__init__cCs|jdkr|jStjS)Nr�)r�r�r)r?r>r>rAr��szTimestampField.get_db_fieldcCs�|dkrdSt|tj�r%nJt|tj�rXtj|j|j|j�}ntt||j��S|j	r�t
j|j��}nt
j|j��}||jd7}|jdkr�||j9}tt|��S)Ng���ư>r�)rOror�r�r�r�r��roundr�r��calendarZtimegmZutctimetupler��mktimeZ	timetuple�microsecond)r?rZZ	timestampr>r>rAr��s!	
zTimestampField.db_valuecCs�|dk	r�t|tttf�r�|dkr4dS|jdkrtt||j�\}}|j|�jd|�S|j|�S|S)Nrr�r�)rOr�r��longr��divmodr��replace)r?rZrdr>r>rAr��s$
zTimestampField.python_value)	rCrDrEr�r�r�r�r�r�r>r>)r�rAr9�s

c@seZdZdZeZdS)r
�boolN)rCrDrEr�r�rVr>r>r>rAr
scsOeZdZdZ�fdd�Zdd�Zddd�Zd	d
�Z�S)�RelationDescriptorzEForeign-key abstraction to replace a related PK with a related model.cs#||_tt|�j|�dS)N)rr�r�r�)r?r�r)r�r>rAr�s	zRelationDescriptor.__init__cCs�|jj|j�}|dk	s3|j|jkr�|j|jkrs|jj|jj|k�}||j|j<|j|jS|jjs�|jj�|S)N)	r�r�r��
_obj_cacherr�r�r�r)r?r	Zrel_idr�r>r>rA�get_object_or_idsz#RelationDescriptor.get_object_or_idNcCs |dk	r|j|�S|jS)N)r�r�)r?r	r
r>r>rArs
zRelationDescriptor.__get__cCs�t||j�rGt||jjj�|j|j<||j|j<nP|jj	|j�}||j|j<||kr�|j|jkr�|j|j=|j
j|j�dS)N)rOrr�r�r�r�r�r�r�r�r�rt)r?r	rZZ
orig_valuer>r>rAr� s
zRelationDescriptor.__set__)rCrDrEr�r�r�rr�r>r>)r�rAr�
s
r�c@s1eZdZdZdd�Zddd�ZdS)�ReverseRelationDescriptorz<Back-reference to expose related objects as a `SelectQuery`.cCs||_|j|_dS)N)r�rxr)r?r�r>r>rAr�.s	z"ReverseRelationDescriptor.__init__NcCsA|dk	r=|jj�j|jt||jjj�k�S|S)N)r�select�wherer�r�r�r�)r?r	r
r>r>rAr2s"z!ReverseRelationDescriptor.__get__)rCrDrEr�r�rr>r>r>rAr�,sr�c@s=eZdZdZdd�Zddd�Zdd�ZdS)	�ObjectIdDescriptorz(Gives direct access to the underlying idcCs"|j|_tj|�|_dS)N)r��	attr_name�weakref�refr�)r?r�r>r>rAr�:szObjectIdDescriptor.__init__NcCs)|dk	r|jj|j�S|j�S)N)r�r�rr�)r?r	r
r>r>rAr>szObjectIdDescriptor.__get__cCst||j|�dS)N)rr)r?r	rZr>r>rAr�CszObjectIdDescriptor.__set__)rCrDrEr�r�rr�r>r>r>rAr�8sr�cs�eZdZddddd�fdd�Z�fdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	�fdd�Z
�fdd�Zdd�Zdd�Z
dd�Z�S)rNc	s�|dkr>t|ttf�r>t|t�r>td��||_||_t|ttf�|_||_	||_
||_||_t
t|�j||�dS)Nr?z[Unexpected value for `rel_model`.  Expected `Model`, `Proxy`, `DeferredRelation`, or "self")rOr2r�
issubclassr)�	TypeErrorr�
_related_name�deferred�	on_delete�	on_update�extrar�r�rr�)	r?r�related_namerrr	r�r�r�)r�r>rAr�Gs						zForeignKeyField.__init__csOtt|�jd|jd|j�d|jd|jd|jd|j|�S)Nrr
rrr	r�)	r�rrr�_get_related_namerrr	r�)r?r�)r�r>rArWs				zForeignKeyField.clone_basecCst||j�S)N)r�r)r?r>r>rA�_get_descriptoraszForeignKeyField._get_descriptorcCs
t|�S)N)r�)r?r>r>rA�_get_id_descriptordsz"ForeignKeyField._get_id_descriptorcCs
t|�S)N)r�)r?r>r>rA�_get_backref_descriptorgsz'ForeignKeyField._get_backref_descriptorcCs?|jr%t|j�r%|j|�S|jp>d|jjjS)Nz%s_set)r�callablerxrur�)r?r>r>rArjs
z!ForeignKeyField._get_related_namecs�t�jt�r>���fdd�}�jj|�dSt�jt�rj�jj����dS��_��_�jp�d�j�_���jkr��d7��j	s�t
jdd��j��_	�j
j���j��_�jdkr�j�_�jdk	rOt�jt�sat�j�j��_n�jj
j�_�j
jr����fdd	�}�j�jj
jkr�|d
�n"�j�jj
jkr�|d���j
jkr�|d�n��jkr|d
�t���j��t���j��t�j�j�j��d�_��j
j�j<��jj
j�j<dS)Ncs|�_�j���dS)N)rr)r)rxr�r?r>rAr�qs	z.ForeignKeyField.add_to_class.<locals>.callbackz%s_idZ_idz_+rer?csC|jdd�jj�fd�jd��t||��dS)Nr�z%s.%s�backref�obj_id_name)r�rur�r
r�)�msg�context)rxr�rr?r>rA�invalid�s
		z-ForeignKeyField.add_to_class.<locals>.invalidzVThe related_name of %(field)s ("%(backref)s") conflicts with a field of the same name.zWThe related_name of %(field)s ("%(backref)s") is already in use by another foreign key.zRThe object id descriptor of %(field)s conflicts with a field named %(obj_id_name)sz]Model attribute "%(obj_id_name)s" would be shadowed by the object id descriptor of %(field)s.T)rOrr2r�rr�r�rxr�r�r�r�r�rur�rr
r�rr�rs�validate_backrefsr�rv�__dict__rrr
rr��rel)r?rxr�r�rr>)rxr�rr?rArosP		
	



	
	zForeignKeyField.add_to_classcs2t|jt�s|jj�Stt|�j�S)zr
        Overridden to ensure Foreign Keys use same column type as the primary
        key they point to.
        )rOr�r0r�r�r)r?)r�r>rAr��s
zForeignKeyField.get_db_fieldcs2t|jt�s|jj�Stt|�j�S)N)rOr�r0r�r�r)r?)r�r>rAr��s
zForeignKeyField.get_modifierscCs|jj|�S)N)r�rV)r?rZr>r>rArV�szForeignKeyField.coercecCs.t||j�r|j�}|jj|�S)N)rOr�
_get_pk_valuer�r�)r?rZr>r>rAr��szForeignKeyField.db_valuecCs&t||j�r|S|jj|�S)N)rOrr�r�)r?rZr>r>rAr��szForeignKeyField.python_value)rCrDrEr�rrr
rrrr�r�rVr�r�r>r>)r�rArFs
@	c@sgeZdZdZdZdd�Zdd�Zddd�Zd	d
�Zdd�Z	d
d�Z
dS)rz+A primary key composed of multiple columns.NcGs
||_dS)N)�field_names)r?rr>r>rAr��szCompositeKey.__init__cCs&||_||_t|||�dS)N)r�rxr)r?rxr�r>r>rAr�s		zCompositeKey.add_to_classcs0�dk	r,t�fdd�|jD��S|S)Ncsg|]}t�|��qSr>)r�)r��
field_name)r	r>rAr��s	z(CompositeKey.__get__.<locals>.<listcomp>)�tupler)r?r	r
r>)r	rAr�szCompositeKey.__get__cCsdS)Nr>)r?r	rZr>r>rAr��szCompositeKey.__set__cs5�fdd�t�j|�D�}ttj|�S)Ncs/g|]%\}}�jjj||k�qSr>)rxrur�)r�r�rZ)r?r>rAr��s	z'CompositeKey.__eq__.<locals>.<listcomp>)�ziprrN�operator�and_)r?�other�expressionsr>)r?rAr'�szCompositeKey.__eq__cCst|jj|jf�S)N)r�rxrCr)r?r>r>rAr��szCompositeKey.__hash__)rCrDrEr�r�r�rrr�r'r�r>r>r>rAr�sc@sdeZdZdZddd�Zdd�Zddd	�Zd
d�Zdd
�Zdd�Z	dS)�AliasMaprfrcCsi|_||_dS)N)�
_alias_map�_counter)r?�startr>r>rAr��s	zAliasMap.__init__cCsd|jS)Nz<AliasMap: %s>)r")r?r>r>rA�__repr__�szAliasMap.__repr__NcCsI||jkrdS|jd7_|p;d|j|jf|j|<dS)Nr�z%s%s)r"r#�prefix)r?r�rr>r>rArt�szAliasMap.addcCs'||jkr|j|�|j|S)N)r"rt)r?r�r>r>rA�__getitem__�s
zAliasMap.__getitem__cCs
||jkS)N)r")r?r�r>r>rA�__contains__�szAliasMap.__contains__cCsC|r?x6|jj�D]%\}}||kr||j|<qW|S)N)r"�items)r?�	alias_mapr�rr>r>rAr�s
zAliasMap.update)
rCrDrEr&r�r%rtr'r(r�r>r>r>rAr!�sr!c2@seZdZddddddddd	d
ddd
dddddddddddddddddddiZejdejdejd ejd!ej	d"ej
d#ejd$ejd%ej
d&ejd'ejd(ejd)ejd*ejd+ejd,ejd-ejd.ejd/ejd0ejd1ejd2ejd3ejd4ejd5ejd6iZej d7ej!d8ej"d9ej#d:iZ$e%Z&d;d<d=d=d>d?�Z'd@dA�Z(dBdC�Z)dDdE�Z*dFdG�Z+dHdI�Z,dJdK�Z-dLdM�Z.dNdO�Z/dPdQ�Z0dRdS�Z1dTdU�Z2dVdW�Z3dXdY�Z4dZd[�Z5d\d]�Z6d^d_�Z7d`da�Z8dbdc�Z9d=d=ddde�Z:d=dfdgdh�Z;d=didj�Z<d=dkdl�Z=dmdn�Z>d=dodp�Z?dqdr�Z@eAdsdt�ZBdudv�ZCdwdx�ZDdydz�ZEd{d|�ZFd}d~�ZGd=dd��ZHeGd��ZId�d�d��ZJeGd��ZKd�d�d�d��ZLeGd��ZMd�d�d�d��ZNeGd��ZOd�d��ZPd�d��ZQeGd��ZRd�d�d��ZSeGd��ZTd�d��ZUeGd��ZVd�d��ZWeGd��ZXd=S)��
QueryCompilerr�r�r�ZBIGINTr�ZBLOBr�ZSMALLINTr�ZDATEroZDATETIMEr�ZDECIMALr�ZREALr�ZCHARr�r��INTEGERrsr�r�ZVARCHARr��TEXTr�ZTIMEr�r�z<=r�z>=z!=r�zNOT INr�zIS NOTr�r�r�r�r�r�r�r�r��#r�r�r�r�z||z
INNER JOINzLEFT OUTER JOINzRIGHT OUTER JOINz	FULL JOIN�"�?NcCsm||_||_t|j|p$i�|_t|j|p?i�|_|j�|_t	dg�|_
dS)Nr`)�
quote_char�
interpolationr��	field_map�
_field_map�op_map�_op_map�
get_parse_map�
_parse_mapr��_unknown_types)r?r1r2�field_overrides�op_overridesr>r>rAr�Fs		zQueryCompiler.__init__cCsgd|jd|jd|jd|jd|jd|jd|jd|jd	|jd
|j	d|j
iS)Nr1r`rcr�rdrMr�rK�select_query�compound_select_queryrm)�_parse_expression�_parse_param�_parse_passthrough�_parse_func�
_parse_clause�
_parse_entity�_parse_field�
_parse_sql�_parse_select_query�_parse_compound_select_query�_parse_strip_parens)r?r>r>rAr7Os										zQueryCompiler.get_parse_mapcCsd|j||jfS)Nz%s%s%s)r1)r?rVr>r>rA�quote`szQueryCompiler.quotecCs$||jkr|j|S|j�S)N)r4�upper)r?�fr>r>rAr�cszQueryCompiler.get_column_typecCs|j|S)N)r6)r?�qr>r>rA�get_opfszQueryCompiler.get_opcCst|j�ddd��S)Nr�cSs|djS)Nr)r�)r�r>r>rArQjsz.QueryCompiler._sorted_fields.<locals>.<lambda>)r�r))r?�
field_dictr>r>rA�_sorted_fieldsiszQueryCompiler._sorted_fieldscCs|j|gfS)N)r2)r?r
r*�convr>r>rA�_parse_defaultlszQueryCompiler._parse_defaultc
Cs�t|jt�r|j}|j|j||�\}}|j|j||�\}}|jrfdnd}|||j|j�|f}	|	||fS)Nz%s %s %sz
(%s %s %s))rOr^r�
parse_noder"r_rMr$)
r?r
r*rPr^Zlparamsr"Zrparams�templaterKr>r>rAr>os	zQueryCompiler._parse_expressioncCs;|jr(|j|j|j�|d�S|j|jgfS)N)rarRrZr2)r?r
r*rPr>r>rAr@xs	z QueryCompiler._parse_passthroughcCs�|jrF|r'|j|jkr'd}|j|j|j�||�S|dk	rn|j|j|j�|�S|j|jgfSdS)N)rar�rRrZr2)r?r
r*rPr>r>rAr?}s	zQueryCompiler._parse_paramcCsP|jr|pd}|j|j||�\}}d|jt|�f|fS)Nz%s(%s))rU�parse_node_listrSr�rm)r?r
r*rPrKrLr>r>rArA�szQueryCompiler._parse_funccCsG|j|j|||j�\}}|jr=dt|�}||fS)Nz(%s))rTrhrfrgrm)r?r
r*rPrKrLr>r>rArB�s
	zQueryCompiler._parse_clausecCs"djt|j|j��gfS)Nr�)r�r�rIrN)r?r
r*rPr>r>rArC�szQueryCompiler._parse_entitycCs|jt|j�fS)N)rZr�rL)r?r
r*rPr>r>rArE�szQueryCompiler._parse_sqlcCsV|r:dj|j||j�|j|j�f�}n|j|j�}|gfS)Nr�)r�rIrxr�)r?r
r*rPrKr>r>rArD�szQueryCompiler._parse_fieldcCsPd}|jj|krF|jj|krF|j|j}}d}n|j|j}}d}|j�}|j|kr�|j|_|j||�\}	}
|j||j||��\}}|r�|||	|
f\}
}}}n|	|
||f\}
}}}|jjr,d|
|j	|f}nd|
|j	|f}|||fS)Nr=TFz((%s) %s (%s))z
(%s %s %s))
r"r3r^�alias_map_classr#�generate_select�calculate_alias_mapr��compound_select_parenthesesr)r?r
r*rPZcsqZfirst_qZsecond_qr#�new_map�firstZfirst_pr�Zsecond_pr�Zlp�rZrprKr>r>rArG�s($	!z*QueryCompiler._parse_compound_select_querycCs}|j�}|jsQ|r6t|t�r6|j}n|jjj}|f|_|j	||�\}}dt
|�|fS)Nz(%s))r��_explicit_selectionrOrr�rxrurs�_selectrVrm)r?r
r*rPr�Zselect_fieldr�rLr>r>rArF�s	z!QueryCompiler._parse_select_querycCs.|j|j||�\}}t|�|fS)N)rRr
rm)r?r
r*rPrKrLr>r>rArH�sz!QueryCompiler._parse_strip_parenscCst|dd�}d}||jkrs|j||||�\}}||jkom|jdkom|dk}n�t|tttf�r�|j|||�\}}d|}nKt|t	�r@|j
}|r(t|t�r(|j}t|t�r
|j
|�}	q4|j
t||j��}	n|j�}	|	g}n�t|�r[t|t	�sjt|t�r�|j�j||�}
|j|
||�\}}n]|dk	r�|j
|�}	|j|	|d�\}}}n!|j||d�\}}d}|||fS)Nr3Fz(%s)T)r�r8r9rarOr�rr�rTr)r2rr�r�r�rr	rrr�rrR�_parserQ)r?r
r*rPZ	node_typer�rKrLr�rZrM�_r>r>rAr^�s:
		!zQueryCompiler._parsec
s,|j||��\}}}|rO�dk	rO|rO�fdd�|D�}t|t�r�|jrqd|}|jr�dj|d|jf�}|jr�dj||jf�}|r"tdd�|D��r"g}g}x>t|�D]0\}	}
t|
t�r�|j	|
�\}}q�W||fS)Ncsg|]}�j|��qSr>)r�)r�r�)rPr>rAr��s	z,QueryCompiler.parse_node.<locals>.<listcomp>zNOT %sre�AScss|]}t|t�VqdS)N)rOr)r��pr>r>rAr�sz+QueryCompiler.parse_node.<locals>.<genexpr>)
r^rOrrrr�r�any�	enumeraterR)
r?r
r*rPrKrLr�Zclean_paramsZ	clean_sql�idxr`ZcsqlZcparamsr>)rPrArR�s"	
		zQueryCompiler.parse_nodez, c
Cseg}g}xC|D];}|j|||�\}}	|j|�|j|	�qW|j|�|fS)N)rRryrr�)
r?rhr*rPrfrKrLr
Znode_sqlZnode_paramsr>r>rArT
s

zQueryCompiler.parse_node_listcCs�|j�}|dk	r$|j|_|j|j|jjj�x�|jj�D]}\}}|j||jj�xX|D]P}t|j	t
�r�|j|j	|j	j�qy|j|j	|j	jj�qyWqPW|j|�S)N)
rUr#rtrxru�table_alias�_joinsr)rOrrrrr�)r?rlr*rYroZ
joined_modelsZjoin_objr>r>rArWs
$z!QueryCompiler.calculate_alias_mapcCs|jt|�|�S)N)rRr)r?�clausesr*r>r>rA�build_query&szQueryCompiler.build_querycCs�g}t�}|g}x�|r�|j�}||ks||krHq|j|�x�||D]�}|}	|j}
t|jtttt	f�r�|jj
�j�}n�|j}|j
r�|j}
|j}n|j}
|j}|j}|r?t|
|j�}t||jj�}|j
r0||}}||k}ntd��t|
t�rc|
}n&|j|
�|
j�j||
�}|j�}||jkr�t|j|�}nt|�}|jt||td�|��q`WqW|S)Nz Missing required join predicate.�ON)r�r�rtrrrOr�r!rPrrr�rr�rtrqr{r�r�r�rqrryr�r~�join_mapr6)r?�joinsrxr*rgrrL�currr�rqrr�
constraintr�Zfk_modelZpk_model�fkr^r"Zdest_nr}Zjoin_sqlr>r>rA�generate_joins)sL			
								
	
$zQueryCompiler.generate_joinscCs�|j}|jj}|j||�}t|t�rHt|�g}n�|jsctd�g}n=td�g}|jdkr�|td�t	|j�g7}t
|j�}d|_|j
|td�f�|jdkr|j|j�j||��n|jt|j��|jdk	r^|jtd��|jtd	d
�|jD���|j|j||�}|r�|j
|�|jdk	r�|j
td�|jg�|jr�|j
td�t|j�g�|jr|j
td
�|jg�|jr/|j
td�t|j�g�|jdk	sP|jr�|jr�|jdk	rh|jn|j}|jtd|��|jdk	r�|jtd|j��|j\}	}
|	r�|
r�dnd}|jt|��|j||�S)NZSELECTzSELECT DISTINCTTFriz, �FROMZWINDOWcSs7g|]-}tt|j�td�|j���qS)r`)rr6rrZ)r�r[r>r>rAr�zs	z1QueryCompiler.generate_select.<locals>.<listcomp>�WHEREzGROUP BYZHAVINGzORDER BYzLIMIT %sz	OFFSET %szFOR UPDATE NOWAITz
FOR UPDATE)TF)rxrur�rWrO�CompoundSelectrm�	_distinctr6rjrr]rfr�_fromryr�rri�_windowsrorf�_where�	_group_by�_having�	_order_by�_limit�_offset�	limit_max�_for_updaterh)r?rlr*rz�dbrgZ
select_clauseZjoin_clauses�limit�
for_updateZno_waitZstmtr>r>rArV^sT			#		
	"		"!!zQueryCompiler.generate_selectc
Cst|j}|j�}|j||jj�|jrDd|j}nd}t|�|j�td�g}g}xx|j|j	�D]d\}}t
|ttf�s�t
|d|j�}|jt|jdd�tj|dd��q�W|jt|��|jr$|jtd	�|jg�|jdk	rdt|j�}	d
|	_|jtd�|	g�|j||�S)NzUPDATE OR %sZUPDATEZSETrar�Fr_Trqz, �	RETURNING)rxrUrtrur��_on_conflictr6r�rO�_updaterOrr)r-r�ryr!r&r�rirvr�
_returningrrfrh)
r?rlrzr*�	statementrgr�r�rZ�returning_clauser>r>rA�generate_update�s0		!			zQueryCompiler.generate_updatecCs|dd�|D��S)NcSs"g|]}|jdd��qS)r�F)r�)r�r�r>r>rAr��s	z3QueryCompiler._get_field_clause.<locals>.<listcomp>r>)r?r��clause_typer>r>rA�_get_field_clause�szQueryCompiler._get_field_clausecCs�|j}|j}|j�}|j||jj�|jrL|jj}n|jred|j}nd}t	|�|j
�g}|jdk	r�|jr�|j
|j|j��|j
t|j��n0|jdk	r�gg}}d}	x�|j�D]�}
|	s/t|
j�dtjd��}d}	g}xO|D]G}|
|}
t|
ttf�svt|
d|j�}
|j
|
�q<W|j
t|��q�W|r�|j|j|�t	d�t|�g�n+|jjjr�|j
|jj|j��|j r7|jt	d	�|j|j!�d
t�g�n@|j"dk	rwt#|j"�}d|_$|jt	d	�|g�|j%||�S)NzINSERT OR %s INTOzINSERT INTOFr�r�TraZVALUESr�r�z, )&rxrurUrtr��_upsertr��
upsert_sqlr�r6r��_query�_fieldsryr�rm�_rows�
_iter_rowsr��keysr�
attrgetterrOrr)r-r�rjrri�auto_increment�default_insert_clause�is_insert_returning�get_primary_key_fieldsr�rrfrh)r?rlrzrGr*r�rgr�Z
value_clausesZhave_fields�row_dictrwr�rZr�r>r>rA�generate_insert�s`					


	
			zQueryCompiler.generate_insertcCs�|j}td�|j�g}|jrF|jtd�|jg�|jdk	r�t|j�}d|_|jtd�|g�|j|�S)NzDELETE FROMrqz, r�)	rxr6r�rvrr�rrfrh)r?rlrzrgr�r>r>rA�generate_delete�s			zQueryCompiler.generate_deletecCs.|j|j��}|j|�}t|�S)N)r�r�r�r)r?r�r�r�r>r>rA�field_definition	szQueryCompiler.field_definitioncCs�td�t|j��td�|jj�t|jj��g}|jrh|jtd|j��|jr�|jtd|j��t|�S)NzFOREIGN KEYZ
REFERENCESzON DELETE %szON UPDATE %s)	r6rjr�rr�rryrr)r?r�r�r>r>rA�foreign_key_constraints				z$QueryCompiler.foreign_key_constraintcs�fdd�}|S)Ncs%t|��}|j|||��S)N)r�rR)r?r�r�r)�
function_namer>rAr�sz/QueryCompiler.return_parsed_node.<locals>.innerr>)r�r�r>)r�rA�return_parsed_nodesz QueryCompiler.return_parsed_nodecCsk|p(d|jj|j|jjjf}|j|�}ttd�|j�td�t|�|j	�S)Nzfk_%s_%s_refs_%szALTER TABLEzADD CONSTRAINT)
rur�r�rr�rr6r�rrh)r?rxr�rmZ	fk_clauser>r>rA�_create_foreign_key#s						z!QueryCompiler._create_foreign_keyr�Fc	s<|rdnd}|j�gg}}�jrr�fdd��jjD�}|jttd�t|���xV�jD]K}|j|j	|��t
|t�r||jr||j|j
|��q|W|jjrx<|jjD].}t
|t�st|�}|j|�q�Wtt|�|j�t||��S)NzCREATE TABLE IF NOT EXISTSzCREATE TABLEcs#g|]}�j|j��qSr>)r�r�)r�rK)rGr>rAr�7s	z/QueryCompiler._create_table.<locals>.<listcomp>zPRIMARY KEY)ru�
composite_keyrsrryrr6rj�declared_fieldsr�rOrrr�r�rr�)	r?rx�safer��columnsr�Zpk_colsr�rmr>)rGrA�
_create_table1s*	
				zQueryCompiler._create_tabler�cCsM|rdnd}t|�|j�g}|rC|jtd��t|�S)NzDROP TABLE IF EXISTSz
DROP TABLE�CASCADE)r6r�ryr)r?rx�
fail_silently�cascader�r�r>r>rA�_drop_tableLs
zQueryCompiler._drop_tabler�cCsTtd�|j�g}|r1|jtd��|rJ|jtd��t|�S)NzTRUNCATE TABLEzRESTART IDENTITYr�)r6r�ryr)r?rx�restart_identityr�r�r>r>rA�_truncate_tableTszQueryCompiler._truncate_tabler�cCsqd|dj|�f}t|�dkrmtj|jd��j�}d|dd�|dd�f}|S)Nz%s_%sr_�@zutf-8�7�)r�r��hashlib�md5rU�	hexdigest)r?�tabler�r�Z
index_hashr>r>rA�
index_name^s
$zQueryCompiler.index_namecGs�|jj}|rdnd}|j|dd�|D��}tt|�t|�td�|j�tdd�|D��|�S)NzCREATE UNIQUE INDEXzCREATE INDEXcSsg|]}|j�qSr>)r�)r�rKr>r>rAr�hs	z/QueryCompiler._create_index.<locals>.<listcomp>ricSsg|]}|j��qSr>)r�)r�r�r>r>rAr�ns	)rur�r�rr6rr�rj)r?rxr�r�r	�tbl_namer�r�r>r>rA�
_create_indexes				zQueryCompiler._create_indexr�cCsV|jj}|rdnd}|j|dd�|D��}tt|�t|��S)NzDROP INDEX IF EXISTSz
DROP INDEXcSsg|]}|j�qSr>)r�)r�rKr>r>rAr�us	z-QueryCompiler._drop_index.<locals>.<listcomp>)rur�r�rr6r)r?rxr�r�r�r�r�r>r>rA�_drop_indexrszQueryCompiler._drop_indexr�cCsttd�t|��S)NzCREATE SEQUENCE)rr6r)r?�
sequence_namer>r>rA�_create_sequenceyszQueryCompiler._create_sequencer�cCsttd�t|��S)Nz
DROP SEQUENCE)rr6r)r?r�r>r>rA�_drop_sequence}szQueryCompiler._drop_sequencer�)YrCrDrEr3r&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�r5r%r�r�r�r�rjr!rUr�r7rIr�rMrOrQr>r@r?rArBrCrErDrGrFrHr^rRrTrWrhrorVr�rjr�r�r�r�r�r�r��create_foreign_keyr��create_tabler��
drop_tabler��truncate_tabler�r��create_indexr��
drop_indexr��create_sequencer��
drop_sequencer>r>r>rAr+	s�																													
	'	5?>
r+c@s"eZdZdddd�ZdS)�SqliteQueryCompilerFcCs|j�j�S)N)�deleterK)r?rxr�r�r>r>rAr��sz"SqliteQueryCompiler.truncate_tableN)rCrDrEr�r>r>r>rAr��sr�c@s.eZdZdd�Zdd�ZeZdS)�ResultIteratorcCs||_d|_dS)Nr)�qrw�_idx)r?r�r>r>rAr��s	zResultIterator.__init__cCs�|j|jjkr+|jj|j}nI|jjsn|jj�}|jjj|�|jjd7_nt�|jd7_|S)Nr�)r�r��_ct�
_result_cache�
_populated�iteratery�
StopIteration)r?r�r>r>rA�next�szResultIterator.nextN)rCrDrEr�r��__next__r>r>r>rAr��sr�c@s�eZdZdZddd�Zdd�Zedd��Zd	d
�Zdd�Z	d
d�Z
dd�Zdd�ZeZ
ddd�ZdS)�QueryResultWrapperz�
    Provides an iterator over the results of a raw Query, additionally doing
    two things:
    - converts rows from the database into python representations
    - ensures that multiple iterations do not result in multiple queries
    NcCst||_||_d|_d|_g|_d|_d|_|dk	r`|\|_|_nd|_|_dS)NrF)	rz�cursorr�r�r�r��_initialized�column_meta�	join_meta)r?rzr�rGr>r>rAr��s							zQueryResultWrapper.__init__cCs$|jrt|j�St|�SdS)N)r��iterr�r�)r?r>r>rA�__iter__�s	
zQueryResultWrapper.__iter__cCs|j�|jS)N)�
fill_cacher�)r?r>r>rArQ�s
zQueryResultWrapper.countcCs|jS)N)rQ)r?r>r>rA�__len__�szQueryResultWrapper.__len__cCs|S)Nr>)r?�rowr>r>rA�process_row�szQueryResultWrapper.process_rowcCs{|jj�}|sId|_t|jdd�s@|jj�t�n%|jsn|j|jj�d|_|j	|�S)NTr�)
r��fetchoner�r��closer�r�r��descriptionr�)r?r�r>r>rAr��s	
			zQueryResultWrapper.iterateccsx|j�VqWdS)N)r�)r?r>r>rA�iterator�szQueryResultWrapper.iteratorcCs�|j|jkr5|j|j}|jd7_|S|jrDt�|j�}|jj|�|jd7_|jd7_|S)Nr�)r�r�r�r�r�r�ry)r?rr�r>r>rAr��s	zQueryResultWrapper.nextcCs~|ptd�}|dkr*td��|j|_xA|jry||jkryyt|�Wq9tk
ruPYq9Xq9WdS)NZInfrz"Negative values are not supported.)r�rqr�r�r�r�r�)r?�nr>r>rAr��s
zQueryResultWrapper.fill_cache)rCrDrEr�r�r�r�rQr�r�r�r�r�r�r�r>r>r>rAr��s
r�c@seZdZdd�ZdS)�ExtQueryResultWrapperc
Csk|j}g}dd�}x@tt|��D],}|}||d}d}|jdk	r	y|j|}	Wntk
r�Yn�Xt|	t�r�|	j}|	jp�|	j	}d}nSt|	t
�r	t|	j�r	t|	jdt�r	|	jr|	jdj}d}|rD||j
jkrD|j
j|}
|
j	}|
j}|j|||f�q.W||_dS)NcSs|S)Nr>)rnr>r>rArQ�sz2ExtQueryResultWrapper.initialize.<locals>.<lambda>rFT)rzr�r�r��
IndexErrorrOrr�rr�rPrSrUrur�ryrP)r?r�rzrP�identityr�r��column�foundZ
select_column�	field_objr>r>rAr��s8	
					z ExtQueryResultWrapper.initializeN)rCrDrEr�r>r>r>rAr��sr�c@seZdZdd�ZdS)�TuplesQueryResultWrappercs#t�fdd�t|�D��S)Ncs-g|]#\}}�j|d|��qS)rJ)rP)r�r��col)r?r>rAr�	s	z8TuplesQueryResultWrapper.process_row.<locals>.<listcomp>)rrc)r?r�r>)r?rAr�	sz$TuplesQueryResultWrapper.process_rowN)rCrDrEr�r>r>r>rAr�	sr�c@seZdZdd�ZdS)�NaiveQueryResultWrappercCsQ|j�}x4|jD])\}}}t|||||��qW|j�|S)N)rzrPr�_prepare_instance)r?r�r	r�r�r�r>r>rAr�	s

z#NaiveQueryResultWrapper.process_rowN)rCrDrEr�r>r>r>rAr�	sr�c@seZdZdd�ZdS)�DictQueryResultWrappercCs;i}x.|jD]#\}}}|||�||<qW|S)N)rP)r?r�rWr�r�r�r>r>rAr�#	sz"DictQueryResultWrapper.process_rowN)rCrDrEr�r>r>r>rAr�"	sr�c@s[eZdZdd�Zdd�Zdd�Zdd�Zd	d
d�Zdd
�Zd	S)�ModelQueryResultWrappercCsJ|j�\|_}tdd�|jD��|_|j|�|_dS)Ncss$|]}t|t�r|VqdS)N)rOr)r�r�r>r>rAr�/	sz5ModelQueryResultWrapper.initialize.<locals>.<genexpr>)�generate_column_map�
column_mapr�r��_col_set�generate_join_list�	join_list)r?r�Z	model_setr>r>rAr�-	sz"ModelQueryResultWrapper.initializec	CsHg}t|jg�}x#t|j�D]\}}d}}t|t�r�t|t�r}|j}|j}|jj	}n|j
}}|j	}|jp�|j}nl|j
dkr�|j}}n
|j
}}t|t�r�|jr�|j}nt|t�r|jd}|j||||f�|j|�q(W||fS)Nr����)r�rzrcr�rOrr��_model_alias�field_instancer�rxrr�rrrrNryrt)	r?r�r}r�r
r�rPr��constructorr>r>rAr�3	s,
		
	

z+ModelQueryResultWrapper.generate_column_mapcCsg}|j}|jg}x�|r|j�}||kr?qx�||D]�}|j}|j|ksw|j|krJ|jdk	r�|j|jk}|j|jk}	|jj	o�|p�|	}
nd}
}}	|j
||
||	f�|j
|j�qJWqW|S)NF)r�rzr�r�rrrpr{r�rsr�ry)r?r}r�rk�stack�currentr�r��
fk_present�
pk_present�checkr>r>rAr�O	s.				
z*ModelQueryResultWrapper.generate_join_listcCsA|j|�}|j|�}x|D]}|j�q%W|dS)Nr)�construct_instances�follow_joinsr�)r?r��	collected�	instancesr�r>r>rAr�l	s

z#ModelQueryResultWrapper.process_rowNcCs�i}x�t|j�D]�\}\}}}}|dk	rI||krIq||}	||krl|�||<||}
|dkr�|jj|d}|dk	r�||	�}	t|
||	�qW|S)Nr)rcr�r�r�r)r?r�r�Zcollected_modelsr�r�r�r�rPrZr	r>r>rAr�s	s(


z+ModelQueryResultWrapper.construct_instancesc
Cs�||jg}x�|jD]�\}}}}||j}y||j}Wntk
rk||j}YnXd}	|r�|r�|jj|jj	�}	n|r�|jj|j
j	�}	|	s�q|j
dk	}
|
o�|j|jko�t||j
j	�dk}|r(t
||j
j	|j|j�|jr�|
o||jdk	o|t||j
j	�dk	o||jj|jj	�dk}|r�t
||jj	|�t
||j|�|j|�qW|S)NT)rzr�rqrr�KeyErrorrpr�r�r{r�rsr�r�rrtry)
r?r��preparedr�Z
check_nullr�r�r�joined_instZhas_fkZmpkZcan_populate_joined_pkZcan_populate_joined_fkr>r>rAr��	sJ

			z$ModelQueryResultWrapper.follow_joins)	rCrDrEr�r�r�r�r�r�r>r>r>rAr�,	sr��	JoinCacher�csLeZdZ�fdd�Z�fdd�Zdd�Zdd�Z�S)	�AggregateQueryResultWrappercs&g|_tt|�j||�dS)N)�_rowr�r�r�)r?r�r�)r�r>rAr��	s	z$AggregateQueryResultWrapper.__init__csftt|�j|�t�|_x-|jD]"\}}}}|jj|�q,Wt�|_i|_i|_	i|_
x�|jD]�\}}}}|jr�|j
j}n	|j}|jp�|j}|r�|jj|j�n3|j
j|jt��|j
|jj|j�|j	j|ji�td|d|jpE|�|j	|j|j<q�Wi|_i}x�t|j�D]{\}\}}	}
}||jkr�|jj|g�|j|j||
f�|j|g�||j||
f�qWxa|jD]V}||jkr q|j
j|f�}x&|D]}
|j|j||
�q<WqWdS)Nr�r�)r�r�r�r��
all_modelsr�rtZmodels_with_aggregateZback_references�source_to_destZdest_to_sourcer�rtr{r
r�rurqr�rrr�r�columns_to_comparercryr�r)r?r�r�r_r�r�rtZkey_to_columnsrdrx�col_namer�ZsourcesZjoined_model)r�r>rAr��	sH					'	(

z&AggregateQueryResultWrapper.initializecCs`i}xS|jj�D]B\}}g||<x)|D]!\}}||j||�q3WqW|S)N)rr)ry)r?r�r}rxZcolumn_datardrr>r>rA�read_model_data�	s
z+AggregateQueryResultWrapper.read_model_datacCs.|jr|jj�}n|jj�}|sdd|_t|jdd�s[|jj�t�n%|js�|j	|jj
�d|_dd�}i}|j|�}||j}x;|j
�D]-\}}t�||<|||||�<q�W|j|�}x|jj�}	|	dkr#Pt�}
|j|	�}x7|j
�D])\}}
|||
krH|
j|�qHW|
s�|jj|	�P|j|
}|j|	|�}xf|j
�D]X\}}d}x)|jj�D]}|dk	r�d}q�W|s�|||||�<q�WqW|jg}|g}x�|r|j�}||jkrTq0x�|j|D]�}y|j||j\}}Wntk
r�wbYnX|js�|jr}x(||j�D]}t||g�q�W|j|kr�qbx||jj
�D]u\}}|dkrqy|||j|jj}Wntk
rRwYnXt||�j|�|j|�qWnz|r�|j|kr�qbx_||j
�D]M\}}||j|j|jj}t||jj|�|j|�q�W|j|j�qbWq0Wx|D]}|j�qW|S)NTr�cs<�jjr2t�fdd��jjjD��S�j�S)Ncsg|]}�j|�qSr>)r�)r�r)r	r>rAr�
s	zHAggregateQueryResultWrapper.iterate.<locals>._get_pk.<locals>.<listcomp>)rur�rrsrr)r	r>)r	rA�_get_pk

s
z4AggregateQueryResultWrapper.iterate.<locals>._get_pkF) r�r�r�r�r�r�r�r�r�r�r�r�rzr)rrr�rtryr�r�rwr�rrrr�rtrurr{r�r�)r?r�rZidentity_mapZ_constructedZprimary_instancer�r	Z
model_dataZcur_rowZduplicate_modelsZcur_row_datarx�dataZdifferent_modelsZ
new_instancesZall_nonerZr�r�r�r�r�r��pkrr�r>r>rAr��	s�		
			

	

		
 

	
z#AggregateQueryResultWrapper.iterate)rCrDrEr�r�rr�r>r>)r�rAr��	s6r�cs3eZdZdZdZ�fdd�Zdd�Zdd�Zd	d
�Zdd�Z	d
dd�Z
dd�Zedd��Z
edd��Zed
d
dd��Zed
dd��Zd
dd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d(d)d*�Z�S)+�Queryz?Base class representing a database query on one or more tables.Tcs\tt|�j�||_|jj|_d|_||_|jgi|_d|_	dS)NT)
r�rr�rxrur�r��
_query_ctxrfrv)r?rx)r�r>rAr�o
s			zQuery.__init__cCs&|j�\}}d|j||fS)Nz%s %s %s)rKrx)r?rKrLr>r>rAr%z
szQuery.__repr__cCs.t|�|j�}|j|_|j|�S)N)r�rxr��_clone_attributes)r?rlr>r>rAr�~
szQuery.clonecCs@|jdk	r!|jj�|_|j�|_|j|_|S)N)rvr��_clone_joinsrfr)r?rlr>r>rAr	�
s
zQuery._clone_attributescCs tdd�|jj�D��S)Ncss'|]\}}|t|�fVqdS)N)r�)r�Zmc�jr>r>rAr��
sz%Query._clone_joins.<locals>.<genexpr>)�dictrfr))r?r>r>rAr
�
szQuery._clone_joinsNcCs>ttj|�}|dkr"|S|p.tj}|||�S)N)rNrr)r?�initialr ZconjunctionZreducedr>r>rA�_add_query_clauses�
s
zQuery._add_query_clausescCs�g}x�|D]�}t|t�r2|j|�q
t|t�rQ|j|�q
t|t�rv|j|j��q
t|�r
t|t	�r
|j|j
j�q
W|S)N)rOrryrrr�get_proxy_fieldsr	rr)rur�)r?r��accum�argr>r>rA�_model_shorthand�
s
zQuery._model_shorthandcGs|j|j|�|_dS)N)rrv)r?r r>r>rAr��
szQuery.wherecGs"|j|j|tj�|_dS)N)rrvr�or_)r?r r>r>rA�orwhere�
sz
Query.orwherecCs�|j}|sRt|t�p:t|�o:|jj|�}|rqtd��nt|t�rq|jj|}|j	j
|g�|j	|jt||||��t|t�s�||_dS)Nz#A join condition must be specified.)
rrOrxr	ru�
rel_existsrqr�r�rfr�ryrw)r?rrr}r�rqZrequire_join_conditionr>r>rAr��
s	#z
Query.joincCs|p|j|_dS)z"Change or reset the query context.N)rxr)r?rxr>r>rA�switch�
szQuery.switchcKsd|j}x0|jj|g�D]}|j|kr|SqW|j|�j|d||�j|�S)Nr�)rrfr�rrrr�)r?�lm�rmr�Zjoin_kwargs�ctxr�r>r>rA�ensure_join�
s
	zQuery.ensure_joincCsg}g}ttf}x�t|j��D]�\}}|j}d|kr�|jdd�dtkr�|jdd�\}}t|}n	tj}xK|j	d�D]:}	t
||	�}
t|
|�r�|
j}|j
|
�q�W|j
t|
||��q+W||fS)N�__r�)rr�r�r)rx�rsplit�
DJANGO_MAPr&r��splitr�rOrryr!)r?ZqdictrrkZrelationshipr�rZrlr$�piece�
model_attrr>r>rA�convert_dict_to_node�
s 	(
		zQuery.convert_dict_to_nodecOs�t�}|r2|ttjdd�|D��M}|rH|t|�M}t|g�}t�}x�|r7|j�}t|t	�s�qcx�d|j
fd|jffD]�\}}t|t�r#|j|j
�\}	}
|j|
�ttj|	�}|j|_|j|_t|||�q�|j|�q�WqcW|j}|j�}	x||D]t}t|t�r�|j|j}
}|}n.t|t�r�|jj|j}
}|j}|	j|
||�}	qTW|	j|�S)NcSsg|]}|j��qSr>)r�)r�rr>r>rAr��
s	z Query.filter.<locals>.<listcomp>r^r")rrNrrrrr��popleftrOr!r^r"r!rlr�rrrryr�rrxrr�r�rr�)r?r�r�Zdq_noderLZdq_joinsrlZsiderrlrkr1r�rrr�r>r>rArO�
s>	#		+
	
		zQuery.filtercCs
|jj�S)N)r�r�)r?r>r>rAr�szQuery.compilercCs
t�dS)N)r�)r?r>r>rArKsz	Query.sqlcCs+|j�\}}|jj|||j�S)N)rKr��execute_sql�require_commit)r?rKrLr>r>rA�_executeszQuery._executecCs
t�dS)N)r�)r?r>r>rA�executesz
Query.executeFcCsJ|r|j�j�}n|j�j�}|rB|rB|dS|SdS)Nr)�tuplesrZr%r�)r?Zas_tuple�convertr�r>r>rA�scalars
zQuery.scalar)rCrDrEr�r$r�r%r�r	r
rrr�r�rr�rrr!rOr�rKr%r&r)r>r>)r�rArk
s.
(rcs�eZdZdZ�fdd�Zdd�Zed�Zed�Zed�Z	e
d	d
d��Ze
d	dd
��Zdd�Z
dd�Zdd�Z�S)�RawQueryzh
    Execute a SQL query, returning a standard iterable interface that returns
    model instances.
    csM||_t|�|_d|_d|_d|_tt|�j|�dS)NF)	�_sqlr��_params�_qr�_tuples�_dictsr�r*r�)r?rzrlrL)r�r>rAr�s				zRawQuery.__init__cCs7t|j|j|j�}|j|_|j|_|S)N)r*rxr+r,r.r/)r?rlr>r>rAr�&szRawQuery.clone�joiningr�rTcCs
||_dS)N)r.)r?r'r>r>rAr'0szRawQuery.tuplescCs
||_dS)N)r/)r?�dictsr>r>rAr14szRawQuery.dictscCs|j|jfS)N)r+r,)r?r>r>rArK8szRawQuery.sqlcCs�|jdkr{|jr-|jjt�}n0|jrK|jjt�}n|jjt�}||j|j	�d�|_|jS)N)
r-r.r��get_result_wrapper�RESULTS_TUPLESr/�
RESULTS_DICTS�
RESULTS_NAIVErxr%)r?ZQRWr>r>rAr&;s		zRawQuery.executecCst|j��S)N)r�r&)r?r>r>rAr�FszRawQuery.__iter__)rCrDrEr�r�r�r�r�r�rr�r'r1rKr&r�r>r>)r�rAr*sr*cKsL|jdd�}|r$td��|r>|p3g|p=dS|rH|SdS)NrFz,"extend" is the only valid keyword argument.)r�rq)ZorigZnew_valr�rr>r>rA�allow_extendIsr6cs�eZdZdZ�fdd�Z�fdd�Zdd�Zee�Zed�Z	ed	�Z
ed
�Zdd�Zd
d�Z
dd�Zee�Zedd��Zedd��Zedd��Zedd��Zedd��Zedd��Zedd��Zedd d!��Zed"d#d$��Zed"d%d&d'��Zed"d(d)��Zed"d*d+��Zed"d,d-��Zed"d.d/��Zed0d1d2��Zd0d3d4�Z d0d5d6�Z!d0d"d7d8�Z"d%d9d:�Z#d%d;d<�Z$d=d>�Z%d?d@�Z&dAdBdC�Z'dAdDdE�Z(dFdG�Z)dHdI�Z*dJdK�Z+dLdM�Z,dNdO�Z-dPdQ�Z.dRdS�Z/dTdU�Z0dVdW�Z1e2r�dXdY�Z3�S)Zrxr<cs�tt|�j|�|jj|_|j|�d|_d|_d|_	d|_
d|_d|_d|_
d|_d|_d|_d|_d|_d|_d|_d|_dS)NF)FF)r�rxr�r��
commit_selectr$�_SelectQuery__selectrtrwrxryrurzr{rsr}�_naiver.r/�_aggregate_rowsrr-)r?rx�	selection)r�r>rAr�Us$
														zSelectQuery.__init__cs�tt|�j|�}|j|_t|j�|_|jdk	r�g|_xI|jD]>}t|t�r�|jj	|j
��qX|jj	|�qXW|jdk	r�t|j�|_|jr�|jj
�|_|j
dk	r�t|j
�|_
|jdk	rt|j�|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|S)N)r�rxr	r\r�r]rtrOrryr�rwrxryrurzr{rsr}r9r.r/r:r)r?rlrK)r�r>rAr	is6		zSelectQuery._clone_attributescs�fdd�}|S)NcsD|jjjj}�|kr.td���t|j|�|�S)Nz!Your database does not support %s)rxrur��compound_operationsrqrr)r?rZ
supported_ops)rr>rAr��s

z&SelectQuery.compound_op.<locals>.innerr>)rr�r>)rrA�compound_op�szSelectQuery.compound_op�UNION�	INTERSECT�EXCEPTcCsF|jjtd��jt||@�jd��j�}||B|S)Nr�r_)rxr�r6�from_rjrrY)r?r"Zwrapped_rhsr>r>rAr;�s"zSelectQuery.__xor__cCstjd�||�S)Nz	UNION ALL)rx�_compound_op_static)r?r"r>r>rA�	union_all�szSelectQuery.union_allcGs@t|�dk|_|p'|jjj}|j|�|_dS)Nr)r�r\rxrur�rr])r?r;r>r>rAZ__select�szSelectQuery.__selectcGs|rt|�nd|_dS)N)r�rt)r?r�r>r>rArA�szSelectQuery.from_cOs"|r|j|�nd|_dS)N)rrw)r?r�r�r>r>rA�group_by�szSelectQuery.group_bycGs|j|j|�|_dS)N)rrx)r?r r>r>rA�having�szSelectQuery.havingcOs"t|jt|�|�|_dS)N)r6ryr�)r?r�r�r>r>rArY�szSelectQuery.order_bycOs"t|jt|�|�|_dS)N)r6rur�)r?Zwindowsr�r>r>rAr[�szSelectQuery.windowcCs
||_dS)N)rz)r?Zlimr>r>rAr�szSelectQuery.limitcCs
||_dS)N)r{)r?Zoffr>r>rA�offset�szSelectQuery.offset�cCs0|dkr|d8}||_|||_dS)Nrr�)rzr{)r?ZpageZpaginate_byr>r>rA�paginate�s
	zSelectQuery.paginateTcCs
||_dS)N)rs)r?Zis_distinctr>r>rA�distinct�szSelectQuery.distinctFcCs||f|_dS)N)r})r?r�Znowaitr>r>rAr��szSelectQuery.for_updatecCs
||_dS)N)r9)r?�naiver>r>rArJ�szSelectQuery.naivecCs
||_dS)N)r.)r?r'r>r>rAr'�szSelectQuery.tuplescCs
||_dS)N)r/)r?r1r>r>rAr1�szSelectQuery.dictscCs
||_dS)N)r:)r?�aggregate_rowsr>r>rArK�szSelectQuery.aggregate_rowsNcCs
||_dS)N)r)r?rr>r>rAr�szSelectQuery.aliascCs�|dkr*tj|jj�jd�}|j|krN|j|j�}n|j�}|j	|j|�}|j
s�dd�|jD�|_
t|j�|f|_|S)NrQcSsg|]}|j��qSr>)r)r�rnr>r>rAr��s	z(SelectQuery.annotate.<locals>.<listcomp>)
r�Countrursrrrrxr�rrwr]r)r?rZ
annotationrlr>r>rA�annotate�s	zSelectQuery.annotatecCs=|dkr!tjtd��}|j�}|g|_|S)Nr�)rrLr6rYr])r?�aggregationrlr>r>rA�
_aggregate�s
zSelectQuery._aggregatecCs|j|�jd|�S)Nr()rOr))r?rNr(r>r>rA�	aggregate�szSelectQuery.aggregatecCsJ|js$|js$|js$|jr4|jd|�S|jdd�pIdS)N�clear_limitr(Fr)rsrwrzr{�
wrapped_countrP)r?rQr>r>rArQ�s$zSelectQuery.countcCsc|j�}|r"d|_|_|j�\}}d|}|jj||�}|j�pbdS)Nz+SELECT COUNT(1) FROM (%s) AS wrapped_selectr)rYrzr{rKrx�rawr))r?rQr�rKrL�wrappedZrqr>r>rArRs
zSelectQuery.wrapped_countcCs4|jdd�}td�g|_t|j��S)Nr��1)rHr6r]r�r))r?r�r>r>rA�exists
szSelectQuery.existscCs[|jdd�}yt|j��SWn.tk
rV|jjd|j���YnXdS)Nr�z:Instance matching query does not exist:
SQL: %s
PARAMS: %s)rHr�r&r�rxrrK)r?r�r>r>rAr�s
	zSelectQuery.getr�cCsN|j�}|j|�|jd|�}|rJ|dkrF|dS|SdS)Nr�r)r&r�r�)r?r�rWr}r>r>rA�peeks

zSelectQuery.peekcCs1|j|kr!||_d|_|jd|�S)NTr�)rzr�rW)r?r�r>r>rArZs		zSelectQuery.firstcCs|j�j|�S)N)r�rV)r?r>r>rArK%szSelectQuery.sqlcCst|j}xd|jD]Y}t|t�r;|j|kr;dSt|t�r|jdk	r|j|krdSqWdS)NFT)rxr]rOrrr)r?rxr
r>r>rA�verify_naive(s	zSelectQuery.verify_naivecCs|j|jfS)N)r]rf)r?r>r>rA�get_query_meta2szSelectQuery.get_query_metacCs�|jr|jjt�S|jr2|jjt�S|jsQ|jsQ|j�ra|jjt	�S|j
rz|jjt�S|jjt�SdS)N)
r.r�r2r3r/r4r9rfrXr5r:�RESULTS_AGGREGATE_MODELS�RESULTS_MODELS)r?r>r>rA�_get_result_wrapper5s			zSelectQuery._get_result_wrappercCso|js|jdkrd|j}|j�}|j�}|||j�|�|_d|_|jS|jSdS)NF)r�r-rxrYr\r%)r?rxZ
query_meta�
ResultWrapperr>r>rAr&As		zSelectQuery.executecCst|j��S)N)r�r&)r?r>r>rAr�LszSelectQuery.__iter__cCst|j�j��S)N)r�r&r�)r?r>r>rAr�OszSelectQuery.iteratorcCsm|j�}t|t�r'|j}n|}|dk	rU|dkrO|dnd}|j|�|j|S)Nrr�)r&rO�slice�stopr�r�)r?rZrWr�r>r>rAr'Rs
zSelectQuery.__getitem__cCst|j��S)N)r�r&)r?r>r>rAr�]szSelectQuery.__len__cCs
t|�S)N)�id)r?r>r>rAr�aszSelectQuery.__hash__)4rCrDrEr3r�r	r=rrBr6r5r8r;rCr8r�r�rArDrErYr[rrFrHrIr�rJr'r1rKrrMrOrPrQrRrVr�rWrZrKrXrYr\r&r�r�r'r��PY3r�r>r>)r�rArxRsn

	
rxc@s4eZdZdd�Zdd�Zdd�ZdS)�NoopSelectQuerycCs|jj�ffS)N)r��get_noop_sql)r?r>r>rArKeszNoopSelectQuery.sqlcCsdS)N)NNr>)r?r>r>rArYhszNoopSelectQuery.get_query_metacCs|jjt�S)N)r�r2r3)r?r>r>rAr\ksz#NoopSelectQuery._get_result_wrapperN)rCrDrErKrYr\r>r>r>rArbdsrbcsveZdZdZddd�fdd�Z�fdd�Zddd	�Zd
d�Zdd
�Zdd�Z	�S)rrr=Ncs8||_||_||_tt|�j|g�dS)N)r^rr"r�rrr�)r?rxr^rr")r�r>rAr�qs			zCompoundSelect.__init__cs@tt|�j|�}|j|_|j|_|j|_|S)N)r�rrr	r^rr")r?rl)r�r>rAr	ws
z CompoundSelect._clone_attributesFcCs|jd|�S)NrQ)rR)r?rQr>r>rArQ~szCompoundSelect.countcCs
|jj�S)N)r^rY)r?r>r>rArY�szCompoundSelect.get_query_metacCs|jj�o|jj�S)N)r^rXr")r?r>r>rArX�szCompoundSelect.verify_naivecCs�|jr|jjt�S|jr2|jjt�S|jrK|jjt�S|jj	p`|j
j	}|jjp�|j
jp�|j}|s�|s�|j�r�|jjt
�S|jjt�SdS)N)r.r�r2r3r/r4r:rZr^rfr"r9rXr5r[)r?Z	has_joinsZis_naiver>r>rAr\�s			!z"CompoundSelect._get_result_wrapper)
rCrDrEr3r�r	rQrYrXr\r>r>)r�rArrnsrrcs�eZdZ�fdd�Z�fdd�Zdd�Zeedd���Zeed	d
d���Zeed	dd
���Z	dd�Z
dd�Z�S)�_WriteQuerycs>d|_d|_d|_d|_tt|�j|�dS)NF)r�r.r/r-r�rdr�)r?rx)r�r>rAr��s
				z_WriteQuery.__init__csOtt|�j|�}|jrKt|j�|_|j|_|j|_|S)N)r�rdr	r�r�r.r/)r?rl)r�r>rAr	�s	z_WriteQuery._clone_attributescs�fdd�}|S)Ncs>|jjj}|js.tdt|����|||�S)Nz/RETURNING is not supported by your database: %s)rxrur�r�rqr�)r?r�r�r~)rr>rAr��s
	z-_WriteQuery.requires_returning.<locals>.innerr>)rr�r>)rrA�requires_returning�sz_WriteQuery.requires_returningcGsYt|�dkr.|ddkr.d|_n'|sC|jjj}|j|�|_dS)Nr�r)r�r�rxrur�r)r?r;r>r>rA�	returning�s
"z_WriteQuery.returningTcCs
||_dS)N)r.)r?r'r>r>rAr'�sz_WriteQuery.tuplescCs
||_dS)N)r/)r?r1r>r>rAr1�sz_WriteQuery.dictscCsQ|jdk	rA|jr(|jjt�S|jrA|jjt�S|jjt�S)N)r�r.r�r2r3r/r4r5)r?r>r>rAr2�s		z_WriteQuery.get_result_wrappercCsI|j�}|j|jgif}||j|j�|�|_|jS)N)r2r�rxr%r-)r?r]rGr>r>rA�_execute_with_result_wrapper�sz(_WriteQuery._execute_with_result_wrapper)rCrDrEr�r	rer�rfr'r1r2rgr>r>)r�rArd�s		rdcs�eZdZd�fdd�Z�fdd�Zeddd��Zed�Zd	d
�Z	dd�Z
d
d�Zdd�Z�S)�UpdateQueryNcs,||_d|_tt|�j|�dS)N)r�r�r�rhr�)r?rxr�)r�r>rAr��s		zUpdateQuery.__init__cs:tt|�j|�}t|j�|_|j|_|S)N)r�rhr	rr�r�)r?rl)r�r>rAr	�szUpdateQuery._clone_attributescCs
||_dS)N)r�)r?�actionr>r>rA�on_conflict�szUpdateQuery.on_conflictr0cCs|j�j|�S)N)r�r�)r?r>r>rArK�szUpdateQuery.sqlcCsX|jdk	r(|jdkr(|j�S|jdk	r>|jS|jj|j��SdS)N)r�r-rgr��
rows_affectedr%)r?r>r>rAr&�s

zUpdateQuery.executecCs.|jjjjstd��t|j��S)NzwUPDATE queries cannot be iterated over unless they specify a RETURNING clause, which is not supported by your database.)rxrur�r�rqr�r&)r?r>r>rAr��szUpdateQuery.__iter__cCst|j�j��S)N)r�r&r�)r?r>r>rAr��szUpdateQuery.iterator)
rCrDrEr�r	r�rjr�r�rKr&r�r�r>r>)r�rArh�srhcs�eZdZddddd�fdd�Zdd�Z�fdd�Zed	�Zed
�Ze	ddd
��Z
e	ddd��Ze	ddd��Ze
dd��Zdd�Zdd�Zdd�Z�S)�InsertQueryNFcs�tt|�j|�d|_|dk	p4|dk	|_d|_|dk	r[||_n|pdig|_||_||_||_	d|_
dS)NF)r�rlr�r��_is_multi_row_insert�_return_id_listr�r�r��_validate_fieldsr�)r?rxrN�rowsr�rl�validate_fields)r�r>rAr��s					zInsertQuery.__init__c
#s|jj}|jr0|j��fdd�}|j}|j}x�|jD]�}|j�}t�}xa|D]Y}|jr�||�||j	kr�|j	|}	n|}	||||	<|j
|	�qnW|r�x+|D]#}	|	|kr�||	�||	<q�W|VqLWdS)Ncs |�krtd|��dS)Nz"%s" is not a recognized field.)r�)r�)�valid_fieldsr>rA�validate_field
sz.InsertQuery._iter_rows.<locals>.validate_field)rxrurorr�
_default_dict�_default_callablesr�r�r�r�rt)
r?Z
model_metars�defaultsZ	callablesr�Z	field_rowrr�r�r>)rrrAr�
s,					
	

zInsertQuery._iter_rowscs|tt|�j|�}|j|_|j|_|j|_|j|_|j|_|j|_|j	|_	|j
|_
|S)N)r�rlr	r�r�rmr�r�rnror�)r?rl)r�r>rAr	(
szInsertQuery._clone_attributesr0zwhere clauseTcCs
||_dS)N)r�)r?�upsertr>r>rArw7
szInsertQuery.upsertcCs
||_dS)N)r�)r?rir>r>rArj;
szInsertQuery.on_conflictcCs
||_dS)N)rn)r?�return_id_listr>r>rArx?
szInsertQuery.return_id_listcCs'|jjr#|js|jr#dSdS)NTF)r��insert_returningrmrn)r?r>r>rAr�C
szInsertQuery.is_insert_returningcCs|j�j|�S)N)r�r�)r?r>r>rArKJ
szInsertQuery.sqlcCsrg}d}|j}xH|jD]=}t|j|�j|j�j�}|r|j|�qW|rj|S|SdS)N)rnr�rlrxrwr�r&ry)r?Zid_listZlast_idrxr�r>r>rA�_insert_with_loopM
s	zInsertQuery._insert_with_loopcCs;|jo1|jdko1|jdko1|jj}|rD|j�S|jdk	rl|jdkrl|j�S|jdk	r�|jS|j�}|js|jj	r�|j
�}|jj}dd�t
|j�|�D�}|jjjr�|S|dS|jj||j�S|jr3ttjd�|j��SdSdS)NcSs%g|]\}}|j|��qSr>)r�)r�r�r�r>r>rAr�q
s	z'InsertQuery.execute.<locals>.<listcomp>rT)rmr�r�r��insert_manyrzr-rgr%ryr�rxrurr�r��last_insert_idrnr�r�
itemgetter�fetchall)r?Zinsert_with_loopr�Zpk_rowrGZ
clean_datar>r>rAr&]
s0	


			zInsertQuery.execute)rCrDrEr�r�r	r�r�r�r�rwrjrxr�r�rKrzr&r>r>)r�rArl�s rlc@s4eZdZed�Zdd�Zdd�ZdS)�DeleteQueryr0cCs|j�j|�S)N)r�r�)r?r>r>rArK�
szDeleteQuery.sqlcCsX|jdk	r(|jdkr(|j�S|jdk	r>|jS|jj|j��SdS)N)r�r-rgr�rkr%)r?r>r>rAr&�
s

zDeleteQuery.executeN)rCrDrEr�r�rKr&r>r>r>rAr}
sr�
IndexMetadatar�rKr�r�r��ColumnMetadataZ	data_typer��ForeignKeyMetadatar��
dest_table�dest_columnc@seZdZdS)�PeeweeExceptionN)rCrDrEr>r>r>rAr��
sr�c@seZdZdS)r N)rCrDrEr>r>r>rAr �
sc@seZdZdS)rN)rCrDrEr>r>r>rAr�
sc@seZdZdS)rN)rCrDrEr>r>r>rAr�
sc@seZdZdS)r"N)rCrDrEr>r>r>rAr"�
sc@seZdZdS)r#N)rCrDrEr>r>r>rAr#�
sc@seZdZdS)r$N)rCrDrEr>r>r>rAr$�
sc@seZdZdS)r+N)rCrDrEr>r>r>rAr+�
sc@seZdZdS)r,N)rCrDrEr>r>r>rAr,�
sc@seZdZdS)r1N)rCrDrEr>r>r>rAr1�
sc@s=eZdZdgZdd�Zdd�Zdd�ZdS)	�ExceptionWrapper�
exceptionscCs
||_dS)N)r�)r?r�r>r>rAr��
szExceptionWrapper.__init__cCsdS)Nr>)r?r>r>rA�	__enter__�
szExceptionWrapper.__enter__cCsd|dkrdS|j|jkr`|j|j}trA|}n	|j}t|||�|�dS)N)rCr��PY26r�r\)r?�exc_type�	exc_value�	tracebackZnew_typeZexc_argsr>r>rA�__exit__�
s		zExceptionWrapper.__exit__N)rCrDrEr�r�r�r�r>r>r>rAr��
s	r�cs"eZdZ�fdd�Z�S)�_BaseConnectionLocalcsGtt|�j|�d|_d|_d|_g|_g|_dS)NT)r�r�r��
autocommit�closed�conn�
context_stack�transactions)r?r�)r�r>rAr��
s				z_BaseConnectionLocal.__init__)rCrDrEr�r>r>)r�rAr��
sr�c@seZdZdS)�_ConnectionLocalN)rCrDrEr>r>r>rAr��
sr�c@s�eZdZdZeZddddgZdZdZdZ	iZ
dZdZdZ
dZdZdZdZiZd	ZgZdZdZdZdZdZdZd
ededed
ededede de!de"i	Z#dddddddd�Z$dd�Z%dd�Z&dd�Z'dd�Z(dd�Z)dd �Z*d!d"�Z+d#d$�Z,d%d&�Z-d'd(�Z.e/d)d*��Z0e/d+d,��Z1d-d.�Z2d/d0�Z3d1d2�Z4d3d4�Z5d5d6�Z6ddd7d8�Z7d9d:�Z8d;d<�Z9d=d>�Z:d?d@�Z;dAdB�Z<dCdD�Z=dEdF�Z>dGdH�Z?ddIdJ�Z@dKdL�ZAdMdN�ZBdOdP�ZCdQdR�ZDdSdT�ZEddUdV�ZFdWdX�ZGddYdZ�ZHdd[d\�ZIdd]d^�ZJdd_d`�ZKddadb�ZLdcdd�ZMddedf�ZNddgdh�ZOddidj�ZPddkdl�ZQddmdn�ZRdodp�ZSdddqdr�ZTdddsdt�ZUdddudv�ZVdddwdx�ZWdydz�ZXd{d|�ZYd}d~�ZZdd��Z[d�d��Z\d�d��Z]dS)��DatabaseFr>r?r@z	UNION ALLTr0Nr/ZConstraintErrorrrr"r#r$r+r,r1c	Ks�i|_|rt�|_nt�|_|j||�tj�|_||_||_	||_
t|j|pvi�|_t|j
|p�i�|_
dS)N)�connect_kwargsr��_localr��init�	threading�Lock�
_conn_lockr��autorollback�use_speedupsr�r:r;)	r?r�Zthreadlocalsr�r��opsr�r�r�r>r>rAr��
s				zDatabase.__init__cKsB|j�s|j�|dk|_||_|jj|�dS)N)�	is_closedr�rr�r�r�)r?r�r�r>r>rAr��
s

	z
Database.initcCs
t|j�S)N)r�r�)r?r>r>rA�exception_wrapper�
szDatabase.exception_wrappercCs{|j�k|jrtd��|j��B|j|j|j�|j_d|j_	|j
|jj�WdQRXWdQRXdS)NzBError, database not properly initialized before opening connectionF)r�r�	Exceptionr��_connectr�r�r�r�r��initialize_connection)r?r>r>rA�connects
	
zDatabase.connectcCsdS)Nr>)r?r�r>r>rAr�
szDatabase.initialize_connectioncCs]|j�M|jrtd��|j��$|j|jj�d|j_WdQRXWdQRXdS)NzBError, database not properly initialized before closing connectionT)r�rr�r��_closer�r�r�)r?r>r>rAr�s
	
zDatabase.closecCsO|jjr/|jjdj}|dk	r/|S|jjrE|j�|jjS)Nr�r�)r�r��
connectionr�r�r�)r?r�r>r>rA�get_conns
zDatabase.get_conncCs
|jjS)N)r�r�)r?r>r>rAr�"szDatabase.is_closedcCs|j�j�S)N)r�r�)r?r>r>rA�
get_cursor%szDatabase.get_cursorcCs|j�dS)N)r�)r?r�r>r>rAr�(szDatabase._closecKs
t�dS)N)r�)r?r�r�r>r>rAr�+szDatabase._connectcCst|j|�|_dS)N)r�r:)rr�r>r>rA�register_fields.szDatabase.register_fieldscCst|j|�|_dS)N)r�r;)rr�r>r>rA�register_ops2szDatabase.register_opscCs�|tkr|jrtStS|tkr-tS|tkrJ|jrFtStS|t	krg|jrct
StS|tkrwt
S|jr�tStSdS)N)r5r�r�r�r[r�r3r�r�r4r�r�rZr�)r?Zwrapper_typer>r>rAr26s



zDatabase.get_result_wrappercCs|jjr|jSdS)N)rur�Z	lastrowid)r?r�rzr>r>rAr|HszDatabase.last_insert_idcCs|jS)N)Zrowcount)r?r�r>r>rArkLszDatabase.rows_affectedcCs"|j|j|j|j|j�S)N)�compiler_classr1r2r:r;)r?r>r>rAr�OszDatabase.compilercCs|j|j�j|��S)N)r#r�rR)r?rdr>r>rAr&TszDatabase.executecCs�tj||f�|j��~|j�}y|j||pAf�Wn4tk
r||j�ru|jru|j��YnX|r�|j�r�|j	�WdQRX|S)N)
�logger�debugr�r�r&r��get_autocommitr��rollback�commit)r?rKrLr$r�r>r>rAr#Ws


zDatabase.execute_sqlcCsdS)Nr>)r?r>r>rA�beginfszDatabase.begincCs|j�j�dS)N)r�r�)r?r>r>rAr�iszDatabase.commitcCs|j�j�dS)N)r�r�)r?r>r>rAr�lszDatabase.rollbackcCs||j_dS)N)r�r�)r?r�r>r>rA�set_autocommitoszDatabase.set_autocommitcCs,|jjdkr"|j|j�|jjS)N)r�r�r�)r?r>r>rAr�rszDatabase.get_autocommitcCs|jjj|�dS)N)r�r�ry)r?�transactionr>r>rA�push_execution_contextwszDatabase.push_execution_contextcCs|jjj�dS)N)r�r�r�)r?r>r>rA�pop_execution_contextzszDatabase.pop_execution_contextcCst|jj�S)N)r�r�r�)r?r>r>rA�execution_context_depth}sz Database.execution_context_depthcCst|d|�S)N�with_transaction)�ExecutionContext)r?r�r>r>rA�execution_context�szDatabase.execution_contextcCs|jjj|�dS)N)r�r�ry)r?r�r>r>rA�push_transaction�szDatabase.push_transactioncCs|jjj�dS)N)r�r�r�)r?r>r>rA�pop_transaction�szDatabase.pop_transactioncCst|jj�S)N)r�r�r�)r?r>r>rA�transaction_depth�szDatabase.transaction_depthcCs
t|�S)N)r�)r?r>r>rAr��szDatabase.transactioncs%t����fdd��}|S)Nc
s%�j���||�SWdQRXdS)N)r�)r�r�)r�r?r>rAr��s
z)Database.commit_on_success.<locals>.inner)r)r?r�r�r>)r�r?rA�commit_on_success�s!zDatabase.commit_on_successcCs|jst�t||�S)N)�
savepointsr��	savepoint)r?�sidr>r>rAr��s	zDatabase.savepointcCs
t|�S)N)�_atomic)r?r>r>rA�atomic�szDatabase.atomiccCs
t�dS)N)r�)r?r�r>r>rA�
get_tables�szDatabase.get_tablescCs
t�dS)N)r�)r?r�r�r>r>rA�get_indexes�szDatabase.get_indexescCs
t�dS)N)r�)r?r�r�r>r>rA�get_columns�szDatabase.get_columnscCs
t�dS)N)r�)r?r�r�r>r>rA�get_primary_keys�szDatabase.get_primary_keyscCs
t�dS)N)r�)r?r�r�r>r>rA�get_foreign_keys�szDatabase.get_foreign_keyscCs
t�dS)N)r�)r?�seqr>r>rA�sequence_exists�szDatabase.sequence_existscCs%|j�}|j|j||��S)N)r�r#r�)r?rxr��qcr>r>rAr��szDatabase.create_tablecCst|d|�dS)Nr�)�create_model_tables)r?r}r�r>r>rA�
create_tables�szDatabase.create_tablescsf|j�}t|ttf�s1td|���fdd�|D�}|j|j�||��S)Nz=Fields passed to "create_index" must be a list or tuple: "%s"cs5g|]+}t|t�r+�jj|n|�qSr>)rOr�rur�)r�rK)rxr>rAr��s	z)Database.create_index.<locals>.<listcomp>)r�rOr�rrqr#r�)r?rxr�r�r��fobjsr>)rxrAr��s

zDatabase.create_indexcsf|j�}t|ttf�s1td|���fdd�|D�}|j|j�||��S)Nz;Fields passed to "drop_index" must be a list or tuple: "%s"cs5g|]+}t|t�r+�jj|n|�qSr>)rOr�rur�)r�rK)rxr>rAr��s	z'Database.drop_index.<locals>.<listcomp>)r�rOr�rrqr#r�)r?rxr�r�r�r�r>)rxrAr��s

zDatabase.drop_indexcCs(|j�}|j|j|||��S)N)r�r#r�)r?rxr�rmr�r>r>rAr��szDatabase.create_foreign_keycCs/|jr+|j�}|j|j|��SdS)N)�	sequencesr�r#r�)r?r�r�r>r>rAr��s	zDatabase.create_sequencecCs(|j�}|j|j|||��S)N)r�r#r�)r?rxr�r�r�r>r>rAr��szDatabase.drop_tablecCst|d|d|�dS)Nr�r�)�drop_model_tables)r?r}r�r�r>r>rA�drop_tables�szDatabase.drop_tablescCs(|j�}|j|j|||��S)N)r�r#r�)r?rxr�r�r�r>r>rAr��szDatabase.truncate_tablecCs1x*tt|��D]}|j||�qWdS)N)r�rlr�)r?r}r�r�rzr>r>rA�truncate_tables�szDatabase.truncate_tablescCs/|jr+|j�}|j|j|��SdS)N)r�r�r#r�)r?r�r�r>r>rAr��s	zDatabase.drop_sequencecCstjt|td�|��S)Nrp)r�EXTRACTrr3)r?r��
date_fieldr>r>rAr��szDatabase.extract_datecCstj||�S)N)rZ
DATE_TRUNC)r?r�r�r>r>rA�
truncate_date�szDatabase.truncate_datecCs
td�S)NzDEFAULT VALUES)r6)r?rxr>r>rAr��szDatabase.default_insert_clausecCsdS)NzSELECT 0 WHERE 0r>)r?r>r>rArc�szDatabase.get_noop_sqlcCstS)N)r�)r?r>r>rAr��szDatabase.get_binary_type)^rCrDrEr7r+r�r<rX�distinct_on�drop_cascader:�foreign_keysr��for_update_nowaitr{ryr2r|r;r1�reserved_tablesr�r�r��subquery_delete_same_tabler��window_functionsr"rrr#r$r+r,r1r�r�r�r�r�r�r�r�r�r�r�r�r4r�r�r2r|rkr�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�rcr�r>r>r>rAr��
s�		

r�csBeZdZeZddddddiZdZeoBejd/kZ	d0Z
ejdej
d
iZdZd�fdd�Zdd�Zdd�Zdd�Zddd�Zddd�Zddd�Zddd �Zdd!d"�Zdd#d$�Zdd%d&�Zdd'd(�Zd)d*�Zd+d,�Zd-d.�Z�S)1r5r�r,r�r�r-FrKr��rr�ZGLOBr�zINSERT OR REPLACE INTONcs]|p	g|_|jdd�}|r=|jjd|f�tt|�j|||�dS)N�journal_mode)�_pragmasr�ryr�r5r�)r?r�Zpragmasr�r�r�)r�r>rAr�s
zSqliteDatabase.__init__c	KsZtstd��tj||�}d|_y|j|�Wn|j��YnX|S)Nz&pysqlite or sqlite3 must be installed.)�sqlite3r r��isolation_level�_add_conn_hooksr�)r?r�r�r�r>r>rAr�s	
zSqliteDatabase._connectcCsJ|j|�|jddt�|jddt�|jddt�dS)Nr�rJZ
date_truncr�)�_set_pragmasZcreate_functionr�r�r�)r?r�r>r>rAr�s
zSqliteDatabase._add_conn_hookscCsT|jrP|j�}x.|jD]#\}}|jd||f�qW|j�dS)NzPRAGMA %s = %s;)r�r�r&r�)r?r�r�ZpragmarZr>r>rAr�%s
	zSqliteDatabase._set_pragmasZDEFERREDcCs|jd|dd�dS)NzBEGIN %sr$F)r#)r?Z	lock_typer>r>rAr�,szSqliteDatabase.begincCstd��dS)NzBSQLite does not support ALTER TABLE statements to add constraints.)r,)r?rxr�rmr>r>rAr�/sz!SqliteDatabase.create_foreign_keycCs)|jdd�}dd�|j�D�S)Nz<SELECT name FROM sqlite_master WHERE type = ? ORDER BY name;r�cSsg|]}|d�qS)rr>)r�r�r>r>rAr�6s	z-SqliteDatabase.get_tables.<locals>.<listcomp>)r�)r#r~)r?r�r�r>r>rAr�3s		zSqliteDatabase.get_tablesc	s	d}|j|�df�}t|j���t��|jd��}xG|j�D]9}|d}t|d�dk}|rY�j|�qYWi�xDt��D]6}|jd|�}dd�|j�D��|<q�W����fd	d�t��D�S)
NzQSELECT name, sql FROM sqlite_master WHERE tbl_name = ? AND type = ? ORDER BY namer�zPRAGMA index_list("%s")r�rJzPRAGMA index_info("%s")cSsg|]}|d�qS)rJr>)r�r�r>r>rAr�Ks	z.SqliteDatabase.get_indexes.<locals>.<listcomp>cs6g|],}t|�|�||�k���qSr>)r�)r�r�)�
index_columns�index_to_sqlr��unique_indexesr>rAr�Ns	)r#rr~r�r�rtr�)	r?r�r�rlr�r�r��	is_uniquer�r>)r�r�r�r�rAr�8s 	
!zSqliteDatabase.get_indexescs0|jd��}�fdd�|j�D�S)NzPRAGMA table_info("%s")c	s?g|]5}t|d|d|dt|d����qS)r�rJrKr�)r�r�)r�r�)r�r>rAr�Xs	z.SqliteDatabase.get_columns.<locals>.<listcomp>)r#r~)r?r�r�r�r>)r�rAr�VszSqliteDatabase.get_columnscCs*|jd|�}dd�|j�D�S)NzPRAGMA table_info("%s")cSs$g|]}|dr|d�qS)r�r�r>)r�r�r>r>rAr�]s	z3SqliteDatabase.get_primary_keys.<locals>.<listcomp>)r#r~)r?r�r�r�r>r>rAr�[szSqliteDatabase.get_primary_keyscs0|jd��}�fdd�|j�D�S)NzPRAGMA foreign_key_list("%s")cs1g|]'}t|d|d|d���qS)rKrJr�)r�)r�r�)r�r>rAr�as	z3SqliteDatabase.get_foreign_keys.<locals>.<listcomp>)r#r~)r?r�r�r�r>)r�rAr�_szSqliteDatabase.get_foreign_keyscCs
t||�S)N)�savepoint_sqlite)r?r�r>r>rAr�dszSqliteDatabase.savepointcCstj||�S)N)rr�)r?r�r�r>r>rAr�gszSqliteDatabase.extract_datecCstjt||�S)N)rr�r�)r?r�r�r>r>rAr�jszSqliteDatabase.truncate_datecCstjS)N)r��Binary)r?r>r>rAr�mszSqliteDatabase.get_binary_type)rKr�r�rr�)rCrDrEr�r�r:r�r��sqlite_version_infor{r|r&r�r�r;r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r>r>)r�rAr5�s2	c@sBeZdZdZdZdZdZdddddddd	d
ddd
ddiZdZdZ	dZ
dZej
diZdgZdZdZdZdZddd�Zdd�Zdd�Zddd�Zddd�Zddd �Zdd!d"�Zdd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�ZdS)-r.Tr�ZBYTEAr�ZBOOLEANroZ	TIMESTAMPr��NUMERICr�zDOUBLE PRECISIONrsZSERIALr�r�z%s�~�userNcKsmtstd��tjd||�}|jrVtjtj|�tjtj|�|ri|j|�|S)Nzpsycopg2 must be installed.r�)	�psycopg2r r��register_unicode�
pg_extensionsZ
register_type�UNICODEZUNICODEARRAYZset_client_encoding)r?r�r�r�r�r>r>rAr��s	
zPostgresqlDatabase._connectcCsR|j}|jdk	r.|jjr.|jjS|jrNd|j|jjfSdS)NFz	%s_%s_seq)rursr�r�r�r�)r?rzrGr>r>rA�_get_pk_sequence�s
	
	z#PostgresqlDatabase._get_pk_sequencecCs�|j|�}|sdS|j}|jr;d|j}nd}|jd||f�|j�d}|j�r~|j�|S)Nz%s.r�zSELECT CURRVAL('%s"%s"')r)r�rur�r&r�r�r�)r?r�rzr�rGr��resultr>r>rAr|�s		
z!PostgresqlDatabase.last_insert_idZpubliccCs,d}dd�|j||f�j�D�S)NzSSELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = %s ORDER BY tablenamecSsg|]\}|�qSr>r>)r�r[r>r>rAr��s	z1PostgresqlDatabase.get_tables.<locals>.<listcomp>)r#r~)r?r�rlr>r>rAr��szPostgresqlDatabase.get_tablescs>d}|j|�d|f�}�fdd�|j�D�S)Na
            SELECT
                i.relname, idxs.indexdef, idx.indisunique,
                array_to_string(array_agg(cols.attname), ',')
            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)
            LEFT OUTER JOIN pg_catalog.pg_attribute AS cols ON
                (cols.attrelid = t.oid AND cols.attnum = ANY(idx.indkey))
            WHERE t.relname = %s AND t.relkind = %s AND idxs.schemaname = %s
            GROUP BY i.relname, idxs.indexdef, idx.indisunique
            ORDER BY idx.indisunique DESC, i.relname;r[csAg|]7}t|d|d|djd�|d���qS)rr�rK�,rJ)r�r)r�r�)r�r>rAr��s	z2PostgresqlDatabase.get_indexes.<locals>.<listcomp>)r#r~)r?r�r�rlr�r>)r�rAr��szPostgresqlDatabase.get_indexescsVd}|j|�|f�}t|j�|�����fdd�|j�D�S)Nz�
            SELECT column_name, is_nullable, data_type
            FROM information_schema.columns
            WHERE table_name = %s AND table_schema = %s
            ORDER BY ordinal_positioncs=g|]3\}}}t|||dk|�k���qS)�YES)r�)r�r�r�r�)�pksr�r>rAr��s	z2PostgresqlDatabase.get_columns.<locals>.<listcomp>)r#r�r�r~)r?r�r�rlr�r>)r�r�rAr��s
zPostgresqlDatabase.get_columnscCs8d}|j|d||f�}dd�|j�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 = %szPRIMARY KEYcSsg|]\}|�qSr>r>)r�r�r>r>rAr��s	z7PostgresqlDatabase.get_primary_keys.<locals>.<listcomp>)r#r~)r?r�r�rlr�r>r>rAr��sz#PostgresqlDatabase.get_primary_keyscs;d}|j|�|f�}�fdd�|j�D�S)Na�
            SELECT
                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)
            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 = %scs1g|]'}t|d|d|d���qS)rr�rJ)r�)r�r�)r�r>rAr��s	z7PostgresqlDatabase.get_foreign_keys.<locals>.<listcomp>)r#r~)r?r�r�rKr�r>)r�rAr��sz#PostgresqlDatabase.get_foreign_keyscCs)|jd|f�}t|j�d�S)Nz�
            SELECT COUNT(*) FROM pg_class, pg_namespace
            WHERE relkind='S'
                AND pg_class.relnamespace = pg_namespace.oid
                AND relname=%sr)r#r�r�)r?r�rWr>r>rAr��sz"PostgresqlDatabase.sequence_existscGs4djdgt|��}|jd||�dS)Nr�z%szSET search_path TO %s)r�r�r#)r?Zsearch_pathZpath_paramsr>r>rA�set_search_path�sz"PostgresqlDatabase.set_search_pathcCsdS)NzSELECT 0 WHERE falser>)r?r>r>rArcszPostgresqlDatabase.get_noop_sqlcCstjS)N)r�r�)r?r>r>rAr�sz"PostgresqlDatabase.get_binary_type) rCrDrEr7rXr�r�r:r�r�ryr2r&r�r;r�r�r�r�r�r�r�r|r�r�r�r�r�r�r�rcr�r>r>r>rAr.psB	c@s*eZdZdZddgZdddddd	d
ddd
ddddiZdZdZd4Ze	j
de	jde	jdiZ
dZdZdZdd�Zddd �Zdd!d"�Zdd#d$�Zdd%d&�Zdd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�ZdS)5r*Tr>z	UNION ALLr�ZBOOLr�r�r�zDOUBLE PRECISIONr��FLOATrszINTEGER AUTO_INCREMENTr�ZLONGTEXTr�zVARCHAR(40)z%srJr�r�zLIKE BINARYr�r��`FzREPLACE INTOcKsctstd��ddddi}|j|�d|krP|jd�|d<tjd||�S)	Nz%MySQLdb or PyMySQL must be installed.�charset�utf8Zuse_unicodeTZpasswordZpasswdr~)�mysqlr r�r�r�)r?r�r�Zconn_kwargsr>r>rAr�s
zMySQLDatabase._connectNcCsdd�|jd�D�S)NcSsg|]\}|�qSr>r>)r�r�r>r>rAr�+s	z,MySQLDatabase.get_tables.<locals>.<listcomp>zSHOW TABLES)r#)r?r�r>r>rAr�*szMySQLDatabase.get_tablescs�|jd��}t��i�x\|j�D]N}|dsP�j|d��j|dg��|dj|d�q/W���fdd��D�S)NzSHOW INDEX FROM `%s`r�rJr�cs2g|](}t|d�||�k���qS)N)r�)r�r�)�indexesr�r�r>rAr�6s	z-MySQLDatabase.get_indexes.<locals>.<listcomp>)r#r�r~rtr�ry)r?r�r�r�r�r>)r�r�r�rAr�-s	
zMySQLDatabase.get_indexescsPd}|j|�f�}t|j������fdd�|j�D�S)Nz�
            SELECT column_name, is_nullable, data_type
            FROM information_schema.columns
            WHERE table_name = %s AND table_schema = DATABASE()cs=g|]3\}}}t|||dk|�k���qS)r�)r�)r�r�r�r�)r�r�r>rAr�@s	z-MySQLDatabase.get_columns.<locals>.<listcomp>)r#r�r�r~)r?r�r�rKr�r>)r�r�rAr�9s
zMySQLDatabase.get_columnscCs*|jd|�}dd�|j�D�S)NzSHOW INDEX FROM `%s`cSs*g|] }|ddkr|d�qS)rJZPRIMARYr�r>)r�r�r>r>rAr�Es	z2MySQLDatabase.get_primary_keys.<locals>.<listcomp>)r#r~)r?r�r�r�r>r>rAr�CszMySQLDatabase.get_primary_keyscs8d}|j|�f�}�fdd�|j�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 NULLcs.g|]$\}}}t|||���qSr>)r�)r�r�r�r�)r�r>rAr�Qs	z2MySQLDatabase.get_foreign_keys.<locals>.<listcomp>)r#r~)r?r�r�rlr�r>)r�rAr�GszMySQLDatabase.get_foreign_keyscCs%tjtt|�td�|��S)Nrp)rr�rr3)r?r�r�r>r>rAr�TszMySQLDatabase.extract_datecCstj|t|�S)N)rZDATE_FORMAT�MYSQL_DATE_TRUNC_MAPPING)r?r�r�r>r>rAr�WszMySQLDatabase.truncate_datecCstt|jj�td��S)NzVALUES (DEFAULT))rrjrursr6)r?rxr>r>rAr�Zsz#MySQLDatabase.default_insert_clausecCsdS)NzDO 0r>)r?r>r>rArc_szMySQLDatabase.get_noop_sqlcCstjS)N)r�r�)r?r>r>rAr�bszMySQLDatabase.get_binary_typell����)rCrDrEr7r<r:r�r2r|r&r�r�r�r;r1r�r�r�r�r�r�r�r�r�r�r�rcr�r>r>r>rAr*s:		

c@seZdZdd�ZdS)�_callable_context_managercs%t����fdd��}|S)Nc
s���||�SWdQRXdS)Nr>)r�r�)rr?r>rAr�hsz1_callable_context_manager.__call__.<locals>.inner)r)r?rr�r>)rr?rA�__call__gs!z"_callable_context_manager.__call__N)rCrDrEr�r>r>r>rAr�fsr�c@s7eZdZddd�Zdd�Zdd�ZdS)	r�TcCs||_||_d|_dS)N)r�r�r�)r?r�r�r>r>rAr�os		zExecutionContext.__init__c
Cst|jj�a|jj|�|jj|jj|jj�|_|jri|jj�|_|jj	�WdQRX|S)N)
r�r�r�r�r�r�r�r��txnr�)r?r>r>rAr�ts
			zExecutionContext.__enter__cCs�|jj��|jdkr,|jj�n]z9|jrd|sN|jjd�|jj|||�Wd|jj�|jj|j�XWdQRXdS)NF)	r�r�r�r�r�rr�r�r�)r?r��exc_val�exc_tbr>r>rAr�s
	
zExecutionContext.__exit__N)rCrDrEr�r�r�r>r>r>rAr�nsr�csIeZdZd�fdd�Z�fdd�Z�fdd�Z�S)r:Tcs&tt|�j||�||_dS)N)r�r:r�r})r?r�r}r�)r�r>rAr��szUsing.__init__csUg|_x6|jD]+}|jj|jj�|j|j_qWtt|�j�S)N)�_origr}ryrur�r�r:r�)r?rz)r�r>rAr��s
	zUsing.__enter__csStt|�j|||�x0t|j�D]\}}|j||j_q,WdS)N)r�r:r�rcr}rrur�)r?r�rrr�rz)r�r>rAr��szUsing.__exit__)rCrDrEr�r�r�r>r>)r�rAr:�sc@s4eZdZdd�Zdd�Zdd�ZdS)r�cCs
||_dS)N)r~)r?r~r>r>rAr��sz_atomic.__init__cCsI|jj�dkr*|jj�|_n|jj�|_|jj�S)Nr)r~r�r��_helperr�r�)r?r>r>rAr��sz_atomic.__enter__cCs|jj|||�S)N)rr�)r?r�rrr>r>rAr��sz_atomic.__exit__N)rCrDrEr�r�r�r>r>r>rAr��sr�c@s^eZdZdd�Zdd�Zddd�Zddd	�Zd
d�Zdd
�ZdS)r�cCs
||_dS)N)r~)r?r~r>r>rAr��sztransaction.__init__cCs|jj�dS)N)r~r�)r?r>r>rA�_begin�sztransaction._beginTcCs!|jj�|r|j�dS)N)r~r�r)r?r�r>r>rAr��s
ztransaction.commitcCs!|jj�|r|j�dS)N)r~r�r)r?r�r>r>rAr��s
ztransaction.rollbackcCsU|jj�|_|jjd�|jj�dkrA|j�|jj|�|S)NFr)r~r�rr�r�rr�)r?r>r>rAr��s
ztransaction.__enter__cCs�z[|r|jd�nA|jj�dkrZy|jd�Wn|jd��YnXWd|jj|j�|jj�XdS)NFr�)r�r~r�r�r�rr�)r?r�rrr>r>rAr��s
ztransaction.__exit__N)	rCrDrEr�rr�r�r�r�r>r>r>rAr��sr�c@s[eZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�ZdS)r�NcCsJ||_|j�}|p+dtj�j|_|j|j�|_dS)NrV)r~r�r�Zuuid4r�r�rI�
quoted_sid)r?r~r�Z	_compilerr>r>rAr��s	zsavepoint.__init__cCs|jj|dd�dS)Nr$F)r~r#)r?rlr>r>rAr%�szsavepoint._executecCs|jd|j�dS)NzRELEASE SAVEPOINT %s;)r%r)r?r>r>rAr��szsavepoint.commitcCs|jd|j�dS)NzROLLBACK TO SAVEPOINT %s;)r%r)r?r>r>rAr��szsavepoint.rollbackcCs:|jj�|_|jjd�|jd|j�|S)NFz
SAVEPOINT %s;)r~r��_orig_autocommitr�r%r)r?r>r>rAr��szsavepoint.__enter__cCsXz=|r|j�n&y|j�Wn|j��YnXWd|jj|j�XdS)N)r�r�r~r�r)r?r�rrr>r>rAr��s

zsavepoint.__exit__)	rCrDrEr�r%r�r�r�r�r>r>r>rAr��sr�cs4eZdZ�fdd�Z�fdd�Z�S)r�csR|jj�}|jdk	r6|j|_d|_n	d|_tt|�j�S)N)r~r�r��_orig_isolation_levelr�r�r�)r?r�)r�r>rAr��s	zsavepoint_sqlite.__enter__csLz tt|�j|||�SWd|jdk	rG|j|jj�_XdS)N)r�r�r�rr~r�r�)r?r�rr)r�r>rAr�s
zsavepoint_sqlite.__exit__)rCrDrEr�r�r>r>)r�rAr��sr�c@sXeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)r�cCs%||_|jj|_||_dS)N)r�rxrzr�)r?rr�r>r>rAr�s	zFieldProxy.__init__cCst|j|j�S)N)r�r�r�)r?r>r>rArszFieldProxy.clone_basecCs|jj|�S)N)r�rV)r?rZr>r>rArVszFieldProxy.coercecCs|jj|�S)N)r�r�)r?rZr>r>rAr�szFieldProxy.python_valuecCs|jj|�S)N)r�r�)r?rZr>r>rAr�szFieldProxy.db_valuecCs#|dkr|jSt|j|�S)Nrx)r�r�r�)r?r�r>r>rAr�szFieldProxy.__getattr__N)	rCrDrEr�rrVr�r�r�r>r>r>rAr�sr�c@s[eZdZdd�Zdd�Zdd�Zddd	�Zd
d�Zdd
�ZdS)rcCs||jd<dS)Nrx)r)r?rxr>r>rAr�#szModelAlias.__init__cCs2t|j|�}t|t�r.t||�S|S)N)r�rxrOrr�)r?r�r r>r>rAr�&s
zModelAlias.__getattr__cCstd��dS)Nz-Cannot set attributes on ModelAlias instances)r�)r?r�rZr>r>rAr�,szModelAlias.__setattr__Fcs;�jj}|r|jn|j}�fdd�|D�S)Ncsg|]}t�|��qSr>)r�)r�rK)r?r>rAr�2s	z/ModelAlias.get_proxy_fields.<locals>.<listcomp>)rxrur��
sorted_fields)r?r�Zmmr�r>)r?rAr/szModelAlias.get_proxy_fieldscGsF|s|j�}t||�}|jjrB|j|jj�}|S)N)rrxrurY)r?r;rlr>r>rAr�4szModelAlias.selectcKs
|j|�S)N)rx)r?r�r>r>rAr�<szModelAlias.__call__N)	rCrDrEr�r�r�rr�r�r>r>r>rAr"src@sjeZdZdZdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)r��_keys�_itemscCsg|_g|_dS)N)r
r)r?r>r>rAr�Cs	z_SortedFieldList.__init__cCs|j|S)N)r)r?r�r>r>rAr'Gsz_SortedFieldList.__getitem__cCs
t|j�S)N)r�r)r?r>r>rAr�Jsz_SortedFieldList.__iter__cCsD|j}t|j|�}t|j|�}||j||�kS)N)r�rr
rr)r?�item�kr�rr>r>rAr(Ms	z_SortedFieldList.__contains__cCs|jj|j�S)N)r
r�r�)r?r�r>r>rAr�Ssz_SortedFieldList.indexcCsE|j}t|j|�}|jj||�|jj||�dS)N)r�rr
�insertr)r?rr
r�r>r>rArVs	z_SortedFieldList.insertcCs'|j|�}|j|=|j|=dS)N)r�rr
)r?rrdr>r>rA�remove\s
z_SortedFieldList.removeN)r
r)rCrDrEr�r�r'r�r(r�rrr>r>r>rAr�@sr�c@seZdZdS)rN)rCrDrEr>r>r>rArasz	peewee.dbc
@s�eZdZddddddddddddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Zdd�Z	dd�Z
dd�Zdddd�Zdddd�Z
dd�Zddd�ZdS)�ModelOptionsNTFc
Ks�||_|jj�|_i|_i|_i|_i|_i|_i|_	g|_
t�|_g|_
g|_t�|_g|_|dk	r�|nt|_||_||_t|p�g�|_||_||_||_|	|_|
|_||_||_d|_d|_ i|_!i|_"x*|
j#�D]\}}t$|||�q?Wt|
j%��|_&|jr�|jr�|j|�|_dS)NF)'rxrCr�r�r�r�rv�_default_by_namertru�_default_callable_listr��_sorted_field_listr	�sorted_field_namesr�rrr��default_databaser�r��
db_table_funcr�r�rYrsrer�r�r�only_save_dirtyr�r�rrvr)rr��_additional_keys)r?rr�r�rr�rYrsrer�r�rrr�r�rZr>r>rAr�isD																								zModelOptions.__init__cCsd|jj|jfS)Nz<%s: %s>)r�rCr�)r?r>r>rAr%�szModelOptions.__repr__cCs�|jr�g}x�|jD]�}t|t�rV|jdkrCdnd}||j}|j|jd�}|jd�r�|j|j	��q|j|j
��qW||_dS)Nrr�r�)rYrOrrr�r��lstripr-ryrr)r?Z
norm_order_byrr&r�r>r>rAr��s	
zModelOptions.preparedcCs�t|j�|_dd�|jD�|_t|jj��t|jj��Bt|jf�B|_	dd�|jD�|_
dS)NcSsg|]}|j�qSr>)r�)r�rKr>r>rAr��s	z4ModelOptions._update_field_lists.<locals>.<listcomp>cSs%g|]}t|t�s|�qSr>)rOr�)r�r�r>r>rAr��s	)r�rr	rr�r�r�rwrsrrr�)r?r>r>rA�_update_field_lists�s
%z ModelOptions._update_field_listscCs�|j|j�||j|j<||j|j<|jj|�|j�|jdk	r�|j|j	|<t
|j�r�|j|j|<|jj
|j|jf�n#|j|j|<|j|j|j<dS)N)�remove_fieldr�r�r�r�rrrr�rvrrurryrtr)r?r�r>r>rAr��s
zModelOptions.add_fieldcCs�||jkrdS|jj|�}|j|j=|jj|�|j�|jdk	r�|j|=|j	j|d�r�xlt
|j�D]/\}\}}||kr�|jj|�Pq�Wn)|jj|d�|j
j|jd�dS)N)r�r�r�r�rrrr�rvrurcrrtrr�)r?rZoriginalr�r�r_r>r>rAr�s


"zModelOptions.remove_fieldcCs:|jj�}x$|jD]\}}|�||<qW|S)N)rr�r)r?Zddrr�r>r>rA�get_default_dict�szModelOptions.get_default_dictcCs1y|jj|�SWntk
r,dSYnXdS)Nr�r�)rr�rq)r?r�r>r>rA�get_field_index�s
zModelOptions.get_field_indexcs0�jr&�fdd��jjD�S�jgS)Ncsg|]}�j|�qSr>)r�)r�r)r?r>rAr��s	z7ModelOptions.get_primary_key_fields.<locals>.<listcomp>)r�rsr)r?r>)r?rAr��s	z#ModelOptions.get_primary_key_fieldsc	Cs�t|t�}|o"t|t�}|r1g}x�|jD]}}t|t�r;|j|kr;|dkp�|r�|j|jkp�|o�|j|jk}|r;|s�|S|j|�q;W|r�|SdS)N)	rOrrr	rrr�rry)	r?rzr��multiZis_fieldZis_noderr�Zis_matchr>r>rAry�szModelOptions.rel_for_modelcCs|jj|j||�S)N)ruryrx)r?rzr�rr>r>rArz�sz"ModelOptions.reverse_rel_for_modelcCs|j|�p|j|�S)N)ryrz)r?rzr>r>rAr�szModelOptions.rel_existscCs�g}|jg}x�|r�|j�}||kr6q|j|�x*|jjj�D]}|j|j�qVW|rx*|jjj�D]}|j|j�q�WqW|S)N)rxr�ryrurrwrrv)r?�backrefsr}r�rzrnr>r>rA�related_models�s	
zModelOptions.related_models)rCrDrEr�r%r�rr�rrrr�ryrzrr r>r>r>rArhs 			(	rc
sUeZdZeddddddddd	g	�Z�fd
d�Zdd
�Z�S)�	BaseModelr�r�rr�rYrsr�rrcs8|tks|djtkr>tt��j�|||�Si}|jdd�}|r�x6|jj�D]%\}}|jd�sl|||<qlWt	|dd�}d}	x�|D]�}
t
|
d�s�q�t	|
d�}|	dkr�t|j�}	�j
|jB}x?|jj�D].\}}||kr||kr|||<qWxZ|
jj�D]I\}}||krsqXt|t�rX|jjsXt|j�||<qXWq�Wtt��j�|||��|jdt�}
|
�|��_d�_t�jj��j_�jjs?tjdd�jj���j_g}xv�jj�D]e\}}t|t�rU|jr�|r�td��qU|jr�||}}qU|j||f�qUWd	}|dkr|	r�|	|	j}}qt dd
�d}}nt|t!�rd}d
}|d	k	ru|j"�|�|�j_t|t �p`t#|j$��j_%|�j_&x$|D]\}}|j"�|�q|Wt
�d
�r�t'�d�fdd��d�j}d�j(i}t)|t*f|�}|�_*�jj+�t
�d�r'�j,�t-j.���S)NrZMetar_rsruZmodel_options_basez[^\w]+zprimary key is overdetermined.FTr`Z_composite_key�__unicode__r%csd�j|j�fS)Nz<%s: %r>)rCr")r?)rr>rArQbsz#BaseModel.__new__.<locals>.<lambda>z%sDoesNotExistrD�validate_model)/rFrCr�r!�__new__r�rr)r-r�r�rrs�inheritablerrOr�r�r�rrur�r�r�r�r�r�r�rrqryr�r0rrr�r�r�r�rrDr�rr�r#rr)rr��basesZattrsZmeta_optionsrGr
�vZmodel_pkZ	parent_pk�b�	base_metaZall_inheritableZModelOptionsBaser�r�Zpk_namer�r�Zexc_nameZ	exc_attrsZexception_class)r�)rrAr$s�
!	$	
	


zBaseModel.__new__cCst|j��S)N)r�r�)r?r>r>rAr�rszBaseModel.__iter__)rCrDrEr�r%r$r�r>r>)r�rAr!
s
`r!c@s�eZdZdd�Zedd��Zedd��Zeddd	��Zedd
d��Zedd
d��Z	edd��Z
edd��Zedd��Zedd��Z
edd��Zedd��Zedd��Zedd��Zedd ��Zed!d"d#��Zed$d%��Zed&d'��Zed(d)��Zed!d*d+��Zed,d-��Zed!d!d.d/��Zed!d!d0d1��Zed2d3��Zed4d5��Zd6d7�ZeZd8d9�ZeZ d:d;�Z!d<d=�Z"d>d?�Z#d@dA�Z$dBdC�Z%d!ddDdE�Z&dFdG�Z'e(dHdI��Z)d!dJdK�Z*d!d!dLdM�Z+dNdO�Z,dPdQ�Z-dRdS�Z.dS)Tr)cOs^|jj�|_t|j�|_i|_x*|j�D]\}}t|||�q:WdS)N)rurr�r�r�r�r)r)r?r�r�r
r'r>r>rAr�vs
	zModel.__init__cCs
t|�S)N)r)rr>r>rAr~szModel.aliascGs4t||�}|jjr0|j|jj�}|S)N)rxrurY)rr;rlr>r>rAr��szModel.selectNcs<|p	i}|j��fdd��D��t�|�S)Ncs*g|] }�jj|�|f�qSr>)rur�)r�rK)rr�r>rAr��s	z Model.update.<locals>.<listcomp>)r�rh)r�_Model__datar��fdictr>)rr�rAr��s#zModel.updatecs<|p	i}|j��fdd��D��t�|�S)Ncs*g|] }�jj|�|f�qSr>)rur�)r�rK)rrr>rAr��s	z Model.insert.<locals>.<listcomp>)r�rl)rr*rr+r>)rrrAr�s#zModel.insertTcCst|d|d|�S)Nrprq)rl)rrprqr>r>rAr{�szModel.insert_manycCst|d|d|�S)Nr�rl)rl)rr�rlr>r>rA�insert_from�szModel.insert_fromcCs
t|�S)N)r)rr>r>rAr��szModel.deletecGst|||�S)N)r*)rrKrLr>r>rArS�sz	Model.rawcKs*||�}|jdd�|j�|S)N�force_insertT)�saver�)rrlrr>r>rA�create�s
zModel.createcOsF|j�j�}|r'|j|�}|r<|j|�}|j�S)N)r�rJr�rOr�)rrlr��sqr>r>rAr��sz	Model.getcKsd|jdi�}|j�}x\|j�D]N\}}d|kr[|j||i�}q+|jt||�|k�}q+Wy|j�dfSWn�|jk
r_y]tdd�|j�D��}|j	|�|j
jj��|j
|�dfSWdQRXWnWtk
rZ}z7y|j�dfSWn|jk
rG|�YnXWYdd}~XnXYnXdS)NrvrFcss-|]#\}}d|kr||fVqdS)rNr>)r�r
r'r>r>rAr��s	z&Model.get_or_create.<locals>.<genexpr>T)r�r�r)rOr�r�r�rrr�rur�r�r/r")rr�rvrlr�rZrL�excr>r>rA�
get_or_create�s&"
zModel.get_or_createcKs�y1|jjj��|j|�dfSWdQRXWn|tk
r�g}xN|j�D]@\}}t||�}|js�|jrT|j	||k�qTW|j
|�dfSYnXdS)NTF)rur�r�r/r"r)r�r�rsryr�)rr�rlrrZr�r>r>rA�
create_or_get�s
zModel.create_or_getcOs|j�j||�S)N)r�rO)rZdqrlr>r>rArO�szModel.filtercCsAi}|jjr"|jj|d<|jj|jjj|�kS)Nr�)rur�r�r�r�)rr�r>r>rA�table_exists�szModel.table_existsFcCs�|r|j�rdS|jj}|jj}|jrn|dk	rn|jrn|j|j�sn|j|j�|j|�|j	�dS)NF)
r4rur�rsr�r�r�r�r��_create_indexes)rr�r~rr>r>rAr��s
zModel.create_tablecCsdg}xW|jjD]I}|jr%qt|j|jt|t�f�}|r|j|�qW|S)N)	rur	rsrbr�r�rOrry)rr�r�Zrequires_indexr>r>rA�_fields_to_index�s	zModel._fields_to_indexcCs/tjdd�|j�D�|jjp+f�S)NcSs"g|]}|f|jf�qSr>)r�)r�r�r>r>rAr�s	z%Model._index_data.<locals>.<listcomp>)�	itertools�chainr6rur�)rr>r>rA�_index_dataszModel._index_datacCs:x3|j�D]%\}}|jjj|||�q
WdS)N)r9rur�r�)r�
field_listr�r>r>rAr5szModel._create_indexescCs:x3|j�D]%\}}|jjj|||�q
WdS)N)r9rur�r�)rr�r:r�r>r>rA�
_drop_indexes
szModel._drop_indexescsg}�jjj�}�jj}�jjjrU|jrU|j|j|j��|j|j���x6�j	�D](}|j|j
�|g|j��qxW�jjrxO�jjD]A\}}�fdd�|D�}|j|j
�||��q�Wdd�|D�S)Ncs g|]}�jj|�qSr>)rur�)r�rK)rr>rAr�s	z Model.sqlall.<locals>.<listcomp>cSsg|]\}}|�qSr>r>)r�rKr_r>r>rAr� s	)
rur�r�rsr�r�ryr�r�r6r�r�r�)rZqueriesr�rr�rr�r�r>)rrA�sqlalls& zModel.sqlallcCs|jjj|||�dS)N)rur�r�)rr�r�r>r>rAr�"szModel.drop_tablecCs|jjj|||�dS)N)rur�r�)rr�r�r>r>rAr�&szModel.truncate_tablecCs5|jjr%t|jj|jj�St|jj�S)N)rur�rr�)rr>r>rAr�*szModel.as_entitycOst|||�S)N)rb)rr�r�r>r>rA�noop0sz
Model.noopcCst||jjj�S)N)r�rursr�)r?r>r>rAr4szModel._get_pk_valuecCs)|jjs%t||jjj|�dS)N)rur�rrsr�)r?rZr>r>rA�
_set_pk_value8szModel._set_pk_valuecCs|jj|j�kS)N)rursr)r?r>r>rA�_pk_expr=szModel._pk_exprcCs|jj�|j�dS)N)r��clearr�)r?r>r>rAr�@s
zModel._prepare_instancecCsdS)Nr>)r?r>r>rAr�DszModel.preparedcCs>i}x1|D])}|j|kr
||j||j<q
W|S)N)r�)r?rN�onlyZnew_datar�r>r>rA�
_prune_fieldsGs

zModel._prune_fieldscCs�x�|jjD]y}||jkoS||koS||dkoS|jj|�dk	}|r
t||t||��|j|||<q
WdS)N)rurr�r�r�rr�r�)r?rNr�Z
conditionsr>r>rA�_populate_unsaved_relationsNsz!Model._populate_unsaved_relationsc	Cs�t|j�}|jjdk	r<|jj}|j�}n
d}}|ra|j||�}n?|jjr�|r�|j||j�}|s�|jj	�dS|j
|�|dk	r-|r-|jjr�x7|jD]}|j
|d�q�Wn|j
|jd�|j|�j|j��j�}nb|dkrU|j|�j�d}n:|j|�j�}|dk	r||}|j|�d}|jj	�|S)NFr�)rr�rursrrBr�dirty_fieldsr�r@rCr�rr�r�r�r�r?r&rr>)	r?r-rArNZpk_fieldZpk_valueZpk_part_namerpZpk_from_cursorr>r>rAr.Ys>


'	

z
Model.savecCs
t|j�S)N)r�r�)r?r>r>rA�is_dirty~szModel.is_dirtycs�fdd��jjD�S)Ncs(g|]}|j�jkr|�qSr>)r�r�)r�rK)r?r>rAr��s	z&Model.dirty_fields.<locals>.<listcomp>)rur	)r?r>)r?rArD�szModel.dirty_fieldsccs=t|�}|j�j|j��}t|�|fg}t�}x�|r8|j�\}}||kroqH|j|�x�|jjj	�D]�\}}|j
}	|j|kr�||j|j
jk}
|	j�j|
�}n||>}
|	j�j|
�}|js|r&|j|	|f�|
|fVq�WqHWdS)N)r�r�r�r?r�r�rtrurvr)rxrr�r�r�r�ry)r?Zsearch_nullablerxrlr�r�klassZrel_namernrr
�subqueryr>r>rA�dependencies�s&		
	
zModel.dependenciescCs�|r�|j|�}xztt|��D]f\}}|j}|jru|ru|j|jdi�j|�j�q(|j	�j|�j�q(W|j	�j|j
��j�S)N)rHr�r�rxr�r�r�r�r&r�r?)r?Z	recursiveZdelete_nullablerHrlrnrzr>r>rA�delete_instance�s	(zModel.delete_instancecCst|j|j�f�S)N)r�r�r)r?r>r>rAr��szModel.__hash__cCs:|j|jko9|j�dk	o9|j�|j�kS)N)r�r)r?rr>r>rAr'�szModel.__eq__cCs||kS)Nr>)r?rr>r>rAr(�szModel.__ne__)/rCrDrEr�r4rr�r�rr{r,r�rSr/r�r2r3rOr4r�r6r9r5r;r<r�r�r�r=rZget_idr>Zset_idr?r�r�rBrCr.rEr�rDrHrIr�r'r(r>r>r>rAr)usb	

%cCs |j�}d|_|_|S)N)r�rwrx)rlr>r>rA�clean_prefetch_subquery�srJcsat|�g}xKt|�D]=\}}t|t�rF|\}}nd}t|t�rwt|t�rw|j�}|j�d}}x�t	t
|d��D]�}||}	|	j}
|	j��j
j�dd�}|r�fdd�|D�}�fdd�|D�}n�j
j�dd�}|s:|r�|�ksR|dkr�Pq�W|p`|s�|rsd|nd}
td	||
f��|r�t|
��ttj�fd
d�t||�D��}|j|�}|jt||d��q|rt|
��ttj�fdd�|D��}|j|�}|jt||d��qW|S)
Nr�rTcs"g|]}t�|j��qSr>)r�r�)r�rn)�subquery_modelr>rAr��s	z)prefetch_add_subquery.<locals>.<listcomp>cs%g|]}t�|jj��qSr>)r�r�r�)r�rn)�
last_modelr>rAr��s	z	 using %sr�z1Error: unable to find foreign key for query: %s%scs)g|]\}}|�j|�>�qSr>)r�)r�rnr)�cleanedr>rAr��s	Fcs&g|]}|j�j|�>�qSr>)r�r�)r�r)rMr>rAr��s	)�PrefetchResultrcrOrrrr)r�rxr�r�rlrzruryr�rJrNrrrr�ry)r0�
subqueries�
fixed_queriesr�rGZtarget_modelZfksrr�prefetch_resultZ
last_queryZrelsr�Ztgt_err�exprr>)rMrLrKrA�prefetch_add_subquery�sT	

						
rS�__prefetchedrlr�r�
rel_models�
field_to_namerzcsIeZdZddddd�fdd�Zdd�Zdd�Z�S)rNNcs�|rp|r5dd�|D�}dd�|D�}n&dd�|D�}dd�|D�}tt||��}|j}tt|�j|||||||�S)NcSsg|]}|j�qSr>)rx)r�r�r>r>rAr��s	z*PrefetchResult.__new__.<locals>.<listcomp>cSsg|]}|jj�qSr>)r�r�)r�r�r>r>rAr��s	cSsg|]}|j�qSr>)r)r�r�r>r>rAr��s	cSsg|]}|j�qSr>)r�)r�r�r>r>rAr��s	)r�rrxr�rNr$)rrlr�rrUrVrzZforeign_key_attrs)r�r>rAr$�s	zPrefetchResult.__new__c
Cs�|jr_x�|jD]E}|j|j}||f}||krt||j||�qWn�x�|jD]{\}}|j|jj}||f}|j|g�}d|j}x|D]}	t|	||�q�Wt|||�qiWdS)Nz%s_prefetch)	rr�r�r�rrVr�r�r
)
r?r	�id_mapr�Z
identifierr��attnameZ
rel_instancesrrrr>r>rA�populate_instance�s	

z PrefetchResult.populate_instancecCszxs|jD]h\}}|jj|j|�}||f}|jrQ|||<q
|j|g�||j|�q
WdS)N)rVr�r�r�rr�ry)r?r	rWr�rXr�r�r>r>rA�store_instance
s	
zPrefetchResult.store_instance)rCrDrEr$rYrZr>r>)r�rArN�s	
rNcGs|s
|St||�}i}i}x�t|�D]�}|j}|jrx2|jD]'}|j|g�||j|�qTWi||<||}t|j|��}	x\|j	D]Q}
|jr�|j
|
|�|	r�x)||D]}|j|
||j�q�Wq�Wq2W|j	S)N)rSr�rzr�rUr�ryr�r�rlrZrY)r0rOrPZdepsZrel_maprQZquery_modelrrWZ
has_relationsr	rr>r>rAr/s*		

	#cKs(x!t|�D]}|j|�q
WdS)z8Create tables for all given models (in the right order).N)rlr�)r}Zcreate_table_kwargsr�r>r>rAr�4sr�cKs.x'tt|��D]}|j|�qWdS)z6Drop tables for all given models (in the right order).N)r�rlr�)r}Zdrop_table_kwargsr�r>r>rAr�9sr�)�r�ror�r�r7�loggingrr�r^r�r�r�rZbisectrr�collectionsrrr�ImportErrorrr�r�	functoolsr�inspectr	�__version__�__all__r=�Handler�	getLoggerr��
addHandlerrF�objectrI�version_infoZPY2rar��builtinsrMrNrr�r�rTr�r�r�rar�r�r�r\�unicode�buffer�exec�RuntimeErrorrergZ	pysqlite2rhZpysq3r�r�Zpsycopg2cffiri�registerr�rjr�ZMySQLdbr�ZpymysqlZplayhouse._speedupsrkrlrmr�r�r�r�Zregister_adapterr�r�ZDATETIME_PARTSr�r�r�r�r�r�r�r�r�r&r%r�r'r�r(r�r&r5r[r3r4rZr�r�r�r�r�r�r�r�r�r�r�rr�r�r�r2rrrr6r3rrPrr!r-rbrrirjr<rrrmrnrwr�rr
r!rr4r0r�rrrr�rrr7rr;r�r�rrr8r9r
r�r�r�rrr!r+r�r�r�r�r�r�r�r�r�r�rr*r6rxrbrrrdrhrlrr�r�r�r�r�r rrr"r#r$r+r,r1r�r��localr�r�r5r.r*r�r�r:r�r�r�r�r�rrrrr�r!r)rJrSrTrNr/r�r�r>r>r>rA�<module>s�
	









	"
	

															

�%	+M{&	7"� ��{R#���0	�
(<'�	�;u�`'#!�h�?2+

Filemanager

Name Type Size Permission Actions
peewee.cpython-35.opt-1.pyc File 176.46 KB 0644
peewee.cpython-35.pyc File 176.53 KB 0644
pwiz.cpython-35.opt-1.pyc File 6.47 KB 0644
pwiz.cpython-35.pyc File 6.47 KB 0644