Spec-Zone.ru › SQLite

Файлы архивов SQLite

Содержание
1. Введение
1.1. База данных как контейнерный объект
1.2. Приложения, использующие архивы SQLite
2. Преимущества архивов SQLite
3. Недостатки архивов SQLite
4. Управление архивом SQLite из командной строки
4.1. Другие инструменты командной строки
5. Управление архивами SQLite из кода приложения

1. Введение

«Архив SQLite» — это файловый контейнер, похожий на архив ZIP или архив Tar, но основанный на базе данных SQLite.

Архив SQLite — это обычный файл базы данных 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 — один из примеров более общей идеи: база данных SQLite может выступать в роли контейнерного объекта, содержащего множество небольших компонентов данных.

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

SQLite, напротив, хранит всё содержимое в одном файле на диске. На этот файл можно указать и сказать: «это и есть база данных». Он ведёт себя как объект. Файл базы данных SQLite можно скопировать, переименовать, отправить вложением электронной почты, передать в качестве аргумента HTTP-запроса POST или иным образом использовать как другие объекты данных, например изображения, документы или мультимедийные файлы.

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

1.2. Приложения, использующие архивы SQLite

Система распределённого контроля версий Fossil позволяет пользователям скачивать контрольные точки в виде архивов Tar, ZIP или SQLite.

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

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

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

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

  4. Архив SQLite можно запрашивать с помощью высокоуровневого языка запросов (SQL). Например:

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

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

3. Недостатки архивов SQLite

  1. Архив SQLite — относительно новый формат. Впервые он был описан в 2014 году. Архивы ZIP и Tar, напротив, существуют уже несколько десятилетий и прочно утвердились в качестве стандартных форматов. Большинство программистов знают, что такое архив ZIP или Tar, но на слова «архив SQLite» скорее всего ответят: «Что?» Инструменты для работы с архивами ZIP и Tar с большей вероятностью уже установлены на стандартных компьютерах.

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

    Например, в следующей таблице показаны относительные размеры архива SQLite, архива ZIP и архива Tar, содержащих 1743 файла из дерева исходного кода SQLite 3.22.0:

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

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

Рекомендуемый способ создания, обновления, просмотра содержимого и извлечения файлов из архива SQLite — использовать оболочку командной строки sqlite3.exe для SQLite версии 3.23.0 (2018-04-02) или более поздней. В этой CLI поддерживается параметр командной строки -A, упрощающий управление архивами SQLite. В CLI для SQLite версии 3.22.0 (2018-01-22) есть команда .archive для управления архивами SQLite, но для её использования необходимо взаимодействовать с оболочкой.

Чтобы вывести список всех файлов в архиве SQLite с именем «example.sqlar», используйте одну из этих команд:

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

Чтобы извлечь все файлы из архива SQLite с именем «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

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

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

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

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

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

sqlar_compress(X)

Функция sqlar_compress(X) пытается сжать копию двоичного объекта X с помощью алгоритма Default и возвращает результат в виде двоичного объекта. Если входной объект 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) выполняет над Y алгоритм Inflate, чтобы распаковать данные и восстановить их исходный вид, после чего возвращает распакованное содержимое. Эта процедура используется при извлечении содержимого из архива 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 хранит только несжатое содержимое или содержимое, которое невозможно сжать (например, архив SQLite содержит только изображения JPEG, GIF и/или PNG), то содержимое можно добавлять в базу данных и извлекать из неё без использования функций sqlar_compress() и sqlar_uncompress(), и расширение sqlar.c не требуется.

Эта страница в последний раз обновлялась 2025-05-31 13:08:22Z

SQLite is in the Public Domain.
https://sqlite.org/sqlar.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API