int set_record_val_by_type()

in holo-client-c/src/request.c [250:337]


int set_record_val_by_type(HoloRecord* record, int colIndex, const char* str, int len){
    Oid type = record->schema->columns[colIndex].type;
    char* ptr = NULL;
    switch (type){
    case HOLO_TYPE_INT2:
        ptr = (char*)new_record_val(record, 2);
        char* end;
        *(int16_t*)ptr = strtol(str, &end, 10);
        if (*end){
            LOG_ERROR("\"%s\" is not a int16 value.", str);
            revoke_record_val(ptr, record, 2);
            return HOLO_CLIENT_INVALID_PARAM;
        }
        endian_swap(ptr, 2);
        return set_record_val(record, colIndex, ptr, 1, 2);
        break;
    case HOLO_TYPE_INT4:
        ptr = (char*)new_record_val(record, 4);
        *(int32_t*)ptr = strtol(str, &end, 10);
        if (*end){
            LOG_ERROR("\"%s\" is not a int32 value.", str);
            revoke_record_val(ptr, record, 4);
            return HOLO_CLIENT_INVALID_PARAM;
        }
        endian_swap(ptr, 4);
        return set_record_val(record, colIndex, ptr, 1, 4);
        break;
    case HOLO_TYPE_INT8:
        ptr = (char*)new_record_val(record, 8);
        *(int64_t*)ptr = strtol(str, &end, 10);
        if (*end){
            LOG_ERROR("\"%s\" is not a int64 value.", str);
            revoke_record_val(ptr, record, 8);
            return HOLO_CLIENT_INVALID_PARAM;
        }
        endian_swap(ptr, 8);
        return set_record_val(record, colIndex, ptr, 1, 8);
        break;
    case HOLO_TYPE_BOOL:
        ptr = (char*)new_record_val(record, 1);
        char* tmp = MALLOC(len + 1, char);
        deep_copy_string_to(str, tmp, len);
        tmp[len] = '\0';
        to_lower_case(tmp, len);
        if (strncmp(tmp, "true", len + 1) == 0 || strncmp(tmp, "1", len + 1) == 0) *ptr = 1;
        else if (strncmp(tmp, "false", len + 1) == 0 || strncmp(tmp, "0", len + 1) == 0) *ptr = 0;
        else {
            LOG_ERROR("\"%s\" is not a bool value.", str);
            revoke_record_val(ptr, record, 1);
            FREE(tmp);
            return HOLO_CLIENT_INVALID_PARAM;
        }
        FREE(tmp);
        return set_record_val(record, colIndex, ptr, 1, 1);
        break;
    case HOLO_TYPE_FLOAT4:
        ptr = (char*)new_record_val(record, 4);
        *(float*)ptr = strtof(str, &end);
        if (*end){
            LOG_ERROR("\"%s\" is not a float value.", str);
            revoke_record_val(ptr, record, 4);
            return HOLO_CLIENT_INVALID_PARAM;
        }
        endian_swap(ptr, 4);
        return set_record_val(record, colIndex, ptr, 1, 4);
        break;
    case HOLO_TYPE_FLOAT8:
        ptr = (char*)new_record_val(record, 8);
        *(double*)ptr = strtod(str, &end);
        if (*end){
            LOG_ERROR("\"%s\" is not a double value.", str);
            revoke_record_val(ptr, record, 8);
            return HOLO_CLIENT_INVALID_PARAM;
        }
        endian_swap(ptr, 8);
        return set_record_val(record, colIndex, ptr, 1, 8);
        break;
    // TODO: timestamp的字符串解析成数字,统一两种写入方式
    default:
        ptr = (char*)new_record_val(record, len + 1);
        deep_copy_string_to(str, ptr, len);
        // add '\0', PQexecPrepared need it when processing text as parameter
        ptr[len] = '\0';
        return set_record_val(record, colIndex, ptr, 0, len + 1);
        break;
    }
    return HOLO_CLIENT_RET_OK;
}