fixed Issue 1519:MongoDB fails when inserting list:reference values, thanks Alan

This commit is contained in:
mdipierro
2013-06-08 18:51:14 -05:00
parent cccc6565eb
commit 73f447167e
2 changed files with 44 additions and 50 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.5.1-stable+timestamp.2013.06.08.09.39.55 Version 2.5.1-stable+timestamp.2013.06.08.18.50.24
+43 -49
View File
@@ -5317,30 +5317,10 @@ class MongoDBAdapter(NoSQLAdapter):
return value return value
elif ((isinstance(fieldtype, basestring) and elif ((isinstance(fieldtype, basestring) and
fieldtype.startswith("reference")) or fieldtype.startswith("reference")) or
(isinstance(fieldtype, Table))): (isinstance(fieldtype, Table)) or fieldtype=="id"):
value = self.object_id(value) value = self.object_id(value)
return value return value
# Safe determines whether a asynchronious request is done or a
# synchronious action is done
# For safety, we use by default synchronous requests
def insert(self, table, fields, safe=None):
if safe==None:
safe = self.safe
ctable = self.connection[table._tablename]
values = dict()
for k, v in fields:
if not k.name in ["id", "safe"]:
fieldname = k.name
fieldtype = table[k.name].type
if ("reference" in fieldtype) or (fieldtype=="id"):
values[fieldname] = self.object_id(v)
else:
values[fieldname] = self.represent(v, fieldtype)
ctable.insert(values, safe=safe)
return long(str(values['_id']), 16)
def create_table(self, table, migrate=True, fake_migrate=False, def create_table(self, table, migrate=True, fake_migrate=False,
polymodel=None, isCapped=False): polymodel=None, isCapped=False):
if isCapped: if isCapped:
@@ -5402,6 +5382,16 @@ class MongoDBAdapter(NoSQLAdapter):
result = expression result = expression
return result return result
def drop(self, table, mode=''):
ctable = self.connection[table._tablename]
ctable.drop()
def truncate(self, table, mode, safe=None):
if safe == None:
safe=self.safe
ctable = self.connection[table._tablename]
ctable.remove(None, safe=True)
def _select(self, query, fields, attributes): def _select(self, query, fields, attributes):
if 'for_update' in attributes: if 'for_update' in attributes:
logging.warn('mongodb does not support for_update') logging.warn('mongodb does not support for_update')
@@ -5427,7 +5417,6 @@ class MongoDBAdapter(NoSQLAdapter):
mongosort_list.append((f[1:], -1)) mongosort_list.append((f[1:], -1))
else: else:
mongosort_list.append((f, 1)) mongosort_list.append((f, 1))
if limitby: if limitby:
limitby_skip, limitby_limit = limitby limitby_skip, limitby_limit = limitby
else: else:
@@ -5456,7 +5445,6 @@ class MongoDBAdapter(NoSQLAdapter):
return tablename, mongoqry_dict, mongofields_dict, mongosort_list, \ return tablename, mongoqry_dict, mongofields_dict, mongosort_list, \
limitby_limit, limitby_skip limitby_limit, limitby_skip
def select(self, query, fields, attributes, count=False, def select(self, query, fields, attributes, count=False,
snapshot=False): snapshot=False):
# TODO: support joins # TODO: support joins
@@ -5507,23 +5495,28 @@ class MongoDBAdapter(NoSQLAdapter):
result = processor(rows, fields, newnames, False) result = processor(rows, fields, newnames, False)
return result return result
def _insert(self, table, fields):
values = dict()
for k, v in fields:
if not k.name in ["id", "safe"]:
fieldname = k.name
fieldtype = table[k.name].type
values[fieldname] = self.represent(v, fieldtype)
return values
def INVERT(self, first): # Safe determines whether a asynchronious request is done or a
#print "in invert first=%s" % first # synchronious action is done
return '-%s' % self.expand(first) # For safety, we use by default synchronous requests
def insert(self, table, fields, safe=None):
def drop(self, table, mode=''): if safe==None:
safe = self.safe
ctable = self.connection[table._tablename] ctable = self.connection[table._tablename]
ctable.drop() values = self._insert(table, fields)
ctable.insert(values, safe=safe)
return long(str(values['_id']), 16)
#this function returns a dict with the where clause and update fields
def truncate(self, table, mode, safe=None): def _update(self, tablename, query, fields):
if safe == None:
safe=self.safe
ctable = self.connection[table._tablename]
ctable.remove(None, safe=True)
def oupdate(self, tablename, query, fields):
if not isinstance(query, Query): if not isinstance(query, Query):
raise SyntaxError("Not Supported") raise SyntaxError("Not Supported")
filter = None filter = None
@@ -5541,7 +5534,7 @@ class MongoDBAdapter(NoSQLAdapter):
if not isinstance(query, Query): if not isinstance(query, Query):
raise RuntimeError("Not implemented") raise RuntimeError("Not implemented")
amount = self.count(query, False) amount = self.count(query, False)
modify, filter = self.oupdate(tablename, query, fields) modify, filter = self._update(tablename, query, fields)
try: try:
result = self.connection[tablename].update(filter, result = self.connection[tablename].update(filter,
modify, multi=True, safe=safe) modify, multi=True, safe=safe)
@@ -5557,28 +5550,29 @@ class MongoDBAdapter(NoSQLAdapter):
# TODO Reverse update query to verifiy that the query succeded # TODO Reverse update query to verifiy that the query succeded
raise RuntimeError("uncaught exception when updating rows: %s" % e) raise RuntimeError("uncaught exception when updating rows: %s" % e)
#this function returns a dict with the where clause and update fields def _delete(self, tablename, query):
def _update(self,tablename,query,fields): if not isinstance(query, Query):
return str(self.oupdate(tablename, query, fields)) raise RuntimeError("query type %s is not supported" % \
type(query))
return self.expand(query)
def delete(self, tablename, query, safe=None): def delete(self, tablename, query, safe=None):
if safe is None: if safe is None:
safe = self.safe safe = self.safe
amount = 0 amount = 0
amount = self.count(query, False) amount = self.count(query, False)
if not isinstance(query, Query): filter = self._delete(tablename, query)
raise RuntimeError("query type %s is not supported" % \ self.connection[tablename].remove(filter, safe=safe)
type(query))
filter = self.expand(query)
self._delete(tablename, filter, safe=safe)
return amount return amount
def _delete(self, tablename, filter, safe=None):
return self.connection[tablename].remove(filter, safe=safe)
def bulk_insert(self, table, items): def bulk_insert(self, table, items):
return [self.insert(table,item) for item in items] return [self.insert(table,item) for item in items]
## OPERATORS
def INVERT(self, first):
#print "in invert first=%s" % first
return '-%s' % self.expand(first)
# TODO This will probably not work:( # TODO This will probably not work:(
def NOT(self, first): def NOT(self, first):
result = {} result = {}