Branch data Line data Source code
1 : : /* brass_btreebase.h: Btree base file implementation
2 : : *
3 : : * Copyright 1999,2000,2001 BrightStation PLC
4 : : * Copyright 2002,2004,2007,2008,2009,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_BRASS_BTREEBASE_H
23 : : #define OM_HGUARD_BRASS_BTREEBASE_H
24 : :
25 : : #include <string>
26 : :
27 : : #include <xapian/visibility.h>
28 : :
29 : : #include "brass_types.h"
30 : :
31 : : class XAPIAN_VISIBILITY_DEFAULT BrassTable_base {
32 : : public:
33 : : /** Construct an object with all zero fields. */
34 : : BrassTable_base();
35 : :
36 : : /** Copy constructor */
37 : : BrassTable_base(const BrassTable_base &other);
38 : :
39 : : /** Destructor - frees resources. */
40 : : ~BrassTable_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 : 36105 : uint4 get_revision() const { return revision; }
57 : 9262 : uint4 get_block_size() const { return block_size; }
58 : 9262 : uint4 get_root() const { return root; }
59 : 9262 : uint4 get_level() const { return level; }
60 : 3 : uint4 get_bit_map_size() const { return bit_map_size; }
61 : 9262 : brass_tablesize_t get_item_count() const { return item_count; }
62 : 14843 : uint4 get_last_block() const { return last_block; }
63 : 9262 : bool get_have_fakeroot() const { return have_fakeroot; }
64 : 9262 : bool get_sequential() const { return sequential; }
65 : :
66 : 2873 : void set_revision(uint4 revision_) {
67 : 2873 : revision = revision_;
68 : 2873 : }
69 : 1134 : void set_block_size(uint4 block_size_) {
70 : 1134 : block_size = block_size_;
71 : 1134 : }
72 : 1739 : void set_root(uint4 root_) {
73 : 1739 : root = root_;
74 : 1739 : }
75 : 1739 : void set_level(uint4 level_) {
76 : 1739 : level = level_;
77 : 1739 : }
78 : 1739 : void set_item_count(brass_tablesize_t item_count_) {
79 : 1739 : item_count = item_count_;
80 : 1739 : }
81 : 2873 : void set_have_fakeroot(bool have_fakeroot_) {
82 : 2873 : have_fakeroot = have_fakeroot_;
83 : 2873 : }
84 : 2873 : void set_sequential(bool sequential_) {
85 : 2873 : sequential = sequential_;
86 : 2873 : }
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 BrassTable::check() */
121 : : bool is_empty() const;
122 : :
123 : : void swap(BrassTable_base &other);
124 : :
125 : : private:
126 : : /** private assignment operator - you probably want swap() instead */
127 : : void operator=(const BrassTable_base &other);
128 : :
129 : : void extend_bit_map();
130 : :
131 : : /* Decoded values from the base file follow */
132 : : uint4 revision;
133 : : uint4 block_size;
134 : : uint4 root;
135 : : uint4 level;
136 : : uint4 bit_map_size;
137 : : brass_tablesize_t item_count;
138 : : uint4 last_block;
139 : : bool have_fakeroot;
140 : : bool sequential;
141 : :
142 : : /* Data related to the bitmap */
143 : : /** byte offset into the bit map below which there
144 : : are no free blocks */
145 : : uint4 bit_map_low;
146 : :
147 : : /** the initial state of the bit map of blocks: 1 means in
148 : : use, 0 means free */
149 : : byte *bit_map0;
150 : :
151 : : /** the current state of the bit map of blocks */
152 : : byte *bit_map;
153 : : };
154 : :
155 : : #endif /* OM_HGUARD_BRASS_BTREEBASE_H */
|