ora-lob-get-buffer lob-locator &key for-writing offset => amount/size , foreign-buffer , eof-or-error-p
The function
ora-lob-get-buffer
gets a buffer for efficient I/O with foreign functions.
If
for-writing
is
nil
, then
ora-lob-get-buffer
fills an internal buffer and returns three values:
amount/size
is how much it filled,
foreign-buffer
points to the actual buffer, and
eof-or-error-p
is the return value from the call to ora-lob-read-foreign-buffer. The offset
offset
is passed directly ora-lob-read-foreign-buffer.
If
for-writing
is true, then
ora-lob-get-buffer
returns two values:
amount/size
is the size of the foreign buffer and
foreign-buffer
points to the actual buffer, which then can be passed to ora-lob-write-foreign-buffer.
The default value of
for-writing
is
nil
.
The buffer that is used by
ora-lob-get-buffer
is always the same for the LOB locator, it is used by ora-lob-read-buffer and ora-lob-write-buffer, and is freed automatically when the LOB locator is freed. Thus until you finish with the buffer, you cannot use ora-lob-read-buffer or ora-lob-write-buffer or call ora-lob-get-buffer again or free the LOB locator.
Note: this function is available only when the "oracle" module is loaded. See the section on the Oracle LOB interface in the LispWorks User Guide for more information.
This first example illustrates reading using the buffer obtained by
ora-lob-get-buffer
. You have a foreign function
my_chunk_processor(char *data, int size)
with this FLI definition
(fli:define-foreign-function my_chunk_processor
((data :pointer)
(size :int)))
You can pass all the data from the LOB locator to this function. Assuming no other function reads from it, it will start from the beginning.
(loop
(multiple-value-bind (amount buffer eof-or-error-p)
(ora-lob-get-buffer lob)
(when (zerop amount) (return))
(my_chunk_processor buffer amount ))
This second example illustrates writing with the buffer obtained by
ora-lob-get-buffer
. You have a foreign function that fills a buffer with data, and you want to write it to a LOB. First you should lock the record, and if required trim the LOB locator.
(multiple-value-bind (size buffer)
(ora-lob-get-buffer lob-locator
:for-writing t
;; start at the beginning
:offset 1)
(loop (let ((amount (my-fill-buffer buffer size)))
(when (zerop amount) (return))
(ora-lob-write-foreign-buffer
lob-locator nil
amount buffer size))))
ora-lob-read-buffer
ora-lob-read-foreign-buffer
ora-lob-write-buffer
ora-lob-write-foreign-buffer