~drizzle-trunk/drizzle/jenkins-Drizzle-Builder-154

« back to all changes in this revision

Viewing changes to plugin/query_log/file.cc

  • Committer: Stewart Smith
  • Date: 2013-01-05 02:05:04 UTC
  • mto: This revision was merged to the branch mainline in revision 2615.
  • Revision ID: stewart@flamingspork.com-20130105020504-9kmifbhm5hcctgc7
fix query_log non thread safety by using normal file descriptor and write(2) system call.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
3
 *
4
4
 *  Copyright 2011 Daniel Nichter
 
5
 *  Copyright 2013 Stewart Smith
5
6
 *
6
7
 *  This program is free software: you can redistribute it and/or modify
7
8
 *  it under the terms of the GNU General Public License as published by
19
20
 
20
21
#include <config.h>
21
22
#include "file.h"
 
23
#include <sstream>
 
24
#include <sys/types.h>
 
25
#include <sys/stat.h>
 
26
#include <fcntl.h>
 
27
#include <unistd.h>
 
28
#include <string.h>
 
29
#include <errno.h>
22
30
 
23
31
using namespace std;
24
32
 
25
33
QueryLoggerFile::QueryLoggerFile()
26
34
{
27
 
  _fh.setf(ios::fixed, ios::floatfield);
28
 
  _fh.precision(6);
 
35
  _fd= -1;
29
36
}
30
37
 
31
38
QueryLoggerFile::~QueryLoggerFile()
35
42
 
36
43
bool QueryLoggerFile::logEvent(const event_t *event)
37
44
{
38
 
  if (_fh.is_open())
 
45
  ostringstream ss;
 
46
  ss.setf(ios::fixed, ios::floatfield);
 
47
  ss.precision(6);
 
48
 
 
49
  if (_fd != -1)
39
50
  {
40
 
    _fh << "# start_ts=" << event->ts
41
 
        << "\n"
42
 
        << "# session_id="     << event->session_id
43
 
        <<  " query_id="       << event->query_id
44
 
        <<  " rows_examined="  << event->rows_examined
45
 
        <<  " rows_sent="      << event->rows_sent
46
 
        <<  " tmp_tables="     << event->tmp_tables
47
 
        <<  " warnings="       << event->warnings
48
 
        << "\n"
49
 
        << "# execution_time=" << event->execution_time
50
 
        <<  " lock_time="      << event->lock_time
51
 
        <<  " session_time="   << event->session_time
52
 
        << "\n"
53
 
        << "# error=" << event->error << "\n"
54
 
        << "# schema=\"" << event->schema << "\"\n"
55
 
        << event->query << ";\n#"
56
 
        << endl;
 
51
    ss << "# start_ts=" << event->ts
 
52
       << "\n"
 
53
       << "# session_id="     << event->session_id
 
54
       <<  " query_id="       << event->query_id
 
55
       <<  " rows_examined="  << event->rows_examined
 
56
       <<  " rows_sent="      << event->rows_sent
 
57
       <<  " tmp_tables="     << event->tmp_tables
 
58
       <<  " warnings="       << event->warnings
 
59
       << "\n"
 
60
       << "# execution_time=" << event->execution_time
 
61
       <<  " lock_time="      << event->lock_time
 
62
       <<  " session_time="   << event->session_time
 
63
       << "\n"
 
64
       << "# error=" << event->error << "\n"
 
65
       << "# schema=\"" << event->schema << "\"\n"
 
66
       << event->query << ";\n#"
 
67
       << endl;
 
68
 
 
69
    string logmessage= ss.str();
 
70
 
 
71
    ssize_t r= write(_fd, logmessage.c_str(), logmessage.length());
 
72
    if (r != (ssize_t)logmessage.length())
 
73
    {
 
74
      fprintf(stderr, "query_log: Incomplete write() to log %d: %s\n",
 
75
            errno, strerror(errno));
 
76
      return true;
 
77
    }
57
78
  }
58
 
  return false; // success
 
79
  return false;
59
80
}
60
81
 
61
82
bool QueryLoggerFile::openLogFile(const char *file)
62
83
{
63
84
  closeLogFile();
64
85
 
65
 
  _fh.open(file, ios::app);
66
 
  if (_fh.fail())
67
 
    return true; // error
 
86
  _fd= open(file, O_CREAT|O_APPEND|O_WRONLY, 0600);
 
87
  if (_fd == -1)
 
88
  {
 
89
    fprintf(stderr, "query_log: Unable to lopen log file %d: %s\n",
 
90
            errno, strerror(errno));
 
91
    return true;
 
92
  }
68
93
 
69
 
  return false; // success
 
94
  return false;
70
95
}
71
96
 
72
97
bool QueryLoggerFile::closeLogFile()
73
98
{
74
 
  if (_fh.is_open())
 
99
  if (_fd != -1)
75
100
  {
76
 
    _fh.close();
77
 
    if (_fh.fail())
78
 
      return true;  // error
 
101
    int r= close(_fd);
 
102
    if (r == -1)
 
103
      return true;
79
104
  }
80
105
 
81
 
  return false;  // success
 
106
  return false;
82
107
}