Witam!
Mam taki sobie przykładowy kod (w rzeczywistośći jest o wiele bardziej rozbudowany):
int main ()
{
//[......] variables
CALL_SQLITE (open ("test.db", & db));
while(1)
{
sql = "INSERT INTO t (xyz) VALUES (?)";
CALL_SQLITE (prepare_v2 (db, sql, strlen (sql) + 1, & stmt, NULL));
CALL_SQLITE (bind_text (stmt, 1, "fruit", 6, SQLITE_STATIC));
CALL_SQLITE_EXPECT (step (stmt), DONE);
printf ("row id was %d\n", (int) sqlite3_last_insert_rowid (db));
}
return 0;
}
i plik nagłówkowy w którym mam używane do wywołań funkcje:
int status_dostepu_db=0;
#define CALL_SQLITE(f) \
{ \
int i; \
i = sqlite3_ ## f; \
if (i != SQLITE_OK) { \
fprintf (stderr, "1: %s failed with status %d: %s\n", \
#f, i, sqlite3_errmsg (db)); \
status_dostepu_db=i; \
} \
} \
#define CALL_SQLITE_EXPECT(f,x) \
{ \
int i; \
i = sqlite3_ ## f; \
if (i != SQLITE_ ## x) { \
fprintf (stderr, "2: %s failed with status %d: %s\n", \
#f, i, sqlite3_errmsg (db)); \
status_dostepu_db=i; \
} \
} \
w głównym programie używam status_dostepu_db, aby wiedzieć czy mogę coś robić z bazą czy nie. Ale w zdaża, się że jeśli modyfikuję bazę z zewnątrz to przy CALL_SQLITE_EXPECT(step (stmt), DONE) czyli przy funkcji sqlite3_step() baza zostaje zablokowana na dobre. Jak powinienem temu zaradzić? Gdzieś w dokumentacji czytałem, że powinienem zrobić 'rollback transaction' ale nie bardzo wiem jak miałoby to wyglądać. Normalnie w pliku nagłówkowym w miejscu zmiany zmiennej status_dostepu_db było exit() i to załatwiało sprawę, ale bardziej mi zależy na tym aby program chodził dalej i obsłużył ten błąd. Jak widzę jednak baza blokuje się na dobre i zmienna jest ustawiana za każdym razem gdy w programie zrobię wywołanie funkcji SQLite.
z góry dzięki
pozdrawiam
herszt