Beispiel #1
0
int
query_info_add (T_QUERY_INFO * qi, int exec_time, int execute_res, char *filename, int lineno, char *end_date)
{
  int qi_idx = -1;
  int i;
  int retval;

  if (check_log_time (qi->start_date, end_date) < 0)
    return 0;

#ifdef MT_MODE
  MUTEX_LOCK (query_info_mutex);
#endif

#if 0
  if (qi->sql == NULL)
    goto query_info_add_end;
#endif

  for (i = 0; i < num_query_info; i++)
    {
      if (strcmp (query_info_arr[i].organized_sql, qi->organized_sql) == 0)
	{
	  qi_idx = i;
	  break;
	}
    }

  if (qi_idx == -1)
    {
      query_info_arr = (T_QUERY_INFO *) REALLOC (query_info_arr, sizeof (T_QUERY_INFO) * (num_query_info + 1));
      if (query_info_arr == NULL)
	{
	  fprintf (stderr, "%s\n", strerror (errno));
	  retval = -1;
	  goto query_info_add_end;
	}
      qi_idx = num_query_info;
      query_info_init (&query_info_arr[qi_idx]);
      query_info_arr[qi_idx].sql = strdup (qi->sql);
      query_info_arr[qi_idx].organized_sql = strdup (qi->organized_sql);
      num_query_info++;
    }

  if (exec_time < query_info_arr[qi_idx].min)
    {
      query_info_arr[qi_idx].min = exec_time;
    }
  if (exec_time > query_info_arr[qi_idx].max)
    {
      query_info_arr[qi_idx].max = exec_time;
      FREE_MEM (query_info_arr[qi_idx].cas_log);
      query_info_arr[qi_idx].cas_log = (char *) MALLOC (strlen (filename) + qi->cas_log_len + 20);
      if (query_info_arr[qi_idx].cas_log == NULL)
	{
	  fprintf (stderr, "%s\n", strerror (errno));
	  retval = -1;
	  goto query_info_add_end;
	}
      sprintf (query_info_arr[qi_idx].cas_log, "%s:%d\n", filename, lineno);
      query_info_arr[qi_idx].cas_log_len = strlen (query_info_arr[qi_idx].cas_log);
      memcpy (query_info_arr[qi_idx].cas_log + query_info_arr[qi_idx].cas_log_len, qi->cas_log, qi->cas_log_len);
      query_info_arr[qi_idx].cas_log_len += qi->cas_log_len;
    }
  query_info_arr[qi_idx].count++;
  query_info_arr[qi_idx].sum += exec_time;
  if (execute_res < 0)
    {
      query_info_arr[qi_idx].err_count++;
    }
  retval = 0;

query_info_add_end:

#ifdef MT_MODE
  MUTEX_UNLOCK (query_info_mutex);
#endif
  return retval;
}
Beispiel #2
0
int
query_info_add_ne (T_QUERY_INFO * qi, char *end_date)
{
#ifndef TEST
  /* query_info_arr_ne is used only in TEST mode */
  return 0;
#else
  int qi_idx = -1;
  int i;
  int retval;

  if (check_log_time (qi->start_date, end_date) < 0)
    {
      return 0;
    }

#ifdef MT_MODE
  MUTEX_LOCK (query_info_mutex);
#endif

  for (i = 0; i < num_query_info; i++)
    {
      if (strcmp (query_info_arr[i].organized_sql, qi->organized_sql) == 0)
	{
	  retval = 0;
	  goto query_info_add_ne_end;
	}
    }

  for (i = 0; i < num_query_info_ne; i++)
    {
      if (strcmp (query_info_arr_ne[i].organized_sql, qi->organized_sql) == 0)
	{
	  qi_idx = i;
	  break;
	}
    }

  if (qi_idx == -1)
    {
      query_info_arr_ne = (T_QUERY_INFO *) REALLOC (query_info_arr_ne, sizeof (T_QUERY_INFO) * (num_query_info_ne + 1));
      if (query_info_arr_ne == NULL)
	{
	  fprintf (stderr, "%s\n", strerror (errno));
	  retval = -1;
	  goto query_info_add_ne_end;
	}
      qi_idx = num_query_info_ne;
      query_info_init (&query_info_arr_ne[qi_idx]);
      query_info_arr_ne[qi_idx].sql = strdup (qi->sql);
      query_info_arr_ne[qi_idx].organized_sql = strdup (qi->organized_sql);
      num_query_info_ne++;
    }

  FREE_MEM (query_info_arr_ne[qi_idx].cas_log);
  query_info_arr_ne[qi_idx].cas_log = strdup (qi->cas_log);
  if (query_info_arr_ne[qi_idx].cas_log == NULL)
    {
      fprintf (stderr, "%s\n", strerror (errno));
      retval = -1;
      goto query_info_add_ne_end;
    }

  retval = 0;

query_info_add_ne_end:
#ifdef MT_MODE
  MUTEX_UNLOCK (query_info_mutex);
#endif
  return retval;
#endif /* define TEST */
}
Beispiel #3
0
static int
log_top (FILE * fp, char *filename)
{
    char *linebuf = NULL;
    T_QUERY_INFO query_info_buf[MAX_SRV_HANDLE];
    char client_msg_buf[CLIENT_MSG_BUF_SIZE];
    char connect_msg_buf[CONNECT_MSG_BUF_SIZE];
    T_STRING *cas_log_buf = NULL;
    T_STRING *sql_buf = NULL;
    T_STRING *linebuf_tstr = NULL;
    char prepare_buf[128];
    int i;
    char *msg_p;
    int lineno = 0;
    char read_flag = 1;
    char cur_date[32];

    for (i = 0; i < MAX_SRV_HANDLE; i++)
        query_info_init (&query_info_buf[i]);

    cas_log_buf = t_string_make (1);
    sql_buf = t_string_make (1);
    linebuf_tstr = t_string_make (1000);
    if (cas_log_buf == NULL || sql_buf == NULL || linebuf_tstr == NULL)
    {
        fprintf (stderr, "malloc error\n");
        goto log_top_err;
    }

    memset (client_msg_buf, 0, sizeof (client_msg_buf));
    memset (connect_msg_buf, 0, sizeof (connect_msg_buf));
    t_string_clear (cas_log_buf);
    t_string_clear (sql_buf);
    memset (prepare_buf, 0, sizeof (prepare_buf));

    while (1)
    {
        if (read_flag)
        {
            if (ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0)
            {
                break;
            }
        }
        read_flag = 1;

        if (!IS_CAS_LOG_CMD (linebuf))
            continue;

        if (strncmp (linebuf + 23, "END OF LOG", 10) == 0)
        {
            break;
        }

        GET_CUR_DATE_STR (cur_date, linebuf);
        GET_MSG_START_PTR (msg_p, linebuf);
        if (strncmp (msg_p, "execute", 7) == 0
                || strncmp (msg_p, "execute_all", 11) == 0
                || strncmp (msg_p, "execute_call", 12) == 0
                || strncmp (msg_p, "execute_batch", 13) == 0)
        {
            int qi_idx;
            char *query_p;
            int end_block_flag = 0;

            /*
             * execute log format:
             * <execute_cmd> srv_h_id <handle_id> <query_string>
             * bind <bind_index> : <TYPE> <VALUE>
             * <execute_cmd> [error:]<res> tuple <tuple_count> time <runtime_msec>
             * <execute_cmd>:
             *      execute, execute_all or execute_call
             *
             * ex)
             * execute srv_h_id 1 select 'a' from db_root
             * bind 1 : VARCHAR test str
             * execute 0 tuple 1 time 0.004
             */
            qi_idx = log_execute (query_info_buf, linebuf, &query_p);
            if (qi_idx < 0 || query_p == NULL)
                goto log_top_err;

            t_string_clear (sql_buf);
            t_string_clear (cas_log_buf);

            t_string_add (sql_buf, query_p, strlen (query_p));
            t_string_add (cas_log_buf, linebuf, strlen (linebuf));

            if (read_multi_line_sql (fp, linebuf_tstr, &linebuf, &lineno,
                                     sql_buf, cas_log_buf) < 0)
            {
                break;
            }
            if (read_bind_value (fp, linebuf_tstr, &linebuf, &lineno,
                                 cas_log_buf) < 0)
            {
                break;
            }

            GET_MSG_START_PTR (msg_p, linebuf);

            /* skip query_cancel */
            if (strncmp (msg_p, "query_cancel", 12) == 0)
            {
                if (ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0)
                {
                    break;
                }
            }

            if (strncmp (msg_p, "execute", 7) != 0)
            {
                while (1)
                {
                    if (ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0)
                    {
                        break;
                    }
                    GET_MSG_START_PTR (msg_p, linebuf);
                    if (strncmp (msg_p, "***", 3) == 0)
                    {
                        end_block_flag = 1;
                        if (ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <=
                                0)
                        {
                            /* ut_get_line error, just break; */
                            break;
                        }
                        break;
                    }
                }
            }

            if (end_block_flag == 1)
            {
                continue;
            }

            query_info_buf[qi_idx].sql =
                (char *) REALLOC (query_info_buf[qi_idx].sql,
                                  t_string_len (sql_buf) + 1);
            strcpy (query_info_buf[qi_idx].sql,
                    ut_trim (t_string_str (sql_buf)));

            GET_MSG_START_PTR (msg_p, linebuf);
            GET_CUR_DATE_STR (cur_date, linebuf);

            if (log_top_mode == MODE_MAX_HANDLE)
            {
                if (qi_idx >= mode_max_handle_lower_bound)
                {
                    if (query_info_add
                            (&query_info_buf[qi_idx], qi_idx + 1, 0, filename,
                             lineno, cur_date) < 0)
                        goto log_top_err;
                }
            }
            else
            {
                int execute_res, runtime;

                if (read_execute_end_msg (msg_p, &execute_res, &runtime) < 0)
                {
                    if (query_info_add_ne (&query_info_buf[qi_idx], cur_date) <
                            0)
                        goto log_top_err;
                    read_flag = 0;
                    continue;
                }

                if (t_string_add (cas_log_buf, linebuf, strlen (linebuf)) < 0)
                {
                    goto log_top_err;
                }
                query_info_buf[qi_idx].cas_log =
                    (char *) REALLOC (query_info_buf[qi_idx].cas_log,
                                      t_string_len (cas_log_buf) + 1);
                memcpy (query_info_buf[qi_idx].cas_log,
                        t_string_str (cas_log_buf), t_string_len (cas_log_buf));
                query_info_buf[qi_idx].cas_log_len = t_string_len (cas_log_buf);
                if (query_info_add
                        (&query_info_buf[qi_idx], runtime, execute_res, filename,
                         lineno, cur_date) < 0)
                {
                    goto log_top_err;
                }
            }
        }
    }

    for (i = 0; i < MAX_SRV_HANDLE; i++)
        query_info_clear (&query_info_buf[i]);

    t_string_free (cas_log_buf);
    t_string_free (sql_buf);
    t_string_free (linebuf_tstr);
    return 0;

log_top_err:
    t_string_free (cas_log_buf);
    t_string_free (sql_buf);
    t_string_free (linebuf_tstr);
    return -1;
}