void sql_string_parser::parse_sql_string()

in source/pdo_sqlsrv/pdo_parser.cpp [395:450]


void sql_string_parser::parse_sql_string( void ) {
    try {
        int start_pos = -1;
        while ( !this->is_eos() ) {
            // if pos is -1, then reading from a string is an initialized read
            if ( pos == -1 ) {
                next();
            }
            // skip until a '"', '\'', ':' or '?'
            char sym;
            while ( this->orig_str[pos] != '"' && this->orig_str[pos] != '\'' && this->orig_str[pos] != ':' && this->orig_str[pos] != '?' && !this->is_eos() ) {
                next();
            }
            sym = this->orig_str[pos];
            // if '"' or '\'', skip until the next '"' or '\'' respectively
            if ( sym == '"' || sym == '\'' ) {
                next();
                while ( this->orig_str[pos] != sym && !this->is_eos() ) {
                    next();
                }
            }
            // if ':', store string placeholder in the placeholders hashtable
            else if ( sym == ':' ) {
                start_pos = this->pos;
                next();
                // keep going until the next space or line break
                // while (!is_white_space(this->orig_str[pos]) && !this->is_eos()) {
                while ( is_placeholder_char( this->orig_str[pos] )) {
                    next();
                }
                add_key_value_pair( &( this->orig_str[start_pos] ), this->pos - start_pos );
                discard_white_spaces();
                // if an '=' is right after a placeholder, it means the placeholder is for output parameters
                //  and emulate prepare does not support output parameters
                if (this->orig_str[pos] == '=') {
                    THROW_PDO_ERROR(this->ctx, PDO_SQLSRV_ERROR_EMULATE_INOUT_UNSUPPORTED);
                }
                this->current_key++;
            }
            // if '?', store long placeholder into the placeholders hashtable
            else if ( sym == '?' ) {
                next();
                // add dummy value to placeholders ht to keep count of the number of placeholders
                add_key_int_value_pair( this->current_key );
                discard_white_spaces();
                if (this->orig_str[pos] == '=') {
                    THROW_PDO_ERROR(this->ctx, PDO_SQLSRV_ERROR_EMULATE_INOUT_UNSUPPORTED);
                }
                this->current_key++;
            }
        }
    }
    catch ( pdo::PDOException& ) {
        throw;
    }
}