Skip to content

Commit 074c54c

Browse files
committed
refactor(integer-datetime): remove datatype conversion functions for when server option integer_datetime is disabled
1 parent b773a9a commit 074c54c

File tree

4 files changed

+4
-99
lines changed

4 files changed

+4
-99
lines changed

redshift_connector/core.py

-35
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,6 @@
6363
pg_types,
6464
py_types,
6565
q_pack,
66-
timestamp_recv_float,
67-
timestamp_recv_integer,
68-
timestamp_send_float,
69-
timestamp_send_integer,
70-
timestamptz_recv_float,
71-
timestamptz_recv_integer,
72-
timestamptz_send_float,
73-
timestamptz_send_integer,
7466
walk_array,
7567
)
7668

@@ -1186,33 +1178,6 @@ def handle_PARAMETER_STATUS(self: "Connection", data: bytes, ps) -> None:
11861178
if key == b"client_encoding":
11871179
encoding = value.decode("ascii").lower()
11881180
_client_encoding = pg_to_py_encodings.get(encoding, encoding)
1189-
1190-
elif key == b"integer_datetimes":
1191-
if value == b"on":
1192-
1193-
py_types[1114] = (1114, FC_BINARY, timestamp_send_integer)
1194-
pg_types[1114] = (FC_BINARY, timestamp_recv_integer)
1195-
1196-
py_types[1184] = (1184, FC_BINARY, timestamptz_send_integer)
1197-
pg_types[1184] = (FC_BINARY, timestamptz_recv_integer)
1198-
1199-
# py_types[Interval] = (
1200-
# 1186, FC_BINARY, interval_send_integer)
1201-
# py_types[Timedelta] = (
1202-
# 1186, FC_BINARY, interval_send_integer)
1203-
# pg_types[1186] = (FC_BINARY, interval_recv_integer)
1204-
else:
1205-
py_types[1114] = (1114, FC_BINARY, timestamp_send_float)
1206-
pg_types[1114] = (FC_BINARY, timestamp_recv_float)
1207-
py_types[1184] = (1184, FC_BINARY, timestamptz_send_float)
1208-
pg_types[1184] = (FC_BINARY, timestamptz_recv_float)
1209-
1210-
# py_types[Interval] = (
1211-
# 1186, FC_BINARY, interval_send_float)
1212-
# py_types[Timedelta] = (
1213-
# 1186, FC_BINARY, interval_send_float)
1214-
# pg_types[1186] = (FC_BINARY, interval_recv_float)
1215-
12161181
elif key == b"server_version":
12171182
self._server_version: LooseVersion = LooseVersion(value.decode("ascii"))
12181183
if self._server_version < LooseVersion("8.2.0"):

redshift_connector/utils/__init__.py

-4
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,8 @@
2323
pg_types,
2424
py_types,
2525
q_pack,
26-
timestamp_recv_float,
2726
timestamp_recv_integer,
28-
timestamp_send_float,
2927
timestamp_send_integer,
30-
timestamptz_recv_float,
3128
timestamptz_recv_integer,
32-
timestamptz_send_float,
3329
timestamptz_send_integer,
3430
)

redshift_connector/utils/type_utils.py

+2-46
Original file line numberDiff line numberDiff line change
@@ -116,15 +116,6 @@ def null_send(v) -> bytes:
116116
return NULL
117117

118118

119-
# data is double-precision float representing seconds since 2000-01-01
120-
def timestamp_recv_float(data: bytes, offset: int, length: int) -> Datetime:
121-
return Datetime.utcfromtimestamp(EPOCH_SECONDS + d_unpack(data, offset)[0])
122-
123-
124-
def timestamptz_recv_float(data: bytes, offset: int, length: int) -> Datetime:
125-
return timestamp_recv_float(data, offset, length).replace(tzinfo=Timezone.utc)
126-
127-
128119
# data is 64-bit integer representing microseconds since 2000-01-01
129120
def timestamp_recv_integer(data: bytes, offset: int, length: int) -> typing.Union[Datetime, str, float]:
130121
micros: float = q_unpack(data, offset)[0]
@@ -144,23 +135,12 @@ def timestamp_send_integer(v: Datetime) -> bytes:
144135
return q_pack(int((timegm(v.timetuple()) - EPOCH_SECONDS) * 1e6) + v.microsecond)
145136

146137

147-
# data is double-precision float representing seconds since 2000-01-01
148-
def timestamp_send_float(v: Datetime) -> bytes:
149-
return d_pack(timegm(v.timetuple()) + v.microsecond / 1e6 - EPOCH_SECONDS)
150-
151-
152138
def timestamptz_send_integer(v: Datetime) -> bytes:
153139
# timestamps should be sent as UTC. If they have zone info,
154140
# convert them.
155141
return timestamp_send_integer(v.astimezone(Timezone.utc).replace(tzinfo=None))
156142

