zmc
2023-08-08 e792e9a60d958b93aef96050644f369feb25d61b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
U
¸ý°d̼ã@södZddlmZddlmZddlmZddlmZddlmZddlmZ    dd    l
m Z dd
l
m Z dd l
m Z d dlmZd d lmZd dlmZGdd„dƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZe ee ee eiZdS)zRelationship dependencies.
 
é)Ú annotationsé)Ú
attributes)Úexc)Úsync)Ú
unitofwork)Úutil)Ú
MANYTOMANY)Ú    MANYTOONE)Ú    ONETOMANYé)Úsqlc@sšeZdZdd„Zedd„ƒZdd„Zdd„Zd    d
„Zd d „Z    d d„Z
dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zd%dd„Zd d!„Zd"d#„Zd$S)&ÚDependencyProcessorcCs¶||_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j|_|j    |_    |jr^t
j |_ nt
j |_ |jrvt
j |_nt
j |_d|jj|jf|_|j|_|jjs²t d|j¡‚dS)Nz%s_%sz|Can't build a DependencyProcessor for relationship %s. No target attributes to populate between parent and child are present)ÚpropÚcascadeÚmapperÚparentÚ    secondaryÚ    directionÚ post_updateÚpassive_deletesÚpassive_updatesÚenable_typechecksrÚPASSIVE_NO_INITIALIZEÚ_passive_delete_flagÚ PASSIVE_OFFÚ_passive_update_flagÚ    _sort_keyÚkeyÚsort_keyÚsynchronize_pairsÚsa_excÚ ArgumentError)Úselfr©r$úPd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\sqlalchemy/orm/dependency.pyÚ__init__s0
 
þÿzDependencyProcessor.__init__cCst|j|ƒS©N)Ú_direction_to_processorr)Úclsrr$r$r%Úfrom_relationship;sz%DependencyProcessor.from_relationshipcCs|jj |j¡ |¡S)z¤return True if the given object instance has a parent,
        according to the ``InstrumentedAttribute`` handled by this
        ``DependencyProcessor``.
 
        )rZ class_managerÚget_implrÚ    hasparent©r#Ústater$r$r%r,?szDependencyProcessor.hasparentcCs| |d¡dS)z•establish actions and dependencies related to a flush.
 
        These actions will operate on all relevant states in
        the aggregate.
 
        TN)Úregister_preprocessor©r#Úuowr$r$r%Úper_property_preprocessorsGsz.DependencyProcessor.per_property_preprocessorsc    Cszt ||dd¡}t ||dd¡}t ||jj¡}t ||jj¡}t ||jj¡}t ||jj¡}| |||||||¡dS©NFT)rÚ
ProcessAllÚ SaveUpdateAllrÚprimary_base_mapperrÚ    DeleteAllÚper_property_dependencies)r#r1Ú
after_saveÚ before_deleteÚ parent_savesÚ child_savesÚparent_deletesÚ child_deletesr$r$r%Úper_property_flush_actionsPs6ÿÿÿÿùz.DependencyProcessor.per_property_flush_actionsc Csô|jj}t ||¡}t ||¡}|r<t ||dd¡}d|_nt ||dd¡}d|_||jkr€||jksjt‚|df|dfg}    d}
nd}
|s°t ||j    j
¡} d} }| |jkrÖd} n&t ||j    j
¡} d} }| |jkrÖd} |D]}|j |j j  ||j|rþ|jntj¡}|sqÚ|r8t ||d|¡}| rZt ||¡} n"t ||d|¡}| rZt ||¡} |
rÆg}    |D]\\}}||jkr‚d}n6|j|\}}|r¨t ||¡df}nt ||¡df}|     |¡qh|    D]"\}}| || | |||||¡qÊqÚdS)zèestablish 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.
 
        TFN)NN)rr6rr5r7r4ÚdisabledZcyclesÚAssertionErrorrÚ base_mapperÚmanagerrÚimplZget_all_pendingÚdictrrrZ ProcessStateZ DeleteStateZSaveUpdateStateÚstatesÚappendÚper_state_dependencies)r#r1rFÚisdeleteZchild_base_mapperr<r>r:r9Z child_actionsZchild_in_cyclesr;r=Zparent_in_cyclesr.Zsum_Z child_stateÚchildÚ child_actionÚdeletedZlistonlyÚ childisdeleter$r$r%Úper_state_flush_actionsls†      
