Захват файла SQLite и Dropbox

Я разрабатываю приложение в Visual C++, который использует SQLite3 DB для того, чтобы хранить данные. Обычно это находится в лотке большую часть времени.

Я также хотел бы позволить поместить свое приложение в папку DropBox для совместного использования его через несколько ПК. Это работало действительно хорошо вплоть до Dropbox, недавно обновил себя. И теперь это говорит, что "не может синхронизировать используемый файл". Файл SQLite открыт в моем приложении, но блокировка совместно используется. Существуют некоторые подготовленные операторы, но все сразу сбрасываются после использования step.

Там какой-либо путь состоит в том, чтобы позволить синхронизироваться открытого файла базы данных SQLite?Спасибо!

Вот простая обертка, которую я использую только для тестирования (никакая обработка ошибок), в случае, если это помогает:

 class Statement
 {
 private:
  Statement(sqlite3* db, const std::wstring& sql) : db(db)
  {
   sqlite3_prepare16_v2(db, sql.c_str(), sql.length() * sizeof(wchar_t), &stmt, NULL);
  }

 public:
  ~Statement() { sqlite3_finalize(stmt); }

 public:
  void reset() { sqlite3_reset(stmt); }
  int step() { return sqlite3_step(stmt); }
  int getInt(int i) const { return sqlite3_column_int(stmt, i); }

  std::wstring getText(int i) const
  {
   const wchar_t* v = (const wchar_t*)sqlite3_column_text16(stmt, i);
   int sz = sqlite3_column_bytes16(stmt, i) / sizeof(wchar_t);
   return std::wstring(v, v + sz);
  }

 private:
  friend class Database;

  sqlite3* db;
  sqlite3_stmt* stmt;
 };


 class Database
 {
 public:
  Database(const std::wstring& filename = L"")) : db(NULL)
  {
   sqlite3_open16(filename.c_str(), &db);
  }

  ~Database() { sqlite3_close(db); } 

  void exec(const std::wstring& sql)
  {
   auto_ptr<Statement> st(prepare(sql));
   st->step();   
  }

  auto_ptr<Statement> prepare(const std::wstring& sql) const
  {
   return auto_ptr<Statement>(new Statement(db, sql));
  }

 private:
  sqlite3* db;
 };

UPD: Попробованное комментирование всех вызовов к LockFile и LockFileEx в sqlite3.c - тот же результат.

UPD2: Попробованный для вызова sqlite3_close, когда неактивным (так же, как подтверждение концепции) - все еще тот же результат! Filemon говорит, что файл все еще не закрыт, только разблокирован.

UPD3: режим Автоматической фиксации идет. Числа НАЧИНАЮТ и ФИКСИРУЮТ соответствие (класс Транзакция, и RAII заботятся об этом). SQliteManager может соединиться с DB, в то время как мое приложение работает, и сделайте модификации к нему.

5
задан Alex Jenter 14 March 2010 в 09:38
поделиться

3 ответа

Проверка результата sqlite3_close () . Возможно, это не работает, потому что вы не завершили все свои подготовленные заявления.

4
ответ дан 14 December 2019 в 04:35
поделиться

Какую файловую систему вы используете?

Вы уверены, что автоматическая фиксация включена и / или что вы фиксируете свои утверждения? Я помню, что у меня была проблема с отказом от фиксации, и блокировка оставалась включенной.

2
ответ дан 14 December 2019 в 04:35
поделиться

Алекс Печников имеет программу репликации базы данных SQLite с несколькими мастерами sqlite3-rdiff . Вероятно, это перебор для того, что вы пытаетесь выполнить, но это может быть проще, чем репликация файлов.

SQLite также имеет Online Backup API ; на этой странице есть пример: Пример 2: Онлайн-резервное копирование работающей базы данных.

2
ответ дан 14 December 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: