mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 10:14:19 +01:00
f094eff1d9
pointed data. I ran gcc -Wcast-qual on storage/maria, this identified un-needed casts, a couple of functions which said they had a const parameter though they changed the pointed content! This is fixed here. Some suspicious places receive a comment. The original intention of running -Wcast-qual was to find what code changes R-tree keys: I added const words, but hidden casts like those of int2store (casts target to (uint16*)) removed const checking; -Wcast-qual helped find those hidden casts. Log handler does not change the content pointed by LEX_STRING::str it receives, so we now use a struct which has a const inside, to emphasize this and be able to pass "const uchar*" buffers to log handler without fear of their content being changed by it. One-line fix for a merge glitch (when merging from MyISAM). include/m_string.h: As Maria's log handler uses LEX_STRING but never changes the content pointed by LEX_STRING::str, and assigns uchar* into this member most of the time, we introduce a new struct LEX_CUSTRING (C const U unsigned) for the log handler. include/my_global.h: In macros which read pointed content: use const pointers so that gcc -Wcast-qual does not warn about casting a const pointer to non-const. include/my_handler.h: In macros which read pointed content: use const pointers so that gcc -Wcast-qual does not warn about casting a const pointer to non-const. ha_find_null() does not change *a. include/my_sys.h: insert_dynamic() does not change *element. include/myisampack.h: In macros which read pointed content: use const pointers so that gcc -Wcast-qual does not warn about casting a const pointer to non-const. mysys/array.c: insert_dynamic() does not change *element mysys/my_handler.c: ha_find_null() does not change *a storage/maria/ma_bitmap.c: Log handler receives const strings now storage/maria/ma_blockrec.c: Log handler receives const strings now. _ma_apply_undo_row_delete/update() do change *header. storage/maria/ma_blockrec.h: correct prototype storage/maria/ma_check.c: Log handler receives const strings now. Un-needed casts storage/maria/ma_checkpoint.c: Log handler receives const strings now storage/maria/ma_checksum.c: unneeded cast storage/maria/ma_commit.c: Log handler receives const strings now storage/maria/ma_create.c: Log handler receives const strings now storage/maria/ma_dbug.c: fixing warning of gcc -Wcast-qual storage/maria/ma_delete.c: Log handler receives const strings now storage/maria/ma_delete_all.c: Log handler receives const strings now storage/maria/ma_delete_table.c: Log handler receives const strings now storage/maria/ma_dynrec.c: fixing some warnings of gcc -Wcast-qual. Unneeded casts removed. Comment about function which lies. storage/maria/ma_ft_parser.c: fix for warnings of gcc -Wcast-qual, removing unneeded casts storage/maria/ma_ft_update.c: less casts, comment storage/maria/ma_key.c: less casts, stay const (warnings of gcc -Wcast-qual) storage/maria/ma_key_recover.c: Log handler receives const strings now storage/maria/ma_loghandler.c: Log handler receives const strings now storage/maria/ma_loghandler.h: Log handler receives const strings now storage/maria/ma_loghandler_lsn.h: In macros which read pointed content: use const pointers so that gcc -Wcast-qual does not warn about casting a const pointer to non-const. storage/maria/ma_page.c: Log handler receives const strings now; more const storage/maria/ma_recovery.c: Log handler receives const strings now storage/maria/ma_rename.c: Log handler receives const strings now storage/maria/ma_rt_index.c: more const, to emphasize that functions don't change pointed content. best_key= NULL was forgotten during merge from MyISAM a few days ago, was causing a Valgrind warning storage/maria/ma_rt_index.h: new proto storage/maria/ma_rt_key.c: more const storage/maria/ma_rt_key.h: new proto storage/maria/ma_rt_mbr.c: more const for functions which deserve it storage/maria/ma_rt_mbr.h: new prototype storage/maria/ma_rt_split.c: make const what is not changed. storage/maria/ma_search.c: un-needed casts, more const storage/maria/ma_sp_key.c: more const storage/maria/ma_unique.c: un-needed casts. storage/maria/ma_write.c: Log handler receives const strings now storage/maria/maria_def.h: some more const storage/maria/unittest/ma_test_loghandler-t.c: Log handler receives const strings now storage/maria/unittest/ma_test_loghandler_first_lsn-t.c: Log handler receives const strings now storage/maria/unittest/ma_test_loghandler_max_lsn-t.c: Log handler receives const strings now storage/maria/unittest/ma_test_loghandler_multigroup-t.c: Log handler receives const strings now storage/maria/unittest/ma_test_loghandler_multithread-t.c: Log handler receives const strings now storage/maria/unittest/ma_test_loghandler_noflush-t.c: Log handler receives const strings now storage/maria/unittest/ma_test_loghandler_nologs-t.c: Log handler receives const strings now storage/maria/unittest/ma_test_loghandler_pagecache-t.c: Log handler receives const strings now storage/maria/unittest/ma_test_loghandler_purge-t.c: Log handler receives const strings now
105 lines
3.3 KiB
C
105 lines
3.3 KiB
C
/* Copyright (C) 2007 MySQL AB & Sanja Belkin
|
|
|
|
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
#ifndef _ma_loghandler_lsn_h
|
|
#define _ma_loghandler_lsn_h
|
|
|
|
/*
|
|
Transaction log record address:
|
|
file_no << 32 | offset
|
|
file_no is only 3 bytes so we can use signed integer to make
|
|
comparison simpler.
|
|
*/
|
|
typedef int64 TRANSLOG_ADDRESS;
|
|
|
|
/*
|
|
Compare addresses
|
|
A1 > A2 -> result > 0
|
|
A1 == A2 -> 0
|
|
A1 < A2 -> result < 0
|
|
*/
|
|
#define cmp_translog_addr(A1,A2) ((A1) - (A2))
|
|
|
|
/*
|
|
TRANSLOG_ADDRESS is just address of some byte in the log (usually some
|
|
chunk)
|
|
LSN used where address of some record in the log needed (not just any
|
|
address)
|
|
*/
|
|
typedef TRANSLOG_ADDRESS LSN;
|
|
|
|
/* Gets file number part of a LSN/log address */
|
|
#define LSN_FILE_NO(L) (uint32) ((L) >> 32)
|
|
|
|
/* Gets raw file number part of a LSN/log address */
|
|
#define LSN_FILE_NO_PART(L) ((L) & ((int64)0xFFFFFF00000000LL))
|
|
|
|
/* Parts of LSN for printing */
|
|
#define LSN_IN_PARTS(L) (ulong)LSN_FILE_NO(L),(ulong)LSN_OFFSET(L)
|
|
|
|
/* Gets record offset of a LSN/log address */
|
|
#define LSN_OFFSET(L) (ulong) ((L) & 0xFFFFFFFFL)
|
|
|
|
/* Makes lsn/log address from file number and record offset */
|
|
#define MAKE_LSN(F,S) ((LSN) ((((uint64)(F)) << 32) | (S)))
|
|
|
|
/* checks LSN */
|
|
#define LSN_VALID(L) \
|
|
((LSN_FILE_NO_PART(L) != FILENO_IMPOSSIBLE) && \
|
|
(LSN_OFFSET(L) != LOG_OFFSET_IMPOSSIBLE))
|
|
|
|
/* size of stored LSN on a disk, don't change it! */
|
|
#define LSN_STORE_SIZE 7
|
|
|
|
/* Puts LSN into buffer (dst) */
|
|
#define lsn_store(dst, lsn) \
|
|
do { \
|
|
int3store((dst), LSN_FILE_NO(lsn)); \
|
|
int4store((char*)(dst) + 3, LSN_OFFSET(lsn)); \
|
|
} while (0)
|
|
|
|
/* Unpacks LSN from the buffer (P) */
|
|
#define lsn_korr(P) MAKE_LSN(uint3korr(P), uint4korr((const char*)(P) + 3))
|
|
|
|
/* what we need to add to LSN to increase it on one file */
|
|
#define LSN_ONE_FILE ((int64)0x100000000LL)
|
|
|
|
#define LSN_REPLACE_OFFSET(L, S) (LSN_FILE_NO_PART(L) | (S))
|
|
|
|
/*
|
|
an 8-byte type whose most significant uchar is used for "flags"; 7
|
|
other bytes are a LSN.
|
|
*/
|
|
typedef LSN LSN_WITH_FLAGS;
|
|
#define LSN_WITH_FLAGS_TO_LSN(x) (x & ULL(0x00FFFFFFFFFFFFFF))
|
|
#define LSN_WITH_FLAGS_TO_FLAGS(x) (x & ULL(0xFF00000000000000))
|
|
|
|
#define FILENO_IMPOSSIBLE 0 /**< log file's numbering starts at 1 */
|
|
#define LOG_OFFSET_IMPOSSIBLE 0 /**< log always has a header */
|
|
#define LSN_IMPOSSIBLE ((LSN)0)
|
|
/* following LSN also is impossible */
|
|
#define LSN_ERROR ((LSN)1)
|
|
|
|
/** @brief some impossible LSN serve as markers */
|
|
#define LSN_REPAIRED_BY_MARIA_CHK ((LSN)2)
|
|
|
|
/**
|
|
@brief the maximum valid LSN.
|
|
Unlike ULONGLONG_MAX, it can be safely used in comparison with valid LSNs
|
|
(ULONGLONG_MAX is too big for correctness of cmp_translog_addr()).
|
|
*/
|
|
#define LSN_MAX (LSN)ULL(0x00FFFFFFFFFFFFFF)
|
|
|
|
#endif
|