|
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