ÿ
 
 
ÿû   
þ
þ øz+DependencyProcessor.per_state_flush_actionscCsdS©NFr$©r#Ú    uowcommitrFr$r$r%Úpresort_deletesÜsz#DependencyProcessor.presort_deletescCsdSrOr$rPr$r$r%Ú presort_savesßsz!DependencyProcessor.presort_savescCsdSr'r$rPr$r$r%Úprocess_deletesâsz#DependencyProcessor.process_deletescCsdSr'r$rPr$r$r%Ú process_savesåsz!DependencyProcessor.process_savescCsp|r
|jrtj}n|jtkr$tj}ntj}|D]&}| ||j|¡}|r.|     ¡s.dSq.|on|j
j on|j |j kS)NT)rrrrr
ZPASSIVE_NO_FETCH_RELATEDrÚget_attribute_historyrÚemptyrZ_is_self_referentialrZmappers)r#rQrFrIÚpassiveÚsÚhistoryr$r$r%Úprop_has_changesès
 
 ÿ
ýz$DependencyProcessor.prop_has_changescCs–|jjr$|dkr$t d|jf¡‚nn|dk    r’|jj||j ds’|jj|ddrtt d|j|j|jj|jdœ¡‚nt d|j|j|jjdœ¡‚dS)Nz-Can't flush None value found in collection %s)Zallow_subtypesTaEAttempting 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. )ÚxÚyÚzZzmz•Attempting 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\r]r^)rÚuselistrZ
FlushErrorrZ_canloadrÚclass_r-r$r$r%Ú_verify_canloads8ÿÿÿ
ü÷ÿýûÿz#DependencyProcessor._verify_canloadcCs
tƒ‚dSr'©ÚNotImplementedError)r#r.rJÚassociationrowÚ    clearkeysrQr$r$r%Ú _synchronize,sz DependencyProcessor._synchronizecCs>|jjs dStt|jgdd„|jjDƒƒƒ}| d|ft¡S)NcSsg|]
}|j‘qSr$)r)Ú.0Úpr$r$r%Ú
<listcomp>4szCDependencyProcessor._get_reversed_processed_set.<locals>.<listcomp>Z reverse_key)rÚ_reverse_propertyÚtupleÚsortedrÚmemoÚset)r#r1Z process_keyr$r$r%Ú_get_reversed_processed_set/s ÿz/DependencyProcessor._get_reversed_processed_setFcCs8|D].}|r|dk    r| |dd„|jjDƒ¡q4qdS)NcSsg|] \}}|‘qSr$r$)rgÚlÚrr$r$r%ri<sz4DependencyProcessor._post_update.<locals>.<listcomp>)Zregister_post_updaterr )r#r.rQÚrelatedÚ is_m2o_deleter\r$r$r%Ú _post_update8s ÿz DependencyProcessor._post_updatecCs
tƒ‚dSr'rb©r#rQr.r$r$r%Ú _pks_changed@sz DependencyProcessor._pks_changedcCsd|jj|jfS)Nz%s(%s))Ú    __class__Ú__name__r)r#r$r$r%Ú__repr__CszDependencyProcessor.__repr__N)F)rxÚ
__module__Ú __qualname__r&Ú classmethodr*r,r2r?rNrRrSrTrUr[rarfrortrvryr$r$r$r%rs$
    p)    
rc@sLeZdZdd„Zdd„Zdd„Zdd„Zd    d
„Zd d „Zd d„Z    dd„Z
dS)Ú OneToManyDPc
 
