libdballe  9.11
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 
13 namespace dballe {
14 namespace db {
15 namespace v7 {
16 struct Transaction;
17 
18 class Batch
19 {
20 protected:
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 
27 public:
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 
47 namespace batch {
48 
49 enum 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 
70 inline const wreport::Varcode& station_data_ids_get_value(const IdVarcode& item) { return item.varcode; }
71 
72 struct 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 
114 inline const IdVarcode& measured_data_ids_get_value(const MeasuredDataID& item) { return item.id_varcode; }
115 
116 struct 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 
136 inline const Datetime& measured_data_vector_get_value(MeasuredData* const& item) { return item->datetime; }
137 
138 struct MeasuredDataVector : public core::SmallSet<MeasuredData*, Datetime, measured_data_vector_get_value>
139 {
140  MeasuredDataVector() {}
141  MeasuredDataVector(const MeasuredDataVector&) = delete;
144  MeasuredDataVector& operator=(const MeasuredDataVector&) = delete;
145  MeasuredDataVector& operator=(MeasuredDataVector&&) = default;
146 };
147 
148 struct Station : public dballe::DBStation
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
Common base types used by most of DB-All.e code.
Coordinates.
Definition: types.h:368
Definition: cmdline.h:18
Definition: batch.h:148
Varcode code() const
A station identifier, that can be any string (including the empty string) or a missing value...
Definition: types.h:747
Definition: utils.h:11
uint16_t Varcode
Set structure optimized for a small number of items.
Definition: smallset.h:16
Definition: transaction.h:15
Smart pointer for trace::Step objects, which calls done() when going out of scope.
Definition: db/v7/fwd.h:45
Date and time.
Definition: types.h:164
Definition: batch.h:18
Definition: types.h:850