Открытие данных BLOB-объектов, хранящихся в Sqlite в виде файла с Tcl / Tk - PullRequest
1 голос
/ 17 мая 2010

Я использую следующий код tcl для сохранения файла с моего рабочего стола в базу данных Sqlite в качестве данных BLOB-объектов ($fileText - это путь к текстовому файлу):

sqlite3 db Docs.db
set fileID [open $fileText RDONLY]
fconfigure $fileID -translation binary
set content [read $fileID]
close $fileID
db eval {insert into Document (Doc) VALUES ($content)}
db close

Я нашел многоресурсы о том, как открыть данные большого двоичного объекта для чтения и записи в него, но я не могу найти никаких ресурсов для открытия данных большого двоичного объекта в виде файла.Например, если бы $ fileText был pdf, как бы я открыл его из Sqlite как pdf?

1 Ответ

1 голос
/ 17 мая 2010

Когда вы говорите «открыть как PDF», я предполагаю, что вы имеете в виду, что вы хотите, чтобы какая-то внешняя программа видела данные в виде файла? Единственный способ сделать это:

  1. Выполните некоторые хитрые махинации с файловыми системами пользовательского режима в Linux (или эквивалентными в вашей ОС), чтобы база данных могла быть фактически смонтирована, или
  2. Скопируйте данные из базы данных во временный файл с правильным именем (подсказка: сохраните это как отдельный столбец в этой таблице).

Там также все это представлено как веб-сервер, но это действительно второй браузер в миксе; данные все еще копируются.

С другой стороны, если все, что вам нужно - это иметь данные в виде потока, который вы можете читать или записывать из 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...