void SQLiteStatementImpl::bindImpl() { _stepCalled = false; _nextResponse = 0; if (_pStmt == 0) return; sqlite3_reset(_pStmt); // bind Bindings& binds = bindings(); int pc = sqlite3_bind_parameter_count(_pStmt); if (binds.empty() && 0 == pc) return; if (binds.empty() && pc > 0) throw ParameterCountMismatchException(); std::size_t pos = 1; // sqlite starts with 1 not 0! Bindings::iterator it = binds.begin(); Bindings::iterator itEnd = binds.end(); for (; it != itEnd && (*it)->canBind(); ++it) { std::size_t nc = (*it)->numOfColumnsHandled(); if (pos + nc > pc + 1) throw ParameterCountMismatchException(); (*it)->bind(pos); pos += nc; } }
void SQLiteStatementImpl::bindImpl() { _stepCalled = false; _nextResponse = 0; if (_pStmt == 0) return; sqlite3_reset(_pStmt); int paramCount = sqlite3_bind_parameter_count(_pStmt); BindIt bindEnd = bindings().end(); if (0 == paramCount || bindEnd == _bindBegin) { _canBind = false; return; } std::size_t availableCount = 0; Bindings::difference_type bindCount = 0; Bindings::iterator it = _bindBegin; for (; it != bindEnd; ++it) { availableCount += (*it)->numOfColumnsHandled(); if (availableCount <= paramCount) ++bindCount; else break; } Bindings::difference_type remainingBindCount = bindEnd - _bindBegin; if (bindCount < remainingBindCount) { bindEnd = _bindBegin + bindCount; _canBind = true; } else if (bindCount > remainingBindCount) throw ParameterCountMismatchException(); std::size_t boundRowCount; if (_bindBegin != bindings().end()) { boundRowCount = (*_bindBegin)->numOfRowsHandled(); Bindings::iterator oldBegin = _bindBegin; for (std::size_t pos = 1; _bindBegin != bindEnd && (*_bindBegin)->canBind(); ++_bindBegin) { if (boundRowCount != (*_bindBegin)->numOfRowsHandled()) throw BindingException("Size mismatch in Bindings. All Bindings MUST have the same size"); (*_bindBegin)->bind(pos); pos += (*_bindBegin)->numOfColumnsHandled(); } if ((*oldBegin)->canBind()) { //container binding will come back for more, so we must rewind _bindBegin = oldBegin; _canBind = true; } else _canBind = false; } }