*/
//ClearConfigTable("commands");
- ClearConfigTable("comments");
+ //ClearConfigTable("comments");
ClearConfigTable("contact_addresses");
ClearConfigTable("contact_notificationcommands");
ClearConfigTable("contactgroup_members");
//ClearConfigTable("hostgroups");
//ClearConfigTable("hosts");
//ClearConfigTable("hoststatus");
- ClearConfigTable("scheduleddowntime");
+ //ClearConfigTable("scheduleddowntime");
ClearConfigTable("service_contactgroups");
ClearConfigTable("service_contacts");
ClearConfigTable("servicedependencies");
{
ASSERT(query.Category != DbCatInvalid);
- boost::mutex::scoped_lock lock(m_QueryQueueMutex);
m_QueryQueue.Enqueue(boost::bind(&IdoMysqlConnection::InternalExecuteQuery, this, query, (DbQueryType *)NULL), query.Priority, true);
}
void IdoMysqlConnection::ExecuteMultipleQueries(const std::vector<DbQuery>& queries)
{
- boost::mutex::scoped_lock lock(m_QueryQueueMutex);
+ ASSERT(!queries.empty());
+
+ m_QueryQueue.Enqueue(boost::bind(&IdoMysqlConnection::InternalExecuteMultipleQueries, this, queries), queries[0].Priority, true);
+}
+
+bool IdoMysqlConnection::CanExecuteQuery(const DbQuery& query)
+{
+ if (query.WhereCriteria) {
+ ObjectLock olock(query.WhereCriteria);
+ Value value;
+
+ BOOST_FOREACH(const Dictionary::Pair& kv, query.WhereCriteria) {
+ if (!FieldToEscapedString(kv.first, kv.second, &value))
+ return false;
+ }
+ }
+
+ if (query.Fields) {
+ ObjectLock olock(query.Fields);
+
+ BOOST_FOREACH(const Dictionary::Pair& kv, query.Fields) {
+ Value value;
+
+ if (kv.second.IsEmpty() && !kv.second.IsString())
+ continue;
+
+ if (!FieldToEscapedString(kv.first, kv.second, &value))
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void IdoMysqlConnection::InternalExecuteMultipleQueries(const std::vector<DbQuery>& queries)
+{
+ AssertOnWorkQueue();
BOOST_FOREACH(const DbQuery& query, queries) {
ASSERT(query.Category != DbCatInvalid);
- m_QueryQueue.Enqueue(boost::bind(&IdoMysqlConnection::InternalExecuteQuery, this, query, (DbQueryType *)NULL), query.Priority, true);
+ if (!CanExecuteQuery(query)) {
+ m_QueryQueue.Enqueue(boost::bind(&IdoMysqlConnection::InternalExecuteMultipleQueries, this, queries), query.Priority);
+ }
+ }
+
+ BOOST_FOREACH(const DbQuery& query, queries) {
+ InternalExecuteQuery(query, NULL);
}
}
int m_SessionToken;
WorkQueue m_QueryQueue;
- boost::mutex m_QueryQueueMutex;
MYSQL m_Connection;
int m_AffectedRows;
void TxTimerHandler(void);
void ReconnectTimerHandler(void);
+ bool CanExecuteQuery(const DbQuery& query);
+
void InternalExecuteQuery(const DbQuery& query, DbQueryType *typeOverride = NULL);
+ void InternalExecuteMultipleQueries(const std::vector<DbQuery>& queries);
+
void FinishExecuteQuery(const DbQuery& query, int type, bool upsert);
void InternalCleanUpExecuteQuery(const String& table, const String& time_key, double time_value);
void InternalNewTransaction(void);
{
ASSERT(query.Category != DbCatInvalid);
- boost::mutex::scoped_lock lock(m_QueryQueueMutex);
m_QueryQueue.Enqueue(boost::bind(&IdoPgsqlConnection::InternalExecuteQuery, this, query, (DbQueryType *)NULL), query.Priority, true);
}
void IdoPgsqlConnection::ExecuteMultipleQueries(const std::vector<DbQuery>& queries)
{
- boost::mutex::scoped_lock lock(m_QueryQueueMutex);
+ ASSERT(!queries.empty());
+
+ m_QueryQueue.Enqueue(boost::bind(&IdoPgsqlConnection::InternalExecuteMultipleQueries, this, queries), queries[0].Priority, true);
+}
+
+bool IdoPgsqlConnection::CanExecuteQuery(const DbQuery& query)
+{
+ if (query.WhereCriteria) {
+ ObjectLock olock(query.WhereCriteria);
+ Value value;
+
+ BOOST_FOREACH(const Dictionary::Pair& kv, query.WhereCriteria) {
+ if (!FieldToEscapedString(kv.first, kv.second, &value))
+ return false;
+ }
+ }
+
+ if (query.Fields) {
+ ObjectLock olock(query.Fields);
+
+ BOOST_FOREACH(const Dictionary::Pair& kv, query.Fields) {
+ Value value;
+
+ if (kv.second.IsEmpty() && !kv.second.IsString())
+ continue;
+
+ if (!FieldToEscapedString(kv.first, kv.second, &value))
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void IdoPgsqlConnection::InternalExecuteMultipleQueries(const std::vector<DbQuery>& queries)
+{
+ AssertOnWorkQueue();
BOOST_FOREACH(const DbQuery& query, queries) {
ASSERT(query.Category != DbCatInvalid);
- m_QueryQueue.Enqueue(boost::bind(&IdoPgsqlConnection::InternalExecuteQuery, this, query, (DbQueryType *)NULL), query.Priority, true);
+ if (!CanExecuteQuery(query)) {
+ m_QueryQueue.Enqueue(boost::bind(&IdoPgsqlConnection::InternalExecuteMultipleQueries, this, queries), query.Priority);
+ }
+ }
+
+ BOOST_FOREACH(const DbQuery& query, queries) {
+ InternalExecuteQuery(query, NULL);
}
}
int m_SessionToken;
WorkQueue m_QueryQueue;
- boost::mutex m_QueryQueueMutex;
PGconn *m_Connection;
int m_AffectedRows;
void TxTimerHandler(void);
void ReconnectTimerHandler(void);
+ bool CanExecuteQuery(const DbQuery& query);
+
void InternalExecuteQuery(const DbQuery& query, DbQueryType *typeOverride = NULL);
+ void InternalExecuteMultipleQueries(const std::vector<DbQuery>& queries);
void InternalCleanUpExecuteQuery(const String& table, const String& time_key, double time_value);
virtual void ClearConfigTable(const String& table) override;