135 _check_cw_unsafe(kwargs) |
135 _check_cw_unsafe(kwargs) |
136 execute = self.execute |
136 execute = self.execute |
137 rql = 'INSERT %s X' % etype |
137 rql = 'INSERT %s X' % etype |
138 relations = [] |
138 relations = [] |
139 restrictions = set() |
139 restrictions = set() |
140 cachekey = [] |
|
141 pending_relations = [] |
140 pending_relations = [] |
142 for attr, value in kwargs.items(): |
141 for attr, value in kwargs.items(): |
143 if isinstance(value, (tuple, list, set, frozenset)): |
142 if isinstance(value, (tuple, list, set, frozenset)): |
144 if len(value) == 1: |
143 if len(value) == 1: |
145 value = iter(value).next() |
144 value = iter(value).next() |
155 else: |
154 else: |
156 relations.append('X %s %s' % (attr, rvar)) |
155 relations.append('X %s %s' % (attr, rvar)) |
157 restriction = '%s eid %%(%s)s' % (rvar, attr) |
156 restriction = '%s eid %%(%s)s' % (rvar, attr) |
158 if not restriction in restrictions: |
157 if not restriction in restrictions: |
159 restrictions.add(restriction) |
158 restrictions.add(restriction) |
160 cachekey.append(attr) |
|
161 kwargs[attr] = value.eid |
159 kwargs[attr] = value.eid |
162 else: # attribute |
160 else: # attribute |
163 relations.append('X %s %%(%s)s' % (attr, attr)) |
161 relations.append('X %s %%(%s)s' % (attr, attr)) |
164 if relations: |
162 if relations: |
165 rql = '%s: %s' % (rql, ', '.join(relations)) |
163 rql = '%s: %s' % (rql, ', '.join(relations)) |
166 if restrictions: |
164 if restrictions: |
167 rql = '%s WHERE %s' % (rql, ', '.join(restrictions)) |
165 rql = '%s WHERE %s' % (rql, ', '.join(restrictions)) |
168 created = execute(rql, kwargs, cachekey).get_entity(0, 0) |
166 created = execute(rql, kwargs).get_entity(0, 0) |
169 for attr, values in pending_relations: |
167 for attr, values in pending_relations: |
170 if attr.startswith('reverse_'): |
168 if attr.startswith('reverse_'): |
171 restr = 'Y %s X' % attr[len('reverse_'):] |
169 restr = 'Y %s X' % attr[len('reverse_'):] |
172 else: |
170 else: |
173 restr = 'X %s Y' % attr |
171 restr = 'X %s Y' % attr |
174 execute('SET %s WHERE X eid %%(x)s, Y eid IN (%s)' % ( |
172 execute('SET %s WHERE X eid %%(x)s, Y eid IN (%s)' % ( |
175 restr, ','.join(str(r.eid) for r in values)), |
173 restr, ','.join(str(r.eid) for r in values)), |
176 {'x': created.eid}, 'x', build_descr=False) |
174 {'x': created.eid}, build_descr=False) |
177 return created |
175 return created |
178 |
176 |
179 def ensure_ro_rql(self, rql): |
177 def ensure_ro_rql(self, rql): |
180 """raise an exception if the given rql is not a select query""" |
178 """raise an exception if the given rql is not a select query""" |
181 first = rql.split(' ', 1)[0].lower() |
179 first = rql.split(' ', 1)[0].lower() |