mySQL 5.0.11 sources for tomato
[tomato.git] / release / src / router / mysql / storage / myisam / mi_log.c
blob864ed7b791208d807c0af7f0e822348678ab35bf
1 /* Copyright (c) 2000, 2001, 2004-2007 MySQL AB
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; version 2 of the License.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 GNU General Public License for more details.
12 You should have received a copy of the GNU General Public License
13 along with this program; if not, write to the Free Software
14 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
17 Logging of MyISAM commands and records on logfile for debugging
18 The log can be examined with help of the myisamlog command.
21 #include "myisamdef.h"
22 #if defined(MSDOS) || defined(__WIN__)
23 #include <fcntl.h>
24 #ifndef __WIN__
25 #include <process.h>
26 #endif
27 #endif
28 #ifdef VMS
29 #include <processes.h>
30 #endif
32 #undef GETPID /* For HPUX */
33 #ifdef THREAD
34 #define GETPID() (log_type == 1 ? (long) myisam_pid : (long) my_thread_dbug_id())
35 #else
36 #define GETPID() myisam_pid
37 #endif
39 /* Activate logging if flag is 1 and reset logging if flag is 0 */
41 static int log_type=0;
42 ulong myisam_pid=0;
44 int mi_log(int activate_log)
46 int error=0;
47 char buff[FN_REFLEN];
48 DBUG_ENTER("mi_log");
50 log_type=activate_log;
51 if (activate_log)
53 if (!myisam_pid)
54 myisam_pid=(ulong) getpid();
55 if (myisam_log_file < 0)
57 if ((myisam_log_file = my_create(fn_format(buff,myisam_log_filename,
58 "",".log",4),
59 0,(O_RDWR | O_BINARY | O_APPEND),MYF(0)))
60 < 0)
61 DBUG_RETURN(my_errno);
64 else if (myisam_log_file >= 0)
66 error=my_close(myisam_log_file,MYF(0)) ? my_errno : 0 ;
67 myisam_log_file= -1;
69 DBUG_RETURN(error);
73 /* Logging of records and commands on logfile */
74 /* All logs starts with command(1) dfile(2) process(4) result(2) */
76 void _myisam_log(enum myisam_log_commands command, MI_INFO *info,
77 const uchar *buffert, uint length)
79 uchar buff[11];
80 int error,old_errno;
81 ulong pid=(ulong) GETPID();
82 old_errno=my_errno;
83 bzero(buff,sizeof(buff));
84 buff[0]=(char) command;
85 mi_int2store(buff+1,info->dfile);
86 mi_int4store(buff+3,pid);
87 mi_int2store(buff+9,length);
89 pthread_mutex_lock(&THR_LOCK_myisam);
90 error=my_lock(myisam_log_file,F_WRLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
91 VOID(my_write(myisam_log_file,buff,sizeof(buff),MYF(0)));
92 VOID(my_write(myisam_log_file,buffert,length,MYF(0)));
93 if (!error)
94 error=my_lock(myisam_log_file,F_UNLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
95 pthread_mutex_unlock(&THR_LOCK_myisam);
96 my_errno=old_errno;
100 void _myisam_log_command(enum myisam_log_commands command, MI_INFO *info,
101 const uchar *buffert, uint length, int result)
103 uchar buff[9];
104 int error,old_errno;
105 ulong pid=(ulong) GETPID();
107 old_errno=my_errno;
108 buff[0]=(char) command;
109 mi_int2store(buff+1,info->dfile);
110 mi_int4store(buff+3,pid);
111 mi_int2store(buff+7,result);
112 pthread_mutex_lock(&THR_LOCK_myisam);
113 error=my_lock(myisam_log_file,F_WRLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
114 VOID(my_write(myisam_log_file,buff,sizeof(buff),MYF(0)));
115 if (buffert)
116 VOID(my_write(myisam_log_file,buffert,length,MYF(0)));
117 if (!error)
118 error=my_lock(myisam_log_file,F_UNLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
119 pthread_mutex_unlock(&THR_LOCK_myisam);
120 my_errno=old_errno;
124 void _myisam_log_record(enum myisam_log_commands command, MI_INFO *info,
125 const uchar *record, my_off_t filepos, int result)
127 uchar buff[21],*pos;
128 int error,old_errno;
129 uint length;
130 ulong pid=(ulong) GETPID();
132 old_errno=my_errno;
133 if (!info->s->base.blobs)
134 length=info->s->base.reclength;
135 else
136 length=info->s->base.reclength+ _my_calc_total_blob_length(info,record);
137 buff[0]=(uchar) command;
138 mi_int2store(buff+1,info->dfile);
139 mi_int4store(buff+3,pid);
140 mi_int2store(buff+7,result);
141 mi_sizestore(buff+9,filepos);
142 mi_int4store(buff+17,length);
143 pthread_mutex_lock(&THR_LOCK_myisam);
144 error=my_lock(myisam_log_file,F_WRLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
145 VOID(my_write(myisam_log_file, buff,sizeof(buff),MYF(0)));
146 VOID(my_write(myisam_log_file, record,info->s->base.reclength,MYF(0)));
147 if (info->s->base.blobs)
149 MI_BLOB *blob,*end;
151 for (end=info->blobs+info->s->base.blobs, blob= info->blobs;
152 blob != end ;
153 blob++)
155 memcpy_fixed((uchar*) &pos, record+blob->offset+blob->pack_length,
156 sizeof(char*));
157 VOID(my_write(myisam_log_file,pos,blob->length,MYF(0)));
160 if (!error)
161 error=my_lock(myisam_log_file,F_UNLCK,0L,F_TO_EOF,MYF(MY_SEEK_NOT_DONE));
162 pthread_mutex_unlock(&THR_LOCK_myisam);
163 my_errno=old_errno;