示例#1
0
static int
read_multi_line_sql (FILE * fp, T_STRING * t_str, char **linebuf, int *lineno,
                     T_STRING * sql_buf, T_STRING * cas_log_buf)
{
    while (1)
    {
        if (ut_get_line (fp, t_str, linebuf, lineno) <= 0)
            return -1;

        if (IS_CAS_LOG_CMD (*linebuf))
            return 0;

        if (t_string_add (sql_buf, *linebuf, strlen (*linebuf)) < 0)
        {
            fprintf (stderr, "malloc error\n");
            return -1;
        }
        if (t_string_add (cas_log_buf, *linebuf, strlen (*linebuf)) < 0)
        {
            fprintf (stderr, "malloc error\n");
            return -1;
        }
    }
}
示例#2
0
static int
read_bind_value (FILE * fp, T_STRING * t_str, char **linebuf, int *lineno,
                 T_STRING * cas_log_buf)
{
    char *msg_p;
    char is_bind_value;
    int linebuf_len;

    do
    {
        is_bind_value = 0;

        if (IS_CAS_LOG_CMD (*linebuf))
        {
            GET_MSG_START_PTR (msg_p, *linebuf);
            if (strncmp (msg_p, "bind ", 5) == 0)
                is_bind_value = 1;
        }
        else
        {
            is_bind_value = 1;
        }
        if (is_bind_value)
        {
            linebuf_len = t_string_len (t_str);
            if (t_string_add (cas_log_buf, *linebuf, linebuf_len) < 0)
                return -1;
        }
        else
        {
            return 0;
        }

        if (ut_get_line (fp, t_str, linebuf, lineno) <= 0)
            return -1;
    }
    while (1);
}
示例#3
0
int
ut_get_line (FILE * fp, T_STRING * t_str, char **out_str, int *lineno)
{
  char buf[1024];
  int out_str_len;
  bool is_first, bind_with_size = false;
  int tot_val_size = 0, info_size = 0;
  long position;

  t_string_clear (t_str);

  is_first = true;
  while (1)
    {
      memset (buf, 0, sizeof (buf));
      position = ftell (fp);
      if (fgets (buf, sizeof (buf), fp) == NULL)
	break;
      /* if it is (debug) line, skip it */
      if (strncmp (buf + 19, "(debug)", 7) == 0)
	{
	  continue;
	}
      if (is_first)
	{
	  bind_with_size = is_bind_with_size (buf, &tot_val_size, &info_size);
	  if (tot_val_size < 0 || info_size < 0 || (tot_val_size + info_size + 1) < 0)
	    {
	      fprintf (stderr, "log error\n");
	      return -1;
	    }
	  is_first = false;
	}

      if (bind_with_size)
	{
	  size_t rlen;
	  char *value = NULL;

	  value = (char *) MALLOC (info_size + tot_val_size + 1);
	  if (value == NULL)
	    {
	      fprintf (stderr, "memory allocation error.\n");
	      return -1;
	    }
	  fseek (fp, position, SEEK_SET);
	  rlen = fread ((void *) value, sizeof (char), info_size + tot_val_size, fp);
	  if (t_bind_string_add (t_str, value, info_size + tot_val_size, tot_val_size) < 0)
	    {
	      fprintf (stderr, "memory allocation error.\n");
	      FREE_MEM (value);
	      return -1;
	    }
	  FREE_MEM (value);
	  break;
	}
      else
	{
	  if (t_string_add (t_str, buf, strlen (buf)) < 0)
	    {
	      fprintf (stderr, "memory allocation error.\n");
	      return -1;
	    }
	  if (buf[sizeof (buf) - 2] == '\0' || buf[sizeof (buf) - 2] == '\n')
	    break;
	}
    }

  out_str_len = t_string_len (t_str);
  if (out_str)
    *out_str = t_string_str (t_str);
  if (lineno)
    *lineno = *lineno + 1;
  return out_str_len;
}
示例#4
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;
}