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

Small. Fast. Reliable.
Choose any three.

Имена файлов 8+3 и SQLite

Конфигурация по умолчанию SQLite предполагает, что основная файловая система поддерживает длинные имена файлов.

SQLite не налагает требований обозначения к файлам базы данных. SQLite будет счастливо работать с файлом базы данных, у которого есть любое расширение файла или без расширения вообще. Когда вспомогательные файлы необходимы для журнала отмен, журнала с упреждающей записью или для одного из других видов временных дисковых файлов, тогда название вспомогательного файла обычно строится, прилагая суффикс в конце имени файла базы данных. Например, если оригинальная база данных "app.db", журнал отмен будет "app.db-journal", а журнал с упреждающей записью назовут "app.db-wal". Этот подход к вспомогательному обозначению файла работает отлично на системах с поддержкой длинных имен файлов. Но на системах, которые налагают ограничение 8+3 на имя файла, вспомогательные файлы не соответствуют этому формату 8+3 даже при том, что оригинальный файл базы данных соответствует.

Изменение файловых систем

Рекомендуемое решение для этой проблемы: выбрать другую файловую систему. В эти дни есть огромный выбор высокоэффективных, надежных, файловых систем без патентов с поддержкой длинных имен файлов. Где возможно, рекомендуется, чтобы устройства использовали одну из этих файловых систем. Это избежит проблем совместимости и опасности повреждения базы данных.

Наладка SQLite, чтобы использовать имена файлов 8+3

Некоторые устройства вынуждены использовать более старую файловую систему с 8+3 ограничениями имени файла для совместимости, или из-за других нетехнических факторов. В таких ситуациях SQLite может быть принужден к использованию вспомогательных файлов, которые соответствуют образцу 8+3, следующим образом:

  1. Соберите библиотеку SQLite с опциями SQLITE_ENABLE_8_3_NAMES=1 или SQLITE_ENABLE_8_3_NAMES=2. Поддержка имен файлов 8+3 не включена в SQLite по умолчанию, потому что это действительно представляет некоторые издержки.

  2. Если применена опция SQLITE_ENABLE_8_3_NAMES=1, SQLite способен к использованию имен файлов 8+3, но эти возможности отключены и должны быть позволены отдельно для каждого соединения с базой данных при помощи URI filenames, когда opening или ATTACH-ing файлы базы данных и включать параметр запроса "8_3_names=1" в URI. Если SQLite собран с SQLITE_ENABLE_8_3_NAMES=2, имена файлов 8+3 позволены по умолчанию, и этот шаг может быть пропущен.

  3. Удостоверьтесь, что имена файлов базы данных следуют за форматом 8+3 и что у них нет пустого названия или расширения. Другими словами, имя файла базы данных должно содержать между 1 и 8 знаками в базовом имени и между 1 и 3 знаками в расширении. Чистые расширения не позволены.

Когда шаги выше будут использоваться, SQLite сократит расширения файла, используя только последние 3 знака расширения. Таким образом, например, файл, который обычно называли бы "app.db-journal" сокращен только к "app.nal". Точно так же "app.db-wal" станет "app.wal" и "app.db-shm" станет "app.shm".

Обратите внимание на то, что очень важно, чтобы у имени файла базы данных было некоторое расширение. Если нет никакого расширения, то SQLite создает вспомогательные имена файлов, добавляя символы к базовому имени файла. Таким образом у базы данных под названием "db01" был бы файл журнала отмен "db01-journal". И поскольку у этого имени файла нет расширения, чтобы сократить до 3 символов, оно будет использоваться как есть и нарушит правила обозначения 8+3.

Предупреждение повреждения базы данных

Если к файлу базы данных получают доступ, используя 8+3 обозначения, а не длинное имя файла по умолчанию, то к этому надо всегда получать доступ, используя обозначения 8+3 для каждого соединения с базой данных каждый раз, когда это открыто, иначе есть риск повреждения базы данных. Вспомогательные файлы журнала отмен и журнала с упреждающей записью важны для SQLite для того, чтобы прийти в себя после катастрофы. Если приложение использует 8+3 имени и свалиться, то информация, нужная, чтобы безопасно восстановиться после катастрофы, сохранена в файлах с расширением ".nal" или ".wal". Если следующее приложение, пытаясь открыть базу данных не определит параметр URI "8_3_names=1", SQLite будет использовать длинные имена файлов, чтобы попытаться определить местонахождение файлов журнала или журнала с упреждающей записью обратной перемотки. Это не найдет их, так как они были сохранены, используя имя в формате 8+3, а следовательно база данных не будет правильно восстановлена и вероятно будет повреждена.

Использование файла базы данных с именами файлов 8+3 в одних случаях, а в других с длинными именами файлов эквивалентно удалению горячего журнала.