1#include "core/aqm_db.h"
2#include "core/aqm_paths.h"
3#include "core/aqm_platform.h"
9void backup_database(
void) {
13 if (aqm_db_open(&src) != 0)
16 time_t t = time(NULL);
17 const struct tm *ptm = localtime(&t);
19 fprintf(stderr,
"localtime failed.\n");
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);
29 char dest_path[AQM_PATH_MAX];
30 char base[AQM_PATH_MAX];
31 if (aqm_get_data_dir(base,
sizeof(base)) != 0) {
33 fprintf(stderr,
"Could not resolve data directory.\n");
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");
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);
53 if (sqlite3_open(dest_path, &dest) != SQLITE_OK) {
54 fprintf(stderr,
"Cannot create backup file: %s\n", sqlite3_errmsg(dest));
60 sqlite3_backup *b = sqlite3_backup_init(dest,
"main", src,
"main");
62 fprintf(stderr,
"Backup init failed: %s\n", sqlite3_errmsg(dest));
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));
73 printf(
"Backup created: %s\n", dest_path);