Esempio n. 1
0
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);
	}
Esempio n. 2
0
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;
}