using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using DTS.Common.Utilities.Logging; namespace DTS.Common.Classes { public abstract class TagAwareBase : Base.BasePropertyChanged { public enum TagTypes { User, Group, Template, TestSetup, Sensors, SensorModels } public abstract TagTypes TagType { get; } #region Tags public byte[] TagsBlobBytes { get { var result = new byte[TagIDs.Length * sizeof(int)]; Buffer.BlockCopy(TagIDs, 0, result, 0, result.Length); return result; } set { if (value.Length < sizeof(int)) return; var tagsBlob = new int[value.Length / sizeof(int)]; try { Buffer.BlockCopy(value, 0, tagsBlob, 0, value.Length); TagIDs = tagsBlob; } catch (Exception ex) { APILogger.Log(ex); } } } private int[] _tagIDs = new int[0]; public int[] TagIDs { get => _tagIDs; set => _tagIDs = value ?? new int[0]; } public void SetTagsFromCommaSeparatedString(string tagText, Tags.GetSqlCommandDelegate getSqlCommand) { //if (string.IsNullOrEmpty(tagText)) { return; } // http://fogbugz/fogbugz/default.asp?7176 SetTags(tagText.Split(','), getSqlCommand); } public virtual void SetTags(string[] tagsText, Tags.GetSqlCommandDelegate getSqlCommand) { Tags.AddRange(tagsText, getSqlCommand); TagIDs = Tags.GetIDsFromTagText(tagsText, getSqlCommand); OnPropertyChanged("TagIDs"); } public string GetTagsAsCommaSeparatedString(Tags.GetSqlCommandDelegate getSqlCommand) { var sb = new StringBuilder(); var tagArray = GetTagsArray(getSqlCommand); foreach (var s in tagArray) { if (sb.Length > 0) { sb.Append(","); } sb.Append(s); } return sb.ToString(); } #region ITagAware public virtual string[] GetTagsArray(Tags.GetSqlCommandDelegate getSqlCommand) { return Tags.GetTagTextFromIDs(TagIDs, getSqlCommand); } public virtual int[] GetTagIDs() { return TagIDs; } public virtual void RemoveTags(string[] tagsText) { // remove tags!!! //-; } public bool TagCompatible(string tags, Tags.GetSqlCommandDelegate getSqlCommand) { //Make sure there are Tags to check if (string.IsNullOrWhiteSpace(tags)) return true; var newTagsArray = tags.Split(','); //Make sure all Tags are not empty strings if (newTagsArray.All(string.IsNullOrWhiteSpace)) return true; var comparisonArray = GetTagsArray(getSqlCommand); foreach (var tag in newTagsArray) { //If a Tag is an empty string, ignore it if (string.IsNullOrWhiteSpace(tag)) continue; if (comparisonArray.Contains(tag.Trim())) { return true; } } return false; } public virtual bool TagCompatible(int[] tags) { return !tags.Any() || HasIntersectingTag(tags); } public virtual bool HasIntersectingTag(int[] tags) { return tags.Intersect(TagIDs).Any(); } #endregion #endregion public void InsertTagsFromCommaSeparatedString(int id, TagTypes tagType, string tags, Tags.GetSqlCommandDelegate getSqlCommand) { SetTagsFromCommaSeparatedString(tags, getSqlCommand); Commit(id, tagType, getSqlCommand); } public void Commit(int id, TagTypes tagType, Tags.GetSqlCommandDelegate getSqlCommand) { using (var cmd = getSqlCommand(true)) { try { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = @"sp_TagAssignmentsDelete"; #region params cmd.Parameters.Add(new SqlParameter("@ObjectID", SqlDbType.Int) { Value = id }); cmd.Parameters.Add(new SqlParameter("@ObjectType", SqlDbType.SmallInt) { Value = tagType }); var errorNumberParam = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumberParam); var errorMessageParam = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessageParam); #endregion params cmd.ExecuteNonQuery(); if (int.Parse(errorNumberParam.Value.ToString()) != 0) { //errorMessageParam.Value } } finally { cmd.Connection.Dispose(); } } if (!TagIDs.Any()) return; foreach (var tagId in TagIDs) { using (var cmd = getSqlCommand(true)) { try { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = @"sp_TagAssignmentsInsert"; #region params cmd.Parameters.Add(new SqlParameter("@ObjectID", SqlDbType.Int) { Value = id }); cmd.Parameters.Add(new SqlParameter("@ObjectType", SqlDbType.SmallInt) { Value = tagType }); cmd.Parameters.Add(new SqlParameter("@TagID", SqlDbType.Int) { Value = tagId }); var errorNumberParam = new SqlParameter("@errorNumber", SqlDbType.Int) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorNumberParam); var errorMessageParam = new SqlParameter("@errorMessage", SqlDbType.NVarChar, 250) { Direction = ParameterDirection.Output }; cmd.Parameters.Add(errorMessageParam); #endregion params cmd.ExecuteNonQuery(); if (int.Parse(errorNumberParam.Value.ToString()) != 0) { //errorMessageParam.Value } } finally { cmd.Connection.Dispose(); } } } } public List GetTagIdList(int objectId, TagTypes tagType, Tags.GetSqlCommandDelegate getSqlCommand) { var tagIdList = new List(); try { using (var cmd = getSqlCommand(true)) { try { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = @"sp_TagAssignmentsGet"; #region params cmd.Parameters.Add(new SqlParameter("@ObjectType", SqlDbType.Int) { Value = tagType }); #endregion params //cmd.ExecuteNonQuery(); var reader = cmd.ExecuteReader(); while (reader.Read()) { if (Convert.ToInt32(reader["ObjectID"]) != objectId) continue; var tagId = Convert.ToInt32(reader["TagID"]); if (!tagIdList.Contains(tagId)) { tagIdList.Add(tagId); } } } finally { cmd.Connection.Dispose(); } } } catch (Exception ex) { APILogger.Log("failed to retrieve object tags", ex); } return tagIdList; } } }