afs: Provide generic counter for matching rows.
authorAndre Noll <maan@systemlinux.org>
Wed, 6 Jul 2011 20:30:59 +0000 (22:30 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 6 Nov 2011 11:29:13 +0000 (12:29 +0100)
Several afs commands implemented their own counters, often only to
find out whether they should print an error message because no rows
matched the given pattern(s).

This patch makes counting matching rows generic by increasing the new
pattern_match_data->num_matches counter in action_if_pattern_matches()
so that all commands which use this facility for iterating over all
audio files can evaluate the counter afterwards. This allows to remove
several per-command counters.

afs.c
afs.h
aft.c
blob.c

diff --git a/afs.c b/afs.c
index 3f37805..78d8571 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -363,7 +363,10 @@ static int action_if_pattern_matches(struct osl_row *row, void *data)
                        continue;
                if (ret)
                        return -E_FNMATCH;
-               return pmd->action(pmd->table, row, name, pmd->data);
+               ret = pmd->action(pmd->table, row, name, pmd->data);
+               if (ret >= 0)
+                       pmd->num_matches++;
+               return ret;
        }
        return 1;
 }
diff --git a/afs.h b/afs.h
index f54aa87..2fdefa7 100644 (file)
--- a/afs.h
+++ b/afs.h
@@ -181,6 +181,8 @@ struct pattern_match_data {
        struct osl_object patterns;
        /** Data pointer passed to the action function. */
        void *data;
+       /** Gets increased by one for each match. */
+       unsigned num_matches;
        /** For each matching row, this function will be called. */
        int (*action)(struct osl_table *table, struct osl_row *row, const char *name, void *data);
 };
