home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / isam / close.c < prev    next >
C/C++ Source or Header  |  2000-08-31  |  3KB  |  92 lines

  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.  
  17. /* close a isam-database */
  18.  
  19. #include "isamdef.h"
  20.  
  21. int nisam_close(register N_INFO *info)
  22. {
  23.   int error=0,flag;
  24.   ISAM_SHARE *share=info->s;
  25.   DBUG_ENTER("nisam_close");
  26.   DBUG_PRINT("enter",("base: %lx  reopen: %u  locks: %u",
  27.               info,(uint) share->reopen,
  28.               (uint) (share->w_locks+share->r_locks)));
  29.  
  30.   pthread_mutex_lock(&THR_LOCK_isam);
  31.   if (info->lock_type == F_EXTRA_LCK)
  32.     info->lock_type=F_UNLCK;            /* HA_EXTRA_NO_USER_CHANGE */
  33.  
  34. #ifndef NO_LOCKING
  35.   if (info->lock_type != F_UNLCK)
  36.     VOID(nisam_lock_database(info,F_UNLCK));
  37. #else
  38.   info->lock_type=F_UNLCK;
  39.   share->w_locks--;
  40.   if (_nisam_writeinfo(info,test(share->changed)))
  41.     error=my_errno;
  42. #endif
  43.   pthread_mutex_lock(&share->intern_lock);
  44.  
  45.   if (share->base.options & HA_OPTION_READ_ONLY_DATA)
  46.     share->r_locks--;
  47.   if (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED))
  48.   {
  49.     if (end_io_cache(&info->rec_cache))
  50.       error=my_errno;
  51.     info->opt_flag&= ~(READ_CACHE_USED | WRITE_CACHE_USED);
  52.   }
  53.   flag= !--share->reopen;
  54.   nisam_open_list=list_delete(nisam_open_list,&info->open_list);
  55.   pthread_mutex_unlock(&share->intern_lock);
  56.  
  57.   if (flag)
  58.   {
  59.     if (share->kfile >= 0 && flush_key_blocks(share->kfile,FLUSH_RELEASE))
  60.       error=my_errno;
  61.     if (share->kfile >= 0 && my_close(share->kfile,MYF(0)))
  62.       error = my_errno;
  63. #ifdef HAVE_MMAP
  64.     _nisam_unmap_file(info);
  65. #endif
  66.     if (share->decode_trees)
  67.     {
  68.       my_free((gptr) share->decode_trees,MYF(0));
  69.       my_free((gptr) share->decode_tables,MYF(0));
  70.     }
  71. #ifdef THREAD
  72.     thr_lock_delete(&share->lock);
  73.     VOID(pthread_mutex_destroy(&share->intern_lock));
  74. #endif
  75.     my_free((gptr) info->s,MYF(0));
  76.   }
  77.   pthread_mutex_unlock(&THR_LOCK_isam);
  78.   if (info->dfile >= 0 && my_close(info->dfile,MYF(0)))
  79.     error = my_errno;
  80.  
  81.   nisam_log_command(LOG_CLOSE,info,NULL,0,error);
  82.   my_free((gptr) info->rec_alloc,MYF(0));
  83.   my_free((gptr) info,MYF(0));
  84.  
  85.   if (error)
  86.   {
  87.     my_errno=error;
  88.     DBUG_RETURN(-1);
  89.   }
  90.   DBUG_RETURN(0);
  91. } /* nisam_close */
  92.