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.
ora-lob-get-buffer
is available only when the "oracle" module is loaded. See the section Oracle LOB interface 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)
(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
LispWorks User Guide and Reference Manual - 13 Feb 2015