diff --git a/aft.c b/aft.c
index 3d22e24..6ac6a3a 100644 (file)
--- a/aft.c
+++ b/aft.c
@@ -2020,8 +2020,6 @@ struct touch_action_data {
        struct com_touch_options *cto;
        /** Message buffer. */
        struct para_buffer pb;
-       /** How many audio files matched the given pattern. */
-       unsigned num_matches;
 };
 
 static int touch_audio_file(__a_unused struct osl_table *table,
@@ -2068,7 +2066,6 @@ static int touch_audio_file(__a_unused struct osl_table *table,
                if (tad->cto->amp >= 0)
                        new_afsi.amp = tad->cto->amp;
        }
-       tad->num_matches++;
        save_afsi(&new_afsi, &obj); /* in-place update */
        aced.aft_row = row;
        aced.old_afsi = &old_afsi;
@@ -2100,9 +2097,8 @@ static void com_touch_callback(int fd, const struct osl_object *query)
        ret = for_each_matching_row(&pmd);
        if (ret < 0)
                ret2 = para_printf(&tad.pb, "%s\n", para_strerror(-ret));
-       else
-               if (!tad.num_matches)
-                       ret2 = para_printf(&tad.pb, "no matches\n");
+       else if (pmd.num_matches == 0)
+               ret2 = para_printf(&tad.pb, "no matches\n");
        if (ret2 >= 0 && tad.pb.offset)
                pass_buffer_as_shm(tad.pb.buf, tad.pb.offset, &fd);
        free(tad.pb.buf);
@@ -2198,8 +2194,6 @@ struct com_rm_action_data {
        uint32_t flags;
        /** Message buffer. */
        struct para_buffer pb;
-       /** Number of audio files removed. */
-       unsigned num_removed;
 };
 
 static int remove_audio_file(__a_unused struct osl_table *table,
@@ -2217,8 +2211,6 @@ static int remove_audio_file(__a_unused struct osl_table *table,
        ret = osl(osl_del_row(audio_file_table, row));
        if (ret < 0)
                para_printf(&crd->pb, "%s: %s\n", name, para_strerror(-ret));
-       else
-               crd->num_removed++;
        return ret;
 }
 
@@ -2248,11 +2240,11 @@ static void com_rm_callback(int fd, const struct osl_object *query)
                para_printf(&crd.pb, "%s\n", para_strerror(-ret));
                return;
        }
-       if (!crd.num_removed && !(crd.flags & RM_FLAG_FORCE))
+       if ((pmd.num_matches == 0) && !(crd.flags & RM_FLAG_FORCE))
                ret = para_printf(&crd.pb, "no matches -- nothing removed\n");
-       else {
-               if (crd.flags & RM_FLAG_VERBOSE)
-                       ret = para_printf(&crd.pb, "removed %u files\n", crd.num_removed);
+       else if (crd.flags & RM_FLAG_VERBOSE) {
+               ret = para_printf(&crd.pb, "removed %u files\n",
+                       pmd.num_matches);
        }
        if (ret >= 0 && crd.pb.offset)
                pass_buffer_as_shm(crd.pb.buf, crd.pb.offset, &fd);
@@ -2321,8 +2313,6 @@ enum cpsi_flags {
 struct cpsi_action_data {
        /** command line flags (see \ref cpsi_flags). */
        unsigned flags;
-       /** Number of audio files changed. */
-       unsigned num_copied;
        /** Message buffer. */
        struct para_buffer pb;
        /** Values are copied from here. */
@@ -2354,7 +2344,6 @@ static int copy_selector_info(__a_unused struct osl_table *table,
        if (cad->flags & CPSI_FLAG_COPY_ATTRIBUTES)
                target_afsi.attributes = cad->source_afsi.attributes;
        save_afsi(&target_afsi, &target_afsi_obj); /* in-place update */
-       cad->num_copied++;
        if (cad->flags & CPSI_FLAG_VERBOSE) {
                ret = para_printf(&cad->pb, "copied afsi to %s\n", name);
                if (ret < 0)
@@ -2397,9 +2386,9 @@ out:
        if (ret < 0)
                para_printf(&cad.pb, "%s\n", para_strerror(-ret));
        else if (cad.flags & CPSI_FLAG_VERBOSE) {
-               if (cad.num_copied)
+               if (pmd.num_matches > 0)
                        para_printf(&cad.pb, "copied requested afsi from %s "
-                               "to %u files\n", source_path, cad.num_copied);
+                               "to %u files\n", source_path, pmd.num_matches);
                else
                        para_printf(&cad.pb, "nothing copied\n");
        }
diff --git a/blob.c b/blob.c
index 707c6c6..b3daf5c 100644 (file)
--- a/blob.c
+++ b/blob.c
@@ -238,8 +238,6 @@ static int com_catblob(callback_function *f, struct stream_cipher_context *scc,
 struct rmblob_data {
        /** Message buffer. */
        struct para_buffer pb;
-       /** Number of removed blobs. */
-       unsigned num_removed;
 };
 
 static int remove_blob(struct osl_table *table, struct osl_row *row,
@@ -251,7 +249,6 @@ static int remove_blob(struct osl_table *table, struct osl_row *row,
                para_printf(&rmbd->pb, "%s: %s\n", name, para_strerror(-ret));
                return ret;
        }
-       rmbd->num_removed++;
        return 1;
 }
 
@@ -260,7 +257,6 @@ static void com_rmblob_callback(struct osl_table *table, int fd,
 {
        int ret, ret2 = 0;
        struct rmblob_data rmbd = {
-               .num_removed = 0,
                .pb = {
                        .max_size = shm_get_shmmax(),
                        .private_data = &fd,
@@ -282,10 +278,10 @@ static void com_rmblob_callback(struct osl_table *table, int fd,
                if (ret2 < 0)
                        goto out;
        }
-       if (!rmbd.num_removed)
+       if (pmd.num_matches == 0)
                ret2 = para_printf(&rmbd.pb, "no matches, nothing removed\n");
        else {
-               ret2 = para_printf(&rmbd.pb, "removed %d blobs\n", rmbd.num_removed);
+               ret2 = para_printf(&rmbd.pb, "removed %d blobs\n", pmd.num_matches);
                afs_event(BLOB_RENAME, NULL, table);
        }
 out: