void statement_impl::bind(values & values) { std::size_t cnt = 0; try { for (std::vector<details::standard_use_type*>::iterator it = values.uses_.begin(); it != values.uses_.end(); ++it) { // only bind those variables which are: // - either named and actually referenced in the statement, // - or positional std::string const& useName = (*it)->get_name(); if (useName.empty()) { // positional use element int position = static_cast<int>(uses_.size()); (*it)->bind(*this, position); uses_.push_back(*it); indicators_.push_back(values.indicators_[cnt]); } else { // named use element - check if it is used std::string const placeholder = ":" + useName; std::size_t pos = query_.find(placeholder); while (pos != std::string::npos) { // Retrieve next char after placeholder // make sure we do not go out of range on the string const char nextChar = (pos + placeholder.size()) < query_.size() ? query_[pos + placeholder.size()] : '\0'; if (std::isalnum(nextChar)) { // We got a partial match only, // keep looking for the placeholder pos = query_.find(placeholder, pos + placeholder.size()); } else { int position = static_cast<int>(uses_.size()); (*it)->bind(*this, position); uses_.push_back(*it); indicators_.push_back(values.indicators_[cnt]); // Ok we found it, done break; } } // In case we couldn't find the placeholder if (pos == std::string::npos) { values.add_unused(*it, values.indicators_[cnt]); } } cnt++; } } catch (...) { for (std::size_t i = ++cnt; i != values.uses_.size(); ++i) { values.add_unused(values.uses_[i], values.indicators_[i]); } throw; } }
void statement_impl::bind(values & values) { std::size_t cnt = 0; try { for (std::vector<details::standard_use_type *>::iterator it = values.uses_.begin(); it != values.uses_.end(); ++it) { // only bind those variables which are: // - either named and actually referenced in the statement, // - or positional std::string const & useName = (*it)->get_name(); if (useName.empty()) { // positional use element int position = static_cast<int>(uses_.size()); (*it)->bind(*this, position); uses_.push_back(*it); indicators_.push_back(values.indicators_[cnt]); } else { // named use element - check if it is used const std::string placeholder = ":" + useName; std::size_t pos = query_.find(placeholder); if (pos != std::string::npos) { const char nextChar = query_[pos + placeholder.size()]; if (nextChar == ' ' || nextChar == ',' || nextChar == '\0' || nextChar == ')') { int position = static_cast<int>(uses_.size()); (*it)->bind(*this, position); uses_.push_back(*it); indicators_.push_back(values.indicators_[cnt]); } else { values.add_unused(*it, values.indicators_[cnt]); } } else { values.add_unused(*it, values.indicators_[cnt]); } } cnt++; } } catch (...) { for (std::size_t i = ++cnt; i != values.uses_.size(); ++i) { values.add_unused(values.uses_[i], values.indicators_[i]); } throw; } }