Skip to content

Commit 860a013

Browse files
LOB fixes for 18c database.
1 parent 0b3739d commit 860a013

File tree

4 files changed

+29
-13
lines changed

4 files changed

+29
-13
lines changed

src/oracledb/impl/thin/buffer.pyx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,23 @@ cdef class ReadBuffer:
899899
if is_negative:
900900
value[0] = -value[0]
901901

902+
cdef int read_sb8(self, int64_t *value) except -1:
903+
"""
904+
Reads a signed 64-bit integer from the buffer.
905+
"""
906+
cdef:
907+
const char_type *ptr
908+
bint is_negative
909+
uint8_t length
910+
self._get_int_length_and_sign(&length, &is_negative, 8)
911+
if length == 0:
912+
value[0] = 0
913+
else:
914+
ptr = self._get_raw(length)
915+
value[0] = self._unpack_int(ptr, length)
916+
if is_negative:
917+
value[0] = -value[0]
918+
902919
cdef object read_str(self, int csfrm):
903920
"""
904921
Reads a string from the buffer.

src/oracledb/impl/thin/constants.pxi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,9 @@ DEF TNS_LOB_TEMP_POS = 7
461461
DEF TNS_LOB_TEMP_VALUE = 0x01
462462
DEF TNS_LOB_ABSTRACT_VALUE = 0x40
463463

464+
# other LOB constants
465+
DEF TNS_LOB_OPEN_READ_WRITE = 2
466+
464467
# end-to-end metrics
465468
DEF TNS_END_TO_END_ACTION = 0x0010
466469
DEF TNS_END_TO_END_CLIENT_IDENTIFIER = 0x0001

src/oracledb/impl/thin/lob.pyx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ cdef class ThinLobImpl(BaseLobImpl):
122122
message = self._conn_impl._create_message(LobOpMessage)
123123
message.operation = TNS_LOB_OP_OPEN
124124
message.source_lob_impl = self
125+
message.amount = TNS_LOB_OPEN_READ_WRITE
126+
message.send_amount = True
125127
self._conn_impl._protocol._process_single_message(message)
126128

127129
def read(self, uint64_t offset, uint64_t amount):

src/oracledb/impl/thin/messages.pyx

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1857,7 +1857,7 @@ cdef class LobOpMessage(Message):
18571857
ThinLobImpl dest_lob_impl
18581858
uint64_t source_offset
18591859
uint64_t dest_offset
1860-
uint64_t amount
1860+
int64_t amount
18611861
bint send_amount
18621862
bint bool_flag
18631863
object data
@@ -1903,7 +1903,7 @@ cdef class LobOpMessage(Message):
19031903
if self.operation == TNS_LOB_OP_CREATE_TEMP:
19041904
buf.skip_ub2() # skip character set
19051905
if self.send_amount:
1906-
buf.read_ub8(&self.amount)
1906+
buf.read_sb8(&self.amount)
19071907
if self.operation == TNS_LOB_OP_CREATE_TEMP \
19081908
or self.operation == TNS_LOB_OP_IS_OPEN:
19091909
buf.read_ub2(&temp16) # flag
@@ -1930,19 +1930,15 @@ cdef class LobOpMessage(Message):
19301930
buf.write_uint8(1) # pointer (character set)
19311931
else:
19321932
buf.write_uint8(0) # pointer (character set)
1933-
buf.write_uint8(0) # pointer (amount)
1933+
buf.write_uint8(0) # pointer (short amount)
19341934
if self.operation == TNS_LOB_OP_CREATE_TEMP \
19351935
or self.operation == TNS_LOB_OP_IS_OPEN:
19361936
buf.write_uint8(1) # pointer (NULL LOB)
19371937
else:
19381938
buf.write_uint8(0) # pointer (NULL LOB)
19391939
buf.write_ub4(self.operation)
1940-
if self.operation == TNS_LOB_OP_CREATE_TEMP:
1941-
buf.write_uint8(1) # pointer (SCN array)
1942-
buf.write_ub4(1) # SCN array length
1943-
else:
1944-
buf.write_uint8(0) # pointer (SCN array)
1945-
buf.write_ub4(0) # SCN array length
1940+
buf.write_uint8(0) # pointer (SCN array)
1941+
buf.write_uint8(0) # SCN array length
19461942
buf.write_ub8(self.source_offset)
19471943
buf.write_ub8(self.dest_offset)
19481944
if self.send_amount:
@@ -1960,13 +1956,11 @@ cdef class LobOpMessage(Message):
19601956
buf.write_ub4(TNS_CHARSET_UTF16)
19611957
else:
19621958
buf.write_ub4(TNS_CHARSET_UTF8)
1963-
if self.send_amount:
1964-
buf.write_ub8(self.amount)
19651959
if self.data is not None:
19661960
buf.write_uint8(TNS_MSG_TYPE_LOB_DATA)
19671961
buf.write_bytes_chunked(self.data)
1968-
if self.operation == TNS_LOB_OP_CREATE_TEMP:
1969-
buf.write_ub4(0) # SCN array element
1962+
if self.send_amount:
1963+
buf.write_ub8(self.amount) # LOB amount
19701964

19711965

19721966
@cython.final

0 commit comments

Comments
 (0)