2001-02-17 14:19:19 +02:00
|
|
|
/**********************************************************************
|
|
|
|
Utilities for converting data from the database file
|
|
|
|
to the machine format.
|
|
|
|
|
|
|
|
(c) 1995 Innobase Oy
|
|
|
|
|
|
|
|
Created 11/28/1995 Heikki Tuuri
|
|
|
|
***********************************************************************/
|
|
|
|
|
|
|
|
#ifndef mach0data_h
|
|
|
|
#define mach0data_h
|
|
|
|
|
|
|
|
#include "univ.i"
|
|
|
|
#include "ut0byte.h"
|
|
|
|
|
|
|
|
/* The data and all fields are always stored in a database file
|
|
|
|
in the same format: ascii, big-endian, ... .
|
|
|
|
All data in the files MUST be accessed using the functions in this
|
|
|
|
module. */
|
|
|
|
|
|
|
|
/***********************************************************
|
|
|
|
The following function is used to store data in one byte. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
mach_write_to_1(
|
|
|
|
/*============*/
|
|
|
|
byte* b, /* in: pointer to byte where to store */
|
|
|
|
ulint n); /* in: ulint integer to be stored, >= 0, < 256 */
|
|
|
|
/************************************************************
|
|
|
|
The following function is used to fetch data from one byte. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_read_from_1(
|
|
|
|
/*=============*/
|
|
|
|
/* out: ulint integer, >= 0, < 256 */
|
|
|
|
byte* b); /* in: pointer to byte */
|
|
|
|
/***********************************************************
|
|
|
|
The following function is used to store data in two consecutive
|
|
|
|
bytes. We store the most significant byte to the lower address. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
mach_write_to_2(
|
|
|
|
/*============*/
|
|
|
|
byte* b, /* in: pointer to two bytes where to store */
|
|
|
|
ulint n); /* in: ulint integer to be stored, >= 0, < 64k */
|
|
|
|
/************************************************************
|
|
|
|
The following function is used to fetch data from two consecutive
|
|
|
|
bytes. The most significant byte is at the lowest address. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_read_from_2(
|
|
|
|
/*=============*/
|
|
|
|
/* out: ulint integer, >= 0, < 64k */
|
|
|
|
byte* b); /* in: pointer to two bytes */
|
InnoDB: Performance optimizations based on OProfile analysis
innobase/btr/btr0btr.c:
Eliminate some buf_frame_align() calls.
Make use of the page_rec_is_infimum(), page_rec_is_supremum()
and page_rec_is_user_rec() functions.
Replace some index->table->comp with page_is_comp().
Eliminate some variables to reduce register spilling on x86.
Note that page_is_comp() may return nonzero instead of TRUE.
Note that rec_offs_comp() may return nonzero instead of TRUE.
innobase/btr/btr0cur.c:
Eliminate some buf_frame_align() calls.
Replace some index->table->comp with
page_is_comp() or rec_offs_comp().
Eliminate some variables to reduce register spilling on x86.
Note that page_is_comp() may return nonzero instead of TRUE.
Note that rec_offs_comp() may return nonzero instead of TRUE.
Remove an extra mem_heap_create() call from btr_cur_update_in_place().
Add "page" parameter to lock_rec_store_on_page_infimum().
Add some UNIV_LIKELY() and UNIV_UNLIKELY() hints.
btr_estimate_number_of_different_key_vals(): Rename the
offsets_* variables to be more descriptive and eliminate one
rec_get_offsets() and one page_rec_get_next() call in the loop.
innobase/btr/btr0pcur.c:
Eliminate some buf_frame_align() calls.
Make use of the page_rec_is_infimum(), page_rec_is_supremum()
and page_rec_is_user_rec() functions.
Replace some index->table->comp with page_is_comp().
Eliminate some variables to reduce register spilling on x86.
Note that page_is_comp() may return nonzero instead of TRUE.
Make some ut_a() assertions ut_ad() ones to improve performance.
Add some UNIV_LIKELY() and UNIV_UNLIKELY() hints.
innobase/btr/btr0sea.c:
Make use of page_rec_is_infimum() and page_rec_is_supremum().
Eliminate some buf_frame_align() calls.
Add some UNIV_UNLIKELY and UNIV_LIKELY hints.
Turn some assertions into debug assertions.
innobase/dict/dict0crea.c:
Replace FALSE/TRUE ibool comp with zero/nonzero ulint comp
innobase/ibuf/ibuf0ibuf.c:
Make use of page_rec_is_infimum() and page_rec_is_supremum().
Add some UNIV_UNLIKELY and UNIV_LIKELY hints.
ibuf_get_merge_page_nos(): Rename parameter "first_rec" to "rec"
and eliminate local variable "rec".
innobase/include/btr0btr.h:
Replace FALSE/TRUE ibool comp with zero/nonzero ulint comp
innobase/include/buf0buf.h:
Rename buf_frame_get_modify_clock()
to buf_block_get_modify_clock().
innobase/include/buf0buf.ic:
Rename buf_frame_get_modify_clock()
to buf_block_get_modify_clock() and
remove the buf_block_align() call.
innobase/include/lock0lock.h:
lock_rec_store_on_page_infimum(): Add parameter "page"
innobase/include/mach0data.h:
Add mach_encode_2() and mach_decode_2().
innobase/include/mach0data.ic:
Add mach_encode_2() and mach_decode_2().
innobase/include/page0cur.h:
Add const qualifier to page_cur_is_before_first()
and page_cur_is_after_last().
innobase/include/page0cur.ic:
Make use of page_rec_is_infimum() and page_rec_is_supremum().
innobase/include/page0page.h:
Remove page_rec_is_first_user_rec() and page_rec_is_last_user_rec().
Add page_rec_is_infimum() and page_rec_is_supremum().
Replace FALSE/TRUE ibool comp with zero/nonzero ulint comp.
innobase/include/page0page.ic:
Remove page_rec_is_first_user_rec() and page_rec_is_last_user_rec().
Add page_rec_is_infimum() and page_rec_is_supremum().
Replace FALSE/TRUE ibool comp with zero/nonzero ulint comp.
Add UNIV_UNLIKELY, UNIV_LIKELY and UNIV_EXPECT hints.
Reduce the number of buf_frame_align() calls.
innobase/include/rem0rec.ic:
rec_offs_comp(): Return zero or nonzero instead of FALSE or TRUE.
innobase/include/row0mysql.h:
Replace FALSE/TRUE ibool comp with zero/nonzero ulint comp.
innobase/lock/lock0lock.c:
Replace FALSE/TRUE ibool comp with zero/nonzero ulint comp.
Remove parameter "comp" from lock_rec_get_next(),
lock_rec_has_expl() and lock_rec_other_has_expl_req().
Add parameter "page" to lock_rec_store_on_page_infimum().
Add UNIV_UNLIKELY hints.
Reduce the number of buf_frame_align() calls.
Make use of page_rec_is_infimum(), page_rec_is_supremum() and
page_rec_is_user_rec().
Move the "comp" flag outside some loops.
innobase/mtr/mtr0log.c:
Replace index->table->comp with page_rec_is_comp().
innobase/page/page0cur.c:
Replace index->table->comp with page_is_comp() or page_rec_is_comp().
Eliminate some buf_frame_align() calls.
Add some debug assertions.
innobase/page/page0page.c:
Optimize page_dir_find_owner_slot(). Compare the record offset
16 bits at a time, because that seems to be the only way to avoid
register spilling on x86.
Replace FALSE/TRUE ibool comp with zero/nonzero ulint comp.
Remove parameter "page" of page_delete_rec_list_write_log().
Make use of page_rec_is_infimum().
innobase/rem/rem0cmp.c:
Replace FALSE/TRUE ibool comp with zero/nonzero ulint comp.
innobase/row/row0ins.c:
Make use of page_rec_is_infimum() and page_rec_is_supremum().
Reduce the amount of buf_frame_align() calls.
row_ins_index_entry_low(): Disable assertion about column count
unless #ifdef UNIV_DEBUG.
innobase/row/row0mysql.c:
Replace FALSE/TRUE ibool comp with zero/nonzero ulint comp.
innobase/row/row0row.c:
Eliminate some buf_frame_align() calls.
Make use of page_rec_is_infimum().
innobase/row/row0sel.c:
Make use of page_rec_is_supremum() and page_rec_is_infimum().
Turn some assertions into debug assertions.
Add UNIV_LIKELY and UNIV_UNLIKELY hints.
row_search_for_mysql(): Eliminate local variables "moved",
"cons_read_requires_clust_rec", "was_lock_wait", "shortcut",
"success" and "comp". Replace some of them with goto's.
Disable variable "cnt" unless #ifdef UNIV_SEARCH_DEBUG.
innobase/row/row0vers.c:
Replace FALSE/TRUE ibool comp with zero/nonzero ulint comp.
Replace index->table->comp with page_rec_is_comp().
Eliminate some buf_frame_align() calls.
2005-04-25 10:14:35 +03:00
|
|
|
|
|
|
|
/************************************************************
|
|
|
|
The following function is used to convert a 16-bit data item
|
|
|
|
to the canonical format, for fast bytewise equality test
|
|
|
|
against memory. */
|
|
|
|
UNIV_INLINE
|
|
|
|
uint16
|
|
|
|
mach_encode_2(
|
|
|
|
/*==========*/
|
|
|
|
/* out: 16-bit integer in canonical format */
|
|
|
|
ulint n); /* in: integer in machine-dependent format */
|
|
|
|
/************************************************************
|
|
|
|
The following function is used to convert a 16-bit data item
|
|
|
|
from the canonical format, for fast bytewise equality test
|
|
|
|
against memory. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_decode_2(
|
|
|
|
/*==========*/
|
|
|
|
/* out: integer in machine-dependent format */
|
|
|
|
uint16 n); /* in: 16-bit integer in canonical format */
|
2001-02-17 14:19:19 +02:00
|
|
|
/***********************************************************
|
|
|
|
The following function is used to store data in 3 consecutive
|
|
|
|
bytes. We store the most significant byte to the lowest address. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
mach_write_to_3(
|
|
|
|
/*============*/
|
|
|
|
byte* b, /* in: pointer to 3 bytes where to store */
|
|
|
|
ulint n); /* in: ulint integer to be stored */
|
|
|
|
/************************************************************
|
|
|
|
The following function is used to fetch data from 3 consecutive
|
|
|
|
bytes. The most significant byte is at the lowest address. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_read_from_3(
|
|
|
|
/*=============*/
|
|
|
|
/* out: ulint integer */
|
|
|
|
byte* b); /* in: pointer to 3 bytes */
|
|
|
|
/***********************************************************
|
|
|
|
The following function is used to store data in four consecutive
|
|
|
|
bytes. We store the most significant byte to the lowest address. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
mach_write_to_4(
|
|
|
|
/*============*/
|
|
|
|
byte* b, /* in: pointer to four bytes where to store */
|
|
|
|
ulint n); /* in: ulint integer to be stored */
|
|
|
|
/************************************************************
|
|
|
|
The following function is used to fetch data from 4 consecutive
|
|
|
|
bytes. The most significant byte is at the lowest address. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_read_from_4(
|
|
|
|
/*=============*/
|
|
|
|
/* out: ulint integer */
|
|
|
|
byte* b); /* in: pointer to four bytes */
|
|
|
|
/*************************************************************
|
2004-06-18 15:54:19 +03:00
|
|
|
Writes a ulint in a compressed form (1..5 bytes). */
|
2001-02-17 14:19:19 +02:00
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_write_compressed(
|
|
|
|
/*==================*/
|
|
|
|
/* out: stored size in bytes */
|
|
|
|
byte* b, /* in: pointer to memory where to store */
|
|
|
|
ulint n); /* in: ulint integer to be stored */
|
|
|
|
/*************************************************************
|
|
|
|
Returns the size of an ulint when written in the compressed form. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_get_compressed_size(
|
|
|
|
/*=====================*/
|
|
|
|
/* out: compressed size in bytes */
|
|
|
|
ulint n); /* in: ulint integer to be stored */
|
|
|
|
/*************************************************************
|
|
|
|
Reads a ulint in a compressed form. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_read_compressed(
|
|
|
|
/*=================*/
|
|
|
|
/* out: read integer */
|
|
|
|
byte* b); /* in: pointer to memory from where to read */
|
|
|
|
/***********************************************************
|
|
|
|
The following function is used to store data in 6 consecutive
|
|
|
|
bytes. We store the most significant byte to the lowest address. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
mach_write_to_6(
|
|
|
|
/*============*/
|
|
|
|
byte* b, /* in: pointer to 6 bytes where to store */
|
|
|
|
dulint n); /* in: dulint integer to be stored */
|
|
|
|
/************************************************************
|
|
|
|
The following function is used to fetch data from 6 consecutive
|
|
|
|
bytes. The most significant byte is at the lowest address. */
|
|
|
|
UNIV_INLINE
|
|
|
|
dulint
|
|
|
|
mach_read_from_6(
|
|
|
|
/*=============*/
|
|
|
|
/* out: dulint integer */
|
|
|
|
byte* b); /* in: pointer to 6 bytes */
|
|
|
|
/***********************************************************
|
|
|
|
The following function is used to store data in 7 consecutive
|
|
|
|
bytes. We store the most significant byte to the lowest address. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
mach_write_to_7(
|
|
|
|
/*============*/
|
|
|
|
byte* b, /* in: pointer to 7 bytes where to store */
|
|
|
|
dulint n); /* in: dulint integer to be stored */
|
|
|
|
/************************************************************
|
|
|
|
The following function is used to fetch data from 7 consecutive
|
|
|
|
bytes. The most significant byte is at the lowest address. */
|
|
|
|
UNIV_INLINE
|
|
|
|
dulint
|
|
|
|
mach_read_from_7(
|
|
|
|
/*=============*/
|
|
|
|
/* out: dulint integer */
|
|
|
|
byte* b); /* in: pointer to 7 bytes */
|
|
|
|
/***********************************************************
|
|
|
|
The following function is used to store data in 8 consecutive
|
|
|
|
bytes. We store the most significant byte to the lowest address. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
mach_write_to_8(
|
|
|
|
/*============*/
|
|
|
|
byte* b, /* in: pointer to 8 bytes where to store */
|
|
|
|
dulint n); /* in: dulint integer to be stored */
|
|
|
|
/************************************************************
|
|
|
|
The following function is used to fetch data from 8 consecutive
|
|
|
|
bytes. The most significant byte is at the lowest address. */
|
|
|
|
UNIV_INLINE
|
|
|
|
dulint
|
|
|
|
mach_read_from_8(
|
|
|
|
/*=============*/
|
|
|
|
/* out: dulint integer */
|
|
|
|
byte* b); /* in: pointer to 8 bytes */
|
|
|
|
/*************************************************************
|
2004-06-18 15:54:19 +03:00
|
|
|
Writes a dulint in a compressed form (5..9 bytes). */
|
2001-02-17 14:19:19 +02:00
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_dulint_write_compressed(
|
|
|
|
/*=========================*/
|
|
|
|
/* out: size in bytes */
|
|
|
|
byte* b, /* in: pointer to memory where to store */
|
|
|
|
dulint n); /* in: dulint integer to be stored */
|
|
|
|
/*************************************************************
|
|
|
|
Returns the size of a dulint when written in the compressed form. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_dulint_get_compressed_size(
|
|
|
|
/*============================*/
|
|
|
|
/* out: compressed size in bytes */
|
|
|
|
dulint n); /* in: dulint integer to be stored */
|
|
|
|
/*************************************************************
|
|
|
|
Reads a dulint in a compressed form. */
|
|
|
|
UNIV_INLINE
|
|
|
|
dulint
|
|
|
|
mach_dulint_read_compressed(
|
|
|
|
/*========================*/
|
|
|
|
/* out: read dulint */
|
|
|
|
byte* b); /* in: pointer to memory from where to read */
|
|
|
|
/*************************************************************
|
2004-06-18 15:54:19 +03:00
|
|
|
Writes a dulint in a compressed form (1..11 bytes). */
|
2001-02-17 14:19:19 +02:00
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_dulint_write_much_compressed(
|
|
|
|
/*==============================*/
|
|
|
|
/* out: size in bytes */
|
|
|
|
byte* b, /* in: pointer to memory where to store */
|
|
|
|
dulint n); /* in: dulint integer to be stored */
|
|
|
|
/*************************************************************
|
|
|
|
Returns the size of a dulint when written in the compressed form. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_dulint_get_much_compressed_size(
|
|
|
|
/*=================================*/
|
|
|
|
/* out: compressed size in bytes */
|
|
|
|
dulint n); /* in: dulint integer to be stored */
|
|
|
|
/*************************************************************
|
|
|
|
Reads a dulint in a compressed form. */
|
|
|
|
UNIV_INLINE
|
|
|
|
dulint
|
|
|
|
mach_dulint_read_much_compressed(
|
|
|
|
/*=============================*/
|
|
|
|
/* out: read dulint */
|
|
|
|
byte* b); /* in: pointer to memory from where to read */
|
|
|
|
/*************************************************************
|
|
|
|
Reads a ulint in a compressed form if the log record fully contains it. */
|
|
|
|
|
|
|
|
byte*
|
|
|
|
mach_parse_compressed(
|
|
|
|
/*==================*/
|
|
|
|
/* out: pointer to end of the stored field, NULL if
|
|
|
|
not complete */
|
|
|
|
byte* ptr, /* in: pointer to buffer from where to read */
|
|
|
|
byte* end_ptr,/* in: pointer to end of the buffer */
|
|
|
|
ulint* val); /* out: read value */
|
|
|
|
/*************************************************************
|
|
|
|
Reads a dulint in a compressed form if the log record fully contains it. */
|
|
|
|
|
|
|
|
byte*
|
|
|
|
mach_dulint_parse_compressed(
|
|
|
|
/*=========================*/
|
|
|
|
/* out: pointer to end of the stored field, NULL if
|
|
|
|
not complete */
|
|
|
|
byte* ptr, /* in: pointer to buffer from where to read */
|
|
|
|
byte* end_ptr,/* in: pointer to end of the buffer */
|
|
|
|
dulint* val); /* out: read value */
|
|
|
|
/*************************************************************
|
|
|
|
Reads a double. It is stored in a little-endian format. */
|
|
|
|
UNIV_INLINE
|
|
|
|
double
|
|
|
|
mach_double_read(
|
|
|
|
/*=============*/
|
|
|
|
/* out: double read */
|
|
|
|
byte* b); /* in: pointer to memory from where to read */
|
|
|
|
/*************************************************************
|
|
|
|
Writes a double. It is stored in a little-endian format. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
mach_double_write(
|
|
|
|
/*==============*/
|
|
|
|
byte* b, /* in: pointer to memory where to write */
|
|
|
|
double d); /* in: double */
|
|
|
|
/*************************************************************
|
|
|
|
Reads a float. It is stored in a little-endian format. */
|
|
|
|
UNIV_INLINE
|
|
|
|
float
|
|
|
|
mach_float_read(
|
|
|
|
/*=============*/
|
|
|
|
/* out: float read */
|
|
|
|
byte* b); /* in: pointer to memory from where to read */
|
|
|
|
/*************************************************************
|
|
|
|
Writes a float. It is stored in a little-endian format. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
mach_float_write(
|
|
|
|
/*==============*/
|
|
|
|
byte* b, /* in: pointer to memory where to write */
|
|
|
|
float d); /* in: float */
|
|
|
|
/*************************************************************
|
|
|
|
Reads a ulint stored in the little-endian format. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_read_from_n_little_endian(
|
|
|
|
/*===========================*/
|
|
|
|
/* out: unsigned long int */
|
|
|
|
byte* buf, /* in: from where to read */
|
|
|
|
ulint buf_size); /* in: from how many bytes to read */
|
|
|
|
/*************************************************************
|
|
|
|
Writes a ulint in the little-endian format. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
mach_write_to_n_little_endian(
|
|
|
|
/*==========================*/
|
|
|
|
byte* dest, /* in: where to write */
|
|
|
|
ulint dest_size, /* in: into how many bytes to write */
|
|
|
|
ulint n); /* in: unsigned long int to write */
|
|
|
|
/*************************************************************
|
|
|
|
Reads a ulint stored in the little-endian format. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
mach_read_from_2_little_endian(
|
|
|
|
/*===========================*/
|
|
|
|
/* out: unsigned long int */
|
|
|
|
byte* buf); /* in: from where to read */
|
|
|
|
/*************************************************************
|
|
|
|
Writes a ulint in the little-endian format. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
mach_write_to_2_little_endian(
|
|
|
|
/*==========================*/
|
|
|
|
byte* dest, /* in: where to write */
|
|
|
|
ulint n); /* in: unsigned long int to write */
|
|
|
|
|
|
|
|
#ifndef UNIV_NONINL
|
|
|
|
#include "mach0data.ic"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|