Esempio n. 1
0
uchar *_nisam_fetch_keypage(register N_INFO *info, N_KEYDEF *keyinfo,
			    my_off_t page, uchar *buff, int return_buffer)
{
  uchar *tmp;
  tmp=(uchar*) key_cache_read(info->s->kfile,page,(byte*) buff,
			     (uint) keyinfo->base.block_length,
			     (uint) keyinfo->base.block_length,
			     return_buffer);
  if (tmp == info->buff)
  {
    info->update|=HA_STATE_BUFF_SAVED;
    info->int_pos=(ulong) page;
    info->buff_used=1;
  }
  else
  {
    info->update&= ~HA_STATE_BUFF_SAVED;
    if (tmp)
      info->int_pos=(ulong) page;
    else
    {
      info->int_pos=NI_POS_ERROR;
      DBUG_PRINT("error",("Got errno: %d from key_cache_read",my_errno));
      my_errno=HA_ERR_CRASHED;
    }
  }
  return tmp;
} /* _nisam_fetch_keypage */
Esempio n. 2
0
my_off_t _mi_new(MI_INFO *info, MI_KEYDEF *keyinfo, int level)
{
  my_off_t pos;
  uchar buff[8];
  DBUG_ENTER("_mi_new");

  if ((pos= info->s->state.key_del[keyinfo->block_size_index]) ==
      HA_OFFSET_ERROR)
  {
    if (info->state->key_file_length >=
	info->s->base.max_key_file_length - keyinfo->block_length)
    {
      set_my_errno(HA_ERR_INDEX_FILE_FULL);
      DBUG_RETURN(HA_OFFSET_ERROR);
    }
    pos=info->state->key_file_length;
    info->state->key_file_length+= keyinfo->block_length;
  }
  else
  {
    if (!key_cache_read(info->s->key_cache,
                        keycache_thread_var(),
                        info->s->kfile, pos, level,
			buff,
			(uint) sizeof(buff),
			(uint) keyinfo->block_length,0))
      pos= HA_OFFSET_ERROR;
    else
      info->s->state.key_del[keyinfo->block_size_index]= mi_sizekorr(buff);
  }
  info->s->state.changed|= STATE_NOT_SORTED_PAGES;
  DBUG_PRINT("exit",("Pos: %ld",(long) pos));
  DBUG_RETURN(pos);
} /* _mi_new */
Esempio n. 3
0
ulong _nisam_new(register N_INFO *info, N_KEYDEF *keyinfo)
{
  uint keynr= (uint) (keyinfo - info->s->keyinfo);
  ulong pos;
  DBUG_ENTER("_nisam_new");

  if ((pos=info->s->state.key_del[keynr]) == NI_POS_ERROR)
  {
    if (info->s->state.key_file_length >= info->s->base.max_key_file_length)
    {
      my_errno=HA_ERR_INDEX_FILE_FULL;
      DBUG_RETURN(NI_POS_ERROR);
    }
    pos=info->s->state.key_file_length;
    info->s->state.key_file_length+= keyinfo->base.block_length;
  }
  else
  {
    if (!key_cache_read(info->s->kfile,pos,
			(byte*) &info->s->state.key_del[keynr],
			(uint) sizeof(long),
			(uint) keyinfo->base.block_length,0))
      pos= NI_POS_ERROR;
  }
  DBUG_PRINT("exit",("Pos: %d",pos));
  DBUG_RETURN(pos);
} /* _nisam_new */
Esempio n. 4
0
uchar *_mi_fetch_keypage(MI_INFO *info, MI_KEYDEF *keyinfo,
			 my_off_t page, int level, 
                         uchar *buff, int return_buffer)
{
  uchar *tmp;
  uint page_size;
  DBUG_ENTER("_mi_fetch_keypage");
  DBUG_PRINT("enter",("page: %ld", (long) page));

  tmp=(uchar*) key_cache_read(info->s->key_cache,
                              keycache_thread_var(),
                             info->s->kfile, page, level, (uchar*) buff,
			     (uint) keyinfo->block_length,
			     (uint) keyinfo->block_length,
			     return_buffer);
  if (tmp == info->buff)
    info->buff_used=1;
  else if (!tmp)
  {
    DBUG_PRINT("error",("Got errno: %d from key_cache_read",my_errno()));
    info->last_keypage=HA_OFFSET_ERROR;
    mi_print_error(info->s, HA_ERR_CRASHED);
    set_my_errno(HA_ERR_CRASHED);
    DBUG_RETURN(0);
  }
  info->last_keypage=page;
  page_size=mi_getint(tmp);
  if (page_size < 4 || page_size > keyinfo->block_length)
  {
    DBUG_PRINT("error",("page %lu had wrong page length: %u",
			(ulong) page, page_size));
    DBUG_DUMP("page", tmp, keyinfo->block_length);
    info->last_keypage = HA_OFFSET_ERROR;
    mi_print_error(info->s, HA_ERR_CRASHED);
    set_my_errno(HA_ERR_CRASHED);
    tmp = 0;
  }
  DBUG_RETURN(tmp);
} /* _mi_fetch_keypage */