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

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. /* Uppdaterare nuvarande record i en pisam-databas */
  14. #include "isamdef.h"
  15. #ifdef __WIN__
  16. #include <errno.h>
  17. #endif
  18. /* Updaterar senaste l{sta record i databasen */
  19. int nisam_update(register N_INFO *info, const byte *oldrec, const byte *newrec)
  20. {
  21.   int flag,key_changed,save_errno;
  22.   reg3 ulong pos;
  23.   uint i,length;
  24.   uchar old_key[N_MAX_KEY_BUFF],*new_key;
  25.   DBUG_ENTER("nisam_update");
  26.   LINT_INIT(save_errno);
  27.   if (!(info->update & HA_STATE_AKTIV))
  28.   {
  29.     my_errno=HA_ERR_KEY_NOT_FOUND;
  30.     DBUG_RETURN(-1);
  31.   }
  32.   if (info->s->base.options & HA_OPTION_READ_ONLY_DATA)
  33.   {
  34.     my_errno=EACCES;
  35.     DBUG_RETURN(-1);
  36.   }
  37.   pos=info->lastpos;
  38. #ifndef NO_LOCKING
  39.   if (_nisam_readinfo(info,F_WRLCK,1)) DBUG_RETURN(-1);
  40. #endif
  41.   if ((*info->s->compare_record)(info,oldrec))
  42.   {
  43.     save_errno=my_errno;
  44.     goto err_end; /* Record has changed */
  45.   }
  46.   if (info->s->state.key_file_length >=
  47.       info->s->base.max_key_file_length -
  48.       info->s->blocksize* INDEX_BLOCK_MARGIN *info->s->state.keys)
  49.   {
  50.     save_errno=HA_ERR_INDEX_FILE_FULL;
  51.     goto err_end;
  52.   }
  53. /* Flyttar de element i isamfilen som m}ste flyttas */
  54.   new_key=info->lastkey+info->s->base.max_key_length;
  55.   key_changed=HA_STATE_KEY_CHANGED; /* We changed current database */
  56. /* Remove key that didn't change */
  57.   for (i=0 ; i < info->s->state.keys ; i++)
  58.   {
  59.     length=_nisam_make_key(info,i,new_key,newrec,pos);
  60.     if (length != _nisam_make_key(info,i,old_key,oldrec,pos) ||
  61. memcmp((byte*) old_key,(byte*) new_key,length))
  62.     {
  63.       if ((int) i == info->lastinx)
  64. key_changed|=HA_STATE_WRITTEN; /* Mark that keyfile changed */
  65.       if (_nisam_ck_delete(info,i,old_key)) goto err;
  66.       if (_nisam_ck_write(info,i,new_key)) goto err;
  67.     }
  68.   }
  69.   if ((*info->s->update_record)(info,pos,newrec))
  70.     goto err;
  71.   info->update= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED | HA_STATE_AKTIV |
  72.  key_changed);
  73.   nisam_log_record(LOG_UPDATE,info,newrec,info->lastpos,0);
  74.   VOID(_nisam_writeinfo(info,test(key_changed)));
  75.   allow_break(); /* Allow SIGHUP & SIGINT */
  76.   DBUG_RETURN(0);
  77. err:
  78.   DBUG_PRINT("error",("key: %d  errno: %d",i,my_errno));
  79.   save_errno=my_errno;
  80.   if (my_errno == HA_ERR_FOUND_DUPP_KEY || my_errno == HA_ERR_RECORD_FILE_FULL)
  81.   {
  82.     info->errkey= (int) i;
  83.     flag=0;
  84.     do
  85.     {
  86.       length=_nisam_make_key(info,i,new_key,newrec,pos);
  87.       if (length != _nisam_make_key(info,i,old_key,oldrec,pos) ||
  88.   memcmp((byte*) old_key,(byte*) new_key,length))
  89.       {
  90. if ((flag++ && _nisam_ck_delete(info,i,new_key)) ||
  91.     _nisam_ck_write(info,i,old_key))
  92.   break;
  93.       }
  94.     } while (i-- != 0);
  95.   }
  96.   info->update= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED | HA_STATE_AKTIV |
  97.  key_changed);
  98.  err_end:
  99.   nisam_log_record(LOG_UPDATE,info,newrec,info->lastpos,save_errno);
  100.   VOID(_nisam_writeinfo(info,1));
  101.   allow_break(); /* Allow SIGHUP & SIGINT */
  102.   my_errno=(save_errno == HA_ERR_KEY_NOT_FOUND) ? HA_ERR_CRASHED : save_errno;
  103.   DBUG_RETURN(-1);
  104. } /* nisam_update */