RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.

1. Введение

"SQLite Archive" является емкостью для файла, подобной ZIP-архиву или Tarball, но на основе базы данных SQLite.

SQLite Archive это обычный файл базы данных SQLite, который содержит следующую таблицу как часть ее схемы:

CREATE TABLE sqlar(
  name TEXT PRIMARY KEY,  -- name of the file
  mode INT,               -- access permissions
  mtime INT,              -- last modification time
  sz INT,                 -- original file size
  data BLOB               -- compressed content
);

Каждая строка таблицы SQLAR содержит содержание единственного файла. Имя файла (полный путь относительно корня архива) находится в области "name". Поле "mode" это целое число, которое является правами доступа стиля Unix для файла. "mtime" это время изменения файла в секундах с 1970. "sz" это оригинальный несжатый размер файла. Область "data" содержит содержание файла. Содержание обычно сжимается, используя Deflate, хотя не всегда. Если "sz" равно размеру области "data", содержание сохранено несжатым.

1.1. База данных как контейнерный объект

SQLite Archive это один пример более общего представления, что база данных SQLite может вести себя как контейнерный объект, содержащий много меньших компонентов данных.

С базами данных клиент-сервер как PostgreSQL или Oracle, пользователи и разработчики склонны думать о базе данных как о сервисе или узле, но не как об объекте. Это вызвано тем, что содержание базы данных распространено на многие файлы на сервере или возможно на многие серверы в сервисной группе. Нельзя указать на единственный файл или даже единственный каталог и сказать, что "это база данных".

SQLite, напротив, хранит все содержание в единственном файле на диске. Тот единственный файл это что-то, на что можно указать и сказать, что "это база данных ". Это ведет себя как объект. Файл базы данных SQLite может быть скопирован, переименован, послан как почтовое приложение, передан как аргумент POST-запросу HTTP, или иначе обработан как другой объект данных, такой как изображение, документ или медиа-файл.

Исследования показывают, что много приложений уже используют SQLite в качестве контейнерного объекта. Например, Kennedy (не имеет никакого отношения к SQLite developer) сообщает, что 14% приложений Android никогда не пишут в их базы данных SQLite. Считается, что эти приложения загружают все базы данных из облака и затем используют информацию в местном масштабе по мере необходимости. Другими словами, они используют SQLite не как базу данных, а как запрашиваемый формат электронной передачи.

1.2. Используя архивы SQLite

Fossil Distributed Version Control предоставляет пользователям выбор загрузить регистрации как Tarball, архивы ZIP или как архивы SQLite.

