fixed Issue 1519:MongoDB fails when inserting list:reference values, thanks Alan
This commit is contained in:
@@ -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
@@ -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 = {}
|
||||||
|
|||||||
Reference in New Issue
Block a user