close.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

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