Viewing File: /opt/alt/python35/lib64/python3.5/site-packages/__pycache__/peewee.cpython-35.pyc



R6Wh@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@ejZYnXej dAZ!e!j"edBZ#e$dCdDZ%ej&ddEkZ'ej&ddFkZ(ej&ddEdEdGfkZ)e(rddl*Z*ddHlm+Z+ddIlm,Z,dJdKZ-e.Z/e0Z1e.Z2e3e*dLZ4dMdKZ5e6Z7ddNdOZ8n=e'rOe9Z/e2Z1e:Z5dPdQZ4e;dRne<dSe)rzdTdGZ=dUdKZ>ndVdKZ>yddWl?m@ZAWnek
rdZAYnXyddlBZBWnek
reAZBYnXeAoeAjCeBjCkreAZByddXlDmEZEeEjFWnek
r0YnXy ddlGZGddYlGmHZIWnek
rkdZGYnXyddlJZKWn=ek
ryddlLZKWnek
rdZKYnXYnXy4ddZlMmNZNdd[lMmOZOdd\lMmPZPWn9ek
r+dd]d^ZNd_d`ZOdadbZPYnXyDddclMmQZQdddlMmRZRddelMmSZSddflMmTZTWn$ek
rdZQZRZSZTYnXeBreBjUejVe.eBjUejWe.eBjUej
e.dgdhdidjdkdlgZXeYeXZZdmdndodpdqdrfZ[dsdtZ\dgdudhdvdidodjdwdkdxdldmiZ]e]jZ^dye^dk<dze^dl<d{d|Z_d}d~Z`GdddeZaeaddddddddddddddddddddddddddddddddddddddddddddddddddZbeaddddddddZcecjdZeecjfZgecjhZidZjdEZkdFZldZmdZndebjodebjpdebjqdebjrdebjsdebjtdebjudebjvdebjwdebjxdebjyiZzddZ{ddZ|ddZ}Gdd3d3e$Z~Gddde$ZGddde$ZGddde$ZGdd7d7eZeZGdddeZGdddeZedZGdddeZGdd.d.eZGdddeZGdddeZGdddeZGdddeZGdd=d=eZddZGdddeZGdddeZeddddddddddddfZGdddedddddfZGddde$ZGdddeZGdddeZGdd"d"eZGdddeZGdd5d5eZGdd1d1eZGdddeZGdddeZGdddeZGdddeZdddZGdddeZGdddeZGdd8d8eZGdd
d
eZGdd<d<eZdd	ZGd
ddeZGdddeZGd
ddeZGdd9d9eZGdd:d:eZGdddeZGdddeZGddde$ZGddde$ZGdd d eZGddde$ZGddde$ZGddde$ZGdddeZGdd d e$ZGd!d"d"e$ZGd#d$d$eZGd%d&d&eZeTdkr
eZTGd'd(d(eZeRdkr6
eZRGd)d*d*eZeQdkr^
eZQGd+d,d,eZed-d.dfZGd/d0d0eZGd1d2d2eZGd3d4d4eZd5d6ZGd7d8d8eZGd9d:d:eZGd;d<d<eZGd=d>d>eZGd?d@d@eZGdAdBdBeZGdCdDdDeZedEdFdGdHdIdJfZedKdFdLdMddJfZedNdOdPdQdJfZGdRdSdSeZGdTd!d!eZGdUddeZGdVddeZGdWd#d#eZGdXd$d$eZGdYd%d%eZGdZd,d,eZGd[d-d-eZGd\d2d2eZGd]d^d^e$ZGd_d`d`e$ZGdadbdbee	jZGdcdddde$ZGded6d6eZGdfd/d/eZGdgd+d+eZGdhdidie$ZGdjdkdkeZGdld;d;eZGdmdndneZGdodpdpeZGdqdrdreZGdsdtdteZGdudvdveZGdwdxdxe$ZeSdkr,Gdydzdze$ZSGd{ddeZeBrWed|ZndZGd}d~d~e$ZGdddeZGdd*d*e%eZddZddZedddddddfZGdddeZdd0ZddZddZdS(N)bisect_left)bisect_right)deque)
namedtuple)OrderedDict)deepcopy)wraps)isclassz2.8.3	BareFieldBigIntegerField	BlobFieldBooleanField	CharFieldCheckClauseCompositeKey
DatabaseError	DataError	DateField
DateTimeFieldDecimalFieldDeferredRelationDoesNotExistDoubleFieldDQFieldFixedCharField
FloatFieldfnForeignKeyFieldImproperlyConfiguredIntegerFieldIntegrityErrorInterfaceError
InternalErrorJOIN	JOIN_FULL
JOIN_INNERJOIN_LEFT_OUTERModel
MySQLDatabaseNotSupportedErrorOperationalErrorParamPostgresqlDatabaseprefetchPrimaryKeyFieldProgrammingErrorProxyRSmallIntegerFieldSqliteDatabaseSQL	TextField	TimeFieldTimestampFieldUsing	UUIDFieldWindow)NullHandlerc@seZdZddZdS)r=cCsdS)N)selfrecordr>r>
/peewee.pyemitiszNullHandler.emitN)__name__
__module____qualname__rBr>r>r>rAr=hsr=ZpeeweeZ_metaclass_helper_cCs|t|fiS)N)_METACLASS_)metabaser>r>rAwith_metaclassssrI)Callable)reducecCs
t|tS)N)
isinstancerM)cr>r>rA<lambda>}srQprintcCst|jdS)Nraw_unicode_escape)bytesencode)sr>r>rArQscCs(|j|k	r|j||dS)N)
__traceback__with_traceback)tpvaluetbr>r>rAreraisesr\cCs$tjj|tjjddS)N
)sysstdoutwrite)rVr>r>rAprint_sraz4def reraise(tp, value, tb=None): raise tp, value, tbzUnsupported python version.
cCs)|jd|j|jddttS)Ngi)microsecondsZsecondsZdays_M)tr>r>rArQscCs
|jS)N)
total_seconds)rfr>r>rArQs)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>rArQsz"format_date_time.<locals>.<lambda>)datetimestrptime
ValueError)rZformatsZpost_processfmtr>r>rArks

	rkcsttgfdddd}x*td|ddD]}|q[WttS)z@Sort models topologically so that parents will precede children.cs`|kr\|kr\j|x'|jjjD]}|jq8Wj|dS)N)add_metareverse_relvaluesmodel_classappend)modelforeign_key)dfsmodelsorderingseenr>rAr|s

z&sort_models_topologically.<locals>.dfscSs|jj|jjfS)N)runamedb_table)mr>r>rArQsz+sort_models_topologically.<locals>.<lambda>keyreverseT)setsortedlistreversed)r}namesrr>)r|r}r~rrArls	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}||krPqW||8}|dkr?|||S|S)Nr())lenrange)rVctilZ
unbalanced_ctZrequiredr>r>rArms6
$






rm)_DictQueryResultWrapper)_ModelQueryResultWrapper)_SortedFieldList)_TuplesQueryResultWrapperyearmonthdayhourminutesecondz%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_LOOKUPSAssertionErrorrkSQLITE_DATETIME_FORMATSgetattr)lookup_typedatetime_stringdtr>r>rA_sqlite_date_parts
rz%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_MAPPINGrrkrstrftime)rrrr>r>rA_sqlite_date_trunc&s
rcCstj||tjdk	S)N)researchI)ZregexrZr>r>rA_sqlite_regexp-src@seZdZddZdS)attrdictcCs||S)Nr>)r?attrr>r>rA__getattr__1szattrdict.__getattr__N)rCrDrErr>r>r>rAr0srANDandORorADD+SUB-MUL*DIV/BIN_AND&BIN_OR|XOR^MOD%EQ=LT<LTEz<=GT>GTEz>=NEz!=INinNOT_INznot inISisIS_NOTzis notLIKEZlikeILIKEZilikeBETWEENbetweenREGEXPregexpCONCATz||INNER
LEFT_OUTERz
LEFT OUTERRIGHT_OUTERzRIGHT OUTERFULLreqltZltegtZgtenecCs|j}|j||S)N)copyupdate)sourceZ	overridesZmergedr>r>rA
merge_dictrs
rcsfdd}|_|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?argskwargsr)funcr>rAinner}szreturns_clone.<locals>.inner)Z
call_local)rrr>)rrA
returns_clonews	rcsfdd}|S)zu
    Method decorator to indicate a method is not allowed to be called.  Will
    raise a `NotImplementedError`.
    cs#tdt|jfdS)Nz!%s is not allowed on %s instances)NotImplementedErrortyperC)r?rr)rr>rArsznot_allowed.<locals>.innerr>)rrr>)rrAnot_allowedsrcsdeZdZdZddgZddZddZdd	Zd
dZfdd
Z	S)r2zg
    Proxy class useful for situations when you wish to defer the initialization
    of an object.
    obj
_callbackscCsg|_|jddS)N)r
initialize)r?r>r>rA__init__s	zProxy.__init__cCs+||_x|jD]}||qWdS)N)rr)r?rcallbackr>r>rArs	zProxy.initializecCs|jj||S)N)rry)r?rr>r>rAattach_callbackszProxy.attach_callbackcCs+|jdkrtdt|j|S)NzCannot use uninitialized Proxy.)rAttributeErrorr)r?rr>r>rArszProxy.__getattr__cs4||jkrtdtt|j||S)NzCannot set attribute on proxy.)	__slots__rsuperr2__setattr__)r?rrZ)	__class__r>rArszProxy.__setattr__)
rCrDrE__doc__rrrrrrr>r>)rrAr2sc@sReZdZeZdddZddZddZedd	Z	dS)
rNcCs/|dk	r+|j|_|jj|dS)N)lower_rel_model_name_unresolvedrt)r?Zrel_model_namer>r>rArszDeferredRelation.__init__cCs||_||_||_dS)N)rxfieldr)r?rxrrr>r>rA	set_fields		zDeferredRelation.set_fieldcCs)||j_|jj|j|jdS)N)r	rel_modeladd_to_classrxr)r?rr>r>rA	set_modelszDeferredRelation.set_modelcCsYttj}xC|D];}|j|jjkr|j|tjj|qWdS)N)rrrrrCrrdiscard)Z	model_clsZ
unresolvedZdrr>r>rAresolves


zDeferredRelation.resolve)
rCrDrErrrrrstaticmethodrr>r>r>rArs
	c@seZdZdddZdS)_CDescriptorNcCs|dk	rt|jS|S)N)Entity_alias)r?instance
instance_typer>r>rA__get__s
z_CDescriptor.__get__)rCrDrErr>r>r>rArsrc@seZdZdZeZdZddZeddddZ	d	d
Z
ddZed
dZ
edddZeddZeddZeddZddZddZdddZeejZeejZeejZeejZeejZeej Z!Z"eej#Z$eejddZ%eejddZ&eejddZ'eej ddZ(Z)eejddZ*eejddZ+eej#ddZ,dd Z-d!d"Z.eej/Z0eej1Z2eej3Z4eej5Z6eej7Z8eej9Z:eej;Z<eej=Z>eej?Z@eejAZBd#d$ZCd%d&ZDdd'd(ZEd)d*ZFd+d,ZGd-d.ZHd/d0ZId1d2ZJd3d4ZKdS)5Nodez=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>rArs			z
Node.__init__NFcsfdd}|S)Ncs5p|j}r!t|}t|||S)N)rCrsetattr)methodZmethod_name)rclsrr>rA	decorators
zNode.extend.<locals>.decoratorr>)rrrrr>)rrrrAextendszNode.extendcCs
t|S)N)r)r?r>r>rA
clone_baseszNode.clone_basecCs@|j}|j|_|j|_|j|_|j|_|S)N)rrrrr)r?instr>r>rArsz
Node.clonecCs|j|_dS)N)r)r?r>r>rA
__invert__szNode.__invert__cCs
||_dS)N)r)r?ar>r>rAaliassz
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>rAbind_toszNode.bind_tocCs
d|_dS)NZASC)r)r?r>r>rAascszNode.asccCs
d|_dS)NDESC)r)r?r>r>rAdescsz	Node.desccCs
|jS)N)r)r?r>r>rA__pos__szNode.__pos__cCs
|jS)N)r)r?r>r>rA__neg__
szNode.__neg__csfdd}|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)invopr>rArszNode._e.<locals>.innerr>)r$r#rr>)r#r$rA_e
szNode._er#TcCs2|dkrt|tjdSt|tj|S)N)r!OPrr)r?r"r>r>rA__eq__'szNode.__eq__cCs2|dkrt|tjdSt|tj|S)N)r!r&rr)r?r"r>r>rA__ne__+szNode.__ne__cCst|tj|S)N)r!r&r)r?r"r>r>rAin_=szNode.in_cCst|tj|S)N)r!r&r)r?r"r>r>rAnot_in?szNode.not_incCs,|rt|tjdSt|tjdS)N)r!r&rr)r?is_nullr>r>rAr+AszNode.is_nullcCst|tjd|S)Nz%%%s%%)r!r&r)r?r"r>r>rAcontainsEsz
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>rAendswithIsz
Node.endswithcCs%t|tjt|td|S)Nr)r!r&rrr3)r?lowhighr>r>rArKszNode.betweencCst|tj|S)N)r!r&r)r?
expressionr>r>rArMszNode.regexpcCst|tj|S)N)r!r&r)r?r"r>r>rAconcatOszNode.concat)LrCrDrErrrP
_node_typerclassmethodrrrrrrrrrrr r%r&r__and__r__or__r__add__r__sub__r__mul__rZ__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__rZbin_andrZbin_orr)r*r+r,r-r.rrr2r>r>r>rArsh			
rcs:eZdZdZdZfddZddZS)r6z2An unescaped SQL string, with optional parameters.sqlcs)||_||_tt|jdS)N)rZparamsrr6r)r?rZrL)rr>rArVs		zSQL.__init__cCst|j|jS)N)r6rZrL)r?r>r>rAr[szSQL.clone_base)rCrDrErr3rrr>r>)rrAr6RscsFeZdZdZdZfddZddZddZS)	rz/A quoted-name or entity, e.g. "table"."column".entitycs tt|j||_dS)N)rrrpath)r?rN)rr>rArcszEntity.__init__cCs
t|jS)N)rrN)r?r>r>rArgszEntity.clone_basecCsttd|j|fS)N)rfilterrN)r?rr>r>rArjszEntity.__getattr__)rCrDrErr3rrrr>r>)rrAr_s
rcs|eZdZdZdZedZfddZeddd	Z	d
dZ
dddd
dZddZS)FunczAn arbitrary SQL function call.rcountsumcsM||_||_|r-|j|jknd|_tt|jdS)NF)r	argumentsr
_no_coerce_coercerrPr)r?rrS)rr>rArrs		$z
Func.__init__TcCs
||_dS)N)rU)r?coercer>r>rArVxszFunc.coercecCs%t|j|j}|j|_|S)N)rPrrSrU)r?resr>r>rAr|szFunc.clone_baseNcCspt|tr!|dkr!|}|dkrKtd|d|j}nt|j}t|td|S)Npartition_byorder_byZOVER)rOr<__sql__r6rr)r?rXrYwindowrKr>r>rAoversz	Func.overcsfdd}|S)Ncst||S)N)rP)rr)rr>rAdecszFunc.__getattr__.<locals>.decr>)r?rr]r>)rrArszFunc.__getattr__)rQrR)
rCrDrErr3rrTrrrVrr\rr>r>)rrArPms
rPcs=eZdZdZdZdfddZddZS)r!z0A binary expression, e.g `foo + 1` or `bar < 7`.r1Fcs;tt|j||_||_||_||_dS)N)rr!rlhsr$r"flat)r?r^r$r"r_)rr>rArs
			zExpression.__init__cCst|j|j|j|jS)N)r!r^r$r"r_)r?r>r>rArszExpression.clone_base)rCrDrErr3rrr>r>)rrAr!sr!cs=eZdZdZdZdfddZddZS)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|jdS)N)rZadaptrr-r)r?rZra)rr>rArs		zParam.__init__cCst|j|jS)N)r-rZra)r?r>r>rArszParam.clone_base)rCrDrErr3rrr>r>)rrAr-sc@seZdZdZdS)PassthroughpassthroughN)rCrDrEr3r>r>r>rArbsrbcsFeZdZdZdZdZdZfddZddZS)	rz8A SQL clause, one or more Node objects joined by spaces.clause FcsXd|kr|d|_d|kr2|d|_tt|jt||_dS)Nglueparens)rfrgrrrrnodes)r?rhr)rr>rArs

zClause.__init__cCs+t|j}|j|_|j|_|S)N)rrhrfrg)r?rr>r>rArszClause.clone_base)	rCrDrErr3rfrgrrr>r>)rrArsc@seZdZdZdZdS)CommaClausez5One or more Node objects joined by commas, no parens.z, N)rCrDrErrfr>r>r>rArisric@seZdZdZdZdS)EnclosedClausezAOne or more Node objects joined by commas and enclosed in parens.TN)rCrDrErrgr>r>r>rArjsrjcs@eZdZddfddZddZddZS)r<Ncs;tt|j||_||_|jp1d|_dS)Nw)rr<rrXrYr)r?rXrY)rr>rArs		zWindow.__init__cCsrg}|jr4|jttdt|j|jrb|jttdt|jtt|S)NzPARTITION BYzORDER BY)rXryrr6rirYrj)r?Zover_clausesr>r>rArZs						zWindow.__sql__cCst|j|jS)N)r<rXrY)r?r>r>rArszWindow.clone_base)rCrDrErrZrr>r>)rrAr<scCstd|S)Nz
CHECK (%s))r6)rZr>r>rArscs4eZdZdZfddZddZS)rz:A "django-style" filter expression, e.g. {'foo__eq': 'x'}.cs tt|j||_dS)N)rrrquery)r?rl)rr>rArszDQ.__init__cCs
t|jS)N)rrl)r?r>r>rArsz
DQ.clone_base)rCrDrErrrr>r>)rrArscs(eZdZdZfddZS)_StripParensrmcs tt|j||_dS)N)rrmrr
)r?r
)rr>rArsz_StripParens.__init__)rCrDrEr3rr>r>)rrArmsrmJoinMetadata	src_model
dest_modelsrcdestrprimary_keyr{
is_backrefris_self_join
is_expressionc@sUeZdZdddZddZddZdd	Zed
dZdS)JoinNcCs|t|tst|tr"dS|jj||}|dk	rM|dfS|jj||}|dk	rx|dfSdS)NFT)NN)NN)rOSelectQueryru
rel_for_modelreverse_rel_for_model)r?rrrrfk_fieldrvr>r>rAget_foreign_key
s

zJoin.get_foreign_keycCs|jptjS)N)	join_typer%r)r?r>r>rA
get_join_typeszJoin.get_join_typecCs0t|tr|jSt|tr,|jS|S)N)rO
ModelAliasrxrx)r?model_or_aliasr>r>rAmodel_from_aliass
zJoin.model_from_aliasc
Cs|j|j}|j|j}t|jtrB|jjpEd}t|jttt	f}t|jt
tfr|jpd}|r|}|j|j
jk}nQ|j|||j\}}|dkr|jdk	r|j||\}}|dk	r|j}nd}|s|dk	rP|rD|j
j}	q|j}	qy|jjj}	Wqtk
r|j
j}	YqXnd}	td|d|d|jd|jd|p|	d|d|d|d	|d
||kd|S)Nrorprqrrrrsr{rtrrurv)rrqrrrOonrrr!rPr6r
FieldProxyrrufieldsr|to_fieldrr^rrn)
r?rqrrZ
join_aliasrvZon_fieldr{rtrsZtarget_attrr>r>rA_join_metadatasH$'
		zJoin._join_metadatacCs%t|ds|j|_|jS)N_cached_metadata)hasattrrr)r?r>r>rAmetadataPsz
Join.metadata)	rCrDrEr|r~rrpropertyrr>r>r>rArw	s
1rwZ_Joinr}rc@s7eZdZddZdddZddZdS)FieldDescriptorcCs||_|jj|_dS)N)rratt_name)r?rr>r>rArYs	zFieldDescriptor.__init__NcCs&|dk	r|jj|jS|jS)N)_datagetrr)r?r	r
r>r>rAr]szFieldDescriptor.__get__cCs'||j|j<|jj|jdS)N)rr_dirtyrt)r?r	rZr>r>rA__set__bszFieldDescriptor.__set__)rCrDrErrrr>r>r>rArVsrcseZdZdZdZdZdZdZddddddddddddfddZd	d
Z	ddZ
d
dZddZddZ
ddZddZddZddZdddZddZdd Zd!d"ZS)#rzA column on a table.rrunknownFNc

s||_||_||_||_||_||_||_||_|	|_|
|_	||_
||_tj
d7_
tj
|_|jrdpd|jf|_d|_tt|jdS)NrrJF)nullindexuniqueverbose_name	help_text	db_columndefaultchoicesrssequenceconstraintsschemar_field_counter_order	_sort_key	_is_boundrr)
r?rrrrrrrrrsrrr)rr>rArms"												!	zField.__init__cKst|d|jd|jd|jd|jd|jd|jd|jd|jd	|j	d
|j
d|jd|j|}|j
r|j|_|j|_|j
|_
|S)
Nrrrrrrrrrsrrr)rrrrrrrrrrsrrrrrrx)r?rrr>r>rArs&													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)rrxrrrsubtitleru	add_fieldrrr)r?rxrr>r>rArs			zField.add_to_classcCs
|jjjS)N)rxrudatabase)r?r>r>rAget_databaseszField.get_databasecCs%|j}|jjj|S)N)get_db_fieldrcompilerget_column_type)r?Z
field_typer>r>rArszField.get_column_typecCs|jS)N)db_field)r?r>r>rArszField.get_db_fieldcCsdS)Nr>)r?r>r>rA
get_modifiersszField.get_modifierscCs|S)Nr>)r?rZr>r>rArVszField.coercecCs|dkr|S|j|S)z5Convert the python value for storage in the database.N)rV)r?rZr>r>rAdb_valueszField.db_valuecCs|dkr|S|j|S)z/Convert the database value to a pythonic value.N)rV)r?rZr>r>rApython_valueszField.python_valuecCs,|rt|jjj|jSt|jS)N)rrxrurr)r?
with_tabler>r>rA	as_entityszField.as_entitycCsB|j}|r8td|djtt|fSt|S)z2Return the column type, e.g. VARCHAR(255) or REAL.z%s(%s)z, )rr6joinmapstr)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'))	rrrryr6rsrrr)r?rddlr>r>rA__ddl__s				z
Field.__ddl__cCst|jd|jjS)N.)hashrrxrC)r?r>r>rA__hash__szField.__hash__)rCrDrErrrr3rrrrrrrrrVrrrrrrr>r>)rrArfs,		
cs=eZdZdZdfddZfddZS)r
bareNcs2tt|j|||dk	r.||_dS)N)rr
rrV)r?rVrr)rr>rArszBareField.__init__cstt|jd|j|S)NrV)rr
rrV)r?r)rr>rArszBareField.clone_base)rCrDrErrrr>r>)rrAr
sc@seZdZdZeZdS)r!intN)rCrDrErrrVr>r>r>rAr!sc@seZdZdZdS)rbigintN)rCrDrErr>r>r>rArsc@seZdZdZdS)r4smallintN)rCrDrErr>r>r>rAr4scs(eZdZdZfddZS)r0rscs'd|d<tt|j||dS)NTrs)rr0r)r?rr)rr>rArs
zPrimaryKeyField.__init__)rCrDrErrr>r>)rrAr0scs(eZdZdZfddZS)_AutoPrimaryKeyFieldNcsH||jkr+tdt||ftt|j||dS)Nz%s must be named `%s`.)_column_namerqrrrr)r?rxr)rr>rArsz!_AutoPrimaryKeyField.add_to_class)rCrDrErrr>r>)rrArsrc@seZdZdZeZdS)rfloatN)rCrDrErrrVr>r>r>rArsc@seZdZdZdS)rdoubleN)rCrDrErr>r>r>rAr	scsjeZdZdZddddfddZfdd	Zd
dZdd
ZddZS)rdecimalrbrFNcsM||_||_||_|p*tjj|_tt|j||dS)N)	
max_digitsdecimal_places
auto_roundrDefaultContextroundingrrr)r?rrrrrr)rr>rArs
			zDecimalField.__init__c
s:tt|jd|jd|jd|jd|j|S)Nrrrr)rrrrrrr)r?r)rr>rArs			zDecimalField.clone_basecCs|j|jgS)N)rr)r?r>r>rArszDecimalField.get_modifierscCsrtj}|s)|dkr|S|dS|jrn|d|j}|j}|t|j|d|S|S)Nrrbr)rDecimalrrrrZquantize)r?rZDexprr>r>rAr"s			zDecimalField.db_valuecCs9|dk	r5t|tjr"|Stjt|SdS)N)rOrrr)r?rZr>r>rAr,szDecimalField.python_value)	rCrDrErrrrrrr>r>)rrArs	
zutf-8cCs9t|tr|St|tr/|j|St|S)N)rOunicode_typestring_typedecode)rVencodingr>r>rAcoerce_to_unicode2s

rcsUeZdZdZdfddZfddZddZd	d
ZS)rstringcs&||_tt|j||dS)N)
max_lengthrrr)r?rrr)rr>rAr<s	zCharField.__init__cstt|jd|j|S)Nr)rrrr)r?r)rr>rAr@szCharField.clone_basecCs|jr|jgpdS)N)r)r?r>r>rArEszCharField.get_modifierscCst|pdS)N)r)r?rZr>r>rArVHszCharField.coerce)rCrDrErrrrrVr>r>)rrAr9s
cs(eZdZdZfddZS)r
fixed_charcs.tt|j|}|r*|j}|S)N)rrrstrip)r?rZ)rr>rArNszFixedCharField.python_value)rCrDrErrr>r>)rrArKsc@s"eZdZdZddZdS)r7textcCst|pdS)Nr)r)r?rZr>r>rArVWszTextField.coerceN)rCrDrErrVr>r>r>rAr7TscsFeZdZdZeZfddZddZddZS)rblobcsDt|jjtr+|jjj|jtt|j||S)N)	rOrurr2r_set_constructorrrr)r?rxr)rr>rAr^szBlobField.add_to_classcCs|j|_dS)N)get_binary_type_constructor)r?rr>r>rArcszBlobField._set_constructorcCs>t|tr|jd}t|tr:|j|S|S)NrS)rOrrU
basestringr)r?rZr>r>rArfs

zBlobField.db_value)	rCrDrErbinary_constructrrrrr>r>)rrArZs
c@s.eZdZdZddZddZdS)r;uuidc	Cs@t|tjr|jSytj|jSWn|SYnXdS)N)rOrUUIDhex)r?rZr>r>rArpszUUIDField.db_valuecCs3t|tjr|S|dkr&dStj|S)N)rOrr)r?rZr>r>rArxszUUIDField.python_valueN)rCrDrErrrr>r>r>rAr;mscsfdd}|S)Ncs|jjjj|S)N)rxrurextract_date)r?)	date_partr>rAr]~sz_date_part.<locals>.decr>)rr]r>)rrA
_date_part}srcs=eZdZdZdfddZfddZS)_BaseFormattedFieldNcs2|dk	r||_tt|j||dS)N)rrrrr)r?rrrr)rr>rArs	z_BaseFormattedField.__init__cstt|jd|j|S)Nrr)rrrrr)r?r)rr>rArsz_BaseFormattedField.clone_base)rCrDrErrrrr>r>)rrArsrc@seZdZdZdddgZddZeedZeedZ	eed	Z
eed
ZeedZeedZ
d
S)rroz%Y-%m-%d %H:%M:%S.%fz%Y-%m-%d %H:%M:%Sz%Y-%m-%dcCs)|r%t|tr%t||jS|S)N)rOrrkrr)r?rZr>r>rArszDateTimeField.python_valuerrrrrrN)rCrDrErrrrrrrrrrrrr>r>r>rArs	c@sgeZdZdZdddgZddZeedZeedZ	eed	Z
d
S)rdatez%Y-%m-%dz%Y-%m-%d %H:%M:%Sz%Y-%m-%d %H:%M:%S.%fcCsZ|r4t|tr4dd}t||j|S|rVt|tjrV|jS|S)NcSs
|jS)N)r)rnr>r>rArQsz(DateField.python_value.<locals>.<lambda>)rOrrkrrror)r?rZppr>r>rArs
zDateField.python_valuerrrN)rCrDrErrrrrrrrrr>r>r>rArs	c@smeZdZdZdddddgZddZeed	Zeed
Z	eedZ
dS)
r8timez%H:%M:%S.%fz%H:%M:%Sz%H:%Mz%Y-%m-%d %H:%M:%S.%fz%Y-%m-%d %H:%M:%ScCs|rPt|tr4dd}t||j|St|tjrP|jS|dk	rt|tjrtjj|jS|S)NcSs
|jS)N)r)rnr>r>rArQsz(TimeField.python_value.<locals>.<lambda>)rOrrkrrrorZ	timedeltamin)r?rZrr>r>rArs
zTimeField.python_valuerrrN)rCrDrErrrrrrrrrr>r>r>rAr8s	cs_eZdZddedDZfddZddZdd	Zd
dZS)r9cCsg|]}d|qS)rbr>).0rr>r>rA
<listcomp>s	zTimestampField.<listcomp>cs|jddpd|_|j|jkrVtddjdd|jD|jddpkd|_tj}|jr|jn|j|_	|jr|j
n|j}|jd	|t
t|j||dS)
N
resolutionrz,TimestampField resolution must be one of: %sz, css|]}t|VqdS)N)r)rrr>r>rA	<genexpr>sz*TimestampField.__init__.<locals>.<genexpr>utcFr)poprvalid_resolutionsrqrrroZutcfromtimestampZ
fromtimestamp_convZutcnowZnow
setdefaultrr9r)r?rrZ_dtZ_default)rr>rArs#	zTimestampField.__init__cCs|jdkr|jStjS)Nr)rrr)r?r>r>rArszTimestampField.get_db_fieldcCs|dkrdSt|tjr%nJt|tjrXtj|j|j|j}ntt||jS|j	rt
j|j}nt
j|j}||jd7}|jdkr||j9}tt|S)Ngư>r)rOrorrrrrroundrrcalendarZtimegmZutctimetuplermktimeZ	timetuplemicrosecond)r?rZZ	timestampr>r>rArs!	
zTimestampField.db_valuecCs|dk	rt|tttfr|dkr4dS|jdkrtt||j\}}|j|jd|S|j|S|S)Nrrr)rOrrlongrdivmodrreplace)r?rZrdr>r>rArs$
zTimestampField.python_value)	rCrDrErrrrrrr>r>)rrAr9s

c@seZdZdZeZdS)r
boolN)rCrDrErrrVr>r>r>rAr
scsOeZdZdZfddZddZdddZd	d
ZS)RelationDescriptorzEForeign-key abstraction to replace a related PK with a related model.cs#||_tt|j|dS)N)rrrr)r?rr)rr>rArs	zRelationDescriptor.__init__cCs|jj|j}|dk	s3|j|jkr|j|jkrs|jj|jj|k}||j|j<|j|jS|jjs|jj|S)N)	rrr
_obj_cacherrrrr)r?r	Zrel_idrr>r>rAget_object_or_idsz#RelationDescriptor.get_object_or_idNcCs |dk	r|j|S|jS)N)rr)r?r	r
r>r>rArs
zRelationDescriptor.__get__cCst||jrGt||jjj|j|j<||j|j<nP|jj	|j}||j|j<||kr|j|jkr|j|j=|j
j|jdS)N)rOrrrrrrrrrrrt)r?r	rZZ
orig_valuer>r>rAr s
zRelationDescriptor.__set__)rCrDrErrrrrr>r>)rrAr
s
rc@s1eZdZdZddZdddZdS)ReverseRelationDescriptorz<Back-reference to expose related objects as a `SelectQuery`.cCs||_|j|_dS)N)rrxr)r?rr>r>rAr.s	z"ReverseRelationDescriptor.__init__NcCsA|dk	r=|jjj|jt||jjjkS|S)N)rselectwhererrrr)r?r	r
r>r>rAr2s"z!ReverseRelationDescriptor.__get__)rCrDrErrrr>r>r>rAr,src@s=eZdZdZddZdddZddZdS)	ObjectIdDescriptorz(Gives direct access to the underlying idcCs"|j|_tj||_dS)N)r	attr_nameweakrefrefr)r?rr>r>rAr:szObjectIdDescriptor.__init__NcCs)|dk	r|jj|jS|jS)N)rrrr)r?r	r
r>r>rAr>szObjectIdDescriptor.__get__cCst||j|dS)N)rr)r?r	rZr>r>rArCszObjectIdDescriptor.__set__)rCrDrErrrrr>r>r>rAr8srcseZdZdddddfddZfddZddZdd	Zd
dZdd
ZddZ	fddZ
fddZddZddZ
ddZS)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_namedeferred	on_delete	on_updateextrarrrr)	r?rrelated_namerrr	rrr)rr>rArGs						zForeignKeyField.__init__csOtt|jd|jd|jd|jd|jd|jd|j|S)Nrr
rrr	r)	rrrr_get_related_namerrr	r)r?r)rr>rArWs				zForeignKeyField.clone_basecCst||jS)N)rr)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|jr%|j|S|jp>d|jjjS)Nz%s_set)rcallablerxrur)r?r>r>rArjs
z!ForeignKeyField._get_related_namecstjtr>fdd}jj|dStjtrjjjdS__jpdj_jkrd7j	st
jddj_	j
jj_jdkrj_jdk	rOtjtsatjj_njj
j_j
jrfdd	}jjj
jkr|d
n"jjj
jkr|dj
jkr|dnjkr|d
tjtjtjjjd_j
jj<jj
jj<dS)Ncs|_jdS)N)rr)r)rxrr?r>rArqs	z.ForeignKeyField.add_to_class.<locals>.callbackz%s_idZ_idz_+rer?csC|jddjjfdjdt||dS)Nrz%s.%sbackrefobj_id_name)rrurr
r)msgcontext)rxrrr?r>rAinvalids
		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)rOrr2rrrrrxrrrrrrurrr
rrrrsvalidate_backrefsrrv__dict__rrr
rrrel)r?rxrrrr>)rxrrr?rArosP		
	



	
	zForeignKeyField.add_to_classcs2t|jts|jjStt|jS)zr
        Overridden to ensure Foreign Keys use same column type as the primary
        key they point to.
        )rOrr0rrr)r?)rr>rArs
zForeignKeyField.get_db_fieldcs2t|jts|jjStt|jS)N)rOrr0rrr)r?)rr>rArs
zForeignKeyField.get_modifierscCs|jj|S)N)rrV)r?rZr>r>rArVszForeignKeyField.coercecCs.t||jr|j}|jj|S)N)rOr
_get_pk_valuerr)r?rZr>r>rArszForeignKeyField.db_valuecCs&t||jr|S|jj|S)N)rOrrr)r?rZr>r>rArszForeignKeyField.python_value)rCrDrErrrr
rrrrrrVrrr>r>)rrArFs
@	c@sgeZdZdZdZddZddZdddZd	d
ZddZ	d
dZ
dS)rz+A primary key composed of multiple columns.NcGs
||_dS)N)field_names)r?rr>r>rArszCompositeKey.__init__cCs&||_||_t|||dS)N)rrxr)r?rxrr>r>rArs		zCompositeKey.add_to_classcs0dk	r,tfdd|jDS|S)Ncsg|]}t|qSr>)r)r
field_name)r	r>rArs	z(CompositeKey.__get__.<locals>.<listcomp>)tupler)r?r	r
r>)r	rArszCompositeKey.__get__cCsdS)Nr>)r?r	rZr>r>rArszCompositeKey.__set__cs5fddtj|D}ttj|S)Ncs/g|]%\}}jjj||kqSr>)rxrur)rrrZ)r?r>rArs	z'CompositeKey.__eq__.<locals>.<listcomp>)ziprrNoperatorand_)r?otherexpressionsr>)r?rAr'szCompositeKey.__eq__cCst|jj|jfS)N)rrxrCr)r?r>r>rArszCompositeKey.__hash__)rCrDrErrrrrrr'rr>r>r>rArsc@sdeZdZdZdddZddZddd	Zd
dZdd
ZddZ	dS)AliasMaprfrcCsi|_||_dS)N)
_alias_map_counter)r?startr>r>rArs	zAliasMap.__init__cCsd|jS)Nz<AliasMap: %s>)r")r?r>r>rA__repr__szAliasMap.__repr__NcCsI||jkrdS|jd7_|p;d|j|jf|j|<dS)Nrz%s%s)r"r#prefix)r?rrr>r>rArtszAliasMap.addcCs'||jkr|j||j|S)N)r"rt)r?rr>r>rA__getitem__s
zAliasMap.__getitem__cCs
||jkS)N)r")r?rr>r>rA__contains__szAliasMap.__contains__cCsC|r?x6|jjD]%\}}||kr||j|<qW|S)N)r"items)r?	alias_maprrr>r>rArs
zAliasMap.update)
rCrDrEr&rr%rtr'r(rr>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@dAZ(dBdCZ)dDdEZ*dFdGZ+dHdIZ,dJdKZ-dLdMZ.dNdOZ/dPdQZ0dRdSZ1dTdUZ2dVdWZ3dXdYZ4dZd[Z5d\d]Z6d^d_Z7d`daZ8dbdcZ9d=d=dddeZ:d=dfdgdhZ;d=didjZ<d=dkdlZ=dmdnZ>d=dodpZ?dqdrZ@eAdsdtZBdudvZCdwdxZDdydzZEd{d|ZFd}d~ZGd=ddZHeGdZIdddZJeGdZKddddZLeGdZMddddZNeGdZOddZPddZQeGdZRdddZSeGdZTddZUeGdZVddZWeGdZXd=S)
QueryCompilerrrrZBIGINTrZBLOBrZSMALLINTrZDATEroZDATETIMErZDECIMALrZREALrZCHARrrINTEGERrsrrZVARCHARrTEXTrZTIMErrz<=rz>=z!=rzNOT INrzIS NOTrrrrrrrrr#rrrrz||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_mapop_map_op_map
get_parse_map
_parse_mapr_unknown_types)r?r1r2field_overridesop_overridesr>r>rArFs		zQueryCompiler.__init__cCsgd|jd|jd|jd|jd|jd|jd|jd|jd	|jd
|j	d|j
iS)Nr1r`rcrrdrMrrKselect_querycompound_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>rAquote`szQueryCompiler.quotecCs$||jkr|j|S|jS)N)r4upper)r?fr>r>rArcszQueryCompiler.get_column_typecCs|j|S)N)r6)r?qr>r>rAget_opfszQueryCompiler.get_opcCst|jdddS)NrcSs|djS)Nr)r)rr>r>rArQjsz.QueryCompiler._sorted_fields.<locals>.<lambda>)rr))r?
field_dictr>r>rA_sorted_fieldsiszQueryCompiler._sorted_fieldscCs|j|gfS)N)r2)r?r
r*convr>r>rA_parse_defaultlszQueryCompiler._parse_defaultc
Cst|jtr|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"ZrparamstemplaterKr>r>rAr>os	zQueryCompiler._parse_expressioncCs;|jr(|j|j|j|dS|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)rarrRrZr2)r?r
r*rPr>r>rAr?}s	zQueryCompiler._parse_paramcCsP|jr|pd}|j|j||\}}d|jt|f|fS)Nz%s(%s))rUparse_node_listrSrrm)r?r
r*rPrKrLr>r>rArAszQueryCompiler._parse_funccCsG|j|j|||j\}}|jr=dt|}||fS)Nz(%s))rTrhrfrgrm)r?r
r*rPrKrLr>r>rArBs
	zQueryCompiler._parse_clausecCs"djt|j|jgfS)Nr)rrrIrN)r?r
