bug-recutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 1/2] librec: Abstract iteration over selected records in query.


From: Liliana Marie Prikler
Subject: [PATCH 1/2] librec: Abstract iteration over selected records in query.
Date: Wed, 2 Feb 2022 16:31:55 +0100

---
 src/rec-db.c | 45 +++++++++++++++++++++++++++++++--------------
 1 file changed, 31 insertions(+), 14 deletions(-)

diff --git a/src/rec-db.c b/src/rec-db.c
index 4c42b65..b303132 100644
--- a/src/rec-db.c
+++ b/src/rec-db.c
@@ -590,6 +590,29 @@ rec_db_record_selected_p (size_t num_record,
   return true;
 }
 
+static rec_record_t
+rec_db_next_selected_record (rec_mset_iterator_t *iter,
+                             size_t *iter_pos,
+                             size_t *index,
+                             rec_sex_t sex,
+                             const char *fast_string,
+                             bool case_insensitive_p)
+{
+  rec_record_t record = NULL;
+  while (rec_mset_iterator_next (iter, MSET_RECORD, (const void **) &record, 
NULL))
+    {
+      *iter_pos++;
+      if (rec_db_record_selected_p (*iter_pos,
+                                    record,
+                                    index,
+                                    sex,
+                                    fast_string,
+                                    case_insensitive_p))
+        return record;
+    }
+  return NULL;
+}
+
 static rec_record_t
 rec_db_process_fex (rec_db_t db,
                     rec_rset_t rset,
@@ -1098,22 +1121,16 @@ rec_db_query (rec_db_t     db,
         return NULL;
 
       rec_mset_iterator_t iter = rec_mset_iterator (rec_rset_mset (rset));
-      while (rec_mset_iterator_next (&iter, MSET_RECORD, (const void **) 
&record, NULL))
+
+      while (/* Determine the next record to process.  */
+             record = rec_db_next_selected_record (&iter,
+                                                   &num_rec,
+                                                   index,
+                                                   sex,
+                                                   fast_string,
+                                                   flags & REC_F_ICASE))
         {
           rec_record_t res_record;
-          num_rec++;
-
-          /* Determine whether we must skip this record.  */
-
-          if (!rec_db_record_selected_p (num_rec,
-                                         record,
-                                         index,
-                                         sex,
-                                         fast_string,
-                                         flags & REC_F_ICASE))
-            continue;
-
-          /* Process this record.  */
 
           /* Transform the record through the field expression and add
              it to the result record set.  */
-- 
2.34.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]