[ Avaa Bypassed ]




Upload:

Command:

hmhc3928@18.117.105.184: ~ $


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:%McCs&|s
dSt|t�}t||�S)N)rk�SQLITE_DATETIME_FORMATS�getattr)�lookup_type�datetime_string�dtr>r>rA�_sqlite_date_partsr�z%Yz%Y-%mz%Y-%m-%d %Hz%Y-%m-%d %H:%Mz%Y-%m-%d %H:%iz%Y-%m-%d %H:%i:%ScCs*|s
dSt|t�}|jt|�S)N)rkr��strftime�SQLITE_DATE_TRUNC_MAPPING)r�r�r�r>r>rA�_sqlite_date_trunc&sr�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?r�r>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__)rCrDrEr	r>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)rrrrr
)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)rr$r�r�)r?r r>r>rA�__ne__+szNode.__ne__cCst|tj|�S)N)rr$r�)r?r r>r>rA�in_=szNode.in_cCst|tj|�S)N)rr$r�)r?r r>r>rA�not_in?szNode.not_incCs,|rt|tjd�St|tjd�S)N)rr$r�r�)r?�is_nullr>r>rAr)AszNode.is_nullcCst|tjd|�S)Nz%%%s%%)rr$r�)r?r r>r>rA�containsEsz
Node.containscCst|tjd|�S)Nz%s%%)rr$r�)r?r r>r>rA�
startswithGszNode.startswithcCst|tjd|�S)Nz%%%s)rr$r�)r?r r>r>rA�endswithIsz
Node.endswithcCs%t|tjt|td�|��S)Nr�)rr$r�rr3)r?�low�highr>r>rAr�KszNode.betweencCst|tj|�S)N)rr$r�)r?�
expressionr>r>rAr�MszNode.regexpcCst|tj|�S)N)rr$r�)r?r r>r>rA�concatOszNode.concat)LrCrDrEr�rrP�
_node_typer��classmethodrrr�r�rrrrrrrr#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�r0r>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?rZrJ)r�r>rAr�Vs		zSQL.__init__cCst|j|j�S)N)r6rZrJ)r?r>r>rAr[szSQL.clone_base)rCrDrEr�r1r�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?rL)r�r>rAr�cszEntity.__init__cCs
t|j�S)N)rrL)r?r>r>rArgszEntity.clone_basecCsttd|j|f��S)N)r�filterrL)r?r�r>r>rAr�jszEntity.__getattr__)rCrDrEr�r1r�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�rNr�)r?r�rQ)r�r>rAr�rs		$z
Func.__init__TcCs
||_dS)N)rS)r?�coercer>r>rArTxszFunc.coercecCs%t|j|j�}|j|_|S)N)rNr�rQrS)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?rVrW�windowrIr>r>rA�over�sz	Func.overcs�fdd�}|S)Ncst�||�S)N)rN)r�r�)r�r>rA�dec�szFunc.__getattr__.<locals>.decr>)r?r�r[r>)r�rAr��szFunc.__getattr__)rOrP)
rCrDrEr�r1r�rRr�r�rTrrZr�r>r>)r�rArNms
rNcs=eZdZdZdZd�fdd�Zdd�Z�S)rz0A binary expression, e.g `foo + 1` or `bar < 7`.r/Fcs;tt|�j�||_||_||_||_dS)N)r�rr��lhsr"r �flat)r?r\r"r r])r�r>rAr��s
			zExpression.__init__cCst|j|j|j|j�S)N)rr\r"r r])r?r>r>rAr�szExpression.clone_base)rCrDrEr�r1r�rr>r>)r�rAr�srcs=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?rZr_)r�r>rAr��s		zParam.__init__cCst|j|j�S)N)r-rZr_)r?r>r>rAr�szParam.clone_base)rCrDrEr�r1r�rr>r>)r�rAr-�sc@seZdZdZdS)�Passthrough�passthroughN)rCrDrEr1r>r>r>rAr`�sr`csFeZdZdZdZdZdZ�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)rdrer�rr�r��nodes)r?rfr�)r�r>rAr��s

