diff --git a/silverberg/marshal.py b/silverberg/marshal.py index 6dc05e9..330f538 100644 --- a/silverberg/marshal.py +++ b/silverberg/marshal.py @@ -42,11 +42,19 @@ def prepare(query, params): - # For every match of the form ":param_name", call marshal - # on kwargs['param_name'] and replace that section of the query - # with the result - new, count = re.subn(_param_re, - lambda m: marshal(params[m.group(1)[1:]]), query) + """ + For every match of the form ":param_name", call marshal + on kwargs['param_name'] and replace that section of the query + with the result + """ + def repl(match): + name = match.group(1)[1:] + if name in params: + return marshal(params[name]) + return ":%s" % name + + new, count = re.subn(_param_re, repl, query) + if len(params) > count: raise cql.ProgrammingError("More keywords were provided " "than parameters") diff --git a/silverberg/test/test_marshal.py b/silverberg/test/test_marshal.py index 6a2d31e..f1b324a 100644 --- a/silverberg/test/test_marshal.py +++ b/silverberg/test/test_marshal.py @@ -24,7 +24,21 @@ from twisted.trial.unittest import TestCase -from silverberg.marshal import marshal, unmarshal_timestamp, unmarshal_int, unmarshal_initializable_int +from silverberg.marshal import marshal, unmarshal_timestamp, unmarshal_int, \ + unmarshal_initializable_int, prepare + + +class StatementPreparation(TestCase): + """ + Test preparint a query with optional parameters. + """ + + def test_prepare(self): + result = prepare("string :with a colon :with", {'with': 'value'}) + self.assertEqual(result, "string 'value' a colon 'value'") + + result = prepare("string :with a colon :with", {}) + self.assertEqual(result, "string :with a colon :with") class MarshallingUnmarshallingDatetime(TestCase):