Я пытаюсь записать BLOB в базу данных - порция за порцией, используя C-функцию API базы данных (скажем, 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 для Large, и цикл может повторяться много раз.Кроме того, весь этот код может быть обернут внешним циклом (например, массовой вставкой).Итак, я хочу минимизировать количество шагов в теле цикла (ов).
Чтобы это сделать, мне нужно:
, чтобы можно было прочитать последовательность, а нев потоковый буфер, но напрямую в чужой буфер, например:
(read-sequence (coerce foreign-buffer '(vector/array ...)) MY-STREAM)
или чтобы иметь возможность интерпретировать потоковый буфер как внешнюю память, например:
(db-write-chunk (mem-aptr stream-buffer :uchar 0))
Можно ли решить мою проблему, используя только один буфер - собственный или внешний, без копирования памяти между ними?