zClause.__init__cCs+t|j�}|j|_|j|_|S)N)rrfrdre)r?r�r>r>rAr�szClause.clone_base)	rCrDrEr�r1rdrer�rr>r>)r�rAr�sc@seZdZdZdZdS)�CommaClausez5One or more Node objects joined by commas, no parens.z, N)rCrDrEr�rdr>r>r>rArg�srgc@seZdZdZdZdS)�EnclosedClausezAOne or more Node objects joined by commas and enclosed in parens.TN)rCrDrEr�rer>r>r>rArh�srhcs@eZdZdd�fdd�Zdd�Zdd�Z�S)r<Ncs;tt|�j�||_||_|jp1d|_dS)N�w)r�r<r�rVrWr)r?rVrW)r�r>rAr��s		zWindow.__init__cCsrg}|jr4|jttd�t|j���|jrb|jttd�t|j���tt|��S)NzPARTITION BYzORDER BY)rVryrr6rgrWrh)r?Zover_clausesr>r>rArX�s						zWindow.__sql__cCst|j|j�S)N)r<rVrW)r?r>r>rAr�szWindow.clone_base)rCrDrEr�rXrr>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?rj)r�r>rAr��szDQ.__init__cCs
t|j�S)N)rrj)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�rkr�r)r?r)r�r>rAr��sz_StripParens.__init__)rCrDrEr1r�r>r>)r�rArk�srk�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�rpr��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�
ModelAliasrxrv)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)Nrmrnrorpr�rqr{rrrrsrt)rrorprO�onr
rrrNr6r�
FieldProxyr�ru�fieldsrz�to_fieldr�r\r�rl)
r?rorpZ
join_aliasrtZon_fieldryrrrqZtarget_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)	rCrDrErzr|rr��propertyr�r>r>r>rAru	s
1ruZ_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?rrr>r>rAr	]szFieldDescriptor.__get__cCs'||j|j<|jj|j�dS)N)r�r��_dirtyrt)r?rrZr>r>rA�__set__bszFieldDescriptor.__set__)rCrDrEr�r	r�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�choicesrq�sequence�constraints�schemar�_field_counter�_order�	_sort_key�	_is_boundr�r�)
r?r�r�r�r�r�r�r�r�rqr�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�rqr�r�r�)r�r�r�r�r�r�r�r�r�rqr�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_+rcTN)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>rArT�szField.coercecCs|dkr|S|j|�S)z5Convert the python value for storage in the database.N)rT)r?rZr>r>rA�db_value�szField.db_valuecCs|dkr|S|j|�S)z/Convert the database value to a pythonic value.N)rT)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�ryr6rqr�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�r1r�r�rr�r�r�r�r�rTr�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�rT)r?rTr�r�)r�r>rAr��szBareField.__init__cstt|�jd|j|�S)NrT)r�r
rrT)r?r�)r�r>rAr�szBareField.clone_base)rCrDrEr�r�rr>r>)r�rAr
�sc@seZdZdZeZdS)r!�intN)rCrDrEr�r�rTr>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)r0rqcs'd|d<tt|�j||�dS)NTrq)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>rAr�sz!_AutoPrimaryKeyField.add_to_class)rCrDrEr�r�r>r>)r�rAr��sr�c@seZdZdZeZdS)r�floatN)rCrDrEr�r�rTr>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>rArTHszCharField.coerce)rCrDrEr�r�rr�rTr>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>rArTWszTextField.coerceN)rCrDrEr�rTr>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�r�r�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�rTr>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)r�r�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_cacher�r�r�r�r)r?rZrel_idr�r>r>rA�get_object_or_idsz#RelationDescriptor.get_object_or_idNcCs |dk	r|j|�S|jS)N)r�r�)r?rrr>r>rAr	s
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)rOr�r�r�r�r�r�r�r�r�r�rt)r?rrZZ
orig_valuer>r>rAr� s
zRelationDescriptor.__set__)rCrDrEr�r�r�r	r�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?rrr>r>rAr	2s"z!ReverseRelationDescriptor.__get__)rCrDrEr�r�r	r>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�r�r�)r?rrr>r>rAr	>szObjectIdDescriptor.__get__cCst||j|�dS)N)rr�)r?rrZr>r>rAr�CszObjectIdDescriptor.__set__)rCrDrEr�r�r	r�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_namerrrr�r�r�)r�r>rAr�Gs						zForeignKeyField.__init__csOtt|�jd|jd|j�d|jd|jd|jd|j|�S)Nr�rrrrr�)	r�rrr��_get_related_namerrrr�)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>rAr	js
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)r�r�)r�)rxr�r?r>rAr�qs	z.ForeignKeyField.add_to_class.<locals>.callbackz%s_idZ_idz_+rcr?csC|jdd�jj�fd�jd��t||��dS)Nr�z%s.%s�backref�obj_id_name)r�rur�rr�)�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)rOr�r2r�rr�r�rxr�r�r�r�r�rur�r	rr�rr�rq�validate_backrefsr�rv�__dict__rr
rrr��rel)r?rxr�r�rr>)rxr�rr?rAr�osP		
	



	
	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�rT)r?rZr>r>rArT�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)rOr�r�r�)r?rZr>r>rAr��szForeignKeyField.python_value)rCrDrEr�rr
