using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using DTS.Common.Storage; using DTS.Common.Utilities.Logging; namespace DTS.Slice.Users { public abstract class TagAwareBase : Common.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) { //if (string.IsNullOrEmpty(tagText)) { return; } // http://fogbugz/fogbugz/default.asp?7176 SetTags(tagText.Split(',')); } public virtual void SetTags(string[] tagsText) { Tags.AddRange(tagsText); TagIDs = Tags.GetIDsFromTagText(tagsText); OnPropertyChanged("TagIDs"); } public string GetTagsAsCommaSeparatedString() { var sb = new StringBuilder(); foreach (var s in GetTagsArray()) { if (sb.Length > 0) { sb.Append(","); } sb.Append(s); } return sb.ToString(); } #region ITagAware public virtual string[] GetTagsArray() { return Tags.GetTagTextFromIDs(TagIDs); } public virtual int[] GetTagIDs() { return TagIDs; } public virtual void RemoveTags(string[] tagsText) { // remove tags!!! //-; } public bool TagCompatible(string tags) { //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(); 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) { SetTagsFromCommaSeparatedString(tags); Commit(id, tagType); } public void Commit(int id, TagTypes tagType) { using (var cmd = DbOperations.GetSQLCommand(true)) { try { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = DbOperationsEnum.StoredProcedure.sp_TagAssignmentsDelete.ToString(); #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 = DbOperations.GetSQLCommand(true)) { try { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = DbOperationsEnum.StoredProcedure.sp_TagAssignmentsInsert.ToString(); #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) { var tagIdList = new List(); try { using (var cmd = DbOperations.GetSQLCommand(true)) { try { cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = DbOperationsEnum.StoredProcedure.sp_TagAssignmentsGet.ToString(); #region params cmd.Parameters.Add(new SqlParameter("@ObjectType", SqlDbType.Int) { Value = tagType }); #endregion params //cmd.ExecuteNonQuery(); using (var ds = DbOperations.Connection.QueryDataSet(cmd)) { foreach (DataRow dr in ds.Tables[0].Rows) { if (Convert.ToInt32(dr[DbOperations.Tags.TagAssignmentFields.ObjectID.ToString()]) != objectId) continue; var tagId = Convert.ToInt32(dr[DbOperations.Tags.TagAssignmentFields.TagID.ToString()]); if (!tagIdList.Contains(tagId)) { tagIdList.Add(tagId); } } } } finally { cmd.Connection.Dispose(); } } } catch (Exception ex) { APILogger.Log("failed to retrieve object tags", ex); } return tagIdList; } } }