Viewing File: /opt/alt/python35/lib64/python3.5/site-packages/__pycache__/peewee.cpython-35.opt-1.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:%McCs&|s
dSt|t}t||S)N)rkSQLITE_DATETIME_FORMATSgetattr)lookup_typedatetime_stringdtr>r>rA_sqlite_date_partsrz%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)rkrstrftimeSQLITE_DATE_TRUNC_MAPPING)rrrr>r>rA_sqlite_date_trunc&srcCstj||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__)rCrDrEr	r>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)rrrrr
)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)rOPrr)r?r r>r>rA__eq__'szNode.__eq__cCs2|dkrt|tjdSt|tj|S)N)rr$rr)r?r r>r>rA__ne__+szNode.__ne__cCst|tj|S)N)rr$r)r?r r>r>rAin_=szNode.in_cCst|tj|S)N)rr$r)r?r r>r>rAnot_in?szNode.not_incCs,|rt|tjdSt|tjdS)N)rr$rr)r?is_nullr>r>rAr)AszNode.is_nullcCst|tjd|S)Nz%%%s%%)rr$r)r?r r>r>rAcontainsEsz
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>rAendswithIsz
Node.endswithcCs%t|tjt|td|S)Nr)rr$rrr3)r?lowhighr>r>rArKszNode.betweencCst|tj|S)N)rr$r)r?
expressionr>r>rArMszNode.regexpcCst|tj|S)N)rr$r)r?r r>r>rAconcatOszNode.concat)LrCrDrErrrP
_node_typerclassmethodrrrrrrrrrrrr#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,rrr0r>r>r>rAr
sh			
r
cs:eZdZdZdZfddZddZS)r6z2An unescaped SQL string, with optional parameters.sqlcs)||_||_tt|jdS)N)rZparamsrr6r)r?rZrJ)rr>rArVs		zSQL.__init__cCst|j|jS)N)r6rZrJ)r?r>r>rAr[szSQL.clone_base)rCrDrErr1rrr>r>)rrAr6RscsFeZdZdZdZfddZddZddZS)	rz/A quoted-name or entity, e.g. "table"."column".entitycs tt|j||_dS)N)rrrpath)r?rL)rr>rArcszEntity.__init__cCs
t|jS)N)rrL)r?r>r>rArgszEntity.clone_basecCsttd|j|fS)N)rfilterrL)r?rr>r>rArjszEntity.__getattr__)rCrDrErr1rrrr>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_coercerrNr)r?rrQ)rr>rArrs		$z
Func.__init__TcCs
||_dS)N)rS)r?coercer>r>rArTxszFunc.coercecCs%t|j|j}|j|_|S)N)rNrrQrS)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?rVrWwindowrIr>r>rAoversz	Func.overcsfdd}|S)Ncst||S)N)rN)rr)rr>rAdecszFunc.__getattr__.<locals>.decr>)r?rr[r>)rrArszFunc.__getattr__)rOrP)
rCrDrErr1rrRrrrTrrZrr>r>)rrArNms
rNcs=eZdZdZdZdfddZddZS)rz0A binary expression, e.g `foo + 1` or `bar < 7`.r/Fcs;tt|j||_||_||_||_dS)N)rrrlhsr"r flat)r?r\r"r r])rr>rArs
			zExpression.__init__cCst|j|j|j|jS)N)rr\r"r r])r?r>r>rArszExpression.clone_base)rCrDrErr1rrr>r>)rrArsrcs=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?rZr_)rr>rArs		zParam.__init__cCst|j|jS)N)r-rZr_)r?r>r>rArszParam.clone_base)rCrDrErr1rrr>r>)rrAr-sc@seZdZdZdS)PassthroughpassthroughN)rCrDrEr1r>r>r>rAr`sr`csFeZdZdZdZdZdZfddZddZS)	rz8A SQL clause, one or more Node objects joined by spaces.clause FcsXd|kr|d|_d|kr2|d|_tt|jt||_dS)Nglueparens)rdrerrrrnodes)r?rfr)rr>rArs

zClause.__init__cCs+t|j}|j|_|j|_|S)N)rrfrdre)r?rr>r>rArszClause.clone_base)	rCrDrErr1rdrerrr>r>)rrArsc@seZdZdZdZdS)CommaClausez5One or more Node objects joined by commas, no parens.z, N)rCrDrErrdr>r>r>rArgsrgc@seZdZdZdZdS)EnclosedClausezAOne or more Node objects joined by commas and enclosed in parens.TN)rCrDrErrer>r>r>rArhsrhcs@eZdZddfddZddZddZS)r<Ncs;tt|j||_||_|jp1d|_dS)Nw)rr<rrVrWr)r?rVrW)rr>rArs		zWindow.__init__cCsrg}|jr4|jttdt|j|jrb|jttdt|jtt|S)NzPARTITION BYzORDER BY)rVryrr6rgrWrh)r?Zover_clausesr>r>rArXs						zWindow.__sql__cCst|j|jS)N)r<rVrW)r?r>r>rArszWindow.clone_base)rCrDrErrXrr>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?rj)rr>rArszDQ.__init__cCs
t|jS)N)rrj)r?r>r>rArsz
DQ.clone_base)rCrDrErrrr>r>)rrArscs(eZdZdZfddZS)_StripParensrmcs tt|j||_dS)N)rrkrr)r?r)rr>rArsz_StripParens.__init__)rCrDrEr1rr>r>)rrArksrk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?rrprfk_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
ModelAliasrxrv)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)Nrmrnrorprrqr{rrrrsrt)rrorprOonr
rrrNr6r
FieldProxyrrufieldsrzto_fieldrr\rrl)
r?rorpZ
join_aliasrtZon_fieldryrrrqZtarget_attrr>r>rA_join_metadatasH$'
		zJoin._join_metadatacCs%t|ds|j|_|jS)N_cached_metadata)hasattrrr)r?r>r>rAmetadataPsz