rrr	r�r�r�rTr�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)rr>rAr��s	z(CompositeKey.__get__.<locals>.<listcomp>)�tupler)r?rrr>)rrAr	�szCompositeKey.__get__cCsdS)Nr>)r?rrZr>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�r�r	r�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rc2@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��INTEGERrqr�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?r/r0�field_overrides�op_overridesr>r>rAr�Fs		zQueryCompiler.__init__cCsgd|jd|jd|jd|jd|jd|jd|jd|jd	|jd
|j	d|j
iS)Nr/r^rar�rbrKr�rI�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>rAr5Os										zQueryCompiler.get_parse_mapcCsd|j||jfS)Nz%s%s%s)r/)r?rVr>r>rA�quote`szQueryCompiler.quotecCs$||jkr|j|S|j�S)N)r2�upper)r?�fr>r>rAr�cszQueryCompiler.get_column_typecCs|j|S)N)r4)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)r0)r?rr(�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]rKr")
r?rr(rNr\Zlparamsr Zrparams�templaterIr>r>rAr<os	zQueryCompiler._parse_expressioncCs;|jr(|j|j|j�|d�S|j|jgfS)N)r_rPrZr0)r?rr(rNr>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)r_r�rPrZr0)r?rr(rNr>r>rAr=}s	zQueryCompiler._parse_paramcCsP|jr|pd}|j|j||�\}}d|jt|�f|fS)Nz%s(%s))rS�parse_node_listrQr�rm)r?rr(rNrIrJr>r>rAr?�szQueryCompiler._parse_funccCsG|j|j|||j�\}}|jr=dt|�}||fS)Nz(%s))rRrfrdrerm)r?rr(rNrIrJr>r>rAr@�s
	zQueryCompiler._parse_clausecCs"djt|j|j��gfS)Nr�)r�r�rGrL)r?rr(rNr>r>rArA�szQueryCompiler._parse_entitycCs|jt|j�fS)N)rZr�rJ)r?rr(rNr>r>rArC�szQueryCompiler._parse_sqlcCsV|r:dj|j||j�|j|j�f�}n|j|j�}|gfS)Nr�)r�rGrxr�)r?rr(rNrIr>r>rArB�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 r1r\�alias_map_classr!�generate_select�calculate_alias_mapr��compound_select_parenthesesr)r?rr(rNZcsqZfirst_qZsecond_qr!�new_map�firstZfirst_pr�Zsecond_pr�Zlp�rZrprIr>r>rArE�s($	!z*QueryCompiler._parse_compound_select_querycCs}|j�}|jsQ|r6t|t�r6|j}n|jjj}|f|_|j	||�\}}dt
|�|fS)Nz(%s))r��_explicit_selectionrOrr�rxrurq�_selectrTrm)r?rr(rNr�Zselect_fieldr�rJr>r>rArD�s	z!QueryCompiler._parse_select_querycCs.|j|j||�\}}t|�|fS)N)rPrrm)r?rr(rNrIrJr>r>rArF�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)Nr1Fz(%s)T)r�r6r7r_rOr�rr�rRr)r0rr�r�r�rr	rr}r�rrP�_parserO)r?rr(rNZ	node_typer�rIrJr�rZrK�_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�)rNr>rAr��s	z,QueryCompiler.parse_node.<locals>.<listcomp>zNOT %src�AScss|]}t|t�VqdS)N)rOr
)r��pr>r>rAr�sz+QueryCompiler.parse_node.<locals>.<genexpr>)
r\rOr
rrr�r�any�	enumeraterP)
r?rr(rNrIrJr�Zclean_paramsZ	clean_sql�idxr^ZcsqlZcparamsr>)rNrArP�s"	
		zQueryCompiler.parse_nodez, c
Cseg}g}xC|D];}|j|||�\}}	|j|�|j|	�qW|j|�|fS)N)rPryrr�)
r?rfr(rNrdrIrJrZnode_sqlZnode_paramsr>r>rArR
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)
rSr!rtrxru�table_alias�_joinsr'rOrpr
rr�)r?rjr(rWrmZ
joined_modelsZjoin_objr>r>rArUs
$z!QueryCompiler.calculate_alias_mapcCs|jt|�|�S)N)rPr)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�rtrprOr�rrNrrr�rr�rrror{r�r�r�rqr
ryr�r|�join_mapr6)r?�joinsrxr(rerrJ�currr�rorp�
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 DISTINCTTFrgz, �FROMZWINDOWcSs7g|]-}tt|j�td�|j���qS)r^)rr6rrX)r�rYr>r>rAr�zs	z1QueryCompiler.generate_select.<locals>.<listcomp>�WHEREzGROUP BYZHAVINGzORDER BYzLIMIT %sz	OFFSET %szFOR UPDATE NOWAITz
FOR UPDATE)TF)rxrur�rUrO�CompoundSelectrk�	_distinctr6rhrr[rdr�_fromryr�rrg�_windowsrmrd�_where�	_group_by�_having�	_order_by�_limit�_offset�	limit_max�_for_updaterf)r?rjr(rz�dbreZ
select_clauseZjoin_clauses�limit�
for_updateZno_waitZstmtr>r>rArT^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 %sZUPDATEZSETr_r�Fr]Troz, �	RETURNING)rxrSrtrur��_on_conflictr6r�rM�_updaterOr
r)r-r�ryrr$r�rgrtr�
_returningrrdrf)
r?rjrzr(�	statementrer�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�Tr_ZVALUESrr�z, )&rxrurSrtr��_upsertr��
upsert_sqlr�r6r��_query�_fieldsryr�rk�_rows�
_iter_rowsr��keysr�
attrgetterrOr
r)r-r�rhrrg�auto_increment�default_insert_clause�is_insert_returning�get_primary_key_fieldsr�rrdrf)r?rjrzrGr(r�rer�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 FROMroz, r)	rxr6r�rtrr�rrdrf)r?rjrzrer�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)	r6rhr�r�r�rryrr)r?r�r�r>r>rA�foreign_key_constraints				z$QueryCompiler.foreign_key_constraintcs�fdd�}|S)Ncs%t|��}|j|||��S)N)r�rP)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�r�r�rr6r�rrf)r?rxr�rkZ	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�rI)rGr>rAr�7s	z/QueryCompiler._create_table.<locals>.<listcomp>zPRIMARY KEY)ru�
composite_keyrqrryrr6rh�declared_fieldsr�rOrrr�r�r
r�)	r?rx�safer��columnsr�Zpk_colsr�rkr>)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�rIr>r>rAr�hs	z/QueryCompiler._create_index.<locals>.<listcomp>rgcSsg|]}|j��qSr>)r�)r�r�r>r>rAr�ns	)rur�r�rr6rr�rh)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�rIr>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�)YrCrDrEr1r$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�r3r%r�r�r�r�rhrrSr�r5rGr�rKrMrOr<r>r=r?r@rArCrBrErDrFr\rPrRrUrfrmrTr�rhr�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)�deleterI)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>rArO�s
zQueryResultWrapper.countcCs|jS)N)rO)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�rOr�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�rNrQrSrur�ryrN)r?r�rzrN�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)rN)r�r��col)r?r>rAr�	s	z8TuplesQueryResultWrapper.process_row.<locals>.<listcomp>)rra)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)rzrNr�_prepare_instance)r?r�rr�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)rN)r?r�rUr�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�rzrar�rOrr��_model_alias�field_instancer�rxrr�r
r
rrLryrt)	r?r�r}r�rr�rNr��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�rprnr{r�rqr�ry)r?r}r�ri�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)rar�r�r�r)r?r�r�Zcollected_modelsr�r�r�r�rNrZrr>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�rorp�KeyErrorrnr�r�r{r�rqr�r�rrrry)
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�rrr{rr�rsror�rpr�r�columns_to_compareraryr�r)r?r�r�r]r�r�rrZkey_to_columnsrbrx�col_namer~ZsourcesZjoined_model)r�r>rAr��	sH					'	(

z&AggregateQueryResultWrapper.initializecCs`i}xS|jj�D]B\}}g||<x)|D]!\}}||j||�q3WqW|S)N)r�r'ry)r?r�r}rxZcolumn_datarbrr>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)rr>rAr�
s	zHAggregateQueryResultWrapper.iterate.<locals>._get_pk.<locals>.<listcomp>)rur�rrqrr)rr>)rrA�_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�r�rpr�rrrsrr{r�r�)r?r�rZidentity_mapZ_constructedZprimary_instancer~rZ
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_ctxrdrt)r?rx)r�r>rAr�o
s			zQuery.__init__cCs&|j�\}}d|j||fS)Nz%s %s %s)rIrx)r?rIrJr>r>rAr#z
szQuery.__repr__cCs.t|�|j�}|j|_|j|�S)N)r�rxr��_clone_attributes)r?rjr>r>rAr�~
szQuery.clonecCs@|jdk	r!|jj�|_|j�|_|j|_|S)N)rtr��_clone_joinsrdr)r?rjr>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>)�dictrdr')r?r>r>rAr�
szQuery._clone_joinsNcCs>ttj|�}|dkr"|S|p.tj}|||�S)N)rNrr)r?�initialrZconjunctionZreducedr>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
ryrr}r�get_proxy_fieldsr	rr)rur�)r?r��accum�argr>r>rA�_model_shorthand�
s
zQuery._model_shorthandcGs|j|j|�|_dS)N)rrt)r?rr>r>rAr��
szQuery.wherecGs"|j|j|tj�|_dS)N)rrtr�or_)r?rr>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.)
rrOrvr	ru�
rel_existsrqr�r�rdr�ryru)r?rpr{r�roZrequire_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�)rrdr�rprr�)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�rOr�ryr)r?ZqdictrriZrelationshipr�rZrjr"�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��popleftrOrr\r rrjr�rrrryr�rrxr�r�r�rr�)r?r�r�Zdq_noderJZdq_joinsrjZsiderrjrir/r�rrr�r>r>rArM�
s>	#		+
	
		zQuery.filtercCs
