43
39
/****************************************************************************
45
41
** A blob is saved as a length and a pointer. The length is stored in the
46
** packlength slot and is sizeof(uint32_t) (4 bytes)
42
** packlength slot and may be from 1-4.
47
43
****************************************************************************/
49
Field_blob::Field_blob(unsigned char *ptr_arg,
50
unsigned char *null_ptr_arg,
51
unsigned char null_bit_arg,
52
const char *field_name_arg,
54
const CHARSET_INFO * const cs)
56
blob_pack_length_to_max_length(sizeof(uint32_t)),
45
Field_blob::Field_blob(unsigned char *ptr_arg, unsigned char *null_ptr_arg, unsigned char null_bit_arg,
46
enum utype unireg_check_arg, const char *field_name_arg,
47
TableShare *share, uint32_t blob_pack_length,
48
const CHARSET_INFO * const cs)
49
:Field_str(ptr_arg, blob_pack_length_to_max_length(blob_pack_length),
50
null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg,
52
packlength(blob_pack_length)
63
55
share->blob_fields++;
64
/* TODO: why do not fill table->getShare()->blob_field array here? */
56
/* TODO: why do not fill table->s->blob_field array here? */
67
60
void Field_blob::store_length(unsigned char *i_ptr,
61
uint32_t i_packlength,
69
63
bool low_byte_first)
71
65
#ifndef WORDS_BIGENDIAN
72
66
(void)low_byte_first;
75
#ifdef WORDS_BIGENDIAN
78
int4store(i_ptr,i_number);
68
switch (i_packlength) {
70
i_ptr[0]= (unsigned char) i_number;
73
#ifdef WORDS_BIGENDIAN
76
int2store(i_ptr,(unsigned short) i_number);
80
shortstore(i_ptr,(unsigned short) i_number);
83
int3store(i_ptr,i_number);
86
#ifdef WORDS_BIGENDIAN
89
int4store(i_ptr,i_number);
93
longstore(i_ptr,i_number);
82
longstore(i_ptr,i_number);
86
void Field_blob::store_length(unsigned char *i_ptr, uint32_t i_number)
98
void Field_blob::store_length(unsigned char *i_ptr, uint32_t i_packlength,
88
store_length(i_ptr, i_number, getTable()->getShare()->db_low_byte_first);
101
store_length(i_ptr, i_packlength, i_number, table->s->db_low_byte_first);
92
105
uint32_t Field_blob::get_length(const unsigned char *pos,
106
uint32_t packlength_arg,
93
107
bool low_byte_first)
95
109
#ifndef WORDS_BIGENDIAN
96
110
(void)low_byte_first;
99
#ifdef WORDS_BIGENDIAN
105
return (uint32_t) tmp;
112
switch (packlength_arg) {
114
return (uint32_t) pos[0];
118
#ifdef WORDS_BIGENDIAN
124
return (uint32_t) tmp;
127
return (uint32_t) uint3korr(pos);
131
#ifdef WORDS_BIGENDIAN
137
return (uint32_t) tmp;
140
return 0; // Impossible
109
144
uint32_t Field_blob::get_packed_size(const unsigned char *ptr_arg,
110
145
bool low_byte_first)
112
return sizeof(uint32_t) + get_length(ptr_arg, low_byte_first);
147
return packlength + get_length(ptr_arg, packlength, low_byte_first);
116
151
uint32_t Field_blob::get_length(uint32_t row_offset)
118
return get_length(ptr+row_offset,
119
getTable()->getShare()->db_low_byte_first);
153
return get_length(ptr+row_offset, this->packlength,
154
table->s->db_low_byte_first);
123
158
uint32_t Field_blob::get_length(const unsigned char *ptr_arg)
125
return get_length(ptr_arg, getTable()->getShare()->db_low_byte_first);
160
return get_length(ptr_arg, this->packlength, table->s->db_low_byte_first);
130
165
Put a blob length field into a record buffer.
132
Blob length is always stored in sizeof(uint32_t) (4 bytes)
167
Depending on the maximum length of a blob, its length field is
168
put into 1 to 4 bytes. This is a property of the blob object,
169
described by 'packlength'.
134
171
@param pos Pointer into the record buffer.
135
172
@param length The length value to put.
275
type::Decimal *Field_blob::val_decimal(type::Decimal *decimal_value)
336
my_decimal *Field_blob::val_decimal(my_decimal *decimal_value)
277
338
const char *blob;
280
341
ASSERT_COLUMN_MARKED_FOR_READ;
282
memcpy(&blob, ptr+sizeof(uint32_t), sizeof(const unsigned char*));
343
memcpy(&blob, ptr+packlength, sizeof(const unsigned char*));
290
350
length= get_length(ptr);
293
decimal_value->store(E_DEC_FATAL_ERROR, blob, length, charset());
352
str2my_decimal(E_DEC_FATAL_ERROR, blob, length, charset(),
295
354
return decimal_value;
309
368
uint32_t max_length)
311
370
unsigned char *blob1,*blob2;
312
memcpy(&blob1,a_ptr+sizeof(uint32_t),sizeof(char*));
313
memcpy(&blob2,b_ptr+sizeof(uint32_t),sizeof(char*));
371
memcpy(&blob1,a_ptr+packlength,sizeof(char*));
372
memcpy(&blob2,b_ptr+packlength,sizeof(char*));
314
373
uint32_t a_len= get_length(a_ptr), b_len= get_length(b_ptr);
315
374
set_if_smaller(a_len, max_length);
316
375
set_if_smaller(b_len, max_length);
424
483
b+HA_KEY_BLOB_LENGTH, uint2korr(b));
487
Save the field metadata for blob fields.
489
Saves the pack length in the first byte of the field metadata array
490
at index of *metadata_ptr.
492
@param metadata_ptr First byte of field metadata
494
@returns number of bytes written to metadata_ptr
496
int Field_blob::do_save_field_metadata(unsigned char *metadata_ptr)
498
*metadata_ptr= pack_length_no_ptr();
427
502
uint32_t Field_blob::sort_length() const
429
return (uint32_t) (getTable()->getSession()->variables.max_sort_length +
430
(field_charset == &my_charset_bin ? 0 : sizeof(uint32_t)));
504
return (uint32_t) (current_session->variables.max_sort_length +
505
(field_charset == &my_charset_bin ? 0 : packlength));
433
508
void Field_blob::sort_string(unsigned char *to,uint32_t length)
447
522
Store length of blob last in blob to shorter blobs before longer blobs
449
length-= sizeof(uint32_t); // size of stored blob length
452
mi_int4store(pos, blob_length);
527
switch (packlength) {
529
*pos= (char) blob_length;
532
mi_int2store(pos, blob_length);
535
mi_int3store(pos, blob_length);
538
mi_int4store(pos, blob_length);
454
memcpy(&blob,ptr+sizeof(uint32_t),sizeof(char*));
542
memcpy(&blob,ptr+packlength,sizeof(char*));
456
544
blob_length=my_strnxfrm(field_charset,
457
545
to, length, blob, blob_length);
517
605
@return New pointer into memory based on from + length of the data
519
607
const unsigned char *Field_blob::unpack(unsigned char *,
520
const unsigned char *from,
608
const unsigned char *from,
524
uint32_t const length= get_length(from, low_byte_first);
525
getTable()->setWriteSet(position());
526
store(reinterpret_cast<const char*>(from) + sizeof(uint32_t),
612
uint32_t const master_packlength=
613
param_data > 0 ? param_data & 0xFF : packlength;
614
uint32_t const length= get_length(from, master_packlength, low_byte_first);
615
table->setWriteSet(field_index);
616
store(reinterpret_cast<const char*>(from) + master_packlength,
527
617
length, field_charset);
528
return(from + sizeof(uint32_t) + length);
618
return(from + master_packlength + length);
531
621
/** Create a packed key that will be used for storage from a MySQL row. */