Sto sviluppando un'applicazione in Visual C++ che utilizza un database SQLite3 per l'archiviazione dei dati. Solitamente si trova nel cassetto per la maggior parte del tempo.Blocco file SQLite e DropBox
Vorrei anche abilitare l'inserimento della mia app in una cartella DropBox per condividerla su più PC. Ha funzionato molto bene fino a quando DropBox si è aggiornato di recente. E ora dice che "non può sincronizzare il file in uso". Il file SQLite è aperto nella mia app, ma il blocco è condiviso. Esistono alcune istruzioni preparate, ma tutte vengono ripristinate immediatamente dopo l'utilizzo di step
.
C'è un modo per abilitare la sincronizzazione di un file di database SQLite aperto? Grazie!
Ecco il semplice involucro che uso solo per i test (senza gestione degli errori), nel caso in cui questo aiuta:
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: Provato commentando tutte le chiamate a LockFile e LockFileEx in sqlite3.c - stesso risultato.
UPD2: Tentativo di chiamare sqlite3_close inattivo (come prova del concetto) - sempre lo stesso risultato! Filemon dice che il file non è ancora chiuso, solo sbloccato.
UPD3: La modalità di autocommit è attiva. I numeri di BEGIN e COMMIT corrispondono (classe Transaction e RAII si occupano di ciò). SQliteManager è in grado di connettersi al DB mentre la mia app è in esecuzione e apportare modifiche ad esso.
Stai verificando il risultato da sqlite3_close()? Forse non funziona perché non hai finalizzato tutte le tue dichiarazioni preparate. –
Era questo! Non funzionava a causa di un backup in background in esecuzione. Errore stupido .. Grazie! Mettilo come risposta e lo accetterò. –