r*rPr>r>rArCszQueryCompiler._parse_entitycCs|jt|jfS)N)rZrrL)r?r
r*rPr>r>rArEszQueryCompiler._parse_sqlcCsV|r:dj|j||j|j|jf}n|j|j}|gfS)Nr)rrIrxr)r?r
r*rPrKr>r>rArDs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_selectcalculate_alias_maprcompound_select_parenthesesr)r?r
r*rPZcsqZfirst_qZsecond_qr#new_mapfirstZfirst_prZsecond_prZlprZrprKr>r>rArGs($	!z*QueryCompiler._parse_compound_select_querycCs}|j}|jsQ|r6t|tr6|j}n|jjj}|f|_|j	||\}}dt
||fS)Nz(%s))r_explicit_selectionrOrrrxrurs_selectrVrm)r?r
r*rPrZselect_fieldrrLr>r>rArFs	z!QueryCompiler._parse_select_querycCs.|j|j||\}}t||fS)N)rRr
rm)r?r
r*rPrKrLr>r>rArHsz!QueryCompiler._parse_strip_parenscCst|dd}d}||jkrs|j||||\}}||jkom|jdkom|dk}nt|tttfr|j|||\}}d|}nKt|t	r@|j
}|r(t|tr(|j}t|tr
|j
|}	q4|j
t||j}	n|j}	|	g}nt|r[t|t	sjt|tr|jj||}
|j|
||\}}n]|dk	r|j
|}	|j|	|d\}}}n!|j||d\}}d}|||fS)Nr3Fz(%s)T)rr8r9rarOrrrrTr)r2rrrrrr	rrrrrR_parserQ)r?r
r*rPZ	node_typerrKrLrrZrM_r>r>rAr^s:
		!zQueryCompiler._parsec
