]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
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 3f3780519ab0ddddcba6ff876ead15324b9951ec..78d8571fbaf1902b05054a3c15954795de79f858 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 f54aa87ccbc3c2ad0a3ab44b054f22a6560aaa85..2fdefa70c1830ac28f5787361ad2d1f965327926 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 3d22e242ef94ab21b17487b345d636a01dabb3d9..6ac6a3a7e56b015d9e0ebc3818f2d9a104703b53 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 707c6c6254b88a359a5297c469a1f3105528e5bc..b3daf5c35744c5727ab8a8f52f127b83c1454073 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: