Когда вы говорите «открыть как PDF», я предполагаю, что вы имеете в виду, что вы хотите, чтобы какая-то внешняя программа видела данные в виде файла? Единственный способ сделать это:
- Выполните некоторые хитрые махинации с файловыми системами пользовательского режима в Linux (или эквивалентными в вашей ОС), чтобы база данных могла быть фактически смонтирована, или
- Скопируйте данные из базы данных во временный файл с правильным именем (подсказка: сохраните это как отдельный столбец в этой таблице).
Там также все это представлено как веб-сервер, но это действительно второй браузер в миксе; данные все еще копируются.
С другой стороны, если все, что вам нужно - это иметь данные в виде потока, который вы можете читать или записывать из Tcl, пакет sqlite3 имеет то, что вам нужно:
<i>dbcmd</i> <b>incrblob</b> ?<b>-readonly</b>? ?<i>db</i>? <i>table column rowid</i>
Возвращает стандартный дескриптор канала (но не тот, который поддерживается дескриптором ОС, поэтому будьте осторожны, если используете перенаправление с exec
).
[РЕДАКТИРОВАТЬ]: Вот как вывести данные (замените ...
на предложение, чтобы получить правильный ряд, конечно):
# Open the DB
sqlite3 db Docs.db
# Open the file to write to
set fileID [open $fileText w]
fconfigure $fileID -translation binary
# Write the BLOB
db eval {SELECT Doc FROM Document WHERE ... LIMIT 1} row {
puts -nonewline $fileID $row(Doc)
}
# We're done!
close $fileID
db close
Не беспокойтесь о размере BLOB; пакет Tcl sqlite3
эффективно передает его. Если вы все еще обеспокоены, вот другой путь (опять же, вам нужно заменить ...
соответственно):
# Open the DB
sqlite3 db Docs.db
# Open the file to write to
set fileOut [open $fileText w]
fconfigure $fileOut -translation binary
# Get the BLOB as a (read-only) channel
set fdBlob [db incrblob -readonly Document Doc ...]
fconfigure $fdBlob -translation binary
# Do the copy
fcopy $fileOut $fdBlob
# We're done!
close $fdBlob
close $fileOut
db close