summaryrefslogtreecommitdiff
path: root/myisam
diff options
context:
space:
mode:
authorunknown <serg@sergbook.mysql.com>2002-07-09 22:42:44 +0200
committerunknown <serg@sergbook.mysql.com>2002-07-09 22:42:44 +0200
commit9a1ff13ea4a494d90b505b6d6e7b288d7390b5d0 (patch)
tree24ca43f7a6c86acdb12db664cbd8aaa5679c88e6 /myisam
parent79bdeb9df8d1ea0810bcc0f2e36b3690c9799a33 (diff)
downloadmariadb-git-9a1ff13ea4a494d90b505b6d6e7b288d7390b5d0.tar.gz
mi_fix_rec_buff_for_blob() generalized a bit
myisam/mi_extra.c: make use of new mi_fix_rec_buff_for_blob(), and fix a (possible) bug myisam/mi_open.c: make use of new mi_fix_rec_buff_for_blob()
Diffstat (limited to 'myisam')
-rw-r--r--myisam/mi_dynrec.c17
-rw-r--r--myisam/mi_extra.c2
-rw-r--r--myisam/mi_open.c16
3 files changed, 16 insertions, 19 deletions
diff --git a/myisam/mi_dynrec.c b/myisam/mi_dynrec.c
index 12262cf07d6..180a5a65a3d 100644
--- a/myisam/mi_dynrec.c
+++ b/myisam/mi_dynrec.c
@@ -1094,16 +1094,23 @@ err:
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;
diff --git a/myisam/mi_extra.c b/myisam/mi_extra.c
index 21cd9919ada..a1fe68f7087 100644
--- a/myisam/mi_extra.c
+++ b/myisam/mi_extra.c
@@ -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 */
diff --git a/myisam/mi_open.c b/myisam/mi_open.c
index e36a52db92b..c417186de6a 100644
--- a/myisam/mi_open.c
+++ b/myisam/mi_open.c
@@ -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