/***************************************************************************** Copyright (c) 2015, MariaDB Corporation. 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; version 2 of the License. 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA *****************************************************************************/ /**************************************************//** @file include/fil0fil.ic The low-level file system support functions Created 31/03/2015 Jan Lindström *******************************************************/ #ifndef fil0fil_ic #define fil0fil_ic /*******************************************************************//** Return space name */ UNIV_INLINE char* fil_space_name( /*===========*/ fil_space_t* space) /*!< in: space */ { return (space->name); } /*******************************************************************//** Return space flags */ UNIV_INLINE ulint fil_space_flags( /*===========*/ fil_space_t* space) /*!< in: space */ { return (space->flags); } /*******************************************************************//** Return page type name */ UNIV_INLINE const char* fil_get_page_type_name( /*===================*/ ulint page_type) /*!< in: FIL_PAGE_TYPE */ { switch(page_type) { case FIL_PAGE_PAGE_COMPRESSED: return (const char*)"PAGE_COMPRESSED"; case FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED: return (const char*)"PAGE_COMPRESSED_ENCRYPTED"; case FIL_PAGE_INDEX: return (const char*)"INDEX"; case FIL_PAGE_UNDO_LOG: return (const char*)"UNDO LOG"; case FIL_PAGE_INODE: return (const char*)"INODE"; case FIL_PAGE_IBUF_FREE_LIST: return (const char*)"IBUF_FREE_LIST"; case FIL_PAGE_TYPE_ALLOCATED: return (const char*)"ALLOCATED"; case FIL_PAGE_IBUF_BITMAP: return (const char*)"IBUF_BITMAP"; case FIL_PAGE_TYPE_SYS: return (const char*)"SYS"; case FIL_PAGE_TYPE_TRX_SYS: return (const char*)"TRX_SYS"; case FIL_PAGE_TYPE_FSP_HDR: return (const char*)"FSP_HDR"; case FIL_PAGE_TYPE_XDES: return (const char*)"XDES"; case FIL_PAGE_TYPE_BLOB: return (const char*)"BLOB"; case FIL_PAGE_TYPE_ZBLOB: return (const char*)"ZBLOB"; case FIL_PAGE_TYPE_ZBLOB2: return (const char*)"ZBLOB2"; case FIL_PAGE_TYPE_COMPRESSED: return (const char*)"ORACLE PAGE COMPRESSED"; /* No default to make compiler generate warning if new page type is added but not handled here. */ } return (const char*)"PAGE TYPE CORRUPTED"; } /****************************************************************//** Get block size from fil node @return block size*/ UNIV_INLINE ulint fil_node_get_block_size( /*====================*/ fil_node_t* node) /*!< in: Node where to get block size */ { return (node->file_block_size); } /****************************************************************//** Validate page type. @return true if valid, false if not */ UNIV_INLINE bool fil_page_type_validate( const byte* page) /*!< in: page */ { #ifdef UNIV_DEBUG ulint page_type = mach_read_from_2(page + FIL_PAGE_TYPE); /* Validate page type */ if (!((page_type == FIL_PAGE_PAGE_COMPRESSED || page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED || page_type == FIL_PAGE_INDEX || page_type == FIL_PAGE_UNDO_LOG || page_type == FIL_PAGE_INODE || page_type == FIL_PAGE_IBUF_FREE_LIST || page_type == FIL_PAGE_TYPE_ALLOCATED || page_type == FIL_PAGE_IBUF_BITMAP || page_type == FIL_PAGE_TYPE_SYS || page_type == FIL_PAGE_TYPE_TRX_SYS || page_type == FIL_PAGE_TYPE_FSP_HDR || page_type == FIL_PAGE_TYPE_XDES || page_type == FIL_PAGE_TYPE_BLOB || page_type == FIL_PAGE_TYPE_ZBLOB || page_type == FIL_PAGE_TYPE_ZBLOB2 || page_type == FIL_PAGE_TYPE_COMPRESSED))) { uint key_version = mach_read_from_4(page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION); bool page_compressed = (page_type == FIL_PAGE_PAGE_COMPRESSED); bool page_compressed_encrypted = (page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED); ulint space = mach_read_from_4(page + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); ulint offset = mach_read_from_4(page + FIL_PAGE_OFFSET); ib_uint64_t lsn = mach_read_from_8(page + FIL_PAGE_LSN); ulint compressed_len = mach_read_from_2(page + FIL_PAGE_DATA); fil_system_enter(); fil_space_t* rspace = fil_space_get_by_id(space); fil_system_exit(); /* Dump out the page info */ fprintf(stderr, "InnoDB: Space %lu offset %lu name %s page_type %lu page_type_name %s\n" "InnoDB: key_version %u page_compressed %d page_compressed_encrypted %d lsn %llu compressed_len %lu\n", space, offset, rspace->name, page_type, fil_get_page_type_name(page_type), key_version, page_compressed, page_compressed_encrypted, (ulonglong)lsn, compressed_len); fflush(stderr); ut_ad(page_type == FIL_PAGE_PAGE_COMPRESSED || page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED || page_type == FIL_PAGE_INDEX || page_type == FIL_PAGE_UNDO_LOG || page_type == FIL_PAGE_INODE || page_type == FIL_PAGE_IBUF_FREE_LIST || page_type == FIL_PAGE_TYPE_ALLOCATED || page_type == FIL_PAGE_IBUF_BITMAP || page_type == FIL_PAGE_TYPE_SYS || page_type == FIL_PAGE_TYPE_TRX_SYS || page_type == FIL_PAGE_TYPE_FSP_HDR || page_type == FIL_PAGE_TYPE_XDES || page_type == FIL_PAGE_TYPE_BLOB || page_type == FIL_PAGE_TYPE_ZBLOB || page_type == FIL_PAGE_TYPE_ZBLOB2 || page_type == FIL_PAGE_TYPE_COMPRESSED); return false; } #endif /* UNIV_DEBUG */ return true; } #endif /* fil0fil_ic */