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