Join.metadata)	rCrDrErzr|rrpropertyrr>r>r>rAru	s
1ruZ_Joinr{rc@s7eZdZddZdddZddZdS)FieldDescriptorcCs||_|jj|_dS)N)rratt_name)r?rr>r>rArYs	zFieldDescriptor.__init__NcCs&|dk	r|jj|jS|jS)N)_datagetrr)r?rrr>r>rAr	]szFieldDescriptor.__get__cCs'||j|j<|jj|jdS)N)rr_dirtyrt)r?rrZr>r>rA__set__bszFieldDescriptor.__set__)rCrDrErr	rr>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_columndefaultchoicesrqsequenceconstraintsschemar_field_counter_order	_sort_key	_is_boundrr)
r?rrrrrrrrrqrrr)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)
Nrrrrrrrrrqrrr)rrrrrrrrrrqrrrrrrx)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_+rcTN)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>rArTszField.coercecCs|dkr|S|j|S)z5Convert the python value for storage in the database.N)rT)r?rZr>r>rAdb_valueszField.db_valuecCs|dkr|S|j|S)z/Convert the database value to a pythonic value.N)rT)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'))	rrrryr6rqrrr)r?rddlr>r>rA__ddl__s				z
Field.__ddl__cCst|jd|jjS)N.)hashrrxrC)r?r>r>rA__hash__szField.__hash__)rCrDrErrrr1rrrrrrrrrTrrrrrrr>r>)rrArfs,		
cs=eZdZdZdfddZfddZS)r
bareNcs2tt|j|||dk	r.||_dS)N)rr
rrT)r?rTrr)rr>rArszBareField.__init__cstt|jd|j|S)NrT)rr
rrT)r?r)rr>rArszBareField.clone_base)rCrDrErrrr>r>)rrAr
sc@seZdZdZeZdS)r!intN)rCrDrErrrTr>r>r>rAr!sc@seZdZdZdS)rbigintN)rCrDrErr>r>r>rArsc@seZdZdZdS)r4smallintN)rCrDrErr>r>r>rAr4scs(eZdZdZfddZS)r0rqcs'd|d<tt|j||dS)NTrq)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)rCrDrErrrTr>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>rArTHszCharField.coerce)rCrDrErrrrrTr>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>rArTWszTextField.coerceN)rCrDrErrTr>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)rCrDrErrrTr>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?rZrel_idrr>r>rAget_object_or_idsz#RelationDescriptor.get_object_or_idNcCs |dk	r|j|S|jS)N)rr)r?rrr>r>rAr	s
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?rrZZ
orig_valuer>r>rAr s
zRelationDescriptor.__set__)rCrDrErrrr	rr>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?rrr>r>rAr	2s"z!ReverseRelationDescriptor.__get__)rCrDrErrr	r>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?rrr>r>rAr	>szObjectIdDescriptor.__get__cCst||j|dS)N)rr)r?rrZr>r>rArCszObjectIdDescriptor.__set__)rCrDrErrr	rr>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_namerrrrrr)rr>rArGs						zForeignKeyField.__init__csOtt|jd|jd|jd|jd|jd|jd|j|S)Nrrrrrr)	rrrr_get_related_namerrrr)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>rAr	js
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_+rcr?csC|jddjjfdjdt||dS)Nrz%s.%sbackrefobj_id_name)rrurrr)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)rOrr2rrrrrxrrrrrrurr	rrrrrqvalidate_backrefsrrv__dict__rr
rrrrel)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)rrT)r?rZr>r>rArTszForeignKeyField.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
rrr	rrrrTrrr>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)rr>rArs	z(CompositeKey.__get__.<locals>.<listcomp>)tupler)r?rrr>)rrAr	szCompositeKey.__get__cCsdS)Nr>)r?rrZr>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__)rCrDrErrrrr	rr%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>rArs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@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)
QueryCompilerrrrZBIGINTrZBLOBrZSMALLINTrZDATEroZDATETIMErZDECIMALrZREALrZCHARrrINTEGERrqrrZVARCHARrTEXTrZTIMErrz<=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?r/r0field_overridesop_overridesr>r>rArFs		zQueryCompiler.__init__cCsgd|jd|jd|jd|jd|jd|jd|jd|jd	|jd
|j	d|j
iS)Nr/r^rarrbrKrrI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>rAr5Os										zQueryCompiler.get_parse_mapcCsd|j||jfS)Nz%s%s%s)r/)r?rVr>r>rAquote`szQueryCompiler.quotecCs$||jkr|j|S|jS)N)r2upper)r?fr>r>rArcszQueryCompiler.get_column_typecCs|j|S)N)r4)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)r0)r?rr(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]rKr")
r?rr(rNr\Zlparamsr ZrparamstemplaterIr>r>rAr<os	zQueryCompiler._parse_expressioncCs;|jr(|j|j|j|dS|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_rrPrZr0)r?rr(rNr>r>rAr=}s	zQueryCompiler._parse_paramcCsP|jr|pd}|j|j||\}}d|jt|f|fS)Nz%s(%s))rSparse_node_listrQrrm)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|jgfS)Nr)rrrGrL)r?rr(rNr>r>rArAszQueryCompiler._parse_entitycCs|jt|jfS)N)rZrrJ)r?rr(rNr>r>rArCszQueryCompiler._parse_sqlcCsV|r:dj|j||j|j|jf}n|j|j}|gfS)Nr)rrGrxr)r?rr(rNrIr>r>rArBs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_selectcalculate_alias_maprcompound_select_parenthesesr)r?rr(rNZcsqZfirst_qZsecond_qr!new_mapfirstZfirst_prZsecond_prZlprZrprIr>r>rArEs($	!z*QueryCompiler._parse_compound_select_querycCs}|j}|jsQ|r6t|tr6|j}n|jjj}|f|_|j	||\}}dt
||fS)Nz(%s))r_explicit_selectionrOrrrxrurq_selectrTrm)r?rr(rNrZselect_fieldrrJr>r>rArDs	z!QueryCompiler._parse_select_querycCs.|j|j||\}}t||fS)N)rPrrm)r?rr(rNrIrJr>r>rArFsz!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)Nr1Fz(%s)T)rr6r7r_rOrrrrRr)r0rrrrrr	rr}rrrP_parserO)r?rr(rNZ	node_typerrIrJrrZrK_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)rNr>rArs	z,QueryCompiler.parse_node.<locals>.<listcomp>zNOT %srcAScss|]}t|tVqdS)N)rOr
)rpr>r>rArsz+QueryCompiler.parse_node.<locals>.<genexpr>)
r\rOr
rrrrany	enumeraterP)
r?rr(rNrIrJrZclean_paramsZ	clean_sqlidxr^ZcsqlZcparamsr>)rNrArPs"	
		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|jjjx|jjD]}\}}|j||jjxX|D]P}t|j	t
r|j|j	|j	jqy|j|j	|j	jjqyWqPW|j|S)N)
rSr!rtrxrutable_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>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)rrrtrprOrrrNrrrrrrrror{rrrrqr
ryrr|join_mapr6)r?joinsrxr(rerrJcurrrrorp
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 DISTINCTTFrgz, FROMZWINDOWcSs7g|]-}tt|jtd|jqS)r^)rr6rrX)rrYr>r>rArzs	z1QueryCompiler.generate_select.<locals>.<listcomp>WHEREzGROUP BYZHAVINGzORDER BYzLIMIT %sz	OFFSET %szFOR UPDATE NOWAITz
FOR UPDATE)TF)rxrurrUrOCompoundSelectrk	_distinctr6rhrr[rdr_fromryrrrg_windowsrmrd_where	_group_by_having	_order_by_limit_offset	limit_max_for_updaterf)r?rjr(rzdbreZ
select_clauseZjoin_clauseslimit
for_updateZno_waitZstmtr>r>rArT^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 %sZUPDATEZSETr_rFr]Troz, 	RETURNING)rxrSrtrur_on_conflictr6rrM_updaterOr
r)r-rryrr$rrgrtr
_returningrrdrf)
r?rjrzr(	statementrerrrZreturning_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 INTOFrrTr_ZVALUESrrz, )&rxrurSrtr_upsertr
upsert_sqlrr6r_query_fieldsryrrk_rows
_iter_rowsrkeysr
attrgetterrOr
r)r-rrhrrgauto_incrementdefault_insert_clauseis_insert_returningget_primary_key_fieldsrrrdrf)r?rjrzrGr(rrerZ
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 FROMroz, r)	rxr6rrtrrrrdrf)r?rjrzrerr>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)	r6rhrrrrryrr)r?rrr>r>rAforeign_key_constraints				z$QueryCompiler.foreign_key_constraintcsfdd}|S)Ncs%t|}|j|||S)N)rrP)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)
rurrrrrr6rrrf)r?rxrrkZ	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)rrI)rGr>rAr7s	z/QueryCompiler._create_table.<locals>.<listcomp>zPRIMARY KEY)ru
composite_keyrqrryrr6rhdeclared_fieldsrrOrrrrr
r)	r?rxsafercolumnsrZpk_colsrrkr>)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)rrIr>r>rArhs	z/QueryCompiler._create_index.<locals>.<listcomp>rgcSsg|]}|jqSr>)r)rrr>r>rArns	)rurrrr6rrrh)r?rxrrrtbl_namerrr>r>rA
_create_indexes				zQueryCompiler._create_indexrcCsV|jj}|rdnd}|j|dd|D}tt|t|S)NzDROP INDEX IF EXISTSz
DROP INDEXcSsg|]}|jqSr>)r)rrIr>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)YrCrDrEr1r$rrrrrrrrrrrrrrrrrrrrrrrrrr3r%rrrrrhrrSrr5rGrrKrMrOr<r>r=r?r@rArCrBrErDrFr\rPrRrUrfrmrTrrhrrrrrrrcreate_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)deleterI)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>rArOs
zQueryResultWrapper.countcCs|jS)N)rO)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)rCrDrErrrrrOrrrrrrrr>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
IndexErrorrOrrrrrNrQrSrurryrN)r?rrzrNidentityrrcolumnfoundZ
select_column	field_objr>r>rArs8	
					z ExtQueryResultWrapper.initializeN)rCrDrErr>r>r>rArsrc@seZdZddZdS)TuplesQueryResultWrappercs#tfddt|DS)Ncs-g|]#\}}j|d|qS)rJ)rN)rrcol)r?r>rAr	s	z8TuplesQueryResultWrapper.process_row.<locals>.<listcomp>)rra)r?rr>)r?rAr	sz$TuplesQueryResultWrapper.process_rowN)rCrDrErr>r>r>rAr	src@seZdZddZdS)NaiveQueryResultWrappercCsQ|j}x4|jD])\}}}t|||||qW|j|S)N)rzrNr_prepare_instance)r?rrrrrr>r>rAr	s

z#NaiveQueryResultWrapper.process_rowN)rCrDrErr>r>r>rAr	src@seZdZddZdS)DictQueryResultWrappercCs;i}x.|jD]#\}}}|||||<qW|S)N)rN)r?rrUrrrr>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)rrzrarrOrr_model_aliasfield_instancerrxrrr
r
rrLryrt)	r?rr}rrrrNrconstructorr>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)rrzrrrprnr{rrqrry)r?r}rristackcurrentrr
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)rarrrr)r?rrZcollected_modelsrrrrrNrZrr>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)rzrrorpKeyErrorrnrrr{rrqrrrrrry)
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_sourcerrrr{rrrsrorrprrcolumns_to_compareraryrr)r?rrr]rrrrZkey_to_columnsrbrxcol_namer~ZsourcesZjoined_model)rr>rAr	sH					'	(

z&AggregateQueryResultWrapper.initializecCs`i}xS|jjD]B\}}g||<x)|D]!\}}||j||q3WqW|S)N)rr'ry)r?rr}rxZcolumn_datarbrr>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)rr>rAr
s	zHAggregateQueryResultWrapper.iterate.<locals>._get_pk.<locals>.<listcomp>)rurrrqrr)rr>)rrA_get_pk

