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

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