diff roundup/backends/rdbms_common.py @ 5086:2b551b6b0830

issue2550549 Postgres error on message templating Exception gets thrown and not captured if nodeid is too large on postgres. Added a check in rdbms_common layer that max nodeid is < 2^31 -1. This is also the limit for INTEGER on MySql. SqlLite can support up to 2^63-1, but I chose the smallest common denominator. Large nodeid should now returns no such id rather than a stack trace. Patch idea from: martin.v.loewis. (John Rouillard) This fixes the reason for patches: https://hg.python.org/tracker/roundup/rev/1548763e8273 and https://hg.python.org/tracker/roundup/rev/eb3be57f1ef2
author John Rouillard <rouilj@ieee.org>
date Sat, 18 Jun 2016 22:48:21 -0400
parents e424987d294a
children e74c3611b138
line wrap: on
line diff
--- a/roundup/backends/rdbms_common.py	Sat Jun 18 00:39:01 2016 -0400
+++ b/roundup/backends/rdbms_common.py	Sat Jun 18 22:48:21 2016 -0400
@@ -1228,6 +1228,15 @@
     def hasnode(self, classname, nodeid):
         """ Determine if the database has a given node.
         """
+        # nodeid (aka link) is sql type INTEGER.  max positive value
+        # for INTEGER is 2^31-1 for Postgres and MySQL. The max
+        # positive value for SqLite is 2^63 -1, so arguably this check
+        # needs to adapt for the type of the RDBMS. For right now,
+        # choose lowest common denominator.
+        if int(nodeid) >= 2**31:
+            # value out of range return false
+            return 0
+
         # If this node is in the cache, then we do not need to go to
         # the database.  (We don't consider this an LRU hit, though.)
         if (classname, nodeid) in self.cache:

Roundup Issue Tracker: http://roundup-tracker.org/