~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to storage/innobase/include/row0row.h

  • Committer: Monty Taylor
  • Date: 2008-09-15 17:24:04 UTC
  • Revision ID: monty@inaugust.com-20080915172404-ygh6hiyu0q7qpa9x
Removed strndup calls.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
#include "mtr0mtr.h"
18
18
#include "rem0types.h"
19
19
#include "read0types.h"
20
 
#include "row0types.h"
21
20
#include "btr0types.h"
22
21
 
23
22
/*************************************************************************
24
 
Gets the offset of the trx id field, in bytes relative to the origin of
25
 
a clustered index record. */
26
 
UNIV_INTERN
27
 
ulint
28
 
row_get_trx_id_offset(
29
 
/*==================*/
30
 
                                /* out: offset of DATA_TRX_ID */
31
 
        const rec_t*    rec,    /* in: record */
32
 
        dict_index_t*   index,  /* in: clustered index */
33
 
        const ulint*    offsets);/* in: rec_get_offsets(rec, index) */
34
 
/*************************************************************************
35
23
Reads the trx id field from a clustered index record. */
36
24
UNIV_INLINE
37
25
dulint
38
26
row_get_rec_trx_id(
39
27
/*===============*/
40
28
                                /* out: value of the field */
41
 
        const rec_t*    rec,    /* in: record */
 
29
        rec_t*          rec,    /* in: record */
42
30
        dict_index_t*   index,  /* in: clustered index */
43
31
        const ulint*    offsets);/* in: rec_get_offsets(rec, index) */
44
32
/*************************************************************************
48
36
row_get_rec_roll_ptr(
49
37
/*=================*/
50
38
                                /* out: value of the field */
51
 
        const rec_t*    rec,    /* in: record */
 
39
        rec_t*          rec,    /* in: record */
52
40
        dict_index_t*   index,  /* in: clustered index */
53
41
        const ulint*    offsets);/* in: rec_get_offsets(rec, index) */
 
42
/*************************************************************************
 
43
Writes the trx id field to a clustered index record. */
 
44
UNIV_INLINE
 
45
void
 
46
row_set_rec_trx_id(
 
47
/*===============*/
 
48
        rec_t*          rec,    /* in: record */
 
49
        dict_index_t*   index,  /* in: clustered index */
 
50
        const ulint*    offsets,/* in: rec_get_offsets(rec, index) */
 
51
        dulint          trx_id);/* in: value of the field */
 
52
/*************************************************************************
 
53
Sets the roll pointer field in a clustered index record. */
 
54
UNIV_INLINE
 
55
void
 
56
row_set_rec_roll_ptr(
 
57
/*=================*/
 
58
        rec_t*          rec,    /* in: record */
 
59
        dict_index_t*   index,  /* in: clustered index */
 
60
        const ulint*    offsets,/* in: rec_get_offsets(rec, index) */
 
61
        dulint          roll_ptr);/* in: value of the field */
54
62
/*********************************************************************
55
 
When an insert or purge to a table is performed, this function builds
56
 
the entry to be inserted into or purged from an index on the table. */
57
 
UNIV_INTERN
 
63
When an insert to a table is performed, this function builds the entry which
 
64
has to be inserted to an index on the table. */
 
65
 
58
66
dtuple_t*
59
67
row_build_index_entry(
60
68
/*==================*/
61
 
                                /* out: index entry which should be
62
 
                                inserted or purged, or NULL if the
63
 
                                externally stored columns in the
64
 
                                clustered index record are unavailable
65
 
                                and ext != NULL */
66
 
        const dtuple_t* row,    /* in: row which should be
67
 
                                inserted or purged */
68
 
        row_ext_t*      ext,    /* in: externally stored column prefixes,
69
 
                                or NULL */
 
69
                                /* out: index entry which should be inserted */
 
70
        dtuple_t*       row,    /* in: row which should be inserted to the
 
71
                                table */
70
72
        dict_index_t*   index,  /* in: index on the table */
71
73
        mem_heap_t*     heap);  /* in: memory heap from which the memory for
72
74
                                the index entry is allocated */
73
75
/***********************************************************************
74
 
An inverse function to row_build_index_entry. Builds a row from a
 
76
An inverse function to dict_row_build_index_entry. Builds a row from a
75
77
record in a clustered index. */
76
 
UNIV_INTERN
 
78
 
