Пример #1
0
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);
}
Пример #2
0
/// 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;
}
Пример #3
0
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;
}
Пример #4
0
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);
      }
}