bool sqlsrv_param_inout::prepare_param()

in source/shared/core_stmt.cpp [2604:2673]


bool sqlsrv_param_inout::prepare_param(_In_ zval* param_ref, _Inout_ zval* param_z)
{
    // Save the output param reference now
    param_ptr_z = param_ref;
    
    int type = Z_TYPE_P(param_z);
    was_null = (type == IS_NULL);
    was_bool = (type == IS_TRUE || type == IS_FALSE);

    if (direction == SQL_PARAM_INPUT_OUTPUT) {
        // If the user asks for for a specific type for input and output, make sure the data type we send matches the data we
        // type we expect back, since we can only send and receive the same type. Anything can be converted to a string, so
        // we always let that match if they want a string back.
        bool matched = false;

        switch (php_out_type) {
        case SQLSRV_PHPTYPE_INT:
            if (was_null || was_bool) {
                convert_to_long(param_z);
            }
            matched = (Z_TYPE_P(param_z) == IS_LONG);
            break;
        case SQLSRV_PHPTYPE_FLOAT:
            if (was_null) {
                convert_to_double(param_z);
            }
            matched = (Z_TYPE_P(param_z) == IS_DOUBLE);
            break;
        case SQLSRV_PHPTYPE_STRING:
            // anything can be converted to a string
            convert_to_string(param_z);
            matched = true;
            break;
        case SQLSRV_PHPTYPE_NULL:
        case SQLSRV_PHPTYPE_DATETIME:
        case SQLSRV_PHPTYPE_STREAM:
        default:
            SQLSRV_ASSERT(false, "sqlsrv_param_inout::prepare_param -- invalid type for an output parameter.");
            break;
        }

        return matched;
    } else if (direction == SQL_PARAM_OUTPUT) {
        // If the user specifies a certain type for an output parameter, we have to convert the zval
        // to that type so that when the buffer is filled, the type is correct. But first,
        // should check if a LOB type is specified.
        switch (php_out_type) {
        case SQLSRV_PHPTYPE_INT:
            convert_to_long(param_z);
            break;
        case SQLSRV_PHPTYPE_FLOAT:
            convert_to_double(param_z);
            break;
        case SQLSRV_PHPTYPE_STRING:
            convert_to_string(param_z);
            break;
        case SQLSRV_PHPTYPE_NULL:
        case SQLSRV_PHPTYPE_DATETIME:
        case SQLSRV_PHPTYPE_STREAM:
        default:
            SQLSRV_ASSERT(false, "sqlsrv_param_inout::prepare_param -- invalid type for an output parameter");
            break;
        }

        return true;
    } else {
        SQLSRV_ASSERT(false, "sqlsrv_param_inout::prepare_param -- wrong param direction.");
    }
    return false;
}