log.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. /* Logging of isamcommands and records on logfile */
  14. #include "isamdef.h"
  15. #if defined(MSDOS) || defined(__WIN__)
  16. #include <errno.h>
  17. #include <fcntl.h>
  18. #ifndef __WIN__
  19. #include <process.h>
  20. #endif
  21. #endif
  22. #ifdef VMS
  23. #include <processes.h>
  24. #endif
  25. #ifdef THREAD
  26. #undef GETPID
  27. #define GETPID() (log_type == 1 ? getpid() : (long) my_thread_id());
  28. #else
  29. #define GETPID() getpid()
  30. #endif
  31. /* Activate logging if flag is 1 and reset logging if flag is 0 */
  32. static int log_type=0;
  33. int nisam_log(int activate_log)
  34. {
  35.   int error=0;
  36.   char buff[FN_REFLEN];
  37.   DBUG_ENTER("nisam_log");
  38.   log_type=activate_log;
  39.   if (activate_log)
  40.   {
  41.     if (nisam_log_file < 0)
  42.     {
  43.       if ((nisam_log_file = my_create(fn_format(buff,nisam_log_filename,
  44. "",".log",4),
  45.       0,(O_RDWR | O_BINARY | O_APPEND),MYF(0)))
  46.   < 0)
  47. DBUG_RETURN(1);
  48.     }
  49.   }
  50.   else if (nisam_log_file >= 0)
  51.   {
  52.     error=my_close(nisam_log_file,MYF(0));
  53.     nisam_log_file= -1;
  54.   }
  55.   DBUG_RETURN(error);
  56. }
  57. /* Logging of records and commands on logfile */
  58. /* All logs starts with command(1) dfile(2) process(4) result(2) */
  59. void _nisam_log(enum nisam_log_commands command, N_INFO *info, const byte *buffert, uint length)
  60. {
  61.   char buff[11];
  62.   int error,old_errno;
  63.   ulong pid=(ulong) GETPID();
  64.   old_errno=my_errno;
  65.   bzero(buff,sizeof(buff));
  66.   buff[0]=(char) command;
  67.   int2store(buff+1,info->dfile);
  68.   int4store(buff+3,pid);
  69.   int2store(buff+9,length);
  70.   pthread_mutex_lock(&THR_LOCK_isam);
  71.   error=my_lock(nisam_log_file,F_WRLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
  72.   VOID(my_write(nisam_log_file,buff,sizeof(buff),MYF(0)));
  73.   VOID(my_write(nisam_log_file,buffert,length,MYF(0)));
  74.   if (!error)
  75.     error=my_lock(nisam_log_file,F_UNLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
  76.   pthread_mutex_unlock(&THR_LOCK_isam);
  77.   my_errno=old_errno;
  78. }
  79. void _nisam_log_command(enum nisam_log_commands command, N_INFO *info, const byte *buffert, uint length, int result)
  80. {
  81.   char buff[9];
  82.   int error,old_errno;
  83.   ulong pid=(ulong) GETPID();
  84.   old_errno=my_errno;
  85.   buff[0]=(char) command;
  86.   int2store(buff+1,info->dfile);
  87.   int4store(buff+3,pid);
  88.   int2store(buff+7,result);
  89.   pthread_mutex_lock(&THR_LOCK_isam);
  90.   error=my_lock(nisam_log_file,F_WRLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
  91.   VOID(my_write(nisam_log_file,buff,sizeof(buff),MYF(0)));
  92.   if (buffert)
  93.     VOID(my_write(nisam_log_file,buffert,length,MYF(0)));
  94.   if (!error)
  95.     error=my_lock(nisam_log_file,F_UNLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
  96.   pthread_mutex_unlock(&THR_LOCK_isam);
  97.   my_errno=old_errno;
  98. }
  99. void _nisam_log_record(enum nisam_log_commands command, N_INFO *info, const byte *record, ulong filepos, int result)
  100. {
  101.   char buff[17],*pos;
  102.   int error,old_errno;
  103.   uint length;
  104.   ulong pid=(ulong) GETPID();
  105.   old_errno=my_errno;
  106.   if (!info->s->base.blobs)
  107.     length=info->s->base.reclength;
  108.   else
  109.     length=info->s->base.reclength+ _calc_total_blob_length(info,record);
  110.   buff[0]=(char) command;
  111.   int2store(buff+1,info->dfile);
  112.   int4store(buff+3,pid);
  113.   int2store(buff+7,result);
  114.   int4store(buff+9,filepos);
  115.   int4store(buff+13,length);
  116.   pthread_mutex_lock(&THR_LOCK_isam);
  117.   error=my_lock(nisam_log_file,F_WRLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
  118.   VOID(my_write(nisam_log_file,buff,sizeof(buff),MYF(0)));
  119.   VOID(my_write(nisam_log_file,(byte*) record,info->s->base.reclength,MYF(0)));
  120.   if (info->s->base.blobs)
  121.   {
  122.     N_BLOB *blob,*end;
  123.     for (end=info->blobs+info->s->base.blobs, blob= info->blobs;
  124.  blob != end ;
  125.  blob++)
  126.     {
  127.       bmove(&pos,record+blob->offset+blob->pack_length,sizeof(char*));
  128.       VOID(my_write(nisam_log_file,pos,blob->length,MYF(0)));
  129.     }
  130.   }
  131.   if (!error)
  132.     error=my_lock(nisam_log_file,F_UNLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
  133.   pthread_mutex_unlock(&THR_LOCK_isam);
  134.   my_errno=old_errno;
  135. }