|jj�S)N)r�r�)r?r>r>rAr�szQuery.compilercCs
t�dS)N)r�)r?r>r>rArIsz	Query.sqlcCs+|j�\}}|jj|||j�S)N)rIr��execute_sql�require_commit)r?rIrJr>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)�tuplesrXr#r�)r?Zas_tuple�convertr�r>r>rA�scalars
zQuery.scalar)rCrDrEr�r"r�r#r�rrrrr�r�rr�rrrrMr�rIr#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?rzrjrJ)r�r>rAr�s				zRawQuery.__init__cCs7t|j|j|j�}|j|_|j|_|S)N)r(rxr)r*r,r-)r?rjr>r>rAr�&szRawQuery.clone�joiningr�rTcCs
||_dS)N)r,)r?r%r>r>rAr%0szRawQuery.tuplescCs
||_dS)N)r-)r?�dictsr>r>rAr/4szRawQuery.dictscCs|j|jfS)N)r)r*)r?r>r>rArI8sz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%r/rIr$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r4cs�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)Zrvr:cs�tt|�j|�|jj|_|j|�d|_d|_d|_	d|_
d|_d|_d|_
d|_d|_d|_d|_d|_d|_d|_d|_dS)NF)FF)r�rvr�r��
commit_selectr"�_SelectQuery__selectrrrurvrwrsrxryrqr{�_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�rvrrZr�r[rrrOr
ryr�rurvrwrsrxryrqr{r7r,r-r8r)r?rjrI)r�r>rAris6		zSelectQuery._clone_attributescs�fdd�}|S)NcsD|jjjj}�|kr.td���t|j|�|�S)Nz!Your database does not support %s)rxrur��compound_operationsrqrp)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_rhrrW)r?r Zwrapped_rhsr>r>rAr9�s"zSelectQuery.__xor__cCstjd�||�S)Nz	UNION ALL)rv�_compound_op_static)r?r r>r>rA�	union_all�szSelectQuery.union_allcGs@t|�dk|_|p'|jjj}|j|�|_dS)Nr)r�rZrxrur�rr[)r?r9r>r>rAZ__select�szSelectQuery.__selectcGs|rt|�nd|_dS)N)r�rr)r?r�r>r>rAr?�szSelectQuery.from_cOs"|r|j|�nd|_dS)N)rru)r?r�r�r>r>rA�group_by�szSelectQuery.group_bycGs|j|j|�|_dS)N)rrv)r?rr>r>rA�having�szSelectQuery.havingcOs"t|jt|�|�|_dS)N)r4rwr�)r?r�r�r>r>rArW�szSelectQuery.order_bycOs"t|jt|�|�|_dS)N)r4rsr�)r?Zwindowsr�r>r>rArY�szSelectQuery.windowcCs
||_dS)N)rx)r?Zlimr>r>rAr}�szSelectQuery.limitcCs
||_dS)N)ry)r?Zoffr>r>rA�offset�szSelectQuery.offset�cCs0|dkr|d8}||_|||_dS)Nrr�)rxry)r?ZpageZpaginate_byr>r>rA�paginate�s
	zSelectQuery.paginateTcCs
