CUBRID Engine  latest
broker_admin_so.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_admin_so.c -
22  */
23 
24 #ident "$Id$"
25 
26 #include <stdio.h>
27 #include <string.h>
28 #include <stdlib.h>
29 #include <errno.h>
30 
31 #if defined(WINDOWS)
32 #include <winsock2.h>
33 #include <windows.h>
34 #endif /* WINDOWS */
35 
36 #include "porting.h"
37 #include "cas_common.h"
38 #include "broker_admin_so.h"
39 #include "broker_filename.h"
40 
41 #include "broker_config.h"
42 #include "broker_util.h"
43 #include "broker_admin_pub.h"
44 #include "broker_shm.h"
45 #include "broker_process_size.h"
46 #include "broker_process_info.h"
47 #if defined(WINDOWS)
48 #include "broker_wsa_init.h"
49 #endif /* WINDOWS */
50 
51 #define UC_CONF_PARAM_MASTER_SHM_ID "MASTER_SHM_ID"
52 #define UC_CONF_PARAM_ADMIN_LOG_FILE "ADMIN_LOG_FILE"
53 
54 #define UC_CONF_PARAM_BROKER_NAME "%"
55 #define UC_CONF_PARAM_SERVICE "SERVICE"
56 #define UC_CONF_PARAM_APPL_SERVER "APPL_SERVER"
57 #define UC_CONF_PARAM_BROKER_PORT "BROKER_PORT"
58 #define UC_CONF_PARAM_MIN_NUM_APPL_SERVER "MIN_NUM_APPL_SERVER"
59 #define UC_CONF_PARAM_MAX_NUM_APPL_SERVER "MAX_NUM_APPL_SERVER"
60 #define UC_CONF_PARAM_AUTO_ADD_APPL_SERVER "AUTO_ADD_APPL_SERVER"
61 #define UC_CONF_PARAM_APPL_SERVER_SHM_ID "APPL_SERVER_SHM_ID"
62 #define UC_CONF_PARAM_APPL_SERVER_MAX_SIZE "APPL_SERVER_MAX_SIZE"
63 #define UC_CONF_PARAM_APPL_SERVER_HARD_LIMIT "APPL_SERVER_MAX_SIZE_HARD_LIMIT"
64 #define UC_CONF_PARAM_LOG_DIR "LOG_DIR"
65 #define UC_CONF_PARAM_SLOW_LOG_DIR "SLOW_LOG_DIR"
66 #define UC_CONF_PARAM_ERROR_LOG_DIR "ERROR_LOG_DIR"
67 #define UC_CONF_PARAM_LOG_BACKUP "LOG_BACKUP"
68 #define UC_CONF_PARAM_SOURCE_ENV "SOURCE_ENV"
69 #define UC_CONF_PARAM_ACCESS_LOG "ACCESS_LOG"
70 #define UC_CONF_PARAM_SQL_LOG "SQL_LOG"
71 #define UC_CONF_PARAM_SLOW_LOG "SLOW_LOG"
72 #define UC_CONF_PARAM_LONG_QUERY_TIME "LONG_QUERY_TIME"
73 #define UC_CONF_PARAM_LONG_TRANSACTION_TIME "LONG_TRANSACTION_TIME"
74 #define UC_CONF_PARAM_TIME_TO_KILL "TIME_TO_KILL"
75 #define UC_CONF_PARAM_SESSION_TIMEOUT "SESSION_TIMEOUT"
76 #define UC_CONF_PARAM_JOB_QUEUE_SIZE "JOB_QUEUE_SIZE"
77 #define UC_CONF_PARAM_ACCESS_LIST "ACCESS_LIST"
78 #define UC_CONF_PARAM_SQL_LOG2 "SQL_LOG2"
79 #define UC_CONF_PARAM_MAX_STRING_LENGTH "MAX_STRING_LENGTH"
80 #define UC_CONF_PARAM_STRIPPED_COLUMN_NAME "STRIPPED_COLUMN_NAME"
81 #define UC_CONF_PARAM_KEEP_CONNECTION "KEEP_CONNECTION"
82 #define UC_CONF_PARAM_SQL_LOG_MAX_SIZE "SQL_LOG_MAX_SIZE"
83 
84 #define MAX_NUM_CONF 35
85 
86 #define SET_CONF_ITEM(CONF_ITEM, IDX, NAME, VALUE) \
87  do { \
88  (CONF_ITEM)[IDX].name = NAME; \
89  (CONF_ITEM)[IDX].value = VALUE; \
90  (IDX)++; \
91  } while (0)
92 
93 #define SET_CONF_ITEM_ONOFF(CONF_ITEM, IDX, NAME, VALUE) \
94  do { \
95  if ((VALUE) == ON) \
96  SET_CONF_ITEM(CONF_ITEM, IDX, NAME, strdup("ON")); \
97  else \
98  SET_CONF_ITEM(CONF_ITEM, IDX, NAME, strdup("OFF")); \
99  } while (0)
100 
101 #define SET_CONF_ITEM_SQL_LOG_MODE(CONF_ITEM, IDX, NAME, VALUE) \
102  do { \
103  const char *_macro_tmp_ptr; \
104  if ((VALUE) & SQL_LOG_MODE_ALL) \
105  _macro_tmp_ptr = "ALL"; \
106  else if ((VALUE) & SQL_LOG_MODE_ERROR) \
107  _macro_tmp_ptr = "ERROR"; \
108  else /*((VALUE) == SQL_LOG_MODE_NONE)*/ \
109  _macro_tmp_ptr = "NONE"; \
110  SET_CONF_ITEM(CONF_ITEM, IDX, NAME, strdup(_macro_tmp_ptr)); \
111  } while (0)
112 
113 #define SET_CONF_ITEM_KEEP_CON(CONF_ITEM, IDX, NAME, VALUE) \
114  do { \
115  const char *_macro_tmp_ptr; \
116  if ((VALUE) == KEEP_CON_AUTO) \
117  _macro_tmp_ptr = "AUTO"; \
118  else \
119  _macro_tmp_ptr = "ON"; \
120  SET_CONF_ITEM(CONF_ITEM, IDX, NAME, strdup(_macro_tmp_ptr)); \
121  } while (0)
122 
123 #define FMT_D "%d"
124 #define FMT_X "%X"
125 #define SET_CONF_ITEM_INT(CONF_ITEM, IDX, NAME, VALUE, FMT) \
126  do { \
127  char _macro_tmp_buf[32]; \
128  sprintf(_macro_tmp_buf, FMT, (VALUE)); \
129  SET_CONF_ITEM(CONF_ITEM, IDX, NAME, strdup(_macro_tmp_buf)); \
130  } while (0)
131 
132 #define SET_CONF_ITEM_STR(CONF_ITEM, IDX, NAME, VALUE) \
133  do { \
134  SET_CONF_ITEM(CONF_ITEM, IDX, NAME, strdup(VALUE)); \
135  } while (0)
136 
137 #define SET_FLAG(ONOFF) ((ONOFF) == ON ? FLAG_ON : FLAG_OFF)
138 
139 #define CP_ADMIN_ERR_MSG(BUF) sprintf(BUF, "Error: %s", admin_err_msg)
140 
141 static void admin_log_write (const char *log_file, const char *msg);
142 static int admin_common (T_BROKER_INFO * br_info, int *num_broker, int *master_shm_id, char *admin_log_file,
143  char *err_msg, char admin_flag, bool * acl_flag, char *acl_file);
144 static int copy_job_info (T_JOB_INFO ** job_info, T_MAX_HEAP_NODE * job_q);
145 static int conf_copy_header (T_UC_CONF * unicas_conf, int master_shm_id, char *admin_log_file, char *err_msg);
146 static int conf_copy_broker (T_UC_CONF * unicas_conf, T_BROKER_INFO * br_conf, int num_br, char *err_msg);
147 static void conf_item_free (T_UC_CONF_ITEM * conf_item, int num);
148 static char *get_broker_name (T_BR_CONF * br_conf);
149 static const char *get_as_type_str (char as_type);
150 static void change_conf_as_type (T_BR_CONF * br_conf, int old_as_type, int new_as_type);
151 static void reset_conf_value (int num_item, T_UC_CONF_ITEM * item, const char *name);
152 static int get_as_type (const char *type_str);
153 static int uc_changer_internal (const char *br_name, const char *name, const char *value, int as_number, char *err_msg);
154 
155 #define CHECK_SHARED_MEMORY(p_shm, err_msg) \
156  do { \
157  if (!p_shm) { \
158  if (err_msg) strcpy(err_msg, "Shared memory is not opened."); \
159  return -1; \
160  } \
161  } while (0)
162 
163 DLL_EXPORT void *
164 uc_broker_shm_open (char *err_msg)
165 {
166  T_BROKER_INFO br_conf[MAX_BROKER_NUM];
167  int num_broker, master_shm_id;
168  char admin_log_file[BROKER_PATH_MAX];
169  void *ret_val;
170 
171  if (admin_common (br_conf, &num_broker, &master_shm_id, admin_log_file, err_msg, 0, NULL, NULL) < 0)
172  {
173  return NULL;
174  }
175  ret_val = uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
176  if (!ret_val && err_msg)
177  {
178  strcpy (err_msg, strerror (errno));
179  }
180  return ret_val;
181 }
182 
183 DLL_EXPORT int
184 uc_get_br_num_with_opened_shm (void *shm_br, char *err_msg)
185 {
186  CHECK_SHARED_MEMORY (shm_br, err_msg);
187  return ((T_SHM_BROKER *) shm_br)->num_broker;
188 }
189 
190 DLL_EXPORT int
191 uc_get_br_name_with_opened_shm (void *shm_br, int br_index, char *name, int buffer_size, char *err_msg)
192 {
193  CHECK_SHARED_MEMORY (shm_br, err_msg);
194  if (name == NULL)
195  {
196  if (err_msg)
197  {
198  strcpy (err_msg, "Invalid name buffer.");
199  }
200  return -1;
201  }
202 
203  strncpy (name, ((T_SHM_BROKER *) shm_br)->br_info[br_index].name, buffer_size);
204  return 1;
205 }
206 
207 DLL_EXPORT void *
208 uc_as_shm_open (void *shm_br, int br_index, char *err_msg)
209 {
210  void *ret_val;
211 
212  if (shm_br == NULL)
213  {
214  if (err_msg)
215  {
216  strcpy (err_msg, "Shared memory is not opened.");
217  }
218  return NULL;
219  }
220 
221  ret_val = uw_shm_open (((T_SHM_BROKER *) shm_br)->br_info[br_index].appl_server_shm_id, SHM_APPL_SERVER,
223  if (!ret_val && err_msg)
224  {
225  strcpy (err_msg, strerror (errno));
226  }
227  return ret_val;
228 }
229 
230 DLL_EXPORT int
231 uc_get_as_num_with_opened_shm (void *shm_br, int br_index, char *err_msg)
232 {
233  CHECK_SHARED_MEMORY (shm_br, err_msg);
234  return ((T_SHM_BROKER *) shm_br)->br_info[br_index].appl_server_max_num;
235 }
236 
237 DLL_EXPORT int
238 uc_get_as_reqs_received_with_opened_shm (void *shm_as, long long array[], int array_size, char *err_msg)
239 {
240  /* return value -2 means that array_size is different from real as num (as add or remove ...) so coller must reset
241  * array[] info and after, recall this function */
242  int i;
243 
244  CHECK_SHARED_MEMORY (shm_as, err_msg);
245 /*
246  if (array_size != ((T_SHM_APPL_SERVER*)shm_as)->num_appl_server) {
247  if (err_msg) strcpy(err_msg, "Invalid array_size.");
248  return -2;
249  }
250 */
251  for (i = 0; i < array_size; i++)
252  {
253  array[i] = ((T_SHM_APPL_SERVER *) shm_as)->as_info[i].num_requests_received;
254  }
255 
256  return 1;
257 }
258 
259 DLL_EXPORT int
260 uc_get_active_session_with_opened_shm (void *shm_p, char *err_msg)
261 {
262  T_SHM_BROKER *shm_br = (T_SHM_BROKER *) shm_p;
263  int num_ses = 0, i;
264 
265  CHECK_SHARED_MEMORY (shm_br, err_msg);
266 
267  for (i = 0; i < shm_br->num_broker; i++)
268  {
269  if (shm_br->br_info[i].service_flag == ON)
270  {
271  num_ses += shm_br->br_info[i].num_busy_count;
272  }
273  }
274 
275  return num_ses;
276 }
277 
278 DLL_EXPORT int
279 uc_get_as_tran_processed_with_opened_shm (void *shm_as, long long array[], int array_size, char *err_msg)
280 {
281  int i;
282 
283  CHECK_SHARED_MEMORY (shm_as, err_msg);
284 
285  for (i = 0; i < array_size; i++)
286  {
287  array[i] = ((T_SHM_APPL_SERVER *) shm_as)->as_info[i].num_transactions_processed;
288  }
289 
290  return 1;
291 }
292 
293 DLL_EXPORT int
294 uc_get_as_query_processed_with_opened_shm (void *shm_as, long long array[], int array_size, char *err_msg)
295 {
296  int i;
297 
298  CHECK_SHARED_MEMORY (shm_as, err_msg);
299 
300  for (i = 0; i < array_size; i++)
301  {
302  array[i] = ((T_SHM_APPL_SERVER *) shm_as)->as_info[i].num_queries_processed;
303  }
304 
305  return 1;
306 }
307 
308 DLL_EXPORT void
310 {
311  uw_shm_detach (p);
312 }
313 
314 DLL_EXPORT const char *
316 {
317  return makestring (BUILD_NUMBER);
318 }
319 
320 DLL_EXPORT int
321 uc_start (char *err_msg)
322 {
323  T_BROKER_INFO br_info[MAX_BROKER_NUM];
324  int num_broker, master_shm_id;
325  char admin_log_file[BROKER_PATH_MAX];
326  char acl_file[BROKER_PATH_MAX];
327  bool acl_flag;
328 
329  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, &acl_flag, acl_file) < 0)
330  {
331  return -1;
332  }
333 
334  if (admin_start_cmd (br_info, num_broker, master_shm_id, acl_flag, acl_file) < 0)
335  {
336  CP_ADMIN_ERR_MSG (err_msg);
337  return -1;
338  }
339 
340  admin_log_write (admin_log_file, "start");
341 
342  return 0;
343 }
344 
345 DLL_EXPORT int
346 uc_stop (char *err_msg)
347 {
348  T_BROKER_INFO br_info[MAX_BROKER_NUM];
349  int num_broker, master_shm_id;
350  char admin_log_file[BROKER_PATH_MAX];
351 
352  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, NULL, NULL) < 0)
353  {
354  return -1;
355  }
356 
357  if (admin_stop_cmd (master_shm_id) < 0)
358  {
359  CP_ADMIN_ERR_MSG (err_msg);
360  return -1;
361  }
362 
363  admin_log_write (admin_log_file, "stop");
364 
365  return 0;
366 }
367 
368 DLL_EXPORT int
369 uc_add (const char *br_name, char *err_msg)
370 {
371  T_BROKER_INFO br_info[MAX_BROKER_NUM];
372  int num_broker, master_shm_id;
373  char admin_log_file[BROKER_PATH_MAX];
374  char msg_buf[256];
375 
376  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, NULL, NULL) < 0)
377  {
378  return -1;
379  }
380 
381  if (admin_add_cmd (master_shm_id, br_name) < 0)
382  {
383  CP_ADMIN_ERR_MSG (err_msg);
384  return -1;
385  }
386 
387  sprintf (msg_buf, "add %s", br_name);
388  admin_log_write (admin_log_file, msg_buf);
389 
390  return 0;
391 }
392 
393 DLL_EXPORT int
394 uc_restart (const char *br_name, int as_index, char *err_msg)
395 {
396  T_BROKER_INFO br_info[MAX_BROKER_NUM];
397  int num_broker, master_shm_id;
398  char admin_log_file[BROKER_PATH_MAX];
399  char msg_buf[256];
400 
401  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, NULL, NULL) < 0)
402  {
403  return -1;
404  }
405 
406  if (admin_restart_cmd (master_shm_id, br_name, as_index) < 0)
407  {
408  CP_ADMIN_ERR_MSG (err_msg);
409  return -1;
410  }
411 
412  sprintf (msg_buf, "restart %s %d", br_name, as_index);
413  admin_log_write (admin_log_file, msg_buf);
414 
415  return 0;
416 }
417 
418 DLL_EXPORT int
419 uc_drop (const char *br_name, char *err_msg)
420 {
421  T_BROKER_INFO br_info[MAX_BROKER_NUM];
422  int num_broker, master_shm_id;
423  char admin_log_file[256];
424  char msg_buf[256];
425 
426  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, NULL, NULL) < 0)
427  {
428  return -1;
429  }
430 
431  if (admin_drop_cmd (master_shm_id, br_name) < 0)
432  {
433  CP_ADMIN_ERR_MSG (err_msg);
434  return -1;
435  }
436 
437  sprintf (msg_buf, "drop %s", br_name);
438  admin_log_write (admin_log_file, msg_buf);
439 
440  return 0;
441 }
442 
443 DLL_EXPORT int
444 uc_on (const char *br_name, char *err_msg)
445 {
446  T_BROKER_INFO br_info[MAX_BROKER_NUM];
447  int num_broker, master_shm_id;
448  char admin_log_file[BROKER_PATH_MAX];
449  char msg_buf[256];
450 
451  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, NULL, NULL) < 0)
452  {
453  return -1;
454  }
455 
456  if (admin_on_cmd (master_shm_id, br_name) < 0)
457  {
458  CP_ADMIN_ERR_MSG (err_msg);
459  return -1;
460  }
461 
462  sprintf (msg_buf, "%s on", br_name);
463  admin_log_write (admin_log_file, msg_buf);
464 
465  return 0;
466 }
467 
468 DLL_EXPORT int
469 uc_off (const char *br_name, char *err_msg)
470 {
471  T_BROKER_INFO br_info[MAX_BROKER_NUM];
472  int num_broker, master_shm_id;
473  char admin_log_file[BROKER_PATH_MAX];
474  char msg_buf[256];
475 
476  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 1, NULL, NULL) < 0)
477  {
478  return -1;
479  }
480 
481  if (admin_off_cmd (master_shm_id, br_name) < 0)
482  {
483  CP_ADMIN_ERR_MSG (err_msg);
484  return -1;
485  }
486 
487  sprintf (msg_buf, "%s off", br_name);
488  admin_log_write (admin_log_file, msg_buf);
489 
490  return 0;
491 }
492 
493 DLL_EXPORT int
494 uc_as_info (const char *br_name, T_AS_INFO ** ret_as_info, T_JOB_INFO ** job_info, int *num_job, char *err_msg)
495 {
496  T_BROKER_INFO br_info[MAX_BROKER_NUM];
497  int num_broker, master_shm_id;
498  char admin_log_file[BROKER_PATH_MAX];
501  int br_index, i, appl_shm_key;
502  int num_as;
504  char client_ip_str[16];
505 
506  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 0, NULL, NULL) < 0)
507  {
508  return -1;
509  }
510 
511  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
512  if (shm_br == NULL)
513  {
514  strcpy (err_msg, "Error: shared memory open error");
515  return -1;
516  }
517  br_index = -1;
518  for (i = 0; i < shm_br->num_broker; i++)
519  {
520  if (strcasecmp (br_name, shm_br->br_info[i].name) == 0)
521  {
522  appl_shm_key = shm_br->br_info[i].appl_server_shm_id;
523  br_index = i;
524  break;
525  }
526  }
527  if (br_index < 0)
528  {
529  sprintf (err_msg, "Error: cannot find broker [%s]", br_name);
530  goto as_info_error;
531  }
532  shm_appl = (T_SHM_APPL_SERVER *) uw_shm_open (appl_shm_key, SHM_APPL_SERVER, SHM_MODE_ADMIN);
533  if (shm_appl == NULL)
534  {
535  strcpy (err_msg, "Error: shared memory open error");
536  goto as_info_error;
537  }
538 
539  num_as = shm_br->br_info[br_index].appl_server_max_num;
540  as_info = (T_AS_INFO *) malloc (sizeof (T_AS_INFO) * num_as);
541  if (as_info == NULL)
542  {
543  strcpy (err_msg, strerror (errno));
544  goto as_info_error;
545  }
546  memset (as_info, 0, sizeof (T_AS_INFO) * num_as);
547 
548  for (i = 0; i < shm_br->br_info[br_index].appl_server_max_num; i++)
549  {
550  T_PSINFO proc_info;
551 
552  as_info[i].service_flag = shm_appl->as_info[i].service_flag;
553  if (shm_appl->as_info[i].service_flag != SERVICE_ON)
554  {
555  continue;
556  }
557 
558  as_info[i].pid = shm_appl->as_info[i].pid;
559  as_info[i].psize = getsize (as_info[i].pid);
560  memset (&proc_info, 0, sizeof (T_PSINFO));
561  get_psinfo (as_info[i].pid, &proc_info);
562  as_info[i].num_thr = proc_info.num_thr;
563  as_info[i].cpu_time = proc_info.cpu_time;
564  as_info[i].pcpu = proc_info.pcpu;
565  as_info[i].num_request = shm_appl->as_info[i].num_request;
566 #if defined(WINDOWS)
567  if (shm_appl->use_pdh_flag == TRUE)
568  {
569  float pct_cpu;
570 
571  pct_cpu = shm_appl->as_info[i].pdh_pct_cpu;
572  if (pct_cpu >= 0)
573  {
574  as_info[i].pcpu = pct_cpu;
575  }
576  as_info[i].psize = shm_appl->as_info[i].pdh_workset;
577  as_info[i].cpu_time = shm_appl->as_info[i].cpu_time;
578  }
579 #endif /* WINDOWS */
580 #if defined(WINDOWS)
581  as_info[i].as_port = shm_appl->as_info[i].as_port;
582 #else /* WINDOWS */
583  as_info[i].as_port = 0;
584 #endif /* WINDOWS */
585  if (shm_appl->as_info[i].uts_status == UTS_STATUS_BUSY)
586  {
587  if (IS_APPL_SERVER_TYPE_CAS (shm_br->br_info[br_index].appl_server))
588  {
589  if (shm_appl->as_info[i].con_status == CON_STATUS_OUT_TRAN)
590  {
591  as_info[i].status = AS_STATUS_CLOSE_WAIT;
592  }
593  else if (shm_appl->as_info[i].log_msg[0] == '\0')
594  {
595  as_info[i].status = AS_STATUS_CLIENT_WAIT;
596  }
597  else
598  {
599  as_info[i].status = AS_STATUS_BUSY;
600  }
601  }
602  else
603  {
604  as_info[i].status = AS_STATUS_BUSY;
605  }
606  }
607 #if defined(WINDOWS)
608  else if (shm_appl->as_info[i].uts_status == UTS_STATUS_BUSY_WAIT)
609  {
610  as_info[i].status = AS_STATUS_BUSY;
611  }
612 #endif /* WINDOWS */
613  else if (shm_appl->as_info[i].uts_status == UTS_STATUS_RESTART)
614  {
615  as_info[i].status = AS_STATUS_RESTART;
616  }
617  else
618  {
619  as_info[i].status = AS_STATUS_IDLE;
620  }
621 
622  as_info[i].last_access_time = shm_appl->as_info[i].last_access_time;
623  as_info[i].last_connect_time = shm_appl->as_info[i].last_connect_time;
624  as_info[i].num_requests_received = shm_appl->as_info[i].num_requests_received;
625  as_info[i].num_queries_processed = shm_appl->as_info[i].num_queries_processed;
627  as_info[i].num_long_queries = shm_appl->as_info[i].num_long_queries;
628  as_info[i].num_long_transactions = shm_appl->as_info[i].num_long_transactions;
629  as_info[i].num_error_queries = shm_appl->as_info[i].num_error_queries;
630  as_info[i].num_interrupts = shm_appl->as_info[i].num_interrupts;
631 
632  ut_get_ipv4_string (client_ip_str, sizeof (client_ip_str), shm_appl->as_info[i].cas_clt_ip);
633  strncpy (as_info[i].clt_ip_addr, client_ip_str, sizeof (as_info[i].clt_ip_addr) - 1);
634 
635  strncpy (as_info[i].database_host, shm_appl->as_info[i].database_host, sizeof (as_info[i].database_host) - 1);
636  strncpy (as_info[i].database_name, shm_appl->as_info[i].database_name, sizeof (as_info[i].database_name) - 1);
637 
638  strncpy (as_info[i].clt_appl_name, shm_appl->as_info[i].clt_appl_name, sizeof (as_info[i].clt_appl_name) - 1);
639  strncpy (as_info[i].request_file, shm_appl->as_info[i].clt_req_path_info, sizeof (as_info[i].request_file) - 1);
640 
641  strncpy (as_info[i].log_msg, shm_appl->as_info[i].log_msg, sizeof (as_info[i].log_msg) - 1);
642  }
643 
644  if (job_info)
645  {
647 
648  memcpy (job_q, shm_appl->job_queue, sizeof (T_MAX_HEAP_NODE) * (JOB_QUEUE_MAX_SIZE + 1));
649  *num_job = copy_job_info (job_info, job_q);
650  }
651  else if (num_job)
652  {
653  *num_job = shm_appl->job_queue[0].id;
654  }
655 
656  uw_shm_detach (shm_appl);
657  uw_shm_detach (shm_br);
658 
659  *ret_as_info = as_info;
660  return (num_as);
661 
662 as_info_error:
663  if (shm_appl)
664  {
665  uw_shm_detach (shm_appl);
666  }
667  if (shm_br)
668  {
669  uw_shm_detach (shm_br);
670  }
671  uc_info_free (as_info);
672  return -1;
673 }
674 
675 DLL_EXPORT void
676 uc_info_free (void *info)
677 {
678  FREE_MEM (info);
679 }
680 
681 DLL_EXPORT int
682 uc_br_info (T_BR_INFO ** ret_br_info, char *err_msg)
683 {
684  T_BROKER_INFO br_conf[MAX_BROKER_NUM];
686  int num_broker, master_shm_id;
687  char admin_log_file[BROKER_PATH_MAX];
688  int i, num_br;
689  T_BR_INFO *br_info = NULL;
690  char *p;
691 
692  if (admin_common (br_conf, &num_broker, &master_shm_id, admin_log_file, err_msg, 0, NULL, NULL) < 0)
693  {
694  return -1;
695  }
696 
697  shm_br = (T_SHM_BROKER *) uw_shm_open (master_shm_id, SHM_BROKER, SHM_MODE_ADMIN);
698  if (shm_br == NULL)
699  {
700  strcpy (err_msg, "ERROR: shared memory open error");
701  return -1;
702  }
703  num_br = shm_br->num_broker;
704  if (num_br < 1 || num_br > MAX_BROKER_NUM)
705  {
706  goto br_info_error;
707  }
708  br_info = (T_BR_INFO *) malloc (sizeof (T_BR_INFO) * num_br);
709  if (br_info == NULL)
710  {
711  goto br_info_error;
712  }
713  memset (br_info, 0, sizeof (T_BR_INFO) * num_br);
714  for (i = 0; i < num_br; i++)
715  {
716  strncpy (br_info[i].name, shm_br->br_info[i].name, sizeof (br_info[i].name) - 1);
717  strcpy (br_info[i].as_type, get_as_type_str (shm_br->br_info[i].appl_server));
718  br_info[i].status = SET_FLAG (shm_br->br_info[i].service_flag);
719  if (shm_br->br_info[i].service_flag == ON)
720  {
721 #if !defined(WINDOWS)
722  T_PSINFO proc_info;
723 #endif /* !WINDOWS */
724  int num_req, j;
725  INT64 num_tran, num_query, num_long_query, num_long_tran, num_error_query, num_interrupts;
727 
728  shm_appl =
730  if (shm_appl == NULL)
731  {
732  strcpy (err_msg, "ERROR: shared memory open error");
733  goto br_info_error;
734  }
735 
736  br_info[i].pid = shm_br->br_info[i].pid;
737  br_info[i].port = shm_br->br_info[i].port;
738  br_info[i].num_as = shm_br->br_info[i].appl_server_num;
739  br_info[i].max_as = shm_br->br_info[i].appl_server_max_num;
740  br_info[i].min_as = shm_br->br_info[i].appl_server_min_num;
741  br_info[i].num_job_q = shm_appl->job_queue[0].id;
742  br_info[i].num_busy_count = shm_br->br_info[i].num_busy_count;
743 #if defined(WINDOWS)
744  br_info[i].num_thr = shm_br->br_info[i].pdh_num_thr;
745  br_info[i].pcpu = shm_br->br_info[i].pdh_pct_cpu;
746  br_info[i].cpu_time = shm_br->br_info[i].cpu_time;
747 #else /* WINDOWS */
748  memset (&proc_info, 0, sizeof (proc_info));
749  get_psinfo (br_info[i].pid, &proc_info);
750  br_info[i].num_thr = proc_info.num_thr;
751  br_info[i].pcpu = proc_info.pcpu;
752  br_info[i].cpu_time = proc_info.cpu_time;
753 #endif /* WINDOWS */
754 
755  num_req = 0;
756  num_tran = 0;
757  num_query = 0;
758  num_long_tran = 0;
759  num_long_query = 0;
760  num_error_query = 0;
761  num_interrupts = 0;
762  for (j = 0; j < shm_br->br_info[i].appl_server_max_num; j++)
763  {
764  num_req += shm_appl->as_info[j].num_request;
765  num_tran += shm_appl->as_info[j].num_transactions_processed;
766  num_query += shm_appl->as_info[j].num_queries_processed;
767  num_long_query += shm_appl->as_info[j].num_long_queries;
768  num_long_tran += shm_appl->as_info[j].num_long_transactions;
769  num_error_query += shm_appl->as_info[j].num_error_queries;
770  num_interrupts += shm_appl->as_info[j].num_interrupts;
771  }
772 
773  br_info[i].num_req = num_req;
774  br_info[i].num_tran = num_tran;
775  br_info[i].num_query = num_query;
776  br_info[i].num_long_query = num_long_query;
777  br_info[i].num_long_tran = num_long_tran;
778  br_info[i].num_error_query = num_error_query;
779  br_info[i].num_interrupts = num_interrupts;
780 
781  br_info[i].keep_connection = shm_appl->keep_connection;
782 
783  br_info[i].shm_id = shm_br->br_info[i].appl_server_shm_id;
784  br_info[i].session_timeout = shm_br->br_info[i].session_timeout;
785  br_info[i].auto_add_flag = SET_FLAG (shm_br->br_info[i].auto_add_appl_server);
786  br_info[i].sql_log_mode = shm_br->br_info[i].sql_log_mode;
787  br_info[i].slow_log_mode = shm_br->br_info[i].slow_log_mode;
788  br_info[i].access_mode = shm_br->br_info[i].access_mode;
789  br_info[i].long_query_time = shm_br->br_info[i].long_query_time;
791  strncpy (br_info[i].log_dir, shm_br->br_info[i].access_log_file, sizeof (br_info[i].log_dir) - 1);
792  p = strrchr (br_info[i].log_dir, '/');
793  if (p != NULL)
794  {
795  *p = '\0';
796  }
797  br_info[i].as_max_size = shm_br->br_info[i].appl_server_max_size;
798  br_info[i].as_hard_limit = shm_br->br_info[i].appl_server_hard_limit;
799  br_info[i].log_backup_flag = shm_br->br_info[i].log_backup;
800  br_info[i].time_to_kill = shm_br->br_info[i].time_to_kill;
801  uw_shm_detach (shm_appl);
802  }
803  if (shm_br->br_info[i].acl_file[0] == '\0')
804  {
805  br_info[i].access_list_flag = 0;
806  }
807  else
808  {
809  br_info[i].access_list_flag = 1;
810  }
811 
812  if (shm_br->br_info[i].source_env[0] == '\0')
813  {
814  br_info[i].source_env_flag = 0;
815  }
816  else
817  {
818  br_info[i].source_env_flag = 1;
819  }
820  }
821  uw_shm_detach (shm_br);
822 
823  *ret_br_info = br_info;
824 
825  return (num_br);
826 
827 br_info_error:
828  if (shm_br)
829  {
830  uw_shm_detach (shm_br);
831  }
832  if (br_info)
833  {
834  uc_info_free (br_info);
835  }
836  return -1;
837 }
838 
839 DLL_EXPORT int
840 uc_unicas_conf (T_UC_CONF * unicas_conf, int *ret_mst_shmid, char *err_msg)
841 {
842  T_BROKER_INFO br_conf[MAX_BROKER_NUM];
843  int num_broker, master_shm_id;
844  char admin_log_file[BROKER_PATH_MAX];
845 
846  memset (unicas_conf, 0, sizeof (T_UC_CONF));
847 
848  if (admin_common (br_conf, &num_broker, &master_shm_id, admin_log_file, err_msg, 0, NULL, NULL) < 0)
849  {
850  return -1;
851  }
852 
853  if (conf_copy_header (unicas_conf, master_shm_id, admin_log_file, err_msg) < 0)
854  {
855  return -1;
856  }
857 
858  if (conf_copy_broker (unicas_conf, br_conf, num_broker, err_msg) < 0)
859  {
860  return -1;
861  }
862 
863  if (ret_mst_shmid)
864  *ret_mst_shmid = master_shm_id;
865 
866  return 0;
867 }
868 
869 DLL_EXPORT void
871 {
872  int i;
873 
874  conf_item_free (unicas_conf->header_conf, unicas_conf->num_header);
875  if (unicas_conf->br_conf)
876  {
877  for (i = 0; i < unicas_conf->num_broker; i++)
878  {
879  conf_item_free (unicas_conf->br_conf[i].item, unicas_conf->br_conf[i].num);
880  }
881  FREE_MEM (unicas_conf->br_conf);
882  }
883  memset (unicas_conf, 0, sizeof (T_UC_CONF));
884 }
885 
886 DLL_EXPORT int
887 uc_conf_broker_add (T_UC_CONF * unicas_conf, const char *br_name, char *err_msg)
888 {
889  int num_br, n;
890  T_UC_CONF_ITEM *conf_item;
891 
892  num_br = unicas_conf->num_broker + 1;
893  unicas_conf->br_conf = (T_BR_CONF *) realloc (unicas_conf->br_conf, sizeof (T_BR_CONF) * num_br);
894  if (unicas_conf->br_conf == NULL)
895  {
896  strcpy (err_msg, strerror (errno));
897  return -1;
898  }
899  memset (&(unicas_conf->br_conf[num_br - 1]), 0, sizeof (T_BR_CONF));
900  unicas_conf->num_broker = num_br;
901 
902  conf_item = (T_UC_CONF_ITEM *) malloc (sizeof (T_UC_CONF_ITEM) * MAX_NUM_CONF);
903  if (conf_item == NULL)
904  {
905  strcpy (err_msg, strerror (errno));
906  return -1;
907  }
908  memset (conf_item, 0, sizeof (T_UC_CONF_ITEM) * MAX_NUM_CONF);
909 
910  n = 0;
911  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_BROKER_NAME, br_name);
922  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_SOURCE_ENV, "");
930  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_ACCESS_LIST, "");
935 
936  unicas_conf->br_conf[num_br - 1].num = n;
937  unicas_conf->br_conf[num_br - 1].item = conf_item;
938  return 0;
939 }
940 
941 DLL_EXPORT void
942 uc_change_config (T_UC_CONF * unicas_conf, const char *br_name, const char *name, const char *value)
943 {
944  T_BR_CONF *br_conf = NULL;
945  int i;
946 
947  for (i = 0; i < unicas_conf->num_broker; i++)
948  {
949  br_conf = &(unicas_conf->br_conf[i]);
950  if (strcasecmp (br_name, get_broker_name (br_conf)) == 0)
951  {
952  break;
953  }
954  br_conf = NULL;
955  }
956  if (br_conf == NULL)
957  {
958  return;
959  }
960 
961  for (i = 0; i < br_conf->num; i++)
962  {
963  if (strcasecmp (name, br_conf->item[i].name) == 0)
964  {
965  if (strcasecmp (name, UC_CONF_PARAM_APPL_SERVER) == 0)
966  {
967  change_conf_as_type (br_conf, get_as_type (br_conf->item[i].value), get_as_type (value));
968  }
969  FREE_MEM (br_conf->item[i].value);
970  br_conf->item[i].value = strdup (value);
971  break;
972  }
973  }
974 }
975 
976 DLL_EXPORT int
977 uc_changer (const char *br_name, const char *name, const char *value, char *err_msg)
978 {
979  return uc_changer_internal (br_name, name, value, -1, err_msg);
980 }
981 
982 DLL_EXPORT int
983 uc_cas_changer (const char *br_name, const char *name, const char *value, int as_number, char *err_msg)
984 {
985  return uc_changer_internal (br_name, name, value, as_number, err_msg);
986 }
987 
988 DLL_EXPORT int
989 uc_del_cas_log (const char *br_name, int asid, char *err_msg)
990 {
991  T_BROKER_INFO br_info[MAX_BROKER_NUM];
992  int num_broker, master_shm_id;
993  char admin_log_file[BROKER_PATH_MAX];
994 
995  if (err_msg == NULL)
996  {
997  return -1;
998  }
999 
1000  err_msg[0] = '\0';
1001 
1002  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 0, NULL, NULL) < 0)
1003  {
1004  return -1;
1005  }
1006 
1007  if (admin_del_cas_log (master_shm_id, br_name, asid) < 0)
1008  {
1009  return -1;
1010  }
1011 
1012  return 0;
1013 }
1014 
1015 /******************************************************************
1016  private functions
1017  ******************************************************************/
1018 
1019 static char *
1021 {
1022  int i, num;
1023  T_UC_CONF_ITEM *conf_item;
1024 
1025  conf_item = br_conf->item;
1026  num = br_conf->num;
1027 
1028  for (i = 0; i < num; i++)
1029  {
1030  if (strcmp (conf_item[i].name, UC_CONF_PARAM_BROKER_NAME) == 0)
1031  {
1032  if (conf_item[i].value == NULL)
1033  {
1034  return (char *) "";
1035  }
1036  return conf_item[i].value;
1037  }
1038  }
1039  return (char *) "";
1040 }
1041 
1042 static void
1043 conf_item_free (T_UC_CONF_ITEM * conf_item, int num)
1044 {
1045  int i;
1046 
1047  if (conf_item == NULL)
1048  {
1049  return;
1050  }
1051  for (i = 0; i < num; i++)
1052  {
1053  FREE_MEM (conf_item[i].value);
1054  }
1055  FREE_MEM (conf_item);
1056 }
1057 
1058 static int
1059 conf_copy_broker (T_UC_CONF * unicas_conf, T_BROKER_INFO * br_conf, int num_br, char *err_msg)
1060 {
1061  int i, n;
1062  T_UC_CONF_ITEM *conf_item;
1063 
1064  unicas_conf->br_conf = (T_BR_CONF *) malloc (sizeof (T_BR_CONF) * num_br);
1065  if (unicas_conf->br_conf == NULL)
1066  {
1067  strcpy (err_msg, strerror (errno));
1068  return -1;
1069  }
1070  memset (unicas_conf->br_conf, 0, sizeof (T_BR_CONF) * num_br);
1071  unicas_conf->num_broker = num_br;
1072 
1073  for (i = 0; i < num_br; i++)
1074  {
1075  char as_type;
1076  conf_item = (T_UC_CONF_ITEM *) malloc (sizeof (T_UC_CONF_ITEM) * MAX_NUM_CONF);
1077  if (conf_item == NULL)
1078  {
1079  strcpy (err_msg, strerror (errno));
1080  return -1;
1081  }
1082  memset (conf_item, 0, sizeof (T_UC_CONF_ITEM) * MAX_NUM_CONF);
1083  as_type = br_conf[i].appl_server;
1084  n = 0;
1085  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_BROKER_NAME, br_conf[i].name);
1086  SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_SERVICE, br_conf[i].service_flag);
1087  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_APPL_SERVER, get_as_type_str (br_conf[i].appl_server));
1088  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_BROKER_PORT, br_conf[i].port, FMT_D);
1089  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_MIN_NUM_APPL_SERVER, br_conf[i].appl_server_min_num, FMT_D);
1090  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_MAX_NUM_APPL_SERVER, br_conf[i].appl_server_max_num, FMT_D);
1091  SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_AUTO_ADD_APPL_SERVER, br_conf[i].auto_add_appl_server);
1093  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_APPL_SERVER_MAX_SIZE, br_conf[i].appl_server_max_size / ONE_K,
1094  FMT_D);
1095  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_APPL_SERVER_HARD_LIMIT, br_conf[i].appl_server_hard_limit / ONE_K,
1096  FMT_D);
1097  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_LOG_DIR, br_conf[i].log_dir);
1098  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_SLOW_LOG_DIR, br_conf[i].slow_log_dir);
1099  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_ERROR_LOG_DIR, br_conf[i].err_log_dir);
1100  SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_LOG_BACKUP, br_conf[i].log_backup);
1101  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_SOURCE_ENV, br_conf[i].source_env);
1102  SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_ACCESS_LOG, br_conf[i].access_log);
1103  SET_CONF_ITEM_SQL_LOG_MODE (conf_item, n, UC_CONF_PARAM_SQL_LOG, br_conf[i].sql_log_mode);
1104  SET_CONF_ITEM_ONOFF (conf_item, n, UC_CONF_PARAM_SLOW_LOG, br_conf[i].slow_log_mode);
1105  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_SESSION_TIMEOUT, br_conf[i].session_timeout, FMT_D);
1106  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_SQL_LOG_MAX_SIZE, br_conf[i].sql_log_max_size, FMT_D);
1107  SET_CONF_ITEM_KEEP_CON (conf_item, n, UC_CONF_PARAM_KEEP_CONNECTION, br_conf[i].keep_connection);
1108  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_TIME_TO_KILL, br_conf[i].time_to_kill, FMT_D);
1109  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_SESSION_TIMEOUT, br_conf[i].session_timeout, FMT_D);
1110  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_JOB_QUEUE_SIZE, br_conf[i].job_queue_size, FMT_D);
1111  if (IS_APPL_SERVER_TYPE_CAS (as_type))
1112  {
1113  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_MAX_STRING_LENGTH, br_conf[i].max_string_length, FMT_D);
1115  }
1116  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_ACCESS_LIST, br_conf[i].acl_file);
1117 #if 0
1118  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_SQL_LOG2, br_conf[i].sql_log2, FMT_D);
1119 #endif
1120 
1121  unicas_conf->br_conf[i].num = n;
1122  unicas_conf->br_conf[i].item = conf_item;
1123  }
1124  return 0;
1125 }
1126 
1127 static int
1128 conf_copy_header (T_UC_CONF * unicas_conf, int master_shm_id, char *admin_log_file, char *err_msg)
1129 {
1130  T_UC_CONF_ITEM *conf_item;
1131  int n;
1132 
1133  conf_item = (T_UC_CONF_ITEM *) malloc (sizeof (T_UC_CONF_ITEM) * 2);
1134  if (conf_item == NULL)
1135  {
1136  strcpy (err_msg, strerror (errno));
1137  return -1;
1138  }
1139  n = 0;
1140  SET_CONF_ITEM_INT (conf_item, n, UC_CONF_PARAM_MASTER_SHM_ID, master_shm_id, FMT_X);
1141  SET_CONF_ITEM_STR (conf_item, n, UC_CONF_PARAM_ADMIN_LOG_FILE, admin_log_file);
1142 
1143  unicas_conf->num_header = n;
1144  unicas_conf->header_conf = conf_item;
1145  return 0;
1146 }
1147 
1148 static int
1149 admin_common (T_BROKER_INFO * br_info, int *num_broker, int *master_shm_id, char *admin_log_file, char *err_msg,
1150  char admin_flag, bool * acl_flag, char *acl_file)
1151 {
1152  if (broker_config_read (NULL, br_info, num_broker, master_shm_id, admin_log_file, admin_flag, acl_flag, acl_file,
1153  err_msg) < 0)
1154  {
1155  return -1;
1156  }
1157 
1158  ut_cd_work_dir ();
1159 
1160  if (!admin_flag)
1161  {
1162  return 0;
1163  }
1164 
1165 #if defined(WINDOWS)
1166  if (wsa_initialize () < 0)
1167  {
1168  strcpy (err_msg, "Error: WSAinit");
1169  return -1;
1170  }
1171 #endif /* WINDOWS */
1172 
1173 #if 0
1174  if (admin_get_host_ip ())
1175  {
1176  CP_ADMIN_ERR_MSG (err_msg);
1177  return -1;
1178  }
1179 #endif
1180 
1181  admin_init_env ();
1182 
1183  return 0;
1184 }
1185 
1186 static int
1187 copy_job_info (T_JOB_INFO ** ret_job_info, T_MAX_HEAP_NODE * job_q)
1188 {
1189  int num_job = job_q[0].id;
1190  int i;
1191  T_MAX_HEAP_NODE item;
1192  T_JOB_INFO *job_info;
1193 
1194  job_info = (T_JOB_INFO *) malloc (sizeof (T_JOB_INFO) * num_job);
1195  if (job_info == NULL)
1196  {
1197  return 0;
1198  }
1199  memset (job_info, 0, sizeof (T_JOB_INFO) * num_job);
1200 
1201  for (i = 0; i < num_job; i++)
1202  {
1203  if (max_heap_delete (job_q, &item) < 0)
1204  {
1205  num_job = i;
1206  break;
1207  }
1208  job_info[i].id = item.id;
1209  job_info[i].priority = item.priority;
1210  memcpy (job_info[i].ip, item.ip_addr, 4);
1211  job_info[i].recv_time = item.recv_time;
1212  strncpy (job_info[i].script, item.script, sizeof (job_info[i].script) - 1);
1213  strncpy (job_info[i].prgname, item.prg_name, sizeof (job_info[i].prgname) - 1);
1214  }
1215 
1216  *ret_job_info = job_info;
1217  return num_job;
1218 }
1219 
1220 static const char *
1221 get_as_type_str (char as_type)
1222 {
1223  if (as_type == APPL_SERVER_CAS_ORACLE)
1224  {
1226  }
1227  if (as_type == APPL_SERVER_CAS_MYSQL51)
1228  {
1230  }
1231  if (as_type == APPL_SERVER_CAS_MYSQL)
1232  {
1234  }
1236 }
1237 
1238 static int
1239 get_as_type (const char *type_str)
1240 {
1241  if (strcasecmp (type_str, APPL_SERVER_CAS_ORACLE_TYPE_NAME) == 0)
1242  {
1243  return APPL_SERVER_CAS_ORACLE;
1244  }
1245  if (strcasecmp (type_str, APPL_SERVER_CAS_MYSQL51_TYPE_NAME) == 0)
1246  {
1247  return APPL_SERVER_CAS_MYSQL51;
1248  }
1249  if (strcasecmp (type_str, APPL_SERVER_CAS_MYSQL_TYPE_NAME) == 0)
1250  {
1251  return APPL_SERVER_CAS_MYSQL;
1252  }
1253  return APPL_SERVER_CAS;
1254 }
1255 
1256 static void
1257 change_conf_as_type (T_BR_CONF * br_conf, int old_as_type, int new_as_type)
1258 {
1259  int num;
1260  T_UC_CONF_ITEM *item;
1261 
1262  if (old_as_type == new_as_type)
1263  return;
1264 
1265  num = br_conf->num;
1266  item = br_conf->item;
1267  if (IS_APPL_SERVER_TYPE_CAS (old_as_type))
1268  {
1271  }
1272  num = br_conf->num - 1;
1273  br_conf->num = num;
1274 }
1275 
1276 static void
1277 reset_conf_value (int num_item, T_UC_CONF_ITEM * item, const char *name)
1278 {
1279  int i;
1280 
1281  for (i = 0; i < num_item; i++)
1282  {
1283  if (strcasecmp (item[i].name, name) == 0)
1284  {
1285  if (item[i].value)
1286  {
1287  item[i].value[0] = '\0';
1288  }
1289  return;
1290  }
1291  }
1292 }
1293 
1294 static void
1295 admin_log_write (const char *log_file, const char *msg)
1296 {
1297  FILE *fp;
1298  struct tm ct;
1299  time_t ts;
1300 
1301  fp = fopen (log_file, "a");
1302  if (fp != NULL)
1303  {
1304  ts = time (NULL);
1305  memset (&ct, 0x0, sizeof (struct tm));
1306  localtime_r (&ts, &ct);
1307  fprintf (fp, "%d/%02d/%02d %02d:%02d:%02d %s\n", ct.tm_year + 1900, ct.tm_mon + 1, ct.tm_mday, ct.tm_hour,
1308  ct.tm_min, ct.tm_sec, msg);
1309  fclose (fp);
1310  }
1311 }
1312 
1313 static int
1314 uc_changer_internal (const char *br_name, const char *name, const char *value, int as_number, char *err_msg)
1315 {
1316  T_BROKER_INFO br_info[MAX_BROKER_NUM];
1317  int num_broker, master_shm_id;
1318  char admin_log_file[BROKER_PATH_MAX];
1319 
1320  if (admin_common (br_info, &num_broker, &master_shm_id, admin_log_file, err_msg, 0, NULL, NULL) < 0)
1321  {
1322  return -1;
1323  }
1324  if (admin_conf_change (master_shm_id, br_name, name, value, as_number) < 0)
1325  {
1326  strcpy (err_msg, "ERROR : changer");
1327  return -1;
1328  }
1329  return 0;
1330 }
#define UC_CONF_PARAM_APPL_SERVER
void ut_cd_work_dir(void)
Definition: broker_util.c:335
int long_transaction_time
#define APPL_SERVER_CAS_TYPE_NAME
Definition: broker_config.h:44
#define APPL_SERVER_CAS
Definition: broker_config.h:34
INT64 num_long_transactions
Definition: broker_shm.h:347
char database_name[SRV_CON_DBNAME_SIZE]
Definition: broker_shm.h:352
static int get_as_type(const char *type_str)
DLL_EXPORT int uc_add(const char *br_name, char *err_msg)
time_t recv_time
#define TRUE
Definition: broker_admin.c:49
#define UC_CONF_PARAM_LOG_DIR
int max_heap_delete(T_MAX_HEAP_NODE *max_heap, T_MAX_HEAP_NODE *ret)
#define DEFAULT_LOG_DIR
#define UC_CONF_PARAM_MAX_NUM_APPL_SERVER
DLL_EXPORT int uc_unicas_conf(T_UC_CONF *unicas_conf, int *ret_mst_shmid, char *err_msg)
T_BROKER_INFO br_info[1]
Definition: broker_shm.h:661
#define DEFAULT_LONG_QUERY_TIME
Definition: broker_config.h:80
T_MAX_HEAP_NODE job_queue[JOB_QUEUE_MAX_SIZE+1]
Definition: broker_shm.h:637
#define UC_CONF_PARAM_LONG_TRANSACTION_TIME
DLL_EXPORT int uc_get_as_num_with_opened_shm(void *shm_br, int br_index, char *err_msg)
char stripped_column_name
Definition: cas.c:168
int admin_start_cmd(T_BROKER_INFO *br_info, int br_num, int master_shm_id, bool acl_flag, char *acl_file)
#define SHM_BROKER
Definition: broker_shm.h:64
#define UC_CONF_PARAM_MAX_STRING_LENGTH
DLL_EXPORT void uc_shm_detach(void *p)
char * ut_get_ipv4_string(char *ip_str, int len, const unsigned char *ip_addr)
Definition: broker_util.c:474
unsigned char cas_clt_ip[4]
Definition: broker_shm.h:323
#define JOB_QUEUE_MAX_SIZE
Definition: broker_shm.h:116
#define BROKER_PATH_MAX
Definition: broker_config.h:91
#define SET_CONF_ITEM_INT(CONF_ITEM, IDX, NAME, VALUE, FMT)
time_t last_access_time
Definition: broker_shm.h:317
DLL_EXPORT int uc_cas_changer(const char *br_name, const char *name, const char *value, int as_number, char *err_msg)
int admin_conf_change(int master_shm_id, const char *br_name, const char *conf_name, const char *conf_value, int as_number)
DLL_EXPORT int uc_on(const char *br_name, char *err_msg)
#define DEFAULT_TIME_TO_KILL
Definition: broker_config.h:71
char log_msg[SHM_LOG_MSG_SIZE]
Definition: broker_shm.h:342
#define UC_CONF_PARAM_ACCESS_LIST
#define UC_CONF_PARAM_MIN_NUM_APPL_SERVER
int admin_add_cmd(int master_shm_id, const char *broker)
T_AS_STATUS status
#define UC_CONF_PARAM_LONG_QUERY_TIME
DLL_EXPORT int uc_changer(const char *br_name, const char *name, const char *value, char *err_msg)
#define APPL_SERVER_CAS_MYSQL_TYPE_NAME
Definition: broker_config.h:46
T_BR_CONF * br_conf
int wsa_initialize()
#define UTS_STATUS_RESTART
Definition: broker_shm.h:47
DLL_EXPORT int uc_get_br_name_with_opened_shm(void *shm_br, int br_index, char *name, int buffer_size, char *err_msg)
INT64 num_long_query
INT64 num_queries_processed
Definition: broker_shm.h:345
#define UC_CONF_PARAM_MASTER_SHM_ID
#define UTS_STATUS_BUSY
Definition: broker_shm.h:45
#define SET_CONF_ITEM_SQL_LOG_MODE(CONF_ITEM, IDX, NAME, VALUE)
int appl_server_hard_limit
DLL_EXPORT int uc_start(char *err_msg)
DLL_EXPORT int uc_drop(const char *br_name, char *err_msg)
DLL_EXPORT int uc_del_cas_log(const char *br_name, int asid, char *err_msg)
#define UC_CONF_PARAM_SLOW_LOG
const char * name
T_UC_CONF_ITEM * header_conf
DLL_EXPORT void uc_unicas_conf_free(T_UC_CONF *unicas_conf)
DLL_EXPORT int uc_br_info(T_BR_INFO **ret_br_info, char *err_msg)
char auto_add_flag
char keep_connection
#define APPL_SERVER_CAS_ORACLE_TYPE_NAME
Definition: broker_config.h:45
#define UC_CONF_PARAM_JOB_QUEUE_SIZE
#define APPL_SERVER_CAS_MYSQL
Definition: broker_config.h:37
#define UC_CONF_PARAM_APPL_SERVER_HARD_LIMIT
#define APPL_SERVER_CAS_ORACLE
Definition: broker_config.h:35
static void reset_conf_value(int num_item, T_UC_CONF_ITEM *item, const char *name)
int broker_config_read(const char *conf_file, T_BROKER_INFO *br_info, int *num_broker, int *br_shm_id, char *admin_log_file, char admin_flag, bool *acl_flag, char *acl_file, char *admin_err_msg)
#define MAX_BROKER_NUM
Definition: broker_config.h:50
DLL_EXPORT int uc_as_info(const char *br_name, T_AS_INFO **ret_as_info, T_JOB_INFO **job_info, int *num_job, char *err_msg)
char slow_log_mode
#define UC_CONF_PARAM_SQL_LOG2
#define CP_ADMIN_ERR_MSG(BUF)
#define UC_CONF_PARAM_ACCESS_LOG
#define UC_CONF_PARAM_LOG_BACKUP
INT64 num_interrupts
#define UC_CONF_PARAM_AUTO_ADD_APPL_SERVER
static int conf_copy_header(T_UC_CONF *unicas_conf, int master_shm_id, char *admin_log_file, char *err_msg)
INT64 num_error_queries
static const char * get_as_type_str(char as_type)
static int uc_changer_internal(const char *br_name, const char *name, const char *value, int as_number, char *err_msg)
void uw_shm_detach(void *p)
Definition: broker_shm.c:700
char clt_appl_name[APPL_NAME_LENGTH]
Definition: broker_shm.h:332
#define UC_CONF_PARAM_SQL_LOG_MAX_SIZE
INT64 num_error_query
DLL_EXPORT int uc_get_active_session_with_opened_shm(void *shm_p, char *err_msg)
#define APPL_SERVER_CAS_MYSQL51_TYPE_NAME
Definition: broker_config.h:47
DLL_EXPORT int uc_stop(char *err_msg)
DLL_EXPORT const char * uc_version()
#define UC_CONF_PARAM_ADMIN_LOG_FILE
static void change_conf_as_type(T_BR_CONF *br_conf, int old_as_type, int new_as_type)
static char * get_broker_name(T_BR_CONF *br_conf)
DLL_EXPORT int uc_get_as_reqs_received_with_opened_shm(void *shm_as, long long array[], int array_size, char *err_msg)
#define FMT_X
#define NULL
Definition: freelistheap.h:34
#define DEFAULT_SQL_LOG_MAX_SIZE
Definition: broker_config.h:79
char acl_file[CONF_LOG_FILE_LEN]
#define UC_CONF_PARAM_SESSION_TIMEOUT
pid_t pid
Definition: dynamic_load.c:955
#define DEFAULT_SERVER_MAX_SIZE
Definition: broker_config.h:66
#define FMT_D
char auto_add_appl_server
char clt_req_path_info[APPL_NAME_LENGTH]
Definition: broker_shm.h:333
#define UC_CONF_PARAM_SQL_LOG
DLL_EXPORT void * uc_broker_shm_open(char *err_msg)
#define FREE_MEM(PTR)
Definition: cas_common.h:58
char script[PRE_SEND_SCRIPT_SIZE]
#define DLL_EXPORT
INT64 num_long_tran
#define SET_CONF_ITEM_ONOFF(CONF_ITEM, IDX, NAME, VALUE)
INT64 num_transactions_processed
Definition: broker_shm.h:344
#define DEFAULT_LONG_TRANSACTION_TIME
Definition: broker_config.h:81
char access_list_flag
static T_SHM_APPL_SERVER * shm_appl
Definition: broker.c:311
DLL_EXPORT int uc_get_br_num_with_opened_shm(void *shm_br, char *err_msg)
DLL_EXPORT void * uc_as_shm_open(void *shm_br, int br_index, char *err_msg)
INT64 num_requests_received
char access_log_file[CONF_LOG_FILE_LEN]
#define UC_CONF_PARAM_SOURCE_ENV
char log_backup_flag
char database_host[CUB_MAXHOSTNAMELEN]
Definition: broker_shm.h:353
DLL_EXPORT void uc_change_config(T_UC_CONF *unicas_conf, const char *br_name, const char *name, const char *value)
static T_SHM_BROKER * shm_br
Definition: broker.c:310
char prg_name[PRE_SEND_PRG_NAME_SIZE]
DLL_EXPORT int uc_off(const char *br_name, char *err_msg)
time_t last_connect_time
int appl_server_max_size
#define SET_FLAG(ONOFF)
static int br_index
Definition: broker.c:315
static int copy_job_info(T_JOB_INFO **job_info, T_MAX_HEAP_NODE *job_q)
static char database_name[MAX_HA_DBINFO_LENGTH]
Definition: cas_execute.c:387
#define IS_APPL_SERVER_TYPE_CAS(x)
Definition: broker_config.h:39
#define UC_CONF_PARAM_KEEP_CONNECTION
DLL_EXPORT int uc_get_as_query_processed_with_opened_shm(void *shm_as, long long array[], int array_size, char *err_msg)
time_t last_connect_time
Definition: broker_shm.h:357
INT64 num_requests_received
Definition: broker_shm.h:343
static int admin_common(T_BROKER_INFO *br_info, int *num_broker, int *master_shm_id, char *admin_log_file, char *err_msg, char admin_flag, bool *acl_flag, char *acl_file)
int long_transaction_time
T_UC_CONF_ITEM * item
#define SET_CONF_ITEM_STR(CONF_ITEM, IDX, NAME, VALUE)
char source_env_flag
unsigned char ip_addr[4]
INT64 num_queries_processed
#define UC_CONF_PARAM_ERROR_LOG_DIR
INT64 num_long_transactions
#define UC_CONF_PARAM_TIME_TO_KILL
INT64 num_interrupts
char name[BROKER_NAME_LEN]
INT64 num_transactions_processed
#define UC_CONF_PARAM_STRIPPED_COLUMN_NAME
#define MAX_NUM_CONF
#define UC_CONF_PARAM_SLOW_LOG_DIR
int get_psinfo(int pid, T_PSINFO *ps)
T_APPL_SERVER_INFO * as_info
Definition: cas.c:153
int admin_on_cmd(int master_shm_id, const char *broker_name)
int admin_del_cas_log(int master_shmid, const char *broker, int asid)
#define UC_CONF_PARAM_BROKER_NAME
DLL_EXPORT int uc_get_as_tran_processed_with_opened_shm(void *shm_as, long long array[], int array_size, char *err_msg)
T_APPL_SERVER_INFO as_info[APPL_SERVER_NUM_LIMIT]
Definition: broker_shm.h:641
#define ONE_K
Definition: porting.h:62
DLL_EXPORT int uc_conf_broker_add(T_UC_CONF *unicas_conf, const char *br_name, char *err_msg)
int admin_stop_cmd(int master_shm_id)
int i
Definition: dynamic_load.c:954
time_t last_access_time
char * strdup(const char *str)
Definition: porting.c:901
int getsize(int pid)
int appl_server_shm_id
Definition: shard_proxy.c:42
#define APPL_SERVER_CAS_MYSQL51
Definition: broker_config.h:36
static void conf_item_free(T_UC_CONF_ITEM *conf_item, int num)
char service_flag
INT64 num_long_queries
static int conf_copy_broker(T_UC_CONF *unicas_conf, T_BROKER_INFO *br_conf, int num_br, char *err_msg)
char source_env[CONF_LOG_FILE_LEN]
#define CHECK_SHARED_MEMORY(p_shm, err_msg)
void * uw_shm_open(int shm_key, int which_shm, T_SHM_MODE shm_mode)
Definition: broker_shm.c:139
#define UC_CONF_PARAM_APPL_SERVER_SHM_ID
#define makestring(x)
DLL_EXPORT int uc_restart(const char *br_name, int as_index, char *err_msg)
int admin_drop_cmd(int master_shm_id, const char *broker)
#define UC_CONF_PARAM_SERVICE
#define UC_CONF_PARAM_APPL_SERVER_MAX_SIZE
static void admin_log_write(const char *log_file, const char *msg)
const char ** p
Definition: dynamic_load.c:945
int admin_restart_cmd(int master_shm_id, const char *broker, int as_index)
#define UC_CONF_PARAM_BROKER_PORT
void admin_init_env()
int admin_off_cmd(int master_shm_id, const char *broker_name)
DLL_EXPORT void uc_info_free(void *info)
#define SHM_APPL_SERVER
Definition: broker_shm.h:63
#define SET_CONF_ITEM_KEEP_CON(CONF_ITEM, IDX, NAME, VALUE)