s
z4AggregateQueryResultWrapper.iterate.<locals>._get_pkF) rrrrrrrrrrrrrzr'rrrrtryrrrwrrrprrrrsrr{rr)r?rrZidentity_mapZ_constructedZprimary_instancer~rZ
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_ctxrdrt)r?rx)rr>rAro
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)rrxr_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|jjDS)Ncss'|]\}}|t|fVqdS)N)r)rZmcjr>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_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
ryrr}rget_proxy_fieldsr	rr)rur)r?raccumargr>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rtror_)r?rr>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.)
rrOrvr	ru
rel_existsrqrrrdrryru)r?rpr{rroZrequire_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)rrdrrprr)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?ZqdictrriZrelationshiprrZrjr"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
rNrrrrrpopleftrOrr\r rrjrrrrryrrrxrrrrr)r?rrZdq_noderJZdq_joinsrjZsiderrjrir/rrrrr>r>rArM
s>	#		+
	
		zQuery.filtercCs
|jjS)N)rr)r?r>r>rArszQuery.compilercCs
tdS)N)r)r?r>r>rArIsz	Query.sqlcCs+|j\}}|jj|||jS)N)rIrexecute_sqlrequire_commit)r?rIrJr>r>rA_executeszQuery._executecCs
tdS)N)r)r?r>r>rAexecutesz
Query.executeFcCsJ|r|jj}n|jj}|rB|rB|dS|SdS)Nr)tuplesrXr#r)r?Zas_tupleconvertrr>r>rAscalars
zQuery.scalar)rCrDrErr"rr#rrrrrrrrrrrrrMrrIr#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?rzrjrJ)rr>rArs				zRawQuery.__init__cCs7t|j|j|j}|j|_|j|_|S)N)r(rxr)r*r,r-)r?rjr>r>rAr&szRawQuery.clonejoiningrrTcCs
||_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,rget_result_wrapperRESULTS_TUPLESr-
RESULTS_DICTS
RESULTS_NAIVErxr#)r?ZQRWr>r>rAr$;s		zRawQuery.executecCst|jS)N)rr$)r?r>r>rArFszRawQuery.__iter__)rCrDrErrrrrrrrr%r/rIr$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r4cseZdZdZfddZfddZddZeeZedZ	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)Zrvr:cstt|j||jj|_|j|d|_d|_d|_	d|_
d|_d|_d|_
d|_d|_d|_d|_d|_d|_d|_d|_dS)NF)FF)rrvrr
commit_selectr"_SelectQuery__selectrrrurvrwrsrxryrqr{_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)rrvrrZrr[rrrOr
ryrrurvrwrsrxryrqr{r7r,r-r8r)r?rjrI)rr>rAris6		zSelectQuery._clone_attributescsfdd}|S)NcsD|jjjj}|kr.tdt|j||S)Nz!Your database does not support %s)rxrurcompound_operationsrqrp)r?rZ
supported_ops)rr>rArs

z&SelectQuery.compound_op.<locals>.innerr>)rrr>)rrAcompound_opszSelectQuery.compound_opUNION	INTERSECTEXCEPTcCsF|jjtdjt||@jdj}||B|S)Nrr])rxrr6from_rhrrW)r?r Zwrapped_rhsr>r>rAr9s"zSelectQuery.__xor__cCstjd||S)Nz	UNION ALL)rv_compound_op_static)r?r r>r>rA	union_allszSelectQuery.union_allcGs@t|dk|_|p'|jjj}|j||_dS)Nr)rrZrxrurrr[)r?r9r>r>rAZ__selectszSelectQuery.__selectcGs|rt|nd|_dS)N)rrr)r?rr>r>rAr?szSelectQuery.from_cOs"|r|j|nd|_dS)N)rru)r?rrr>r>rAgroup_byszSelectQuery.group_bycGs|j|j||_dS)N)rrv)r?rr>r>rAhavingszSelectQuery.havingcOs"t|jt|||_dS)N)r4rwr)r?rrr>r>rArWszSelectQuery.order_bycOs"t|jt|||_dS)N)r4rsr)r?Zwindowsrr>r>rArYszSelectQuery.windowcCs
||_dS)N)rx)r?Zlimr>r>rAr}szSelectQuery.limitcCs
||_dS)N)ry)r?Zoffr>r>rAoffsetszSelectQuery.offsetcCs0|dkr|d8}||_|||_dS)Nrr)rxry)r?ZpageZpaginate_byr>r>rApaginates
	zSelectQuery.paginateTcCs
||_dS)N)rq)r?Zis_distinctr>r>rAdistinctszSelectQuery.distinctFcCs||f|_dS)N)r{)r?r~Znowaitr>r>rAr~szSelectQuery.for_updatecCs
||_dS)N)r7)r?naiver>r>rArHszSelectQuery.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>rArIszSelectQuery.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)NrOcSsg|]}|jqSr>)r)rrnr>r>rArs	z(SelectQuery.annotate.<locals>.<listcomp>)
rCountrurqrrrrxrrrur[r)r?rZ
annotationrjr>r>rAannotates	zSelectQuery.annotatecCs=|dkr!tjtd}|j}|g|_|S)Nr)rrJr6rWr[)r?aggregationrjr>r>rA
_aggregates
zSelectQuery._aggregatecCs|j|jd|S)Nr&)rMr')r?rLr&r>r>rA	aggregateszSelectQuery.aggregatecCsJ|js$|js$|js$|jr4|jd|S|jddpIdS)Nclear_limitr&Fr)rqrurxry
wrapped_countrN)r?rOr>r>rArOs$zSelectQuery.countcCsc|j}|r"d|_|_|j\}}d|}|jj||}|jpbdS)Nz+SELECT COUNT(1) FROM (%s) AS wrapped_selectr)rWrxryrIrxrawr')r?rOrrIrJwrappedZrqr>r>rArPs
zSelectQuery.wrapped_countcCs4|jdd}tdg|_t|jS)Nr1)rFr6r[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)rFrr$rrxrrI)r?rr>r>rArs
	zSelectQuery.getrcCsN|j}|j||jd|}|rJ|dkrF|dS|SdS)Nrr)r$rr)r?rrUr}r>r>rApeeks

zSelectQuery.peekcCs1|j|kr!||_d|_|jd|S)NTr)rxrrU)r?rr>r>rArXs		zSelectQuery.firstcCs|jj|S)N)rrT)r?r>r>rArI%szSelectQuery.sqlcCst|j}xd|jD]Y}t|tr;|j|kr;dSt|tr|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>rAget_query_meta2szSelectQuery.get_query_metacCs|jr|jjtS|jr2|jjtS|jsQ|jsQ|jra|jjt	S|j
rz|jjtS|jjtSdS)N)
r,rr0r1r-r2r7rdrVr3r8RESULTS_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+rxrWrZr#)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?rZrUrr>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__)4rCrDrEr1rrr;rr@r4r3r6r9rAr6rrr?rBrCrWrYr}rDrFrGr~rHr%r/rIrrKrMrNrOrPrTrrUrXrIrVrWrZr$rrr%rPY3rr>r>)rrArvRsn

	
rvc@s4eZdZddZddZddZdS)NoopSelectQuerycCs|jjffS)N)rget_noop_sql)r?r>r>rArIeszNoopSelectQuery.sqlcCsdS)N)NNr>)r?r>r>rArWhszNoopSelectQuery.get_query_metacCs|jjtS)N)rr0r1)r?r>r>rArZksz#NoopSelectQuery._get_result_wrapperN)rCrDrErIrWrZr>r>r>rAr`dsr`csveZdZdZdddfddZfddZddd	Zd
dZdd
ZddZ	S)rpr;Ncs8||_||_||_tt|j|gdS)N)r\rr rrpr)r?rxr\rr )rr>rArqs			zCompoundSelect.__init__cs@tt|j|}|j|_|j|_|j|_|S)N)rrprr\rr )r?rj)rr>rArws
z CompoundSelect._clone_attributesFcCs|jd|S)NrO)rP)r?rOr>r>rArO~szCompoundSelect.countcCs
|jjS)N)r\rW)r?r>r>rArWszCompoundSelect.get_query_metacCs|jjo|jjS)N)r\rVr )r?r>r>rArV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,rr0r1r-r2r8rXr\rdr r7rVr3rY)r?Z	has_joinsZis_naiver>r>rArZs			!z"CompoundSelect._get_result_wrapper)
rCrDrEr1rrrOrWrVrZr>r>)rrArpnsrpcseZdZfddZfddZddZeeddZeed	d
dZeed	dd
Z	ddZ
ddZS)_WriteQuerycs>d|_d|_d|_d|_tt|j|dS)NF)rr,r-r+rrbr)r?rx)rr>rArs
				z_WriteQuery.__init__csOtt|j|}|jrKt|j|_|j|_|j|_|S)N)rrbrrrr,r-)r?rj)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?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(|jjtS|jrA|jjtS|jjtS)N)rr,rr0r1r-r2r3)r?r>r>rAr0s		z_WriteQuery.get_result_wrappercCsI|j}|j|jgif}||j|j||_|jS)N)r0rrxr#r+)r?r[rGr>r>rA_execute_with_result_wrappersz(_WriteQuery._execute_with_result_wrapper)rCrDrErrrcrrdr%r/r0rer>r>)rrArbs		rbcseZdZdfddZfddZedddZedZd	d
Z	ddZ
d
dZddZS)UpdateQueryNcs,||_d|_tt|j|dS)N)rrrrfr)r?rxr)rr>rArs		zUpdateQuery.__init__cs:tt|j|}t|j|_|j|_|S)N)rrfrr
rr)r?rj)rr>rArszUpdateQuery._clone_attributescCs
||_dS)N)r)r?actionr>r>rAon_conflictszUpdateQuery.on_conflictr.cCs|jj|S)N)rr)r?r>r>rArIszUpdateQuery.sqlcCsX|jdk	r(|jdkr(|jS|jdk	r>|jS|jj|jSdS)N)rr+rer
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)
rCrDrErrrrhrrrIr$rrr>r>)rrArfsrfcseZdZdddddfddZddZfddZed	Zed
Ze	ddd
Z
e	dddZe	dddZe
ddZddZddZddZS)InsertQueryNFcstt|j|d|_|dk	p4|dk	|_d|_|dk	r[||_n|pdig|_||_||_||_	d|_
dS)NF)rrjrr_is_multi_row_insert_return_id_listrrr_validate_fieldsr)r?rxrLrowsrrjvalidate_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)rxrurmrp
_default_dict_default_callablesrrrrrt)
r?Z
model_metarqdefaultsZ	callablesrZ	field_rowrrrr>)rprAr
s,					
	

zInsertQuery._iter_rowscs|tt|j|}|j|_|j|_|j|_|j|_|j|_|j|_|j	|_	|j
|_
|S)N)rrjrrrrkrrrlrmr)r?rj)rr>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)rinsert_returningrkrl)r?r>r>rArC
szInsertQuery.is_insert_returningcCs|jj|S)N)rr)r?r>r>rArIJ
szInsertQuery.sqlcCsrg}d}|j}xH|jD]=}t|j|j|jj}|r|j|qW|rj|S|SdS)N)rlrrjrxrurr$ry)r?Zid_listZlast_idrvrr>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)rkrrrinsert_manyrxr+rer#rwrrxrurrrlast_insert_idrlrr
itemgetterfetchall)r?Zinsert_with_looprZpk_rowrGZ
clean_datar>r>rAr$]
s0	


			zInsertQuery.execute)rCrDrErrrrrrrrurhrvrrrIrxr$r>r>)rrArjs rjc@s4eZdZedZddZddZdS)DeleteQueryr.cCs|jj|S)N)rr)r?r>r>rArI
szDeleteQuery.sqlcCsX|jdk	r(|jdkr(|jS|jdk	r>|jS|jj|jSdS)N)rr+rerrir#)r?r>r>rAr$
s

zDeleteQuery.executeN)rCrDrErrrIr$r>r>r>rAr}}
sr}
IndexMetadatarrIrrrColumnMetadataZ	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 ALLTr.Nr-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_speedupsrr8r9)	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)rr8)rrr>r>rAregister_fields.szDatabase.register_fieldscCst|j||_dS)N)rr9)rrr>r>rAregister_ops2szDatabase.register_opscCs|tkr|jrtStS|tkr-tS|tkrJ|jrFtStS|t	krg|jrct
StS|tkrwt
S|jrtStSdS)N)r3rrrrYrr1rrr2rrrXr)r?Zwrapper_typer>r>rAr06s



zDatabase.get_result_wrappercCs|jjr|jSdS)N)rurZ	lastrowid)r?rrzr>r>rArzHszDatabase.last_insert_idcCs|jS)N)Zrowcount)r?rr>r>rAriLszDatabase.rows_affectedcCs"|j|j|j|j|jS)N)compiler_classr/r0r8r9)r?r>r>rArOszDatabase.compilercCs|j|jj|S)N)r!rrP)r?rbr>r>rAr$TszDatabase.executecCstj||f|j~|j}y|j||pAfWn4tk
r||jru|jru|jYnX|r|jr|j	WdQRX|S)N)
loggerdebugrrr$rget_autocommitrrollbackcommit)r?rIrJr"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)rrI)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)rrI)rxr>rArs	z'Database.drop_index.<locals>.<listcomp>)rrOrrrqr!r)r?rxrrrrr>)rxrArs