s,|j||\}}}|rOdk	rO|rOfdd|D}t|tr|jrqd|}|jrdj|d|jf}|jrdj||jf}|r"tdd|Dr"g}g}x>t|D]0\}	}
t|
tr|j	|
\}}qW||fS)Ncsg|]}j|qSr>)r)rr)rPr>rArs	z,QueryCompiler.parse_node.<locals>.<listcomp>zNOT %sreAScss|]}t|tVqdS)N)rOr)rpr>r>rArsz+QueryCompiler.parse_node.<locals>.<genexpr>)
r^rOrrrrrany	enumeraterR)
r?r
r*rPrKrLrZclean_paramsZ	clean_sqlidxr`ZcsqlZcparamsr>)rPrArRs"	
		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|jjjx|jjD]}\}}|j||jjxX|D]P}t|j	t
r|j|j	|j	jqy|j|j	|j	jjqyWqPW|j|S)N)
rUr#rtrxrutable_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>rAbuild_query&szQueryCompiler.build_querycCsg}t}|g}x|r|j}||ks||krHq|j|x||D]}|}	|j}
t|jtttt	fr|jj
j}n|j}|j
r|j}
|j}n|j}
|j}|j}|r?t|
|j}t||jj}|j
r0||}}||k}ntdt|
trc|
}n&|j|
|
jj||
}|j}||jkrt|j|}nt|}|jt||td|q`WqW|S)Nz Missing required join predicate.ON)rrrtrrrOrr!rPrrrrrrtrqr{rrrrqrryrr~join_mapr6)r?joinsrxr*rgrrLcurrrrqrr
constraintrZfk_modelZpk_modelfkr^r"Zdest_nr}Zjoin_sqlr>r>rAgenerate_joins)sL			
								
	
$zQueryCompiler.generate_joinscCs|j}|jj}|j||}t|trHt|g}n|jsctdg}n=tdg}|jdkr|tdt	|jg7}t
|j}d|_|j
|tdf|jdkr|j|jj||n|jt|j|jdk	r^|jtd|jtd	d
|jD|j|j||}|r|j
||jdk	r|j
td|jg|jr|j
tdt|jg|jr|j
td
|jg|jr/|j
tdt|jg|jdk	sP|jr|jr|jdk	rh|jn|j}|jtd||jdk	r|jtd|j|j\}	}
|	r|
rdnd}|jt||j||S)NZSELECTzSELECT DISTINCTTFriz, FROMZWINDOWcSs7g|]-}tt|jtd|jqS)r`)rr6rrZ)rr[r>r>rArzs	z1QueryCompiler.generate_select.<locals>.<listcomp>WHEREzGROUP BYZHAVINGzORDER BYzLIMIT %sz	OFFSET %szFOR UPDATE NOWAITz
FOR UPDATE)TF)rxrurrWrOCompoundSelectrm	_distinctr6rjrr]rfr_fromryrrri_windowsrorf_where	_group_by_having	_order_by_limit_offset	limit_max_for_updaterh)r?rlr*rzdbrgZ
select_clauseZjoin_clauseslimit
for_updateZno_waitZstmtr>r>rArV^sT			#		
	"		"!!zQueryCompiler.generate_selectc
Cst|j}|j}|j||jj|jrDd|j}nd}t||jtdg}g}xx|j|j	D]d\}}t
|ttfst
|d|j}|jt|jddtj|ddqW|jt||jr$|jtd	|jg|jdk	rdt|j}	d
|	_|jtd|	g|j||S)NzUPDATE OR %sZUPDATEZSETrarFr_Trqz, 	RETURNING)rxrUrtrur_on_conflictr6rrO_updaterOrr)r-rryr!r&rrirvr
_returningrrfrh)
r?rlrzr*	statementrgrrrZreturning_clauser>r>rAgenerate_updates0		!			zQueryCompiler.generate_updatecCs|dd|DS)NcSs"g|]}|jddqS)rF)r)rrr>r>rArs	z3QueryCompiler._get_field_clause.<locals>.<listcomp>r>)r?rclause_typer>r>rA_get_field_clauseszQueryCompiler._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|jn0|jdk	rgg}}d}	x|jD]}
|	s/t|
jdtjd}d}	g}xO|D]G}|
|}
t|
ttfsvt|
d|j}
|j
|
q<W|j
t|qW|r|j|j|t	dt|gn+|jjjr|j
|jj|j|j r7|jt	d	|j|j!d
tgn@|j"dk	rwt#|j"}d|_$|jt	d	|g|j%||S)NzINSERT OR %s INTOzINSERT INTOFrrTraZVALUESrrz, )&rxrurUrtr_upsertr
upsert_sqlrr6r_query_fieldsryrrm_rows
_iter_rowsrkeysr
attrgetterrOrr)r-rrjrriauto_incrementdefault_insert_clauseis_insert_returningget_primary_key_fieldsrrrfrh)r?rlrzrGr*rrgrZ
value_clausesZhave_fieldsrow_dictrwrrZrr>r>rAgenerate_inserts`					


	
			zQueryCompiler.generate_insertcCs|j}td|jg}|jrF|jtd|jg|jdk	rt|j}d|_|jtd|g|j|S)NzDELETE FROMrqz, r)	rxr6rrvrrrrfrh)r?rlrzrgrr>r>rAgenerate_deletes			zQueryCompiler.generate_deletecCs.|j|j}|j|}t|S)N)rrrr)r?rrrr>r>rAfield_definition	szQueryCompiler.field_definitioncCstdt|jtd|jjt|jjg}|jrh|jtd|j|jr|jtd|jt|S)NzFOREIGN KEYZ
