diff options
author | unknown <serg@sergbook.mysql.com> | 2002-07-09 22:42:44 +0200 |
---|---|---|
committer | unknown <serg@sergbook.mysql.com> | 2002-07-09 22:42:44 +0200 |
commit | 9a1ff13ea4a494d90b505b6d6e7b288d7390b5d0 (patch) | |
tree | 24ca43f7a6c86acdb12db664cbd8aaa5679c88e6 /myisam | |
parent | 79bdeb9df8d1ea0810bcc0f2e36b3690c9799a33 (diff) | |
download | mariadb-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.c | 17 | ||||
-rw-r--r-- | myisam/mi_extra.c | 2 | ||||
-rw-r--r-- | myisam/mi_open.c | 16 |
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 |