public inbox for [email protected]  
help / color / mirror / Atom feed
From: Murtuza Zabuawala <[email protected]>
To: pgadmin-hackers <[email protected]>
Subject: Re: [pgAdmin4][PATCH] To fix the of issue in table node
Date: Tue, 9 May 2017 20:06:34 +0530
Message-ID: <CAKKotZT0tumuUMJYg5czrH4NBkaxKHdvnGkXyeh+F+BG3pejOQ@mail.gmail.com> (raw)
In-Reply-To: <CAKKotZQnryW=JahEa6Ah-oKNXGaK-v8Sdj-=FiXdGYTDan9mew@mail.gmail.com>
References: <CAKKotZQnryW=JahEa6Ah-oKNXGaK-v8Sdj-=FiXdGYTDan9mew@mail.gmail.com>
List-Unsubscribe:  <mailto:[email protected]?body=unsub%20pgadmin-hackers>

Hi,

Please find updated patch.

Updated logic to convert name only if name is of type int/long/float
(Python2) or of type int/float (Python3) instead of blindly convert it to
string.

--
Regards,
Murtuza Zabuawala
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

On Tue, May 9, 2017 at 7:06 PM, Murtuza Zabuawala <
[email protected]> wrote:

> Hi,
>
> PFA minor patch to fix the issue in table node where it fails to create
> table when user provides numeric table name eg: 123.
> RM#2284
>
> Issue is when use json.loads() it converts string "123" into integer 123.
>
> --
> Regards,
> Murtuza Zabuawala
> EnterpriseDB: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company
>

diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
index e118cab..b6bf7ed 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
@@ -1376,6 +1376,28 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
 
         return data
 
+    def check_and_convert_name_to_string(self, data):
+        """
+        This function will check and covert table to string incase
+        it is numeric
+
+        Args:
+            data: data dict
+
+        Returns:
+            Updated data dict
+        """
+        # For Python2, it can be int, long, float
+        if hasattr(str, 'decode'):
+            if isinstance(data['name'], (int, long, float)):
+                data['name'] = str(data['name'])
+        else:
+            # For Python3, it can be int, float
+            if isinstance(data['name'], (int, float)):
+                data['name'] = str(data['name'])
+        return data
+
+
     @check_precondition
     def create(self, gid, sid, did, scid):
         """
@@ -1417,6 +1439,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
 
         # Parse & format columns
         data = self._parse_format_columns(data)
+        data = self.check_and_convert_name_to_string(data)
 
         # 'coll_inherits' is Array but it comes as string from browser
         # We will convert it again to list
@@ -1447,8 +1470,10 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
                 return internal_server_error(errormsg=res)
 
             # PostgreSQL truncates the table name to 63 characters.
-            # Have to truncate the name like PostgreSQL to get the proper schema id
+            # Have to truncate the name like PostgreSQL to get the
+            # proper OID
             CONST_MAX_CHAR_COUNT = 63
+
             if len(data['name']) > CONST_MAX_CHAR_COUNT:
                 data['name'] = data['name'][0:CONST_MAX_CHAR_COUNT]
 
@@ -2129,9 +2154,12 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
                             data['relacl'][mode], self.acl
                         )
 
-            # If name if not present
+            # If name is not present in request data
             if 'name' not in data:
                 data['name'] = old_data['name']
+
+            data = self.check_and_convert_name_to_string(data)
+
             # If name if not present
             if 'schema' not in data:
                 data['schema'] = old_data['schema']
@@ -2310,6 +2338,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
 
             # Parse & format columns
             data = self._parse_format_columns(data)
+            data = self.check_and_convert_name_to_string(data)
 
             if 'foreign_key' in data:
                 for c in data['foreign_key']:


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers


Attachments:

  [text/plain] RM_2284_v1.diff (3.0K, 3-RM_2284_v1.diff)
  download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
index e118cab..b6bf7ed 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py
@@ -1376,6 +1376,28 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
 
         return data
 
+    def check_and_convert_name_to_string(self, data):
+        """
+        This function will check and covert table to string incase
+        it is numeric
+
+        Args:
+            data: data dict
+
+        Returns:
+            Updated data dict
+        """
+        # For Python2, it can be int, long, float
+        if hasattr(str, 'decode'):
+            if isinstance(data['name'], (int, long, float)):
+                data['name'] = str(data['name'])
+        else:
+            # For Python3, it can be int, float
+            if isinstance(data['name'], (int, float)):
+                data['name'] = str(data['name'])
+        return data
+
+
     @check_precondition
     def create(self, gid, sid, did, scid):
         """
@@ -1417,6 +1439,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
 
         # Parse & format columns
         data = self._parse_format_columns(data)
+        data = self.check_and_convert_name_to_string(data)
 
         # 'coll_inherits' is Array but it comes as string from browser
         # We will convert it again to list
@@ -1447,8 +1470,10 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
                 return internal_server_error(errormsg=res)
 
             # PostgreSQL truncates the table name to 63 characters.
-            # Have to truncate the name like PostgreSQL to get the proper schema id
+            # Have to truncate the name like PostgreSQL to get the
+            # proper OID
             CONST_MAX_CHAR_COUNT = 63
+
             if len(data['name']) > CONST_MAX_CHAR_COUNT:
                 data['name'] = data['name'][0:CONST_MAX_CHAR_COUNT]
 
@@ -2129,9 +2154,12 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
                             data['relacl'][mode], self.acl
                         )
 
-            # If name if not present
+            # If name is not present in request data
             if 'name' not in data:
                 data['name'] = old_data['name']
+
+            data = self.check_and_convert_name_to_string(data)
+
             # If name if not present
             if 'schema' not in data:
                 data['schema'] = old_data['schema']
@@ -2310,6 +2338,7 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings):
 
             # Parse & format columns
             data = self._parse_format_columns(data)
+            data = self.check_and_convert_name_to_string(data)
 
             if 'foreign_key' in data:
                 for c in data['foreign_key']:


view thread (2+ messages)

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected]
  Subject: Re: [pgAdmin4][PATCH] To fix the of issue in table node
  In-Reply-To: <CAKKotZT0tumuUMJYg5czrH4NBkaxKHdvnGkXyeh+F+BG3pejOQ@mail.gmail.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox