diff options
Diffstat (limited to 'lib/python2.7/site-packages/django/db/backends/util.py')
-rw-r--r-- | lib/python2.7/site-packages/django/db/backends/util.py | 179 |
1 files changed, 0 insertions, 179 deletions
diff --git a/lib/python2.7/site-packages/django/db/backends/util.py b/lib/python2.7/site-packages/django/db/backends/util.py deleted file mode 100644 index 2820007..0000000 --- a/lib/python2.7/site-packages/django/db/backends/util.py +++ /dev/null @@ -1,179 +0,0 @@ -from __future__ import unicode_literals - -import datetime -import decimal -import hashlib -import logging -from time import time - -from django.conf import settings -from django.utils.encoding import force_bytes -from django.utils.timezone import utc - - -logger = logging.getLogger('django.db.backends') - - -class CursorWrapper(object): - def __init__(self, cursor, db): - self.cursor = cursor - self.db = db - - WRAP_ERROR_ATTRS = frozenset(['fetchone', 'fetchmany', 'fetchall', 'nextset']) - - def __getattr__(self, attr): - cursor_attr = getattr(self.cursor, attr) - if attr in CursorWrapper.WRAP_ERROR_ATTRS: - return self.db.wrap_database_errors(cursor_attr) - else: - return cursor_attr - - def __iter__(self): - return iter(self.cursor) - - # The following methods cannot be implemented in __getattr__, because the - # code must run when the method is invoked, not just when it is accessed. - - def callproc(self, procname, params=None): - self.db.validate_no_broken_transaction() - self.db.set_dirty() - with self.db.wrap_database_errors: - if params is None: - return self.cursor.callproc(procname) - else: - return self.cursor.callproc(procname, params) - - def execute(self, sql, params=None): - self.db.validate_no_broken_transaction() - self.db.set_dirty() - with self.db.wrap_database_errors: - if params is None: - return self.cursor.execute(sql) - else: - return self.cursor.execute(sql, params) - - def executemany(self, sql, param_list): - self.db.validate_no_broken_transaction() - self.db.set_dirty() - with self.db.wrap_database_errors: - return self.cursor.executemany(sql, param_list) - - -class CursorDebugWrapper(CursorWrapper): - - # XXX callproc isn't instrumented at this time. - - def execute(self, sql, params=None): - start = time() - try: - return super(CursorDebugWrapper, self).execute(sql, params) - finally: - stop = time() - duration = stop - start - sql = self.db.ops.last_executed_query(self.cursor, sql, params) - self.db.queries.append({ - 'sql': sql, - 'time': "%.3f" % duration, - }) - logger.debug('(%.3f) %s; args=%s' % (duration, sql, params), - extra={'duration': duration, 'sql': sql, 'params': params} - ) - - def executemany(self, sql, param_list): - start = time() - try: - return super(CursorDebugWrapper, self).executemany(sql, param_list) - finally: - stop = time() - duration = stop - start - try: - times = len(param_list) - except TypeError: # param_list could be an iterator - times = '?' - self.db.queries.append({ - 'sql': '%s times: %s' % (times, sql), - 'time': "%.3f" % duration, - }) - logger.debug('(%.3f) %s; args=%s' % (duration, sql, param_list), - extra={'duration': duration, 'sql': sql, 'params': param_list} - ) - - -############################################### -# Converters from database (string) to Python # -############################################### - -def typecast_date(s): - return datetime.date(*map(int, s.split('-'))) if s else None # returns None if s is null - -def typecast_time(s): # does NOT store time zone information - if not s: return None - hour, minutes, seconds = s.split(':') - if '.' in seconds: # check whether seconds have a fractional part - seconds, microseconds = seconds.split('.') - else: - microseconds = '0' - return datetime.time(int(hour), int(minutes), int(seconds), int(float('.'+microseconds) * 1000000)) - -def typecast_timestamp(s): # does NOT store time zone information - # "2005-07-29 15:48:00.590358-05" - # "2005-07-29 09:56:00-05" - if not s: return None - if not ' ' in s: return typecast_date(s) - d, t = s.split() - # Extract timezone information, if it exists. Currently we just throw - # it away, but in the future we may make use of it. - if '-' in t: - t, tz = t.split('-', 1) - tz = '-' + tz - elif '+' in t: - t, tz = t.split('+', 1) - tz = '+' + tz - else: - tz = '' - dates = d.split('-') - times = t.split(':') - seconds = times[2] - if '.' in seconds: # check whether seconds have a fractional part - seconds, microseconds = seconds.split('.') - else: - microseconds = '0' - tzinfo = utc if settings.USE_TZ else None - return datetime.datetime(int(dates[0]), int(dates[1]), int(dates[2]), - int(times[0]), int(times[1]), int(seconds), - int((microseconds + '000000')[:6]), tzinfo) - -def typecast_decimal(s): - if s is None or s == '': - return None - return decimal.Decimal(s) - -############################################### -# Converters from Python to database (string) # -############################################### - -def rev_typecast_decimal(d): - if d is None: - return None - return str(d) - -def truncate_name(name, length=None, hash_len=4): - """Shortens a string to a repeatable mangled version with the given length. - """ - if length is None or len(name) <= length: - return name - - hsh = hashlib.md5(force_bytes(name)).hexdigest()[:hash_len] - return '%s%s' % (name[:length-hash_len], hsh) - -def format_number(value, max_digits, decimal_places): - """ - Formats a number into a string with the requisite number of digits and - decimal places. - """ - if isinstance(value, decimal.Decimal): - context = decimal.getcontext().copy() - context.prec = max_digits - return "{0:f}".format(value.quantize(decimal.Decimal(".1") ** decimal_places, context=context)) - else: - return "%.*f" % (decimal_places, value) |