18 """SQL utilities functions and classes.""" |
18 """SQL utilities functions and classes.""" |
19 |
19 |
20 __docformat__ = "restructuredtext en" |
20 __docformat__ = "restructuredtext en" |
21 |
21 |
22 import sys |
22 import sys |
23 import os |
|
24 import re |
23 import re |
25 import subprocess |
24 import subprocess |
26 from os.path import abspath |
25 from os.path import abspath |
27 from itertools import ifilter |
26 from itertools import ifilter |
28 from logging import getLogger |
27 from logging import getLogger |
|
28 from datetime import time, datetime |
29 |
29 |
30 from logilab import database as db, common as lgc |
30 from logilab import database as db, common as lgc |
31 from logilab.common.shellutils import ProgressBar, DummyProgressBar |
31 from logilab.common.shellutils import ProgressBar, DummyProgressBar |
32 from logilab.common.deprecation import deprecated |
32 from logilab.common.deprecation import deprecated |
33 from logilab.common.logging_ext import set_log_methods |
33 from logilab.common.logging_ext import set_log_methods |
|
34 from logilab.common.date import utctime, utcdatetime |
34 from logilab.database.sqlgen import SQLGenerator |
35 from logilab.database.sqlgen import SQLGenerator |
35 |
36 |
36 from cubicweb import Binary, ConfigurationError |
37 from cubicweb import Binary, ConfigurationError |
37 from cubicweb.uilib import remove_html_tags |
38 from cubicweb.uilib import remove_html_tags |
38 from cubicweb.schema import PURE_VIRTUAL_RTYPES |
39 from cubicweb.schema import PURE_VIRTUAL_RTYPES |
371 newargs = {} |
372 newargs = {} |
372 for key, val in args.iteritems(): |
373 for key, val in args.iteritems(): |
373 # convert cubicweb binary into db binary |
374 # convert cubicweb binary into db binary |
374 if isinstance(val, Binary): |
375 if isinstance(val, Binary): |
375 val = self._binary(val.getvalue()) |
376 val = self._binary(val.getvalue()) |
|
377 # convert timestamp to utc. |
|
378 # expect SET TiME ZONE to UTC at connection opening time. |
|
379 # This shouldn't change anything for datetime without TZ. |
|
380 elif isinstance(val, datetime) and val.tzinfo is not None: |
|
381 val = utcdatetime(val) |
|
382 elif isinstance(val, time) and val.tzinfo is not None: |
|
383 val = utctime(val) |
376 newargs[key] = val |
384 newargs[key] = val |
377 # should not collide |
385 # should not collide |
|
386 assert not (frozenset(newargs) & frozenset(query_args)), \ |
|
387 'unexpected collision: %s' % (frozenset(newargs) & frozenset(query_args)) |
378 newargs.update(query_args) |
388 newargs.update(query_args) |
379 return newargs |
389 return newargs |
380 return query_args |
390 return query_args |
381 |
391 |
382 def process_result(self, cursor, cnx=None, column_callbacks=None): |
392 def process_result(self, cursor, cnx=None, column_callbacks=None): |