mirror of
https://github.com/MariaDB/server.git
synced 2025-01-24 07:44:22 +01:00
8f18616ef0
and lexer files). From now on, the following Emacs cc-mode settings apply when indenting C function bodies in InnoDB: (setq c-basic-offset 8) (setq c-label-minimum-indentation 0) (add-to-list 'c-offsets-alist '(c . 0)) (add-to-list 'c-offsets-alist '(label . [0])) The indentation rules for function declarations still have not been formalized, and they must be formatted manually. Try to limit all lines to at most 79 characters (assuming TAB stops every 8 characters) by splitting lines before opening parenthesis, or at string constants. Fix some grammar mistakes in diagnostic output: match to, match with -> match found from -> found in trying rename -> trying to rename Fix an error in page_check_dir(): it said "supremum not pointed to" when the infimum was not pointed to. Enclose commented-out code snippets in #if 0 ... #endif instead of /* ... */. Add (void*) casts to some %p parameters in fprintf() calls. Try to split lines before a binary operator, not after one. (These three fixes were not made everywhere.)
182 lines
4.9 KiB
Text
182 lines
4.9 KiB
Text
/******************************************************
|
|
General row routines
|
|
|
|
(c) 1996 Innobase Oy
|
|
|
|
Created 4/20/1996 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
#include "dict0dict.h"
|
|
#include "rem0rec.h"
|
|
#include "trx0undo.h"
|
|
|
|
/*************************************************************************
|
|
Reads the trx id or roll ptr field from a clustered index record: this function
|
|
is slower than the specialized inline functions. */
|
|
|
|
dulint
|
|
row_get_rec_sys_field(
|
|
/*==================*/
|
|
/* out: value of the field */
|
|
ulint type, /* in: DATA_TRX_ID or DATA_ROLL_PTR */
|
|
rec_t* rec, /* in: record */
|
|
dict_index_t* index, /* in: clustered index */
|
|
const ulint* offsets);/* in: rec_get_offsets(rec, index) */
|
|
/*************************************************************************
|
|
Sets the trx id or roll ptr field in a clustered index record: this function
|
|
is slower than the specialized inline functions. */
|
|
|
|
void
|
|
row_set_rec_sys_field(
|
|
/*==================*/
|
|
/* out: value of the field */
|
|
ulint type, /* in: DATA_TRX_ID or DATA_ROLL_PTR */
|
|
rec_t* rec, /* in: record */
|
|
dict_index_t* index, /* in: clustered index */
|
|
const ulint* offsets,/* in: rec_get_offsets(rec, index) */
|
|
dulint val); /* in: value to set */
|
|
|
|
/*************************************************************************
|
|
Reads the trx id field from a clustered index record. */
|
|
UNIV_INLINE
|
|
dulint
|
|
row_get_rec_trx_id(
|
|
/*===============*/
|
|
/* out: value of the field */
|
|
rec_t* rec, /* in: record */
|
|
dict_index_t* index, /* in: clustered index */
|
|
const ulint* offsets)/* in: rec_get_offsets(rec, index) */
|
|
{
|
|
ulint offset;
|
|
|
|
ut_ad(index->type & DICT_CLUSTERED);
|
|
ut_ad(rec_offs_validate(rec, index, offsets));
|
|
|
|
offset = index->trx_id_offset;
|
|
|
|
if (offset) {
|
|
return(trx_read_trx_id(rec + offset));
|
|
} else {
|
|
return(row_get_rec_sys_field(DATA_TRX_ID,
|
|
rec, index, offsets));
|
|
}
|
|
}
|
|
|
|
/*************************************************************************
|
|
Reads the roll pointer field from a clustered index record. */
|
|
UNIV_INLINE
|
|
dulint
|
|
row_get_rec_roll_ptr(
|
|
/*=================*/
|
|
/* out: value of the field */
|
|
rec_t* rec, /* in: record */
|
|
dict_index_t* index, /* in: clustered index */
|
|
const ulint* offsets)/* in: rec_get_offsets(rec, index) */
|
|
{
|
|
ulint offset;
|
|
|
|
ut_ad(index->type & DICT_CLUSTERED);
|
|
ut_ad(rec_offs_validate(rec, index, offsets));
|
|
|
|
offset = index->trx_id_offset;
|
|
|
|
if (offset) {
|
|
return(trx_read_roll_ptr(rec + offset + DATA_TRX_ID_LEN));
|
|
} else {
|
|
return(row_get_rec_sys_field(DATA_ROLL_PTR,
|
|
rec, index, offsets));
|
|
}
|
|
}
|
|
|
|
/*************************************************************************
|
|
Writes the trx id field to a clustered index record. */
|
|
UNIV_INLINE
|
|
void
|
|
row_set_rec_trx_id(
|
|
/*===============*/
|
|
rec_t* rec, /* in: record */
|
|
dict_index_t* index, /* in: clustered index */
|
|
const ulint* offsets,/* in: rec_get_offsets(rec, index) */
|
|
dulint trx_id) /* in: value of the field */
|
|
{
|
|
ulint offset;
|
|
|
|
ut_ad(index->type & DICT_CLUSTERED);
|
|
ut_ad(rec_offs_validate(rec, index, offsets));
|
|
|
|
offset = index->trx_id_offset;
|
|
|
|
if (offset) {
|
|
trx_write_trx_id(rec + offset, trx_id);
|
|
} else {
|
|
row_set_rec_sys_field(DATA_TRX_ID,
|
|
rec, index, offsets, trx_id);
|
|
}
|
|
}
|
|
|
|
/*************************************************************************
|
|
Sets the roll pointer field in a clustered index record. */
|
|
UNIV_INLINE
|
|
void
|
|
row_set_rec_roll_ptr(
|
|
/*=================*/
|
|
rec_t* rec, /* in: record */
|
|
dict_index_t* index, /* in: clustered index */
|
|
const ulint* offsets,/* in: rec_get_offsets(rec, index) */
|
|
dulint roll_ptr)/* in: value of the field */
|
|
{
|
|
ulint offset;
|
|
|
|
ut_ad(index->type & DICT_CLUSTERED);
|
|
ut_ad(rec_offs_validate(rec, index, offsets));
|
|
|
|
offset = index->trx_id_offset;
|
|
|
|
if (offset) {
|
|
trx_write_roll_ptr(rec + offset + DATA_TRX_ID_LEN, roll_ptr);
|
|
} else {
|
|
row_set_rec_sys_field(DATA_ROLL_PTR,
|
|
rec, index, offsets, roll_ptr);
|
|
}
|
|
}
|
|
|
|
/***********************************************************************
|
|
Builds from a secondary index record a row reference with which we can
|
|
search the clustered index record. */
|
|
UNIV_INLINE
|
|
void
|
|
row_build_row_ref_fast(
|
|
/*===================*/
|
|
dtuple_t* ref, /* in: typed data tuple where the
|
|
reference is built */
|
|
const ulint* map, /* in: array of field numbers in rec
|
|
telling how ref should be built from
|
|
the fields of rec */
|
|
rec_t* rec, /* in: record in the index; must be
|
|
preserved while ref is used, as we do
|
|
not copy field values to heap */
|
|
const ulint* offsets)/* in: array returned by rec_get_offsets() */
|
|
{
|
|
dfield_t* dfield;
|
|
byte* field;
|
|
ulint len;
|
|
ulint ref_len;
|
|
ulint field_no;
|
|
ulint i;
|
|
|
|
ut_ad(rec_offs_validate(rec, NULL, offsets));
|
|
ref_len = dtuple_get_n_fields(ref);
|
|
|
|
for (i = 0; i < ref_len; i++) {
|
|
dfield = dtuple_get_nth_field(ref, i);
|
|
|
|
field_no = *(map + i);
|
|
|
|
if (field_no != ULINT_UNDEFINED) {
|
|
|
|
field = rec_get_nth_field(rec, offsets,
|
|
field_no, &len);
|
|
dfield_set_data(dfield, field, len);
|
|
}
|
|
}
|
|
}
|