Fix default value with postgreSQL
When use 'sort-key=size' for multi-pages searching with postgreSQL DB, it will raise an error: DBError: (psycopg2.DataError). And return HTTPInternalServerError (HTTP 500) to users. The reason is that postgreSQL doesn't support the size's default value to be string. This patch set the size's default value to zero. Change-Id: Ib3b5f3f57be3683ba274f0122e6314978a79e75f Closes-bug:#1481154
This commit is contained in:
parent
8312212049
commit
d13f088cac
|
@ -293,6 +293,21 @@ def is_image_visible(context, image, status=None):
|
|||
return False
|
||||
|
||||
|
||||
def _get_default_column_value(column_type):
|
||||
"""Return the default value of the columns from DB table
|
||||
|
||||
In postgreDB case, if no right default values are being set, an
|
||||
psycopg2.DataError will be thrown.
|
||||
"""
|
||||
type_schema = {
|
||||
'datetime': None,
|
||||
'big_integer': 0,
|
||||
'integer': 0,
|
||||
'string': ''
|
||||
}
|
||||
return type_schema[column_type.__visit_name__]
|
||||
|
||||
|
||||
def _paginate_query(query, model, limit, sort_keys, marker=None,
|
||||
sort_dir=None, sort_dirs=None):
|
||||
"""Returns a query with sorting / pagination criteria added.
|
||||
|
@ -372,17 +387,16 @@ def _paginate_query(query, model, limit, sort_keys, marker=None,
|
|||
crit_attrs = []
|
||||
for j in range(i):
|
||||
model_attr = getattr(model, sort_keys[j])
|
||||
default = None if isinstance(
|
||||
model_attr.property.columns[0].type,
|
||||
sqlalchemy.DateTime) else ''
|
||||
default = _get_default_column_value(
|
||||
model_attr.property.columns[0].type)
|
||||
attr = sa_sql.expression.case([(model_attr != None,
|
||||
model_attr), ],
|
||||
else_=default)
|
||||
crit_attrs.append((attr == marker_values[j]))
|
||||
|
||||
model_attr = getattr(model, sort_keys[i])
|
||||
default = None if isinstance(model_attr.property.columns[0].type,
|
||||
sqlalchemy.DateTime) else ''
|
||||
default = _get_default_column_value(
|
||||
model_attr.property.columns[0].type)
|
||||
attr = sa_sql.expression.case([(model_attr != None,
|
||||
model_attr), ],
|
||||
else_=default)
|
||||
|
|
|
@ -546,6 +546,14 @@ class DriverTests(object):
|
|||
images = self.db_api.image_get_all(self.context, marker=UUID3)
|
||||
self.assertEqual(2, len(images))
|
||||
|
||||
def test_image_get_all_marker_with_size(self):
|
||||
# Use sort_key=size to test BigInteger
|
||||
images = self.db_api.image_get_all(self.context, sort_key=['size'],
|
||||
marker=UUID3)
|
||||
self.assertEqual(2, len(images))
|
||||
self.assertEqual(17, images[0]['size'])
|
||||
self.assertEqual(13, images[1]['size'])
|
||||
|
||||
def test_image_get_all_marker_deleted(self):
|
||||
"""Cannot specify a deleted image as a marker."""
|
||||
self.db_api.image_destroy(self.adm_context, UUID1)
|
||||
|
|
Loading…
Reference in New Issue