00001
00002
00003
00004
00005
00006
00007
00008 #include "ElementInsertion.h"
00009 #include "../sqllib/sqllib.h"
00010
00011 namespace osmdb
00012 {
00013
00014 osmdb::ElementInsertion::ElementInsertion(OsmDatabase& db):
00015 db(db),
00016 node_ins(sqllib::get_insert_node(db.get_db(), true, "node_ins_st")),
00017 edge_ins(sqllib::get_insert_edge(db.get_db(), true, "edge_ins_st")),
00018 waynode_ins(sqllib::get_insert_way_node(db.get_db(), true, "waynode_ins_st")),
00019 way_ins(sqllib::get_insert_way(db.get_db(), true, "way_ins_st")),
00020 node_attrs_ins(sqllib::get_insert_node_attr(db.get_db(), true, "node_attrs_ins_st")),
00021 way_attrs_ins(sqllib::get_insert_way_attr(db.get_db(), true, "way_attrs_ins_st")),
00022 rel_attrs_ins(sqllib::get_insert_rel_attribute(db.get_db(), true, "rel_attrs_ins_st")),
00023 rel_ins(sqllib::get_insert_relation(db.get_db(), true, "rel_ins_st")),
00024 node_mem_ins(sqllib::get_insert_node_member(db.get_db(), true, "node_member_ins_st")),
00025 way_mem_ins(sqllib::get_insert_way_member(db.get_db(), true, "way_member_ins_st")),
00026 rel_mem_ins(sqllib::get_insert_relation_member(db.get_db(), true, "rel_member_ins_st"))
00027 {
00028
00029 }
00030
00031 osmdb::ElementInsertion::~ElementInsertion()
00032 {
00033 }
00034
00035 void osmdb::ElementInsertion::insert_node(const osm::Node& nd)
00036 {
00037 node_ins.execute(nd.id, nd.position.lon, nd.position.lat);
00038 for (auto it = nd.tags.begin(); it != nd.tags.end(); ++it)
00039 {
00040 node_attrs_ins.execute(nd.id, it->first, it->second);
00041 }
00042 }
00043
00044 void osmdb::ElementInsertion::insert_way(const osm::Way& w)
00045 {
00046 way_ins.execute(w.id);
00047 for (unsigned int i = 0; i < w.nodes.size(); ++i)
00048 {
00049 waynode_ins.execute(w.id, w.nodes[i].id, i);
00050 if (i + 1 == w.nodes.size())
00051 break;
00052 edge_ins.execute(w.id, w.nodes[i].id, w.nodes[i+1].id, i);
00053 }
00054 for (auto it = w.tags.begin(); it != w.tags.end(); ++it)
00055 {
00056 way_attrs_ins.execute(w.id, it->first, it->second);
00057 }
00058 }
00059
00060 void osmdb::ElementInsertion::insert_relation(const osm::Relation& r)
00061 {
00062 rel_ins.execute(r.id);
00063 for (auto it = r.tags.begin(); it != r.tags.end(); ++it)
00064 {
00065 rel_attrs_ins.execute(r.id, it->first, it->second);
00066 }
00067 for (auto it = r.members.begin(); it != r.members.end(); ++it)
00068 {
00069 it->second->add_to_relation(*this, r.id, it->first);
00070 }
00071 }
00072
00073 void ElementInsertion::insert_member_node(int64_t rel_id, const std::string& role, int64_t node_id)
00074 {
00075 node_mem_ins.execute(rel_id, role, node_id);
00076 }
00077
00078 void ElementInsertion::insert_member_way(int64_t rel_id, const std::string& role, int64_t way_id)
00079 {
00080 way_mem_ins.execute(rel_id, role, way_id);
00081 }
00082
00083 void ElementInsertion::insert_member_relation(int64_t parent_id, const std::string& role, int64_t child_id)
00084 {
00085 rel_mem_ins.execute(parent_id, role, child_id);
00086 }
00087
00088 }
00089