1 /* Copyright (c) 2000, 2003, 2005, 2006 MySQL AB
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.
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.
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 Street, Fifth Floor, Boston, MA 02110-1301, USA */
18 /* if flag == HA_PANIC_CLOSE then all misam files are closed */
19 /* if flag == HA_PANIC_WRITE then all misam files are unlocked and
20 all changed data in single user misam is written to file */
21 /* if flag == HA_PANIC_READ then all misam files that was locked when
22 mi_panic(HA_PANIC_WRITE) was done is locked. A mi_readinfo() is
23 done for all single user files to get changes in database */
26 int mi_panic(enum ha_panic_function flag
)
29 LIST
*list_element
,*next_open
;
31 DBUG_ENTER("mi_panic");
33 pthread_mutex_lock(&THR_LOCK_myisam
);
34 for (list_element
=myisam_open_list
; list_element
; list_element
=next_open
)
36 next_open
=list_element
->next
; /* Save if close */
37 info
=(MI_INFO
*) list_element
->data
;
40 pthread_mutex_unlock(&THR_LOCK_myisam
); /* Not exactly right... */
43 pthread_mutex_lock(&THR_LOCK_myisam
);
45 case HA_PANIC_WRITE
: /* Do this to free databases */
46 #ifdef CANT_OPEN_FILES_TWICE
47 if (info
->s
->options
& HA_OPTION_READ_ONLY_DATA
)
50 if (flush_key_blocks(info
->s
->key_cache
, info
->s
->kfile
, FLUSH_RELEASE
))
52 if (info
->opt_flag
& WRITE_CACHE_USED
)
53 if (flush_io_cache(&info
->rec_cache
))
55 if (info
->opt_flag
& READ_CACHE_USED
)
57 if (flush_io_cache(&info
->rec_cache
))
59 reinit_io_cache(&info
->rec_cache
,READ_CACHE
,0,
60 (pbool
) (info
->lock_type
!= F_UNLCK
),1);
62 if (info
->lock_type
!= F_UNLCK
&& ! info
->was_locked
)
64 info
->was_locked
=info
->lock_type
;
65 if (mi_lock_database(info
,F_UNLCK
))
68 #ifdef CANT_OPEN_FILES_TWICE
69 if (info
->s
->kfile
>= 0 && my_close(info
->s
->kfile
,MYF(0)))
71 if (info
->dfile
>= 0 && my_close(info
->dfile
,MYF(0)))
73 info
->s
->kfile
=info
->dfile
= -1; /* Files aren't open anymore */
76 case HA_PANIC_READ
: /* Restore to before WRITE */
77 #ifdef CANT_OPEN_FILES_TWICE
78 { /* Open closed files */
79 char name_buff
[FN_REFLEN
];
80 if (info
->s
->kfile
< 0)
81 if ((info
->s
->kfile
= my_open(fn_format(name_buff
,info
->filename
,"",
82 N_NAME_IEXT
,4),info
->mode
,
87 if ((info
->dfile
= my_open(fn_format(name_buff
,info
->filename
,"",
88 N_NAME_DEXT
,4),info
->mode
,
91 info
->rec_cache
.file
=info
->dfile
;
97 if (mi_lock_database(info
, info
->was_locked
))
104 if (flag
== HA_PANIC_CLOSE
)
106 VOID(mi_log(0)); /* Close log if neaded */
109 pthread_mutex_unlock(&THR_LOCK_myisam
);
112 DBUG_RETURN(my_errno
=error
);