CUBRID Engine  latest
broker_log_top.c
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 
20 /*
21  * broker_log_top.c -
22  */
23 
24 #ident "$Id$"
25 
26 #include <stdio.h>
27 #include <errno.h>
28 #include <string.h>
29 #include <stdlib.h>
30 #include <assert.h>
31 #if !defined(WINDOWS)
32 #include <unistd.h>
33 #endif
34 
35 #ifdef MT_MODE
36 #include <pthread.h>
37 #endif
38 
39 #include "cubrid_getopt.h"
40 #include "cas_common.h"
41 #include "cas_query_info.h"
42 #include "broker_log_time.h"
43 #include "broker_log_sql_list.h"
44 #include "log_top_string.h"
45 #include "broker_log_top.h"
46 #include "broker_log_util.h"
47 
48 #if defined (SUPPRESS_STRLEN_WARNING)
49 #define strlen(s1) ((int) strlen(s1))
50 #endif /* defined (SUPPRESS_STRLEN_WARNING) */
51 
52 #define MAX_SRV_HANDLE 3000
53 #define CLIENT_MSG_BUF_SIZE 1024
54 #define CONNECT_MSG_BUF_SIZE 1024
55 
56 #ifdef MT_MODE
57 typedef struct t_work_msg T_WORK_MSG;
58 struct t_work_msg
59 {
60  FILE *fp;
61  char *filename;
62 };
63 #endif
64 
65 static int log_top_query (int argc, char *argv[], int arg_start);
66 static int log_top (FILE * fp, char *filename, long start_offset, long end_offset);
67 static int log_execute (T_QUERY_INFO * qi, char *linebuf, char **query_p);
68 static int get_args (int argc, char *argv[]);
69 #if defined(WINDOWS)
70 static int get_file_count (int argc, char *argv[], int arg_start);
71 static int get_file_list (char *list[], int size, int argc, char *argv[], int arg_start);
72 static char **alloc_file_list (int size);
73 static void free_file_list (char **list, int size);
74 #endif
75 #ifdef MT_MODE
76 static void *thr_main (void *arg);
77 #endif
78 static int read_multi_line_sql (FILE * fp, T_STRING * t_str, char **linebuf, int *lineno, T_STRING * sql_buf,
79  T_STRING * cas_log_buf);
80 static int read_execute_end_msg (char *msg_p, int *res_code, int *runtime_msec);
81 static int read_bind_value (FILE * fp, T_STRING * t_str, char **linebuf, int *lineno, T_STRING * cas_log_buf);
82 static int search_offset (FILE * fp, char *string, long *offset, bool start);
83 static char *organize_query_string (const char *sql);
84 
86 
87 static char *sql_info_file = NULL;
89 static char mode_tran = 0;
90 static char from_date[128] = "";
91 static char to_date[128] = "";
92 
93 #ifdef MT_MODE
94 static int num_thread = 5;
95 static int process_flag = 1;
96 static T_WORK_MSG *work_msg;
97 #endif
98 int
99 main (int argc, char *argv[])
100 {
101  int arg_start;
102  int error = 0;
103 #if defined(WINDOWS)
104  int file_cnt = -1;
105  int get_cnt = 0;
106  char **file_list = NULL;
107 #endif
108 
109 
110  arg_start = get_args (argc, argv);
111  if (arg_start < 0)
112  {
113  return -1;
114  }
115 
116 #if defined(WINDOWS)
117  file_cnt = get_file_count (argc, argv, arg_start);
118  if (file_cnt <= 0)
119  {
120  return -1;
121  }
122 
123  file_list = alloc_file_list (file_cnt);
124  if (file_list == NULL)
125  {
126  return -1;
127  }
128 
129  get_cnt = get_file_list (file_list, file_cnt, argc, argv, arg_start);
130  if (get_cnt > file_cnt)
131  {
132  get_cnt = file_cnt;
133  }
134 
135  if (mode_tran)
136  {
137  error = log_top_tran (get_cnt, file_list, 0);
138  }
139  else
140  {
141  error = log_top_query (get_cnt, file_list, 0);
142  }
143 
144  free_file_list (file_list, file_cnt);
145 #else
146  if (mode_tran)
147  {
148  error = log_top_tran (argc, argv, arg_start);
149  }
150  else
151  {
152  error = log_top_query (argc, argv, arg_start);
153  }
154 #endif
155 
156  return error;
157 }
158 
159 #if defined(WINDOWS)
160 int
161 get_file_count (int argc, char *argv[], int arg_start)
162 {
163  int i;
164  int count = 0;
165  HANDLE handle;
166  WIN32_FIND_DATA find_data;
167 
168  for (i = arg_start; i < argc; i++)
169  {
170  handle = FindFirstFile (argv[i], &find_data);
171  if (handle == INVALID_HANDLE_VALUE)
172  {
173  fprintf (stderr, "No such file or directory[%s]\n", argv[i]);
174  return -1;
175  }
176  do
177  {
178  /* skip directory */
179  if ((find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
180  {
181  count++;
182  }
183  }
184  while (FindNextFile (handle, &find_data));
185 
186  FindClose (handle);
187  }
188 
189  return count;
190 }
191 
192 int
193 get_file_list (char *list[], int size, int argc, char *argv[], int arg_start)
194 {
195  int i;
196  int index = 0;
197  HANDLE handle;
198  WIN32_FIND_DATA find_data;
199  char *slash_pos, *pos1, *pos2;
200  char prefix[MAX_PATH] = { 0 };
201 
202  assert (list != NULL);
203 
204  for (i = arg_start; i < argc; i++)
205  {
206  handle = FindFirstFile (argv[i], &find_data);
207  if (handle == INVALID_HANDLE_VALUE)
208  {
209  continue;
210  }
211 
212  /* find the prefix of the matched file */
213  pos1 = strrchr (argv[i], '\\');
214  pos2 = strrchr (argv[i], '/');
215  slash_pos = MAX (pos1, pos2);
216  if (slash_pos != NULL)
217  {
218  strncpy (prefix, argv[i], MAX_PATH);
219  prefix[slash_pos - argv[i] + 1] = '\0';
220  }
221 
222  do
223  {
224  /* skip directory */
225  if (index < size && !(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
226  {
227  assert (list[index] != NULL);
228  if (slash_pos != NULL)
229  {
230  snprintf (list[index], MAX_PATH, "%s%s", prefix, find_data.cFileName);
231  }
232  else
233  {
234  strncpy (list[index], find_data.cFileName, MAX_PATH);
235  }
236  index++;
237  }
238  }
239  while (FindNextFile (handle, &find_data));
240 
241  FindClose (handle);
242  }
243 
244  return index;
245 }
246 
247 char **
248 alloc_file_list (int size)
249 {
250  int i, j;
251  char **file_list = NULL;
252 
253  assert (size > 0);
254 
255  file_list = (char **) MALLOC (sizeof (char *) * size);
256  if (file_list == NULL)
257  {
258  fprintf (stderr, "fail memory allocation\n");
259  return NULL;
260  }
261 
262  for (i = 0; i < size; i++)
263  {
264  file_list[i] = (char *) MALLOC (MAX_PATH);
265 
266  if (file_list[i] == NULL)
267  {
268  fprintf (stderr, "fail memory allocation\n");
269  for (j = 0; j < i; j++)
270  {
271  FREE_MEM (file_list[j]);
272  }
273  FREE_MEM (file_list);
274  return NULL;
275  }
276  }
277 
278  return file_list;
279 }
280 
281 void
282 free_file_list (char **list, int size)
283 {
284  int i;
285  assert (list != NULL);
286 
287  for (i = 0; i < size; i++)
288  {
289  if (list[i] == NULL)
290  {
291  break;
292  }
293  FREE_MEM (list[i]);
294  }
295  FREE_MEM (list);
296 }
297 #endif
298 
299 int
300 get_file_offset (char *filename, long *start_offset, long *end_offset)
301 {
302  FILE *fp;
303 
304  if (!start_offset || !end_offset)
305  {
306  return -1;
307  }
308 
309  fp = fopen (filename, "r");
310  if (fp == NULL)
311  {
312  return -1;
313  }
314 
315  if (from_date[0] == '\0' || search_offset (fp, from_date, start_offset, true) < 0)
316  {
317  *start_offset = -1;
318  }
319 
320  if (to_date[0] == '\0' || search_offset (fp, to_date, end_offset, false) < 0)
321  {
322  *end_offset = -1;
323  }
324 
325  fclose (fp);
326  return 0;
327 }
328 
329 int
330 check_log_time (char *start_date, char *end_date)
331 {
332  if (from_date[0])
333  {
334  if (strncmp (end_date, from_date, DATE_STR_LEN) < 0)
335  return -1;
336  }
337  if (to_date[0])
338  {
339  if (strncmp (to_date, start_date, DATE_STR_LEN) < 0)
340  return -1;
341  }
342 
343  return 0;
344 }
345 
346 static int
347 log_top_query (int argc, char *argv[], int arg_start)
348 {
349  FILE *fp;
350  char *filename;
351  int i;
352  int error = 0;
353  long start_offset, end_offset;
354 #ifdef MT_MODE
355  T_THREAD thrid;
356  int j;
357 #endif
358 
359 #ifdef MT_MODE
360  query_info_mutex_init ();
361 #endif
362 
363 #ifdef MT_MODE
364  work_msg = MALLOC (sizeof (T_WORK_MSG) * num_thread);
365  if (work_msg == NULL)
366  {
367  fprintf (stderr, "malloc error\n");
368  return -1;
369  }
370  memset (work_msg, 0, sizeof (T_WORK_MSG *) * num_thread);
371 
372  for (i = 0; i < num_thread; i++)
373  THREAD_BEGIN (thrid, thr_main, (void *) i);
374 #endif
375 
376  for (i = arg_start; i < argc; i++)
377  {
378  filename = argv[i];
379  fprintf (stdout, "%s\n", filename);
380 
381 #if defined(WINDOWS)
382  fp = fopen (filename, "rb");
383 #else
384  fp = fopen (filename, "r");
385 #endif
386  if (fp == NULL)
387  {
388  fprintf (stderr, "%s[%s]\n", strerror (errno), filename);
389 #ifdef MT_MODE
390  process_flag = 0;
391 #endif
392  return -1;
393  }
394 
395  if (get_file_offset (filename, &start_offset, &end_offset) < 0)
396  {
397  start_offset = end_offset = -1;
398  }
399 
400 #ifdef MT_MODE
401  while (1)
402  {
403  for (j = 0; j < num_thread; j++)
404  {
405  if (work_msg[j].filename == NULL)
406  {
407  work_msg[j].fp = fp;
408  work_msg[j].filename = filename;
409  break;
410  }
411  }
412  if (j == num_thread)
413  SLEEP_MILISEC (1, 0);
414  else
415  break;
416  }
417 #else
418  error = log_top (fp, filename, start_offset, end_offset);
419  fclose (fp);
420  if (error == LT_INVAILD_VERSION)
421  {
422  return error;
423  }
424 #endif
425  }
426 
427 #ifdef MT_MODE
428  process_flag = 0;
429 #endif
430 
431  if (sql_info_file != NULL)
432  {
433  fprintf (stdout, "read sql info file...\n");
434  if (sql_list_make (sql_info_file) < 0)
435  {
436  return -1;
437  }
438  }
439 
440  fprintf (stdout, "print results...\n");
441  query_info_print ();
442 
443  return 0;
444 }
445 
446 #ifdef MT_MODE
447 static void *
448 thr_main (void *arg)
449 {
450  int self_index = (int) arg;
451 
452  while (process_flag)
453  {
454  if (work_msg[self_index].filename == NULL)
455  {
456  SLEEP_MILISEC (0, 100);
457  }
458  else
459  {
460  log_top (work_msg[self_index].fp, work_msg[self_index].filename);
461  fclose (work_msg[self_index].fp);
462  work_msg[self_index].fp = NULL;
463  work_msg[self_index].filename = NULL;
464  }
465  }
466  return NULL;
467 }
468 #endif
469 
470 static int
471 log_top (FILE * fp, char *filename, long start_offset, long end_offset)
472 {
473  char *linebuf = NULL;
474  T_QUERY_INFO query_info_buf[MAX_SRV_HANDLE];
475  char client_msg_buf[CLIENT_MSG_BUF_SIZE];
476  char connect_msg_buf[CONNECT_MSG_BUF_SIZE];
477  T_STRING *cas_log_buf = NULL;
478  T_STRING *sql_buf = NULL;
479  T_STRING *linebuf_tstr = NULL;
480  char prepare_buf[128];
481  int i;
482  char *msg_p;
483  int lineno = 0;
484  int log_type = 0;
485  char read_flag = 1;
486  char cur_date[DATE_STR_LEN + 1];
487  char start_date[DATE_STR_LEN + 1];
488  start_date[0] = '\0';
489 
490  for (i = 0; i < MAX_SRV_HANDLE; i++)
491  {
492  query_info_init (&query_info_buf[i]);
493  }
494 
495  cas_log_buf = t_string_make (1);
496 
497  sql_buf = t_string_make (1);
498  linebuf_tstr = t_string_make (1000);
499  if (cas_log_buf == NULL || sql_buf == NULL || linebuf_tstr == NULL)
500  {
501  fprintf (stderr, "malloc error\n");
502  goto log_top_err;
503  }
504 
505  memset (client_msg_buf, 0, sizeof (client_msg_buf));
506  memset (connect_msg_buf, 0, sizeof (connect_msg_buf));
507  t_string_clear (cas_log_buf);
508  t_string_clear (sql_buf);
509  memset (prepare_buf, 0, sizeof (prepare_buf));
510 
511  if (start_offset != -1)
512  {
513  fseek (fp, start_offset, SEEK_SET);
514  }
515 
516  while (1)
517  {
518  if (end_offset != -1)
519  {
520  if (ftell (fp) > end_offset)
521  {
522  break;
523  }
524  }
525 
526  if (read_flag)
527  {
528  if (ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0)
529  {
530  break;
531  }
532  }
533  read_flag = 1;
534 
535  log_type = is_cas_log (linebuf);
536  if (log_type == CAS_LOG_BEGIN_WITH_MONTH)
537  {
538  fprintf (stderr, "invaild version of log file\n");
539  t_string_free (cas_log_buf);
540  t_string_free (sql_buf);
541  t_string_free (linebuf_tstr);
542  return LT_INVAILD_VERSION;
543  }
544  else if (log_type != CAS_LOG_BEGIN_WITH_YEAR)
545  {
546  continue;
547  }
548 
549  if (strncmp (linebuf + 23, "END OF LOG", 10) == 0)
550  {
551  break;
552  }
553 
554  GET_CUR_DATE_STR (cur_date, linebuf);
555  if (start_date[0] == '\0')
556  {
557  strcpy (start_date, cur_date);
558  }
559 
560  msg_p = get_msg_start_ptr (linebuf);
561  if (strncmp (msg_p, "execute", 7) == 0 || strncmp (msg_p, "execute_all", 11) == 0
562  || strncmp (msg_p, "execute_call", 12) == 0 || strncmp (msg_p, "execute_batch", 13) == 0)
563  {
564  int qi_idx;
565  char *query_p;
566  int end_block_flag = 0;
567 
568  /*
569  * execute log format:
570  * <execute_cmd> srv_h_id <handle_id> <query_string>
571  * bind <bind_index> : <TYPE> <VALUE>
572  * <execute_cmd> [error:]<res> tuple <tuple_count> time <runtime_msec>
573  * <execute_cmd>:
574  * execute, execute_all or execute_call
575  *
576  * ex)
577  * execute srv_h_id 1 select 'a' from db_root
578  * bind 1 : VARCHAR test str
579  * execute 0 tuple 1 time 0.004
580  */
581  qi_idx = log_execute (query_info_buf, linebuf, &query_p);
582  if (qi_idx < 0 || query_p == NULL)
583  goto log_top_err;
584 
585  t_string_clear (sql_buf);
586  t_string_clear (cas_log_buf);
587 
588  t_string_add (sql_buf, query_p, strlen (query_p));
589  t_string_add (cas_log_buf, linebuf, strlen (linebuf));
590 
591  if (read_multi_line_sql (fp, linebuf_tstr, &linebuf, &lineno, sql_buf, cas_log_buf) < 0)
592  {
593  break;
594  }
595  if (read_bind_value (fp, linebuf_tstr, &linebuf, &lineno, cas_log_buf) < 0)
596  {
597  break;
598  }
599 
600  msg_p = get_msg_start_ptr (linebuf);
601 
602  /* skip query_cancel */
603  if (strncmp (msg_p, "query_cancel", 12) == 0)
604  {
605  if (ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0)
606  {
607  break;
608  }
609  }
610 
611  if (strncmp (msg_p, "execute", 7) != 0)
612  {
613  while (1)
614  {
615  if (ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0)
616  {
617  break;
618  }
619 
620  msg_p = get_msg_start_ptr (linebuf);
621  if (strncmp (msg_p, "***", 3) == 0)
622  {
623  end_block_flag = 1;
624  if (ut_get_line (fp, linebuf_tstr, &linebuf, &lineno) <= 0)
625  {
626  /* ut_get_line error, just break; */
627  break;
628  }
629  break;
630  }
631  }
632  }
633 
634  if (end_block_flag == 1)
635  {
636  continue;
637  }
638 
639  query_info_buf[qi_idx].sql = (char *) REALLOC (query_info_buf[qi_idx].sql, t_string_len (sql_buf) + 1);
640 
641  strcpy (query_info_buf[qi_idx].sql, ut_trim (t_string_str (sql_buf)));
642  query_info_buf[qi_idx].organized_sql = organize_query_string (query_info_buf[qi_idx].sql);
643 
644  msg_p = get_msg_start_ptr (linebuf);
645  GET_CUR_DATE_STR (cur_date, linebuf);
646 
647  strcpy (query_info_buf[qi_idx].start_date, start_date);
648 
650  {
651  if (qi_idx >= mode_max_handle_lower_bound)
652  {
653  if (query_info_add (&query_info_buf[qi_idx], qi_idx + 1, 0, filename, lineno, cur_date) < 0)
654  {
655  goto log_top_err;
656  }
657  }
658  }
659  else
660  {
661  int execute_res, runtime;
662 
663  /* set cas_log to query info */
664  if (t_string_add (cas_log_buf, linebuf, strlen (linebuf)) < 0)
665  {
666  goto log_top_err;
667  }
668 
669  query_info_buf[qi_idx].cas_log =
670  (char *) REALLOC (query_info_buf[qi_idx].cas_log, t_string_len (cas_log_buf) + 1);
671 
672  memcpy (query_info_buf[qi_idx].cas_log, t_string_str (cas_log_buf), t_string_len (cas_log_buf));
673 
674  query_info_buf[qi_idx].cas_log_len = t_string_len (cas_log_buf);
675 
676 
677  /* read execute info & if fail add to query_info_arr_ne */
678  if (read_execute_end_msg (msg_p, &execute_res, &runtime) < 0)
679  {
680  if (query_info_add_ne (&query_info_buf[qi_idx], cur_date) < 0)
681  {
682  goto log_top_err;
683  }
684 
685  read_flag = 0;
686  continue;
687  }
688 
689  /* add to query_info_arr */
690  if (query_info_add (&query_info_buf[qi_idx], runtime, execute_res, filename, lineno, cur_date) < 0)
691  {
692  goto log_top_err;
693  }
694  }
695  }
696  start_date[0] = '\0';
697  }
698 
699  for (i = 0; i < MAX_SRV_HANDLE; i++)
700  {
701  query_info_clear (&query_info_buf[i]);
702  }
703 
704  t_string_free (cas_log_buf);
705  t_string_free (sql_buf);
706  t_string_free (linebuf_tstr);
707  return LT_NO_ERROR;
708 
709 log_top_err:
710  t_string_free (cas_log_buf);
711  t_string_free (sql_buf);
712  t_string_free (linebuf_tstr);
713  return LT_OTHER_ERROR;
714 }
715 
716 static int
717 log_execute (T_QUERY_INFO * qi, char *linebuf, char **query_p)
718 {
719  char *p;
720  int exec_h_id;
721 
722  p = strstr (linebuf, "srv_h_id ");
723  if (p == NULL)
724  {
725  fprintf (stderr, "log error[%s]\n", linebuf);
726  return -1;
727  }
728  exec_h_id = atoi (p + 9);
729  *query_p = strchr (p + 9, ' ');
730  if (*query_p)
731  *query_p = *query_p + 1;
732 
733  if (exec_h_id <= 0 || exec_h_id > MAX_SRV_HANDLE)
734  {
735  fprintf (stderr, "log error. exec id = %d\n", exec_h_id);
736  return -1;
737  }
738  exec_h_id--;
739 
740  return exec_h_id;
741 }
742 
743 static int
744 get_args (int argc, char *argv[])
745 {
746  int c;
747 
748  while ((c = getopt (argc, argv, "tq:h:F:T:")) != EOF)
749  {
750  switch (c)
751  {
752  case 't':
753  mode_tran = 1;
754  break;
755  case 'q':
757  break;
758  case 'h':
760  break;
761  case 'F':
763  {
764  goto date_format_err;
765  }
766  break;
767  case 'T':
769  {
770  goto date_format_err;
771  }
772  break;
773  default:
774  goto getargs_err;
775  }
776  }
777 
780 
781  if (optind < argc)
782  return optind;
783 
784 getargs_err:
785  fprintf (stderr, "%s [-t] [-F <from date>] [-T <to date>] <log_file> ...\n", argv[0]);
786  return -1;
787 date_format_err:
788  fprintf (stderr, "invalid date. valid date format is yy-mm-dd hh:mm:ss.\n");
789  return -1;
790 }
791 
792 static int
793 read_multi_line_sql (FILE * fp, T_STRING * t_str, char **linebuf, int *lineno, T_STRING * sql_buf,
794  T_STRING * cas_log_buf)
795 {
796  while (1)
797  {
798  if (ut_get_line (fp, t_str, linebuf, lineno) <= 0)
799  {
800  return -1;
801  }
802 
803  if (is_cas_log (*linebuf) == CAS_LOG_BEGIN_WITH_YEAR)
804  {
805  return 0;
806  }
807 
808  if (t_string_add (sql_buf, *linebuf, strlen (*linebuf)) < 0)
809  {
810  fprintf (stderr, "malloc error\n");
811  return -1;
812  }
813  if (t_string_add (cas_log_buf, *linebuf, strlen (*linebuf)) < 0)
814  {
815  fprintf (stderr, "malloc error\n");
816  return -1;
817  }
818  }
819 }
820 
821 static int
822 read_bind_value (FILE * fp, T_STRING * t_str, char **linebuf, int *lineno, T_STRING * cas_log_buf)
823 {
824  char *msg_p;
825  char is_bind_value;
826  int linebuf_len;
827 
828  do
829  {
830  is_bind_value = 0;
831 
832  if (is_cas_log (*linebuf) == CAS_LOG_BEGIN_WITH_YEAR)
833  {
834  msg_p = get_msg_start_ptr (*linebuf);
835  if (strncmp (msg_p, "bind ", 5) == 0)
836  is_bind_value = 1;
837  }
838  else
839  {
840  is_bind_value = 1;
841  }
842  if (is_bind_value)
843  {
844  linebuf_len = t_string_len (t_str);
845  if (t_string_add (cas_log_buf, *linebuf, linebuf_len) < 0)
846  {
847  return -1;
848  }
849  }
850  else
851  {
852  return 0;
853  }
854 
855  if (ut_get_line (fp, t_str, linebuf, lineno) <= 0)
856  {
857  return -1;
858  }
859  }
860  while (1);
861 }
862 
863 static int
864 read_execute_end_msg (char *msg_p, int *res_code, int *runtime_msec)
865 {
866  char *p, *next_p;
867  int sec, msec;
868  int tuple_count;
869  int result = 0;
870  int val;
871 
872  p = strchr (msg_p, ' ');
873  if (p == NULL)
874  {
875  return -1;
876  }
877  p++;
878  if (strncmp (p, "error:", 6) == 0)
879  {
880  p += 6;
881  }
882 
883  result = str_to_int32 (&val, &next_p, p, 10);
884  if (result != 0)
885  {
886  return -1;
887  }
888  *res_code = val;
889 
890  p = next_p + 1;
891  if (strncmp (p, "tuple ", 6) != 0)
892  {
893  return -1;
894  }
895 
896  p += 6;
897 
898  result = str_to_int32 (&val, &next_p, p, 10);
899  if (result != 0)
900  {
901  return -1;
902  }
903  tuple_count = val;
904 
905  p = next_p + 1;
906  if (strncmp (p, "time ", 5) != 0)
907  {
908  return -1;
909  }
910  p += 5;
911 
912  sscanf (p, "%d.%d", &sec, &msec);
913  *runtime_msec = sec * 1000 + msec;
914 
915  return 0;
916 }
917 
918 static int
919 search_offset (FILE * fp, char *string, long *offset, bool start)
920 {
921  off_t start_ptr = 0;
922  off_t end_ptr = 0;
923  off_t cur_ptr;
924  off_t old_start_ptr = 0;
925  bool old_start_saved = false;
926  long tmp_offset = -1;
927  struct stat stat_buf;
928  char *linebuf = NULL;
929  int line_no = 0;
930  T_STRING *linebuf_tstr = NULL;
931  int ret_val;
932 
933  assert (offset != NULL);
934 
935  *offset = -1;
936 
937  if (fstat (fileno (fp), &stat_buf) < 0)
938  {
939  return -1;
940  }
941 
942  end_ptr = stat_buf.st_size;
943 
944  linebuf_tstr = t_string_make (1000);
945  if (linebuf_tstr == NULL)
946  {
947  return -1;
948  }
949 
950  cur_ptr = 0;
951 
952  while (true)
953  {
954  if (fseek (fp, cur_ptr, SEEK_SET) < 0)
955  {
956  goto error;
957  }
958 
959  while (ut_get_line (fp, linebuf_tstr, &linebuf, &line_no) > 0)
960  {
961  if (is_cas_log (linebuf) == CAS_LOG_BEGIN_WITH_YEAR)
962  {
963  break;
964  }
965  cur_ptr = ftell (fp);
966 
967  if (cur_ptr >= end_ptr)
968  {
969  tmp_offset = old_start_saved ? old_start_ptr : start_ptr;
970  goto end_loop;
971  }
972  }
973 
974  ret_val = strncmp (linebuf, string, DATE_STR_LEN);
975 
976  if (ret_val < 0)
977  {
978  old_start_saved = true;
979  old_start_ptr = start_ptr;
980  start_ptr = ftell (fp);
981  }
982 
983  if (ret_val >= 0)
984  {
985  if (ret_val == 0 && old_start_saved)
986  {
987  tmp_offset = start_ptr;
988  goto end_loop;
989  }
990  else
991  {
992  old_start_saved = false;
993  end_ptr = cur_ptr;
994  }
995  }
996 
997  cur_ptr = start_ptr + (end_ptr - start_ptr) / 2;
998  if (cur_ptr <= start_ptr)
999  {
1000  tmp_offset = start_ptr;
1001  goto end_loop;
1002  }
1003  }
1004 
1005 end_loop:
1006  if (fseek (fp, tmp_offset, SEEK_SET) < 0)
1007  {
1008  goto error;
1009  }
1010 
1011  while (ut_get_line (fp, linebuf_tstr, &linebuf, &line_no) > 0)
1012  {
1013  if (start)
1014  {
1015  /* the first line of the time */
1016  if (strncmp (linebuf, string, DATE_STR_LEN) >= 0)
1017  {
1018  break;
1019  }
1020  }
1021  else
1022  {
1023  /* the last line of the time */
1024  if (strncmp (linebuf, string, DATE_STR_LEN) > 0)
1025  {
1026  break;
1027  }
1028  }
1029  tmp_offset = ftell (fp);
1030  }
1031 
1032  *offset = tmp_offset;
1033  t_string_free (linebuf_tstr);
1034  return 0;
1035 
1036 error:
1037  t_string_free (linebuf_tstr);
1038  return -1;
1039 }
1040 
1041 static char *
1042 organize_query_string (const char *sql)
1043 {
1044  typedef enum
1045  {
1046  SQL_TOKEN_NONE = 0,
1047  SQL_TOKEN_DOUBLE_QUOTE,
1048  SQL_TOKEN_SINGLE_QUOTE,
1049  SQL_TOKEN_SQL_COMMENT,
1050  SQL_TOKEN_C_COMMENT,
1051  SQL_TOKEN_CPP_COMMENT
1052  } SQL_TOKEN;
1053 
1054  SQL_TOKEN token = SQL_TOKEN_NONE;
1055  int token_len = 0;
1056  char *p = NULL;
1057  const char *q = NULL;
1058  char *organized_sql = NULL;
1059  bool need_copy_token = true;
1060 
1061  organized_sql = (char *) malloc (strlen (sql) + 1);
1062  if (organized_sql == NULL)
1063  {
1064  return NULL;
1065  }
1066 
1067  p = organized_sql;
1068  q = sql;
1069 
1070  while (*q != '\0')
1071  {
1072  need_copy_token = true;
1073  token_len = 1;
1074 
1075  if (token == SQL_TOKEN_NONE)
1076  {
1077  if (*q == '\'' && (q == sql || *(q - 1) != '\\'))
1078  {
1079  token = SQL_TOKEN_SINGLE_QUOTE;
1080  }
1081  else if (*q == '"' && (q == sql || *(q - 1) != '\\'))
1082  {
1083  token = SQL_TOKEN_DOUBLE_QUOTE;
1084  }
1085  else if (*q == '-' && *(q + 1) == '-')
1086  {
1087  need_copy_token = false;
1088  token = SQL_TOKEN_SQL_COMMENT;
1089  token_len = 2;
1090  }
1091  else if (*q == '/' && *(q + 1) == '*')
1092  {
1093  need_copy_token = false;
1094  token = SQL_TOKEN_C_COMMENT;
1095  token_len = 2;
1096  }
1097  else if (*q == '/' && *(q + 1) == '/')
1098  {
1099  need_copy_token = false;
1100  token = SQL_TOKEN_CPP_COMMENT;
1101  token_len = 2;
1102  }
1103  }
1104  else
1105  {
1106  need_copy_token = false;
1107 
1108  if (token == SQL_TOKEN_SINGLE_QUOTE)
1109  {
1110  need_copy_token = true;
1111 
1112  if (*q == '\'' && *(q - 1) != '\\')
1113  {
1114  token = SQL_TOKEN_NONE;
1115  }
1116  }
1117  else if (token == SQL_TOKEN_DOUBLE_QUOTE)
1118  {
1119  need_copy_token = true;
1120 
1121  if (*q == '"' && *(q - 1) != '\\')
1122  {
1123  token = SQL_TOKEN_NONE;
1124  }
1125  }
1126  else if ((token == SQL_TOKEN_SQL_COMMENT || token == SQL_TOKEN_CPP_COMMENT) && *q == '\n')
1127  {
1128  token = SQL_TOKEN_NONE;
1129  }
1130  else if (token == SQL_TOKEN_C_COMMENT && *q == '*' && *(q + 1) == '/')
1131  {
1132  token = SQL_TOKEN_NONE;
1133  token_len = 2;
1134  }
1135  }
1136 
1137  if (need_copy_token)
1138  {
1139  memcpy (p, q, token_len);
1140  p += token_len;
1141  }
1142 
1143  q += token_len;
1144  }
1145 
1146  *p = '\0';
1147 
1148  return organized_sql;
1149 }
#define SLEEP_MILISEC(sec, msec)
Definition: util_func.h:40
DllImport int optind
void * handle
int sql_list_make(char *list_file)
#define DATE_STR_LEN
T_LOG_TOP_MODE log_top_mode
DllImport char * optarg
#define CAS_LOG_BEGIN_WITH_YEAR
int t_string_add(T_STRING *t_str, char *str, int str_len)
char * get_msg_start_ptr(char *linebuf)
int getopt(int, char *const *, const char *)
#define CONNECT_MSG_BUF_SIZE
int argc
Definition: dynamic_load.c:951
static int get_args(int argc, char *argv[])
#define THREAD_BEGIN(THR_ID, FUNC, ARG)
Definition: cas_common.h:126
int query_info_add(T_QUERY_INFO *qi, int exec_time, int execute_res, char *filename, int lineno, char *end_date)
static int log_top_query(int argc, char *argv[], int arg_start)
void query_info_print(void)
static THREAD_FUNC thr_main(void *arg)
Definition: cas_runner.c:579
void t_string_free(T_STRING *t_str)
int log_top_tran(int argc, char *argv[], int arg_start)
static int process_flag
Definition: broker.c:333
#define CLIENT_MSG_BUF_SIZE
int t_string_len(T_STRING *t_str)
int main(int argc, char *argv[])
#define CAS_LOG_BEGIN_WITH_MONTH
static char to_date[128]
char * organized_sql
static int read_bind_value(FILE *fp, T_STRING *t_str, char **linebuf, int *lineno, T_STRING *cas_log_buf)
char * t_string_str(T_STRING *t_str)
#define assert(x)
static char * organize_query_string(const char *sql)
static int mode_max_handle_lower_bound
static char mode_tran
int is_cas_log(char *str)
static char * sql_info_file
#define NULL
Definition: freelistheap.h:34
int str_to_int32(int *ret_p, char **end_p, const char *str_p, int base)
Definition: porting.c:2346
#define GET_CUR_DATE_STR(BUF, LINEBUF)
#define MALLOC(SIZE)
Definition: cas_common.h:53
#define FREE_MEM(PTR)
Definition: cas_common.h:58
void query_info_init(T_QUERY_INFO *qi)
static int log_execute(T_QUERY_INFO *qi, char *linebuf, char **query_p)
#define MAX_SRV_HANDLE
int count(int &result, const cub_regex_object &reg, const std::string &src, const int position, const INTL_CODESET codeset)
enum t_log_top_mode T_LOG_TOP_MODE
void query_info_clear(T_QUERY_INFO *qi)
static void error(const char *msg)
Definition: gencat.c:331
static int search_offset(FILE *fp, char *string, long *offset, bool start)
const char ** argv
Definition: dynamic_load.c:952
#define strlen(s1)
Definition: intl_support.c:43
static int log_top(FILE *fp, char *filename, long start_offset, long end_offset)
static int num_thread
Definition: cas_runner.c:167
int i
Definition: dynamic_load.c:954
int query_info_add_ne(T_QUERY_INFO *qi, char *end_date)
T_STRING * t_string_make(int init_size)
int check_log_time(char *start_date, char *end_date)
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)
static int read_execute_end_msg(char *msg_p, int *res_code, int *runtime_msec)
int get_file_offset(char *filename, long *start_offset, long *end_offset)
char * ut_trim(char *str)
void t_string_clear(T_STRING *t_str)
int ut_get_line(FILE *fp, T_STRING *t_str, char **out_str, int *lineno)
int str_to_log_date_format(char *str, char *date_format_str)
const char ** p
Definition: dynamic_load.c:945
static char from_date[128]
#define REALLOC(PTR, SIZE)
Definition: cas_common.h:54