Esempio n. 1
0
		void get_all_from_table(uint32_t id, DCClass* dcc, map<DCField*, vector<uint8_t> > &fields)
		{
			string value;
			indicator ind;
			for(int i = 0; i < dcc->get_num_inherited_fields(); ++i)
			{
				DCField* field = dcc->get_inherited_field(i);
				if(field->is_db())
				{
					m_sql << "SELECT " << field->get_name() << " FROM fields_" << dcc->get_name()
					      << " WHERE object_id=" << id << ";", into(value, ind);

					if(ind == i_ok)
					{
						string packed_data = field->parse_string(value);
						fields[field] = vector<uint8_t>(packed_data.begin(), packed_data.end());
					}
				}
			}
		}
Esempio n. 2
0
		void get_fields_from_table(uint32_t id, DCClass* dcc, const vector<DCField*> &fields,
		                           map<DCField*, vector<uint8_t> > &values)
		{
			string value;
			indicator ind;
			for(auto it = fields.begin(); it != fields.end(); ++it)
			{
				DCField* field = *it;
				if(field->is_db())
				{
					m_sql << "SELECT " << field->get_name() << " FROM fields_" << dcc->get_name()
					      << " WHERE object_id=" << id << ";", into(value, ind);

					if(ind == i_ok)
					{
						string packed_data = field->parse_string(value);
						values[field] = vector<uint8_t>(packed_data.begin(), packed_data.end());
					}
				}
			}
		}
Esempio n. 3
0
		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;
			}
		}
Esempio n. 4
0
		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;
			}
		}