Commit 3f6491e3 authored by serg@sergbook.mysql.com's avatar serg@sergbook.mysql.com
Browse files

yet another generalization for rec_buff handling, MI_INFO doesn't need rec_alloc anymore

parent 0ae810ae
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -101,7 +101,7 @@ int mi_close(register MI_INFO *info)
    error = my_errno;

  myisam_log_command(MI_LOG_CLOSE,info,NULL,0,error);
  my_free((gptr) info->rec_alloc,MYF(MY_ALLOW_ZERO_PTR));
  my_free(mi_get_rec_buff_ptr(info, info->rec_buff), MYF(MY_ALLOW_ZERO_PTR));
  my_free((gptr) info,MYF(0));

  if (error)
+4 −34
Original line number Diff line number Diff line
@@ -724,8 +724,8 @@ uint _mi_rec_pack(MI_INFO *info, register byte *to, register const byte *from)


/*
** Check if a record was correctly packed. Used only by isamchk
** Returns 0 if record is ok.
  Check if a record was correctly packed. Used only by myisamchk
  Returns 0 if record is ok.
*/

my_bool _mi_rec_check(MI_INFO *info,const char *record)
@@ -1090,39 +1090,12 @@ int _mi_read_dynamic_record(MI_INFO *info, my_off_t filepos, byte *buf)
  DBUG_RETURN(-1);
}


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= ((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 (byte *)0;
    info->rec_alloc=newptr;
    info->rec_buff=newptr+(extra ?
                   ALIGN_SIZE(MI_DYN_DELETE_BLOCK_HEADER) : 0);
    info->alloced_rec_buff_length=length;
  }
  return info->rec_buff;
}


	/* compare unique constraint between stored rows */

int _mi_cmp_dynamic_unique(MI_INFO *info, MI_UNIQUEDEF *def,
			   const byte *record, my_off_t pos)
{
  byte *rec_buff,*rec_alloc,*old_record;
  byte *rec_buff,*old_record;
  uint alloced_rec_buff_length;
  int error;
  DBUG_ENTER("_mi_cmp_dynamic_unique");
@@ -1132,12 +1105,10 @@ int _mi_cmp_dynamic_unique(MI_INFO *info, MI_UNIQUEDEF *def,

  /* Don't let the compare destroy blobs that may be in use */
  rec_buff=info->rec_buff;
  rec_alloc=info->rec_alloc;
  alloced_rec_buff_length=info->alloced_rec_buff_length;
  if (info->s->base.blobs)
  {
    info->rec_buff=0;
    info->rec_alloc=0;
    info->alloced_rec_buff_length=0;
  }
  error=_mi_read_dynamic_record(info,pos,old_record);
@@ -1145,9 +1116,8 @@ int _mi_cmp_dynamic_unique(MI_INFO *info, MI_UNIQUEDEF *def,
    error=mi_unique_comp(def, record, old_record, def->null_are_equal);
  if (info->s->base.blobs)
  {
    my_free(info->rec_alloc,MYF(MY_ALLOW_ZERO_PTR));
    my_free(mi_get_rec_buff_ptr(info, info->rec_buff), MYF(MY_ALLOW_ZERO_PTR));
    info->rec_buff=rec_buff;
    info->rec_alloc=rec_alloc;
    info->alloced_rec_buff_length=alloced_rec_buff_length;
  }
  my_afree(old_record);
+1 −5
Original line number Diff line number Diff line
@@ -328,11 +328,7 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function)
      }
    }
    if (share->base.blobs)
    {
      my_free(info->rec_alloc,MYF(MY_ALLOW_ZERO_PTR));
      info->rec_alloc=info->rec_buff=0;
      mi_fix_rec_buff_for_blob(info, 0);
    }
      mi_fix_rec_buff_for_blob(info, -1);
    break;
  case HA_EXTRA_NORMAL:				/* Theese isn't in use */
    info->quick_mode=0;
