Drizzled Public API Documentation

mi_panic.cc
1 /* Copyright (C) 2000-2001, 2003 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
15 
16 #include "myisam_priv.h"
17 
18 using namespace std;
19 using namespace drizzled;
20 
21  /* if flag == HA_PANIC_CLOSE then all misam files are closed */
22  /* if flag == HA_PANIC_WRITE then all misam files are unlocked and
23  all changed data in single user misam is written to file */
24  /* if flag == HA_PANIC_READ then all misam files that was locked when
25  mi_panic(HA_PANIC_WRITE) was done is locked. A mi_readinfo() is
26  done for all single user files to get changes in database */
27 
28 
29 int mi_panic(enum ha_panic_function flag)
30 {
31  int error=0;
32  MI_INFO *info;
33 
34  THR_LOCK_myisam.lock();
35  list<MI_INFO *>::iterator it= myisam_open_list.begin();
36  while (it != myisam_open_list.end())
37  {
38  info= *it;
39  switch (flag) {
40  case HA_PANIC_CLOSE:
41  THR_LOCK_myisam.unlock(); /* Not exactly right... */
42  if (mi_close(info))
43  error=errno;
44  THR_LOCK_myisam.lock();
45  break;
46  case HA_PANIC_WRITE: /* Do this to free databases */
47 #ifdef CANT_OPEN_FILES_TWICE
48  if (info->s->options & HA_OPTION_READ_ONLY_DATA)
49  break;
50 #endif
51  if (info->opt_flag & WRITE_CACHE_USED)
52  if (info->rec_cache.flush())
53  error=errno;
54  if (info->opt_flag & READ_CACHE_USED)
55  {
56  if (info->rec_cache.flush())
57  error=errno;
58  info->rec_cache.reinit_io_cache(internal::READ_CACHE,0, (bool) (info->lock_type != F_UNLCK),1);
59  }
60  if (info->lock_type != F_UNLCK && ! info->was_locked)
61  {
62  info->was_locked=info->lock_type;
63  if (mi_lock_database(info,F_UNLCK))
64  error=errno;
65  }
66 #ifdef CANT_OPEN_FILES_TWICE
67  if (info->s->kfile >= 0 && internal::my_close(info->s->kfile,MYF(0)))
68  error = errno;
69  if (info->dfile >= 0 && internal::my_close(info->dfile,MYF(0)))
70  error = errno;
71  info->s->kfile=info->dfile= -1; /* Files aren't open anymore */
72  break;
73 #endif
74  case HA_PANIC_READ: /* Restore to before WRITE */
75 #ifdef CANT_OPEN_FILES_TWICE
76  { /* Open closed files */
77  char name_buff[FN_REFLEN];
78  if (info->s->kfile < 0)
79  if ((info->s->kfile= internal::my_open(internal::fn_format(name_buff,info->filename,"",
80  N_NAME_IEXT,4),info->mode,
81  MYF(MY_WME))) < 0)
82  error = errno;
83  if (info->dfile < 0)
84  {
85  if ((info->dfile= internal::my_open(internal::fn_format(name_buff,info->filename,"",
86  N_NAME_DEXT,4),info->mode,
87  MYF(MY_WME))) < 0)
88  error = errno;
89  info->rec_cache.file=info->dfile;
90  }
91  }
92 #endif
93  if (info->was_locked)
94  {
95  if (mi_lock_database(info, info->was_locked))
96  error=errno;
97  info->was_locked=0;
98  }
99  break;
100  }
101  ++it;
102  }
103  THR_LOCK_myisam.unlock();
104  if (!error)
105  return(0);
106  return(errno=error);
107 } /* mi_panic */