|
| 1 | +import imp |
1 | 2 | from django.conf import settings
|
2 | 3 | from django.db.backends.base.operations import BaseDatabaseOperations
|
3 | 4 | from django.utils import timezone
|
4 | 5 | from itertools import chain
|
| 6 | +from datetime import datetime |
5 | 7 |
|
| 8 | +import traceback |
6 | 9 |
|
7 | 10 | class DatabaseOperations(BaseDatabaseOperations):
|
8 | 11 | def quote_name(self, name):
|
9 | 12 | if name.startswith('"') and name.endswith('"'):
|
10 | 13 | return name # Quoting once is enough.
|
11 | 14 | return '"%s"' % name
|
12 | 15 |
|
13 |
| - def adapt_datetimefield_value(self, value): |
14 |
| - if value is None: |
15 |
| - return None |
16 |
| - |
17 |
| - # Expression values are adapted by the database. |
18 |
| - if hasattr(value, 'resolve_expression'): |
19 |
| - return value |
20 |
| - |
21 |
| - # MySQL doesn't support tz-aware datetimes |
22 |
| - if timezone.is_aware(value): |
23 |
| - if settings.USE_TZ: |
24 |
| - value = timezone.make_naive(value, self.connection.timezone) |
25 |
| - else: |
26 |
| - raise ValueError( |
27 |
| - "IRIS backend does not support timezone-aware datetimes when USE_TZ is False.") |
28 |
| - return str(value).split("+")[0] |
29 |
| - |
30 | 16 | def last_insert_id(self, cursor, table_name, pk_name):
|
31 | 17 | cursor.execute("SELECT TOP 1 %(pk)s FROM %(table)s ORDER BY %(pk)s DESC" % {
|
32 | 18 | 'table': table_name,
|
@@ -60,3 +46,39 @@ def limit_offset_sql(self, low_mark, high_mark):
|
60 | 46 | # ('LIMIT %d' % limit) if limit else None,
|
61 | 47 | # ('OFFSET %d' % offset) if offset else None,
|
62 | 48 | ) if sql)
|
| 49 | + |
| 50 | + def adapt_datetimefield_value(self, value): |
| 51 | + # print('adapt_datetimefield_value', value) |
| 52 | + # print(*traceback.format_stack(), sep='\n') |
| 53 | + if value is None: |
| 54 | + return None |
| 55 | + # Expression values are adapted by the database. |
| 56 | + if hasattr(value, 'resolve_expression'): |
| 57 | + return value |
| 58 | + |
| 59 | + value = int(value.timestamp() * 1000000) |
| 60 | + if value >= 0: |
| 61 | + value += 2 ** 60 |
| 62 | + else: |
| 63 | + value += -(2 ** 61 * 3) |
| 64 | + |
| 65 | + return str(value) |
| 66 | + # return str(value).split("+")[0] |
| 67 | + |
| 68 | + def get_db_converters(self, expression): |
| 69 | + converters = super().get_db_converters(expression) |
| 70 | + internal_type = expression.output_field.get_internal_type() |
| 71 | + if internal_type == "DateTimeField": |
| 72 | + converters.append(self.convert_datetimefield_value) |
| 73 | + return converters |
| 74 | + |
| 75 | + def convert_datetimefield_value(self, value, expression, connection): |
| 76 | + # print('convert_datetimefield_value', value, expression) |
| 77 | + if isinstance(value, int): |
| 78 | + if value > 0: |
| 79 | + value -= 2 ** 60 |
| 80 | + else: |
| 81 | + value -= -(2 ** 61 * 3) |
| 82 | + value = value / 1000000 |
| 83 | + value = datetime.fromtimestamp(value) |
| 84 | + return value |
0 commit comments