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:
wangxiyuan 2015-08-04 14:35:46 +08:00
parent 8312212049
commit d13f088cac
2 changed files with 27 additions and 5 deletions

View File

@ -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)

View File

@ -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)