polardbxengine/storage/innobase/include/fut0lst.h

184 lines
5.9 KiB
C++

/*****************************************************************************
Copyright (c) 1995, 2018, Oracle and/or its affiliates. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License, version 2.0, as published by the
Free Software Foundation.
This program is also distributed with certain software (including but not
limited to OpenSSL) that is licensed under separate terms, as designated in a
particular file or component or in included license documentation. The authors
of MySQL hereby grant you an additional permission to link the program and
your derivative works with the separately licensed software that they have
included with MySQL.
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, version 2.0,
for more details.
You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*****************************************************************************/
/** @file include/fut0lst.h
File-based list utilities
Created 11/28/1995 Heikki Tuuri
***********************************************************************/
#ifndef fut0lst_h
#define fut0lst_h
#include "univ.i"
#include "fil0fil.h"
#include "mtr0mtr.h"
/* The C 'types' of base node and list node: these should be used to
write self-documenting code. Of course, the sizeof macro cannot be
applied to these types! */
typedef byte flst_base_node_t;
typedef byte flst_node_t;
/* The physical size of a list base node in bytes */
constexpr ulint FLST_BASE_NODE_SIZE = 4 + 2 * FIL_ADDR_SIZE;
/* The physical size of a list node in bytes */
constexpr ulint FLST_NODE_SIZE = 2 * FIL_ADDR_SIZE;
/** Initializes a list base node.
@param[in] base pointer to base node
@param[in] mtr mini-transaction handle */
UNIV_INLINE
void flst_init(flst_base_node_t *base, mtr_t *mtr);
/** Adds a node as the last node in a list. */
void flst_add_last(
flst_base_node_t *base, /*!< in: pointer to base node of list */
flst_node_t *node, /*!< in: node to add */
mtr_t *mtr); /*!< in: mini-transaction handle */
/** Adds a node as the first node in a list. */
void flst_add_first(
flst_base_node_t *base, /*!< in: pointer to base node of list */
flst_node_t *node, /*!< in: node to add */
mtr_t *mtr); /*!< in: mini-transaction handle */
/** Removes a node. */
void flst_remove(
flst_base_node_t *base, /*!< in: pointer to base node of list */
flst_node_t *node2, /*!< in: node to remove */
mtr_t *mtr); /*!< in: mini-transaction handle */
/** Get the length of a list.
@param[in] base base node
@return length */
UNIV_INLINE
ulint flst_get_len(const flst_base_node_t *base);
/** Gets list first node address.
@param[in] base pointer to base node
@param[in] mtr mini-transaction handle
@return file address */
UNIV_INLINE
fil_addr_t flst_get_first(const flst_base_node_t *base, mtr_t *mtr);
/** Gets list last node address.
@param[in] base pointer to base node
@param[in] mtr mini-transaction handle
@return file address */
UNIV_INLINE
fil_addr_t flst_get_last(const flst_base_node_t *base, mtr_t *mtr);
/** Gets list next node address.
@param[in] node pointer to node
@param[in] mtr mini-transaction handle
@return file address */
UNIV_INLINE
fil_addr_t flst_get_next_addr(const flst_node_t *node, mtr_t *mtr);
/** Gets list prev node address.
@param[in] node pointer to node
@param[in] mtr mini-transaction handle
@return file address */
UNIV_INLINE
fil_addr_t flst_get_prev_addr(const flst_node_t *node, mtr_t *mtr);
/** Writes a file address.
@param[in] faddr pointer to file faddress
@param[in] addr file address
@param[in] mtr mini-transaction handle */
UNIV_INLINE
void flst_write_addr(fil_faddr_t *faddr, fil_addr_t addr, mtr_t *mtr);
/** Reads a file address.
@param[in] faddr pointer to file faddress
@param[in] mtr mini-transaction handle
@return file address */
UNIV_INLINE
fil_addr_t flst_read_addr(const fil_faddr_t *faddr, mtr_t *mtr);
/** Validates a file-based list.
@return true if ok */
ibool flst_validate(
const flst_base_node_t *base, /*!< in: pointer to base node of list */
mtr_t *mtr1); /*!< in: mtr */
/** Inserts a node after another in a list.
@param[in] base pointer to base node of list
@param[in] node1 node to insert after
@param[in] node2 node to add
@param[in] mtr mini-transaction handle. */
void flst_insert_after(flst_base_node_t *base, flst_node_t *node1,
flst_node_t *node2, mtr_t *mtr);
/** Inserts a node before another in a list.
@param[in] base pointer to base node of list
@param[in] node2 node to insert
@param[in] node3 node to insert before
@param[in] mtr mini-transaction handle. */
void flst_insert_before(flst_base_node_t *base, flst_node_t *node2,
flst_node_t *node3, mtr_t *mtr);
#include "fut0lst.ic"
/** In-memory representation of flst_base_node_t */
struct flst_bnode_t {
ulint len;
fil_addr_t first;
fil_addr_t last;
flst_bnode_t() : len(0) {}
flst_bnode_t(const flst_base_node_t *base, mtr_t *mtr)
: len(flst_get_len(base)),
first(flst_get_first(base, mtr)),
last(flst_get_last(base, mtr)) {}
void set(const flst_base_node_t *base, mtr_t *mtr) {
len = flst_get_len(base);
first = flst_get_first(base, mtr);
last = flst_get_last(base, mtr);
}
void reset() {
len = 0;
first = fil_addr_null;
last = fil_addr_null;
}
std::ostream &print(std::ostream &out) const {
out << "[flst_base_node_t: len=" << len << ", first=" << first
<< ", last=" << last << "]";
return (out);
}
};
inline std::ostream &operator<<(std::ostream &out, const flst_bnode_t &obj) {
return (obj.print(out));
}
#endif /* fut0lst_h */