254 lines
8.8 KiB
C#
254 lines
8.8 KiB
C#
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<int> GetTagIdList(int objectId, TagTypes tagType)
|
|
{
|
|
var tagIdList = new List<int>();
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|