@@ -540,6 +540,8 @@ cdef class MessageWithData(Message):
540
540
elif ora_type_num == TNS_DATA_TYPE_VARCHAR \
541
541
or ora_type_num == TNS_DATA_TYPE_CHAR \
542
542
or ora_type_num == TNS_DATA_TYPE_LONG:
543
+ if csfrm == TNS_CS_NCHAR:
544
+ buf._caps._check_ncharset_id()
543
545
column_value = buf.read_str(csfrm)
544
546
elif ora_type_num == TNS_DATA_TYPE_RAW \
545
547
or ora_type_num == TNS_DATA_TYPE_LONG_RAW:
@@ -944,9 +946,10 @@ cdef class MessageWithData(Message):
944
946
elif ora_type_num == TNS_DATA_TYPE_VARCHAR \
945
947
or ora_type_num == TNS_DATA_TYPE_CHAR \
946
948
or ora_type_num == TNS_DATA_TYPE_LONG:
947
- if var_impl.dbtype._csfrm == 1 :
949
+ if var_impl.dbtype._csfrm == TNS_CS_IMPLICIT :
948
950
temp_bytes = (< str > value).encode()
949
951
else :
952
+ buf._caps._check_ncharset_id()
950
953
temp_bytes = (< str > value).encode(TNS_ENCODING_UTF16)
951
954
buf.write_bytes_chunked(temp_bytes)
952
955
elif ora_type_num == TNS_DATA_TYPE_RAW \
@@ -1976,6 +1979,7 @@ cdef class LobOpMessage(Message):
1976
1979
buf.write_bytes(self .dest_lob_impl._locator)
1977
1980
if self .operation == TNS_LOB_OP_CREATE_TEMP:
1978
1981
if self .source_lob_impl.dbtype._csfrm == TNS_CS_NCHAR:
1982
+ buf._caps._check_ncharset_id()
1979
1983
buf.write_ub4(TNS_CHARSET_UTF16)
1980
1984
else :
1981
1985
buf.write_ub4(TNS_CHARSET_UTF8)
@@ -2068,9 +2072,10 @@ cdef class ProtocolMessage(Message):
2068
2072
cdef int _process_message(self , ReadBuffer buf,
2069
2073
uint8_t message_type) except - 1 :
2070
2074
cdef:
2071
- uint16_t num_elem, fdo_length, charset_id, ncharset_id
2075
+ uint16_t num_elem, fdo_length
2072
2076
bytearray server_compile_caps
2073
2077
bytearray server_runtime_caps
2078
+ Capabilities caps = buf._caps
2074
2079
const char_type * fdo
2075
2080
ssize_t ix
2076
2081
uint8_t c
@@ -2080,19 +2085,16 @@ cdef class ProtocolMessage(Message):
2080
2085
buf.read_ub1(& c)
2081
2086
if c == 0 :
2082
2087
break
2083
- buf.read_uint16(& charset_id, BYTE_ORDER_LSB)
2084
- buf._caps.char_conversion = charset_id != TNS_CHARSET_UTF8
2088
+ buf.read_uint16(& caps. charset_id, BYTE_ORDER_LSB)
2089
+ buf._caps.char_conversion = caps. charset_id != TNS_CHARSET_UTF8
2085
2090
buf.skip_ub1() # skip server flags
2086
2091
buf.read_uint16(& num_elem, BYTE_ORDER_LSB)
2087
2092
if num_elem > 0 : # skip elements
2088
2093
buf.skip_raw_bytes(num_elem * 5 )
2089
2094
buf.read_uint16(& fdo_length)
2090
2095
fdo = buf.read_raw_bytes(fdo_length)
2091
2096
ix = 6 + fdo[5 ] + fdo[6 ]
2092
- ncharset_id = (fdo[ix + 3 ] << 8 ) + fdo[ix + 4 ]
2093
- if ncharset_id != TNS_CHARSET_UTF16:
2094
- errors._raise_err(errors.ERR_NCHAR_CS_NOT_SUPPORTED,
2095
- charset_id = ncharset_id)
2097
+ caps.ncharset_id = (fdo[ix + 3 ] << 8 ) + fdo[ix + 4 ]
2096
2098
server_compile_caps = bytearray(buf.read_bytes())
2097
2099
server_runtime_caps = bytearray(buf.read_bytes())
2098
2100
if not server_compile_caps[TNS_CCAP_LOGON_TYPES] & TNS_CCAP_O7LOGON:
0 commit comments