Cs–|jr\t ||jjd¡}t ||jjd¡}    |j ||f||f||f||    f|    |f|    |fg¡n6|j ||f||f||f||f||f||f||fg¡dSr3©rrÚ PostUpdateAllrr6Ú dependenciesÚupdate)
r#r1r;r<r=r>r9r:Úchild_post_updatesÚchild_pre_updatesr$r$r%r8Hs<
ÿÿúÿ ùÿz%OneToManyDP.per_property_dependenciesc     Csä|jr¤t ||jjd¡}    t ||jjd¡}
|sl|rL|j ||f||    fg¡q¢|j ||f||f||    fg¡qà|rŠ|j ||
f|
|fg¡qà|j ||
f|
|fg¡n<|sÈ|j ||f||f||fg¡n|j ||f||fg¡dSr3r~) r#r1Ú save_parentÚ delete_parentrKr9r:rIrMr‚rƒr$r$r%rHqsZ ÿÿþÿýÿþÿþÿýÿÿz"OneToManyDP.per_state_dependenciescCs¨|jj o|jdk }|D]ˆ}| ||j|j¡}|r|jD]<}|dk    r:| |¡dkr:|jjrl|j    |ddq:|     |¡q:|r|j
D]}|dk    r‚|j    |d|j dq‚qdS)NÚallFT©rIÚdelete©Ú    operationr) rrˆrrVrrrLr,Ú delete_orphanÚregister_objectÚ    unchangedr©r#rQrFÚshould_null_fksr.rZrJr$r$r%rR´s,ÿÿ
 
ÿzOneToManyDP.presort_deletesc    CsV| d|ft¡}|jj o$|jdk }|D]$}| ||¡}|rF|jrNtj}ntj    }| 
||j |¡}|r|j D] }    |    dk    rp|j |    dd|jdqp| |j ¡|jD]r}    |jjsÊ|rÈ|j |    dd|jdq¤| |    ¡dkr¤|j |    dd|jd|j d|    ¡D]\}
} } } |j | dd    qúq¤|r*|r*|jD](}    |    dk    r&|j |    d|jd
|jd q&q*dS) NÚchildren_addedr†TÚadd)Z cancel_deleterŠrFrˆ©rIrŠrr‡z    pk changer‰)rmrnrr‹rrvrrrrrVrÚaddedrŒrrrLr,rÚcascade_iteratorr)r#rQrFrrr.Ú pks_changedrXrZrJÚcÚmÚst_Údct_r$r$r%rSÏsh
 
þ
 
 
ü 
üüÿ
 
ûzOneToManyDP.presort_savesc
Csî|js|jdksê| d|ft¡}|D]Ä}| ||j|j¡}|r$|jD]H}|dk    rD| |¡dkrD|     ||dd|d¡|jrD|rD| 
|||g¡qD|jsœ|j j s$t|j ƒ |¡D]:}|dk    r¬|     ||dd|d¡|jr¬|r¬| 
|||g¡q¬q$dS)Nr†rFT)rrrmrnrVrrrLr,rfrtrrˆrÚ
difference)r#rQrFrr.rZrJr$r$r%rT sVÿ
ÿ þÿ
 
ÿÿ
ÿzOneToManyDP.process_deletesc
CsÚ|jj o|jdk }|D]º}| ||jtj¡}|r|jD]6}| ||dd|d¡|dk    r:|j    r:| 
|||g¡q:|j D].}|rx|jjsx|  |¡sx| ||dd|d¡qx|  ||¡r|jD]}| ||dd|d¡qºqdS)Nr†FT)rr‹rrVrrrr“rfrrtrLr,rvrrŽr$r$r%rU9s\
 
þÿ
ÿ
ÿþýÿ 
ÿzOneToManyDP.process_savesc        Csp|}|}| |¡|dks*|js.| |¡r.dS|rHt ||j|jj¡n$t ||j    ||j|jj||j
oh|¡dSr') rarÚ
is_deletedrÚclearrrr Úpopulaterr)    r#r.rJrdrerQr•ÚsourceÚdestr$r$r%rf[s(
ÿÿùzOneToManyDP._synchronizecCst |||j|jj¡Sr'©rÚsource_modifiedrrr rur$r$r%rvrs ÿzOneToManyDP._pks_changedN) rxrzr{r8rHrRrSrTrUrfrvr$r$r$r%r}Gs)C>,"r}c@sNeZdZdd„Zdd„Zdd„Zdd„Zd    d
„Zd d „Zd d„Z    ddd„Z
dS)Ú ManyToOneDPcCs.t ||¡|jjD]}|j t|ƒ¡qdSr')rr&rZself_and_descendantsZ_dependency_processorsrGÚDetectKeySwitch)r#rrr$r$r%r&ys  zManyToOneDP.__init__c
 
