Едем дальше, вопросы по sqlite3

Модератор: Модераторы разделов

truebest
Сообщения: 18
ОС: Windows xp

Едем дальше, вопросы по sqlite3

Сообщение truebest »

Спасибо всем кто участвовал в обсуждении моей предыдущей теме, по невозможности запуска 2х приложений одновременно.

Новый вопрос такой, раз в секунду принимая инфо с gps я заношу в бд sqlite3 новую строку в таблицу. Но бывает так что резко во время работы отключается питание, и после этого файл бд невозможно ничем открыть, хотя внутри структурированные данные, только косяк в последнем блоке я как понимаю.

И вроде бы запись в бд идет только блоками по 2048 кб, система создает файл сначала имябд.db-jornal, пишет в него 2048 кб инфо прибавляет затем типа запрос и вставляет в основной файл имябд.db, затем файл имябд.db-jornal пишется с нуля, и так далее. И все равно бывает повезет после резкого выключения питалова база открывается, но чаще не открывается(

В программе своей я при ее запуске открываю бд, в ходе ее работы записываю данные и по завершению работы закрываю. Выглядит это так

Код: Выделить всё

static void start_sqlite(void)
{
    int rc = sqlite3_open("/mnt/cgps.db", &db);
    if( rc )
    {
        sqlite3_close(db);
        fprintf( stderr, "Error opening DB! Error: %d\n", rc );
        exit(1);
    }
}

static void stop_sqlite (void)
{
    sqlite3_close(db);

}

static void print_fix(struct gps_data_t *gpsdata, struct tm *time)
{
char sql_query[ 256 ];
//тут я малясь пропущу что не относится к бд, а именно проверка приходящих значений на число и привод в нужный вид для записи в бд
sprintf( sql_query,  "insert into data values ( %d, %d, %f, %f, %d, %d, %s 0 );",
                            sensors, date_pack,
                            lat, lon,
                            ( button ) ? -1 : speed,
                            track;

    int rc = sqlite3_exec(db, sql_query, NULL /* callback */, 0, &zErrMsg);
    if( rc!=SQLITE_OK ){
        sqlite3_free(zErrMsg);
 }


int main (int argc, char** argv)
{
 void start_sqlite(void)

//потом выполняем тралялля бесконечный цикл в том числе
print_fix( gpsdata, &time );
// По приходу SIGTERM закрываем БД и выходим из программы
}


Чтобы было больше пищи, выложу получающиеся файлы


Вот как вариант думаю попробовать перед записью открывать бд, записать строчку, закрыть и так далее...
Какие есть еще варианты?
Как можно восстановить БД пусть даже с потерей информации в последнем блоке?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Едем дальше, вопросы по sqlite3

Сообщение sash-kan »

truebest писал(а): ↑
29.04.2010 04:24
Как можно восстановить БД пусть даже с потерей информации в последнем блоке?

http://www.google.ru/search?q=sqlite+repair
первая ссылка вполне подходит. во второй ещё конкретнее.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали: