diff --git a/gluon/sqlhtml.py b/gluon/sqlhtml.py index 704c5eea..36ed2ccc 100644 --- a/gluon/sqlhtml.py +++ b/gluon/sqlhtml.py @@ -1648,9 +1648,9 @@ class SQLFORM(FORM): selectfields = [] for field in fields: name = str(field).replace('.', '-') - # treat ftype 'decimal' as 'double' + # treat ftype 'decimal' as 'double' # (this fixes problems but needs refactoring! - ftype = field.type.split(' ')[0] + ftype = field.type.split(' ')[0] if ftype.startswith('decimal'): ftype = 'double' elif ftype=='bigint': ftype = 'integer' elif ftype.startswith('big-'): ftype = ftype[4:] @@ -1780,7 +1780,8 @@ class SQLFORM(FORM): selectable_submit_button='Submit', buttons_placement = 'right', links_placement = 'right', - noconfirm=False + noconfirm=False, + cache_count=None ): # jQuery UI ThemeRoller classes (empty if ui is disabled) @@ -1834,6 +1835,32 @@ class SQLFORM(FORM): editable = wenabled and editable deletable = wenabled and deletable + def fetch_count(dbset): + ##FIXME for google:datastore cache_count is ignored + ## if it's not an integer + if cache_count is None or isinstance(cache_count, tuple): + if groupby: + c = 'count(*)' + nrows = db.executesql( + 'select count(*) from (%s);' % + dbset._select(c, left=left, cacheable=True, + groupby=groupby, cache=cache_count)[:-1])[0][0] + elif left: + c = 'count(*)' + nrows = dbset.select(c, left=left, cacheable=True, cache=cache_count).first()[c] + elif dbset._db._adapter.dbengine=='google:datastore': + #if we don't set a limit, this can timeout for a large table + nrows = dbset.db._adapter.count(dbset.query, limit=1000) + else: + nrows = dbset.count(cache=cache_count) + elif isinstance(cache_count, (int, long)): + nrows = cache_count + elif callable(cache_count): + nrows = cache_count(dbset, request.vars) + else: + nrows = 0 + return nrows + def url(**b): b['args'] = args + b.get('args', []) localvars = request.get_vars.copy() @@ -2129,20 +2156,7 @@ class SQLFORM(FORM): if subquery: dbset = dbset(subquery) try: - if groupby: - c = 'count(*)' - nrows = db.executesql( - 'select count(*) from (%s);' % - dbset._select(c, left=left, cacheable=True, - groupby=groupby)[:-1])[0][0] - elif left: - c = 'count(*)' - nrows = dbset.select(c, left=left, cacheable=True).first()[c] - elif dbset._db._adapter.dbengine=='google:datastore': - #if we don't set a limit, this can timeout for a large table - nrows = dbset.db._adapter.count(dbset.query, limit=1000) - else: - nrows = dbset.count() + nrows = fetch_count(dbset) except: nrows = 0 error = T('Unsupported query')