CsŠ|jrbt ||jjd¡}t ||jjd¡}    |j ||f||f||f||    f||    f|    |f|    |fg¡n$|j ||f||f||f||fg¡dSr3©rrrrr6r€r)
r#r1r;r<r=r>r9r:Úparent_post_updatesÚparent_pre_updatesr$r$r%r8~s8 ÿÿùÿ üÿz%ManyToOneDP.per_property_dependenciesc     CsÜ|jrŒ|sZt ||jjd¡}    |r:|j ||    f|    |fg¡qŠ|j ||f||f||    fg¡qØt ||jjd¡}
|j ||
f|
|f|
|fg¡nL|sÂ|s®|j ||f||fg¡qØ|j ||fg¡n|rØ|j ||fg¡dSr3r¤) r#r1r„r…rKr9r:rIrMr¥r¦r$r$r%rH¦sL ÿþÿýÿÿýÿÿz"ManyToOneDP.per_state_dependenciesc Cs¤|jjs|jjr |D]Š}| ||j|j¡}|r|jjr@| ¡}n| ¡}|D]P}|dkrZqL|j|dd|j    d|j
  d|¡}|D]\}}    }
} |j|
ddq€qLqdS)NTrˆr’r‡) rrˆr‹rVrrÚsumZ non_deletedrŒrrr”) r#rQrFr.rZZtodeleterJÚtr–r—r˜r™r$r$r%rRàs.ÿ
üzManyToOneDP.presort_deletesc Csš|D]}|j|d|jd|jjr| ||j|j¡}|r|jD]T}| |¡dkr>|j|dd|jd|j     
d|¡}|D]\}}}    }
|j|    ddqvq>qdS)Nr‘r‰FTrˆr’r‡) rŒrrr‹rVrrrLr,rr”) r#rQrFr.rZrJr¨r–r—r˜r™r$r$r%rSøs(ÿ
üzManyToOneDP.presort_savescCsn|jrj|jjsj|jdksj|D]L}| |ddd|¡|r|jr| ||j|j¡}|r|j|||     ¡ddqdS)Nr†T)rs)
rrr‹rrfrVrrrtr§)r#rQrFr.rZr$r$r%rT s*ÿþý    
ÿÿzManyToOneDP.process_deletesc
Cs~|D]t}| ||jtj¡}|r|jrF|jD]}| ||dd|d¡q*n|jr`| |ddd|d¡|jr| |||     ¡¡qdS)NFr‘Trˆ)
rVrrrr“rfrLrrtr§)r#rQrFr.rZrJr$r$r%rU"s8ÿ
ÿÿzManyToOneDP.process_savesNc    Cs¦|dks|js| |¡rdS|dk    rX|dk    rX|j |¡sXt dt |¡||jf¡dS|sd|dkrzt     
||j |jj ¡n(|  |¡t     ||j||j |jj |d¡dS)NúGObject of type %s not in session, %s operation along '%s' won't proceedF)rr›ÚsessionÚ_contains_staterÚwarnÚ
mapperutilÚstate_class_strrrrœrr rarr©r#r.rJrdrerQrŠr$r$r%rf4s<    ÿÿÿþ
ýþÿ 
ùzManyToOneDP._synchronize)N) rxrzr{r&r8rHrRrSrTrUrfr$r$r$r%r¢xs(:ùr¢c@sheZdZdZdd„Zdd„Zdd„Zdd    „Zd
d „Zd d „Z    dd„Z
dd„Z dd„Z dd„Z dd„ZdS)r£a”For 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.
 
    cCs<|jjr,|jrdSddd„|jjDƒkr,dS| |d¡dS)NFcss|] }|jVqdSr')r)rgrr$r$r%Ú    <genexpr>nsÿz=DetectKeySwitch.per_property_preprocessors.<locals>.<genexpr>)rrjrr/r0r$r$r%r2isþz*DetectKeySwitch.per_property_preprocessorscCs6t ||jj¡}t ||dd¡}|j ||fg¡dSrO)rr5rrBr4r€r)r#r1r;r9r$r$r%r?vsz*DetectKeySwitch.per_property_flush_actionscCsdSr'r$)r#r1rFrIr$r$r%rN{sz'DetectKeySwitch.per_state_flush_actionscCsdSr'r$rPr$r$r%rR~szDetectKeySwitch.presort_deletescCs|js| ||¡dSr')rÚ_process_key_switches)r#r1rFr$r$r%rSszDetectKeySwitch.presort_savescCs"|s|jr| ||¡}t|ƒSdSrO)rÚ_key_switchersÚbool)r#r1rFrIÚdr$r$r%r[‡s
 z DetectKeySwitch.prop_has_changescCs dst‚dSrO)rArPr$r$r%rTŽszDetectKeySwitch.process_deletescCs|js
t‚| ||¡dSr')rrAr±rPr$r$r%rU‘s
zDetectKeySwitch.process_savescCsZ| d|fdd„¡\}}| |¡}|D].}||kr&| ||¡rJ| |¡q&| |¡q&|S)NZ pk_switcherscSs tƒtƒfSr')rnr$r$r$r%Ú<lambda>›óz0DetectKeySwitch._key_switchers.<locals>.<lambda>)rmÚunionrvr‘)r#r1rFZswitchedZ notswitchedZ    allstatesrYr$r$r%r²™sÿ
   zDetectKeySwitch._key_switchersc    
CsÈ| ||¡}|rÄ|jj ¡D]¦}t|j|jjƒs2q|j}| |j    ¡j
|||j d}|t j k    r|dk    r|jjr||srq|d}n|}t  |¡}||kr| |d|j¡t ||j||j|jj||j¡qdS)N)rXrF)r²rªZ identity_mapZ
all_statesÚ
issubclassr`rrEr+rÚgetrrZPASSIVE_NO_RESULTrr_Zinstance_staterŒrrrrr )    r#ZdeplistrQZ    switchersr.Zdict_rrZ related_objZ related_stater$r$r%r±§sH  ÿÿþ
 
ÿùz%DetectKeySwitch._process_key_switchescCs t|jƒot |||j|jj¡Sr')r³rrr¡rrr rur$r$r%rvÌs ÿzDetectKeySwitch._pks_changedN)rxrzr{Ú__doc__r2r?rNrRrSr[rTrUr²r±rvr$r$r$r%r£]s  %r£c@sTeZdZdd„Zdd„Zdd„Zdd„Zd    d
„Zd d „Zd d„Z    dd„Z
dd„Z dS)Ú ManyToManyDPc
Cs:|j ||f||f||f||f||f||f||fg¡dSr'©r€r)r#r1r;r<r=r>r9r:r$r$r%r8Ós ôÿz&ManyToManyDP.per_property_dependenciesc        CsX|s<|r"|j ||f||fg¡qT|j ||f||fg¡n|j ||f||fg¡dSr'r¼)    r#r1r„r…rKr9r:rIrMr$r$r%rHïs ÿÿÿz#ManyToManyDP.per_state_dependenciescCs&|js"|D]}| ||j|j¡q
dSr')rrVrr)r#rQrFr.r$r$r%rRsÿzManyToManyDP.presort_deletesc
Cs¶|js.|D]"}| ||¡r
| ||jtj¡}q
|jjs:dS|D]r}| ||jtj¡}|r>|j    D]P}| 
|¡dkr^|j |dd|j d|j  d|¡D]\}}}}    |j |ddq’q^q>dS)NFTrˆr’r‡)rrvrVrrrrr‹rrLr,rŒrrr”)
r#rQrFr.rZrJr–r—r˜r™r$r$r%rSs< ÿÿ
üÿzManyToManyDP.presort_savesc
sÎg}g}g}| |¡}tƒ}|D]†‰| ˆ|j|j¡}|r | ¡D]F}    |    dksB|dk    rdˆ|    f|krdqBi}
| ˆ|    |
d|d¡s~qB| |
¡qB| ‡fdd„| ¡Dƒ¡q |dk    rº| |¡|     ||||¡dS)NFrˆc3s|]}|ˆfVqdSr'r$©rgr–©r.r$r%r°Usz/ManyToManyDP.process_deletes.<locals>.<genexpr>)
rornrVrrZ    non_addedrfrGrÚ    _run_crud) r#rQrFÚsecondary_deleteÚsecondary_insertÚsecondary_updateÚ    processedÚtmprZrJrdr$r¾r%rT6sN
ÿ ÿ
ÿú 
ÿzManyToManyDP.process_deletesc
s†g}g}g}| |¡}tƒ}|D]:‰|j o8| |ˆ¡}|rFtj}    ntj}    | ˆ|j|    ¡}
|
r |
j    D]>} |dk    r€ˆ| f|kr€qfi} | 
ˆ| | d|d¡sšqf|  | ¡qf|
j D]>} |dk    rƈ| f|krÆq¬i} | 
ˆ| | d|d¡sàq¬|  | ¡q¬|  ‡fdd„|
j    |
j Dƒ¡|r |
jD]D} i} t  ˆ|j| d|jj¡t  | |j| d|jj¡|  | ¡qq |dk    rr|  |¡| ||||¡dS)NFr‘rˆc3s|]}|ˆfVqdSr'r$r½r¾r$r%r°ˆsz-ManyToManyDP.process_saves.<locals>.<genexpr>Úold_)rornrrvrrrrVrr“rfrGrLrrrrrr rÚsecondary_synchronize_pairsr¿) r#rQrFrÀrÁrÂrÃrÄZneed_cascade_pksrXrZrJrdr$r¾r%rU^sŒ
 
 ÿ
ÿ 
ú  
ûû
 
ÿzManyToManyDP.process_savescs|j |j¡}|r‚|d‰|j ¡ tj‡fdd„|jjDƒŽ¡}|     ||¡}| 
¡r‚|j t |ƒkr‚t  d|jjt |ƒ|j f¡‚|rö|d‰|j ¡ tj‡fdd„|jjDƒŽ¡}|     ||¡}| 
¡rö|j t |ƒkröt  d|jjt |ƒ|j f¡‚|r|j ¡}|     ||¡dS)Nrcs,g|]$}|jˆkr|tj|j|jdk‘qS)©Útype_©rr Z    bindparamÚtyper½©rdr$r%ri¯s
þz*ManyToManyDP._run_crud.<locals>.<listcomp>zRDELETE statement on table '%s' expected to delete %d row(s); Only %d were matched.cs0g|](}|jˆkr|tjd|j|jdk‘qS)rÅrÇrÉr½rËr$r%riÉs
þzRUPDATE statement on table '%s' expected to update %d row(s); Only %d were matched.)Z transactionÚ
connectionrrrˆÚwherer Úand_r–ÚexecuteZsupports_sane_multi_rowcountZrowcountÚlenrZStaleDataErrorÚ descriptionrÚinsert)r#rQrÁrÂrÀrÌZ    statementÚresultr$rËr%r¿¦s`
 
þÿÿ     ÿ þýþÿ
 
 
þÿÿ     ÿ þýþÿ
 
zManyToManyDP._run_crudcCs€| |¡|dkrdS|dk    rP|j |¡sP|jsLt dt |¡||jf¡dSt     
||j ||jj ¡t     
||j ||jj¡dS)NFr©T)rarªr«rLrr¬r­r®rrZ populate_dictrr rrÆr¯r$r$r%rfãs0
þÿÿüzManyToManyDP._synchronizecCst |||j|jj¡Sr'r rur$r$r%rvs ÿzManyToManyDP._pks_changedN) rxrzr{r8rHrRrSrTrUr¿rfrvr$r$r$r%r»Òs "(H=!r»N)rºÚ
__future__rÚrrrrrr­Z
interfacesr    r
r r!r rr}r¢r£r»r(r$r$r$r%Ú<module>
s>            ,3fu;ý