query.WhereCriteria = new Dictionary();
query.WhereCriteria->Set("object_id", obj);
query.WhereCriteria->Set("varname", kv.first);
- query.Object = this;
queries.push_back(query);
}
{
ASSERT(query.Category != DbCatInvalid);
- m_QueryQueue.Enqueue(boost::bind(&IdoMysqlConnection::InternalExecuteQuery, this, query, (DbQueryType *)NULL), query.Priority, true);
+ m_QueryQueue.Enqueue(boost::bind(&IdoMysqlConnection::InternalExecuteQuery, this, query, -1), query.Priority, true);
}
void IdoMysqlConnection::ExecuteMultipleQueries(const std::vector<DbQuery>& queries)
}
BOOST_FOREACH(const DbQuery& query, queries) {
- InternalExecuteQuery(query, NULL);
+ InternalExecuteQuery(query);
}
}
-void IdoMysqlConnection::InternalExecuteQuery(const DbQuery& query, DbQueryType *typeOverride)
+void IdoMysqlConnection::InternalExecuteQuery(const DbQuery& query, int typeOverride)
{
AssertOnWorkQueue();
BOOST_FOREACH(const Dictionary::Pair& kv, query.WhereCriteria) {
if (!FieldToEscapedString(kv.first, kv.second, &value)) {
- m_QueryQueue.Enqueue(boost::bind(&IdoMysqlConnection::InternalExecuteQuery, this, query, (DbQueryType *)NULL), query.Priority);
+ m_QueryQueue.Enqueue(boost::bind(&IdoMysqlConnection::InternalExecuteQuery, this, query, -1), query.Priority);
return;
}
}
}
- type = typeOverride ? *typeOverride : query.Type;
+ type = (typeOverride != -1) ? typeOverride : query.Type;
bool upsert = false;
type = DbQueryUpdate;
}
+ if ((type & DbQueryInsert) && (type & DbQueryDelete)) {
+ std::ostringstream qdel;
+ qdel << "DELETE FROM " << GetTablePrefix() << query.Table << where.str();
+ AsyncQuery(qdel.str());
+
+ type = DbQueryInsert;
+ }
+
switch (type) {
case DbQueryInsert:
qbuf << "INSERT INTO " << GetTablePrefix() << query.Table;
continue;
if (!FieldToEscapedString(kv.first, kv.second, &value)) {
- m_QueryQueue.Enqueue(boost::bind(&IdoMysqlConnection::InternalExecuteQuery, this, query, (DbQueryType *)NULL), query.Priority);
+ m_QueryQueue.Enqueue(boost::bind(&IdoMysqlConnection::InternalExecuteQuery, this, query, -1), query.Priority);
return;
}
void IdoMysqlConnection::FinishExecuteQuery(const DbQuery& query, int type, bool upsert)
{
if (upsert && GetAffectedRows() == 0) {
- DbQueryType to = DbQueryInsert;
- InternalExecuteQuery(query, &to);
+ InternalExecuteQuery(query, DbQueryDelete | DbQueryInsert);
return;
}
bool CanExecuteQuery(const DbQuery& query);
- void InternalExecuteQuery(const DbQuery& query, DbQueryType *typeOverride = NULL);
+ void InternalExecuteQuery(const DbQuery& query, int typeOverride = -1);
void InternalExecuteMultipleQueries(const std::vector<DbQuery>& queries);
void FinishExecuteQuery(const DbQuery& query, int type, bool upsert);
{
ASSERT(query.Category != DbCatInvalid);
- m_QueryQueue.Enqueue(boost::bind(&IdoPgsqlConnection::InternalExecuteQuery, this, query, (DbQueryType *)NULL), query.Priority, true);
+ m_QueryQueue.Enqueue(boost::bind(&IdoPgsqlConnection::InternalExecuteQuery, this, query, -1), query.Priority, true);
}
void IdoPgsqlConnection::ExecuteMultipleQueries(const std::vector<DbQuery>& queries)
}
BOOST_FOREACH(const DbQuery& query, queries) {
- InternalExecuteQuery(query, NULL);
+ InternalExecuteQuery(query);
}
}
-void IdoPgsqlConnection::InternalExecuteQuery(const DbQuery& query, DbQueryType *typeOverride)
+void IdoPgsqlConnection::InternalExecuteQuery(const DbQuery& query, int typeOverride)
{
AssertOnWorkQueue();
BOOST_FOREACH(const Dictionary::Pair& kv, query.WhereCriteria) {
if (!FieldToEscapedString(kv.first, kv.second, &value)) {
- m_QueryQueue.Enqueue(boost::bind(&IdoPgsqlConnection::InternalExecuteQuery, this, query, (DbQueryType *)NULL), query.Priority);
+ m_QueryQueue.Enqueue(boost::bind(&IdoPgsqlConnection::InternalExecuteQuery, this, query, -1), query.Priority);
return;
}
}
}
- type = typeOverride ? *typeOverride : query.Type;
+ type = (typeOverride != -1) ? typeOverride : query.Type;
bool upsert = false;
type = DbQueryUpdate;
}
+ if ((type & DbQueryInsert) && (type & DbQueryDelete)) {
+ std::ostringstream qdel;
+ qdel << "DELETE FROM " << GetTablePrefix() << query.Table << where.str();
+ Query(qdel.str());
+
+ type = DbQueryInsert;
+ }
+
switch (type) {
case DbQueryInsert:
qbuf << "INSERT INTO " << GetTablePrefix() << query.Table;
continue;
if (!FieldToEscapedString(kv.first, kv.second, &value)) {
- m_QueryQueue.Enqueue(boost::bind(&IdoPgsqlConnection::InternalExecuteQuery, this, query, (DbQueryType *)NULL), query.Priority);
+ m_QueryQueue.Enqueue(boost::bind(&IdoPgsqlConnection::InternalExecuteQuery, this, query, -1), query.Priority);
return;
}
Query(qbuf.str());
if (upsert && GetAffectedRows() == 0) {
- DbQueryType to = DbQueryInsert;
- InternalExecuteQuery(query, &to);
+ InternalExecuteQuery(query, DbQueryDelete | DbQueryInsert);
return;
}
bool CanExecuteQuery(const DbQuery& query);
- void InternalExecuteQuery(const DbQuery& query, DbQueryType *typeOverride = NULL);
+ void InternalExecuteQuery(const DbQuery& query, int typeOverride = -1);
void InternalExecuteMultipleQueries(const std::vector<DbQuery>& queries);
void InternalCleanUpExecuteQuery(const String& table, const String& time_key, double time_value);