bugfix for filters based on a pattern with *f or *d
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Fri, 5 Jun 2009 04:19:47 +0000 (04:19 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Fri, 5 Jun 2009 04:19:47 +0000 (04:19 +0000)
e.g. GetPersons({'email':'*fake*'}) resulted in an sql fragment "email LIKE '%sake%'"

PLC/Filter.py
PLC/PostgreSQL.py

index c90f713..c69a5e0 100644 (file)
@@ -139,7 +139,12 @@ class Filter(Parameter, dict):
                     elif isinstance(value, StringTypes) and \
                             (value.find("*") > -1 or value.find("%") > -1):
                         operator = "LIKE"
-                        value = str(api.db.quote(value.replace("*", "%")))
+                        # insert *** in pattern instead of either * or %
+                        # we dont use % as requests are likely to %-expansion later on
+                        # actual replacement to % done in PostgreSQL.py
+                        value = value.replace ('*','***')
+                        value = value.replace ('%','***')
+                        value = str(api.db.quote(value))
                     else:
                         operator = "="
                         if modifiers['<']:
index 9dcae20..2c2d0b3 100644 (file)
@@ -166,8 +166,13 @@ class PostgreSQL:
 
             # psycopg2 requires %()s format for all parameters,
             # regardless of type.
+            # this needs to be done carefully though as with pattern-based filters
+            # we might have percents embedded in the query
+            # so e.g. GetPersons({'email':'*fake*'}) was resulting in .. LIKE '%sake%'
             if psycopg2:
                 query = re.sub(r'(%\([^)]*\)|%)[df]', r'\1s', query)
+            # rewrite wildcards set by Filter.py as '***' into '%'
+            query = query.replace ('***','%')
 
             if not params:
                 if self.debug: