void directory_prune_empty(struct directory *directory) { assert(holding_db_lock()); struct directory *child, *n; directory_for_each_child_safe(child, n, directory) { directory_prune_empty(child); if (directory_is_empty(child)) directory_delete(child); }
void directory_prune_empty(struct directory *directory) { int i; struct dirvec *dv = &directory->children; for (i = dv->nr; --i >= 0; ) { struct directory *child = dv->base[i]; directory_prune_empty(child); if (directory_is_empty(child)) { dirvec_delete(dv, child); directory_free(child); } } if (!dv->nr) dirvec_destroy(dv); }
bool simple_db_save(struct db *_db, GError **error_r) { struct simple_db *db = (struct simple_db *)_db; struct directory *music_root = db->root; g_debug("removing empty directories from DB"); directory_prune_empty(music_root); g_debug("sorting DB"); directory_sort(music_root); g_debug("writing DB"); FILE *fp = fopen(db->path, "w"); if (!fp) { g_set_error(error_r, simple_db_quark(), errno, "unable to write to db file \"%s\": %s", db->path, g_strerror(errno)); return false; } db_save_internal(fp, music_root); if (ferror(fp)) { g_set_error(error_r, simple_db_quark(), errno, "Failed to write to database file: %s", g_strerror(errno)); fclose(fp); return false; } fclose(fp); struct stat st; if (stat(db->path, &st) == 0) db->mtime = st.st_mtime; return true; }