Esempio n. 1
0
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;

}
Esempio n. 2
0
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);
        }
    }
}