77
79
dtuple_t*
78
80
row_build(
79
81
/*======*/
80
 
                                        /* out, own: row built;
81
 
                                        see the NOTE below! */
82
 
        ulint                   type,   /* in: ROW_COPY_POINTERS or
83
 
                                        ROW_COPY_DATA; the latter
84
 
                                        copies also the data fields to
85
 
                                        heap while the first only
86
 
                                        places pointers to data fields
87
 
                                        on the index page, and thus is
88
 
                                        more efficient */
89
 
        const dict_index_t*     index,  /* in: clustered index */
90
 
        const rec_t*            rec,    /* in: record in the clustered
91
 
                                        index; NOTE: in the case
92
 
                                        ROW_COPY_POINTERS the data
93
 
                                        fields in the row will point
94
 
                                        directly into this record,
95
 
                                        therefore, the buffer page of
96
 
                                        this record must be at least
97
 
                                        s-latched and the latch held
98
 
                                        as long as the row dtuple is used! */
99
 
        const ulint*            offsets,/* in: rec_get_offsets(rec,index)
100
 
                                        or NULL, in which case this function
101
 
                                        will invoke rec_get_offsets() */
102
 
        const dict_table_t*     col_table,
103
 
                                        /* in: table, to check which
104
 
                                        externally stored columns
105
 
                                        occur in the ordering columns
106
 
                                        of an index, or NULL if
107
 
                                        index->table should be
108
 
                                        consulted instead; the user
109
 
                                        columns in this table should be
110
 
                                        the same columns as in index->table */
111
 
        row_ext_t**             ext,    /* out, own: cache of
112
 
                                        externally stored column
113
 
                                        prefixes, or NULL */
114
 
        mem_heap_t*             heap);  /* in: memory heap from which
115
 
                                        the memory needed is allocated */
 
82
                                /* out, own: row built; see the NOTE below! */
 
83
        ulint           type,   /* in: ROW_COPY_POINTERS or ROW_COPY_DATA;
 
84
                                the latter copies also the data fields to
 
85
                                heap while the first only places pointers to
 
86
                                data fields on the index page, and thus is
 
87
                                more efficient */
 
88
        dict_index_t*   index,  /* in: clustered index */
 
89
        rec_t*          rec,    /* in: record in the clustered index;
 
90
                                NOTE: in the case ROW_COPY_POINTERS
 
91
                                the data fields in the row will point
 
92
                                directly into this record, therefore,
 
93
                                the buffer page of this record must be
 
94
                                at least s-latched and the latch held
 
95
                                as long as the row dtuple is used! */
 
96
        const ulint*    offsets,/* in: rec_get_offsets(rec, index)
 
97
                                or NULL, in which case this function
 
98
                                will invoke rec_get_offsets() */
 
99
        mem_heap_t*     heap);  /* in: memory heap from which the memory
 
100
                                needed is allocated */
116
101
/***********************************************************************
117
102
Converts an index record to a typed data tuple. */
118
 
UNIV_INTERN
119
 
dtuple_t*
120
 
row_rec_to_index_entry_low(
121
 
/*=======================*/
122
 
                                        /* out: index entry built; does not
123
 
                                        set info_bits, and the data fields in
124
 
                                        the entry will point directly to rec */
125
 
        const rec_t*            rec,    /* in: record in the index */
126
 
        const dict_index_t*     index,  /* in: index */
127
 
        const ulint*            offsets,/* in: rec_get_offsets(rec, index) */
128
 
        ulint*                  n_ext,  /* out: number of externally
129
 
                                        stored columns */
130
 
        mem_heap_t*             heap);  /* in: memory heap from which
131
 
                                        the memory needed is allocated */
132
 
/***********************************************************************
133
 
Converts an index record to a typed data tuple. NOTE that externally
134
 
stored (often big) fields are NOT copied to heap. */
135
 
UNIV_INTERN
 
103
 
136
104
dtuple_t*
137
105
row_rec_to_index_entry(
138
106
/*===================*/
139
 
                                        /* out, own: index entry
140
 
                                        built; see the NOTE below! */
141
 
        ulint                   type,   /* in: ROW_COPY_DATA, or
142
 
                                        ROW_COPY_POINTERS: the former
143
 
                                        copies also the data fields to
144
 
                                        heap as the latter only places
145
 
                                        pointers to data fields on the
146
 
                                        index page */
147
 
        const rec_t*            rec,    /* in: record in the index;
148
 
                                        NOTE: in the case
149
 
                                        ROW_COPY_POINTERS the data
150
 
                                        fields in the row will point
151
 
                                        directly into this record,
152
 
                                        therefore, the buffer page of
153
 
                                        this record must be at least
154
 
                                        s-latched and the latch held
155
 
                                        as long as the dtuple is used! */
156
 
        const dict_index_t*     index,  /* in: index */
157
 
        ulint*                  offsets,/* in/out: rec_get_offsets(rec) */
158
 
        ulint*                  n_ext,  /* out: number of externally
159
 
                                        stored columns */
160
 
        mem_heap_t*             heap);  /* in: memory heap from which
161
 
                                        the memory needed is allocated */
 
