Не удается получить доступ к базе данных Sqlite (Firefox) с помощью System.Data.Sqlite - PullRequest
1 голос
/ 29 марта 2011

Я написал небольшое приложение на C # /. Net, которое может читать файл cookies.sqlite в Firefox.Поскольку я обновил до Firefox 4, мое приложение не может открыть файл базы данных:

Выполнение строки "connection.Open ();"(в приведенном ниже примере кода) будет выполнено исключение:

"Файл открыт, но это не файл базы данных. Файл зашифрован или не является базой данных"

Это моя программакод:

class Program
{
    static void Main()
    {

        const string PATH_TO_DATABASE = @"C:\Users\Boris\Desktop\TEMP\cookies.sqlite";
        const string CONNECTION_STRING = @"Data Source=" + PATH_TO_DATABASE;

        if (!File.Exists(PATH_TO_DATABASE)) return;

        using (SQLiteConnection connection = new SQLiteConnection(CONNECTION_STRING))
        {
            connection.Open();
            using (SQLiteCommand command = new SQLiteCommand("SELECT id, name, host, path FROM moz_cookies", connection))
            {
                using (SQLiteDataReader read = command.ExecuteReader())
                {
                    while (read.Read())
                    {
                        string id = read[0].ToString();
                        string name = read[1].ToString();
                        string host = read[2].ToString();
                        string path = read[3].ToString();
                        Console.WriteLine("ID: " + id);
                        Console.WriteLine("Name: " + name);
                        Console.WriteLine("Host: " + host);
                        Console.WriteLine("Path: " + path);
                    }
                }
            }
        }
    }
}

Я использую .Net Wrapper DLL для Sqlite v. 3.6.23.1.Целевой структурой приложения является .Net 2.0.

Мне удалось без проблем открыть базу данных sqlite с помощью приложения под названием SqliteExpert.

Было бы замечательно, если у кого-нибудь есть идея!

С уважением, Борис

Ответы [ 4 ]

7 голосов
/ 29 марта 2011

Firefox 4.0 использует SQLite версии 3.7.4. (Чтобы увидеть это, скачайте SQLite Manager и запустите select sqlite_version(); на вкладке «Выполнение SQL».)

Похоже, что v3.7.4 создает базы данных, которые не могут быть прочитаны v3.6.23.1. Я не могу найти это явно указано в заметках о выпуске , но из сравнения файла cookies.sqlite с документацией формата файла ясно, что формат изменился. В частности, согласно документации, байт 19 (0x13) должен быть 1, но этот байт в файле cookies.sqlite равен 2. Согласно документации:

Если значение больше 1 читается SQLite, тогда библиотека откажется открыть базу данных.

Как и описанная «версия для записи» выше, это поле существует для облегчения некоторая степень прямой совместимости, в случае, если это когда-либо требуется. Если версия SQLite, созданная в будущее использует формат файла, который не может смело читайте старый SQLite версии, тогда это поле будет установлено до значения больше 1.

Для чтения базы данных вам потребуется использовать последнюю версию SQLite; к сожалению, System.Data.SQLite не обновлялся почти год. С тех пор проект перешел на sqlite.org, но загрузки в настоящее время недоступны .

Если вы не хотите ждать, пока sqlite.org выпустит оболочку .NET на основе v3.7.x, вы можете попробовать загрузить source и вручную обновить SQLite.NET/SQLite.Interop/src/sqlite3.c до последней версии. исходный файл объединения C (доступно здесь ).

РЕДАКТИРОВАТЬ: Как отмечено sdwilsh , Firefox 4.0 использует Запись с записью в очередь ; в описании этого нового режима журнала говорится:

Таким образом, если старая версия SQLite пытается подключиться к SQLite база данных, которая работает в WAL режим, он сообщит об ошибке вместе строки файла зашифрованы или не база данных ".

3 голосов
/ 29 марта 2011

У меня была такая же проблема.Ранее я использовал скрипт Python (с интеграцией sqlite) для извлечения данных из файлов cookies.sqlite и perms.sqlite.Последний по-прежнему работает нормально.Действительно, все остальные файлы .sqlite доступны для чтения ... за исключением cookies.sqlite и place.sqlite.Эти два сообщения приводят к ошибке «зашифровано или не является базой данных».

Вместо того, чтобы искать обновление для Python (или sqlite3), я создал патч для файлов .sqlite.Этот C-код изменяет байты со смещением 18 и 19 со 2 на 1. Я запускаю это в Windows под Cygwin, но он должен компилироваться и запускаться в Unix / Linux.

Предупреждение: не делайте этого дляоригинальный файл Firefox cookies.sqlite.Вместо этого скопируйте его во временный файл, а затем запустите исправление для копии.

// ffpatch.c
// Edits the specified Firefox .sqlite file.
// Changes 0x0202 to 0x0101 at offset 18/19.
// BEFORE
//   0000000   S   Q   L   i   t   e       f   o   r   m   a   t       3  \0
//   0000020 004  \0 002 002  \0   @          \0  \0 005 034  \0  \0  \0   N
// AFTER
//   0000000   S   Q   L   i   t   e       f   o   r   m   a   t       3  \0
//   0000020 004  \0 001 001  \0   @          \0  \0 005 034  \0  \0  \0   N

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#define PROGNAME "ffpatch"
#define MY_OFFSET 18

int main (int argc, char *argv[])
{
  int      fd;
  char     buf[2];
  off_t    offset;
  ssize_t  wsize;

  if (argc != 2)
  {
    fprintf(stderr, "usage: %s sqlite-file\n", PROGNAME);
    exit(1);
  }

  if ((fd = open(argv[1], O_RDWR)) == -1)
  {
    fprintf(stderr, "cannot open %s\n", argv[1]);
    exit(1);
  }

  if ((offset = lseek(fd, MY_OFFSET, SEEK_SET)) != MY_OFFSET)
  {
    fprintf(stderr, "lseek() failed\n");
    exit(1);
  }

  buf[0] = 1;
  buf[1] = 1;
  wsize = write(fd, buf, 2);   

  close(fd);

  exit(0);
}
2 голосов
/ 31 марта 2011

Привет и большое спасибо за ваши ответы!

Я заставил свое приложение работать так:

1. Я загрузил источники текущего ADO.NET Connector для .NET 4.0 здесь: http://system.data.sqlite.org/index.html/timeline?r=trunk

Возможно, вам придется сначала войти на сайт, используя анонимное имя пользователя и пароль в качестве пароля.

2. Я получил предварительно скомпилированную версию sqlite3.dll v.3.7.4, загрузив установочный коннектор ADO.NET: http://www.devart.com/dotconnect/sqlite/ (Вы также можете использовать библиотеки соединителей ADO.NET в качестве замены для соединителя из system.data.sqlite.org. Меня самого интересует только sqlite3.dll.)

3. После компиляции исходных файлов из system.data.sqlite.org я скопировал получившийся файл System.Data.Sqlite.dll и sqlite3.dll в выходной каталог моих приложений. Обратите внимание, что обе библиотеки DLL скомпилированы для компьютеров с архитектурой x86 или x64.

Привет

0 голосов
/ 04 мая 2015

Я думаю, у меня есть твоя проблема. Ваше соединение с БД в порядке. Прежде всего, какую версию dotnetFramework вы используете? Соответственно, вы можете скачать и использовать файл System.Data.SQLite.dll для ваших ссылок, тогда ваша проблема может быть решена. Я думаю, что вы используете System.Data.SQLite.dll файл, который старше (не соответствует вашей версии dot net).

...