Когда вы говорите «открыть как PDF», я предполагаю, что вы хотите, чтобы какая-то внешняя программа видела данные в виде файла? Единственные способы сделать это:
- Проделайте какие-нибудь хитрые махинации с файловыми системами пользовательского режима в Linux (или эквивалентными в вашей ОС), чтобы можно было смонтировать базу данных, или
- Скопируйте данные из базы данных во временный файл с правильным именем (подсказка: сохраните его как отдельный столбец в этой таблице).
Там также представлено все это как веб-сервер, но это действительно второе с браузером в миксе; данные все равно копируются.
С другой стороны, если все, что вы хотите сделать, это иметь данные в виде потока, который вы можете читать или записывать из Tcl, в пакете sqlite3 есть то, что вам нужно:
dbcmd incrblob ?-readonly? ?db? table column rowid
Который возвращает стандартный дескриптор канала (хотя и не подкрепленный дескриптором ОС, поэтому будьте осторожны при использовании в качестве перенаправления с exec
).
[EDIT]: вот как получить данные (конечно, замените ...
предложением, чтобы получить правильную строку):
# 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
person
Donal Fellows
schedule
17.05.2010