bug-recutils
[Top][All Lists]
Advanced

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

Re: [bug-recutils] [PATCH 04/18] src: use specified number of records or


From: Jose E. Marchesi
Subject: Re: [bug-recutils] [PATCH 04/18] src: use specified number of records or comments in lazy rsets.
Date: Thu, 09 Aug 2012 23:23:09 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.92 (gnu/linux)

Hi Michał.

This is the patchset introducing the rec_rset_set_num_records and
rec_rset_set_num_comments and the SIZE_MAX issue that I was referring in
a previous email.  What are those facilities used for?

>From 83c90c314ca80aab64076109369572f784bfdc28 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20Mas=C5=82owski?= <address@hidden>
Date: Fri, 6 Jul 2012 16:18:55 +0200
Subject: [PATCH 04/18] src: use specified number of records or comments in
 lazy rsets.

These numbers will be stored in index files to not need to parse the
whole rset to access them.
---
 ChangeLog      |   15 +++++++++++++++
 src/rec-rset.c |   56 ++++++++++++++++++++++++++++++++++++++++++++++++++------
 src/rec.h      |   11 +++++++++++
 3 files changed, 76 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 4566ec5..0891381 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2012-07-06  Michał Masłowski  <address@hidden>
+
+       src: use specified number of records or comments in lazy rsets.
+       * src/rec-rset.c (struct rec_rset_s): New fields num_records and
+       num_comments.
+       (rec_rset_dup): Copy num_records and num_comments.
+       (rec_rset_num_elements): Use num_records and num_comments.
+       (rec_rset_num_records): Use num_records.
+       (rec_rset_num_comments): Use num_comments.
+       (rec_rset_set_num_records): New function.
+       (rec_rset_set_num_comments): Likewise.
+       (rec_rset_init): Initialize num_records and num_comments.
+       * src/rec.h: Add prototypes for rec_rset_set_num_records and
+       rec_rset_set_num_comments.
+
 2012-07-03  Michał Masłowski  <address@hidden>
 
        src: reset parser's EOF state on seek.
diff --git a/src/rec-rset.c b/src/rec-rset.c
index 75d8fad..65ec044 100644
--- a/src/rec-rset.c
+++ b/src/rec-rset.c
@@ -102,6 +102,11 @@ struct rec_rset_s
   int record_type;
   int comment_type;
   rec_mset_t mset;
+
+  /* Numbers of records and comments to use instead of the real ones
+     if these are less than SIZE_MAX.  */
+  size_t num_records;
+  size_t num_comments;
 };
 
 /* Static functions implemented below.  */
@@ -280,6 +285,8 @@ rec_rset_dup (rec_rset_t rset)
       /* XXX: make copies of the following structures.  */
       new->type_reg = NULL;
       new->field_props = NULL;
+      new->num_records = rset->num_records;
+      new->num_comments = rset->num_comments;
 
       if (rset->order_by_fields)
         {
@@ -323,9 +330,16 @@ rec_rset_mset_raw (rec_rset_t rset)
 size_t
 rec_rset_num_elems (rec_rset_t rset)
 {
-  if (!rec_rset_finish_parsing (rset))
+  if (rset->parser)
     {
-      return 0;
+      if (rset->num_records != SIZE_MAX && rset->num_comments != SIZE_MAX)
+        {
+          return rset->num_records + rset->num_comments;
+        }
+      else if (!rec_rset_finish_parsing (rset))
+        {
+          return 0;
+        }
     }
   return rec_mset_count (rset->mset, MSET_ANY);
 }
@@ -333,9 +347,16 @@ rec_rset_num_elems (rec_rset_t rset)
 size_t
 rec_rset_num_records (rec_rset_t rset)
 {
-  if (!rec_rset_finish_parsing (rset))
+  if (rset->parser)
     {
-      return 0;
+      if (rset->num_records != SIZE_MAX)
+        {
+          return rset->num_records;
+        }
+      else if (!rec_rset_finish_parsing (rset))
+        {
+          return 0;
+        }
     }
   return rec_mset_count (rset->mset, rset->record_type);
 }
@@ -343,13 +364,32 @@ rec_rset_num_records (rec_rset_t rset)
 size_t
 rec_rset_num_comments (rec_rset_t rset)
 {
-  if (!rec_rset_finish_parsing (rset))
+  if (rset->parser)
     {
-      return 0;
+      if (rset->num_comments != SIZE_MAX)
+        {
+          return rset->num_comments;
+        }
+      else if (!rec_rset_finish_parsing (rset))
+        {
+          return 0;
+        }
     }
   return rec_mset_count (rset->mset, rset->comment_type);
 }
 
+void
+rec_rset_set_num_records (rec_rset_t rset, size_t num)
+{
+  rset->num_records = num;
+}
+
+void
+rec_rset_set_num_comments (rec_rset_t rset, size_t num)
+{
+  rset->num_comments = num;
+}
+
 rec_record_t
 rec_rset_descriptor (rec_rset_t rset)
 {
@@ -966,6 +1006,10 @@ rec_rset_init (rec_rset_t rset)
      initialized with real values.  */
 
   memset (rset, 0 /* NULL */, sizeof (struct rec_rset_s));
+
+  /* Require getting the real values.  */
+  rset->num_records = SIZE_MAX;
+  rset->num_comments = SIZE_MAX;
 }
 
 static void
diff --git a/src/rec.h b/src/rec.h
index be56829..e112e87 100644
--- a/src/rec.h
+++ b/src/rec.h
@@ -1092,6 +1092,17 @@ size_t rec_rset_num_records (rec_rset_t rset);
 
 size_t rec_rset_num_comments (rec_rset_t rset);
 
+/* Set the number of records for rec_rset_num_records to return if the
+   rset will be lazily parsed.  Fully parsed or with this value set to
+   SIZE_MAX rsets will use their real size.  */
+
+void rec_rset_set_num_records (rec_rset_t rset, size_t num);
+
+/* Set the number of comments to use in lazy rsets.  Like
+   rec_rset_set_num_records.  */
+
+void rec_rset_set_num_comments (rec_rset_t rset, size_t num);
+
 /***************** Record descriptor management ******************/
 
 /* Return the record descriptor of a given record set.  NULL is
-- 
1.7.10

-- 
Jose E. Marchesi         http://www.jemarch.net
GNU Project              http://www.gnu.org



reply via email to

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