zDatabase.drop_indexcCs(|j}|j|j|||S)N)rr!r)r?rxrrkrr>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)Nrn)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>rAraszDatabase.get_noop_sqlcCstS)N)r)r?r>r>rArszDatabase.get_binary_type)^rCrDrEr5r)rr:rVdistinct_ondrop_cascader8foreign_keysr~for_update_nowaitryrwr0rzr9r/reserved_tablesrrrsubquery_delete_same_tablerwindow_functionsr"rrr#r$r+r,r1rrrrrrrrrrrrr2rrr0rzrirr$r!rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrarr>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?rxrrkr>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?rrrjrrr	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)rCrDrErrr8rrsqlite_version_inforyrzr$rrr9rrrrrrrrrrrrrrrrr>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 PRECISIONrqZSERIALrrz%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)rurqrrrr)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>rArzs		
z!PostgresqlDatabase.last_insert_idZpubliccCs,d}dd|j||fjDS)NzSSELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = %s ORDER BY tablenamecSsg|]\}|qSr>r>)rrYr>r>rArs	z1PostgresqlDatabase.get_tables.<locals>.<listcomp>)r!r|)r?rrjr>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;rYcsAg|]7}t|d|d|djd|dqS)rrrK,rJ)r~r)rr)rr>rArs	z2PostgresqlDatabase.get_indexes.<locals>.<listcomp>)r!r|)r?rrrjrr>)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?rrrjrr>)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?rrrjrr>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?rrrIrr>)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?rrUr>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>rAraszPostgresqlDatabase.get_noop_sqlcCstjS)N)rr)r?r>r>rArsz"PostgresqlDatabase.get_binary_type) rCrDrEr5rVrrr8r~rrwr0r$rr9rrrrrrrrzrrrrrrrrarr>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 PRECISIONrFLOATrqzINTEGER 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?rrrIrr>)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?rrrjrr>)rrArGszMySQLDatabase.get_foreign_keyscCs%tjtt|td|S)Nrn)rrrr3)r?rrr>r>rArTszMySQLDatabase.extract_datecCstj|t|S)N)rZDATE_FORMATMYSQL_DATE_TRUNC_MAPPING)r?rrr>r>rArWszMySQLDatabase.truncate_datecCstt|jjtdS)NzVALUES (DEFAULT))rrhrurqr6)r?rxr>r>rArZsz#MySQLDatabase.default_insert_clausecCsdS)NzDO 0r>)r?r>r>rAra_szMySQLDatabase.get_noop_sqlcCstjS)N)rr)r?r>r>rArbszMySQLDatabase.get_binary_typell)rCrDrEr5r:r8r~r0rzr$rrrr9r/rrrrrrrrrrrrarr>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:rrar}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|rrZuuid4rrrG
quoted_sid)r?r|rZ	_compilerr>r>rArs	zsavepoint.__init__cCs|jj|dddS)Nr"F)r|r!)r?rjr>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)rrT)r?rZr>r>rArTszFieldProxy.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)	rCrDrErrrTrrrr>r>r>rArsrc@s[eZdZddZddZddZddd	Zd
dZdd
ZdS)r}cCs||jd<dS)Nrx)r)r?rxr>r>rAr#szModelAlias.__init__cCs2t|j|}t|tr.t||S|S)N)rrxrOrr)r?rrr>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)rrI)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)r
rvrurW)r?r9rjr>r>rAr4szModelAlias.selectcKs
|j|S)N)rx)r?rr>r>rAr<szModelAlias.__call__N)	rCrDrErrrr
rrr>r>r>rAr}"sr}c@sjeZdZdZddZddZddZd	d
ZddZd
dZ	ddZ
dS)r_keys_itemscCsg|_g|_dS)N)rr	)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)rrrrr	)r?itemkrr	r>r>rAr&Ms	z_SortedFieldList.__contains__cCs|jj|jS)N)rrr)r?rr>r>rArSsz_SortedFieldList.indexcCsE|j}t|j|}|jj|||jj||dS)N)rrrinsertr	)r?r
rrr>r>rArVs	z_SortedFieldList.insertcCs'|j|}|j|=|j|=dS)N)rr	r)r?r
rbr>r>rAremove\s
z_SortedFieldList.removeN)rr	)rCrDrErrr%rr&rrr
r>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)'rxrCrrrrrt_default_by_namerrrs_default_callable_listr_sorted_field_listrsorted_field_namesrrprdefault_databaserr
db_table_funcrrrWrqrcrrronly_save_dirtyrrrrvr'rr_additional_keys)r?rrrrrrWrqrcrrrrrrrZr>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)rWrOrrrrlstripr+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)rrIr>r>rArs	z4ModelOptions._update_field_lists.<locals>.<listcomp>cSs%g|]}t|ts|qSr>)rOr)rrr>r>rArs	)rrrrrrrrwrqrpr)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_fieldrrrrrrrrrtr
rsrryrrr)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)rrrrrr
rrrtrsrarrrrr)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>)rrqr)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
rrrrrry)	r?rzrmultiZis_fieldZis_noderrZis_matchr>r>rArwszModelOptions.rel_for_modelcCs|jj|j||S)N)rurwrx)r?rzrrr>r>rArxsz"ModelOptions.reverse_rel_for_modelcCs|j|p|j|S)N)rwrx)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}rrzrlr>r>rArelated_modelss	
zModelOptions.related_models)rCrDrErr#rrrrrrrrwrxrrr>r>r>rArhs 			(	rc
sUeZdZeddddddddd	g	Zfd
dZdd
ZS)	BaseModelrrrrrWrqrrrcs8|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]rqruZmodel_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+rrrrqinheritablerrOrrrrrurrrrrrrrrqryrr0rrrrrrrrDrrrr!rr)rrbasesZattrsZmeta_optionsrGrvZmodel_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
`rc@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?rrrr%r>r>rArvs
	zModel.__init__cCs
t|S)N)r})rr>r>rAr~szModel.aliascGs4t||}|jjr0|j|jj}|S)N)rvrurW)rr9rjr>r>rArszModel.selectNcs<|p	i}|jfddDt|S)Ncs*g|] }jj||fqSr>)rur)rrI)rrr>rArs	z Model.update.<locals>.<listcomp>)rrf)r_Model__datarfdictr>)rrrArs#zModel.updatecs<|p	i}|jfddDt|S)Ncs*g|] }jj||fqSr>)rur)rrI)rrr>rArs	z Model.insert.<locals>.<listcomp>)rrj)rr(rr)r>)rrrArs#zModel.insertTcCst|d|d|S)Nrnro)rj)rrnror>r>rAryszModel.insert_manycCst|d|d|S)Nrrj)rj)rrrjr>r>rAinsert_fromszModel.insert_fromcCs
t|S)N)r})rr>r>rArszModel.deletecGst|||S)N)r()rrIrJr>r>rArQsz	Model.rawcKs*||}|jdd|j|S)Nforce_insertT)saver)rrjrr>r>rAcreates
zModel.createcOsF|jj}|r'|j|}|r<|j|}|jS)N)rrHrrMr)rrjrsqr>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)NrtrFcss-|]#\}}d|kr||fVqdS)rNr>)rrr%r>r>rArs	z&Model.get_or_create.<locals>.<genexpr>T)rrr'rMrrrrr
rrurrr-r")rrrtrjrrZrJexcr>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'rrrqryr)rrrjrrZrr>r>rA
create_or_gets
zModel.create_or_getcOs|jj||S)N)rrM)rZdqrjr>r>rArMsz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)
r2rurrqrrrrr_create_indexes)rrr|rr>r>rArs
zModel.create_tablecCsdg}xW|jjD]I}|jr%qt|j|jt|tf}|r|j|qW|S)N)	rurrqr`rrrOrry)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>)	itertoolschainr4rur)rr>r>rA_index_dataszModel._index_datacCs:x3|jD]%\}}|jjj|||q
WdS)N)r7rurr)r
field_listrr>r>rAr3szModel._create_indexescCs:x3|jD]%\}}|jjj|||q
WdS)N)r7rurr)rrr8rr>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)rrI)rr>rArs	z Model.sqlall.<locals>.<listcomp>cSsg|]\}}|qSr>r>)rrIr]r>r>rAr s	)
rurrrqrrryrrr4rrr)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)r`)rrrr>r>rAnoop0sz
Model.noopcCst||jjjS)N)rrurqr)r?r>r>rAr4szModel._get_pk_valuecCs)|jjs%t||jjj|dS)N)rurrrqr)r?rZr>r>rA
_set_pk_value8szModel._set_pk_valuecCs|jj|jkS)N)rurqr)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?rLonlyZnew_datarr>r>rA
_prune_fieldsGs

zModel._prune_fieldscCsx|jjD]y}||jkoS||koS||dkoS|jj|dk	}|r
t||t|||j|||<q
WdS)N)rurrrrrrr)r?rLrZ
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
rrurqrr@rdirty_fieldsrr>rArrrrrrr=r$rr<)	r?r+r?rLZpk_fieldZpk_valueZpk_part_namernZpk_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)rrI)r?r>rArs	z&Model.dirty_fields.<locals>.<listcomp>)rur)r?r>)r?rArBszModel.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_nullablerxrjrrklassZrel_namerlrrsubqueryr>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)rFrrrxrrrrr$rr=)r?Z	recursiveZdelete_nullablerFrjrlrzr>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__)/rCrDrErr2rrrrryr*rrQr-rr0r1rMr2rr4r7r3r9r:rrrr;rZget_idr<Zset_idr=rrr@rAr,rCrrBrFrGrr%r&r>r>r>rAr)usb	

%cCs |j}d|_|_|S)N)rrurv)rjr>r>rAclean_prefetch_subquerysrHcsat|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)rrl)subquery_modelr>rArs	z)prefetch_add_subquery.<locals>.<listcomp>cs%g|]}t|jjqSr>)rrr)rrl)
last_modelr>rArs	z	 using %srz1Error: unable to find foreign key for query: %s%scs)g|]\}}|j|>qSr>)r)rrlr)cleanedr>rArs	Fcs&g|]}|jj|>qSr>)rr)rr)rKr>rArs	)PrefetchResultrarOrrrr)rrxrrrjrzrurwrrHrNrrrrry)r.
subqueries
fixed_queriesrrEZtarget_modelZfksrr	prefetch_resultZ
last_queryZrelsrZtgt_errexprr>)rKrJrIrAprefetch_add_subquerysT	

						
rQ__prefetchedrjrr
rel_models
field_to_namerzcsIeZdZdddddfddZddZddZS)rLNcs|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	)rrrxrrLr")rrjrrrSrTrzZforeign_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)	rrrrrrTrrr)
r?rid_maprZ
identifierrattnameZ
rel_instancesrprr>r>rApopulate_instances	

z PrefetchResult.populate_instancecCszxs|jD]h\}}|jj|j|}||f}|jrQ|||<q
|j|g||j|q
WdS)N)rTrrrrrry)r?rrUrrVrrr>r>rAstore_instance
s	
zPrefetchResult.store_instance)rCrDrEr"rWrXr>r>)rrArLs	
rLc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)rQrrzrrSrryrrrjrXrW)r.rMrNZdepsZrel_maprOZquery_modelrrUZ
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_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)rrorrr5loggingrrr^rrrrZbisectrrcollectionsrrrImportErrorr
rr	functoolsrinspectr	__version____all__r=Handler	getLoggerr
addHandlerrFobjectrIversion_infoZPY2r_rbuiltinsrMrNr
rrrTrrrrarrrr\unicodebufferexecRuntimeErrorrergZ	pysqlite2rhZpysq3rrZpsycopg2cffiriregisterrrjrZMySQLdbrZpymysqlZplayhouse._speedupsrkrlrmrrrrZregister_adapterrrZDATETIME_PARTSrZDATETIME_LOOKUPSrrrrrrrr$r%rr'rr(rr&r3rYr1r2rXrrrrrrrrrrrrrrrr2rrr
r6r3rrNrrr-r`rrgrhr<rrrkrlrurrr
r!rr4r0rrrrrrrr7rr;rrrrr8r9r
rrrrrrr)rrrrrrrrrrrr(r4rvr`rprbrfrjr}r~rrrrr rrr"r#r$r+r,r1rrlocalrrr5r.r*rrr:rrrrrr}rrrrrr)rHrQrRrLr/rrr>r>r>rA<module>s
	









	"
	

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