||_dS)N)rq)r?Zis_distinctr>r>rA�distinct�szSelectQuery.distinctFcCs||f|_dS)N)r{)r?r~Znowaitr>r>rAr~�szSelectQuery.for_updatecCs
||_dS)N)r7)r?�naiver>r>rArH�szSelectQuery.naivecCs
||_dS)N)r,)r?r%r>r>rAr%�szSelectQuery.tuplescCs
||_dS)N)r-)r?r/r>r>rAr/�szSelectQuery.dictscCs
||_dS)N)r8)r?�aggregate_rowsr>r>rArI�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)NrOcSsg|]}|j��qSr>)r)r�rnr>r>rAr��s	z(SelectQuery.annotate.<locals>.<listcomp>)
r�Countrurqrrrrxr�rrur[r)r?r�Z
annotationrjr>r>rA�annotate�s	zSelectQuery.annotatecCs=|dkr!tjtd��}|j�}|g|_|S)Nr�)rrJr6rWr[)r?�aggregationrjr>r>rA�
_aggregate�s
zSelectQuery._aggregatecCs|j|�jd|�S)Nr&)rMr')r?rLr&r>r>rA�	aggregate�szSelectQuery.aggregatecCsJ|js$|js$|js$|jr4|jd|�S|jdd�pIdS)N�clear_limitr&Fr)rqrurxry�
wrapped_countrN)r?rOr>r>rArO�s$zSelectQuery.countcCsc|j�}|r"d|_|_|j�\}}d|}|jj||�}|j�pbdS)Nz+SELECT COUNT(1) FROM (%s) AS wrapped_selectr)rWrxryrIrx�rawr')r?rOr�rIrJ�wrappedZrqr>r>rArPs
zSelectQuery.wrapped_countcCs4|jdd�}td�g|_t|j��S)Nr��1)rFr6r[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)rFr�r$r�rxrrI)r?r�r>r>rAr�s
	zSelectQuery.getr�cCsN|j�}|j|�|jd|�}|rJ|dkrF|dS|SdS)Nr�r)r$r�r�)r?r�rUr}r>r>rA�peeks

zSelectQuery.peekcCs1|j|kr!||_d|_|jd|�S)NTr�)rxr�rU)r?r�r>r>rArXs		zSelectQuery.firstcCs|j�j|�S)N)r�rT)r?r>r>rArI%szSelectQuery.sqlcCst|j}xd|jD]Y}t|t�r;|j|kr;dSt|t�r|jdk	r|j|krdSqWdS)NFT)rxr[rOrr
r
)r?rxrr>r>rA�verify_naive(s	zSelectQuery.verify_naivecCs|j|jfS)N)r[rd)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�r0r1r-r2r7rdrVr3r8�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+rxrWrZr#)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?rZrUr�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__)4rCrDrEr1r�rr;rr@r4r3r6r9rAr6r�r�r?rBrCrWrYr}rDrFrGr~rHr%r/rIrrKrMrNrOrPrTr�rUrXrIrVrWrZr$r�r�r%r��PY3r�r>r>)r�rArvRsn

	
rvc@s4eZdZdd�Zdd�Zdd�ZdS)�NoopSelectQuerycCs|jj�ffS)N)r��get_noop_sql)r?r>r>rArIeszNoopSelectQuery.sqlcCsdS)N)NNr>)r?r>r>rArWhszNoopSelectQuery.get_query_metacCs|jjt�S)N)r�r0r1)r?r>r>rArZksz#NoopSelectQuery._get_result_wrapperN)rCrDrErIrWrZr>r>r>rAr`dsr`csveZdZdZddd�fdd�Z�fdd�Zddd	�Zd
d�Zdd
�Zdd�Z	�S)rpr;Ncs8||_||_||_tt|�j|g�dS)N)r\rr r�rpr�)r?rxr\rr )r�r>rAr�qs			zCompoundSelect.__init__cs@tt|�j|�}|j|_|j|_|j|_|S)N)r�rprr\rr )r?rj)r�r>rArws
z CompoundSelect._clone_attributesFcCs|jd|�S)NrO)rP)r?rOr>r>rArO~szCompoundSelect.countcCs
|jj�S)N)r\rW)r?r>r>rArW�szCompoundSelect.get_query_metacCs|jj�o|jj�S)N)r\rVr )r?r>r>rArV�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�r0r1r-r2r8rXr\rdr r7rVr3rY)r?Z	has_joinsZis_naiver>r>rArZ�s			!z"CompoundSelect._get_result_wrapper)
rCrDrEr1r�rrOrWrVrZr>r>)r�rArpnsrpcs�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�rbr�)r?rx)r�r>rAr��s
				z_WriteQuery.__init__csOtt|�j|�}|jrKt|j�|_|j|_|j|_|S)N)r�rbrr�r�r,r-)r?rj)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?r9r>r>rA�	returning�s
