ÿØÿà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@sdZddlmZddlmZddlZddlmZddlmZddlmZ dd lm Z dd lm Z dd l m Z dd l mZd dlmZd dlmZd dlmZd dlmZd dlmZdZdZedZdZdZdZdZdZeeedZedZdZ dZ!e"dZ#e"dZ$d Z%d!Z&d"Z'd#Z(d$Z)d%Z*d&Z+d'Z,d(Z-d)e.fd*YZ/d+e/fd,YZ0d-e/fd.YZ1d/e/fd0YZ2d1e/fd2YZ3d3e0e2fd4YZ4d5e0e3fd6YZ5d7e1e2fd8YZ6d9e1e3fd:YZ7dS(;sprivate module containing functions used to emit INSERT, UPDATE and DELETE statements on behalf of a :class:`.Mapper` and its descending mappers. The functions here are called only by the unit of work functions in unitofwork.py. i(tchain(tgroupbyNi(t attributes(t evaluator(texc(tloading(tsync(t_entity_descriptor(t state_stri(tsql(tutil(t expression(t _from_objectsc sj}t|}|jjr0tdn|r|rg|D]}||jf^qC} g| D]\}} | ^qe}qg|D]}|j^q}n t|}|j|x|jj D]\} } j | sqnfdt | fd|Ddt d|d|D} t |d|| | | d|qW|r|rj}gjD]}|j^qt}xC| D]8\}} |tg|D]}| |^qf|_qWndS(NsJconnection_callable / per-instance sharding not supported in bulk_insert()c 3sE|];\}}}}}}}}d|||||fVqdS(N(tNone( t.0tstatet state_dicttparamstmptconnt value_paramst has_all_pksthas_all_defaults(t connectiontmapper(sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pys Ds c3s!|]}d|fVqdS(N(R (Rtmapping(RR(sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pys Ystbulktreturn_defaultst render_nullst bookkeeping(t base_mappert_cached_connection_dicttsessiontconnection_callabletNotImplementedErrortdicttlistRt_sorted_tablestitemstisat_collect_insert_commandstTruet_emit_insert_statementsR t_identity_classt_identity_key_propstkeyttuple(Rtmappingstsession_transactiontisstatesRRRtcached_connectionsRtstatestdict_ttablet super_mappertrecordst identity_clstptidentity_propsR-((RRsM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyt _bulk_insert#sH    ""     c sZj}t|}jjrBjjhjnfd}|r|rg|D]}||^qd}qg|D]}|j^q}n t|}|jj rt dn|j |x||j j D]k\} } j| sqntd| fd|Ddt} t|d|| | | dtqWdS(Ncs&tfdjjDS(Nc3s<|]2\}}|jks*|kr||fVqdS(N(tcommitted_state(Rtktv(t search_keysR(sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pys s (R#R&(RR(R?(RsM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyt _changed_dict~ssJconnection_callable / per-instance sharding not supported in bulk_update()c3s=|]3}d|jr.|jjndfVqdS(N(R t_version_id_propR-(RR(RR(sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pys s RR(RRt_primary_key_propkeysRAR-tunionR#R$R R!R"RR%R&R't_collect_update_commandsR R)t_emit_update_statementstFalse( RR/R0R1tupdate_changed_onlyRR2R@RR5R6R7((RRR?sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyt _bulk_updatess@    %     cCs| rE|j rEx-t|D]}t||g|dtqWdSg}g}t|}xst|||D]_\}}} } } } } | s| r|j||| | | fqp|j||| | fqpWx|jjD]t\}} || j krqnt ||}t |||}t |||| ||t |||| ||qWt||td|Dd|DdS(s;Issue ``INSERT`` and/or ``UPDATE`` statements for a list of objects. This is called within the context of a UOWTransaction during a flush operation, given a list of states to be flushed. The base mapper in an inheritance hierarchy handles the inserts/ updates for all descendant mappers. tsingleNcss0|]&\}}}}||||tfVqdS(N(RF(RRRRR((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pys scss3|])\}}}}}||||tfVqdS(N(R)(RRRRRtupdate_version_id((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pys s (tbatcht _sort_statestsave_objR)Rt_organize_states_for_savetappendR%R&t _pks_by_tableR(RDRER*t _finalize_insert_update_commandsR(RR3tuowtransactionRIRtstates_to_updatetstates_to_insertR2R4RRt has_identityt row_switchRJR5tinserttupdate((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRMsR  +  cst|}tt|||}x||jjD]k\jkrUq4nfd|D}t||||}t||||q4WdS(s\Issue UPDATE statements on behalf of a relationship() which specifies post_update. c 3sf|]\\}}}}|jkr||||jdk rWj||jndfVqdS(N(RPtversion_id_colR t#_get_committed_state_attr_by_column(RRRt sub_mapperR(RR5(sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pys s N(RR$t _organize_states_for_post_updateR%R&RPt_collect_post_update_commandst_emit_post_update_statements(RR3RRtpost_update_colsR2RSRX((RR5sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyt post_updates"  c Cst|}tt|||}|j}xtt|jD]k}||}||jkrkqFn|jr|jrqFnt ||||}t ||||||qFWx3|D]+\} } }} } |j j || | qWdS(sIssue ``DELETE`` statements for a list of objects. This is called within the context of a UOWTransaction during a flush operation. N( RR$t_organize_states_for_deleteR%treversedtkeysRPtinheritstpassive_deletest_collect_delete_commandst_emit_delete_statementstdispatcht after_delete( RR3RRR2tstates_to_deletettable_to_mapperR5RtdeleteRRRRJ((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyt delete_obj;s,    c csxt|||D]\}}}}t|j}|jpI|j|}d} } |su|jj|||n|jj||||jr|j|||n| rf||j j krf|j j |} t j | } |j | sf|j| s+tjdt||t| fn|jd|t|t| |j| | } qfn|sr| r|jdk r|j| r| n|| r| jn||j} n|||||| | fVqWdS(sTMake an initial pass across a set of states for INSERT or UPDATE. This includes splitting out into distinct lists for each, calling before_insert/before_update, obtaining key information for each state including its dictionary, mapper, the connection to use for the execution per state, and the identity flag. sJNew instance %s with identity key %s conflicts with persistent instance %ssPdetected row switch for identity %s. will update %s, remove %s from transactionN(t_connections_for_statestboolR-t_identity_key_from_stateR Rht before_insertt before_updatet_validate_polymorphic_identityR t identity_mapRtinstance_statetwas_already_deletedt is_deletedtorm_exct FlushErrorRt _log_debugtremove_state_actionsRYRZR#( RR3RRRR4RRRUt instance_keyRVRJtinstancetexisting((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRNisL   "    cCst|||S(sMake an initial pass across a set of states for UPDATE corresponding to post_update. This includes obtaining key information for each state including its dictionary, mapper, the connection to use for the execution per state. (Rn(RR3RR((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyR\s ccsxt|||D]l\}}}}|jj||||jdk re|j|||j}nd}|||||fVqWdS(sMake an initial pass across a set of states for DELETE. This includes calling out before_delete and obtaining key information for each state including its dictionary, mapper, the connection to use for the execution per state. N(RnRht before_deleteRYR RZ(RR3RRRR4RRRJ((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRasc cs-x&|D]\}}}}||jkr.qni} i} |j|} |j|} xt| j|D]} || }| | }|dkr|| kr| rqjqj| rt|dst|tj rt|dr|j n|| |ZsRc3s+|]!}|jj|fVqdS(N(t_labeltget(RR(RR(sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pys st pk_cascadedisCCan't update table %s using NULL for primary key value on column %sN(-RPRR#RRRt_pk_attr_keys_by_tableR)R<RRR RRtmanagertimpltis_equalR-RRt_server_onupdate_default_colsRR RYRt_columntopropertytvaluest get_historyRtPASSIVE_NO_INITIALIZEtaddedRRRFt PASSIVE_OFFtdeletedtpopt unchangedRxRyRXt_table_to_equatedRtpopulatetpassive_updates(RRR5RSRRRRRJtpksRRRRRRtpropthistoryt no_paramstvalRtexpect_pk_cascadedt pk_paramstmt equated_pairs((RRsM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRD7s                            ccsx|D]\}}}}} |j|} i} t} x|j|D]} | | kr}|j||| dtj| | j| j j}| oK }| rx|D]\}}}} }} } | j|j||}|rt|||||jjd|t n||j7}|}q[WnL|ss|}x=|D]v\}}}} }} } || j||}|r_t|||||jjd|t n||j7}qWng|D]}|d^qz}|p|ot|dk}|| j||}||j7}x[|D]S\}}}} }} } |rt|||||jjd|t qqW|rr|t|krtjdjt||fqqeretjd|j jqeqeWd S( s`Emit UPDATE statements corresponding to value lists collected by _collect_update_commands().cstj}x@jD]1}|jj|tj|jd|jkqWr|jjjtjjjdjjknj |}|S(Nttype_( R tand_RPtclausesROt bindparamRttypeRYRX(tclauseRtstmt(Rtneeds_version_idR5(sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyt update_stmt`s  &  RXcSs3|dt|dt|d|d|dfS(Niiiii(RRo(trec((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyt{s   iiisMUPDATE statement on table '%s' expected to update %d row(s); %d were matched.sMDialect %s does not support updated rowcount - versioning cannot be verified.N(RYR Rt_memoRR$RFRR)RRtdialecttsupports_sane_rowcountt supports_sane_rowcount_returningtsupports_sane_multi_rowcounttexecuteRt _postfetchtcontexttcompiled_parameterstrowcounttlenRxtStaleDataErrort descriptionR twarntdialect_description(RRRR2RR5RXRRt cached_stmtRt paramkeysthasvalueRRR7trowst statementRtassert_singlerowtassert_multirowtallow_multirowRRRRRtcheck_rowcountRt multiparams((RRR5sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyREOs %           "     "        " "c Cs|jd|f|j}xt|dD]\\}} } } } } |}| s| ss|j ss|jj rD| rD| rDt| } g| D]}|d^q}||j||}|rxyt| |j j D]_\\}}}}}}} } }|r*t ||||||||t qt |||qWqq.| rc|jrc|j}n$|jdk r|j|j}nx=| D]5\}}}}}}} } |r|j|j||}n||j||}|j j}|dk ruxtt||j|D]Y\}}|j|}|dk r||ks^|j|jdkr|||j\sR-cSs |jdS(Ni(R-(tq((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyR_Rs^Could not sort objects by primary key; primary key values must be sortable in Python (was: %s)t insert_order(Rtdifference_updatetsortedt TypeErrortsa_exctInvalidRequestErrortoperatort attrgetter(R3tpendingt persistenttpersistent_sortedterr((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRLZs  tBulkUDcBseZdZdZdZedZedZdZ dZ dZ e j dd Zd Zd ZRS( s5Handle bulk update and deletes via a :class:`.Query`.cCs2|jt|_|jj|_|jdS(N(tenable_eagerloadsRFRt _bind_mapperRt_validate_query_state(tselfR((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyt__init__nsc Csxdddtjfdddtjfddttjfddttjfd d ttjfd d dtjffD]F\}}}}|t|j||sstjd |fqsqsWdS(Nt_limitslimit()t_offsetsoffset()t _order_bys order_by()t _group_bys group_by()t _distincts distinct()t _from_objs2join(), outerjoin(), select_from(), or from_self()sCCan't call Query.update() or Query.delete() when %s has been called(( R Rtis_RFteqtgetattrRRR(R)tattrtmethnametnotsettop((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyR(sscCs |jjS(N(RR (R)((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyR scGs\y||}Wn=tk rMtjddjtd|Dn X||SdS(Ns3Valid strategies for session synchronization are %ss, css|]}t|VqdS(N(trepr(Rtx((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pys s(tKeyErrorRt ArgumentErrortjoinR(tclstlookuptsynchronize_sessiontargtklass((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyt_factorys 'cCs@|j|j|j|j|j|jdS(N(t_do_before_compilet_do_pret_do_pre_synchronizet_do_exect_do_post_synchronizet_do_post(R)((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pytexec_s      cCs.|jj||j|_|jj|_dS(N(Rt _execute_crudRRR(R)R((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyt _execute_stmtscCs tdS(N(R"(R)((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRCsssqlalchemy.orm.querycCs|j}|j||_t|jd|jrt}xG|jD]<}t||jsm|jPqG|jt |j qGWt |dkrt j dq|j|_n|jdjj|_|j}|jr|jndS(NiisLThis operation requires only one Table or entity be specified as the target.(Rt QueryContextRRt _entitiest _ColumnEntityRtclearRXR tcolumnRRRRt primary_tablet_only_entity_zeroRt local_tableR t _autoflush(R)tquerylibRttablestentR ((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRDs$      cCsdS(N((R)((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyREscCsdS(N((R)((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRGs(t__name__t __module__t__doc__R*R(tpropertyR t classmethodRBRIRKRCR t dependenciesRDRERG(((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyR%ks     # t BulkEvaluatecBs eZdZdZdZRS(sDBulkUD which does the 'evaluate' method of session state resolution.cCsdS(N((R)tevaluator_compiler((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyt_additional_evaluatorssc Cs|j}|jj}yMtj|}|jdk rN|j|j}n d}|j|Wn)tj k r}t j d|nXg|j j jD]6\\}}}} t||r|| r| ^q|_dS(NcSstS(N(R)(R((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyteval_conditionsstCould not evaluate current criteria in Python: "%s". Specify 'fetch' or False for the synchronize_session parameter.(Rt _mapper_zerotclass_RtEvaluatorCompilert whereclauseR tprocessR`tUnevaluatableErrorRRR RtR&t issubclasstmatched_objects( R)Rt target_clsR_RaR$R=Rtidentity_tokenR((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyREs  %(RXRYRZR`RE(((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyR^s t BulkFetchcBseZdZdZRS(sABulkUD which does the 'fetch' method of session state resolution.cCsd|j}|j}|j}|jj|jj}|j|d|jd|j j |_ dS(NRR( RR t_compile_contextRtwith_only_columnsRQRRRt_paramstfetchallt matched_rows(R)RR Rt select_stmt((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyREs    (RXRYRZRE(((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRlst BulkUpdatecBs_eZdZdZedZdZedZedZ dZ dZ RS(sBulkUD which handles UPDATEs.cCs,tt|j|||_||_dS(N(tsuperRsR*Rt update_kwargs(R)RRRu((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyR* s cCs.tjitd6td6tt6||||S(Ntevaluatetfetch(R%RBtBulkUpdateEvaluatetBulkUpdateFetchRsRF(R=RR?RRu((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pytfactoryscCsZ|jjjrVxD|jjjD]0}||j|}|dk r||_qqWndS(N(RRhtbefore_compile_updateR (R)tfnt new_query((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRCs  cCsg}xt|jdr*|jjn|jD]\}}|jrt|tjrt|j|}|j|j |qt|t j r|j|j |q|j ||fq1|j ||fq1W|S(NR&( RRR&RRR t string_typesRRt_bulk_update_tuplesRtQueryableAttributeRO(R)RR=R>tdesc((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyt_resolved_values$s! cCsg}x|jD]\}}t|tjrJ|j|j|fqnt|drh|j}n|jrt|t j ry|jj |}Wnt j k rqX|j|j|fqtjd|qW|S(NRsInvalid expression type: %r(RRRRROR-RRRR t ColumnElementRRxtUnmappedColumnErrorRR(R)RR=R>R4((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyt"_resolved_values_keys_as_propnames8s cCsb|j}|jjdts-t|}ntj|j|jj ||j}|j |dS(Ntpreserve_parameter_order( RRuRRFR#R RXRQRReRK(R)RR((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRFOs   cCs |jj}|jj|dS(N(RR Rhtafter_bulk_update(R)R ((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRH^s ( RXRYRZR*R\RzRCR[RRRFRH(((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRss   t BulkDeletecBsAeZdZdZedZdZdZdZRS(sBulkUD which handles DELETEs.cCstt|j|dS(N(RtRR*(R)R((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyR*fscCs(tjitd6td6tt6||S(NRvRw(R%RBtBulkDeleteEvaluatetBulkDeleteFetchRRF(R=RR?((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRziscCsZ|jjjrVxD|jjjD]0}||j|}|dk r||_qqWndS(N(RRhtbefore_compile_deleteR (R)R|R}((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRCus  cCs,tj|j|jj}|j|dS(N(R RlRQRReRK(R)R((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRF|scCs |jj}|jj|dS(N(RR Rhtafter_bulk_delete(R)R ((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRHs ( RXRYRZR*R\RzRCRFRH(((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRcs    RxcBs eZdZdZdZRS(sSBulkUD which handles UPDATEs using the "evaluate" method of session resolution.cCsLi|_|j}x3|D]+\}}|jtj||j|((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pys s(RR RbRRqtidentity_key_from_primary_keyR$RtRRuRRR#t _expire_stateR( R)R t target_mapperRt identity_keyR3RtattribRt to_expire((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRGs ,.  (RXRYRZRG(((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRysRcBseZdZdZRS(sPBulkUD which handles DELETEs using the "fetch" method of session resolution.cCsz|jj}|jj}xX|jD]M}|jt|}||jkr%|jtj |j|gq%q%WdS(N( RR RbRqRR$RtRRRu(R)R RRR((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRGs (RXRYRZRG(((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pyRs(8RZt itertoolsRRRRRRRRxRRtbaseRRRR R R tsql.baseR R;RHRFRMR`RmRNR\RaR(RDR]RfR)RER*R^RgRQRRRRnRRLtobjectR%R^RlRsRRxRRyR(((sM/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/persistence.pytsb  P E V - . Q  U 8 . { s ^ F ) `   e(\#(