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

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