"z_WriteQuery.returningTcCs
||_dS)N)r,)r?r%r>r>rAr%�sz_WriteQuery.tuplescCs
||_dS)N)r-)r?r/r>r>rAr/�sz_WriteQuery.dictscCsQ|jdk	rA|jr(|jjt�S|jrA|jjt�S|jjt�S)N)r�r,r�r0r1r-r2r3)r?r>r>rAr0�s		z_WriteQuery.get_result_wrappercCsI|j�}|j|jgif}||j|j�|�|_|jS)N)r0r�rxr#r+)r?r[rGr>r>rA�_execute_with_result_wrapper�sz(_WriteQuery._execute_with_result_wrapper)rCrDrEr�rrcr�rdr%r/r0rer>r>)r�rArb�s		rbcs�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�rfr�)r?rxr�)r�r>rAr��s		zUpdateQuery.__init__cs:tt|�j|�}t|j�|_|j|_|S)N)r�rfrr
r�r�)r?rj)r�r>rAr�szUpdateQuery._clone_attributescCs
||_dS)N)r�)r?�actionr>r>rA�on_conflict�szUpdateQuery.on_conflictr.cCs|j�j|�S)N)r�r�)r?r>r>rArI�szUpdateQuery.sqlcCsX|jdk	r(|jdkr(|j�S|jdk	r>|jS|jj|j��SdS)N)r�r+rer��
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�rr�rhr�r�rIr$r�r�r>r>)r�rArf�srfcs�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�rjr�r��_is_multi_row_insert�_return_id_listr�r�r��_validate_fieldsr�)r?rxrL�rowsr�rj�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)rxrurmrp�
_default_dict�_default_callablesr�r�r�r�rt)
r?Z
model_metarq�defaultsZ	callablesr�Z	field_rowrr�r�r>)rprAr�
s,					
	

zInsertQuery._iter_rowscs|tt|�j|�}|j|_|j|_|j|_|j|_|j|_|j|_|j	|_	|j
|_
|S)N)r�rjrr�r�rkr�r�rlrmr�)r?rj)r�r>rAr(
szInsertQuery._clone_attributesr.zwhere clauseTcCs
||_dS)N)r�)r?�upsertr>r>rAru7
szInsertQuery.upsertcCs
||_dS)N)r�)r?rgr>r>rArh;
szInsertQuery.on_conflictcCs
||_dS)N)rl)r?�return_id_listr>r>rArv?
szInsertQuery.return_id_listcCs'|jjr#|js|jr#dSdS)NTF)r��insert_returningrkrl)r?r>r>rAr�C
szInsertQuery.is_insert_returningcCs|j�j|�S)N)r�r�)r?r>r>rArIJ
szInsertQuery.sqlcCsrg}d}|j}xH|jD]=}t|j|�j|j�j�}|r|j|�qW|rj|S|SdS)N)rlr�rjrxrur�r$ry)r?Zid_listZlast_idrvr�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)rkr�r�r��insert_manyrxr+rer#rwr�rxrurr�r��last_insert_idrlr�r�
itemgetter�fetchall)r?Zinsert_with_loopr�Zpk_rowrGZ
clean_datar>r>rAr$]
s0	


			zInsertQuery.execute)rCrDrEr�r�rr�r�r�r�rurhrvr�r�rIrxr$r>r>)r�rArj�s rjc@s4eZdZed�Zdd�Zdd�ZdS)�DeleteQueryr.cCs|j�j|�S)N)r�r�)r?r>r>rArI�
szDeleteQuery.sqlcCsX|jdk	r(|jdkr(|j�S|jdk	r>|jS|jj|j��SdS)N)r�r+rer�rir#)r?r>r>rAr$�
s

zDeleteQuery.executeN)rCrDrEr�r�rIr$r>r>r>rAr}}
sr}�
IndexMetadatar�rIr�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 ALLTr.Nr-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�r8r9)	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�r8)rr�r>r>rA�register_fields.szDatabase.register_fieldscCst|j|�|_dS)N)r�r9)rr�r>r>rA�register_ops2szDatabase.register_opscCs�|tkr|jrtStS|tkr-tS|tkrJ|jrFtStS|t	krg|jrct
StS|tkrwt
S|jr�tStSdS)N)r3r�r�r�rYr�r1r�r�r2r�r�rXr�)r?Zwrapper_typer>r>rAr06s