+35 −2
Original line number Diff line number Diff line
@@ -507,9 +507,9 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
  /* Allocate buffer for one record */

  /* prerequisites: bzero(info) && info->s=share; are met. */
  if (!mi_fix_rec_buff_for_blob(&info, 0))
  if (!mi_fix_rec_buff_for_blob(&info, -1))
    goto err;
  bzero(info.rec_alloc, info.alloced_rec_buff_length);
  bzero(info.rec_buff, info.alloced_rec_buff_length);

  *m_info=info;
#ifdef THREAD
@@ -559,6 +559,39 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
  DBUG_RETURN (NULL);
} /* mi_open */

gptr mi_get_rec_buff_ptr(MI_INFO *info, byte *buf)
{
  if (info->s->options & HA_OPTION_PACK_RECORD && buf)
    return buf - MI_REC_BUFF_OFFSET;
  else
    return buf;
}

byte *mi_alloc_rec_buff(MI_INFO *info, ulong length, byte **buf, uint *buf_len)
{
  uint extra;

  if (! *buf || length > *buf_len)
  {
    byte *newptr = *buf;

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

    extra= ((info->s->options & HA_OPTION_PACK_RECORD) ?
             ALIGN_SIZE(MI_MAX_DYN_BLOCK_HEADER)+MI_SPLIT_LENGTH+
             MI_REC_BUFF_OFFSET : 0);
    if (extra && newptr)
      newptr-=MI_REC_BUFF_OFFSET;
    if (!(newptr=(byte*) my_realloc((gptr)newptr, length+extra+8,
				    MYF(MY_ALLOW_ZERO_PTR))))
      return 0;
    *buf=newptr+(extra ?  MI_REC_BUFF_OFFSET : 0);
    *buf_len=length;
  }
  return *buf;
}

ulonglong mi_safe_mul(ulonglong a, ulonglong b)
{
+9 −5
Original line number Diff line number Diff line
@@ -226,8 +226,7 @@ struct st_myisam_info {
  char *filename;			/* parameter to open filename */
  uchar *buff,				/* Temp area for key */
	*lastkey,*lastkey2;		/* Last used search key */
  byte	*rec_buff,			/* Tempbuff for recordpack */
	*rec_alloc;			/* Malloced area for record */
  byte	*rec_buff;			/* Tempbuff for recordpack */
  uchar *int_keypos,			/* Save position for next/previous */
        *int_maxpos;			/*  -""-  */
  int (*read_record)(struct st_myisam_info*, my_off_t, byte*);
@@ -360,6 +359,7 @@ struct st_myisam_info {
#define MI_DYN_ALIGN_SIZE	4	/* Align blocks on this */
#define MI_MAX_DYN_HEADER_BYTE	13	/* max header byte for dynamic rows */
#define MI_MAX_BLOCK_LENGTH	((((ulong) 1 << 24)-1) & (~ (ulong) (MI_DYN_ALIGN_SIZE-1)))
#define MI_REC_BUFF_OFFSET      ALIGN_SIZE(MI_DYN_DELETE_BLOCK_HEADER)

#define MEMMAP_EXTRA_MARGIN	7	/* Write this as a suffix for file */

@@ -523,7 +523,11 @@ extern int _mi_read_key_record(MI_INFO *info,my_off_t filepos,byte *buf);
extern int _mi_read_cache(IO_CACHE *info,byte *buff,my_off_t pos,
			  uint length,int re_read_if_possibly);
extern void update_auto_increment(MI_INFO *info,const byte *record);
extern byte *mi_fix_rec_buff_for_blob(MI_INFO *info,ulong blob_length);
extern byte *mi_alloc_rec_buff(MI_INFO *,ulong, byte**, uint*);
extern gptr mi_get_rec_buff_ptr(MI_INFO *, byte *);
#define mi_fix_rec_buff_for_blob(INFO,LENGTH)  \
            mi_alloc_rec_buff((INFO),(LENGTH), \
              &((INFO)->rec_buff), &((INFO)->alloced_rec_buff_length))
extern ulong _mi_rec_unpack(MI_INFO *info,byte *to,byte *from,
			    ulong reclength);
extern my_bool _mi_rec_check(MI_INFO *info,const char *from);