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