22
#include <drizzled/server_includes.h>
23
23
#include <drizzled/field/blob.h>
24
24
#include <drizzled/table.h>
25
25
#include <drizzled/session.h>
26
#include "plugin/myisam/myisam.h"
31
29
using namespace std;
36
static uint32_t blob_pack_length_to_max_length(uint32_t arg)
38
return max(UINT32_MAX,
39
(uint32_t)((INT64_C(1) << min(arg, 4U) * 8) - INT64_C(1)));
32
blob_pack_length_to_max_length(uint32_t arg)
34
return (uint32_t)cmax(UINT32_MAX,
35
(INT64_C(1) << cmin(arg, 4U) * 8) - INT64_C(1));
46
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
uint32_t blob_pack_length,
55
const CHARSET_INFO * const cs)
57
blob_pack_length_to_max_length(blob_pack_length),
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
TABLE_SHARE *share, uint32_t blob_pack_length,
48
const CHARSET_INFO * const cs)
49
:Field_longstr(ptr_arg, blob_pack_length_to_max_length(blob_pack_length),
50
null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg,
62
52
packlength(blob_pack_length)
231
220
from= tmpstr.ptr();
234
new_length= min(max_data_length(), field_charset->mbmaxlen * length);
223
new_length= cmin(max_data_length(), field_charset->mbmaxlen * length);
235
224
if (value.alloc(new_length))
228
if (f_is_hex_escape(flags))
230
copy_length= my_copy_with_hex_escaping(field_charset,
231
(char*) value.ptr(), new_length,
233
Field_blob::store_length(copy_length);
235
memmove(ptr + packlength, &tmp, sizeof(char*));
239
239
"length" is OK as "nchars" argument to well_formed_copy_nchars as this
240
240
is never used to limit the length of the data. The cut of long data
268
268
int Field_blob::store(double nr)
270
270
const CHARSET_INFO * const cs=charset();
271
ASSERT_COLUMN_MARKED_FOR_WRITE;
272
271
value.set_real(nr, NOT_FIXED_DEC, cs);
273
272
return Field_blob::store(value.ptr(),(uint32_t) value.length(), cs);
277
276
int Field_blob::store(int64_t nr, bool unsigned_val)
279
278
const CHARSET_INFO * const cs=charset();
280
ASSERT_COLUMN_MARKED_FOR_WRITE;
281
279
value.set_int(nr, unsigned_val, cs);
282
280
return Field_blob::store(value.ptr(), (uint32_t) value.length(), cs);
378
365
int Field_blob::cmp_binary(const unsigned char *a_ptr, const unsigned char *b_ptr,
383
370
uint32_t a_length,b_length;
384
371
memcpy(&a,a_ptr+packlength,sizeof(char*));
385
372
memcpy(&b,b_ptr+packlength,sizeof(char*));
387
a_length= get_length(a_ptr);
373
a_length=get_length(a_ptr);
389
374
if (a_length > max_length)
390
a_length= max_length;
392
b_length= get_length(b_ptr);
376
b_length=get_length(b_ptr);
394
377
if (b_length > max_length)
395
b_length= max_length;
397
diff= memcmp(a,b,min(a_length,b_length));
379
diff=memcmp(a,b,cmin(a_length,b_length));
399
380
return diff ? diff : (int) (a_length - b_length);
402
384
/* The following is used only when comparing a key */
403
uint32_t Field_blob::get_key_image(unsigned char *buff, uint32_t length)
386
uint32_t Field_blob::get_key_image(unsigned char *buff,
405
390
uint32_t blob_length= get_length(ptr);
406
391
unsigned char *blob;
454
441
return HA_KEY_BLOB_LENGTH+length;
457
445
void Field_blob::set_key_image(const unsigned char *buff,uint32_t length)
459
447
length= uint2korr(buff);
460
(void) Field_blob::store((const char*) buff+HA_KEY_BLOB_LENGTH, length, field_charset);
448
(void) Field_blob::store((const char*) buff+HA_KEY_BLOB_LENGTH, length,
463
453
int Field_blob::key_cmp(const unsigned char *key_ptr, uint32_t max_key_length)
465
455
unsigned char *blob1;
481
471
b+HA_KEY_BLOB_LENGTH, uint2korr(b));
476
Save the field metadata for blob fields.
478
Saves the pack length in the first byte of the field metadata array
479
at index of *metadata_ptr.
481
@param metadata_ptr First byte of field metadata
483
@returns number of bytes written to metadata_ptr
485
int Field_blob::do_save_field_metadata(unsigned char *metadata_ptr)
487
*metadata_ptr= pack_length_no_ptr();
484
492
uint32_t Field_blob::sort_length() const
486
494
return (uint32_t) (current_session->variables.max_sort_length +
487
495
(field_charset == &my_charset_bin ? 0 : packlength));
490
499
void Field_blob::sort_string(unsigned char *to,uint32_t length)
492
501
unsigned char *blob;
545
556
unsigned char *Field_blob::pack(unsigned char *to, const unsigned char *from,
546
uint32_t max_length, bool low_byte_first)
557
uint32_t max_length, bool low_byte_first)
548
559
unsigned char *save= ptr;
549
560
ptr= (unsigned char*) from;
550
uint32_t length= get_length(); // Length of from string
561
uint32_t length=get_length(); // Length of from string
553
564
Store max length, which will occupy packlength bytes. If the max
554
565
length given is smaller than the actual length of the blob, we
555
566
just store the initial bytes of the blob.
557
store_length(to, packlength, min(length, max_length), low_byte_first);
568
store_length(to, packlength, cmin(length, max_length), low_byte_first);
560
571
Store the actual blob data, which will occupy 'length' bytes.
564
575
get_ptr((unsigned char**) &from);
565
576
memcpy(to+packlength, from,length);
568
ptr= save; // Restore org row pointer
578
ptr=save; // Restore org row pointer
569
579
return(to+packlength+length);
573
584
Unpack a blob field from row data.
587
598
@return New pointer into memory based on from + length of the data
589
600
const unsigned char *Field_blob::unpack(unsigned char *,
590
const unsigned char *from,
601
const unsigned char *from,
594
605
uint32_t const master_packlength=
595
606
param_data > 0 ? param_data & 0xFF : packlength;
596
607
uint32_t const length= get_length(from, master_packlength, low_byte_first);
597
table->setWriteSet(field_index);
608
bitmap_set_bit(table->write_set, field_index);
598
609
store(reinterpret_cast<const char*>(from) + master_packlength,
599
610
length, field_charset);
600
611
return(from + master_packlength + length);
614
/* Keys for blobs are like keys on varchars */
616
int Field_blob::pack_cmp(const unsigned char *a, const unsigned char *b, uint32_t key_length_arg,
617
bool insert_or_update)
619
uint32_t a_length, b_length;
620
if (key_length_arg > 255)
622
a_length=uint2korr(a); a+=2;
623
b_length=uint2korr(b); b+=2;
627
a_length= (uint32_t) *a++;
628
b_length= (uint32_t) *b++;
630
return field_charset->coll->strnncollsp(field_charset,
637
int Field_blob::pack_cmp(const unsigned char *b, uint32_t key_length_arg,
638
bool insert_or_update)
641
uint32_t a_length, b_length;
642
memcpy(&a,ptr+packlength,sizeof(char*));
644
return key_length_arg > 0 ? -1 : 0;
646
a_length= get_length(ptr);
647
if (key_length_arg > 255)
649
b_length= uint2korr(b); b+=2;
652
b_length= (uint32_t) *b++;
653
return field_charset->coll->strnncollsp(field_charset,
603
659
/** Create a packed key that will be used for storage from a MySQL row. */
686
Unpack a blob key into a record buffer.
688
A blob key has a maximum size of 64K-1.
689
In its packed form, the length field is one or two bytes long,
690
depending on 'max_length'.
691
Depending on the maximum length of a blob, its length field is
692
put into 1 to 4 bytes. This is a property of the blob object,
693
described by 'packlength'.
694
Blobs are internally stored apart from the record buffer, which
695
contains a pointer to the blob buffer.
698
@param to Pointer into the record buffer.
699
@param from Pointer to the packed key.
700
@param max_length Key length limit from key description.
703
Pointer into 'from' past the last byte copied from packed key.
706
const unsigned char *
707
Field_blob::unpack_key(unsigned char *to, const unsigned char *from, uint32_t max_length,
710
/* get length of the blob key */
711
uint32_t length= *from++;
712
if (max_length > 255)
713
length+= *from++ << 8;
715
/* put the length into the record buffer */
716
put_length(to, length);
718
/* put the address of the blob buffer or NULL */
720
memcpy(to + packlength, &from, sizeof(from));
722
memset(to + packlength, 0, sizeof(from));
724
/* point to first byte of next field in 'from' */
725
return from + length;
729
/** Create a packed key that will be used for storage from a MySQL key. */
732
Field_blob::pack_key_from_key_image(unsigned char *to, const unsigned char *from, uint32_t max_length,
735
uint32_t length=uint2korr(from);
736
if (length > max_length)
738
*to++= (char) (length & 255);
739
if (max_length > 255)
740
*to++= (char) (length >> 8);
742
memcpy(to, from+HA_KEY_BLOB_LENGTH, length);
747
uint32_t Field_blob::packed_col_length(const unsigned char *data_ptr, uint32_t length)
750
return uint2korr(data_ptr)+2;
751
return (uint32_t) *data_ptr + 1;
755
uint32_t Field_blob::max_packed_col_length(uint32_t max_length)
757
return (max_length > 255 ? 2 : 1)+max_length;
761
uint32_t Field_blob::is_equal(Create_field *new_field_ptr)
763
if (compare_str_field_flags(new_field_ptr, flags))
765
Field_blob *blob_field_ptr= static_cast<Field_blob *>(new_field_ptr->field);
767
return ((new_field_ptr->sql_type ==
768
get_blob_type_from_length(max_data_length()))
769
&& new_field_ptr->charset == field_charset
770
&& blob_field_ptr->max_data_length() == max_data_length());
630
775
maximum possible display length for blob.