Commit 0ae810ae authored by serg@sergbook.mysql.com's avatar serg@sergbook.mysql.com
Browse files

mi_fix_rec_buff_for_blob() generalized a bit

parent ffe18e48
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -1094,16 +1094,23 @@ int _mi_read_dynamic_record(MI_INFO *info, my_off_t filepos, byte *buf)
byte *mi_fix_rec_buff_for_blob(MI_INFO *info, ulong length)
{
  uint extra;

  /* to simplify initial init of info->rec_buf in mi_open and mi_extra */
  if (!length)
      length=max(info->s->base.pack_reclength,info->s->base.max_key_length);

  if (! info->rec_buff || length > info->alloced_rec_buff_length)
  {
    byte *newptr;
    extra=ALIGN_SIZE(MI_MAX_DYN_BLOCK_HEADER)+MI_SPLIT_LENGTH+
      MI_DYN_DELETE_BLOCK_HEADER;
    if (!(newptr=(byte*) my_realloc((gptr) info->rec_alloc,length+extra,
    extra= ((info->s->options & HA_OPTION_PACK_RECORD) ?
        ALIGN_SIZE(MI_MAX_DYN_BLOCK_HEADER)+MI_SPLIT_LENGTH+
        MI_DYN_DELETE_BLOCK_HEADER : 0);
    if (!(newptr=(byte*) my_realloc((gptr) info->rec_alloc,length+extra+8,
				    MYF(MY_ALLOW_ZERO_PTR))))
      return newptr;
      return (byte *)0;
    info->rec_alloc=newptr;
    info->rec_buff=newptr+ALIGN_SIZE(MI_DYN_DELETE_BLOCK_HEADER);
    info->rec_buff=newptr+(extra ?
                   ALIGN_SIZE(MI_DYN_DELETE_BLOCK_HEADER) : 0);
    info->alloced_rec_buff_length=length;
  }
  return info->rec_buff;
+1 −1
Original line number Diff line number Diff line
@@ -331,7 +331,7 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function)
    {
      my_free(info->rec_alloc,MYF(MY_ALLOW_ZERO_PTR));
      info->rec_alloc=info->rec_buff=0;
      mi_fix_rec_buff_for_blob(info,info->s->base.pack_reclength);
      mi_fix_rec_buff_for_blob(info, 0);
    }
    break;
  case HA_EXTRA_NORMAL:				/* Theese isn't in use */
+3 −13
Original line number Diff line number Diff line
@@ -506,20 +506,10 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)

  /* Allocate buffer for one record */

  extra=0;
  if (share->options & HA_OPTION_PACK_RECORD)
    extra=ALIGN_SIZE(MI_MAX_DYN_BLOCK_HEADER)+MI_SPLIT_LENGTH+
      MI_DYN_DELETE_BLOCK_HEADER;

  tmp_length=max(share->base.pack_reclength,share->base.max_key_length);
  info.alloced_rec_buff_length=tmp_length;
  if (!(info.rec_alloc=(byte*) my_malloc(tmp_length+extra+8,
					 MYF(MY_WME | MY_ZEROFILL))))
  /* prerequisites: bzero(info) && info->s=share; are met. */
  if (!mi_fix_rec_buff_for_blob(&info, 0))
    goto err;
  if (extra)
    info.rec_buff=info.rec_alloc+ALIGN_SIZE(MI_MAX_DYN_BLOCK_HEADER);
  else
    info.rec_buff=info.rec_alloc;
  bzero(info.rec_alloc, info.alloced_rec_buff_length);

  *m_info=info;
#ifdef THREAD