diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/datatype/sql/9.1_plus/get_types.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/datatype/sql/9.1_plus/get_types.sql new file mode 100644 index 0000000..b8952d2 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/templates/datatype/sql/9.1_plus/get_types.sql @@ -0,0 +1,18 @@ +SELECT + * +FROM + (SELECT + format_type(t.oid,NULL) AS typname, + CASE WHEN typelem > 0 THEN typelem ELSE t.oid END as elemoid, + typlen, typtype, t.oid, nspname, + (SELECT COUNT(1) FROM pg_type t2 WHERE t2.typname = t.typname) > 1 AS isdup + FROM + pg_type t + JOIN + pg_namespace nsp ON typnamespace=nsp.oid + WHERE + (NOT (typname = 'unknown' AND nspname = 'pg_catalog')) + AND + {{ condition }} + ) AS dummy +ORDER BY nspname <> 'pg_catalog', nspname <> 'public', nspname, 1 \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py index 6f78af5..b895d89 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py @@ -10,7 +10,8 @@ """Schema collection node helper class""" from pgadmin.browser.collection import CollectionNodeModule - +from pgadmin.browser.utils import PGChildNodeView +from flask import render_template class SchemaChildModule(CollectionNodeModule): """ @@ -57,3 +58,84 @@ class SchemaChildModule(CollectionNodeModule): ) and CollectionNodeModule.BackendSupported( self, manager, **kwargs ) + + +class DataTypeReader: + """ + DataTypeReader Class. + + This class includes common functionalities of the data-types. + + Methods: + ------- + * get_types(conn, condition): + - Returns data-types on the basis of the condition provided. + """ + + def get_types(self, conn, condition): + """ + Returns data-types including calculation for Length and Precision. + + Args: + conn: Connection Object + condition: condition to prepare SQL statement + """ + res = [] + try: + sql_template_path = '' + if conn.manager.version >= 90100: + sql_template_path = 'datatype/sql/9.1_plus' + + SQL = render_template("/".join([sql_template_path, + 'get_types.sql']), + condition=condition) + status, rset = conn.execute_2darray(SQL) + if not status: + return status, rset + + for row in rset['rows']: + # Attach properties for precession + # & length validation for current type + precision = False + length = False + min_val = 0 + max_val = 0 + + # Check against PGOID for specific type + if row['elemoid']: + if row['elemoid'] in (1560, 1561, 1562, 1563, 1042, 1043, + 1014, 1015): + typeval = 'L' + elif row['elemoid'] in (1083, 1114, 1115, 1183, 1184, 1185, + 1186, 1187, 1266, 1270): + typeval = 'D' + elif row['elemoid'] in (1231, 1700): + typeval = 'P' + else: + typeval = ' ' + + # Set precision & length/min/max values + if typeval == 'P': + precision = True + + if precision or typeval in ('L', 'D'): + length = True + min_val = 0 if typeval == 'D' else 1 + if precision: + max_val = 1000 + elif min_val: + # Max of integer value + max_val = 2147483647 + else: + max_val = 10 + + res.append({ + 'label': row['typname'], 'value': row['typname'], + 'typval': typeval, 'precision': precision, + 'length': length, 'min_val': min_val, 'max_val': max_val + }) + + except Exception as e: + return False, str(e) + + return True, res