Branch data Line data Source code
1 : : /* flint_btreebase.h: Btree base file implementation
2 : : *
3 : : * Copyright 1999,2000,2001 BrightStation PLC
4 : : * Copyright 2002,2004,2007,2008,2011 Olly Betts
5 : : *
6 : : * This program is free software; you can redistribute it and/or
7 : : * modify it under the terms of the GNU General Public License as
8 : : * published by the Free Software Foundation; either version 2 of the
9 : : * License, or (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
19 : : * USA
20 : : */
21 : :
22 : : #ifndef OM_HGUARD_FLINT_BTREEBASE_H
23 : : #define OM_HGUARD_FLINT_BTREEBASE_H
24 : :
25 : : #include <string>
26 : :
27 : : #include <xapian/visibility.h>
28 : :
29 : : #include "flint_types.h"
30 : :
31 : : class XAPIAN_VISIBILITY_DEFAULT FlintTable_base {
32 : : public:
33 : : /** Construct an object with all zero fields. */
34 : : FlintTable_base();
35 : :
36 : : /** Copy constructor */
37 : : FlintTable_base(const FlintTable_base &other);
38 : :
39 : : /** Destructor - frees resources. */
40 : : ~FlintTable_base();
41 : :
42 : : /** Read values from a base file.
43 : : *
44 : : * @param name The base of the filename
45 : : * @param ch The suffix
46 : : * @param read_bitmap True if we should read the bitmap
47 : : * @param err_msg An error string which will be appended
48 : : * to for some errors instead of throwing
49 : : * an exception.
50 : : *
51 : : * @return true if the read succeeded, or false otherwise.
52 : : */
53 : : bool read(const std::string &name, char ch, bool read_bitmap,
54 : : std::string &err_msg);
55 : :
56 : 42621 : uint4 get_revision() const { return revision; }
57 : 11056 : uint4 get_block_size() const { return block_size; }
58 : 11056 : uint4 get_root() const { return root; }
59 : 11056 : uint4 get_level() const { return level; }
60 : 4 : uint4 get_bit_map_size() const { return bit_map_size; }
61 : 11056 : uint4 get_item_count() const { return item_count; }
62 : 102449 : uint4 get_last_block() const { return last_block; }
63 : 11056 : bool get_have_fakeroot() const { return have_fakeroot; }
64 : 11056 : bool get_sequential() const { return sequential; }
65 : :
66 : 3526 : void set_revision(uint4 revision_) {
67 : 3526 : revision = revision_;
68 : 3526 : }
69 : 1393 : void set_block_size(uint4 block_size_) {
70 : 1393 : block_size = block_size_;
71 : 1393 : }
72 : 2133 : void set_root(uint4 root_) {
73 : 2133 : root = root_;
74 : 2133 : }
75 : 2133 : void set_level(uint4 level_) {
76 : 2133 : level = level_;
77 : 2133 : }
78 : 2133 : void set_item_count(uint4 item_count_) {
79 : 2133 : item_count = item_count_;
80 : 2133 : }
81 : 3526 : void set_have_fakeroot(bool have_fakeroot_) {
82 : 3526 : have_fakeroot = have_fakeroot_;
83 : 3526 : }
84 : 3526 : void set_sequential(bool sequential_) {
85 : 3526 : sequential = sequential_;
86 : 3526 : }
87 : :
88 : : /** Write the btree base file to disk. */
89 : : void write_to_file(const std::string &filename,
90 : : char base_letter,
91 : : const std::string &tablename,
92 : : int changes_fd,
93 : : const std::string * changes_tail);
94 : :
95 : : /* Methods dealing with the bitmap */
96 : : /** true iff block n was free at the start of the transaction on
97 : : * the B-tree.
98 : : */
99 : : bool block_free_at_start(uint4 n) const;
100 : :
101 : : void free_block(uint4 n);
102 : :
103 : : uint4 next_free_block();
104 : :
105 : : /** Find the first changed block at or after position *n.
106 : : *
107 : : * Returns true if such a block was found, or false otherwise.
108 : : */
109 : : bool find_changed_block(uint4 * n);
110 : :
111 : : bool block_free_now(uint4 n);
112 : :
113 : : void calculate_last_block();
114 : :
115 : : /* Only used with fake root blocks */
116 : : void clear_bit_map();
117 : :
118 : : void commit();
119 : :
120 : : /* Used by FlintTable::check() */
121 : : bool is_empty() const;
122 : :
123 : : void swap(FlintTable_base &other);
124 : :
125 : : private:
126 : : /** private assignment operator - you probably want swap() instead */
127 : : void operator=(const FlintTable_base &other);
128 : :
129 : : void extend_bit_map();
130 : :
131 : : /** Do most of the error handling from F_unpack_uint() */
132 : : bool do_unpack_uint(const char **start, const char *end,
133 : : uint4 *dest, std::string &err_msg,
134 : : const std::string &basename,
135 : : const char *varname);
136 : :
137 : : /* Decoded values from the base file follow */
138 : : uint4 revision;
139 : : uint4 block_size;
140 : : uint4 root;
141 : : uint4 level;
142 : : uint4 bit_map_size;
143 : : uint4 item_count;
144 : : uint4 last_block;
145 : : bool have_fakeroot;
146 : : bool sequential;
147 : :
148 : : /* Data related to the bitmap */
149 : : /** byte offset into the bit map below which there
150 : : are no free blocks */
151 : : uint4 bit_map_low;
152 : :
153 : : /** the initial state of the bit map of blocks: 1 means in
154 : : use, 0 means free */
155 : : byte *bit_map0;
156 : :
157 : : /** the current state of the bit map of blocks */
158 : : byte *bit_map;
159 : : };
160 : :
161 : : #endif /* OM_HGUARD_FLINT_BTREEBASE_H */
|