void na_conf_env_init(struct json_object *environments_obj, na_env_t *na_env, int idx, bool reconf) { char *e; char host_buf[NA_HOSTNAME_MAX + 1]; na_host_t host; struct json_object *environment_obj; struct json_object *param_obj; environment_obj = json_object_array_get_idx(environments_obj, idx); for (int i=0;i<NA_PARAM_MAX;++i) { param_obj = json_object_object_get(environment_obj, na_param_name(i)); if (param_obj == NULL) { continue; } // runtime-reconfigurable parameters switch (i) { case NA_PARAM_IS_CONNPOOL_ONLY: NA_PARAM_TYPE_CHECK(param_obj, json_type_boolean); na_env->is_connpool_only = json_object_get_boolean(param_obj) == 1 ? true : false; continue; case NA_PARAM_REQUEST_BUFSIZE: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->request_bufsize = json_object_get_int(param_obj); continue; case NA_PARAM_REQUEST_BUFSIZE_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->request_bufsize_max = json_object_get_int(param_obj); continue; case NA_PARAM_RESPONSE_BUFSIZE: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->response_bufsize = json_object_get_int(param_obj); continue; case NA_PARAM_RESPONSE_BUFSIZE_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->response_bufsize_max = json_object_get_int(param_obj); continue; case NA_PARAM_CONN_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->conn_max = json_object_get_int(param_obj); continue; case NA_PARAM_ERROR_COUNT_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->error_count_max = json_object_get_int(param_obj); continue; default: break; } // if we didn't find a reconfigurable parameter, try the others if (!reconf) { switch (i) { case NA_PARAM_NAME: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); strncpy(na_env->name, json_object_get_string(param_obj), NA_NAME_MAX); break; case NA_PARAM_SOCKPATH: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); strncpy(na_env->fssockpath, json_object_get_string(param_obj), NA_SOCKPATH_MAX); break; case NA_PARAM_TARGET_SERVER: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); strncpy(host_buf, json_object_get_string(param_obj), NA_HOSTNAME_MAX); host = na_create_host(host_buf); memcpy(&na_env->target_server.host, &host, sizeof(host)); na_set_sockaddr(&host, &na_env->target_server.addr); break; case NA_PARAM_BACKUP_SERVER: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); strncpy(host_buf, json_object_get_string(param_obj), NA_HOSTNAME_MAX); host = na_create_host(host_buf); memcpy(&na_env->backup_server.host, &host, sizeof(host)); na_set_sockaddr(&host, &na_env->backup_server.addr); na_env->is_use_backup = true; break; case NA_PARAM_PORT: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->fsport = json_object_get_int(param_obj); break; case NA_PARAM_STPORT: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->stport = json_object_get_int(param_obj); break; case NA_PARAM_STSOCKPATH: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); strncpy(na_env->stsockpath, json_object_get_string(param_obj), NA_SOCKPATH_MAX); break; case NA_PARAM_ACCESS_MASK: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); na_env->access_mask = (mode_t)strtol(json_object_get_string(param_obj), &e, 8); break; case NA_PARAM_WORKER_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->worker_max = json_object_get_int(param_obj); break; case NA_PARAM_CONNPOOL_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->connpool_max = json_object_get_int(param_obj); break; case NA_PARAM_CONNPOOL_USE_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->connpool_use_max = json_object_get_int(param_obj); break; case NA_PARAM_CLIENT_POOL_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->client_pool_max = json_object_get_int(param_obj); break; case NA_PARAM_LOOP_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->loop_max = json_object_get_int(param_obj); break; case NA_PARAM_EVENT_MODEL: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); na_env->event_model = na_detect_event_model(json_object_get_string(param_obj)); if (na_env->event_model == NA_EVENT_MODEL_UNKNOWN) { NA_DIE_WITH_ERROR(NA_ERROR_INVALID_JSON_CONFIG); } break; default: // no through assert(false); break; } } } na_env->is_extensible_request_buf = na_env->request_bufsize < na_env->request_bufsize_max ? true : false; na_env->is_extensible_response_buf = na_env->response_bufsize < na_env->response_bufsize_max ? true : false; }
void na_conf_env_init(struct json_object *environments_obj, na_env_t *na_env, int idx) { char *e; char host_buf[NA_HOSTNAME_MAX + 1]; na_host_t host; struct json_object *environment_obj; struct json_object *param_obj; bool have_log_path_opt; bool have_slow_query_log_path_opt; have_log_path_opt = false; have_slow_query_log_path_opt = false; environment_obj = json_object_array_get_idx(environments_obj, idx); for (int i=0;i<NA_PARAM_MAX;++i) { double slow_query_sec; param_obj = json_object_object_get(environment_obj, na_param_name(i)); if (param_obj == NULL) { continue; } // runtime-reconfigurable parameters switch (i) { case NA_PARAM_REQUEST_BUFSIZE: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->request_bufsize = json_object_get_int(param_obj); break; case NA_PARAM_RESPONSE_BUFSIZE: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->response_bufsize = json_object_get_int(param_obj); break; case NA_PARAM_CONN_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->conn_max = json_object_get_int(param_obj); break; case NA_PARAM_LOG_ACCESS_MASK: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); na_env->log_access_mask = (mode_t)strtol(json_object_get_string(param_obj), &e, 8); break; case NA_PARAM_SLOW_QUERY_SEC: NA_PARAM_TYPE_CHECK(param_obj, json_type_double); slow_query_sec = json_object_get_double(param_obj); na_env->slow_query_sec.tv_sec = slow_query_sec; na_env->slow_query_sec.tv_nsec = 1000000000L * (slow_query_sec - (long)slow_query_sec); break; case NA_PARAM_SLOW_QUERY_LOG_PATH: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); strncpy(na_env->slow_query_log_path, json_object_get_string(param_obj), NA_PATH_MAX); have_slow_query_log_path_opt = true; break; case NA_PARAM_LOGPATH: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); strncpy(na_env->logpath, json_object_get_string(param_obj), NA_PATH_MAX); have_log_path_opt = true; break; case NA_PARAM_SLOW_QUERY_LOG_ACCESS_MASK: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); na_env->slow_query_log_access_mask = (mode_t)strtol(json_object_get_string(param_obj), &e, 8); break; case NA_PARAM_NAME: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); strncpy(na_env->name, json_object_get_string(param_obj), NA_NAME_MAX); break; case NA_PARAM_SOCKPATH: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); strncpy(na_env->fssockpath, json_object_get_string(param_obj), NA_PATH_MAX); break; case NA_PARAM_TARGET_SERVER: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); strncpy(host_buf, json_object_get_string(param_obj), NA_HOSTNAME_MAX); host = na_create_host(host_buf); memcpy(&na_env->target_server.host, &host, sizeof(host)); na_set_sockaddr(&host, &na_env->target_server.addr); break; case NA_PARAM_BACKUP_SERVER: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); strncpy(host_buf, json_object_get_string(param_obj), NA_HOSTNAME_MAX); host = na_create_host(host_buf); memcpy(&na_env->backup_server.host, &host, sizeof(host)); na_set_sockaddr(&host, &na_env->backup_server.addr); na_env->is_use_backup = true; break; case NA_PARAM_PORT: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->fsport = json_object_get_int(param_obj); break; case NA_PARAM_STPORT: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->stport = json_object_get_int(param_obj); break; case NA_PARAM_STSOCKPATH: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); strncpy(na_env->stsockpath, json_object_get_string(param_obj), NA_PATH_MAX); break; case NA_PARAM_ACCESS_MASK: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); na_env->access_mask = (mode_t)strtol(json_object_get_string(param_obj), &e, 8); break; case NA_PARAM_WORKER_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->worker_max = json_object_get_int(param_obj); break; case NA_PARAM_CONNPOOL_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->connpool_max = json_object_get_int(param_obj); break; case NA_PARAM_CLIENT_POOL_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->client_pool_max = json_object_get_int(param_obj); break; case NA_PARAM_LOOP_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->loop_max = json_object_get_int(param_obj); break; case NA_PARAM_EVENT_MODEL: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); na_env->event_model = na_detect_event_model(json_object_get_string(param_obj)); if (na_env->event_model == NA_EVENT_MODEL_UNKNOWN) { NA_DIE_WITH_ERROR(na_env, NA_ERROR_INVALID_JSON_CONFIG); } break; case NA_PARAM_SLOW_QUERY_LOG_FORMAT: NA_PARAM_TYPE_CHECK(param_obj, json_type_string); na_env->slow_query_log_format = na_detect_log_format(json_object_get_string(param_obj)); if (na_env->slow_query_log_format == NA_LOG_FORMAT_UNKNOWN) { NA_DIE_WITH_ERROR(na_env, NA_ERROR_INVALID_JSON_CONFIG); } break; case NA_PARAM_TRY_MAX: NA_PARAM_TYPE_CHECK(param_obj, json_type_int); na_env->try_max = json_object_get_int(param_obj); break; default: // no through assert(false); break; } } // open log, if enabled if (have_log_path_opt) { na_log_open(na_env); } // open slow query log, if enabled if (((na_env->slow_query_sec.tv_sec != 0) || (na_env->slow_query_sec.tv_nsec != 0))) { if (!have_slow_query_log_path_opt) { NA_DIE_WITH_ERROR(na_env, NA_ERROR_INVALID_JSON_CONFIG); } else { na_slow_query_open(na_env); } } }