107
                                /* out, own: index entry built; see the
 
108
                                NOTE below! */
 
109
        ulint           type,   /* in: ROW_COPY_DATA, or ROW_COPY_POINTERS:
 
110
                                the former copies also the data fields to
 
111
                                heap as the latter only places pointers to
 
112
                                data fields on the index page */
 
113
        dict_index_t*   index,  /* in: index */
 
114
        rec_t*          rec,    /* in: record in the index;
 
115
                                NOTE: in the case ROW_COPY_POINTERS
 
116
                                the data fields in the row will point
 
117
                                directly into this record, therefore,
 
118
                                the buffer page of this record must be
 
119
                                at least s-latched and the latch held
 
120
                                as long as the dtuple is used! */
 
121
        mem_heap_t*     heap);  /* in: memory heap from which the memory
 
122
                                needed is allocated */
162
123
/***********************************************************************
163
124
Builds from a secondary index record a row reference with which we can
164
125
search the clustered index record. */
165
 
UNIV_INTERN
 
126
 
166
127
dtuple_t*
167
128
row_build_row_ref(
168
129
/*==============*/
172
133
                                the former copies also the data fields to
173
134
                                heap, whereas the latter only places pointers
174
135
                                to data fields on the index page */
175
 
        dict_index_t*   index,  /* in: secondary index */
176
 
        const rec_t*    rec,    /* in: record in the index;
 
136
        dict_index_t*   index,  /* in: index */
 
137
        rec_t*          rec,    /* in: record in the index;
177
138
                                NOTE: in the case ROW_COPY_POINTERS
178
139
                                the data fields in the row will point
179
140
                                directly into this record, therefore,
185
146
/***********************************************************************
186
147
Builds from a secondary index record a row reference with which we can
187
148
search the clustered index record. */
188
 
UNIV_INTERN
 
149
 
189
150
void
190
151
row_build_row_ref_in_tuple(
191
152
/*=======================*/
192
 
        dtuple_t*               ref,    /* in/out: row reference built;
193
 
                                        see the NOTE below! */
194
 
        const rec_t*            rec,    /* in: record in the index;
195
 
                                        NOTE: the data fields in ref
196
 
                                        will point directly into this
197
 
                                        record, therefore, the buffer
198
 
                                        page of this record must be at
199
 
                                        least s-latched and the latch
200
 
                                        held as long as the row
201
 
                                        reference is used! */
202
 
        const dict_index_t*     index,  /* in: secondary index */
203
 
        ulint*                  offsets,/* in: rec_get_offsets(rec, index)
204
 
                                        or NULL */
205
 
        trx_t*                  trx);   /* in: transaction */
 
153
        dtuple_t*       ref,    /* in/out: row reference built; see the
 
154
                                NOTE below! */
 
155
        dict_index_t*   index,  /* in: index */
 
156
        rec_t*          rec,    /* in: record in the index;
 
157
                                NOTE: the data fields in ref will point
 
158
                                directly into this record, therefore,
 
159
                                the buffer page of this record must be
 
160
                                at least s-latched and the latch held
 
161
                                as long as the row reference is used! */
 
162
        trx_t*          trx);   /* in: transaction */
206
163
/***********************************************************************
207
164
From a row build a row reference with which we can search the clustered
208
165
index record. */
209
 
UNIV_INTERN
 
166
 
210
167
void
211
168
row_build_row_ref_from_row(
212
169
/*=======================*/
213
 
        dtuple_t*               ref,    /* in/out: row reference built;
214
 
                                        see the NOTE below!
215
 
                                        ref must have the right number
216
 
                                        of fields! */
217
 
        const dict_table_t*     table,  /* in: table */
218
 
        const dtuple_t*         row);   /* in: row
219
 
                                        NOTE: the data fields in ref will point
220
 
                                        directly into data of this row */
 
170
        dtuple_t*       ref,    /* in/out: row reference built; see the
 
171
                                NOTE below! ref must have the right number
 
172
                                of fields! */
 
173
        dict_table_t*   table,  /* in: table */
 
174
        dtuple_t*       row);   /* in: row
 
175
                                NOTE: the data fields in ref will point
 
176
                                directly into data of this row */
