1 #ifndef DBALLE_DB_V7_DATAV7_H 2 #define DBALLE_DB_V7_DATAV7_H 6 #include <dballe/db/defs.h> 7 #include <dballe/db/v7/state.h> 8 #include <wreport/var.h> 21 struct IdQueryBuilder;
24 struct InsertStationVars;
35 template<
typename Traits>
42 void read_attrs_into_values(
int id_data,
Values& values);
47 virtual void write_attrs(
int id_data,
const Values& values) = 0;
52 virtual void remove_all_attrs(
int id_data) = 0;
66 virtual void read_attrs(
int id_data, std::function<
void(std::unique_ptr<wreport::Var>)> dest) = 0;
76 void merge_attrs(
int id_data,
const Values& attrs);
81 void remove_attrs(
int data_id,
const db::AttrList& attrs);
84 virtual void insert(
dballe::db::v7::Transaction& t,
typename Traits::BulkVars& vars, bulk::UpdateMode update_mode=bulk::UPDATE,
bool with_attrs=
false) = 0;
90 virtual void dump(FILE* out) = 0;
102 void print_row(
int id,
int id_station,
wreport::Varcode code,
const char* val,
const std::vector<uint8_t>& attrs);
114 void print_row(
int id,
int id_station,
int id_levtr,
const Datetime& dt,
wreport::Varcode code,
const char* val,
const std::vector<uint8_t>& attrs);
122 static const unsigned FLAG_NEEDS_UPDATE = 1 << 0;
123 static const unsigned FLAG_UPDATED = 1 << 1;
124 static const unsigned FLAG_NEEDS_INSERT = 1 << 2;
125 static const unsigned FLAG_INSERTED = 1 << 3;
128 bool needs_update()
const {
return flags & FLAG_NEEDS_UPDATE; }
129 bool updated()
const {
return flags & FLAG_UPDATED; }
130 bool needs_insert()
const {
return flags & FLAG_NEEDS_INSERT; }
131 bool inserted()
const {
return flags & FLAG_INSERTED; }
132 void set_needs_update() { flags |= FLAG_NEEDS_UPDATE; }
133 void set_updated() { flags = (flags & ~FLAG_NEEDS_UPDATE) | FLAG_UPDATED; }
134 void set_needs_insert() { flags |= FLAG_NEEDS_INSERT; }
135 void set_inserted() { flags = (flags & ~FLAG_NEEDS_INSERT) | FLAG_INSERTED; }
142 void format_flags(
char* dest)
const;
145 template<
typename state_t>
148 typename state_t::iterator cur;
152 : cur(cur), var(var) {}
160 using VarItem::VarItem;
162 bool is_new()
const {
return false; }
163 bool has_cur(
State& state)
const {
return cur != state.stationvalues.end(); }
165 void dump(FILE* out)
const;
177 :
VarItem(cur, var), levtr(levtr) {}
179 bool is_new()
const {
return levtr.is_new; }
180 bool has_cur(
State& state)
const {
return cur != state.values.end(); }
181 void fill_cur(
State& state,
const ValueDesc& desc) { cur = state.values.find(desc); }
182 void dump(FILE* out)
const;
187 stations_t::iterator station;
190 SharedContext(stations_t::iterator station) : station(station) {}
192 bool is_new()
const {
return station->second.is_new; }
197 using SharedContext::SharedContext;
215 return ValueDesc(station, v.levtr.id, datetime, v.var->
code());
219 template<
typename var_t,
typename shared_context_t>
222 typedef typename std::vector<var_t>::iterator iterator;
225 shared_context_t shared_context;
227 bool do_insert =
false;
228 bool do_update =
false;
229 std::list<var_t*> to_query;
231 template<
typename... Args>
232 InsertPlan(
State& state, Args&&... args) : state(state), shared_context(std::forward<Args>(args)...) {}
242 for (
auto i = this->begin(); i != this->end(); ++i)
244 i->fill_cur(state, shared_context.make_desc(*i));
245 if (i->has_cur(state))
continue;
246 if (shared_context.is_new() || i->is_new())
continue;
247 to_query.push_back(&*i);
255 for (
auto& var: *
this)
257 if (!var.has_cur(state))
259 var.set_needs_insert();
264 var.set_needs_update();
277 using InsertPlan::InsertPlan;
286 emplace_back(state.stationvalues.end(), var);
289 void dump(FILE* out)
const;
299 using InsertPlan::InsertPlan;
301 bool has_datetime()
const 303 return not shared_context.datetime.is_missing();
306 void set_datetime(
const Datetime& dt)
308 shared_context.datetime = dt;
313 emplace_back(state.values.end(), var, levtr);
316 void dump(FILE* out)
const;
324 static const char* table_name;
330 static const char* table_name;
Definition: v7/qbuilder.h:115
Cache intermediate results during a database transaction, to avoid hitting the database multiple time...
Definition: state.h:140
Forward declarations for public dballe/sql names.
Copyright (C) 2008–2010 ARPA-SIM urpsim@smr.arpa.emr.it
Definition: cmdline.h:17
Input for a bulk insert of a lot of variables sharing the same context information.
Definition: data.h:275
Definition: db/v7/transaction.h:12
void map_known_values()
Fill the cur state pointer in all variables to insert.
Definition: data.h:239
Workflow information about a variable listed for bulk insert/update.
Definition: data.h:172
Date and time.
Definition: types.h:158
Input for a bulk insert of a lot of variables sharing the same context information.
Definition: data.h:297
Collection of Value objects, indexed by wreport::Varcode.
Definition: values.h:202
Workflow information about a variable listed for bulk insert/update.
Definition: data.h:158