bool sqlsrv_param::derive_string_types_sizes()

in source/shared/core_stmt.cpp [2237:2288]


bool sqlsrv_param::derive_string_types_sizes(_In_ zval* param_z)
{
    SQLSRV_ASSERT(encoding == SQLSRV_ENCODING_CHAR || encoding == SQLSRV_ENCODING_UTF8 || encoding == SQLSRV_ENCODING_BINARY, "Invalid encoding in sqlsrv_param::derive_string_types_sizes");

    // Derive the param SQL type only if it is unknown
    if (sql_data_type == SQL_UNKNOWN_TYPE) {
        switch (encoding) {
        case SQLSRV_ENCODING_CHAR:
            sql_data_type = SQL_VARCHAR;
            break;
        case SQLSRV_ENCODING_BINARY:
            sql_data_type = SQL_VARBINARY;
            break;
        case SQLSRV_ENCODING_UTF8:
            sql_data_type = SQL_WVARCHAR;
            break;
        default:
            break;
        }
    }

    bool is_numeric = is_a_numeric_type(sql_data_type);

    // Derive the C Data type next
    switch (encoding) {
    case SQLSRV_ENCODING_CHAR:
        c_data_type = SQL_C_CHAR;
        break;
    case SQLSRV_ENCODING_BINARY:
        c_data_type = SQL_C_BINARY;
        break;
    case SQLSRV_ENCODING_UTF8:
        c_data_type = is_numeric ? SQL_C_CHAR : SQL_C_WCHAR;
        break;
    default:
        break;
    }

    // Derive the column size also only if it is unknown
    if (column_size == SQLSRV_UNKNOWN_SIZE) {
        size_t char_size = (encoding == SQLSRV_ENCODING_UTF8) ? sizeof(SQLWCHAR) : sizeof(char);
        SQLULEN byte_len = Z_STRLEN_P(param_z) * char_size;

        if (byte_len > SQL_SERVER_MAX_FIELD_SIZE) {
            column_size = SQL_SERVER_MAX_TYPE_SIZE;
        } else {
            column_size = SQL_SERVER_MAX_FIELD_SIZE / char_size;
        }
    }

    return is_numeric;
}