Новый вопрос такой, раз в секунду принимая инфо с 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 закрываем БД и выходим из программы
}Чтобы было больше пищи, выложу получающиеся файлы
Вот как вариант думаю попробовать перед записью открывать бд, записать строчку, закрыть и так далее...
Какие есть еще варианты?
Как можно восстановить БД пусть даже с потерей информации в последнем блоке?