include/simdb/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
55 / 55
100.0%
Branches:
48 / 84
57.1%
Functions:
5 / 5
100.0%

pipeline/DatabaseAccessor.hpp
Line Branch Exec Source
1 // <DatabaseAccessor.hpp> -*- C++ -*-
2
3 #pragma once
4
5 #include "simdb/Assert.hpp"
6 #include "simdb/pipeline/AsyncDatabaseAccessor.hpp"
7 #include "simdb/sqlite/DatabaseManager.hpp"
8 #include "simdb/sqlite/PreparedINSERT.hpp"
9 #include "simdb/sqlite/Table.hpp"
10
11 namespace simdb::pipeline {
12
13 /*!
14 * \class DatabaseAccessor
15 *
16 * \brief Provides DatabaseManager access and per-App prepared INSERT objects
17 * for DatabaseStage. Used by DatabaseStage<AppT> to get the manager
18 * and getTableInserter<AppT>(table_name) for high-volume inserts.
19 */
20 class DatabaseAccessor
21 {
22 public:
23 /// \brief Construct with the DatabaseManager used for all operations.
24 /// \param db_mgr Non-null DatabaseManager.
25 12 DatabaseAccessor(DatabaseManager* db_mgr) :
26 12 db_mgr_(db_mgr)
27 {
28 12 }
29
30 /// \brief Return the DatabaseManager.
31 11172 DatabaseManager* getDatabaseManager() const { return db_mgr_; }
32
33 /// \brief Return a prepared INSERT for the given table; lazily builds inserters from App::defineSchema().
34 /// \tparam App App type (must have NAME and defineSchema()).
35 /// \param tbl_name Table name in the App's schema.
36 /// \return Raw pointer to the PreparedINSERT (owned by this accessor).
37 /// \throws DBException if the table is not in the App's schema.
38 33691 template <typename App> PreparedINSERT* getTableInserter(const std::string& tbl_name)
39 {
40
6/6
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<SimplePipeline>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 4 → 5 taken 22683 times.
✓ Branch 5 → 6 taken 22683 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<PipelineSnooper>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 4 → 5 taken 4998 times.
✓ Branch 5 → 6 taken 4998 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<simdb::argos::ArgosCollector>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 4 → 5 taken 6010 times.
✓ Branch 5 → 6 taken 6010 times.
67382 auto& inserters = tbl_inserters_by_app_[App::NAME];
41
6/6
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<SimplePipeline>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 9 → 10 taken 6 times.
✓ Branch 9 → 47 taken 22677 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<PipelineSnooper>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 9 → 10 taken 1 time.
✓ Branch 9 → 47 taken 4997 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<simdb::argos::ArgosCollector>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 9 → 10 taken 4 times.
✓ Branch 9 → 47 taken 6006 times.
33691 if (inserters.empty())
42 {
43
3/3
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<SimplePipeline>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 10 → 11 taken 6 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<PipelineSnooper>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 10 → 11 taken 1 time.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<simdb::argos::ArgosCollector>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 10 → 11 taken 4 times.
11 Schema schema;
44
3/3
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<SimplePipeline>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 11 → 12 taken 6 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<PipelineSnooper>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 11 → 12 taken 1 time.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<simdb::argos::ArgosCollector>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 11 → 12 taken 4 times.
11 App::defineSchema(schema);
45
46
6/6
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<SimplePipeline>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 44 → 15 taken 6 times.
✓ Branch 44 → 45 taken 6 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<PipelineSnooper>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 44 → 15 taken 2 times.
✓ Branch 44 → 45 taken 1 time.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<simdb::argos::ArgosCollector>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 44 → 15 taken 48 times.
✓ Branch 44 → 45 taken 4 times.
67 for (const auto& tbl : schema.getTables())
47 {
48 56 std::vector<std::string> col_names;
49
6/6
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<SimplePipeline>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 26 → 20 taken 12 times.
✓ Branch 26 → 27 taken 6 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<PipelineSnooper>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 26 → 20 taken 3 times.
✓ Branch 26 → 27 taken 2 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<simdb::argos::ArgosCollector>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 26 → 20 taken 120 times.
✓ Branch 26 → 27 taken 48 times.
191 for (const auto& col : tbl.getColumns())
50 {
51
3/3
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<SimplePipeline>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 23 → 24 taken 12 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<PipelineSnooper>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 23 → 24 taken 3 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<simdb::argos::ArgosCollector>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 23 → 24 taken 120 times.
135 col_names.emplace_back(col->getName());
52 }
53
54
3/3
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<SimplePipeline>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 29 → 30 taken 6 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<PipelineSnooper>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 29 → 30 taken 2 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<simdb::argos::ArgosCollector>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 29 → 30 taken 48 times.
56 SqlTable table(tbl.getName());
55
3/3
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<SimplePipeline>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 30 → 31 taken 6 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<PipelineSnooper>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 30 → 31 taken 2 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<simdb::argos::ArgosCollector>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 30 → 31 taken 48 times.
56 SqlColumns columns(col_names);
56
3/3
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<SimplePipeline>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 33 → 34 taken 6 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<PipelineSnooper>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 33 → 34 taken 2 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<simdb::argos::ArgosCollector>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 33 → 34 taken 48 times.
56 auto inserter = db_mgr_->prepareINSERT(std::move(table), std::move(columns));
57
3/3
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<SimplePipeline>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 36 → 37 taken 6 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<PipelineSnooper>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 36 → 37 taken 2 times.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<simdb::argos::ArgosCollector>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 36 → 37 taken 48 times.
56 inserters[tbl.getName()] = std::move(inserter);
58 }
59 11 }
60
61 33691 auto& inserter = inserters[tbl_name];
62
3/39
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<SimplePipeline>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 69 taken 22683 times.
✗ Branch 52 → 53 not taken.
✗ Branch 53 → 54 not taken.
✗ Branch 55 → 56 not taken.
✗ Branch 59 → 60 not taken.
✗ Branch 60 → 61 not taken.
✗ Branch 61 → 62 not taken.
✗ Branch 62 → 63 not taken.
✗ Branch 63 → 64 not taken.
✗ Branch 64 → 65 not taken.
✗ Branch 65 → 66 not taken.
✗ Branch 67 → 68 not taken.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<PipelineSnooper>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 69 taken 4998 times.
✗ Branch 52 → 53 not taken.
✗ Branch 53 → 54 not taken.
✗ Branch 55 → 56 not taken.
✗ Branch 59 → 60 not taken.
✗ Branch 60 → 61 not taken.
✗ Branch 61 → 62 not taken.
✗ Branch 62 → 63 not taken.
✗ Branch 63 → 64 not taken.
✗ Branch 64 → 65 not taken.
✗ Branch 65 → 66 not taken.
✗ Branch 67 → 68 not taken.
simdb::PreparedINSERT* simdb::pipeline::DatabaseAccessor::getTableInserter<simdb::argos::ArgosCollector>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 69 taken 6010 times.
✗ Branch 52 → 53 not taken.
✗ Branch 53 → 54 not taken.
✗ Branch 55 → 56 not taken.
✗ Branch 59 → 60 not taken.
✗ Branch 60 → 61 not taken.
✗ Branch 61 → 62 not taken.
✗ Branch 62 → 63 not taken.
✗ Branch 63 → 64 not taken.
✗ Branch 64 → 65 not taken.
✗ Branch 65 → 66 not taken.
✗ Branch 67 → 68 not taken.
33691 simdb_assert(inserter, "Table does not exist in schema for app: " << App::NAME);
63
64 33691 return inserter.get();
65 }
66
67 private:
68 DatabaseManager* db_mgr_ = nullptr;
69
70 using TableInserters = std::unordered_map<std::string, std::unique_ptr<PreparedINSERT>>;
71 std::unordered_map<std::string, TableInserters> tbl_inserters_by_app_;
72 };
73
74 } // namespace simdb::pipeline
75