libdballe 9.6
batch.h
1#ifndef DBALLE_DB_V7_BATCH_H
2#define DBALLE_DB_V7_BATCH_H
3
4#include <wreport/var.h>
5#include <dballe/types.h>
6#include <dballe/core/smallset.h>
7#include <dballe/db/v7/fwd.h>
8#include <dballe/db/v7/utils.h>
9#include <vector>
10#include <tuple>
11#include <memory>
12
13namespace dballe {
14namespace db {
15namespace v7 {
16struct Transaction;
17
18class Batch
19{
20protected:
21 bool write_attrs = true;
22 batch::Station* last_station = nullptr;
23
24 bool have_station(const std::string& report, const Coords& coords, const Ident& ident);
25 void new_station(Tracer<>& trc, const std::string& report, const Coords& coords, const Ident& ident);
26
27public:
28 Transaction& transaction;
29 unsigned count_select_stations = 0;
30 unsigned count_select_station_data = 0;
31 unsigned count_select_data = 0;
32
33 Batch(Transaction& transaction) : transaction(transaction) {}
34 ~Batch();
35
36 void set_write_attrs(bool write_attrs);
37
38 batch::Station* get_station(Tracer<>& trc, const dballe::DBStation& station, bool station_can_add);
39 batch::Station* get_station(Tracer<>& trc, const std::string& report, const Coords& coords, const Ident& ident);
40
41 void write_pending(Tracer<>& trc);
42 void clear();
43 void dump(FILE* out) const;
44};
45
46
47namespace batch {
48
49enum UpdateMode {
50 UPDATE,
51 IGNORE,
52 ERROR,
53};
54
56{
57 int id = MISSING_INT;
58 const wreport::Var* var;
59
60 StationDatum(const wreport::Var* var)
61 : var(var) {}
62 StationDatum(int id, const wreport::Var* var)
63 : id(id), var(var) {}
64
65 void dump(FILE* out) const;
66 bool operator<(const StationDatum& o) const { return var->code() < o.var->code(); }
67 bool operator==(const StationDatum& o) const { return var->code() == o.var->code(); }
68};
69
70inline const wreport::Varcode& station_data_ids_get_value(const IdVarcode& item) { return item.varcode; }
71
72struct StationDataIDs : public core::SmallSet<IdVarcode, wreport::Varcode, station_data_ids_get_value>
73{
74};
75
77{
78 StationDataIDs ids_by_code;
79 std::vector<StationDatum> to_insert;
80 std::vector<StationDatum> to_update;
81 bool loaded = false;
82
83 void add(const wreport::Var* var, UpdateMode on_conflict);
84 void write_pending(Tracer<>& trc, Transaction& tr, int station_id, bool with_attrs);
85};
86
88{
89 int id = MISSING_INT;
90 int id_levtr;
91 const wreport::Var* var;
92
93 MeasuredDatum(int id_levtr, const wreport::Var* var)
94 : id_levtr(id_levtr), var(var) {}
95 MeasuredDatum(int id, int id_levtr, const wreport::Var* var)
96 : id(id), id_levtr(id_levtr), var(var) {}
97
98 void dump(FILE* out) const;
99 bool operator<(const MeasuredDatum& o) const { return id_levtr < o.id_levtr || (id_levtr == o.id_levtr && var->code() < o.var->code()); }
100 bool operator==(const MeasuredDatum& o) const { return id_levtr == o.id_levtr && var->code() == o.var->code(); }
101};
102
104{
105 IdVarcode id_varcode;
106 int id;
107
108 MeasuredDataID(IdVarcode id_varcode, int id)
109 : id_varcode(id_varcode), id(id)
110 {
111 }
112};
113
114inline const IdVarcode& measured_data_ids_get_value(const MeasuredDataID& item) { return item.id_varcode; }
115
116struct MeasuredDataIDs : public core::SmallSet<MeasuredDataID, IdVarcode, measured_data_ids_get_value>
117{
118};
119
121{
122 Datetime datetime;
123 MeasuredDataIDs ids_on_db;
124 std::vector<MeasuredDatum> to_insert;
125 std::vector<MeasuredDatum> to_update;
126
127 MeasuredData(Datetime datetime)
128 : datetime(datetime)
129 {
130 }
131
132 void add(int id_levtr, const wreport::Var* var, UpdateMode on_conflict);
133 void write_pending(Tracer<>& trc, Transaction& tr, int station_id, bool with_attrs);
134};
135
136inline const Datetime& measured_data_vector_get_value(MeasuredData* const& item) { return item->datetime; }
137
138struct MeasuredDataVector : public core::SmallSet<MeasuredData*, Datetime, measured_data_vector_get_value>
139{
141 MeasuredDataVector(const MeasuredDataVector&) = delete;
144 MeasuredDataVector& operator=(const MeasuredDataVector&) = delete;
145 MeasuredDataVector& operator=(MeasuredDataVector&&) = default;
146};
147
149{
150 Batch& batch;
151 bool is_new = true;
152 StationData station_data;
153 MeasuredDataVector measured_data;
154
155 Station(Batch& batch)
156 : batch(batch) {}
157
158 StationData& get_station_data(Tracer<>& trc);
159 MeasuredData& get_measured_data(Tracer<>& trc, const Datetime& datetime);
160
161 void write_pending(Tracer<>& trc, bool with_attrs);
162 void dump(FILE* out) const;
163};
164
165}
166}
167}
168}
169
170#endif
A station identifier, that can be any string (including the empty string) or a missing value.
Definition: types.h:748
Definition: batch.h:19
Smart pointer for trace::Step objects, which calls done() when going out of scope.
Definition: db/v7/fwd.h:46
Varcode code() const
uint16_t Varcode
Coordinates.
Definition: types.h:369
Definition: types.h:851
Date and time.
Definition: types.h:165
Set structure optimized for a small number of items.
Definition: smallset.h:17
Definition: utils.h:12
Definition: transaction.h:16
Definition: batch.h:149
Common base types used by most of DB-All.e code.