LCOV - code coverage report
Current view: top level - backends/honey - honey_cursor.h (source / functions) Hit Total Coverage
Test: Test Coverage for xapian-core 954b5873a738 Lines: 26 26 100.0 %
Date: 2019-06-30 05:20:33 Functions: 9 9 100.0 %
Branches: 12 22 54.5 %

           Branch data     Line data    Source code
       1                 :            : /** @file honey_cursor.h
       2                 :            :  * @brief HoneyCursor class
       3                 :            :  */
       4                 :            : /* Copyright (C) 2017,2018 Olly Betts
       5                 :            :  *
       6                 :            :  * This program is free software; you can redistribute it and/or modify
       7                 :            :  * it under the terms of the GNU General Public License as published by
       8                 :            :  * the Free Software Foundation; either version 2 of the License, or
       9                 :            :  * (at your option) any later version.
      10                 :            :  *
      11                 :            :  * This program is distributed in the hope that it will be useful,
      12                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      13                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14                 :            :  * GNU General Public License for more details.
      15                 :            :  *
      16                 :            :  * You should have received a copy of the GNU General Public License
      17                 :            :  * along with this program; if not, write to the Free Software
      18                 :            :  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
      19                 :            :  */
      20                 :            : 
      21                 :            : #ifndef XAPIAN_INCLUDED_HONEY_CURSOR_H
      22                 :            : #define XAPIAN_INCLUDED_HONEY_CURSOR_H
      23                 :            : 
      24                 :            : #include "honey_table.h"
      25                 :            : 
      26                 :     110326 : class HoneyCursor {
      27                 :            :     /** Search for @a key.
      28                 :            :      *
      29                 :            :      *  If @a key isn't present, the behaviour depends on @a greater_than.
      30                 :            :      *  If it's true, then the cursor will be left on the first key >
      31                 :            :      *  @a key; otherwise it may be left at an unspecified position.
      32                 :            :      */
      33                 :            :     bool do_find(const std::string& key, bool greater_than);
      34                 :            : 
      35                 :            :     bool do_next();
      36                 :            : 
      37                 :            :     /** Handle the value part of the (key,value). */
      38                 :            :     bool next_from_index();
      39                 :            : 
      40                 :            :     BufferedFile store;
      41                 :            : 
      42                 :            :   public:
      43                 :            :     std::string current_key, current_tag;
      44                 :            :     mutable size_t val_size = 0;
      45                 :            :     bool current_compressed = false;
      46                 :            :     mutable CompressionStream comp_stream;
      47                 :            :     bool is_at_end = false;
      48                 :            :     mutable std::string last_key;
      49                 :            : 
      50                 :            :     // File offset to start of index.
      51                 :            :     off_t root;
      52                 :            : 
      53                 :            :     // File offset to start of table (zero except for single-file DB).
      54                 :            :     off_t offset;
      55                 :            : 
      56                 :            :     // Forward to next constructor form.
      57                 :      30824 :     explicit HoneyCursor(const HoneyTable* table)
      58                 :            :         : store(table->store),
      59                 :            :           comp_stream(Z_DEFAULT_STRATEGY),
      60                 :      30824 :           root(table->get_root()),
      61 [ +  - ][ +  - ]:      61648 :           offset(table->get_offset())
                 [ +  - ]
      62                 :            :     {
      63         [ +  - ]:      30824 :         store.set_pos(offset); // FIXME root
      64                 :      30824 :     }
      65                 :            : 
      66                 :      24341 :     HoneyCursor(const HoneyCursor& o)
      67                 :            :         : store(o.store),
      68                 :            :           current_key(o.current_key),
      69                 :            :           current_tag(o.current_tag), // FIXME really copy?
      70                 :            :           val_size(o.val_size),
      71                 :            :           current_compressed(o.current_compressed),
      72                 :            :           comp_stream(Z_DEFAULT_STRATEGY),
      73                 :            :           is_at_end(o.is_at_end),
      74                 :            :           last_key(o.last_key),
      75                 :            :           root(o.root),
      76 [ +  - ][ +  - ]:      24341 :           offset(o.offset)
                 [ +  - ]
      77                 :            :     {
      78         [ +  - ]:      24341 :         store.set_pos(o.store.get_pos());
      79                 :      24341 :     }
      80                 :            : 
      81                 :            :     /** Position cursor on the dummy empty key.
      82                 :            :      *
      83                 :            :      *  Calling next() after this moves the cursor to the first entry.
      84                 :            :      */
      85                 :         77 :     void rewind() {
      86                 :         77 :         store.set_pos(offset); // FIXME root
      87 [ +  - ][ +  - ]:         77 :         current_key = last_key = std::string();
      88                 :         77 :         is_at_end = false;
      89                 :         77 :         val_size = 0;
      90                 :         77 :     }
      91                 :            : 
      92                 :          5 :     void to_end() { is_at_end = true; }
      93                 :            : 
      94                 :      11830 :     bool after_end() const { return is_at_end; }
      95                 :            : 
      96                 :      14358 :     bool next() {
      97         [ +  + ]:      14358 :         if (store.was_forced_closed()) {
      98                 :          1 :             HoneyTable::throw_database_closed();
      99                 :            :         }
     100                 :            : 
     101                 :      14357 :         return do_next();
     102                 :            :     }
     103                 :            : 
     104                 :            :     bool read_tag(bool keep_compressed = false);
     105                 :            : 
     106                 :      52108 :     bool find_exact(const std::string& key) {
     107                 :      52108 :         return do_find(key, false);
     108                 :            :     }
     109                 :            : 
     110                 :      41003 :     bool find_entry_ge(const std::string& key) {
     111                 :      41003 :         return do_find(key, true);
     112                 :            :     }
     113                 :            : 
     114                 :            :     /** Move to the item before the current one.
     115                 :            :      *
     116                 :            :      *  If the cursor is after_end(), this moves to the last item.
     117                 :            :      *
     118                 :            :      *  If the cursor is at the start of the table (on the empty key), do
     119                 :            :      *  nothing and return false, otherwise return true.
     120                 :            :      *
     121                 :            :      *  This method may not be particularly efficient.
     122                 :            :      */
     123                 :            :     bool prev();
     124                 :            : };
     125                 :            : 
     126                 :            : class MutableHoneyCursor : public HoneyCursor {
     127                 :            :     HoneyTable* table;
     128                 :            : 
     129                 :            :   public:
     130                 :            :     MutableHoneyCursor(HoneyTable* table_)
     131                 :            :         : HoneyCursor(table_),
     132                 :            :           table(table_)
     133                 :            :     { }
     134                 :            : 
     135                 :            :     bool del() {
     136                 :            :         Assert(!is_at_end);
     137                 :            :         std::string key_to_del = current_key;
     138                 :            :         bool res = next();
     139                 :            :         table->del(key_to_del);
     140                 :            :         return res;
     141                 :            :     }
     142                 :            : };
     143                 :            : 
     144                 :            : #endif // XAPIAN_INCLUDED_HONEY_CURSOR_H

Generated by: LCOV version 1.11