221
177
/***********************************************************************
222
178
Builds from a secondary index record a row reference with which we can
223
179
search the clustered index record. */
225
181
void
226
182
row_build_row_ref_fast(
227
183
/*===================*/
228
 
        dtuple_t*       ref,    /* in/out: typed data tuple where the
 
184
        dtuple_t*       ref,    /* in: typed data tuple where the
229
185
                                reference is built */
230
186
        const ulint*    map,    /* in: array of field numbers in rec
231
187
                                telling how ref should be built from
232
188
                                the fields of rec */
233
 
        const rec_t*    rec,    /* in: record in the index; must be
 
189
        rec_t*          rec,    /* in: record in the index; must be
234
190
                                preserved while ref is used, as we do
235
191
                                not copy field values to heap */
236
192
        const ulint*    offsets);/* in: array returned by rec_get_offsets() */
237
193
/*******************************************************************
238
194
Searches the clustered index record for a row, if we have the row
239
195
reference. */
240
 
UNIV_INTERN
 
196
 
241
197
ibool
242
198
row_search_on_row_ref(
243
199
/*==================*/
244
 
                                        /* out: TRUE if found */
245
 
        btr_pcur_t*             pcur,   /* out: persistent cursor, which must
246
 
                                        be closed by the caller */
247
 
        ulint                   mode,   /* in: BTR_MODIFY_LEAF, ... */
248
 
        const dict_table_t*     table,  /* in: table */
249
 
        const dtuple_t*         ref,    /* in: row reference */
250
 
        mtr_t*                  mtr);   /* in/out: mtr */
 
200
                                /* out: TRUE if found */
 
201
        btr_pcur_t*     pcur,   /* in/out: persistent cursor, which must
 
202
                                be closed by the caller */
 
203
        ulint           mode,   /* in: BTR_MODIFY_LEAF, ... */
 
204
        dict_table_t*   table,  /* in: table */
 
205
        dtuple_t*       ref,    /* in: row reference */
 
206
        mtr_t*          mtr);   /* in: mtr */
251
207
/*************************************************************************
252
208
Fetches the clustered index record for a secondary index record. The latches
253
209
on the secondary index record are preserved. */
254
 
UNIV_INTERN
 
210
 
255
211
rec_t*
256
212
row_get_clust_rec(
257
213
/*==============*/
258
214
                                /* out: record or NULL, if no record found */
259
215
        ulint           mode,   /* in: BTR_MODIFY_LEAF, ... */
260
 
        const rec_t*    rec,    /* in: record in a secondary index */
 
216
        rec_t*          rec,    /* in: record in a secondary index */
261
217
        dict_index_t*   index,  /* in: secondary index */
262
218
        dict_index_t**  clust_index,/* out: clustered index */
263
219
        mtr_t*          mtr);   /* in: mtr */
264
220
/*******************************************************************
265
221
Searches an index record. */
266
 
UNIV_INTERN
 
222
 
267
223
ibool
268
224
row_search_index_entry(
269
225
/*===================*/
270
226
                                /* out: TRUE if found */
271
227
        dict_index_t*   index,  /* in: index */
272
 
        const dtuple_t* entry,  /* in: index entry */
 
228
        dtuple_t*       entry,  /* in: index entry */
273
229
        ulint           mode,   /* in: BTR_MODIFY_LEAF, ... */
274
230
        btr_pcur_t*     pcur,   /* in/out: persistent cursor, which must
275
231
                                be closed by the caller */
287
243
No new latches may be obtained while the kernel mutex is reserved.
288
244
However, the kernel mutex can be reserved while latches are owned. */
289
245
 
290
 
/***********************************************************************
291
 
Formats the raw data in "data" (in InnoDB on-disk format) using
292
 
"dict_field" and writes the result to "buf".
293
 
Not more than "buf_size" bytes are written to "buf".
294
 
The result is always '\0'-terminated (provided buf_size > 0) and the
295
 
number of bytes that were written to "buf" is returned (including the
296
 
terminating '\0'). */
297
 
UNIV_INTERN
298
 
ulint
299
 
row_raw_format(
300
 
/*===========*/
301
 
                                                /* out: number of bytes
302
 
                                                that were written */
303
 
        const char*             data,           /* in: raw data */
304
 
        ulint                   data_len,       /* in: raw data length
305
 
                                                in bytes */
306
 
        const dict_field_t*     dict_field,     /* in: index field */
307
 
        char*                   buf,            /* out: output buffer */
308
 
        ulint                   buf_size);      /* in: output buffer size
309
 
                                                in bytes */
310
 
 
311
246
#ifndef UNIV_NONINL
312
247
#include "row0row.ic"
313
248
#endif