output_pgsql_t::output_pgsql_t( std::shared_ptr<middle_query_t> const &mid, options_t const &o, std::shared_ptr<db_copy_thread_t> const ©_thread) : output_t(mid, o), m_builder(o.projection, o.enable_multi), expire(o.expire_tiles_zoom, o.expire_tiles_max_bbox, o.projection), ways_done_tracker(new id_tracker()), buffer(32768, osmium::memory::Buffer::auto_grow::yes), rels_buffer(1024, osmium::memory::Buffer::auto_grow::yes) { export_list exlist; m_enable_way_area = read_style_file(m_options.style, &exlist); m_tagtransform = tagtransform_t::make_tagtransform(&m_options, exlist); //for each table for (size_t i = 0; i < t_MAX; i++) { //figure out the columns this table needs columns_t columns = exlist.normal_columns( (i == t_point) ? osmium::item_type::node : osmium::item_type::way); //figure out what name we are using for this and what type std::string name = m_options.prefix; std::string type; switch(i) { case t_point: name += "_point"; type = "POINT"; break; case t_line: name += "_line"; type = "LINESTRING"; break; case t_poly: name += "_polygon"; type = "GEOMETRY"; // Actually POLGYON & MULTIPOLYGON but no way to limit to just these two break; case t_roads: name += "_roads"; type = "LINESTRING"; break; default: //TODO: error message about coding error util::exit_nicely(); } m_tables[i].reset( new table_t(name, type, columns, m_options.hstore_columns, m_options.projection->target_srs(), m_options.append, m_options.hstore_mode, copy_thread)); } }
output_pgsql_t::output_pgsql_t(const middle_query_t* mid_, const options_t &options_) : output_t(mid_, options_), ways_pending_tracker(new id_tracker()), ways_done_tracker(new id_tracker()), rels_pending_tracker(new id_tracker()) { reproj = m_options.projection; builder.set_exclude_broken_polygon(m_options.excludepoly); if (m_options.reproject_area) builder.set_reprojection(reproj.get()); m_export_list.reset(new export_list()); m_enable_way_area = read_style_file( m_options.style, m_export_list.get() ); try { m_tagtransform.reset(new tagtransform(&m_options)); } catch(const std::runtime_error& e) { fprintf(stderr, "%s\n", e.what()); fprintf(stderr, "Error: Failed to initialise tag processing.\n"); util::exit_nicely(); } expire.reset(new expire_tiles(&m_options)); //for each table m_tables.reserve(t_MAX); for (int i = 0; i < t_MAX; i++) { //figure out the columns this table needs columns_t columns = m_export_list->normal_columns((i == t_point)?OSMTYPE_NODE:OSMTYPE_WAY); //figure out what name we are using for this and what type std::string name = m_options.prefix; std::string type; switch(i) { case t_point: name += "_point"; type = "POINT"; break; case t_line: name += "_line"; type = "LINESTRING"; break; case t_poly: name += "_polygon"; type = "GEOMETRY"; // Actually POLGYON & MULTIPOLYGON but no way to limit to just these two break; case t_roads: name += "_roads"; type = "LINESTRING"; break; default: //TODO: error message about coding error util::exit_nicely(); } //tremble in awe of this massive constructor! seriously we are trying to avoid passing an //options object because we want to make use of the table_t in output_mutli_t which could //have a different tablespace/hstores/etc per table m_tables.push_back(std::shared_ptr<table_t>( new table_t( m_options.database_options.conninfo(), name, type, columns, m_options.hstore_columns, SRID, m_options.append, m_options.slim, m_options.droptemp, m_options.hstore_mode, m_options.enable_hstore_index, m_options.tblsmain_data, m_options.tblsmain_index ) )); } }