Ñò ‰„[Jc@sôdZddklZlZddkiZddklZl Z l Z ddk l Z l Z lZd„Zdefd„ƒYZd efd „ƒYZd efd „ƒYZd efd„ƒYZdefd„ƒYZdefd„ƒYZdS(s¼Relationship dependencies. Bridges the ``PropertyLoader`` (i.e. a ``relation()``) and the ``UOWTransaction`` together to allow processing of relation()-based dependencies at flush time. iÿÿÿÿ(tsqltutilN(t attributestexctsync(t ONETOMANYt MANYTOONEt MANYTOMANYcCs,htt6tt6tt6}||i|ƒS(N(t OneToManyDPRt ManyToOneDPRt ManyToManyDPRt direction(tpropttypes((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pytcreate_dependency_processors  tDependencyProcessorcBs›eZeZd„Zd„Zd„Zd„Zd„Zd„Z ed„Z ed„Z d„Z d „Z d „Zd „Zd „Zd „Zd„ZRS(cCsÊ||_|i|_|i|_|i|_|i|_|i|_|i|_|i|_|i|_|i |_ |i |_ t |i|i|i ƒ|_ |ii ptid|iƒ‚ndS(NsyCan't build a DependencyProcessor for relation %s. No target attributes to populate between parent and child are present(R tcascadetmappertparentt secondaryR t post_updatetpassive_deletestpassive_updatestenable_typecheckstkeyt MapperStubtdependency_markertsynchronize_pairstsa_exct ArgumentError(tselfR ((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyt__init__ s             cCs|iii|iƒS(sgReturn the ``InstrumentedAttribute`` handled by this ``DependencyProecssor``. (Rt class_managertget_implR(R((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyt_get_instrumented_attribute1scCs|iƒi|ƒS(s¤return True if the given object instance has a parent, according to the ``InstrumentedAttribute`` handled by this ``DependencyProcessor``. (R"t hasparent(Rtstate((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR#8scCs tƒ‚dS(sªTell a ``UOWTransaction`` what mappers are dependent on which, with regards to the two or three mappers handled by this ``DependencyProcessor``. N(tNotImplementedError(Rt uowcommit((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pytregister_dependencies@scCs tƒ‚dS(s Tell a ``UOWTransaction`` about this object as a processor, which will be executed after that mapper's objects have been saved or before they've been deleted. The process operation manages attributes and dependent operations between two mappers. N(R%(RR&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pytregister_processorsIscCs;||jodS|itjo ||fS||fSdS(s¨Given an object pair assuming `obj2` is a child of `obj1`, return a tuple with the dependent object second, or None if there is no dependency. N(tNoneR R(Rtstate1tstate2((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pytwhose_dependent_on_whoRs   cCs tƒ‚dS(s1This method is called during a flush operation to synchronize data between a parent and child object. It is called within the context of the various mappers and sometimes individual objects sorted according to their insert/update/delete order (topological sort). N(R%(RttasktdeplistR&tdelete((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pytprocess_dependencies_s cCs tƒ‚dS(sØUsed before the flushes' topological sort to traverse through related objects and ensure every instance which will require save/update/delete is properly added to the UOWTransaction. N(R%(RR-R.R&R/((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pytpreprocess_dependenciesjscCs¦|dj o•|ii|d|i ƒ ow|ii|dtƒo2tid|i|i|ii|ifƒ‚q¢tid|i|i|iifƒ‚ndS(Ntallow_subtypess0Attempting to flush an item of type %s on collection '%s', which is not the expected type %s. Configure mapper '%s' to load this subtype polymorphically, or set enable_typechecks=False to allow subtypes. Mismatched typeloading may cause bi-directional relationships (backrefs) to not function properly.siAttempting to flush an item of type %s on collection '%s', whose mapper does not inherit from that of %s.( R)Rt_canloadRtTrueRt FlushErrortclass_R (RR$((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyt_verify_canloadss + ) cCs tƒ‚dS(sÀCalled during a flush to synchronize primary key identifier values between a parent/child object, as well as to an associationrow in the case of many-to-many. N(R%(RR$tchildtassociationrowt clearkeysR&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyt _synchronizescCs?x8|iiD]*}|i|||f|ijotSq WtS(súDetermine if an action has been performed by the 'reverse' property of this property. this is used to ensure that only one side of a bidirectional relation issues a certain operation for a parent/child pair. (R t_reverse_propertyt_dependency_processorRR4tFalse(RR&RR8tactiontr((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyt_check_reverse_action‡s   cCst|i||||ftno_dependenciesRR"R#R'R(R,R0R1R7R;RARBRJRKRN(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyRs       RcBsDeZd„Zd„Zed„Zed„Zd„Zd„ZRS(cCsT|io0|i|i|iƒ|i|i|iƒn|i|i|iƒdS(N(Rtregister_dependencyRRR(RR&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR'¸s cCsD|io|i|i||iƒn|i|i||iƒdS(N(Rtregister_processorRR(RR&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR(¿s c Csa|o7|ip|idj ox|D] }|i||id|iƒ}|oÞxg|iD]\}|dj oI|i|ƒtjo3|i||dt |ƒ|i |||gƒq^q^W|ip|i i oXxU|i D]F}|dj o3|i||dt |ƒ|i |||gƒqàqàWq2q)q)Wq]n x|D]}|i||idt ƒ}|oìxQ|iD]F}|i||dt|ƒ|dj o|i |||gƒqwqwWxM|iD]B}|i i o.|i|ƒ o|i||dt |ƒqËqËW|i||ƒo1x.|i D]}|i||dt|ƒq.WqYqEqEWdS(Ntalltpassive(RRtget_attribute_historyRtdeletedR)R#R>R;R4RJRR/t unchangedtaddedt delete_orphanRK(RR-R.R&R/R$thistoryR8((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR0ÅsD #  2   ! c Cs«|o|ip|ii o|idj }xä|D]Ø}|i||id|iƒ}|o­xi|iD]^}|dj oK|i|ƒt jo5|ii o|i |dt ƒqÉ|i |ƒqkqkW|o6x3|i D]$}|dj o|i |ƒqÞqÞWqq6q6Wq§nŽxŠ|D]‚}|i||idt ƒ}|oÝx/|iD]$}|dj o|i |ƒqSqSWx¨|iD]™}|ii p|i |dt ƒq…|i|ƒt joY|i |dt ƒxC|iid|ƒD](\} } |i ti| ƒdt ƒqîWq…q…Wn|i||ƒoj|p"|i||id|iƒ}n|o6x3|i D]$}|dj o|i |ƒqsqsWq£q!q!WdS(NRSRTtisdeleteR/(RRR/RRURRVR)R#R>RYRER4RWRXRtcascade_iteratorRtinstance_stateRKR( RR-R.R&R/tshould_null_fksR$RZR8tctm((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR1ésZ  #   )     "  cCs–|}|}|djp|i o|i|ƒodS|i|ƒ|o ti||i|iiƒn&ti ||i ||i|iiƒdS(N( R)Rt is_deletedR7RtclearRR RtpopulateR(RR$R8R9R:R&tsourcetdest((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR;s(  cCsti|||i|iiƒS(N(Rtsource_modifiedRR R(RR&R$((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyRKs( RMROR'R(R>R0R1R;RK(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR·s    $ + tDetectKeySwitchcBsPeZdZeZd„Zd„Zed„Zed„Z d„Z d„Z RS(swa special DP that works for many-to-one relations, fires off for child items who have changed their referenced key.cCsdS(N((RR&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR'(scCs|i|i||iƒdS(N(RRRR(RR&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR(+scCs+| o|i o|i||ƒndS(N(Rt_process_key_switches(RR-R.R&R/((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR1.scCs*| o|io|i||ƒndS(N(RRh(RR-R.R&R/((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR04sc st‡‡fd†|Dƒƒ}|oèxåg}ˆiiiƒD]t}t|iˆiiƒoUˆi|ijoB|iˆidj o+t i |iˆiƒ|jo ||q@q@~D]K}ˆi |ƒt it i |iˆiƒˆi|ˆiˆiiƒq»WndS(Nc3s0x)|]"}ˆiˆ|ƒo |VqqWdS(N(RK(t.0ts(RR&(s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pys =s (tsettsessiont identity_mapt all_statest issubclassR6RRtdictR)RR]RERRcRR R(RR.R&t switchersRHtelemRj((RR&s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyRh<s 2 cCsti|||i|iiƒS(N(RRfRR R(RR&R$((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyRKMs( RMROt__doc__R4RPR'R(R>R1R0RhRK(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyRg"s     R cBsDeZd„Zd„Zd„Zed„Zed„Zd„ZRS(cCs-ti||ƒ|iiit|ƒƒdS(N(RRRt_dependency_processorstappendRg(RR ((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyRQscCsT|io0|i|i|iƒ|i|i|iƒn|i|i|iƒdS(N(RRQRRR(RR&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR'Us cCsD|io|i|i||iƒn|i|i||iƒdS(N(RRRRRR(RR&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR(\s cCs%|o|io|ii o|idj opxm|D]a}|i|ddt|ƒ|i||id|iƒ}|o|i |||i ƒƒq7q7Wq!n~xz|D]r}|i||idtƒ}|oJx*|i D]}|i||dt |ƒqÝW|i |||i ƒƒq«q«WdS(NRSRT( RRRYRR;R)R4RURRJtsumRXR>(RR-R.R&R/R$RZR8((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR0bs )) c Csô|iodS|oÿ|iip |iioáxÞ|D]Ò}|i||id|iƒ}|o§|iio|iƒ}n |iƒ}x{|D]o}|djoq’n|i |dt ƒx?|i i d|ƒD](\} } |i ti| ƒdt ƒqÕWq’Wq7q7WqðnÜxØ|D]Ð}|i |ƒ|iio°|i||id|iƒ}|o‡x„|iD]u}|i|ƒtjoY|i |dt ƒxC|i i d|ƒD](\} } |i ti| ƒdt ƒq°WqkqkWqìqqWdS(NRTR[R/(RRR/RYRURRRvt non_deletedR)RER4RR\RR]RVR#R>( RR-R.R&R/R$RZttodeleteR8R_R`((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR1tsF     .    cCs—|djp|i o|i|ƒodS|p |djo ti||i|iiƒn3|i|ƒti ||i ||i|iiƒdS(N( R)RRaRRbRR RR7RcR(RR$R8R9R:R&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR;–s (  ( RMRORR'R(R>R0R1R;(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR Ps      "R cBsDeZd„Zd„Zed„Zed„Zd„Zd„ZRS(cCs0|i|i|iƒ|i|i|iƒdS(N(RQRRR(RR&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR'¡scCs|i|i||iƒdS(N(RRRR(RR&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR(«scCsÂ|ii|iƒ}g}g}g}|oÄx«|D]µ} |i| |id|iƒ} | oŠx‡| iƒD]u} | djp|i|| | dƒoqmnh} |i | | | t |ƒ|i | ƒ|i || | dƒqmWq5q5Wnëxç|D]ß} |i| |iƒ} | o x€| i D]u} | djp|i|| | dƒoq%nh} |i | | | t |ƒ|i || | dƒ|i | ƒq%Wx„| iD]u} | djp|i|| | dƒoq¨nh} |i | | | t |ƒ|i || | dƒ|i | ƒq¨Wn|i o¨|i|| ƒo•| p|i| |idt ƒ} nxl| iD]]} h} ti| |i| d|iiƒti| |i| d|iiƒ|i | ƒqsWqùqùW|oÓ|iitig} |iiD]<}|i| jo&| |ti|id|iƒjqq~ Œƒ}|i||ƒ}|i ƒoE|i!t"|ƒjo/t#i$d|i!|ii%t"|ƒfƒ‚q¶n|o×|iitig}|iiD]@}|i| jo*||tid|id|iƒjqÝqÝ~Œƒ}|i||ƒ}|i ƒoE|i!t"|ƒjo/t#i$d|i!|ii%t"|ƒfƒ‚q”n|o#|ii&ƒ}|i||ƒndS(NRTt manytomanytold_ttype_s]Deleted rowcount %d does not match number of secondary table rows deleted from table '%s': %ds]Updated rowcount %d does not match number of secondary table rows updated from table '%s': %d('t transactiont connectionRRURRt non_addedR)RAR;R>RuRBRXRVRRKRWRtupdateRR Rtsecondary_synchronize_pairsRR/Rtand_R_t bindparamttypetexecutetsupports_sane_multi_rowcounttrowcounttlenRtConcurrentModificationErrort descriptiontinsert(RR-R.R&R/R}tsecondary_deletetsecondary_inserttsecondary_updateR$RZR8R9RHR_t statementtresultt_[2]((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR0®s~ & & & & ""\# *`# *c CsÖ|pËxÈ|D]¼}|i||idtƒ}|o”x‘|iD]‚}|iioo|i|ƒtjoY|i|dtƒxC|i i d|ƒD](\}} |it i |ƒdtƒq’Wq@q@WqqWndS(NRTR[R/( RURR4RVRRYR#R>RERR\RR]( RR-R.R&R/R$RZR8R_R`((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR1ös # cCsa|djodS|i|ƒti||i||iiƒti||i||iiƒdS(N( R)R7Rt populate_dictRR RRR€(RR$R8R9R:R&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR;s   cCsti|||i|iiƒS(N(RRfRR R(RR&R$((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyRK s( RMROR'R(R>R0R1R;RK(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR  s   H RcBsMeZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z RS(sýRepresent a many-to-many dependency within a flush context. The UOWTransaction corresponds dependencies to mappers. MapperStub takes the place of the "association table" so that a depedendency can be corresponded to it. cCs+||_||_|i|_g|_dS(N(Rt base_mapperR6t_inheriting_mappers(RRRR((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyRs   cCs t|fƒS(N(titer(R((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pytpolymorphic_iteratorscCsdS(N((RR&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyt_register_dependencies scCsdS(N((RR&((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyt_register_procesors#scOsdS(N((Rtargstkwargs((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyt _save_obj&scOsdS(N((RR˜R™((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyt _delete_obj)scCs|S(N((R((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pytprimary_mapper,s( RMRORsRR•R–R—RšR›Rœ(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyR s      (Rst sqlalchemyRRtsqlalchemy.exceptionst exceptionsRtsqlalchemy.ormRRRtsqlalchemy.orm.interfacesRRRRtobjectRRRgR R R(((s=/usr/lib/python2.6/site-packages/sqlalchemy/orm/dependency.pyt s šk.Pm