Skip to content

Commit 98198e9

Browse files
committed
feat(get_datatype_name): support getting datatype name from oid
1 parent 5e8be5c commit 98198e9

File tree

6 files changed

+244
-278
lines changed

6 files changed

+244
-278
lines changed

redshift_connector/__init__.py

Lines changed: 6 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -43,54 +43,9 @@
4343
make_divider_block,
4444
mask_secure_info_in_props,
4545
)
46-
from redshift_connector.utils.type_utils import (
47-
ABSTIME,
48-
BIGINT,
49-
BIGINTEGER,
50-
BOOLEAN,
51-
BOOLEAN_ARRAY,
52-
BYTES,
53-
CHAR,
54-
CHAR_ARRAY,
55-
DATE,
56-
DATETIME,
57-
DECIMAL,
58-
DECIMAL_ARRAY,
59-
FLOAT,
60-
FLOAT_ARRAY,
61-
GEOGRAPHY,
62-
GEOMETRY,
63-
GEOMETRYHEX,
64-
INET,
65-
INT2VECTOR,
66-
INTEGER,
67-
INTEGER_ARRAY,
68-
INTERVAL,
69-
JSON,
70-
JSONB,
71-
MACADDR,
72-
NAME,
73-
NAME_ARRAY,
74-
NULLTYPE,
75-
NUMBER,
76-
OID,
77-
ROWID,
78-
SMALLINT,
79-
STRING,
80-
SUPER,
81-
TEXT,
82-
TEXT_ARRAY,
83-
TIME,
84-
TIMESTAMP,
85-
TIMESTAMPTZ,
86-
TIMETZ,
87-
UNKNOWN,
88-
UUID_TYPE,
89-
VARBYTE,
90-
VARCHAR,
91-
VARCHAR_ARRAY,
92-
XID,
93-
)
46+
from redshift_connector.utils.oids import RedshiftOID
47+
48+
globals().update(RedshiftOID.__members__)
9449

9550
from .version import __version__
9651