zDatabase.get_result_wrappercCs|jjr|jSdS)N)rur�Z	lastrowid)r?r�rzr>r>rArzHszDatabase.last_insert_idcCs|jS)N)Zrowcount)r?r�r>r>rAriLszDatabase.rows_affectedcCs"|j|j|j|j|j�S)N)�compiler_classr/r0r8r9)r?r>r>rAr�OszDatabase.compilercCs|j|j�j|��S)N)r!r�rP)r?rbr>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?rIrJr"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�rI)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�rI)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�rkr�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)Nrn)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>rAra�szDatabase.get_noop_sqlcCstS)N)r�)r?r>r>rAr��szDatabase.get_binary_type)^rCrDrEr5r)r�r:rV�distinct_on�drop_cascader8�foreign_keysr~�for_update_nowaitryrwr0rzr9r/�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�r2r�r�r0rzrir�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�rar�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�rkr>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�rjr�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�)rr�)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�r8r�r��sqlite_version_inforyrzr$r�r�r9r�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 PRECISIONrqZSERIALr�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)rurqr�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>rArz�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�rYr>r>rAr��s	z1PostgresqlDatabase.get_tables.<locals>.<listcomp>)r!r|)r?r�rjr>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;rYcsAg|]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�rjr�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�rjr�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�rjr�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�rIr�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�rUr>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>rAraszPostgresqlDatabase.get_noop_sqlcCstjS)N)r�r�)r?r>r>rAr�sz"PostgresqlDatabase.get_binary_type) rCrDrEr5rVr�r�r8r~r�rwr0r$r�r9r�r�r�r�r�r�r�rzr�r�r�r�r�r�r�rar�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��FLOATrqzINTEGER 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�rIr�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�rjr�r>)r�rAr�GszMySQLDatabase.get_foreign_keyscCs%tjtt|�td�|��S)Nrn)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))rrhrurqr6)r?rxr>r>rAr�Zsz#MySQLDatabase.default_insert_clausecCsdS)NzDO 0r>)r?r>r>rAra_szMySQLDatabase.get_noop_sqlcCstjS)N)r�r�)r?r>r>rAr�bszMySQLDatabase.get_binary_typell����)rCrDrEr5r:r8r~r0rzr$r�r�r�r9r/r�r�r�r�r�r�r�r�r�r�r�rar�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�r�r�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�rar}rrur�)r?r�r�rr�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�r�rr>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�r�rr>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�rG�
quoted_sid)r?r|r�Z	_compilerr>r>rAr��s	zsavepoint.__init__cCs|jj|dd�dS)Nr"F)r|r!)r?rjr>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�r�rr>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�r�r)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�rT)r?rZr>r>rArTszFieldProxy.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�rrTr�r�r�r>r>r>rAr�sr�c@s[eZdZdd�Zdd�Zdd�Zddd	�Zd
d�Zdd
�ZdS)r}cCs||jd<dS)Nrx)r)r?rxr>r>rAr�#szModelAlias.__init__cCs2t|j|�}t|t�r.t||�S|S)N)r�rxrOrr�)r?r�rr>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�rI)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)r
rvrurW)r?r9rjr>r>rAr�4szModelAlias.selectcKs
|j|�S)N)rx)r?r�r>r>rAr�<szModelAlias.__call__N)	rCrDrEr�r�r�r
r�r�r>r>r>rAr}"sr}c@sjeZdZdZdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)r��_keys�_itemscCsg|_g|_dS)N)rr	)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�rrrr	)r?�item�kr�r	r>r>rAr&Ms	z_SortedFieldList.__contains__cCs|jj|j�S)N)rr�r�)r?r�r>r>rAr�Ssz_SortedFieldList.indexcCsE|j}t|j|�}|jj||�|jj||�dS)N)r�rr�insertr	)r?r
rr�r>r>rArVs	z_SortedFieldList.insertcCs'|j|�}|j|=|j|=dS)N)r�r	r)r?r
rbr>r>rA�remove\s
z_SortedFieldList.removeN)rr	)rCrDrEr�r�r%r�r&r�rr
r>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�rt�_default_by_namerrrs�_default_callable_listr��_sorted_field_listr�sorted_field_namesr�rpr��default_databaser�r��
db_table_funcr�r�rWrqrcr�r�r�only_save_dirtyr�r�rrvr'rr��_additional_keys)r?rr�r�rr�rWrqrcr�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�)rWrOrrr�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�rIr>r>rAr��s	z4ModelOptions._update_field_lists.<locals>.<listcomp>cSs%g|]}t|t�s|�qSr>)rOr�)r�r�r>r>rAr��s	)r�rrrr�r�r�rwrqrpr�)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�rrrr�rtr
rsrryrrr)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�rr
rr�rtrsrarrrrr�)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�rqr)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
rrr�r�rry)	r?rzr��multiZis_fieldZis_noderr�Zis_matchr>r>rArw�szModelOptions.rel_for_modelcCs|jj|j||�S)N)rurwrx)r?rzr�rr>r>rArx�sz"ModelOptions.reverse_rel_for_modelcCs|j|�p|j|�S)N)rwrx)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�ryrurrwr�rv)r?�backrefsr}r�rzrlr>r>rA�related_models�s	
zModelOptions.related_models)rCrDrEr�r#r�rr�rrrr�rwrxrrr>r>r>rArhs 			(	rc
sUeZdZeddddddddd	g	�Z�fd
d�Zdd
�Z�S)�	BaseModelr�r�rr�rWrqr�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]rqruZmodel_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�rrq�inheritablerrOr�r�r�rrur�r�r�r�r�r�r�rrqryr�r0rr�r�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
`rc@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�rr%r>r>rAr�vs
	zModel.__init__cCs
t|�S)N)r})rr>r>rAr~szModel.aliascGs4t||�}|jjr0|j|jj�}|S)N)rvrurW)rr9rjr>r>rAr��szModel.selectNcs<|p	i}|j��fdd��D��t�|�S)Ncs*g|] }�jj|�|f�qSr>)rur�)r�rI)rr�r>rAr��s	z Model.update.<locals>.<listcomp>)r�rf)r�_Model__datar��fdictr>)rr�rAr��s#zModel.updatecs<|p	i}|j��fdd��D��t�|�S)Ncs*g|] }�jj|�|f�qSr>)rur�)r�rI)rrr>rAr��s	z Model.insert.<locals>.<listcomp>)r�rj)rr(rr)r>)rrrAr�s#zModel.insertTcCst|d|d|�S)Nrnro)rj)rrnror>r>rAry�szModel.insert_manycCst|d|d|�S)Nr�rj)rj)rr�rjr>r>rA�insert_from�szModel.insert_fromcCs
t|�S)N)r})rr>r>rAr��szModel.deletecGst|||�S)N)r()rrIrJr>r>rArQ�sz	Model.rawcKs*||�}|jdd�|j�|S)N�force_insertT)�saver�)rrjrr>r>rA�create�s
zModel.createcOsF|j�j�}|r'|j|�}|r<|j|�}|j�S)N)r�rHr�rMr�)rrjr��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)NrtrFcss-|]#\}}d|kr||fVqdS)rNr>)r�rr%r>r>rAr��s	z&Model.get_or_create.<locals>.<genexpr>T)r�r�r'rMr�r�r�rr
r�rur�r�r-r")rr�rtrjr�rZrJ�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�rqryr�)rr�rjrrZr�r>r>rA�
create_or_get�s
zModel.create_or_getcOs|j�j||�S)N)r�rM)rZdqrjr>r>rArM�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)
r2rur�rqr�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)	rurrqr`r�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�chainr4rur�)rr>r>rA�_index_dataszModel._index_datacCs:x3|j�D]%\}}|jjj|||�q
WdS)N)r7rur�r�)r�
field_listr�r>r>rAr3szModel._create_indexescCs:x3|j�D]%\}}|jjj|||�q
WdS)N)r7rur�r�)rr�r8r�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�rI)rr>rAr�s	z Model.sqlall.<locals>.<listcomp>cSsg|]\}}|�qSr>r>)r�rIr]r>r>rAr� s	)
rur�r�rqr�r�ryr�r�r4r�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)r`)rr�r�r>r>rA�noop0sz
Model.noopcCst||jjj�S)N)r�rurqr�)r?r>r>rAr4szModel._get_pk_valuecCs)|jjs%t||jjj|�dS)N)rur�rrqr�)r?rZr>r>rA�
_set_pk_value8szModel._set_pk_valuecCs|jj|j�kS)N)rurqr)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?rL�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?rLr�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�rurqrr@r�dirty_fieldsr�r>rAr�rr�r�r�r�r=r$rr<)	r?r+r?rLZpk_fieldZpk_valueZpk_part_namernZpk_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�rI)r?r>rAr��s	z&Model.dirty_fields.<locals>.<listcomp>)rur)r?r>)r?rArB�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'rxr�r�r�r�r�ry)r?Zsearch_nullablerxrjr�r�klassZrel_namerlr�r�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)rFr�r�rxr�r�r�r�r$r�r=)r?Z	recursiveZdelete_nullablerFrjrlrzr>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�r2rr�r�rryr*r�rQr-r�r0r1rMr2r�r4r7r3r9r:r�r�r�r;rZget_idr<Zset_idr=r�r�r@rAr,rCr�rBrFrGr�r%r&r>r>r>rAr)usb	

%cCs |j�}d|_|_|S)N)r�rurv)rjr>r>rA�clean_prefetch_subquery�srHcsat|�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�rl)�subquery_modelr>rAr��s	z)prefetch_add_subquery.<locals>.<listcomp>cs%g|]}t�|jj��qSr>)r�r�r�)r�rl)�
last_modelr>rAr��s	z	 using %sr�z1Error: unable to find foreign key for query: %s%scs)g|]\}}|�j|�>�qSr>)r�)r�rlr)�cleanedr>rAr��s	Fcs&g|]}|j�j|�>�qSr>)r�r�)r�r)rKr>rAr��s	)�PrefetchResultrarOrrrr)r�rxr�r�rjrzrurwr�rHrNrrrr�ry)r.�
subqueries�
fixed_queriesr�rEZtarget_modelZfksrr	�prefetch_resultZ
last_queryZrelsr�Ztgt_err�exprr>)rKrJrIrA�prefetch_add_subquery�sT	

						
rQ�__prefetchedrjr�r�
rel_models�
field_to_namerzcsIeZdZddddd�fdd�Zdd�Zdd�Z�S)rLNcs�|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�rLr")rrjr�rrSrTrzZforeign_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�rrTr�r�r)
r?r�id_mapr�Z
identifierr��attnameZ
rel_instancesrprr>r>rA�populate_instance�s	

z PrefetchResult.populate_instancecCszxs|jD]h\}}|jj|j|�}||f}|jrQ|||<q
|j|g�||j|�q
WdS)N)rTr�r�r�rr�ry)r?rrUr�rVr�r�r>r>rA�store_instance
s	
zPrefetchResult.store_instance)rCrDrEr"rWrXr>r>)r�rArL�s	
rLc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)rQr�rzr�rSr�ryr�r�rjrXrW)r.rMrNZdepsZrel_maprOZquery_modelr�rUZ
has_relationsrrr>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�r5�loggingrr�r^r�r�r�r�Zbisectrr�collectionsrrr�ImportErrorr
r�r�	functoolsr�inspectr	�__version__�__all__r=�Handler�	getLoggerr��
addHandlerrF�objectrI�version_infoZPY2r_r��builtinsrMrNr
r�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�ZDATETIME_LOOKUPSr�r�r�r�r�r�r�r$r%r�r'r�r(r�r&r3rYr1r2rXr�r�r�r�r�r�r�r�r�r�r�rr�r�r�r2rrr
r6r3rrNrrr-r`rrgrhr<rrrkrlrur�rr
r!rr4r0r�rrrr�rrr7rr;r�r�rrr8r9r
r�r�r�rrrr)r�r�r�r�r�r�r�r�r�r�rr(r4rvr`rprbrfrjr}r~rr�r�r�r rrr"r#r$r+r,r1r�r��localr�r�r5r.r*r�r�r:r�r�r�r�r�r}rrrr�rr)rHrQrRrLr/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