close.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /* close a isam-database */
  14. #include "isamdef.h"
  15. int nisam_close(register N_INFO *info)
  16. {
  17.   int error=0,flag;
  18.   ISAM_SHARE *share=info->s;
  19.   DBUG_ENTER("nisam_close");
  20.   DBUG_PRINT("enter",("base: %lx  reopen: %u  locks: %u",
  21.       info,(uint) share->reopen,
  22.       (uint) (share->w_locks+share->r_locks)));
  23.   pthread_mutex_lock(&THR_LOCK_isam);
  24.   if (info->lock_type == F_EXTRA_LCK)
  25.     info->lock_type=F_UNLCK; /* HA_EXTRA_NO_USER_CHANGE */
  26. #ifndef NO_LOCKING
  27.   if (info->lock_type != F_UNLCK)
  28.     VOID(nisam_lock_database(info,F_UNLCK));
  29. #else
  30.   info->lock_type=F_UNLCK;
  31.   share->w_locks--;
  32.   if (_nisam_writeinfo(info,test(share->changed)))
  33.     error=my_errno;
  34. #endif
  35.   pthread_mutex_lock(&share->intern_lock);
  36.   if (share->base.options & HA_OPTION_READ_ONLY_DATA)
  37.     share->r_locks--;
  38.   if (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED))
  39.   {
  40.     if (end_io_cache(&info->rec_cache))
  41.       error=my_errno;
  42.     info->opt_flag&= ~(READ_CACHE_USED | WRITE_CACHE_USED);
  43.   }
  44.   flag= !--share->reopen;
  45.   nisam_open_list=list_delete(nisam_open_list,&info->open_list);
  46.   pthread_mutex_unlock(&share->intern_lock);
  47.   if (flag)
  48.   {
  49.     if (share->kfile >= 0 && 
  50.         flush_key_blocks(dflt_key_cache,share->kfile,FLUSH_RELEASE))
  51.       error=my_errno;
  52.     if (share->kfile >= 0 && my_close(share->kfile,MYF(0)))
  53.       error = my_errno;
  54. #ifdef HAVE_MMAP
  55.     _nisam_unmap_file(info);
  56. #endif
  57.     if (share->decode_trees)
  58.     {
  59.       my_free((gptr) share->decode_trees,MYF(0));
  60.       my_free((gptr) share->decode_tables,MYF(0));
  61.     }
  62. #ifdef THREAD
  63.     thr_lock_delete(&share->lock);
  64.     VOID(pthread_mutex_destroy(&share->intern_lock));
  65. #endif
  66.     my_free((gptr) info->s,MYF(0));
  67.   }
  68.   pthread_mutex_unlock(&THR_LOCK_isam);
  69.   if (info->dfile >= 0 && my_close(info->dfile,MYF(0)))
  70.     error = my_errno;
  71.   nisam_log_command(LOG_CLOSE,info,NULL,0,error);
  72.   my_free((gptr) info->rec_alloc,MYF(0));
  73.   my_free((gptr) info,MYF(0));
  74.   if (error)
  75.   {
  76.     my_errno=error;
  77.     DBUG_RETURN(-1);
  78.   }
  79.   DBUG_RETURN(0);
  80. } /* nisam_close */