SqlStatement Database::CreateStatement(SqlStatementID& index, const char* fmt) { int nId = -1; //check if statement ID is initialized if (!index.initialized()) { //convert to lower register std::string szFmt(fmt); //count input parameters int nParams = std::count(szFmt.begin(), szFmt.end(), '?'); //find existing or add a new record in registry LOCK_GUARD _guard(m_stmtGuard); PreparedStmtRegistry::const_iterator iter = m_stmtRegistry.find(szFmt); if (iter == m_stmtRegistry.end()) { nId = ++m_iStmtIndex; m_stmtRegistry[szFmt] = nId; } else nId = iter->second; //save initialized statement index info index.init(nId, nParams); } return SqlStatement(index, *this); }
unique_ptr<SqlStatement> ConcreteDatabase::makeStatement( SqlStatementID& index, std::string sqlText ) { //initialize the statement if its not (or missing in the registry) if(!index.isInitialized()) { //count input parameters size_t nParams = std::count(sqlText.begin(), sqlText.end(), '?'); UInt32 nId = _prepStmtRegistry.getStmtId(std::move(sqlText)); //save initialized statement index info index.init(nId, nParams); } else if (!_prepStmtRegistry.idDefined(index.getId())) _prepStmtRegistry.insertStmt(index.getId(),std::move(sqlText)); return unique_ptr<SqlStatement>(new SqlStatementImpl(index, *this)); }