我尝试使用数据库 API C 函数(例如,)将 BLOB 逐块写入数据库db-write-chunk
。此函数将指向外部内存(放置块的位置)的指针作为参数。所以,我为一个块做缓冲区:foreign-buffer
。我将从文件(或二进制流)中获取块read-sequence
数据stream-buffer
:
(let ((foreign-buffer (foreign-alloc :uchar 1024)))
(stream-buffer ((make-array 1024 :element-type '(unsigned-byte 8))))
(loop
for cnt = (read-sequence stream-buffer MY-STREAM)
while (> cnt 0)
do
;; copy cnt bytes from stream-buffer into foreign-buffer
;; call db-write-chunk with foreign-buffer
L
在 BLOB 中是大的,循环可能会迭代很多次。除此之外,所有这些代码都可能被外部循环(例如批量插入)包装。所以,我想尽量减少循环体中的步骤数。
要做到这一点,我需要:
能够不将序列读入流缓冲区,而是直接读入外部缓冲区,如下所示:
(read-sequence (coerce foreign-buffer '(vector/array ...)) MY-STREAM)
或者能够将流缓冲区解释为外部内存,如下所示:
(db-write-chunk (mem-aptr stream-buffer :uchar 0))
是否可以仅使用单个缓冲区(本机或外部缓冲区)来解决我的问题,而无需在它们之间复制内存?