@@ -427,6 +382,8 @@ def connect(
427382
String property stating the type of parameter marker formatting expected by the interface; This value defaults to "format", in which parameters are marked in this format "WHERE name=%s"
428383
"""
429384

385+
redshift_oids = [d.name for d in RedshiftOID]
386+
430387
__all__: typing.Any = [
431388
"Warning",
432389
"DataError",
@@ -459,50 +416,4 @@ def connect(
459416
"PGText",
460417
"PGVarchar",
461418
"__version__",
462-
"ABSTIME",
463-
"BIGINT",
464-
"BIGINTEGER",
465-
"BOOLEAN",
466-
"BOOLEAN_ARRAY",
467-
"BYTES",
468-
"CHAR",
469-
"CHAR_ARRAY",
470-
"DATE",
471-
"DATETIME",
472-
"DECIMAL",
473-
"DECIMAL_ARRAY",
474-
"FLOAT",
475-
"FLOAT_ARRAY",
476-
"GEOGRAPHY",
477-
"GEOMETRY",
478-
"GEOMETRYHEX",
479-
"INET",
480-
"INT2VECTOR",
481-
"INTEGER",
482-
"INTEGER_ARRAY",
483-
"INTERVAL",
484-
"JSON",
485-
"JSONB",
486-
"MACADDR",
487-
"NAME",
488-
"NAME_ARRAY",
489-
"NULLTYPE",
490-
"NUMBER",
491-
"OID",
492-
"ROWID",
493-
"STRING",
494-
"SMALLINT",
495-
"SUPER",
496-
"TEXT",
497-
"TEXT_ARRAY",
498-
"TIME",
499-
"TIMESTAMP",
500-
"TIMESTAMPTZ",
501-
"TIMETZ",
502-
"UNKNOWN",
503-
"UUID_TYPE",
504-
"VARBYTE",
505-
"VARCHAR",
506-
"VARCHAR_ARRAY",
507-
"XID",
508-
]
419+
] + redshift_oids

redshift_connector/core.py

Lines changed: 36 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -90,24 +90,7 @@
9090
varbytehex_recv,
9191
walk_array,
9292
)
93-
from redshift_connector.utils.type_utils import (
94-
BIGINT,
95-
DATE,
96-
GEOGRAPHY,
97-
INTEGER,
98-
INTEGER_ARRAY,
99-
NUMERIC,
100-
REAL_ARRAY,
101-
SMALLINT,
102-
SMALLINT_ARRAY,
103-
TEXT_ARRAY,
104-
TIME,
105-
TIMESTAMP,
106-
TIMESTAMPTZ,
107-
TIMETZ,
108-
VARBYTE,
109-
VARCHAR_ARRAY,
110-
)
93+
from redshift_connector.utils.oids import RedshiftOID
11194

11295
if TYPE_CHECKING:
11396
from ssl import SSLSocket
@@ -741,42 +724,42 @@ def get_calling_module() -> str:
741724

742725
def _enable_protocol_based_conversion_funcs(self: "Connection"):
743726
if self._client_protocol_version >= ClientProtocolVersion.BINARY.value:
744-
self.pg_types[NUMERIC] = (FC_BINARY, numeric_in_binary)
745-
self.pg_types[DATE] = (FC_BINARY, date_recv_binary)
746-
self.pg_types[GEOGRAPHY] = (FC_BINARY, geographyhex_recv) # GEOGRAPHY
747-
self.pg_types[TIME] = (FC_BINARY, time_recv_binary)
748-
self.pg_types[TIMETZ] = (FC_BINARY, timetz_recv_binary)
749-
self.pg_types[1002] = (FC_BINARY, array_recv_binary) # CHAR[]
750-
self.pg_types[SMALLINT_ARRAY] = (FC_BINARY, array_recv_binary) # INT2[]
751-
self.pg_types[INTEGER_ARRAY] = (FC_BINARY, array_recv_binary) # INT4[]
752-
self.pg_types[TEXT_ARRAY] = (FC_BINARY, array_recv_binary) # TEXT[]
753-
self.pg_types[VARCHAR_ARRAY] = (FC_BINARY, array_recv_binary) # VARCHAR[]
754-
self.pg_types[REAL_ARRAY] = (FC_BINARY, array_recv_binary) # FLOAT4[]
755-
self.pg_types[1028] = (FC_BINARY, array_recv_binary) # OID[]
756-
self.pg_types[1034] = (FC_BINARY, array_recv_binary) # ACLITEM[]
757-
self.pg_types[VARBYTE] = (FC_TEXT, text_recv) # VARBYTE
727+
self.pg_types[RedshiftOID.NUMERIC] = (FC_BINARY, numeric_in_binary)
728+
self.pg_types[RedshiftOID.DATE] = (FC_BINARY, date_recv_binary)
729+
self.pg_types[RedshiftOID.GEOGRAPHY] = (FC_BINARY, geographyhex_recv) # GEOGRAPHY
730+
self.pg_types[RedshiftOID.TIME] = (FC_BINARY, time_recv_binary)
731+
self.pg_types[RedshiftOID.TIMETZ] = (FC_BINARY, timetz_recv_binary)
732+
self.pg_types[RedshiftOID.CHAR_ARRAY] = (FC_BINARY, array_recv_binary) # CHAR[]
733+
self.pg_types[RedshiftOID.SMALLINT_ARRAY] = (FC_BINARY, array_recv_binary) # INT2[]
734+
self.pg_types[RedshiftOID.INTEGER_ARRAY] = (FC_BINARY, array_recv_binary) # INT4[]
735+
self.pg_types[RedshiftOID.TEXT_ARRAY] = (FC_BINARY, array_recv_binary) # TEXT[]
736+
self.pg_types[RedshiftOID.VARCHAR_ARRAY] = (FC_BINARY, array_recv_binary) # VARCHAR[]
737+
self.pg_types[RedshiftOID.REAL_ARRAY] = (FC_BINARY, array_recv_binary) # FLOAT4[]
738+
self.pg_types[RedshiftOID.OID_ARRAY] = (FC_BINARY, array_recv_binary) # OID[]
739+
self.pg_types[RedshiftOID.ACLITEM_ARRAY] = (FC_BINARY, array_recv_binary) # ACLITEM[]
740+
self.pg_types[RedshiftOID.VARBYTE] = (FC_TEXT, text_recv) # VARBYTE
758741

759742
if self.numeric_to_float:
760-
self.pg_types[NUMERIC] = (FC_BINARY, numeric_to_float_binary)
743+
self.pg_types[RedshiftOID.NUMERIC] = (FC_BINARY, numeric_to_float_binary)
761744

762745
else: # text protocol
763-
self.pg_types[NUMERIC] = (FC_TEXT, numeric_in)
764-
self.pg_types[TIME] = (FC_TEXT, time_in)
765-
self.pg_types[DATE] = (FC_TEXT, date_in)
766-
self.pg_types[GEOGRAPHY] = (FC_TEXT, text_recv) # GEOGRAPHY
767-
self.pg_types[TIMETZ] = (FC_BINARY, timetz_recv_binary)
768-
self.pg_types[1002] = (FC_TEXT, array_recv_text) # CHAR[]
769-
self.pg_types[SMALLINT_ARRAY] = (FC_TEXT, int_array_recv) # INT2[]
770-
self.pg_types[INTEGER_ARRAY] = (FC_TEXT, int_array_recv) # INT4[]
771-
self.pg_types[TEXT_ARRAY] = (FC_TEXT, array_recv_text) # TEXT[]
772-
self.pg_types[VARCHAR_ARRAY] = (FC_TEXT, array_recv_text) # VARCHAR[]
773-
self.pg_types[REAL_ARRAY] = (FC_TEXT, float_array_recv) # FLOAT4[]
774-
self.pg_types[1028] = (FC_TEXT, int_array_recv) # OID[]
775-
self.pg_types[1034] = (FC_TEXT, array_recv_text) # ACLITEM[]
776-
self.pg_types[VARBYTE] = (FC_TEXT, varbytehex_recv) # VARBYTE
746+
self.pg_types[RedshiftOID.NUMERIC] = (FC_TEXT, numeric_in)
747+
self.pg_types[RedshiftOID.TIME] = (FC_TEXT, time_in)
748+
self.pg_types[RedshiftOID.DATE] = (FC_TEXT, date_in)
749+
self.pg_types[RedshiftOID.GEOGRAPHY] = (FC_TEXT, text_recv) # GEOGRAPHY
750+
self.pg_types[RedshiftOID.TIMETZ] = (FC_BINARY, timetz_recv_binary)
751+
self.pg_types[RedshiftOID.CHAR_ARRAY] = (FC_TEXT, array_recv_text) # CHAR[]
752+
self.pg_types[RedshiftOID.SMALLINT_ARRAY] = (FC_TEXT, int_array_recv) # INT2[]
753+
self.pg_types[RedshiftOID.INTEGER_ARRAY] = (FC_TEXT, int_array_recv) # INT4[]
754+
self.pg_types[RedshiftOID.TEXT_ARRAY] = (FC_TEXT, array_recv_text) # TEXT[]
755+
self.pg_types[RedshiftOID.VARCHAR_ARRAY] = (FC_TEXT, array_recv_text) # VARCHAR[]
756+
self.pg_types[RedshiftOID.REAL_ARRAY] = (FC_TEXT, float_array_recv) # FLOAT4[]
757+
self.pg_types[RedshiftOID.OID_ARRAY] = (FC_TEXT, int_array_recv) # OID[]
758+
self.pg_types[RedshiftOID.ACLITEM_ARRAY] = (FC_TEXT, array_recv_text) # ACLITEM[]
759+
self.pg_types[RedshiftOID.VARBYTE] = (FC_TEXT, varbytehex_recv) # VARBYTE
777760

778761
if self.numeric_to_float:
779-
self.pg_types[NUMERIC] = (FC_TEXT, numeric_to_float_in)
762+
self.pg_types[RedshiftOID.NUMERIC] = (FC_TEXT, numeric_to_float_in)
780763

781764
@property
782765
def _is_multi_databases_catalog_enable_in_server(self: "Connection") -> bool:
@@ -1458,17 +1441,17 @@ def handle_BACKEND_KEY_DATA(self: "Connection", data: bytes, ps) -> None:
14581441

14591442
def inspect_datetime(self: "Connection", value: Datetime):
14601443
if value.tzinfo is None:
1461-
return self.py_types[TIMESTAMP] # timestamp
1444+
return self.py_types[RedshiftOID.TIMESTAMP] # timestamp
14621445
else:
1463-
return self.py_types[TIMESTAMPTZ] # send as timestamptz
1446+
return self.py_types[RedshiftOID.TIMESTAMPTZ] # send as timestamptz
14641447

14651448
def inspect_int(self: "Connection", value: int):
14661449
if min_int2 < value < max_int2:
1467-
return self.py_types[SMALLINT]
1450+
return self.py_types[RedshiftOID.SMALLINT]
14681451
if min_int4 < value < max_int4:
1469-
return self.py_types[INTEGER]
1452+
return self.py_types[RedshiftOID.INTEGER]
14701453
if min_int8 < value < max_int8:
1471-
return self.py_types[BIGINT]
1454+
return self.py_types[RedshiftOID.BIGINT]
14721455
return self.py_types[Decimal]
14731456

14741457
def make_params(self: "Connection", values):

redshift_connector/utils/oids.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
from enum import IntEnum
2+
3+
4+
class RedshiftOID(IntEnum):
5+
ACLITEM = 1033
6+
ACLITEM_ARRAY = 1034
7+
ANY_ARRAY = 2277
8+
ABSTIME = 702
9+
BIGINT = 20
10+
BIGINT_ARRAY = 1016
11+
BOOLEAN = 16
12+
BOOLEAN_ARRAY = 1000
13+
BPCHAR = 1042
14+
BPCHAR_ARRAY = 1014
15+
BYTES = 17
16+
BYTES_ARRAY = 1001
17+
CHAR = 18
18+
CHAR_ARRAY = 1002
19+
CIDR = 650
20+
CIDR_ARRAY = 651
21+
CSTRING = 2275
22+
CSTRING_ARRAY = 1263
23+
DATE = 1082
24+
DATE_ARRAY = 1182
25+
FLOAT = 701
26+
FLOAT_ARRAY = 1022
27+
GEOGRAPHY = 3001
28+
GEOMETRY = 3000
29+
GEOMETRYHEX = 3999
30+
INET = 869
31+
INET_ARRAY = 1041
32+
INT2VECTOR = 22
33+
INTEGER = 23
34+
INTEGER_ARRAY = 1007
35+
INTERVAL = 1186
36+
INTERVAL_ARRAY = 1187
37+
JSON = 114
38+
JSON_ARRAY = 199
39+
JSONB = 3802
40+
JSONB_ARRAY = 3807
41+
MACADDR = 829
42+
MONEY = 790
43+
MONEY_ARRAY = 791
44+
NAME = 19
45+
NAME_ARRAY = 1003
46+
NUMERIC = 1700
47+
NUMERIC_ARRAY = 1231
48+
NULLTYPE = -1
49+
OID = 26
50+
OID_ARRAY = 1028
51+
POINT = 600
52+
REAL = 700
53+
REAL_ARRAY = 1021
54+
REGPROC = 24
55+
SMALLINT = 21
56+
SMALLINT_ARRAY = 1005
57+
SMALLINT_VECTOR = 22
58+
STRING = 1043
59+
SUPER = 4000
60+
TEXT = 25
61+
TEXT_ARRAY = 1009
62+
TIME = 1083
63+
TIME_ARRAY = 1183
64+
TIMESTAMP = 1114
65+
TIMESTAMP_ARRAY = 1115
66+
TIMESTAMPTZ = 1184
67+
TIMESTAMPTZ_ARRAY = 1185
68+
TIMETZ = 1266
69+
UNKNOWN = 705
70+
UUID_TYPE = 2950
71+
UUID_ARRAY = 2951
72+
VARCHAR = 1043
73+
VARBYTE = 6551
74+
VARCHAR_ARRAY = 1015
75+
XID = 28
76+
77+
BIGINTEGER = BIGINT
78+
DATETIME = TIMESTAMP
79+
NUMBER = DECIMAL = NUMERIC
80+
DECIMAL_ARRAY = NUMERIC_ARRAY
81+
ROWID = OID
82+
83+
84+
def get_datatype_name(oid: int) -> str:
85+
return RedshiftOID(oid).name

0 commit comments

Comments
 (0)