int statement::column_index(string_t const& name) const { for (int c = 0, cc = column_count(); c < cc; ++c) { if ( name == column_name(c) ) return c; } throw no_such_column(name); }
/// Finds a column by name. /// /// \param name The name of the column to search for. /// /// \return The column identifier. /// /// \throw value_error If the name cannot be found. int sqlite::statement::column_id(const char* name) { std::map< std::string, int >& cache = _pimpl->column_cache; if (cache.empty()) { for (int i = 0; i < column_count(); i++) { const std::string aux_name = column_name(i); INV(cache.find(aux_name) == cache.end()); cache[aux_name] = i; } } const std::map< std::string, int >::const_iterator iter = cache.find(name); if (iter == cache.end()) throw invalid_column_error(_pimpl->db.db_filename(), name); else return (*iter).second; }
bool Sqlite3Table::select(sqlite3 * db, QueryData & inQuerydata, std::vector<QueryData> & outQuerydata) const { // exit_on_error(sqlite3_step(statement), __LINE__); std::vector<std::string> all_columns (extract_column_names(inQuerydata)); std::stringstream ss; ss << "SELECT * FROM " + mName; if(!all_columns.empty()) { ss << + " WHERE "; } bool first_add(true); for(auto it(all_columns.begin()); it != all_columns.end(); it++) { if(!first_add) { ss << " AND "; first_add = false; } ss << *it << " = @" << *it; } ss << ";"; // Prepare the statement sqlite3_stmt * statement; bool _success(true); _success = (_success && checkIfSqlError(sqlite3_prepare_v2(db, ss.str().c_str(),-1/*null-terminated*/,&statement,NULL), __FILE__, __LINE__)); // PERFORM BINDING for(auto it(inQuerydata.mStringColumns.begin()); it != inQuerydata.mStringColumns.end(); it++) _success = (_success && checkIfSqlError(mColumns.find(it->first)->second->bind(statement, &it->second), __FILE__, __LINE__)); for(auto it(inQuerydata.mIntColumns.begin()); it != inQuerydata.mIntColumns.end(); it++) _success = (_success && checkIfSqlError(mColumns.find(it->first)->second->bind(statement, &it->second), __FILE__, __LINE__)); for(auto it(inQuerydata.mDoubleColumns.begin()); it != inQuerydata.mDoubleColumns.end(); it++) _success = (_success && checkIfSqlError(mColumns.find(it->first)->second->bind(statement, &it->second), __FILE__, __LINE__)); for(auto it(inQuerydata.mNullColumns.begin()); it != inQuerydata.mNullColumns.end(); it++) _success = (_success && checkIfSqlError(mColumns.find(*it)->second->bind(statement, nullptr), __FILE__, __LINE__)); // Fill return data int _columnCount(sqlite3_column_count(statement)); while(sqlite3_step(statement) == SQLITE_ROW) { QueryData row_result; for(int c (0); c < _columnCount; c++) { std::string column_name(sqlite3_column_name(statement, c)); Sqlite3Column * column(mColumns.find(column_name)->second.get()); Sqlite3Type column_type(column->getType()); if(column_type == Sqlite3Null::_NAME) { row_result.mNullColumns.push_back(column_name); } else if(column_type == Sqlite3Integer::_NAME) { int * v = new int; column->value(statement, c, v); row_result.mIntColumns.emplace(column_name, *v); delete v; } else if(column_type == Sqlite3Real::_NAME) { double * v = new double; column->value(statement, c, v); row_result.mDoubleColumns.emplace(column_name, *v); delete v; } else if(column_type == Sqlite3Text::_NAME) { std::string * v = new std::string; column->value(statement, c, v); row_result.mStringColumns.emplace(column_name, *v); delete v; } else { _success = false; std::cerr << "Unimplemented type!" << std::endl; } } outQuerydata.push_back(row_result); } sqlite3_finalize(statement); return _success; }
static void end1_tag (void *data, const char *el) { /* GML element ending [Pass I] */ struct gml_params *params = (struct gml_params *) data; if (strcmp (el, "gml:featureMember") == 0) { params->is_feature = 0; return; } if (strcmp (el, "gml:featureMembers") == 0) { params->is_feature = 0; return; } if (strcasecmp (el, "gml:Point") == 0) { params->is_point = 0; params->geometry_column = 1; *(params->CharData) = '\0'; params->CharDataLen = 0; set_geometry (params, GEOM_POINT); return; } if (strcasecmp (el, "gml:MultiPoint") == 0) { params->is_multi_point = 0; params->geometry_column = 1; *(params->CharData) = '\0'; params->CharDataLen = 0; set_geometry (params, GEOM_MULTIPOINT); return; } if (strcasecmp (el, "gml:LineString") == 0) { params->is_linestring = 0; params->geometry_column = 1; *(params->CharData) = '\0'; params->CharDataLen = 0; set_geometry (params, GEOM_LINESTRING); return; } if (strcasecmp (el, "gml:MultiLineString") == 0) { params->is_multi_linestring = 0; params->geometry_column = 1; *(params->CharData) = '\0'; params->CharDataLen = 0; set_geometry (params, GEOM_MULTILINESTRING); return; } if (strcasecmp (el, "gml:Polygon") == 0) { params->is_polygon = 0; params->geometry_column = 1; *(params->CharData) = '\0'; params->CharDataLen = 0; set_geometry (params, GEOM_MULTIPOLYGON); return; } if (strcasecmp (el, "gml:MultiPolygon") == 0) { params->is_multi_polygon = 0; params->geometry_column = 1; *(params->CharData) = '\0'; params->CharDataLen = 0; set_geometry (params, GEOM_MULTIPOLYGON); return; } if (strcasecmp (el, "gml:MultiSurface") == 0) { params->is_multi_polygon = 0; params->geometry_column = 1; *(params->CharData) = '\0'; params->CharDataLen = 0; set_geometry (params, GEOM_MULTIPOLYGON); return; } if (params->is_feature) check_end1_fid (params, el); if (params->is_fid) { *(params->CharData + params->CharDataLen) = '\0'; column_name (params, el); } }