Air Quality Monitor
Portable C application for collecting, storing, and analyzing air quality sensor readings
Loading...
Searching...
No Matches
backup_database.c
1#include "core/aqm_db.h"
2#include "core/aqm_paths.h"
3#include "core/aqm_platform.h"
4#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7#include <time.h>
8
9void backup_database(void) {
10 sqlite3 *src = NULL;
11 sqlite3 *dest = NULL;
12
13 if (aqm_db_open(&src) != 0)
14 return;
15
16 time_t t = time(NULL);
17 const struct tm *ptm = localtime(&t);
18 if (!ptm) {
19 fprintf(stderr, "localtime failed.\n");
20 aqm_db_close(src);
21 return;
22 }
23 struct tm tm = *ptm;
24
25 char stamp[64];
26 snprintf(stamp, sizeof(stamp), "%04d-%02d-%02d_%02d-%02d-%02d", tm.tm_year + 1900, tm.tm_mon + 1,
27 tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
28
29 char dest_path[AQM_PATH_MAX];
30 char base[AQM_PATH_MAX];
31 if (aqm_get_data_dir(base, sizeof(base)) != 0) {
32 aqm_db_close(src);
33 fprintf(stderr, "Could not resolve data directory.\n");
34 return;
35 }
36
37 {
38 const char *prefix = "backup_";
39 const char *suffix = "_air_quality.db";
40 size_t need = strlen(base) + strlen(AQM_PATH_SEP) + strlen(prefix) + strlen(stamp) + strlen(suffix) + 1;
41 if (need > sizeof(dest_path)) {
42 fprintf(stderr, "Backup path is too long.\n");
43 aqm_db_close(src);
44 return;
45 }
46 strcpy(dest_path, base);
47 strcat(dest_path, AQM_PATH_SEP);
48 strcat(dest_path, prefix);
49 strcat(dest_path, stamp);
50 strcat(dest_path, suffix);
51 }
52
53 if (sqlite3_open(dest_path, &dest) != SQLITE_OK) {
54 fprintf(stderr, "Cannot create backup file: %s\n", sqlite3_errmsg(dest));
55 sqlite3_close(dest);
56 aqm_db_close(src);
57 return;
58 }
59
60 sqlite3_backup *b = sqlite3_backup_init(dest, "main", src, "main");
61 if (!b) {
62 fprintf(stderr, "Backup init failed: %s\n", sqlite3_errmsg(dest));
63 sqlite3_close(dest);
64 aqm_db_close(src);
65 return;
66 }
67
68 (void)sqlite3_backup_step(b, -1);
69 int rc = sqlite3_backup_finish(b);
70 if (rc != SQLITE_OK) {
71 fprintf(stderr, "Backup failed: %s\n", sqlite3_errmsg(dest));
72 } else {
73 printf("Backup created: %s\n", dest_path);
74 }
75
76 sqlite3_close(dest);
77 aqm_db_close(src);
78}