REFERENCESzON DELETE %szON UPDATE %s)	r6rjrrrrryrr)r?rrr>r>rAforeign_key_constraints				z$QueryCompiler.foreign_key_constraintcsfdd}|S)Ncs%t|}|j|||S)N)rrR)r?rrr)
function_namer>rArsz/QueryCompiler.return_parsed_node.<locals>.innerr>)rrr>)rrAreturn_parsed_nodesz QueryCompiler.return_parsed_nodecCsk|p(d|jj|j|jjjf}|j|}ttd|jtdt||j	S)Nzfk_%s_%s_refs_%szALTER TABLEzADD CONSTRAINT)
rurrrrrr6rrrh)r?rxrrmZ	fk_clauser>r>rA_create_foreign_key#s						z!QueryCompiler._create_foreign_keyrFc	s<|rdnd}|jgg}}jrrfddjjD}|jttdt|xVjD]K}|j|j	|t
|tr||jr||j|j
|q|W|jjrx<|jjD].}t
|tst|}|j|qWtt||jt||S)NzCREATE TABLE IF NOT EXISTSzCREATE TABLEcs#g|]}j|jqSr>)rr)rrK)rGr>rAr7s	z/QueryCompiler._create_table.<locals>.<listcomp>zPRIMARY KEY)ru
composite_keyrsrryrr6rjdeclared_fieldsrrOrrrrrr)	r?rxsafercolumnsrZpk_colsrrmr>)rGrA
_create_table1s*	
				zQueryCompiler._create_tablercCsM|rdnd}t||jg}|rC|jtdt|S)NzDROP TABLE IF EXISTSz
DROP TABLECASCADE)r6rryr)r?rx
fail_silentlycascaderrr>r>rA_drop_tableLs
zQueryCompiler._drop_tablercCsTtd|jg}|r1|jtd|rJ|jtdt|S)NzTRUNCATE TABLEzRESTART IDENTITYr)r6rryr)r?rxrestart_identityrrr>r>rA_truncate_tableTszQueryCompiler._truncate_tablercCsqd|dj|f}t|dkrmtj|jdj}d|dd|ddf}|S)Nz%s_%sr_@zutf-87)rrhashlibmd5rU	hexdigest)r?tablerrZ
index_hashr>r>rA
index_name^s
$zQueryCompiler.index_namecGs|jj}|rdnd}|j|dd|D}tt|t|td|jtdd|D|S)NzCREATE UNIQUE INDEXzCREATE INDEXcSsg|]}|jqSr>)r)rrKr>r>rArhs	z/QueryCompiler._create_index.<locals>.<listcomp>ricSsg|]}|jqSr>)r)rrr>r>rArns	)rurrrr6rrrj)r?rxrrr	tbl_namerrr>r>rA
_create_indexes				zQueryCompiler._create_indexrcCsV|jj}|rdnd}|j|dd|D}tt|t|S)NzDROP INDEX IF EXISTSz
DROP INDEXcSsg|]}|jqSr>)r)rrKr>r>rArus	z-QueryCompiler._drop_index.<locals>.<listcomp>)rurrrr6r)r?rxrrrrrr>r>rA_drop_indexrszQueryCompiler._drop_indexrcCsttdt|S)NzCREATE SEQUENCE)rr6r)r?
sequence_namer>r>rA_create_sequenceyszQueryCompiler._create_sequencercCsttdt|S)Nz
DROP SEQUENCE)rr6r)r?rr>r>rA_drop_sequence}szQueryCompiler._drop_sequencer)YrCrDrEr3r&rrrrrrrrrrrrrrrrrrrrrrrrrr5r%rrrrrjr!rUrr7rIrrMrOrQr>r@r?rArBrCrErDrGrFrHr^rRrTrWrhrorVrrjrrrrrrrcreate_foreign_keyrcreate_tabler
drop_tablertruncate_tablerrcreate_indexr
drop_indexrcreate_sequencer
drop_sequencer>r>r>rAr+	s																													
	'	5?>
r+c@s"eZdZddddZdS)SqliteQueryCompilerFcCs|jjS)N)deleterK)r?rxrrr>r>rArsz"SqliteQueryCompiler.truncate_tableN)rCrDrErr>r>r>rArsrc@s.eZdZddZddZeZdS)ResultIteratorcCs||_d|_dS)Nr)qrw_idx)r?rr>r>rArs	zResultIterator.__init__cCs|j|jjkr+|jj|j}nI|jjsn|jj}|jjj||jjd7_nt|jd7_|S)Nr)rr_ct
_result_cache
_populatediteratery
StopIteration)r?rr>r>rAnextszResultIterator.nextN)rCrDrErr__next__r>r>r>rArsrc@seZdZdZdddZddZeddZd	d
ZddZ	d
dZ
ddZddZeZ
dddZdS)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)	rzcursorrrrr_initializedcolumn_meta	join_meta)r?rzrrGr>r>rArs							zQueryResultWrapper.__init__cCs$|jrt|jSt|SdS)N)riterrr)r?r>r>rA__iter__s	
zQueryResultWrapper.__iter__cCs|j|jS)N)
fill_cacher)r?r>r>rArQs
zQueryResultWrapper.countcCs|jS)N)rQ)r?r>r>rA__len__szQueryResultWrapper.__len__cCs|S)Nr>)r?rowr>r>rAprocess_rowszQueryResultWrapper.process_rowcCs{|jj}|sId|_t|jdds@|jjtn%|jsn|j|jjd|_|j	|S)NTr)
rfetchonerrcloserrrdescriptionr)r?rr>r>rArs	
			zQueryResultWrapper.iterateccsx|jVqWdS)N)r)r?r>r>rAiteratorszQueryResultWrapper.iteratorcCs|j|jkr5|j|j}|jd7_|S|jrDt|j}|jj||jd7_|jd7_|S)Nr)rrrrrrry)r?rrr>r>rArs	zQueryResultWrapper.nextcCs~|ptd}|dkr*td|j|_xA|jry||jkryyt|Wq9tk
ruPYq9Xq9WdS)NZInfrz"Negative values are not supported.)rrqrrrrr)r?nr>r>rArs
zQueryResultWrapper.fill_cache)rCrDrErrrrrQrrrrrrrr>r>r>rArs
rc@seZdZddZdS)ExtQueryResultWrapperc
Csk|j}g}dd}x@tt|D],}|}||d}d}|jdk	r	y|j|}	Wntk
rYnXt|	tr|	j}|	jp|	j	}d}nSt|	t
r	t|	jr	t|	jdtr	|	jr|	jdj}d}|rD||j
jkrD|j
j|}
|
j	}|
j}|j|||fq.W||_dS)NcSs|S)Nr>)rnr>r>rArQsz2ExtQueryResultWrapper.initialize.<locals>.<lambda>rFT)rzrrr
IndexErrorrOrrrrrPrSrUrurryrP)r?rrzrPidentityrrcolumnfoundZ
select_column	field_objr>r>rArs8	
					z ExtQueryResultWrapper.initializeN)rCrDrErr>r>r>rArsrc@seZdZddZdS)TuplesQueryResultWrappercs#tfddt|DS)Ncs-g|]#\}}j|d|qS)rJ)rP)rrcol)r?r>rAr	s	z8TuplesQueryResultWrapper.process_row.<locals>.<listcomp>)rrc)r?rr>)r?rAr	sz$TuplesQueryResultWrapper.process_rowN)rCrDrErr>r>r>rAr	src@seZdZddZdS)NaiveQueryResultWrappercCsQ|j}x4|jD])\}}}t|||||qW|j|S)N)rzrPr_prepare_instance)r?rr	rrrr>r>rAr	s

z#NaiveQueryResultWrapper.process_rowN)rCrDrErr>r>r>rAr	src@seZdZddZdS)DictQueryResultWrappercCs;i}x.|jD]#\}}}|||||<qW|S)N)rP)r?rrWrrrr>r>rAr#	sz"DictQueryResultWrapper.process_rowN)rCrDrErr>r>r>rAr"	src@s[eZdZddZddZddZddZd	d
dZdd
Zd	S)ModelQueryResultWrappercCsJ|j\|_}tdd|jD|_|j||_dS)Ncss$|]}t|tr|VqdS)N)rOr)rrr>r>rAr/	sz5ModelQueryResultWrapper.initialize.<locals>.<genexpr>)generate_column_map
column_maprr_col_setgenerate_join_list	join_list)r?rZ	model_setr>r>rAr-	sz"ModelQueryResultWrapper.initializec	CsHg}t|jg}x#t|jD]\}}d}}t|trt|tr}|j}|j}|jj	}n|j
}}|j	}|jp|j}nl|j
dkr|j}}n
|j
}}t|tr|jr|j}nt|tr|jd}|j||||f|j|q(W||fS)Nr)rrzrcrrOrr_model_aliasfield_instancerrxrrrrrrNryrt)	r?rr}rr
rrPrconstructorr>r>rAr3	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
|jqJWqW|S)NF)rrzrrrrrpr{rrsrry)r?r}rrkstackcurrentrr
fk_present
pk_presentcheckr>r>rArO	s.				
z*ModelQueryResultWrapper.generate_join_listcCsA|j|}|j|}x|D]}|jq%W|dS)Nr)construct_instancesfollow_joinsr)r?r	collected	instancesrr>r>rArl	s

z#ModelQueryResultWrapper.process_rowNcCsi}xt|jD]\}\}}}}|dk	rI||krIq||}	||krl|||<||}
|dkr|jj|d}|dk	r||	}	t|
||	qW|S)Nr)rcrrrr)r?rrZcollected_modelsrrrrrPrZr	r>r>rArs	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	}	|	sq|j
dk	}
|
o|j|jkot||j
j	dk}|r(t
||j
j	|j|j|jr|
o||jdk	o|t||j
j	dk	o||jj|jj	dk}|rt
||jj	|t
||j||j|qW|S)NT)rzrrqrrKeyErrorrprrr{rrsrrrrtry)
r?rpreparedrZ
check_nullrrrjoined_instZhas_fkZmpkZcan_populate_joined_pkZcan_populate_joined_fkr>r>rAr	sJ

			z$ModelQueryResultWrapper.follow_joins)	rCrDrErrrrrrr>r>r>rAr,	sr	JoinCachercsLeZdZfddZfddZddZddZS)	AggregateQueryResultWrappercs&g|_tt|j||dS)N)_rowrrr)r?rr)rr>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|jn3|j
j|jt|j
|jj|j|j	j|jitd|d|jpE||j	|j|j<qWi|_i}xt|jD]{\}\}}	}
}||jkr|jj|g|j|j||
f|j|g||j||
fqWxa|jD]V}||jkr q|j
j|f}x&|D]}
|j|j||
q<WqWdS)Nrr)rrrr
all_modelsrrtZmodels_with_aggregateZback_referencessource_to_destZdest_to_sourcerrtr{r
rrurqrrrrrcolumns_to_comparercryrr)r?rrr_rrrtZkey_to_columnsrdrxcol_namerZsourcesZjoined_model)rr>rAr	sH					'	(

