/** @file * @brief Compact a database, or merge and compact several. */ /* Copyright (C) 2003-2026 Olly Betts * Copyright (C) 2008 Lemur Consulting Ltd * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see * . */ #ifndef XAPIAN_INCLUDED_COMPACTOR_H #define XAPIAN_INCLUDED_COMPACTOR_H #if !defined XAPIAN_IN_XAPIAN_H && !defined XAPIAN_LIB_BUILD # error Never use directly; include instead. #endif #include #include #include namespace Xapian { class Database; /** Compact a database, or merge and compact several. */ class XAPIAN_VISIBILITY_DEFAULT Compactor { public: /** Compaction level. */ typedef enum { /** Don't split items unnecessarily. */ STANDARD = 0, /** Split items whenever it saves space (the default). */ FULL = 1, /** Allow oversize items to save more space (not recommended if you * ever plan to update the compacted database). * * @since 1.4.31 Has the same effect as FULL. */ FULLER = 2 } compaction_level; Compactor() {} virtual ~Compactor(); /** Update progress. * * Subclass this method if you want to get progress updates during * compaction. This is called for each table first with empty status, * And then one or more times with non-empty status. * * The default implementation does nothing. * * @param table The table currently being compacted. * @param status A status message. */ virtual void set_status(const std::string & table, const std::string & status); /** Resolve multiple user metadata entries with the same key. * * When merging, if the same user metadata key is set in more than one * input, then this method is called to allow this to be resolving in * an appropriate way. * * The default implementation just returns tags[0]. * * For multipass this will currently get called multiple times for the * same key if there are duplicates to resolve in each pass, but this * may change in the future. * * Since 1.4.6, an implementation of this method can return an empty * string to indicate that the appropriate result is to not set a value * for this user metadata key in the output database. In older versions, * you should not return an empty string. * * @param key The metadata key with duplicate entries. * @param num_tags How many tags there are. * @param tags An array of num_tags strings containing the tags to * merge. */ virtual std::string resolve_duplicate_metadata(const std::string & key, size_t num_tags, const std::string tags[]); }; } #endif /* XAPIAN_INCLUDED_COMPACTOR_H */