bool get_field(uint32_t do_id, const DCField* field, vector<uint8_t> &value) { // Get class from the objects table DCClass* dcc = get_class(do_id); if(!dcc) { return false; // Object does not exist } bool stored = is_storable(dcc->get_number()); if(!stored) { return false; // Class has no database fields } vector<DCField*> fields; fields.push_back(const_cast<DCField*>(field)); map<DCField*, vector<uint8_t> > values; get_fields_from_table(do_id, dcc, fields, values); auto val_it = values.find(const_cast<DCField*>(field)); if(val_it == values.end()) { return false; } value = val_it->second; return true; }
void del_fields(uint32_t do_id, const vector<DCField*> &fields) { DCClass *dcc = get_class(do_id); bool storable = is_storable(dcc->get_number()); if(storable) { del_fields_in_table(do_id, dcc, fields); } }
bool get_object(uint32_t do_id, DatabaseObject& dbo) { m_log->trace() << "Getting object with id" << do_id << endl; // Get class from the objects table DCClass* dcc = get_class(do_id); if(!dcc) { return false; // Object does not exist } dbo.dc_id = dcc->get_number(); bool stored = is_storable(dcc->get_number()); if(stored) { get_all_from_table(do_id, dcc, dbo.fields); } return true; }
void del_field(uint32_t do_id, DCField* field) { DCClass *dcc = get_class(do_id); bool storable = is_storable(dcc->get_number()); if(storable) { vector<DCField*> fields; fields.push_back(field); del_fields_in_table(do_id, dcc, fields); } }
bool set_field_if_equals(uint32_t do_id, DCField* field, const vector<uint8_t> &equal, vector<uint8_t> &value) { // Get class from the objects table DCClass* dcc = get_class(do_id); if(!dcc) { return false; // Object does not exist } bool stored = is_storable(dcc->get_number()); if(!stored) { return false; // Class has no database fields } if(!field->is_db()) { return false; } string val; indicator ind; m_sql << "SELECT " << field->get_name() << " FROM fields_" << dcc->get_name() << " WHERE object_id=" << do_id << ";", into(val, ind); if(ind != i_ok) { value.clear(); return false; } string packed_equal(equal.begin(), equal.end()); string eql = field->format_data(packed_equal, false); if(val != eql) { val = field->parse_string(val); value = vector<uint8_t>(val.begin(), val.end()); return false; } string packed_data(value.begin(), value.end()); val = field->format_data(packed_data, false); m_sql << "UPDATE fields_" << dcc->get_name() << " SET " << field->get_name() << "='" << val << "' WHERE object_id=" << do_id << ";"; return true; }
void set_fields(uint32_t do_id, const map<DCField*, vector<uint8_t> > &fields) { DCClass *dcc = get_class(do_id); bool storable = is_storable(dcc->get_number()); if(storable) { try { m_sql.begin(); // Start transaction set_fields_in_table(do_id, dcc, fields); m_sql.commit(); // End transaction } catch(const exception &e) { m_sql.rollback(); // Revert transaction } } }
bool get_fields(uint32_t do_id, const vector<DCField*> &fields, map<DCField*, vector<uint8_t> > &values) { // Get class from the objects table DCClass* dcc = get_class(do_id); if(!dcc) { return false; // Object does not exist } bool stored = is_storable(dcc->get_number()); if(!stored) { return false; // Class has no database fields } get_fields_from_table(do_id, dcc, fields, values); return true; }
void delete_object(uint32_t do_id) { bool storable = false; DCClass* dcc = get_class(do_id); if(dcc) { // Note: needs to be called outside the transaction so it doesn't prevent deletion // of the object in the `objects` table storable = is_storable(dcc->get_number()); } m_log->debug() << "Deleting object with id " << do_id << "..." << endl; m_sql << "DELETE FROM objects WHERE id=" << do_id; if(dcc && storable) { m_log->trace() << "... object has stored field, also deleted." << endl; m_sql << "DELETE FROM fields_" << dcc->get_name() << " WHERE object_id=:id;", use(do_id); } push_id(do_id); }
bool set_fields_if_equals(uint32_t do_id, const map<DCField*, vector<uint8_t> > &equals, map<DCField*, vector<uint8_t> > &values) { // Get class from the objects table DCClass* dcc = get_class(do_id); if(!dcc) { return false; // Object does not exist } bool stored = is_storable(dcc->get_number()); if(!stored) { return false; // Class has no database fields } bool failed = false; string value; indicator ind; vector<DCField*> null_fields; try { m_sql.begin(); // Start transaction for(auto it = equals.begin(); it != equals.end(); ++it) { DCField* field = it->first; if(field->is_db()) { m_sql << "SELECT " << field->get_name() << " FROM fields_" << dcc->get_name() << " WHERE object_id=" << do_id << ";", into(value, ind); if(ind != i_ok) { null_fields.push_back(field); failed = true; continue; } string packed_equal(it->second.begin(), it->second.end()); string equal = field->format_data(packed_equal, false); if(value == equal) { string packed_data(values[field].begin(), values[field].end()); string insert = field->format_data(packed_data, false); m_sql << "UPDATE fields_" << dcc->get_name() << " SET " << field->get_name() << "='" << insert << "' WHERE object_id=" << do_id << ";"; \ } else { failed = true; } value = field->parse_string(value); values[field] = vector<uint8_t>(value.begin(), value.end()); } } if(failed) { for(auto it = null_fields.begin(); it != null_fields.end(); ++it) { values.erase(*it); } m_sql.rollback(); // Revert transaction return false; } else { m_sql.commit(); // End transaction return true; } } catch(const exception &e) { m_sql.rollback(); // Revert transaction values.clear(); return false; } }
bool set_fields_if_empty(uint32_t do_id, map<DCField*, vector<uint8_t> > &values) { // Get class from the objects table DCClass* dcc = get_class(do_id); if(!dcc) { values.clear(); return false; // Object does not exist } bool stored = is_storable(dcc->get_number()); if(!stored) { values.clear(); return false; // Class has no database fields } bool failed = false; string value; indicator ind; try { m_sql.begin(); // Start transaction for(auto it = values.begin(); it != values.end(); ++it) { DCField* field = it->first; if(field->is_db()) { m_sql << "SELECT " << field->get_name() << " FROM fields_" << dcc->get_name() << " WHERE object_id=" << do_id << ";", into(value, ind); if(ind != i_null) { failed = true; string packed_data = field->parse_string(value); values[field] = vector<uint8_t>(packed_data.begin(), packed_data.end()); continue; } string packed_data(it->second.begin(), it->second.end()); value = it->first->format_data(packed_data, false); m_sql << "UPDATE fields_" << dcc->get_name() << " SET " << field->get_name() << "='" << value << "' WHERE object_id=" << do_id << ";"; } } if(failed) { m_sql.rollback(); // Revert transaction } else { m_sql.commit(); // End transaction } } catch(const exception &e) { m_sql.rollback(); // Revert transaction values.clear(); return false; } }