|
73 | 73 | int_array_recv,
|
74 | 74 | numeric_in,
|
75 | 75 | numeric_in_binary,
|
76 |
| - pg_types, |
77 |
| - py_types, |
| 76 | +) |
| 77 | +from redshift_connector.utils import pg_types as PG_TYPES |
| 78 | +from redshift_connector.utils import py_types as PY_TYPES |
| 79 | +from redshift_connector.utils import ( |
78 | 80 | q_pack,
|
79 | 81 | time_in,
|
80 | 82 | time_recv_binary,
|
81 | 83 | timetz_in,
|
82 | 84 | timetz_recv_binary,
|
83 | 85 | walk_array,
|
84 | 86 | )
|
| 87 | +from redshift_connector.utils.type_utils import ( |
| 88 | + BIGINT, |
| 89 | + DATE, |
| 90 | + INTEGER, |
| 91 | + INTEGER_ARRAY, |
| 92 | + NUMERIC, |
| 93 | + REAL_ARRAY, |
| 94 | + SMALLINT, |
| 95 | + SMALLINT_ARRAY, |
| 96 | + TEXT_ARRAY, |
| 97 | + TIME, |
| 98 | + TIMESTAMP, |
| 99 | + TIMESTAMPTZ, |
| 100 | + TIMETZ, |
| 101 | + VARCHAR_ARRAY, |
| 102 | +) |
85 | 103 |
|
86 | 104 | if TYPE_CHECKING:
|
87 | 105 | from ssl import SSLSocket
|
@@ -451,6 +469,8 @@ def __init__(
|
451 | 469 | self._run_cursor: Cursor = Cursor(self, paramstyle="named")
|
452 | 470 | self._client_protocol_version: int = client_protocol_version
|
453 | 471 | self._database = database
|
| 472 | + self.py_types = deepcopy(PY_TYPES) |
| 473 | + self.pg_types = deepcopy(PG_TYPES) |
454 | 474 | self._database_metadata_current_db_only: bool = database_metadata_current_db_only
|
455 | 475 |
|
456 | 476 | # based on _client_protocol_version value, we must use different conversion functions
|
@@ -647,31 +667,31 @@ def __init__(
|
647 | 667 |
|
648 | 668 | def _enable_protocol_based_conversion_funcs(self: "Connection"):
|
649 | 669 | if self._client_protocol_version == ClientProtocolVersion.BINARY.value:
|
650 |
| - pg_types[1700] = (FC_BINARY, numeric_in_binary) |
651 |
| - pg_types[1082] = (FC_BINARY, date_recv_binary) |
652 |
| - pg_types[1083] = (FC_BINARY, time_recv_binary) |
653 |
| - pg_types[1266] = (FC_BINARY, timetz_recv_binary) |
654 |
| - pg_types[1002] = (FC_BINARY, array_recv_binary) # CHAR[] |
655 |
| - pg_types[1005] = (FC_BINARY, array_recv_binary) # INT2[] |
656 |
| - pg_types[1007] = (FC_BINARY, array_recv_binary) # INT4[] |
657 |
| - pg_types[1009] = (FC_BINARY, array_recv_binary) # TEXT[] |
658 |
| - pg_types[1015] = (FC_BINARY, array_recv_binary) # VARCHAR[] |
659 |
| - pg_types[1021] = (FC_BINARY, array_recv_binary) # FLOAT4[] |
660 |
| - pg_types[1028] = (FC_BINARY, array_recv_binary) # OID[] |
661 |
| - pg_types[1034] = (FC_BINARY, array_recv_binary) # ACLITEM[] |
| 670 | + self.pg_types[NUMERIC] = (FC_BINARY, numeric_in_binary) |
| 671 | + self.pg_types[DATE] = (FC_BINARY, date_recv_binary) |
| 672 | + self.pg_types[TIME] = (FC_BINARY, time_recv_binary) |
| 673 | + self.pg_types[TIMETZ] = (FC_BINARY, timetz_recv_binary) |
| 674 | + self.pg_types[1002] = (FC_BINARY, array_recv_binary) # CHAR[] |
| 675 | + self.pg_types[SMALLINT_ARRAY] = (FC_BINARY, array_recv_binary) # INT2[] |
| 676 | + self.pg_types[INTEGER_ARRAY] = (FC_BINARY, array_recv_binary) # INT4[] |
| 677 | + self.pg_types[TEXT_ARRAY] = (FC_BINARY, array_recv_binary) # TEXT[] |
| 678 | + self.pg_types[VARCHAR_ARRAY] = (FC_BINARY, array_recv_binary) # VARCHAR[] |
| 679 | + self.pg_types[REAL_ARRAY] = (FC_BINARY, array_recv_binary) # FLOAT4[] |
| 680 | + self.pg_types[1028] = (FC_BINARY, array_recv_binary) # OID[] |
| 681 | + self.pg_types[1034] = (FC_BINARY, array_recv_binary) # ACLITEM[] |
662 | 682 | else: # text protocol
|
663 |
| - pg_types[1700] = (FC_TEXT, numeric_in) |
664 |
| - pg_types[1083] = (FC_TEXT, time_in) |
665 |
| - pg_types[1082] = (FC_TEXT, date_in) |
666 |
| - pg_types[1266] = (FC_TEXT, timetz_in) |
667 |
| - pg_types[1002] = (FC_TEXT, array_recv_text) # CHAR[] |
668 |
| - pg_types[1005] = (FC_TEXT, int_array_recv) # INT2[] |
669 |
| - pg_types[1007] = (FC_TEXT, int_array_recv) # INT4[] |
670 |
| - pg_types[1009] = (FC_TEXT, array_recv_text) # TEXT[] |
671 |
| - pg_types[1015] = (FC_TEXT, array_recv_text) # VARCHAR[] |
672 |
| - pg_types[1021] = (FC_TEXT, float_array_recv) # FLOAT4[] |
673 |
| - pg_types[1028] = (FC_TEXT, int_array_recv) # OID[] |
674 |
| - pg_types[1034] = (FC_TEXT, array_recv_text) # ACLITEM[] |
| 683 | + self.pg_types[NUMERIC] = (FC_TEXT, numeric_in) |
| 684 | + self.pg_types[TIME] = (FC_TEXT, time_in) |
| 685 | + self.pg_types[DATE] = (FC_TEXT, date_in) |
| 686 | + self.pg_types[TIMETZ] = (FC_TEXT, timetz_in) |
| 687 | + self.pg_types[1002] = (FC_TEXT, array_recv_text) # CHAR[] |
| 688 | + self.pg_types[SMALLINT_ARRAY] = (FC_TEXT, int_array_recv) # INT2[] |
| 689 | + self.pg_types[INTEGER_ARRAY] = (FC_TEXT, int_array_recv) # INT4[] |
| 690 | + self.pg_types[TEXT_ARRAY] = (FC_TEXT, array_recv_text) # TEXT[] |
| 691 | + self.pg_types[VARCHAR_ARRAY] = (FC_TEXT, array_recv_text) # VARCHAR[] |
| 692 | + self.pg_types[REAL_ARRAY] = (FC_TEXT, float_array_recv) # FLOAT4[] |
| 693 | + self.pg_types[1028] = (FC_TEXT, int_array_recv) # OID[] |
| 694 | + self.pg_types[1034] = (FC_TEXT, array_recv_text) # ACLITEM[] |
675 | 695 |
|
676 | 696 | @property
|
677 | 697 | def _is_multi_databases_catalog_enable_in_server(self: "Connection") -> bool:
|
@@ -946,31 +966,31 @@ def handle_BACKEND_KEY_DATA(self: "Connection", data: bytes, ps) -> None:
|
946 | 966 |
|
947 | 967 | def inspect_datetime(self: "Connection", value: Datetime):
|
948 | 968 | if value.tzinfo is None:
|
949 |
| - return py_types[1114] # timestamp |
| 969 | + return self.py_types[TIMESTAMP] # timestamp |
950 | 970 | else:
|
951 |
| - return py_types[1184] # send as timestamptz |
| 971 | + return self.py_types[TIMESTAMPTZ] # send as timestamptz |
952 | 972 |
|
953 | 973 | def inspect_int(self: "Connection", value: int):
|
954 | 974 | if min_int2 < value < max_int2:
|
955 |
| - return py_types[21] |
| 975 | + return self.py_types[SMALLINT] |
956 | 976 | if min_int4 < value < max_int4:
|
957 |
| - return py_types[23] |
| 977 | + return self.py_types[INTEGER] |
958 | 978 | if min_int8 < value < max_int8:
|
959 |
| - return py_types[20] |
960 |
| - return py_types[Decimal] |
| 979 | + return self.py_types[BIGINT] |
| 980 | + return self.py_types[Decimal] |
961 | 981 |
|
962 | 982 | def make_params(self: "Connection", values):
|
963 | 983 | params = []
|
964 | 984 | for value in values:
|
965 | 985 | typ = type(value)
|
966 | 986 | try:
|
967 |
| - params.append(py_types[typ]) |
| 987 | + params.append(self.py_types[typ]) |
968 | 988 | except KeyError:
|
969 | 989 | try:
|
970 | 990 | params.append(self.inspect_funcs[typ](value))
|
971 | 991 | except KeyError as e:
|
972 | 992 | param = None
|
973 |
| - for k, v in py_types.items(): |
| 993 | + for k, v in self.py_types.items(): |
974 | 994 | try:
|
975 | 995 | if isinstance(value, typing.cast(type, k)):
|
976 | 996 | param = v
|
@@ -1033,7 +1053,7 @@ def handle_ROW_DESCRIPTION(self: "Connection", data, cursor: Cursor) -> None:
|
1033 | 1053 | idx += 2
|
1034 | 1054 |
|
1035 | 1055 | cursor.ps["row_desc"].append(field)
|
1036 |
| - field["pg8000_fc"], field["func"] = pg_types[field["type_oid"]] |
| 1056 | + field["pg8000_fc"], field["func"] = self.pg_types[field["type_oid"]] |
1037 | 1057 |
|
1038 | 1058 | def execute(self: "Connection", cursor: Cursor, operation: str, vals) -> None:
|
1039 | 1059 | """
|
@@ -1158,7 +1178,7 @@ def execute(self: "Connection", cursor: Cursor, operation: str, vals) -> None:
|
1158 | 1178 |
|
1159 | 1179 | # We've got row_desc that allows us to identify what we're
|
1160 | 1180 | # going to get back from this statement.
|
1161 |
| - output_fc = tuple(pg_types[f["type_oid"]][0] for f in ps["row_desc"]) |
| 1181 | + output_fc = tuple(self.pg_types[f["type_oid"]][0] for f in ps["row_desc"]) |
1162 | 1182 |
|
1163 | 1183 | ps["input_funcs"] = tuple(f["func"] for f in ps["row_desc"])
|
1164 | 1184 | # Byte1('B') - Identifies the Bind command.
|
|
0 commit comments