void IdoPgsqlConnection::InternalActivateObject(const DbObject::Ptr& dbobj) { AssertOnWorkQueue(); if (!GetConnected()) return; DbReference dbref = GetObjectID(dbobj); std::ostringstream qbuf; if (!dbref.IsValid()) { if (!dbobj->GetName2().IsEmpty()) { qbuf << "INSERT INTO " + GetTablePrefix() + "objects (instance_id, objecttype_id, name1, name2, is_active) VALUES (" << static_cast<long>(m_InstanceID) << ", " << dbobj->GetType()->GetTypeID() << ", " << "E'" << Escape(dbobj->GetName1()) << "', E'" << Escape(dbobj->GetName2()) << "', 1)"; } else { qbuf << "INSERT INTO " + GetTablePrefix() + "objects (instance_id, objecttype_id, name1, is_active) VALUES (" << static_cast<long>(m_InstanceID) << ", " << dbobj->GetType()->GetTypeID() << ", " << "E'" << Escape(dbobj->GetName1()) << "', 1)"; } Query(qbuf.str()); SetObjectID(dbobj, GetSequenceValue(GetTablePrefix() + "objects", "object_id")); } else { qbuf << "UPDATE " + GetTablePrefix() + "objects SET is_active = 1 WHERE object_id = " << static_cast<long>(dbref); Query(qbuf.str()); } }
void DbConnection::SetInsertID(const DbType::Ptr& type, const DbReference& objid, const DbReference& dbref) { if (!objid.IsValid()) return; if (dbref.IsValid()) m_InsertIDs[std::make_pair(type, objid)] = dbref; else m_InsertIDs.erase(std::make_pair(type, objid)); }
void DbConnection::SetObjectID(const DbObject::Ptr& dbobj, const DbReference& dbref) { if (dbref.IsValid()) m_ObjectIDs[dbobj] = dbref; else m_ObjectIDs.erase(dbobj); }
void DbConnection::SetNotificationInsertID(const CustomVarObject::Ptr& obj, const DbReference& dbref) { if (dbref.IsValid()) m_NotificationInsertIDs[obj] = dbref; else m_NotificationInsertIDs.erase(obj); }
void DbConnection::SetConfigHash(const DbType::Ptr& type, const DbReference& objid, const String& hash) { if (!objid.IsValid()) return; if (!hash.IsEmpty()) m_ConfigHashes[std::make_pair(type, objid)] = hash; else m_ConfigHashes.erase(std::make_pair(type, objid)); }
void IdoPgsqlConnection::InternalDeactivateObject(const DbObject::Ptr& dbobj) { AssertOnWorkQueue(); if (!GetConnected()) return; DbReference dbref = GetObjectID(dbobj); if (!dbref.IsValid()) return; std::ostringstream qbuf; qbuf << "UPDATE " + GetTablePrefix() + "objects SET is_active = 0 WHERE object_id = " << static_cast<long>(dbref); Query(qbuf.str()); /* Note that we're _NOT_ clearing the db refs via SetReference/SetConfigUpdate/SetStatusUpdate * because the object is still in the database. */ }
DbReference DbConnection::GetInsertID(const DbType::Ptr& type, const DbReference& objid) const { if (!objid.IsValid()) return DbReference(); auto it = m_InsertIDs.find(std::make_pair(type, objid)); if (it == m_InsertIDs.end()) return DbReference(); return it->second; }
String DbConnection::GetConfigHash(const DbType::Ptr& type, const DbReference& objid) const { if (!objid.IsValid()) return String(); auto it = m_ConfigHashes.find(std::make_pair(type, objid)); if (it == m_ConfigHashes.end()) return String(); return it->second; }
DbReference DbConnection::GetInsertID(const DbType::Ptr& type, const DbReference& objid) const { if (!objid.IsValid()) return DbReference(); std::map<std::pair<DbType::Ptr, DbReference>, DbReference>::const_iterator it; it = m_InsertIDs.find(std::make_pair(type, objid)); if (it == m_InsertIDs.end()) return DbReference(); return it->second; }
bool IdoPgsqlConnection::FieldToEscapedString(const String& key, const Value& value, Value *result) { if (key == "instance_id") { *result = static_cast<long>(m_InstanceID); return true; } else if (key == "session_token") { *result = GetSessionToken(); return true; } Value rawvalue = DbValue::ExtractValue(value); if (rawvalue.IsObjectType<ConfigObject>()) { DbObject::Ptr dbobjcol = DbObject::GetOrCreateByObject(rawvalue); if (!dbobjcol) { *result = 0; return true; } if (!IsIDCacheValid()) return false; DbReference dbrefcol; if (DbValue::IsObjectInsertID(value)) { dbrefcol = GetInsertID(dbobjcol); if (!dbrefcol.IsValid()) return false; } else { dbrefcol = GetObjectID(dbobjcol); if (!dbrefcol.IsValid()) { InternalActivateObject(dbobjcol); dbrefcol = GetObjectID(dbobjcol); if (!dbrefcol.IsValid()) return false; } } *result = static_cast<long>(dbrefcol); } else if (DbValue::IsTimestamp(value)) { long ts = rawvalue; std::ostringstream msgbuf; msgbuf << "TO_TIMESTAMP(" << ts << ")"; *result = Value(msgbuf.str()); } else if (DbValue::IsTimestampNow(value)) { *result = "NOW()"; } else if (DbValue::IsObjectInsertID(value)) { long id = static_cast<long>(rawvalue); if (id <= 0) return false; *result = id; return true; } else { Value fvalue; if (rawvalue.IsBoolean()) fvalue = Convert::ToLong(rawvalue); else fvalue = rawvalue; *result = "E'" + Escape(fvalue) + "'"; } return true; }