Skip to content

Commit 955da9b

Browse files
committed
Add rollback function to COPY manager
This way we can start to write a COPY line and, while writing it, change our mind and cancel that line. This is useful if we detect errors only while writing something out.
1 parent f14e7ab commit 955da9b

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

src/db-copy-mgr.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@ class db_copy_mgr_t
4343

4444
m_current = std::make_unique<db_cmd_copy_delete_t<DELETER>>(table);
4545
}
46+
m_committed = m_current->buffer.size();
47+
}
48+
49+
void rollback_line()
50+
{
51+
assert(m_current);
52+
m_current->buffer.resize(m_committed);
4653
}
4754

4855
/**
@@ -356,6 +363,7 @@ class db_copy_mgr_t
356363

357364
std::shared_ptr<db_copy_thread_t> m_processor;
358365
std::unique_ptr<db_cmd_copy_delete_t<DELETER>> m_current;
366+
std::size_t m_committed = 0;
359367
};
360368

361369
#endif // OSM2PGSQL_DB_COPY_MGR_HPP

tests/test-db-copy-mgr.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,4 +196,46 @@ TEST_CASE("copy_mgr_t")
196196
CHECK(res == v);
197197
}
198198
}
199+
200+
SECTION("Insert something and roll back")
201+
{
202+
auto const t = setup_table("t text");
203+
204+
mgr.new_line(t);
205+
mgr.add_column(0);
206+
mgr.add_column("foo");
207+
mgr.rollback_line();
208+
mgr.sync();
209+
210+
auto const conn = db.connect();
211+
CHECK(conn.get_count("test_copy_mgr") == 0);
212+
}
213+
214+
SECTION("Insert something, insert more, roll back, insert something else")
215+
{
216+
auto const t = setup_table("t text");
217+
218+
mgr.new_line(t);
219+
mgr.add_column(0);
220+
mgr.add_column("good");
221+
mgr.finish_line();
222+
223+
mgr.new_line(t);
224+
mgr.add_column(1);
225+
mgr.add_column("bad");
226+
mgr.rollback_line();
227+
228+
mgr.new_line(t);
229+
mgr.add_column(2);
230+
mgr.add_column("better");
231+
mgr.finish_line();
232+
mgr.sync();
233+
234+
auto const conn = db.connect();
235+
auto const res = conn.query(PGRES_TUPLES_OK,
236+
"SELECT t FROM test_copy_mgr ORDER BY id");
237+
CHECK(res.num_tuples() == 2);
238+
CHECK(res.get_value_as_string(0, 0) == "good");
239+
CHECK(res.get_value_as_string(1, 0) == "better");
240+
}
199241
}

0 commit comments

Comments
 (0)