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

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