~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2003, 2005 MySQL AB
2
3
   This program is free software; you can redistribute it and/or modify
4
   it under the terms of the GNU General Public License as published by
5
   the Free Software Foundation; version 2 of the License.
6
7
   This program is distributed in the hope that it will be useful,
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
   GNU General Public License for more details.
11
12
   You should have received a copy of the GNU General Public License
13
   along with this program; if not, write to the Free Software
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
15
16
/*
17
  Preload indexes into key cache
18
*/
19
1130.3.28 by Monty Taylor
Moved heapdef.h and myisamdef.h to *_priv.h for easier filtering for include guard check.
20
#include "myisam_priv.h"
1241.9.1 by Monty Taylor
Removed global.h. Fixed all the headers.
21
#include <stdlib.h>
492.1.7 by Monty Taylor
Moved test() to its own file.
22
#include <drizzled/util/test.h>
23
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
24
using namespace drizzled;
1 by brian
clean slate
25
26
/*
27
  Preload pages of the index file for a table into the key cache
28
29
  SYNOPSIS
30
    mi_preload()
31
      info          open table
660.1.3 by Eric Herman
removed trailing whitespace with simple script:
32
      map           map of indexes to preload into key cache
1 by brian
clean slate
33
      ignore_leaves only non-leaves pages are to be preloaded
34
35
  RETURN VALUE
36
    0 if a success. error code - otherwise.
37
38
  NOTES.
39
    At present pages for all indexes are preloaded.
40
    In future only pages for indexes specified in the key_map parameter
41
    of the table will be preloaded.
42
*/
43
281 by Brian Aker
Converted myisam away from my_bool
44
int mi_preload(MI_INFO *info, uint64_t key_map, bool ignore_leaves)
1 by brian
clean slate
45
{
482 by Brian Aker
Remove uint.
46
  uint32_t i;
313 by Brian Aker
Further work with ulong in myisam
47
  uint32_t length, block_length= 0;
481 by Brian Aker
Remove all of uchar.
48
  unsigned char *buff= NULL;
1 by brian
clean slate
49
  MYISAM_SHARE* share= info->s;
482 by Brian Aker
Remove uint.
50
  uint32_t keys= share->state.header.keys;
1 by brian
clean slate
51
  MI_KEYDEF *keyinfo= share->keyinfo;
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
52
  internal::my_off_t key_file_length= share->state.state.key_file_length;
53
  internal::my_off_t pos= share->base.keystart;
1 by brian
clean slate
54
55
  if (!keys || !mi_is_any_key_active(key_map) || key_file_length == pos)
51.1.107 by Jay Pipes
Removed/replaced DBUG symbols and TRUE/FALSE
56
    return(0);
1 by brian
clean slate
57
58
  block_length= keyinfo[0].block_length;
59
60
  if (ignore_leaves)
61
  {
62
    /* Check whether all indexes use the same block size */
63
    for (i= 1 ; i < keys ; i++)
64
    {
65
      if (keyinfo[i].block_length != block_length)
1241.9.57 by Monty Taylor
Oy. Bigger change than I normally like - but this stuff is all intertwined.
66
        return(errno= HA_ERR_NON_UNIQUE_BLOCK_SIZE);
1 by brian
clean slate
67
    }
68
  }
69
  else
70
    block_length= share->key_cache->key_cache_block_size;
71
72
  length= info->preload_buff_size/block_length * block_length;
73
  set_if_bigger(length, block_length);
74
656.1.25 by Monty Taylor
Removed my_malloc stuff from storage/
75
  if (!(buff= (unsigned char *) malloc(length)))
1241.9.57 by Monty Taylor
Oy. Bigger change than I normally like - but this stuff is all intertwined.
76
    return(errno= HA_ERR_OUT_OF_MEM);
1 by brian
clean slate
77
78
  if (flush_key_blocks(share->key_cache,share->kfile, FLUSH_RELEASE))
79
    goto err;
80
81
  do
82
  {
83
    /* Read the next block of index file into the preload buffer */
1280.1.10 by Monty Taylor
Put everything in drizzled into drizzled namespace.
84
    if ((internal::my_off_t) length > (key_file_length-pos))
313 by Brian Aker
Further work with ulong in myisam
85
      length= (uint32_t) (key_file_length-pos);
481 by Brian Aker
Remove all of uchar.
86
    if (my_pread(share->kfile, (unsigned char*) buff, length, pos, MYF(MY_FAE|MY_FNABP)))
1 by brian
clean slate
87
      goto err;
88
89
    if (ignore_leaves)
90
    {
481 by Brian Aker
Remove all of uchar.
91
      unsigned char *end= buff+length;
1 by brian
clean slate
92
      do
93
      {
94
        if (mi_test_if_nod(buff))
95
        {
96
          if (key_cache_insert(share->key_cache,
97
                               share->kfile, pos, DFLT_INIT_HITS,
481 by Brian Aker
Remove all of uchar.
98
                              (unsigned char*) buff, block_length))
1 by brian
clean slate
99
	    goto err;
100
	}
101
        pos+= block_length;
102
      }
103
      while ((buff+= block_length) != end);
104
      buff= end-length;
105
    }
106
    else
107
    {
108
      if (key_cache_insert(share->key_cache,
109
                           share->kfile, pos, DFLT_INIT_HITS,
481 by Brian Aker
Remove all of uchar.
110
                           (unsigned char*) buff, length))
1 by brian
clean slate
111
	goto err;
112
      pos+= length;
113
    }
114
  }
115
  while (pos != key_file_length);
116
477 by Monty Taylor
Removed my_free(). It turns out that it had been def'd to ignore the flags passed to it in the second arg anyway. Gotta love that.
117
  free((char*) buff);
51.1.107 by Jay Pipes
Removed/replaced DBUG symbols and TRUE/FALSE
118
  return(0);
1 by brian
clean slate
119
120
err:
477 by Monty Taylor
Removed my_free(). It turns out that it had been def'd to ignore the flags passed to it in the second arg anyway. Gotta love that.
121
  free((char*) buff);
1241.9.57 by Monty Taylor
Oy. Bigger change than I normally like - but this stuff is all intertwined.
122
  return(errno= errno);
1 by brian
clean slate
123
}
124