2. Преимущества архивов SQLite

  1. Архив SQLite гибок. ZIP Archive и Tarball ограничиваются хранением только файлов. Архив SQLite хранит файлы плюс другие табличные и/или относительные данные, которые кажутся полезными для применения.

  2. SQLite Archive транзакционный. Обновления атомные и длительные, даже если есть потери мощности посреди обновления. Читатели видят последовательную и неизменную версию содержания, даже если некоторый другой процесс одновременно обновляет архив.

  3. SQLite Archive может быть обновлен с приращением. Отдельные файлы могут быть добавлены, удалены или заменены, не имея необходимости переписывать весь архив.

  4. SQLite Archive может быть запрошен, используя язык запросов высокого уровня (SQL). Некоторые примеры:

    • Каков полный размер всех файлов в архиве, имена которого заканчиваются на ".h" или ".cpp"?
    • Какой процент файлов сжаты меньше, чем на 25%?
    • Сколько исполняемых файлов находится в архиве?
    На вопросы как эти можно ответить, не имея необходимости извлекать любое содержание.
  5. Приложения, которые уже используют SQLite для других целей, могут легко добавить поддержку SQLite Archives, используя маленькое расширение ( https://sqlite.org/src/file/ext/misc/sqlar.c), чтобы обращаться со сжатием и декомпрессией содержания. Даже это крошечное расширение может быть опущено, если файлы в архиве не сжаты. Напротив, поддержка ZIP Archive и/или Tarball требует отдельных библиотек или большого количества дополнительного кода.

  6. SQLite Archive может работать вокруг наложенной брандмауэром цензуры. Например, определенные типы файлов, которые считают "опасными" (например: DLL), будут блокироваться Gmail и вероятно многими другими почтовыми сервисами и брандмауэрами, даже если файлы будут обернуты в ZIP Archive или Tarball. Но эти брандмауэры обычно еще не знают об SQLite Archive и таким образом, содержание может быть помещено в архиве SQLite, чтобы уклониться от цензуры.

3. Недостатки SQLite Archives

  1. SQLite Archive это относительно новый формат. Это было сначала описано в 2014. ZIP Archive и Tarball, с другой стороны, известны в течение многих десятилетий и хорошо укреплены как стандартные форматы. Большинство программистов знает, каковы ZIP Archive или Tarball, но если вы скажете "Архив SQLite", то вы, вероятно, получите ответ "Что?". Утилиты, чтобы обработать ZIP Archive и Tarball, более вероятно, будут установлены на компьютерах.

  2. Так как база данных SQLite это более общий формат (она разработана, чтобы сделать намного больше, чем просто связку файлов), это не столь компактно как ZIP Archive или Tarball. SQLite Archive обычно приблизительно на 1% более крупный, чем эквивалентный ZIP Archive. Tarball сжаты как единый блок вместо того, чтобы сжать каждый файл отдельно, как сделано SQLite и ZIP Archive.

    Как пример, следующая таблица показывает относительные размеры для SQLite Archive, ZIP Archive и Tarball с 1743 файлами в дереве исходных текстов SQLite 3.22.0:

    SQLite Archive10,754,048
    ZIP Archive (Info-ZIP 3.0)10,662,365
    ZIP Archive (zipfile)10,390,215
    Tarball 9,781,109
  3. SQLite Archive поддерживает только метод сжатия Deflate. Tarball и ZIP Archive поддерживают более широкий ассортимент методов сжатия.

4. Управление архивом SQLite из командной строки

Рекомендуемый способ создать, обновить, просмотреть и извлечь SQLite Archive состоит в том, чтобы использовать sqlite3.exe для SQLite version 3.23.0 (2018-04-02) или позже. Эта CLI поддерживает параметр командной строки -A, который разрешает легкое управление SQLite Archives. CLI для SQLite version 3.22.0 (2018-01-22) имеет команду .archive для управления SQLite Archive, но это требует взаимодействия с оболочкой.

Перечислить все файлы в SQLite Archive "example.sqlar" можно одной из этих команд:

sqlite3 example.sqlar -At
sqlite3 example.sqlar -Atv

Извлечь все файлы из SQLite Archive "example.sqlar":

sqlite3 example.sqlar -Ax

Создать новый архив SQLite, названный "alltxt.sqlar", содержащий все файлы *.txt в текущем каталоге:

sqlite3 alltxt.sqlar -Ac *.txt

Добавить или обновить файлы в существующем архиве SQLite:

sqlite3 example.sqlar -Au *.md

Для подсказок использования и резюме всех вариантов, просто дайте CLI опцию -A без дополнительных аргументов:

sqlite3 -A

Все эти команды работают так же, если аргумент имени файла является архивом ZIP вместо базы данных SQLite.

4.1. Другие инструменты командной строки

Так же, как есть программа "zip", чтобы управлять архивами ZIP, и программа "tar", чтобы управлять Tarball, есть программа "sqlar", чтобы управлять архивами SQL. Программа "sqlar" в состоянии создать новый архив SQLite, перечислить содержание существующего архива, добавить или удалить файлы из архива и/или извлечь файлы из архива. Отдельная программа "sqlarfs" в состоянии установить архив SQLite как Fuse Filesystem.

5. Управление архивы SQLite из кода приложения

Приложения могут легко читать или писать SQLite Archive, будучи скомпонованными с SQLite и включая расширение ext/misc/sqlar.c, чтобы обращаться со сжатием и декомпрессией. Расширение sqlar.c создает две новых функции SQL.

sqlar_compress(X)

sqlar_compress(X) пытается сжать копию blob X алгоритмом Deflate и возвращает результат как blob. Если вход X не является сжимаемым blob, то копия X возвращена. Этот установленный порядок используется, вставляя содержание в архив SQLite.

sqlar_uncompress(Y,SZ)

sqlar_uncompress(Y,SZ) отменит сжатие, достигнутое sqlar_compress(X). Параметр Y это сжатое содержание (вывод предшествующего вызова sqlar_compress()) и SZ это оригинальный несжатый размер входа X, который создал Y. Если SZ меньше или равен размеру Y, это указывает, что никакое сжатие не произошло, и таким образом, sqlar_uncompress(Y,SZ) вернет копию Y. Иначе sqlar_uncompress(Y,SZ) выполнит алгоритм Inflate на Y, чтобы вернуть его к оригинальной форме и возвращает несжатое содержание. Этот установленный порядок используется, извлекая содержание из архива SQLite.

Достаточно просто вставить новые записи или извлечь существующие из архива SQLite. Вставьте новое в архив SQLite, используя код:

INSERT INTO sqlar(name,mode,mtime,sz,data)
       VALUES ($name,$mode,strftime('%s',$mtime),
               length($content),sqlar_compress($content));

Извлеките вход из архива SQLite, используя код:

SELECT name, mode, datetime(mtime,'unixepoch'), sqlar_uncompress(data,sz)
       FROM sqlar WHERE ...;

Код выше для общего случая. Для особого случая SQLite Archive, который хранит только несжатое или несжимаемое содержание (это могло бы подойти, например, в архиве SQLite, который хранит только JPEG, GIF, и/или PNG), содержание может быть вставлено и извлечено из базы данных, не используя sqlar_compress() и sqlar_uncompress(), поэтому расширение sqlar.c не требуется.