hp_open.c 2.59 KB
Newer Older
unknown's avatar
unknown committed
1
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
unknown's avatar
unknown committed
2

unknown's avatar
unknown committed
3 4 5 6
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
unknown's avatar
unknown committed
7

unknown's avatar
unknown committed
8 9 10 11
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
unknown's avatar
unknown committed
12

unknown's avatar
unknown committed
13 14 15 16 17 18 19 20 21 22 23
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

/* open a heap-database */

#include "heapdef.h"
#ifdef VMS
#include "hp_static.c"			/* Stupid vms-linker */
#endif

24 25
#include "my_sys.h"

unknown's avatar
unknown committed
26
HP_INFO *heap_open(const char *name, int mode)
27
{
unknown's avatar
unknown committed
28 29
  HP_INFO *info;
  HP_SHARE *share;
30

unknown's avatar
unknown committed
31 32
  DBUG_ENTER("heap_open");
  pthread_mutex_lock(&THR_LOCK_heap);
unknown's avatar
unknown committed
33
  if (!(share= hp_find_named_heap(name)))
unknown's avatar
unknown committed
34
  {
unknown's avatar
unknown committed
35 36 37
    my_errno= ENOENT;
    pthread_mutex_unlock(&THR_LOCK_heap);
    DBUG_RETURN(0);
unknown's avatar
unknown committed
38
  }
unknown's avatar
unknown committed
39
  if (!(info= (HP_INFO*) my_malloc((uint) sizeof(HP_INFO) +
40
				  2 * share->max_key_length,
unknown's avatar
unknown committed
41 42 43 44 45
				  MYF(MY_ZEROFILL))))
  {
    pthread_mutex_unlock(&THR_LOCK_heap);
    DBUG_RETURN(0);
  }
unknown's avatar
unknown committed
46
  share->open_count++; 
unknown's avatar
unknown committed
47 48 49
#ifdef THREAD
  thr_lock_data_init(&share->lock,&info->lock,NULL);
#endif
50 51
  info->open_list.data= (void*) info;
  heap_open_list= list_add(heap_open_list,&info->open_list);
unknown's avatar
unknown committed
52 53
  pthread_mutex_unlock(&THR_LOCK_heap);

54 55 56 57
  info->s= share;
  info->lastkey= (byte*) (info + 1);
  info->recbuf= (byte*) (info->lastkey + share->max_key_length);
  info->mode= mode;
unknown's avatar
unknown committed
58
  info->current_record= (ulong) ~0L;		/* No current record */
59 60 61 62
  info->current_ptr= 0;
  info->current_hash_ptr= 0;
  info->lastinx= info->errkey= -1;
  info->update= 0;
unknown's avatar
unknown committed
63
#ifndef DBUG_OFF
64
  info->opt_flag= READ_CHECK_USED;		/* Check when changing */
unknown's avatar
unknown committed
65 66 67 68
#endif
  DBUG_PRINT("exit",("heap: %lx  reclength: %d  records_in_block: %d",
		     info,share->reclength,share->block.records_in_block));
  DBUG_RETURN(info);
unknown's avatar
unknown committed
69
}
unknown's avatar
unknown committed
70 71 72

	/* map name to a heap-nr. If name isn't found return 0 */

73
HP_SHARE *hp_find_named_heap(const char *name)
unknown's avatar
unknown committed
74 75 76 77 78 79
{
  LIST *pos;
  HP_SHARE *info;
  DBUG_ENTER("heap_find");
  DBUG_PRINT("enter",("name: %s",name));

unknown's avatar
unknown committed
80
  for (pos= heap_share_list; pos; pos= pos->next)
unknown's avatar
unknown committed
81
  {
unknown's avatar
unknown committed
82 83
    info= (HP_SHARE*) pos->data;
    if (!strcmp(name, info->name))
unknown's avatar
unknown committed
84
    {
unknown's avatar
unknown committed
85
      DBUG_PRINT("exit", ("Old heap_database: %lx",info));
unknown's avatar
unknown committed
86 87 88
      DBUG_RETURN(info);
    }
  }
unknown's avatar
unknown committed
89
  DBUG_RETURN((HP_SHARE *) 0);
unknown's avatar
unknown committed
90 91 92
}