| 2691 | }; |
| 2692 | |
| 2693 | cbm_config_t *cbm_config_open(const char *cache_dir) { |
| 2694 | if (!cache_dir) { |
| 2695 | return NULL; |
| 2696 | } |
| 2697 | |
| 2698 | char dbpath[CLI_BUF_1K]; |
| 2699 | snprintf(dbpath, sizeof(dbpath), "%s/_config.db", cache_dir); |
| 2700 | |
| 2701 | /* Ensure directory exists */ |
| 2702 | mkdirp(cache_dir, DIR_PERMS); |
| 2703 | |
| 2704 | sqlite3 *db = NULL; |
| 2705 | if (sqlite3_open(dbpath, &db) != SQLITE_OK) { |
| 2706 | if (db) { |
| 2707 | sqlite3_close(db); |
| 2708 | } |
| 2709 | return NULL; |
| 2710 | } |
| 2711 | |
| 2712 | /* Create table if not exists */ |
| 2713 | const char *sql = "CREATE TABLE IF NOT EXISTS config (key TEXT PRIMARY KEY, value TEXT)"; |
| 2714 | char *err_msg = NULL; |
| 2715 | if (sqlite3_exec(db, sql, NULL, NULL, &err_msg) != SQLITE_OK) { |
| 2716 | sqlite3_free(err_msg); |
| 2717 | sqlite3_close(db); |
| 2718 | return NULL; |
| 2719 | } |
| 2720 | |
| 2721 | cbm_config_t *cfg = calloc(CBM_ALLOC_ONE, sizeof(*cfg)); |
| 2722 | if (!cfg) { |
| 2723 | sqlite3_close(db); |
| 2724 | return NULL; |
| 2725 | } |
| 2726 | cfg->db = db; |
| 2727 | return cfg; |
| 2728 | } |
| 2729 | |
| 2730 | void cbm_config_close(cbm_config_t *cfg) { |
| 2731 | if (!cfg) { |