z&AggregateQueryResultWrapper.initializecCs`i}xS|jjD]B\}}g||<x)|D]!\}}||j||q3WqW|S)N)rr)ry)r?rr}rxZcolumn_datardrr>r>rAread_model_data	s
z+AggregateQueryResultWrapper.read_model_datacCs.|jr|jj}n|jj}|sdd|_t|jdds[|jjtn%|js|j	|jj
d|_dd}i}|j|}||j}x;|j
D]-\}}t||<|||||<qW|j|}x|jj}	|	dkr#Pt}
|j|	}x7|j
D])\}}
|||
krH|
j|qHW|
s|jj|	P|j|
}|j|	|}xf|j
D]X\}}d}x)|jjD]}|dk	rd}qW|s|||||<qWqW|jg}|g}x|r|j}||jkrTq0x|j|D]}y|j||j\}}Wntk
rwbYnX|js|jr}x(||jD]}t||gqW|j|krqbx||jj
D]u\}}|dkrqy|||j|jj}Wntk
rRwYnXt||j||j|qWnz|r|j|krqbx_||j
D]M\}}||j|j|jj}t||jj||j|qW|j|jqbWq0Wx|D]}|jqW|S)NTrcs<jjr2tfddjjjDSjS)Ncsg|]}j|qSr>)r)rr)r	r>rAr
s	zHAggregateQueryResultWrapper.iterate.<locals>._get_pk.<locals>.<listcomp>)rurrrsrr)r	r>)r	rA_get_pk

s
z4AggregateQueryResultWrapper.iterate.<locals>._get_pkF) rrrrrrrrrrrrrzr)rrrrtryrrrwrrrrrrtrurr{rr)r?rrZidentity_mapZ_constructedZprimary_instancerr	Z
model_dataZcur_rowZduplicate_modelsZcur_row_datarxdataZdifferent_modelsZ
new_instancesZall_nonerZrrrrrrpkrrr>r>rAr	s		
			

	

		
 

	
z#AggregateQueryResultWrapper.iterate)rCrDrErrrrr>r>)rrAr	s6rcs3eZdZdZdZfddZddZddZd	d
ZddZ	d
ddZ
ddZeddZ
eddZed
d
ddZed
ddZd
ddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d(d)d*ZS)+Queryz?Base class representing a database query on one or more tables.Tcs\tt|j||_|jj|_d|_||_|jgi|_d|_	dS)NT)
rrrrxrurr
_query_ctxrfrv)r?rx)rr>rAro
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)rrxr_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|jjDS)Ncss'|]\}}|t|fVqdS)N)r)rZmcjr>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_clausescCsg}x|D]}t|tr2|j|q
t|trQ|j|q
t|trv|j|jq
t|r
t|t	r
|j|j
jq
W|S)N)rOrryrrrget_proxy_fieldsr	rr)rur)r?raccumargr>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)rrvror_)r?r r>r>rAorwhere
sz
Query.orwherecCs|j}|sRt|tp:t|o:|jj|}|rqtdnt|trq|jj|}|j	j
|g|j	|jt||||t|ts||_dS)Nz#A join condition must be specified.)
rrOrxr	ru
rel_existsrqrrrfrryrw)r?rrr}rrqZrequire_join_conditionr>r>rAr
s	#z
Query.joincCs|p|j|_dS)z"Change or reset the query context.N)rxr)r?rxr>r>rAswitch
szQuery.switchcKsd|j}x0|jj|gD]}|j|kr|SqW|j|j|d||j|S)Nr)rrfrrrrr)r?lmrmrZjoin_kwargsctxrr>r>rAensure_join
s
	zQuery.ensure_joincCsg}g}ttf}xt|jD]\}}|j}d|kr|jdddtkr|jdd\}}t|}n	tj}xK|j	dD]:}	t
||	}
t|
|r|
j}|j
|
qW|j
t|
||q+W||fS)N__r)rrrr)rxrsplit
DJANGO_MAPr&rsplitrrOrryr!)r?ZqdictrrkZrelationshiprrZrlr$piece
model_attrr>r>rAconvert_dict_to_node
s 	(
		zQuery.convert_dict_to_nodecOst}|r2|ttjdd|DM}|rH|t|M}t|g}t}x|r7|j}t|t	sqcxd|j
fd|jffD]\}}t|tr#|j|j
\}	}
|j|
ttj|	}|j|_|j|_t|||q|j|qWqcW|j}|j}	x||D]t}t|tr|j|j}
}|}n.t|tr|jj|j}
}|j}|	j|
||}	qTW|	j|S)NcSsg|]}|jqSr>)r)rrr>r>rAr
s	z Query.filter.<locals>.<listcomp>r^r")rrNrrrrrpopleftrOr!r^r"r!rlrrrrryrrrxrrrrr)r?rrZdq_noderLZdq_joinsrlZsiderrlrkr1rrrrr>r>rArO
s>	#		+
	
		zQuery.filtercCs
|jjS)N)rr)r?r>r>rArszQuery.compilercCs
tdS)N)r)r?r>r>rArKsz	Query.sqlcCs+|j\}}|jj|||jS)N)rKrexecute_sqlrequire_commit)r?rKrLr>r>rA_executeszQuery._executecCs
tdS)N)r)r?r>r>rAexecutesz
Query.executeFcCsJ|r|jj}n|jj}|rB|rB|dS|SdS)Nr)tuplesrZr%r)r?Zas_tupleconvertrr>r>rAscalars
zQuery.scalar)rCrDrErr$rr%rr	r
rrrrrrrrr!rOrrKr%r&r)r>r>)rrArk
s.
(rcseZdZdZfddZddZedZedZedZ	e
d	d
dZe
d	dd
ZddZ
ddZddZS)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_dictsrr*r)r?rzrlrL)rr>rArs				zRawQuery.__init__cCs7t|j|j|j}|j|_|j|_|S)N)r*rxr+r,r.r/)r?rlr>r>rAr&szRawQuery.clonejoiningrrTcCs
||_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.rget_result_wrapperRESULTS_TUPLESr/
RESULTS_DICTS
RESULTS_NAIVErxr%)r?ZQRWr>r>rAr&;s		zRawQuery.executecCst|jS)N)rr&)r?r>r>rArFszRawQuery.__iter__)rCrDrErrrrrrrrr'r1rKr&rr>r>)rrAr*sr*cKsL|jdd}|r$td|r>|p3g|p=dS|rH|SdS)NrFz,"extend" is the only valid keyword argument.)rrq)ZorigZnew_valrrr>r>rAallow_extendIsr6cseZdZdZfddZfddZddZeeZedZ	ed	Z
ed
ZddZd
dZ
ddZeeZeddZeddZeddZeddZeddZeddZeddZedd d!Zed"d#d$Zed"d%d&d'Zed"d(d)Zed"d*d+Zed"d,d-Zed"d.d/Zed0d1d2Zd0d3d4Z d0d5d6Z!d0d"d7d8Z"d%d9d:Z#d%d;d<Z$d=d>Z%d?d@Z&dAdBdCZ'dAdDdEZ(dFdGZ)dHdIZ*dJdKZ+dLdMZ,dNdOZ-dPdQZ.dRdSZ/dTdUZ0dVdWZ1e2rdXdYZ3S)Zrxr<cstt|j||jj|_|j|d|_d|_d|_	d|_
d|_d|_d|_
d|_d|_d|_d|_d|_d|_d|_d|_dS)NF)FF)rrxrr
commit_selectr$_SelectQuery__selectrtrwrxryrurzr{rsr}_naiver.r/_aggregate_rowsrr-)r?rx	selection)rr>rArUs$
														zSelectQuery.__init__cstt|j|}|j|_t|j|_|jdk	rg|_xI|jD]>}t|tr|jj	|j
qX|jj	|qXW|jdk	rt|j|_|jr|jj
|_|j
dk	rt|j
|_
|jdk	rt|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|S)N)rrxr	r\rr]rtrOrryrrwrxryrurzr{rsr}r9r.r/r:r)r?rlrK)rr>rAr	is6		zSelectQuery._clone_attributescsfdd}|S)NcsD|jjjj}|kr.tdt|j||S)Nz!Your database does not support %s)rxrurcompound_operationsrqrr)r?rZ
supported_ops)rr>rArs

z&SelectQuery.compound_op.<locals>.innerr>)rrr>)rrAcompound_opszSelectQuery.compound_opUNION	INTERSECTEXCEPTcCsF|jjtdjt||@jdj}||B|S)Nrr_)rxrr6from_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_allszSelectQuery.union_allcGs@t|dk|_|p'|jjj}|j||_dS)Nr)rr\rxrurrr])r?r;r>r>rAZ__selectszSelectQuery.__selectcGs|rt|nd|_dS)N)rrt)r?rr>r>rArAszSelectQuery.from_cOs"|r|j|nd|_dS)N)rrw)r?rrr>r>rAgroup_byszSelectQuery.group_bycGs|j|j||_dS)N)rrx)r?r r>r>rAhavingszSelectQuery.havingcOs"t|jt|||_dS)N)r6ryr)r?rrr>r>rArYszSelectQuery.order_bycOs"t|jt|||_dS)N)r6rur)r?Zwindowsrr>r>rAr[szSelectQuery.windowcCs
||_dS)N)rz)r?Zlimr>r>rArszSelectQuery.limitcCs
||_dS)N)r{)r?Zoffr>r>rAoffsetszSelectQuery.offsetcCs0|dkr|d8}||_|||_dS)Nrr)rzr{)r?ZpageZpaginate_byr>r>rApaginates
	zSelectQuery.paginateTcCs
||_dS)N)rs)r?Zis_distinctr>r>rAdistinctszSelectQuery.distinctFcCs||f|_dS)N)r})r?rZnowaitr>r>rArszSelectQuery.for_updatecCs
||_dS)N)r9)r?naiver>r>rArJszSelectQuery.naivecCs
||_dS)N)r.)r?r'r>r>rAr'szSelectQuery.tuplescCs
||_dS)N)r/)r?r1r>r>rAr1szSelectQuery.dictscCs
||_dS)N)r:)r?aggregate_rowsr>r>rArKszSelectQuery.aggregate_rowsNcCs
||_dS)N)r)r?rr>r>rArszSelectQuery.aliascCs|dkr*tj|jjjd}|j|krN|j|j}n|j}|j	|j|}|j
sdd|jD|_
t|j|f|_|S)NrQcSsg|]}|jqSr>)r)rrnr>r>rArs	z(SelectQuery.annotate.<locals>.<listcomp>)
rCountrursrrrrxrrrwr]r)r?rZ
annotationrlr>r>rAannotates	zSelectQuery.annotatecCs=|dkr!tjtd}|j}|g|_|S)Nr)rrLr6rYr])r?aggregationrlr>r>rA
_aggregates
zSelectQuery._aggregatecCs|j|jd|S)Nr()rOr))r?rNr(r>r>rA	aggregateszSelectQuery.aggregatecCsJ|js$|js$|js$|jr4|jd|S|jddpIdS)Nclear_limitr(Fr)rsrwrzr{
wrapped_countrP)r?rQr>r>rArQs$zSelectQuery.countcCsc|j}|r"d|_|_|j\}}d|}|jj||}|jpbdS)Nz+SELECT COUNT(1) FROM (%s) AS wrapped_selectr)rYrzr{rKrxrawr))r?rQrrKrLwrappedZrqr>r>rArRs
zSelectQuery.wrapped_countcCs4|jdd}tdg|_t|jS)Nr1)rHr6r]rr))r?rr>r>rAexists
szSelectQuery.existscCs[|jdd}yt|jSWn.tk
rV|jjd|jYnXdS)Nrz:Instance matching query does not exist:
SQL: %s
PARAMS: %s)rHrr&rrxrrK)r?rr>r>rArs
	zSelectQuery.getrcCsN|j}|j||jd|}|rJ|dkrF|dS|SdS)Nrr)r&rr)r?rrWr}r>r>rApeeks

zSelectQuery.peekcCs1|j|kr!||_d|_|jd|S)NTr)rzrrW)r?rr>r>rArZs		zSelectQuery.firstcCs|jj|S)N)rrV)r?r>r>rArK%szSelectQuery.sqlcCst|j}xd|jD]Y}t|tr;|j|kr;dSt|tr|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>rAget_query_meta2szSelectQuery.get_query_metacCs|jr|jjtS|jr2|jjtS|jsQ|jsQ|jra|jjt	S|j
rz|jjtS|jjtSdS)N)
r.rr2r3r/r4r9rfrXr5r:RESULTS_AGGREGATE_MODELSRESULTS_MODELS)r?r>r>rA_get_result_wrapper5s			zSelectQuery._get_result_wrappercCso|js|jdkrd|j}|j}|j}|||j||_d|_|jS|jSdS)NF)rr-rxrYr\r%)r?rxZ
query_meta
ResultWrapperr>r>rAr&As		zSelectQuery.executecCst|jS)N)rr&)r?r>r>rArLszSelectQuery.__iter__cCst|jjS)N)rr&r)r?r>r>rArOszSelectQuery.iteratorcCsm|j}t|tr'|j}n|}|dk	rU|dkrO|dnd}|j||j|S)Nrr)r&rOslicestoprr)r?rZrWrr>r>rAr'Rs
zSelectQuery.__getitem__cCst|jS)N)rr&)r?r>r>rAr]szSelectQuery.__len__cCs
t|S)N)id)r?r>r>rAraszSelectQuery.__hash__)4rCrDrEr3rr	r=rrBr6r5r8r;rCr8rrrArDrErYr[rrFrHrIrrJr'r1rKrrMrOrPrQrRrVrrWrZrKrXrYr\r&rrr'rPY3rr>r>)rrArxRsn

	
rxc@s4eZdZddZddZddZdS)NoopSelectQuerycCs|jjffS)N)rget_noop_sql)r?r>r>rArKeszNoopSelectQuery.sqlcCsdS)N)NNr>)r?r>r>rArYhszNoopSelectQuery.get_query_metacCs|jjtS)N)rr2r3)r?r>r>rAr\ksz#NoopSelectQuery._get_result_wrapperN)rCrDrErKrYr\r>r>r>rArbdsrbcsveZdZdZdddfddZfddZddd	Zd
dZdd
ZddZ	S)rrr=Ncs8||_||_||_tt|j|gdS)N)r^rr"rrrr)r?rxr^rr")rr>rArqs			zCompoundSelect.__init__cs@tt|j|}|j|_|j|_|j|_|S)N)rrrr	r^rr")r?rl)rr>rAr	ws
z CompoundSelect._clone_attributesFcCs|jd|S)NrQ)rR)r?rQr>r>rArQ~szCompoundSelect.countcCs
|jjS)N)r^rY)r?r>r>rArYszCompoundSelect.get_query_metacCs|jjo|jjS)N)r^rXr")r?r>r>rArXszCompoundSelect.verify_naivecCs|jr|jjtS|jr2|jjtS|jrK|jjtS|jj	p`|j
j	}|jjp|j
jp|j}|s|s|jr|jjt
S|jjtSdS)N)r.rr2r3r/r4r:rZr^rfr"r9rXr5r[)r?Z	has_joinsZis_naiver>r>rAr\s			!z"CompoundSelect._get_result_wrapper)
rCrDrEr3rr	rQrYrXr\r>r>)rrArrnsrrcseZdZfddZfddZddZeeddZeed	d
dZeed	dd
Z	ddZ
ddZS)_WriteQuerycs>d|_d|_d|_d|_tt|j|dS)NF)rr.r/r-rrdr)r?rx)rr>rArs
				z_WriteQuery.__init__csOtt|j|}|jrKt|j|_|j|_|j|_|S)N)rrdr	rrr.r/)r?rl)rr>rAr	s	z_WriteQuery._clone_attributescsfdd}|S)Ncs>|jjj}|js.tdt||||S)Nz/RETURNING is not supported by your database: %s)rxrurrrqr)r?rrr~)rr>rArs
	z-_WriteQuery.requires_returning.<locals>.innerr>)rrr>)rrArequires_returningsz_WriteQuery.requires_returningcGsYt|dkr.|ddkr.d|_n'|sC|jjj}|j||_dS)Nrr)rrrxrurr)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(|jjtS|jrA|jjtS|jjtS)N)rr.rr2r3r/r4r5)r?r>r>rAr2s		z_WriteQuery.get_result_wrappercCsI|j}|j|jgif}||j|j||_|jS)N)r2rrxr%r-)r?r]rGr>r>rA_execute_with_result_wrappersz(_WriteQuery._execute_with_result_wrapper)rCrDrErr	rerrfr'r1r2rgr>r>)rrArds		rdcseZdZdfddZfddZedddZedZd	d
Z	ddZ
d
dZddZS)UpdateQueryNcs,||_d|_tt|j|dS)N)rrrrhr)r?rxr)rr>rArs		zUpdateQuery.__init__cs:tt|j|}t|j|_|j|_|S)N)rrhr	rrr)r?rl)rr>rAr	szUpdateQuery._clone_attributescCs
||_dS)N)r)r?actionr>r>rAon_conflictszUpdateQuery.on_conflictr0cCs|jj|S)N)rr)r?r>r>rArKszUpdateQuery.sqlcCsX|jdk	r(|jdkr(|jS|jdk	r>|jS|jj|jSdS)N)rr-rgr
rows_affectedr%)r?r>r>rAr&s

zUpdateQuery.executecCs.|jjjjstdt|jS)NzwUPDATE queries cannot be iterated over unless they specify a RETURNING clause, which is not supported by your database.)rxrurrrqrr&)r?r>r>rArszUpdateQuery.__iter__cCst|jjS)N)rr&r)r?r>r>rArszUpdateQuery.iterator)
rCrDrErr	rrjrrrKr&rrr>r>)rrArhsrhcseZdZdddddfddZddZfddZed	Zed
Ze	ddd
Z
e	dddZe	dddZe
ddZddZddZddZS)InsertQueryNFcstt|j|d|_|dk	p4|dk	|_d|_|dk	r[||_n|pdig|_||_||_||_	d|_
dS)NF)rrlrr_is_multi_row_insert_return_id_listrrr_validate_fieldsr)r?rxrNrowsrrlvalidate_fields)rr>rArs					zInsertQuery.__init__c
#s|jj}|jr0|jfdd}|j}|j}x|jD]}|j}t}xa|D]Y}|jr||||j	kr|j	|}	n|}	||||	<|j
|	qnW|rx+|D]#}	|	|kr||	||	<qW|VqLWdS)Ncs |krtd|dS)Nz"%s" is not a recognized field.)r)r)valid_fieldsr>rAvalidate_field
sz.InsertQuery._iter_rows.<locals>.validate_field)rxrurorr
_default_dict_default_callablesrrrrrt)
r?Z
model_metarsdefaultsZ	callablesrZ	field_rowrrrr>)rrrAr
s,					
	

zInsertQuery._iter_rowscs|tt|j|}|j|_|j|_|j|_|j|_|j|_|j|_|j	|_	|j
|_
|S)N)rrlr	rrrmrrrnror)r?rl)rr>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)rinsert_returningrmrn)r?r>r>rArC
szInsertQuery.is_insert_returningcCs|jj|S)N)rr)r?r>r>rArKJ
szInsertQuery.sqlcCsrg}d}|j}xH|jD]=}t|j|j|jj}|r|j|qW|rj|S|SdS)N)rnrrlrxrwrr&ry)r?Zid_listZlast_idrxrr>r>rA_insert_with_loopM
s	zInsertQuery._insert_with_loopcCs;|jo1|jdko1|jdko1|jj}|rD|jS|jdk	rl|jdkrl|jS|jdk	r|jS|j}|js|jj	r|j
}|jj}ddt
|j|D}|jjjr|S|dS|jj||jS|jr3ttjd|jSdSdS)NcSs%g|]\}}|j|qSr>)r)rrrr>r>rArq
s	z'InsertQuery.execute.<locals>.<listcomp>rT)rmrrrinsert_manyrzr-rgr%ryrrxrurrrlast_insert_idrnrr
itemgetterfetchall)r?Zinsert_with_looprZpk_rowrGZ
clean_datar>r>rAr&]
s0	


			zInsertQuery.execute)rCrDrErrr	rrrrrwrjrxrrrKrzr&r>r>)rrArls rlc@s4eZdZedZddZddZdS)DeleteQueryr0cCs|jj|S)N)rr)r?r>r>rArK
szDeleteQuery.sqlcCsX|jdk	r(|jdkr(|jS|jdk	r>|jS|jj|jSdS)N)rr-rgrrkr%)r?r>r>rAr&
s

zDeleteQuery.executeN)rCrDrErrrKr&r>r>r>rAr}
sr
IndexMetadatarrKrrrColumnMetadataZ	data_typerForeignKeyMetadatar
dest_tabledest_columnc@seZdZdS)PeeweeExceptionN)rCrDrEr>r>r>rAr
src@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=eZdZdgZddZddZddZdS)	ExceptionWrapper
exceptionscCs
||_dS)N)r)r?rr>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)rCrPY26rr\)r?exc_type	exc_value	tracebackZnew_typeZexc_argsr>r>rA__exit__
s		zExceptionWrapper.__exit__N)rCrDrErrrrr>r>r>rAr
s	rcs"eZdZfddZS)_BaseConnectionLocalcsGtt|j|d|_d|_d|_g|_g|_dS)NT)rrr
autocommitclosedconn
context_stacktransactions)r?r)rr>rAr
s				z_BaseConnectionLocal.__init__)rCrDrErr>r>)rrAr
src@seZdZdS)_ConnectionLocalN)rCrDrEr>r>r>rAr
src@seZdZdZeZddddgZdZdZdZ	iZ
dZdZdZ
dZdZdZdZiZd	ZgZdZdZdZdZdZdZd
ededed
ededede de!de"i	Z#ddddddddZ$ddZ%ddZ&ddZ'ddZ(ddZ)dd Z*d!d"Z+d#d$Z,d%d&Z-d'd(Z.e/d)d*Z0e/d+d,Z1d-d.Z2d/d0Z3d1d2Z4d3d4Z5d5d6Z6ddd7d8Z7d9d:Z8d;d<Z9d=d>Z:d?d@Z;dAdBZ<dCdDZ=dEdFZ>dGdHZ?ddIdJZ@dKdLZAdMdNZBdOdPZCdQdRZDdSdTZEddUdVZFdWdXZGddYdZZHdd[d\ZIdd]d^ZJdd_d`ZKddadbZLdcddZMddedfZNddgdhZOddidjZPddkdlZQddmdnZRdodpZSdddqdrZTdddsdtZUdddudvZVdddwdxZWdydzZXd{d|ZYd}d~ZZddZ[ddZ\ddZ]dS)DatabaseFr>r?r@z	UNION ALLTr0Nr/ZConstraintErrorrrr"r#r$r+r,r1c	Ksi|_|rt|_nt|_|j||tj|_||_||_	||_
t|j|pvi|_t|j
|pi|_
dS)N)connect_kwargsr_localrinit	threadingLock
_conn_lockrautorollbackuse_speedupsrr:r;)	r?rZthreadlocalsrropsrrrr>r>rAr
s				zDatabase.__init__cKsB|js|j|dk|_||_|jj|dS)N)	is_closedrrrrr)r?rrr>r>rAr
s

	z
Database.initcCs
t|jS)N)rr)r?r>r>rAexception_wrapper
szDatabase.exception_wrappercCs{|jk|jrtd|jB|j|j|j|j_d|j_	|j
|jjWdQRXWdQRXdS)NzBError, database not properly initialized before opening connectionF)rr	Exceptionr_connectrrrrrinitialize_connection)r?r>r>rAconnects
	
zDatabase.connectcCsdS)Nr>)r?rr>r>rAr
szDatabase.initialize_connectioncCs]|jM|jrtd|j$|j|jjd|j_WdQRXWdQRXdS)NzBError, database not properly initialized before closing connectionT)rrrr_closerrr)r?r>r>rArs
	
zDatabase.closecCsO|jjr/|jjdj}|dk	r/|S|jjrE|j|jjS)Nrr)rr
connectionrrr)r?rr>r>rAget_conns
zDatabase.get_conncCs
|jjS)N)rr)r?r>r>rAr"szDatabase.is_closedcCs|jjS)N)rr)r?r>r>rA
get_cursor%szDatabase.get_cursorcCs|jdS)N)r)r?rr>r>rAr(szDatabase._closecKs
tdS)N)r)r?rrr>r>rAr+szDatabase._connectcCst|j||_dS)N)rr:)rrr>r>rAregister_fields.szDatabase.register_fieldscCst|j||_dS)N)rr;)rrr>r>rAregister_ops2szDatabase.register_opscCs|tkr|jrtStS|tkr-tS|tkrJ|jrFtStS|t	krg|jrct
StS|tkrwt
S|jrtStSdS)N)r5rrrr[rr3rrr4rrrZr)r?Zwrapper_typer>r>rAr26s



zDatabase.get_result_wrappercCs|jjr|jSdS)N)rurZ	lastrowid)r?rrzr>r>rAr|HszDatabase.last_insert_idcCs|jS)N)Zrowcount)r?rr>r>rArkLszDatabase.rows_affectedcCs"|j|j|j|j|jS)N)compiler_classr1r2r:r;)r?r>r>rArOszDatabase.compilercCs|j|jj|S)N)r#rrR)r?rdr>r>rAr&TszDatabase.executecCstj||f|j~|j}y|j||pAfWn4tk
r||jru|jru|jYnX|r|jr|j	WdQRX|S)N)
loggerdebugrrr&rget_autocommitrrollbackcommit)r?rKrLr$rr>r>rAr#Ws


zDatabase.execute_sqlcCsdS)Nr>)r?r>r>rAbeginfszDatabase.begincCs|jjdS)N)rr)r?r>r>rAriszDatabase.commitcCs|jjdS)N)rr)r?r>r>rArlszDatabase.rollbackcCs||j_dS)N)rr)r?rr>r>rAset_autocommitoszDatabase.set_autocommitcCs,|jjdkr"|j|j|jjS)N)rrr)r?r>r>rArrszDatabase.get_autocommitcCs|jjj|dS)N)rrry)r?transactionr>r>rApush_execution_contextwszDatabase.push_execution_contextcCs|jjjdS)N)rrr)r?r>r>rApop_execution_contextzszDatabase.pop_execution_contextcCst|jjS)N)rrr)r?r>r>rAexecution_context_depth}sz Database.execution_context_depthcCst|d|S)Nwith_transaction)ExecutionContext)r?rr>r>rAexecution_contextszDatabase.execution_contextcCs|jjj|dS)N)rrry)r?rr>r>rApush_transactionszDatabase.push_transactioncCs|jjjdS)N)rrr)r?r>r>rApop_transactionszDatabase.pop_transactioncCst|jjS)N)rrr)r?r>r>rAtransaction_depthszDatabase.transaction_depthcCs
t|S)N)r)r?r>r>rArszDatabase.transactioncs%tfdd}|S)Nc
s%j||SWdQRXdS)N)r)rr)rr?r>rArs
z)Database.commit_on_success.<locals>.inner)r)r?rrr>)rr?rAcommit_on_successs!zDatabase.commit_on_successcCs|jstt||S)N)
savepointsr	savepoint)r?sidr>r>rArs	zDatabase.savepointcCs
t|S)N)_atomic)r?r>r>rAatomicszDatabase.atomiccCs
tdS)N)r)r?rr>r>rA
get_tablesszDatabase.get_tablescCs
tdS)N)r)r?rrr>r>rAget_indexesszDatabase.get_indexescCs
tdS)N)r)r?rrr>r>rAget_columnsszDatabase.get_columnscCs
tdS)N)r)r?rrr>r>rAget_primary_keysszDatabase.get_primary_keyscCs
tdS)N)r)r?rrr>r>rAget_foreign_keysszDatabase.get_foreign_keyscCs
tdS)N)r)r?seqr>r>rAsequence_existsszDatabase.sequence_existscCs%|j}|j|j||S)N)rr#r)r?rxrqcr>r>rArszDatabase.create_tablecCst|d|dS)Nr)create_model_tables)r?r}rr>r>rA
create_tablesszDatabase.create_tablescsf|j}t|ttfs1td|fdd|D}|j|j||S)Nz=Fields passed to "create_index" must be a list or tuple: "%s"cs5g|]+}t|tr+jj|n|qSr>)rOrrur)rrK)rxr>rArs	z)Database.create_index.<locals>.<listcomp>)rrOrrrqr#r)r?rxrrrfobjsr>)rxrArs

zDatabase.create_indexcsf|j}t|ttfs1td|fdd|D}|j|j||S)Nz;Fields passed to "drop_index" must be a list or tuple: "%s"cs5g|]+}t|tr+jj|n|qSr>)rOrrur)rrK)rxr>rArs	z'Database.drop_index.<locals>.<listcomp>)rrOrrrqr#r)r?rxrrrrr>)rxrArs

zDatabase.drop_indexcCs(|j}|j|j|||S)N)rr#r)r?rxrrmrr>r>rArszDatabase.create_foreign_keycCs/|jr+|j}|j|j|SdS)N)	sequencesrr#r)r?rrr>r>rArs	zDatabase.create_sequencecCs(|j}|j|j|||S)N)rr#r)r?rxrrrr>r>rArszDatabase.drop_tablecCst|d|d|dS)Nrr)drop_model_tables)r?r}rrr>r>rAdrop_tablesszDatabase.drop_tablescCs(|j}|j|j|||S)N)rr#r)r?rxrrrr>r>rArszDatabase.truncate_tablecCs1x*tt|D]}|j||qWdS)N)rrlr)r?r}rrrzr>r>rAtruncate_tablesszDatabase.truncate_tablescCs/|jr+|j}|j|j|SdS)N)rrr#r)r?rrr>r>rArs	zDatabase.drop_sequencecCstjt|td|S)Nrp)rEXTRACTrr3)r?r
date_fieldr>r>rArszDatabase.extract_datecCstj||S)N)rZ
DATE_TRUNC)r?rrr>r>rA
truncate_dateszDatabase.truncate_datecCs
tdS)NzDEFAULT VALUES)r6)r?rxr>r>rArszDatabase.default_insert_clausecCsdS)NzSELECT 0 WHERE 0r>)r?r>r>rArcszDatabase.get_noop_sqlcCstS)N)r)r?r>r>rArszDatabase.get_binary_type)^rCrDrEr7r+rr<rXdistinct_ondrop_cascader:foreign_keysrfor_update_nowaitr{ryr2r|r;r1reserved_tablesrrrsubquery_delete_same_tablerwindow_functionsr"rrr#r$r+r,r1rrrrrrrrrrrrr4rrr2r|rkrr&r#rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrcrr>r>r>rAr
s		

rcsBeZdZeZddddddiZdZeoBejd/kZ	d0Z
ejdej
d
iZdZdfddZddZddZddZdddZdddZdddZddd Zdd!d"Zdd#d$Zdd%d&Zdd'd(Zd)d*Zd+d,Zd-d.ZS)1r5rr,rrr-FrKrrrZGLOBrzINSERT OR REPLACE INTONcs]|p	g|_|jdd}|r=|jjd|ftt|j|||dS)Njournal_mode)_pragmasrryrr5r)r?rZpragmasrrr)rr>rArs
zSqliteDatabase.__init__c	KsZtstdtj||}d|_y|j|Wn|jYnX|S)Nz&pysqlite or sqlite3 must be installed.)sqlite3r risolation_level_add_conn_hooksr)r?rrrr>r>rArs	
zSqliteDatabase._connectcCsJ|j||jddt|jddt|jddtdS)NrrJZ
date_truncr)_set_pragmasZcreate_functionrrr)r?rr>r>rArs
zSqliteDatabase._add_conn_hookscCsT|jrP|j}x.|jD]#\}}|jd||fqW|jdS)NzPRAGMA %s = %s;)rrr&r)r?rrZpragmarZr>r>rAr%s
	zSqliteDatabase._set_pragmasZDEFERREDcCs|jd|dddS)NzBEGIN %sr$F)r#)r?Z	lock_typer>r>rAr,szSqliteDatabase.begincCstddS)NzBSQLite does not support ALTER TABLE statements to add constraints.)r,)r?rxrrmr>r>rAr/sz!SqliteDatabase.create_foreign_keycCs)|jdd}dd|jDS)Nz<SELECT name FROM sqlite_master WHERE type = ? ORDER BY name;rcSsg|]}|dqS)rr>)rrr>r>rAr6s	z-SqliteDatabase.get_tables.<locals>.<listcomp>)r)r#r~)r?rrr>r>rAr3s		zSqliteDatabase.get_tablesc	s	d}|j|df}t|jt|jd}xG|jD]9}|d}t|ddk}|rYj|qYWixDtD]6}|jd|}dd|jD|<qWfd	dtDS)
NzQSELECT name, sql FROM sqlite_master WHERE tbl_name = ? AND type = ? ORDER BY namerzPRAGMA index_list("%s")rrJzPRAGMA index_info("%s")cSsg|]}|dqS)rJr>)rrr>r>rArKs	z.SqliteDatabase.get_indexes.<locals>.<listcomp>cs6g|],}t||||kqSr>)r)rr)
index_columnsindex_to_sqlrunique_indexesr>rArNs	)r#rr~rrrtr)	r?rrrlrrr	is_uniquerr>)rrrrrAr8s 	
!zSqliteDatabase.get_indexescs0|jd}fdd|jDS)NzPRAGMA table_info("%s")c	s?g|]5}t|d|d|dt|dqS)rrJrKr)rr)rr)rr>rArXs	z.SqliteDatabase.get_columns.<locals>.<listcomp>)r#r~)r?rrrr>)rrArVszSqliteDatabase.get_columnscCs*|jd|}dd|jDS)NzPRAGMA table_info("%s")cSs$g|]}|dr|dqS)rrr>)rrr>r>rAr]s	z3SqliteDatabase.get_primary_keys.<locals>.<listcomp>)r#r~)r?rrrr>r>rAr[szSqliteDatabase.get_primary_keyscs0|jd}fdd|jDS)NzPRAGMA foreign_key_list("%s")cs1g|]'}t|d|d|dqS)rKrJr)r)rr)rr>rAras	z3SqliteDatabase.get_foreign_keys.<locals>.<listcomp>)r#r~)r?rrrr>)rrAr_szSqliteDatabase.get_foreign_keyscCs
t||S)N)savepoint_sqlite)r?rr>r>rArdszSqliteDatabase.savepointcCstj||S)N)rr)r?rrr>r>rArgszSqliteDatabase.extract_datecCstjt||S)N)rrr)r?rrr>r>rArjszSqliteDatabase.truncate_datecCstjS)N)rBinary)r?r>r>rArmszSqliteDatabase.get_binary_type)rKrrrr)rCrDrErrr:rrsqlite_version_infor{r|r&rrr;rrrrrrrrrrrrrrrrr>r>)rrAr5s2	c@sBeZdZdZdZdZdZdddddddd	d
ddd
ddiZdZdZ	dZ
dZej
diZdgZdZdZdZdZdddZddZddZdddZdddZddd Zdd!d"Zdd#d$Zd%d&Zd'd(Zd)d*Zd+d,ZdS)-r.TrZBYTEArZBOOLEANroZ	TIMESTAMPrNUMERICrzDOUBLE PRECISIONrsZSERIALrrz%s~userNcKsmtstdtjd||}|jrVtjtj|tjtj||ri|j||S)Nzpsycopg2 must be installed.r)	psycopg2r rregister_unicode
pg_extensionsZ
register_typeUNICODEZUNICODEARRAYZset_client_encoding)r?rrrrr>r>rArs	
zPostgresqlDatabase._connectcCsR|j}|jdk	r.|jjr.|jjS|jrNd|j|jjfSdS)NFz	%s_%s_seq)rursrrrr)r?rzrGr>r>rA_get_pk_sequences
	
	z#PostgresqlDatabase._get_pk_sequencecCs|j|}|sdS|j}|jr;d|j}nd}|jd||f|jd}|jr~|j|S)Nz%s.rzSELECT CURRVAL('%s"%s"')r)rrurr&rrr)r?rrzrrGrresultr>r>rAr|s		
z!PostgresqlDatabase.last_insert_idZpubliccCs,d}dd|j||fjDS)NzSSELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = %s ORDER BY tablenamecSsg|]\}|qSr>r>)rr[r>r>rArs	z1PostgresqlDatabase.get_tables.<locals>.<listcomp>)r#r~)r?rrlr>r>rArszPostgresqlDatabase.get_tablescs>d}|j|d|f}fdd|jDS)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|dqS)rrrK,rJ)rr)rr)rr>rArs	z2PostgresqlDatabase.get_indexes.<locals>.<listcomp>)r#r~)r?rrrlrr>)rrArszPostgresqlDatabase.get_indexescsVd}|j||f}t|j|fdd|jDS)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|kqS)YES)r)rrrr)pksrr>rArs	z2PostgresqlDatabase.get_columns.<locals>.<listcomp>)r#rrr~)r?rrrlrr>)rrrArs
zPostgresqlDatabase.get_columnscCs8d}|j|d||f}dd|jDS)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>)rrr>r>rArs	z7PostgresqlDatabase.get_primary_keys.<locals>.<listcomp>)r#r~)r?rrrlrr>r>rArsz#PostgresqlDatabase.get_primary_keyscs;d}|j||f}fdd|jDS)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|dqS)rrrJ)r)rr)rr>rArs	z7PostgresqlDatabase.get_foreign_keys.<locals>.<listcomp>)r#r~)r?rrrKrr>)rrArsz#PostgresqlDatabase.get_foreign_keyscCs)|jd|f}t|jdS)Nz
            SELECT COUNT(*) FROM pg_class, pg_namespace
            WHERE relkind='S'
                AND pg_class.relnamespace = pg_namespace.oid
                AND relname=%sr)r#rr)r?rrWr>r>rArsz"PostgresqlDatabase.sequence_existscGs4djdgt|}|jd||dS)Nrz%szSET search_path TO %s)rrr#)r?Zsearch_pathZpath_paramsr>r>rAset_search_pathsz"PostgresqlDatabase.set_search_pathcCsdS)NzSELECT 0 WHERE falser>)r?r>r>rArcszPostgresqlDatabase.get_noop_sqlcCstjS)N)rr)r?r>r>rArsz"PostgresqlDatabase.get_binary_type) rCrDrEr7rXrrr:rrryr2r&rr;rrrrrrrr|rrrrrrrrcrr>r>r>rAr.psB	c@s*eZdZdZddgZdddddd	d
ddd
ddddiZdZdZd4Ze	j
de	jde	jdiZ
dZdZdZddZddd Zdd!d"Zdd#d$Zdd%d&Zdd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2ZdS)5r*Tr>z	UNION ALLrZBOOLrrrzDOUBLE PRECISIONrFLOATrszINTEGER AUTO_INCREMENTrZLONGTEXTrzVARCHAR(40)z%srJrrzLIKE BINARYrr`FzREPLACE INTOcKsctstdddddi}|j|d|krP|jd|d<tjd||S)	Nz%MySQLdb or PyMySQL must be installed.charsetutf8Zuse_unicodeTZpasswordZpasswdr~)mysqlr rrr)r?rrZconn_kwargsr>r>rArs
zMySQLDatabase._connectNcCsdd|jdDS)NcSsg|]\}|qSr>r>)rrr>r>rAr+s	z,MySQLDatabase.get_tables.<locals>.<listcomp>zSHOW TABLES)r#)r?rr>r>rAr*szMySQLDatabase.get_tablescs|jd}tix\|jD]N}|dsPj|dj|dg|dj|dq/WfddDS)NzSHOW INDEX FROM `%s`rrJrcs2g|](}t|d||kqS)N)r)rr)indexesrrr>rAr6s	z-MySQLDatabase.get_indexes.<locals>.<listcomp>)r#rr~rtrry)r?rrrrr>)rrrrAr-s	
zMySQLDatabase.get_indexescsPd}|j|f}t|jfdd|jDS)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|kqS)r)r)rrrr)rrr>rAr@s	z-MySQLDatabase.get_columns.<locals>.<listcomp>)r#rrr~)r?rrrKrr>)rrrAr9s
zMySQLDatabase.get_columnscCs*|jd|}dd|jDS)NzSHOW INDEX FROM `%s`cSs*g|] }|ddkr|dqS)rJZPRIMARYrr>)rrr>r>rArEs	z2MySQLDatabase.get_primary_keys.<locals>.<listcomp>)r#r~)r?rrrr>r>rArCszMySQLDatabase.get_primary_keyscs8d}|j|f}fdd|jDS)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)rrrr)rr>rArQs	z2MySQLDatabase.get_foreign_keys.<locals>.<listcomp>)r#r~)r?rrrlrr>)rrArGszMySQLDatabase.get_foreign_keyscCs%tjtt|td|S)Nrp)rrrr3)r?rrr>r>rArTszMySQLDatabase.extract_datecCstj|t|S)N)rZDATE_FORMATMYSQL_DATE_TRUNC_MAPPING)r?rrr>r>rArWszMySQLDatabase.truncate_datecCstt|jjtdS)NzVALUES (DEFAULT))rrjrursr6)r?rxr>r>rArZsz#MySQLDatabase.default_insert_clausecCsdS)NzDO 0r>)r?r>r>rArc_szMySQLDatabase.get_noop_sqlcCstjS)N)rr)r?r>r>rArbszMySQLDatabase.get_binary_typell)rCrDrEr7r<r:rr2r|r&rrrr;r1rrrrrrrrrrrrcrr>r>r>rAr*s:		

c@seZdZddZdS)_callable_context_managercs%tfdd}|S)Nc
s||SWdQRXdS)Nr>)rr)rr?r>rArhsz1_callable_context_manager.__call__.<locals>.inner)r)r?rrr>)rr?rA__call__gs!z"_callable_context_manager.__call__N)rCrDrErr>r>r>rArfsrc@s7eZdZdddZddZddZdS)	rTcCs||_||_d|_dS)N)rrr)r?rrr>r>rAros		zExecutionContext.__init__c
Cst|jja|jj||jj|jj|jj|_|jri|jj|_|jj	WdQRX|S)N)
rrrrrrrrtxnr)r?r>r>rArts
			zExecutionContext.__enter__cCs|jj|jdkr,|jjn]z9|jrd|sN|jjd|jj|||Wd|jj|jj|jXWdQRXdS)NF)	rrrrrrrrr)r?rexc_valexc_tbr>r>rArs
	
zExecutionContext.__exit__N)rCrDrErrrr>r>r>rArnsrcsIeZdZdfddZfddZfddZS)r:Tcs&tt|j||||_dS)N)rr:rr})r?rr}r)rr>rArszUsing.__init__csUg|_x6|jD]+}|jj|jj|j|j_qWtt|jS)N)_origr}ryrurrr:r)r?rz)rr>rArs
	zUsing.__enter__csStt|j|||x0t|jD]\}}|j||j_q,WdS)N)rr:rrcr}rrur)r?rrrrrz)rr>rArszUsing.__exit__)rCrDrErrrr>r>)rrAr:sc@s4eZdZddZddZddZdS)rcCs
||_dS)N)r~)r?r~r>r>rArsz_atomic.__init__cCsI|jjdkr*|jj|_n|jj|_|jjS)Nr)r~rr_helperrr)r?r>r>rArsz_atomic.__enter__cCs|jj|||S)N)rr)r?rrrr>r>rArsz_atomic.__exit__N)rCrDrErrrr>r>r>rArsrc@s^eZdZddZddZdddZddd	Zd
dZdd
ZdS)rcCs
||_dS)N)r~)r?r~r>r>rArsztransaction.__init__cCs|jjdS)N)r~r)r?r>r>rA_beginsztransaction._beginTcCs!|jj|r|jdS)N)r~rr)r?rr>r>rArs
ztransaction.commitcCs!|jj|r|jdS)N)r~rr)r?rr>r>rArs
ztransaction.rollbackcCsU|jj|_|jjd|jjdkrA|j|jj||S)NFr)r~rrrrrr)r?r>r>rArs
ztransaction.__enter__cCsz[|r|jdnA|jjdkrZy|jdWn|jdYnXWd|jj|j|jjXdS)NFr)rr~rrrrr)r?rrrr>r>rArs
ztransaction.__exit__N)	rCrDrErrrrrrr>r>r>rArsrc@s[eZdZdddZddZddZdd	Zd
dZdd
ZdS)rNcCsJ||_|j}|p+dtjj|_|j|j|_dS)NrV)r~rrZuuid4rrrI
quoted_sid)r?r~rZ	_compilerr>r>rArs	zsavepoint.__init__cCs|jj|dddS)Nr$F)r~r#)r?rlr>r>rAr%szsavepoint._executecCs|jd|jdS)NzRELEASE SAVEPOINT %s;)r%r)r?r>r>rArszsavepoint.commitcCs|jd|jdS)NzROLLBACK TO SAVEPOINT %s;)r%r)r?r>r>rArszsavepoint.rollbackcCs:|jj|_|jjd|jd|j|S)NFz
SAVEPOINT %s;)r~r_orig_autocommitrr%r)r?r>r>rArszsavepoint.__enter__cCsXz=|r|jn&y|jWn|jYnXWd|jj|jXdS)N)rrr~rr)r?rrrr>r>rArs

zsavepoint.__exit__)	rCrDrErr%rrrrr>r>r>rArsrcs4eZdZfddZfddZS)rcsR|jj}|jdk	r6|j|_d|_n	d|_tt|jS)N)r~rr_orig_isolation_levelrrr)r?r)rr>rArs	zsavepoint_sqlite.__enter__csLz tt|j|||SWd|jdk	rG|j|jj_XdS)N)rrrrr~rr)r?rrr)rr>rArs
zsavepoint_sqlite.__exit__)rCrDrErrr>r>)rrArsrc@sXeZdZddZddZddZddZd	d
ZddZd
S)rcCs%||_|jj|_||_dS)N)rrxrzr)r?rrr>r>rArs	zFieldProxy.__init__cCst|j|jS)N)rrr)r?r>r>rArszFieldProxy.clone_basecCs|jj|S)N)rrV)r?rZr>r>rArVszFieldProxy.coercecCs|jj|S)N)rr)r?rZr>r>rArszFieldProxy.python_valuecCs|jj|S)N)rr)r?rZr>r>rArszFieldProxy.db_valuecCs#|dkr|jSt|j|S)Nrx)rrr)r?rr>r>rArszFieldProxy.__getattr__N)	rCrDrErrrVrrrr>r>r>rArsrc@s[eZdZddZddZddZddd	Zd
dZdd
ZdS)rcCs||jd<dS)Nrx)r)r?rxr>r>rAr#szModelAlias.__init__cCs2t|j|}t|tr.t||S|S)N)rrxrOrr)r?rr r>r>rAr&s
zModelAlias.__getattr__cCstddS)Nz-Cannot set attributes on ModelAlias instances)r)r?rrZr>r>rAr,szModelAlias.__setattr__Fcs;jj}|r|jn|j}fdd|DS)Ncsg|]}t|qSr>)r)rrK)r?r>rAr2s	z/ModelAlias.get_proxy_fields.<locals>.<listcomp>)rxrur
sorted_fields)r?rZmmrr>)r?rAr/szModelAlias.get_proxy_fieldscGsF|s|j}t||}|jjrB|j|jj}|S)N)rrxrurY)r?r;rlr>r>rAr4szModelAlias.selectcKs
|j|S)N)rx)r?rr>r>rAr<szModelAlias.__call__N)	rCrDrErrrrrrr>r>r>rAr"src@sjeZdZdZddZddZddZd	d
ZddZd
dZ	ddZ
dS)r_keys_itemscCsg|_g|_dS)N)r
r)r?r>r>rArCs	z_SortedFieldList.__init__cCs|j|S)N)r)r?rr>r>rAr'Gsz_SortedFieldList.__getitem__cCs
t|jS)N)rr)r?r>r>rArJsz_SortedFieldList.__iter__cCsD|j}t|j|}t|j|}||j||kS)N)rrr
rr)r?itemkrrr>r>rAr(Ms	z_SortedFieldList.__contains__cCs|jj|jS)N)r
rr)r?rr>r>rArSsz_SortedFieldList.indexcCsE|j}t|j|}|jj|||jj||dS)N)rrr
insertr)r?rr
rr>r>rArVs	z_SortedFieldList.insertcCs'|j|}|j|=|j|=dS)N)rrr
)r?rrdr>r>rAremove\s
z_SortedFieldList.removeN)r
r)rCrDrErrr'rr(rrrr>r>r>rAr@src@seZdZdS)rN)rCrDrEr>r>r>rArasz	peewee.dbc
@seZdZdddddddddddddZddZdd	Zd
dZdd
ZddZddZ	ddZ
ddZddddZddddZ
ddZdddZdS)ModelOptionsNTFc
Ks||_|jj|_i|_i|_i|_i|_i|_i|_	g|_
t|_g|_
g|_t|_g|_|dk	r|nt|_||_||_t|pg|_||_||_||_|	|_|
|_||_||_d|_d|_ i|_!i|_"x*|
j#D]\}}t$|||q?Wt|
j%|_&|jr|jr|j||_dS)NF)'rxrCrrrrrv_default_by_namertru_default_callable_listr_sorted_field_listr	sorted_field_namesrrrrdefault_databaserr
db_table_funcrrrYrsrerrronly_save_dirtyrrrrvr)rr_additional_keys)r?rrrrrrYrsrerrrrrrrZr>r>rArisD																								zModelOptions.__init__cCsd|jj|jfS)Nz<%s: %s>)rrCr)r?r>r>rAr%szModelOptions.__repr__cCs|jrg}x|jD]}t|trV|jdkrCdnd}||j}|j|jd}|jdr|j|j	q|j|j
qW||_dS)Nrrr)rYrOrrrrlstripr-ryrr)r?Z
norm_order_byrr&rr>r>rArs	
zModelOptions.preparedcCst|j|_dd|jD|_t|jjt|jjBt|jfB|_	dd|jD|_
dS)NcSsg|]}|jqSr>)r)rrKr>r>rArs	z4ModelOptions._update_field_lists.<locals>.<listcomp>cSs%g|]}t|ts|qSr>)rOr)rrr>r>rArs	)rrr	rrrrrwrsrrr)r?r>r>rA_update_field_listss
%z ModelOptions._update_field_listscCs|j|j||j|j<||j|j<|jj||j|jdk	r|j|j	|<t
|jr|j|j|<|jj
|j|jfn#|j|j|<|j|j|j<dS)N)remove_fieldrrrrrrrrrvrrurryrtr)r?rr>r>rArs
zModelOptions.add_fieldcCs||jkrdS|jj|}|j|j=|jj||j|jdk	r|j|=|j	j|drxlt
|jD]/\}\}}||kr|jj|PqWn)|jj|d|j
j|jddS)N)rrrrrrrrrvrurcrrtrr)r?rZoriginalrrr_r>r>rArs


"zModelOptions.remove_fieldcCs:|jj}x$|jD]\}}|||<qW|S)N)rrr)r?Zddrrr>r>rAget_default_dictszModelOptions.get_default_dictcCs1y|jj|SWntk
r,dSYnXdS)Nrr)rrrq)r?rr>r>rAget_field_indexs
zModelOptions.get_field_indexcs0jr&fddjjDSjgS)Ncsg|]}j|qSr>)r)rr)r?r>rArs	z7ModelOptions.get_primary_key_fields.<locals>.<listcomp>)rrsr)r?r>)r?rArs	z#ModelOptions.get_primary_key_fieldsc	Cst|t}|o"t|t}|r1g}x|jD]}}t|tr;|j|kr;|dkp|r|j|jkp|o|j|jk}|r;|s|S|j|q;W|r|SdS)N)	rOrrr	rrrrry)	r?rzrmultiZis_fieldZis_noderrZis_matchr>r>rAryszModelOptions.rel_for_modelcCs|jj|j||S)N)ruryrx)r?rzrrr>r>rArzsz"ModelOptions.reverse_rel_for_modelcCs|j|p|j|S)N)ryrz)r?rzr>r>rArszModelOptions.rel_existscCsg}|jg}x|r|j}||kr6q|j|x*|jjjD]}|j|jqVW|rx*|jjjD]}|j|jqWqW|S)N)rxrryrurrwrrv)r?backrefsr}rrzrnr>r>rArelated_modelss	
zModelOptions.related_models)rCrDrErr%rrrrrrrryrzrr r>r>r>rArhs 			(	rc
sUeZdZeddddddddd	g	Zfd
dZdd
ZS)	BaseModelrrrrrYrsrrrcs8|tks|djtkr>ttj|||Si}|jdd}|rx6|jjD]%\}}|jdsl|||<qlWt	|dd}d}	x|D]}
t
|
dsqt	|
d}|	dkrt|j}	j
|jB}x?|jjD].\}}||kr||kr|||<qWxZ|
jjD]I\}}||krsqXt|trX|jjsXt|j||<qXWqWttj||||jdt}
|
|_d_tjjj_jjs?tjddjjj_g}xvjjD]e\}}t|trU|jr|rtdqU|jr||}}qU|j||fqUWd	}|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
rt'dfdddj}dj(i}t)|t*f|}|_*jj+t
dr'j,t-j.S)NrZMetar_rsruZmodel_options_basez[^\w]+zprimary key is overdetermined.FTr`Z_composite_key__unicode__r%csdj|jfS)Nz<%s: %r>)rCr")r?)rr>rArQbsz#BaseModel.__new__.<locals>.<lambda>z%sDoesNotExistrDvalidate_model)/rFrCrr!__new__rrr)r-rrrrsinheritablerrOrrrrrurrrrrrrrrqryrr0rrrrrrrrDrrrr#rr)rrbasesZattrsZmeta_optionsrGr
vZmodel_pkZ	parent_pkb	base_metaZall_inheritableZModelOptionsBaserrZpk_namerrZexc_nameZ	exc_attrsZexception_class)r)rrAr$s
!	$	
	


zBaseModel.__new__cCst|jS)N)rr)r?r>r>rArrszBaseModel.__iter__)rCrDrErr%r$rr>r>)rrAr!
s
`r!c@seZdZddZeddZeddZeddd	Zedd
dZedd
dZ	eddZ
eddZeddZeddZ
eddZeddZeddZeddZedd Zed!d"d#Zed$d%Zed&d'Zed(d)Zed!d*d+Zed,d-Zed!d!d.d/Zed!d!d0d1Zed2d3Zed4d5Zd6d7ZeZd8d9ZeZ d:d;Z!d<d=Z"d>d?Z#d@dAZ$dBdCZ%d!ddDdEZ&dFdGZ'e(dHdIZ)d!dJdKZ*d!d!dLdMZ+dNdOZ,dPdQZ-dRdSZ.dS)Tr)cOs^|jj|_t|j|_i|_x*|jD]\}}t|||q:WdS)N)rurrrrrr)r)r?rrr
r'r>r>rArvs
	zModel.__init__cCs
t|S)N)r)rr>r>rAr~szModel.aliascGs4t||}|jjr0|j|jj}|S)N)rxrurY)rr;rlr>r>rArszModel.selectNcs<|p	i}|jfddDt|S)Ncs*g|] }jj||fqSr>)rur)rrK)rrr>rArs	z Model.update.<locals>.<listcomp>)rrh)r_Model__datarfdictr>)rrrArs#zModel.updatecs<|p	i}|jfddDt|S)Ncs*g|] }jj||fqSr>)rur)rrK)rrr>rArs	z Model.insert.<locals>.<listcomp>)rrl)rr*rr+r>)rrrArs#zModel.insertTcCst|d|d|S)Nrprq)rl)rrprqr>r>rAr{szModel.insert_manycCst|d|d|S)Nrrl)rl)rrrlr>r>rAinsert_fromszModel.insert_fromcCs
t|S)N)r)rr>r>rArszModel.deletecGst|||S)N)r*)rrKrLr>r>rArSsz	Model.rawcKs*||}|jdd|j|S)Nforce_insertT)saver)rrlrr>r>rAcreates
zModel.createcOsF|jj}|r'|j|}|r<|j|}|jS)N)rrJrrOr)rrlrsqr>r>rArsz	Model.getcKsd|jdi}|j}x\|jD]N\}}d|kr[|j||i}q+|jt|||k}q+Wy|jdfSWn|jk
r_y]tdd|jD}|j	||j
jj|j
|dfSWdQRXWnWtk
rZ}z7y|jdfSWn|jk
rG|YnXWYdd}~XnXYnXdS)NrvrFcss-|]#\}}d|kr||fVqdS)rNr>)rr
r'r>r>rArs	z&Model.get_or_create.<locals>.<genexpr>T)rrr)rOrrrrrrrurrr/r")rrrvrlrrZrLexcr>r>rA
get_or_creates&"
zModel.get_or_createcKsy1|jjj|j|dfSWdQRXWn|tk
rg}xN|jD]@\}}t||}|js|jrT|j	||kqTW|j
|dfSYnXdS)NTF)rurrr/r"r)rrrsryr)rrrlrrZrr>r>rA
create_or_gets
zModel.create_or_getcOs|jj||S)N)rrO)rZdqrlr>r>rArOszModel.filtercCsAi}|jjr"|jj|d<|jj|jjj|kS)Nr)rurrrr)rrr>r>rAtable_existsszModel.table_existsFcCs|r|jrdS|jj}|jj}|jrn|dk	rn|jrn|j|jsn|j|j|j||j	dS)NF)
r4rurrsrrrrr_create_indexes)rrr~rr>r>rArs
zModel.create_tablecCsdg}xW|jjD]I}|jr%qt|j|jt|tf}|r|j|qW|S)N)	rur	rsrbrrrOrry)rrrZrequires_indexr>r>rA_fields_to_indexs	zModel._fields_to_indexcCs/tjdd|jD|jjp+fS)NcSs"g|]}|f|jfqSr>)r)rrr>r>rArs	z%Model._index_data.<locals>.<listcomp>)	itertoolschainr6rur)rr>r>rA_index_dataszModel._index_datacCs:x3|jD]%\}}|jjj|||q
WdS)N)r9rurr)r
field_listrr>r>rAr5szModel._create_indexescCs:x3|jD]%\}}|jjj|||q
WdS)N)r9rurr)rrr:rr>r>rA
_drop_indexes
szModel._drop_indexescsg}jjj}jj}jjjrU|jrU|j|j|j|j|jx6j	D](}|j|j
|g|jqxWjjrxOjjD]A\}}fdd|D}|j|j
||qWdd|DS)Ncs g|]}jj|qSr>)rur)rrK)rr>rArs	z Model.sqlall.<locals>.<listcomp>cSsg|]\}}|qSr>r>)rrKr_r>r>rAr s	)
rurrrsrrryrrr6rrr)rZqueriesrrrrrrr>)rrAsqlalls& zModel.sqlallcCs|jjj|||dS)N)rurr)rrrr>r>rAr"szModel.drop_tablecCs|jjj|||dS)N)rurr)rrrr>r>rAr&szModel.truncate_tablecCs5|jjr%t|jj|jjSt|jjS)N)rurrr)rr>r>rAr*szModel.as_entitycOst|||S)N)rb)rrrr>r>rAnoop0sz
Model.noopcCst||jjjS)N)rrursr)r?r>r>rAr4szModel._get_pk_valuecCs)|jjs%t||jjj|dS)N)rurrrsr)r?rZr>r>rA
_set_pk_value8szModel._set_pk_valuecCs|jj|jkS)N)rursr)r?r>r>rA_pk_expr=szModel._pk_exprcCs|jj|jdS)N)rclearr)r?r>r>rAr@s
zModel._prepare_instancecCsdS)Nr>)r?r>r>rArDszModel.preparedcCs>i}x1|D])}|j|kr
||j||j<q
W|S)N)r)r?rNonlyZnew_datarr>r>rA
_prune_fieldsGs

zModel._prune_fieldscCsx|jjD]y}||jkoS||koS||dkoS|jj|dk	}|r
t||t|||j|||<q
WdS)N)rurrrrrrr)r?rNrZ
conditionsr>r>rA_populate_unsaved_relationsNsz!Model._populate_unsaved_relationsc	Cst|j}|jjdk	r<|jj}|j}n
d}}|ra|j||}n?|jjr|r|j||j}|s|jj	dS|j
||dk	r-|r-|jjrx7|jD]}|j
|dqWn|j
|jd|j|j|jj}nb|dkrU|j|jd}n:|j|j}|dk	r||}|j|d}|jj	|S)NFr)rrrursrrBrdirty_fieldsrr@rCrrrrrrr?r&rr>)	r?r-rArNZpk_fieldZpk_valueZpk_part_namerpZpk_from_cursorr>r>rAr.Ys>


'	

z
Model.savecCs
t|jS)N)rr)r?r>r>rAis_dirty~szModel.is_dirtycsfddjjDS)Ncs(g|]}|jjkr|qSr>)rr)rrK)r?r>rArs	z&Model.dirty_fields.<locals>.<listcomp>)rur	)r?r>)r?rArDszModel.dirty_fieldsccs=t|}|jj|j}t||fg}t}x|r8|j\}}||kroqH|j|x|jjj	D]\}}|j
}	|j|kr||j|j
jk}
|	jj|
}n||>}
|	jj|
}|js|r&|j|	|f|
|fVqWqHWdS)N)rrrr?rrrtrurvr)rxrrrrrry)r?Zsearch_nullablerxrlrrklassZrel_namernrr
subqueryr>r>rAdependenciess&		
	
zModel.dependenciescCs|r|j|}xztt|D]f\}}|j}|jru|ru|j|jdij|jq(|j	j|jq(W|j	j|j
jS)N)rHrrrxrrrrr&rr?)r?Z	recursiveZdelete_nullablerHrlrnrzr>r>rAdelete_instances	(zModel.delete_instancecCst|j|jfS)N)rrr)r?r>r>rArszModel.__hash__cCs:|j|jko9|jdk	o9|j|jkS)N)rr)r?rr>r>rAr'szModel.__eq__cCs||kS)Nr>)r?rr>r>rAr(szModel.__ne__)/rCrDrErr4rrrrr{r,rrSr/rr2r3rOr4rr6r9r5r;r<rrrr=rZget_idr>Zset_idr?rrrBrCr.rErrDrHrIrr'r(r>r>r>rAr)usb	

%cCs |j}d|_|_|S)N)rrwrx)rlr>r>rAclean_prefetch_subquerysrJcsat|g}xKt|D]=\}}t|trF|\}}nd}t|trwt|trw|j}|jd}}xt	t
|dD]}||}	|	j}
|	jj
jdd}|rfdd|D}fdd|D}nj
jdd}|s:|r|ksR|dkrPqW|p`|s|rsd|nd}
td	||
f|rt|
ttjfd
dt||D}|j|}|jt||dq|rt|
ttjfdd|D}|j|}|jt||dqW|S)
NrrTcs"g|]}t|jqSr>)rr)rrn)subquery_modelr>rArs	z)prefetch_add_subquery.<locals>.<listcomp>cs%g|]}t|jjqSr>)rrr)rrn)
last_modelr>rArs	z	 using %srz1Error: unable to find foreign key for query: %s%scs)g|]\}}|j|>qSr>)r)rrnr)cleanedr>rArs	Fcs&g|]}|jj|>qSr>)rr)rr)rMr>rArs	)PrefetchResultrcrOrrrr)rrxrrrlrzruryrrJrNrrrrry)r0
subqueries
fixed_queriesrrGZtarget_modelZfksrrprefetch_resultZ
last_queryZrelsrZtgt_errexprr>)rMrLrKrAprefetch_add_subquerysT	

						
rS__prefetchedrlrr
rel_models
field_to_namerzcsIeZdZdddddfddZddZddZS)rNNcs|rp|r5dd|D}dd|D}n&dd|D}dd|D}tt||}|j}tt|j|||||||S)NcSsg|]}|jqSr>)rx)rrr>r>rArs	z*PrefetchResult.__new__.<locals>.<listcomp>cSsg|]}|jjqSr>)rr)rrr>r>rArs	cSsg|]}|jqSr>)r)rrr>r>rArs	cSsg|]}|jqSr>)r)rrr>r>rArs	)rrrxrrNr$)rrlrrrUrVrzZforeign_key_attrs)rr>rAr$s	zPrefetchResult.__new__c
Cs|jr_x|jD]E}|j|j}||f}||krt||j||qWnx|jD]{\}}|j|jj}||f}|j|g}d|j}x|D]}	t|	||qWt|||qiWdS)Nz%s_prefetch)	rrrrrrVrrr
)
r?r	id_maprZ
identifierrattnameZ
rel_instancesrrrr>r>rApopulate_instances	

z PrefetchResult.populate_instancecCszxs|jD]h\}}|jj|j|}||f}|jrQ|||<q
|j|g||j|q
WdS)N)rVrrrrrry)r?r	rWrrXrrr>r>rAstore_instance
s	
zPrefetchResult.store_instance)rCrDrEr$rYrZr>r>)rrArNs	
rNcGs|s
|St||}i}i}xt|D]}|j}|jrx2|jD]'}|j|g||j|qTWi||<||}t|j|}	x\|j	D]Q}
|jr|j
|
||	rx)||D]}|j|
||jqWqWq2W|j	S)N)rSrrzrrUrryrrrlrZrY)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_kwargsrr>r>rAr4srcKs.x'tt|D]}|j|qWdS)z6Drop tables for all given models (in the right order).N)rrlr)r}Zdrop_table_kwargsrr>r>rAr9sr)rrorrr7loggingrrr^rrrrZbisectrrcollectionsrrrImportErrorrrr	functoolsrinspectr	__version____all__r=Handler	getLoggerr
addHandlerrFobjectrIversion_infoZPY2rarbuiltinsrMrNrrrrTrrrrarrrr\unicodebufferexecRuntimeErrorrergZ	pysqlite2rhZpysq3rrZpsycopg2cffiriregisterrrjrZMySQLdbrZpymysqlZplayhouse._speedupsrkrlrmrrrrZregister_adapterrrZDATETIME_PARTSrrrrrrrrrr&r%rr'rr(rr&r5r[r3r4rZrrrrrrrrrrrrrrrr2rrrr6r3rrPrr!r-rbrrirjr<rrrmrnrwrrr
r!rr4r0rrrrrrrr7rr;rrrrr8r9r
rrrrrr!r+rrrrrrrrrrrr*r6rxrbrrrdrhrlrrrrrrr rrr"r#r$r+r,r1rrlocalrrr5r.r*rrr:rrrrrrrrrrr!r)rJrSrTrNr/rrr>r>r>rA<module>s
	









	"
	

															

%	+M{&	7" {R#0	
(<'	;u`'#!h?2+
Back to Directory File Manager