void snapshot_selection::write_ways(output_formatter &formatter) {
  // grab the ways, way nodes and tags
  // way nodes and tags are on a separate connections so that the
  // entire result set can be streamed from a single query.
  logger::message("Fetching ways");
  element_info elem;
  nodes_t nodes;
  tags_t tags;

  pqxx::result ways = w.prepared("extract_ways").exec();
  for (pqxx::result::const_iterator itr = ways.begin(); itr != ways.end();
       ++itr) {
    extract_elem(*itr, elem);
    extract_nodes(w.prepared("extract_way_nds")(elem.id).exec(), nodes);
    extract_tags(w.prepared("extract_way_tags")(elem.id).exec(), tags);
    formatter.write_way(elem, nodes, tags);
  }
}
void 
readonly_pgsql_selection::write_ways(output_formatter &formatter) {
  // grab the ways, way nodes and tags
  // way nodes and tags are on a separate connections so that the
  // entire result set can be streamed from a single query.
  logger::message("Fetching ways");
  element_info elem;
  nodes_t nodes;
  tags_t tags;
  
  formatter.start_element_type(element_type_way);
  // fetch in chunks...
  set<osm_id_t>::iterator prev_itr = sel_ways.begin();
  size_t chunk_i = 0;
  for (set<osm_id_t>::iterator n_itr = sel_ways.begin();
       ; ++n_itr, ++chunk_i) {
    bool at_end = n_itr == sel_ways.end();
    if ((chunk_i >= STRIDE) || ((chunk_i > 0) && at_end)) {
      stringstream query;
      query << "select w.id, w.visible, w.version, w.changeset_id, "
        "to_char(w.timestamp,'YYYY-MM-DD\"T\"HH24:MI:SS\"Z\"') as timestamp from "
        "current_ways w where w.id in (";
      std::copy(prev_itr, n_itr, infix_ostream_iterator<osm_id_t>(query, ","));
      query << ")";
      pqxx::result ways = w.exec(query);
      
      for (pqxx::result::const_iterator itr = ways.begin(); 
           itr != ways.end(); ++itr) {
        extract_elem(*itr, elem, cc);
        extract_nodes(w.prepared("extract_way_nds")(elem.id).exec(), nodes);
        extract_tags(w.prepared("extract_way_tags")(elem.id).exec(), tags);
        formatter.write_way(elem, nodes, tags);
      }
      
      chunk_i = 0;
      prev_itr = n_itr;
    }
    
    if (at_end) break;
  }
  formatter.end_element_type(element_type_way);
}