ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ 4]c@sCdZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm Z dd lm Z d dlmZ d d lm Z d dlmZd efd YZdefdYZdefdYZdefdYZdefdYZiee 6ee 6ee 6ZdS(sRelationship dependencies. i(t attributes(texc(tsync(t unitofwork(tutil(t MANYTOMANY(t MANYTOONE(t ONETOMANYi(tsqltDependencyProcessorcBseZdZedZdZdZdZdZdZ dZ dZ d Z d Z d Zd Zd ZedZdZdZRS(cCs||_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j |_ |jrt j |_ n t j |_ |jrt j |_n t j |_|j|_|jjstjd|jndS(Ns|Can't build a DependencyProcessor for relationship %s. No target attributes to populate between parent and child are present(tproptcascadetmappertparentt secondaryt directiont post_updatetpassive_deletestpassive_updatestenable_typechecksRtPASSIVE_NO_INITIALIZEt_passive_delete_flagt PASSIVE_OFFt_passive_update_flagtkeytsynchronize_pairstsa_exct ArgumentError(tselfR ((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyt__init__s*                cCst|j|S(N(t_direction_to_processorR(tclsR ((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pytfrom_relationship6scCs|jjj|jj|S(sreturn True if the given object instance has a parent, according to the ``InstrumentedAttribute`` handled by this ``DependencyProcessor``. (R t class_managertget_implRt hasparent(Rtstate((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyR#:scCs|j|tdS(sestablish actions and dependencies related to a flush. These actions will operate on all relevant states in the aggregate. N(tregister_preprocessortTrue(Rtuow((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pytper_property_preprocessorsBscCstj||tt}tj||tt}tj||jj}tj||jj}tj||jj}tj||jj}|j |||||||dS(N( Rt ProcessAlltFalseR&t SaveUpdateAllR tprimary_base_mapperR t DeleteAlltper_property_dependencies(RR't after_savet before_deletet parent_savest child_savestparent_deletest child_deletes((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pytper_property_flush_actionsKs$c Cs|jj}tj||}tj||}|rZtj||tt}t|_n!tj||tt}t|_||j kr||j kst |tf|tfg} t} nt} |s tj||j j } d} }| |j krCt} qCn:tj||j j } d} }| |j krCt} nx|D]}|j|jjj||j|r{|jntj}|sqJn|rtj||t|}| rtj||} qn3tj||t|}| rtj||} n| rg} x|D]}\}}||jkr9d}nL|j|\}}|rmtj||tf}ntj||tf}| j|qWnx6| D].\}}|j|| | |||||qWqJWdS(sestablish actions and dependencies related to a flush. These actions will operate on all relevant states individually. This occurs only if there are cycles in the 'aggregated' version of events. N(NN(R R,RR+R-R)R&tdisabledR*tcyclestAssertionErrorR t base_mappertNonetmanagerRtimpltget_all_pendingtdictRRRt ProcessStatet DeleteStatetSaveUpdateStatetstatestappendtper_state_dependencies(RR'RBtisdeletetchild_base_mapperR2R4R0R/t child_actionstchild_in_cyclesR1R3tparent_in_cyclesR$tsum_t child_statetchildt child_actiontdeletedtlistonlyt childisdelete((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pytper_state_flush_actionsgsx             cCstS(N(R*(Rt uowcommitRB((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pytpresort_deletesscCstS(N(R*(RRRRB((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyt presort_savesscCsdS(N((RRRRB((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pytprocess_deletesscCsdS(N((RRRRB((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyt process_savesscCs| s|jrtj}n$|jtkr7tj}n tj}x`|D]5}|j||j|}|rG|j rGt SqGW|o|j j o|j |jkSdS(N(RRRRRtPASSIVE_NO_FETCH_RELATEDRtget_attribute_historyRtemptyR&R t_is_self_referentialR tmappers(RRRRBREtpassivetsthistory((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pytprop_has_changess     cCs|jjr4|dkr4tjd|jfn|dk r|jj|d|j  r|jj|dtrtjdi|j d6|jd6|jj d6|jd6qtjdi|j d6|jd6|jj d6ndS( Ns-Can't flush None value found in collection %stallow_subtypessEAttempting to flush an item of type %(x)s as a member of collection "%(y)s". Expected an object of type %(z)s or a polymorphic subclass of this type. If %(x)s is a subclass of %(z)s, configure mapper "%(zm)s" to load this subtype polymorphically, or set enable_typechecks=False to allow any subtype to be accepted for flush. txtytztzmsAttempting to flush an item of type %(x)s as a member of collection "%(y)s". Expected an object of type %(z)s or a polymorphic subclass of this type.( R tuselistR:Rt FlushErrorR t_canloadRR&tclass_(RR$((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyt_verify_canloads(      cCs tdS(N(tNotImplementedError(RR$RLtassociationrowt clearkeysRR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyt _synchronize"scCs^|jjsdStt|jgg|jjD]}|j^q,}|jd|ftS(Nt reverse_key(R t_reverse_propertyR:ttupletsortedRtmemotset(RR'tpt process_key((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyt_get_reversed_processed_set%s  5cCs[xT|D]L}| s |dk r|j|g|jjD]\}}|^q6PqqWdS(N(R:tregister_post_updateR R(RR$RRtrelatedt is_m2o_deleteRatltr((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyt _post_update.s  )cCs tdS(N(Rj(RRRR$((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyt _pks_changed6scCsd|jj|jfS(Ns%s(%s)(t __class__t__name__R (R((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyt__repr__9s(Rt __module__Rt classmethodR R#R(R5RQRSRTRURVR_RiRmRvR*R|R}R(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyR s"    p      )   t OneToManyDPcBsPeZdZdZdZdZdZdZdZdZ RS(c Cs|jrtj||jjt}tj||jjt} |jj||f||f||f|| f| |f| |fgnO|jj||f||f||f||f||f||f||fgdS(N( RRt PostUpdateAllR R,R*R&t dependenciestupdate( RR'R1R2R3R4R/R0tchild_post_updatestchild_pre_updates((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyR.>s(              c CsH|jrtj||jjt} tj||jjt} |s|rp|jj||f|| fgq|jj||f||f|| fgqD|r|jj|| f| |fgqD|jj|| f| |fgnV|s"|jj||f||f||fgn"|jj||f||fgdS(N( RRRR R,R*R&RR( RR't save_parentt delete_parentRMR/R0RERPRR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRDgs8              cCs|jj o|jdk }x|D]}|j||j|j}|r$xd|jD]Y}|dk rU|j|t krU|jj r|j |dt q|j |qUqUW|rx?|j D]1}|dk r|j |ddd|jqqWqq$q$WdS(NtallREt operationtdeleteR (R RRRXRRRNR:R#R*t delete_orphantregister_objectR&t unchangedR (RRRRBtshould_null_fksR$R^RL((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRSs !  c Cs|jd|ft}|jj o2|jdk }x|D]}|j||}| sd|jrptj}n tj }|j ||j |}|rxB|j D]7} | dk r|j| dtddd|jqqW|j|j x|jD]} |jjs6|r|j| dtddd|jqq|j| tkr|j| dtddd|jx?|jjd| D]%\} } } } |j| dtqWqqWn|r<|rxH|jD]:} | dk r|j| t|jdd d|jqqWqq<q<WdS( Ntchildren_addedRt cancel_deleteRtaddR RERs pk change(RrRsR RRR}RRRRRXRtaddedR:RR&R RRNR*R#R tcascade_iteratorR(RRRRBRRR$t pks_changedR\R^RLtctmtst_tdct_((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRTsZ        !  c Csx|js|jdk rt|jd|ft}x@|D]5}|j||j|j}|r8xy|jD]n}|dk ri|j |t kri|j ||dt |t |jr|r|j |||gqqiqiW|js|jj rmxvt|jj|D]Y}|dk r |j ||dt |t |jrc|rc|j |||gqcq q Wqmq8q8WndS(NRR(RRRrRsRXRRRNR:R#R*RmR&R|R RRt difference(RRRRBRR$R^RL((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRUs,     c CsO|jj o|jdk }x+|D]#}|j||jtj}|r$x[|jD]P}|j||dt |t |dk rU|j rU|j |||gqUqUWxS|j D]H}|r|jj r|j| r|j||dt|t qqW|j||rGx0|jD]"}|j||dt |tqWqGq$q$WdS(NR(R RRRXRRRRRmR:R*RR|RNR#R&R}R(RRRRBRR$R^RL((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRV/s*   c Cs|}|}|j||dks>|j rB|j|rBdS|rgtj||j|jjn4tj ||j ||j|jj||j o|dS(N( RiR:Rt is_deletedRtclearR R RtpopulateR R( RR$RLRkRlRRRtsourcetdest((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRmQs    cCstj|||j|jjS(N(Rtsource_modifiedR R R(RRRR$((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyR}hs( RRR.RDRSRTRURVRmR}(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyR=s ) C  > , " t ManyToOneDPcBsSeZdZdZdZdZdZdZdZddZ RS( cCsAtj||x*|jjD]}|jjt|qWdS(N(R RR tself_and_descendantst_dependency_processorsRCtDetectKeySwitch(RR R ((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRosc Cs|jrtj||jjt}tj||jjt} |jj||f||f||f|| f|| f| |f| |fgn4|jj||f||f||f||fgdS(N( RRRR R,R*R&RR( RR'R1R2R3R4R/R0tparent_post_updatestparent_pre_updates((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyR.ts$            c Cs?|jr|stj||jjt} |rU|jj|| f| |fgq|jj||f||f|| fgq;tj||jjt} |jj|| f| |f| |fgno|s|s|jj||f||fgq;|jj||fgn"|r;|jj||fgndS(N( RRRR R,R*RRR&( RR'RRRMR/R0RERPRR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRDs2          c Cs|jjs|jjrx|D]}|j||j|j}|r|jjra|j}n |j}x|D]}|dkrqtn|j |dt ddd|j |j j d|}x-|D]%\}} } } |j | dt qWqtWqqWndS(NRERRR (R RRRXRRtsumt non_deletedR:RR&R R R( RRRRBR$R^ttodeleteRLttRRRR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRSs&      c Csx|D]}|j|ddd|j|jjr|j||j|j}|rx|jD]}|j|t kr`|j|dt ddd|j|j j d|}x0|D]%\}}} } |j| dt qWq`q`WqqqWdS(NRRR RER( RR R RRXRRRNR#R*R&R R( RRRRBR$R^RLRRRRR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRTs    cCs|jr|jj r|jdk rx|D]t}|j|ddt||r-|jr-|j||j|j }|r|j |||j dtqq-q-WndS(NRRy( RR RRRmR:R&RXRRR|R(RRRRBR$R^((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRUs   c Csx|D]}|j||jtj}|r|jrjxX|jD]"}|j||dt|dqAWn(|jr|j|ddt |dn|j r|j |||j qqqWdS(NRR( RXRRRRRmR:R*RNR&RR|R(RRRRBR$R^RL((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRVs    cCs|dks%|j r)|j|r)dS|dk r~|dk r~|jj| r~tjdtj|||j fdS|s|dkrt j ||j |j j n8|j|t j||j||j |j j |tdS(NsGObject of type %s not in session, %s operation along '%s' won't proceed(R:RRtsessiont_contains_stateRtwarnt mapperutiltstate_class_strR RRR RRiRR R*(RR$RLRkRlRRR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRm*s*     N( RRRR.RDRSRTRURVR:Rm(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRns  ( :    RcBsqeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z RS( sFor many-to-one relationships with no one-to-many backref, searches for parents through the unit of work when a primary key has changed and updates them. Theoretically, this approach could be expanded to support transparent deletion of objects referenced via many-to-one as well, although the current attribute system doesn't do enough bookkeeping for this to be efficient. cCsP|jjr<|jrdStd|jjDkr<dSn|j|tdS(Ncss|]}|jVqdS(N(R(t.0R ((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pys es(R RoRR*R%(RR'((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyR(_s  cCsMtj||jj}tj||tt}|jj||fgdS(N(RR+R R9R)R*RR(RR'R1R/((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyR5lscCsdS(N((RR'RBRE((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRQqscCsdS(N((RRRRB((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRStscCs |js|j||ndS(N(Rt_process_key_switches(RR'RB((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRTws cCs0| r,|jr,|j||}t|StS(N(Rt_key_switcherstboolR*(RR'RBREtd((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyR_}s cCsts tdS(N(R*R8(RRRRB((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRUscCs#|jst|j||dS(N(RR8R(RRRRB((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRVscCs|jd|fd\}}|j|}xL|D]D}||kr7|j||rk|j|q{|j|q7q7W|S(Nt pk_switcherscSsttfS(N(Rs(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pytt(RrtunionR}R(RR'RBtswitchedt notswitchedt allstatesR]((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRs  c Cs5|j||}|r1x|jjjD]}t|j|jjsOq+n|j}|j|j j ||d|j }|t j k r+|dk r+|jjr|sq+n|d}n|}t j|}||kr*|j|t|jtj||j||j|jj||jq*q+q+WndS(NR\i(RRt identity_mapt all_statest issubclassRhR R>R"RtgetRRtPASSIVE_NO_RESULTR:R Retinstance_stateRR*RRRR R( RtdeplistRRt switchersR$tdict_Rxt related_objt related_state((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRs6      cCs.t|jo-tj|||j|jjS(N(RRRRR R R(RRRR$((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyR}s(RRt__doc__R(R5RQRSRTR_RURVRRR}(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRSs          %t ManyToManyDPcBsYeZdZdZdZdZdZdZdZdZ dZ RS( c CsS|jj||f||f||f||f||f||f||fgdS(N(RR(RR'R1R2R3R4R/R0((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyR.s       c Cs||sV|r1|jj||f||fgqx|jj||f||fgn"|jj||f||fgdS(N(RR( RR'RRRMR/R0RERP((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRDs    cCs:|js6x*|D]}|j||j|jqWndS(N(RRXRR(RRRRBR$((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRSs  c Cs#|jsMxA|D]6}|j||r|j||jtj}qqWn|jjs]dSx|D]}|j||jtj}|rdx|j D]}|j |t kr|j |dt ddd|jx?|jjd|D]%\}}}} |j |dt qWqqWqdqdWdS(NRERRR (RR}RXRRRR RRRNR#R*RR&R R R( RRRRBR$R^RLRRRR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRT s*      c s6g}g}g}|j|}t}x|D]|j|j|j}|r1x{|jD]m} | dkse|dk r| f|krqeni} |j| | t|dsqen|j | qeW|j fd|jDq1q1W|dk r|j |n|j ||||dS(NRc3s|]}|fVqdS(N((RR(R$(sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pys Ks( RvRsRXRRt non_addedR:RmR*RCRt _run_crud( RRRRBtsecondary_deletetsecondary_inserttsecondary_updatet processedttmpR^RLRk((R$sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRU,s8    * c sBg}g}g}|j|}t}x|D]|j oP|j|}|retj} n tj} |j|j| } | r1xl| j D]a} |dk r| f|krqni} |j | | t |dsqn|j | qWxl| jD]a} |dk r/| f|kr/qni} |j | | t |dsYqn|j | qW|jfd| j | jD|rxk| jD]]} i} tj|j| d|jjtj| |j| d|jj|j | qWqq1q1W|dk r(|j|n|j||||dS(NRRc3s|]}|fVqdS(N((RR(R$(sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pys ~stold_(RvRsRR}RRRRXRRR:RmR*RCRNRRRR R RR tsecondary_synchronize_pairsR( RRRRBRRRRRtneed_cascade_pksR\R^RLRk((R$sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRVTsn      '   c Cs|jj|j}|r|d}|jjtjg|jjD]6}|j|krA|tj |jd|j k^qA}|j ||} | j r| j t|krtjd|jjt|| j fqn|r|d}|jjtjg|jjD]:}|j|kr|tj d|jd|j k^q}|j ||} | j r| j t|krtjd|jjt|| j fqn|r|jj}|j ||ndS(Nittype_sRDELETE statement on table '%s' expected to delete %d row(s); Only %d were matched.RsRUPDATE statement on table '%s' expected to update %d row(s); Only %d were matched.(t transactiont connectionR RRRtand_RRt bindparamttypetexecutetsupports_sane_multi_rowcounttrowcounttlenRtStaleDataErrort descriptionRtinsert( RRRRRRRRkRt statementtresult((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRsD  <     @   cCs|j||dkrtS|dk rr|jj| rr|jsntjdtj |||j fntSt j ||j ||j jt j ||j||j jtS(NsGObject of type %s not in session, %s operation along '%s' won't proceed(RiR:R*RRRNRRRRR Rt populate_dictR RR RR&(RR$RLRkRlRRR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRms"     cCstj|||j|jjS(N(RRR R R(RRRR$((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyR}s( RRR.RDRSRTRURVRRmR}(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyRs   " ( H = !N(RRRRRRRRt interfacesRRRRRtobjectR RRRRR(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dependency.pyt s.%2u9