157143

158-
def timestamptz_send_float(v: Datetime) -> bytes:
159-
# timestamps should be sent as UTC. If they have zone info,
160-
# convert them.
161-
return timestamp_send_float(v.astimezone(Timezone.utc).replace(tzinfo=None))
162-
163-
164144
# return a timezone-aware datetime instance if we're reading from a
165145
# "timestamp with timezone" type. The timezone returned will always be
166146
# UTC, but providing that additional information can permit conversion
@@ -193,21 +173,6 @@ def timestamptz_recv_integer(data: bytes, offset: int, length: int) -> typing.Un
193173
# return typing.cast(bytes, qii_pack(microseconds, v.days, months))
194174

195175

196-
# def interval_send_float(v: typing.Union[Interval, Timedelta]) -> bytes:
197-
# seconds: float = v.microseconds / 1000.0 / 1000.0
198-
# try:
199-
# seconds += v.seconds # type: ignore
200-
# except AttributeError:
201-
# pass
202-
#
203-
# try:
204-
# months: int = v.months # type: ignore
205-
# except AttributeError:
206-
# months = 0
207-
#
208-
# return typing.cast(bytes, dii_pack(seconds, v.days, months))
209-
210-
211176
glbls: typing.Dict[str, type] = {"Decimal": Decimal}
212177
trans_tab = dict(zip(map(ord, "{}"), "[]"))
213178

@@ -236,15 +201,6 @@ def numeric_in(data: bytes, offset: int, length: int) -> Decimal:
236201
# return UUID(bytes=data[offset:offset+length])
237202

238203

239-
# def interval_recv_float(data: bytes, offset: int, length: int) -> typing.Union[Timedelta, Interval]:
240-
# seconds, days, months = typing.cast(typing.Tuple[int, ...], dii_unpack(data, offset))
241-
# if months == 0:
242-
# secs, microseconds = divmod(seconds, 1e6)
243-
# return Timedelta(days, secs, microseconds)
244-
# else:
245-
# return Interval(int(seconds * 1000 * 1000), days, months)
246-
247-
248204
# def interval_recv_integer(data: bytes, offset: int, length: int) -> typing.Union[Timedelta, Interval]:
249205
# microseconds, days, months = typing.cast(
250206
# typing.Tuple[int, ...], qii_unpack(data, offset)
@@ -346,8 +302,8 @@ def date_in(data: bytes, offset: int, length: int):
346302
1043: (FC_BINARY, text_recv), # VARCHAR type
347303
1082: (FC_TEXT, date_in), # date
348304
1083: (FC_TEXT, time_in),
349-
1114: (FC_BINARY, timestamp_recv_float), # timestamp w/ tz
350-
1184: (FC_BINARY, timestamptz_recv_float),
305+
1114: (FC_BINARY, timestamp_recv_integer), # timestamp w/ tz
306+
1184: (FC_BINARY, timestamptz_recv_integer),
351307
# 1186: (FC_BINARY, interval_recv_integer),
352308
# 1231: (FC_TEXT, array_in), # NUMERIC[]
353309
# 1263: (FC_BINARY, array_recv), # cstring[]

test/unit/test_type_utils.py

+2-14
Original file line numberDiff line numberDiff line change
@@ -69,27 +69,15 @@ def test_numeric_out(_input):
6969
assert type_utils.numeric_out(in_val) == exp_val
7070

7171

72-
@pytest.mark.parametrize(
73-
"_input",
74-
[
75-
(datetime(1999, 12, 12, 12, 12, 12, 342380), b"\xc19\xb2c\xa8Y\xc8\x00"),
76-
(datetime(2017, 11, 28, 23, 55, 59, 342380), b"A\xc0\xd8Z\x07\xab\xd3\x1c"),
77-
],
78-
)
79-
def test_timestamp_send_float(_input):
80-
in_val, exp_val = _input
81-
assert type_utils.timestamp_send_float(in_val) == exp_val
82-
83-
84-
timestamp_send_float_data = [
72+
timestamp_send_integer_data = [
8573
(b"00000000", int.from_bytes(b"00000000", "big")),
8674
(b"12345678", int.from_bytes(b"12345678", "big")),
8775
(INFINITY_MICROSECONDS.to_bytes(length=8, byteorder="big"), "infinity"),
8876
(MINUS_INFINITY_MICROSECONDS.to_bytes(signed=True, length=8, byteorder="big"), "-infinity"),
8977
]
9078

9179

92-
@pytest.mark.parametrize("_input", timestamp_send_float_data)
80+
@pytest.mark.parametrize("_input", timestamp_send_integer_data)
9381
def test_timestamp_recv_integer(_input):
9482
in_val, exp_val = _input
9583
print(type_utils.timestamp_recv_integer(in_val, 0, 0))

0 commit comments

Comments
 (0)