mirror of
https://gitee.com/ThingsGateway/ThingsGateway.git
synced 2025-10-21 19:14:30 +08:00
Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4a3b5163f1 | ||
![]() |
3a0946d357 | ||
![]() |
9dd21c644c | ||
![]() |
6713190a23 | ||
![]() |
9f24533425 | ||
![]() |
ed1d9374eb | ||
![]() |
f14d27129e | ||
![]() |
5b04f02fbe | ||
![]() |
227080e332 | ||
![]() |
1e87482a49 | ||
![]() |
054d31c3ea | ||
![]() |
3a068a7b03 |
@@ -64,7 +64,7 @@ public sealed class OperDescAttribute : MoAttribute
|
||||
|
||||
public override void OnException(MethodContext context)
|
||||
{
|
||||
if (App.HttpContext.Request.Path.StartsWithSegments("/_blazor"))
|
||||
if (App.HttpContext?.Request.Path.StartsWithSegments("/_blazor") == true)
|
||||
{
|
||||
//插入异常日志
|
||||
SysOperateLog log = GetOperLog(LocalizerType, context);
|
||||
@@ -82,7 +82,7 @@ public sealed class OperDescAttribute : MoAttribute
|
||||
|
||||
public override void OnSuccess(MethodContext context)
|
||||
{
|
||||
if (App.HttpContext.Request.Path.StartsWithSegments("/_blazor"))
|
||||
if (App.HttpContext?.Request.Path.StartsWithSegments("/_blazor") == true)
|
||||
{
|
||||
|
||||
//插入操作日志
|
||||
|
@@ -14,7 +14,7 @@ using Microsoft.Extensions.Logging;
|
||||
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
using ThingsGateway.Extension.Generic;
|
||||
using ThingsGateway.NewLife.Caching;
|
||||
|
||||
namespace ThingsGateway.Logging;
|
||||
|
||||
@@ -28,7 +28,7 @@ public sealed class DatabaseLoggerProvider : ILoggerProvider, ISupportExternalSc
|
||||
/// <summary>
|
||||
/// 存储多日志分类日志记录器
|
||||
/// </summary>
|
||||
private readonly ConcurrentDictionary<string, DatabaseLogger> _databaseLoggers = new();
|
||||
private readonly MemoryCache _databaseLoggers = new();
|
||||
|
||||
/// <summary>
|
||||
/// 日志消息队列(线程安全)
|
||||
|
@@ -11,9 +11,7 @@
|
||||
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
using ThingsGateway.Extension.Generic;
|
||||
using ThingsGateway.NewLife.Caching;
|
||||
|
||||
namespace ThingsGateway.Logging;
|
||||
|
||||
@@ -27,7 +25,7 @@ public sealed class EmptyLoggerProvider : ILoggerProvider
|
||||
/// <summary>
|
||||
/// 存储多日志分类日志记录器
|
||||
/// </summary>
|
||||
private readonly ConcurrentDictionary<string, EmptyLogger> _emptyLoggers = new();
|
||||
private readonly MemoryCache _emptyLoggers = new();
|
||||
|
||||
/// <summary>
|
||||
/// 创建空日志记录器
|
||||
|
@@ -13,7 +13,7 @@ using Microsoft.Extensions.Logging;
|
||||
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
using ThingsGateway.Extension.Generic;
|
||||
using ThingsGateway.NewLife.Caching;
|
||||
|
||||
namespace ThingsGateway.Logging;
|
||||
|
||||
@@ -27,7 +27,7 @@ public sealed class FileLoggerProvider : ILoggerProvider, ISupportExternalScope
|
||||
/// <summary>
|
||||
/// 存储多日志分类日志记录器
|
||||
/// </summary>
|
||||
private readonly ConcurrentDictionary<string, FileLogger> _fileLoggers = new();
|
||||
private readonly MemoryCache _fileLoggers = new();
|
||||
|
||||
/// <summary>
|
||||
/// 日志消息队列(线程安全)
|
||||
|
@@ -40,6 +40,61 @@ public static class ConcurrentDictionaryExtensions
|
||||
// 返回成功移除的项目数量
|
||||
return count;
|
||||
}
|
||||
/// <summary>
|
||||
/// 批量出队
|
||||
/// </summary>
|
||||
public static List<T> ToListWithDequeue<TKEY, T>(this ConcurrentDictionary<TKEY, T> values, int maxCount = 0)
|
||||
{
|
||||
if (maxCount <= 0)
|
||||
{
|
||||
maxCount = values.Count;
|
||||
}
|
||||
else
|
||||
{
|
||||
maxCount = Math.Min(maxCount, values.Count);
|
||||
}
|
||||
|
||||
var list = new List<T>(maxCount);
|
||||
if (maxCount == 0) return list;
|
||||
var keys = values.Keys;
|
||||
foreach (var key in keys)
|
||||
{
|
||||
if (maxCount-- <= 0) break;
|
||||
if (values.TryRemove(key, out var result))
|
||||
{
|
||||
list.Add(result);
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
/// <summary>
|
||||
/// 批量出队
|
||||
/// </summary>
|
||||
public static Dictionary<TKEY, T> ToDictWithDequeue<TKEY, T>(this ConcurrentDictionary<TKEY, T> values, int maxCount = 0)
|
||||
{
|
||||
if (maxCount <= 0)
|
||||
{
|
||||
maxCount = values.Count;
|
||||
}
|
||||
else
|
||||
{
|
||||
maxCount = Math.Min(maxCount, values.Count);
|
||||
}
|
||||
|
||||
var dict = new Dictionary<TKEY, T>(maxCount);
|
||||
|
||||
if (maxCount == 0) return dict;
|
||||
|
||||
var keys = values.Keys;
|
||||
foreach (var key in keys)
|
||||
{
|
||||
if (maxCount-- <= 0) break;
|
||||
if (values.TryRemove(key, out var result))
|
||||
{
|
||||
dict.Add(key, result);
|
||||
}
|
||||
}
|
||||
return dict;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -92,6 +92,10 @@ public class TextFileLog : Logger, IDisposable
|
||||
|
||||
// 销毁前把队列日志输出
|
||||
if (Interlocked.CompareExchange(ref _writing, 1, 0) == 0) WriteAndClose(DateTime.MinValue);
|
||||
|
||||
#if NET6_0_OR_GREATER
|
||||
_Logs?.Clear();
|
||||
#endif
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
@@ -261,8 +261,8 @@ namespace SqlSugar
|
||||
}
|
||||
if (item.DataType?.Contains(',') == true && !Regex.IsMatch(item.DataType, @"\d\,\d"))
|
||||
{
|
||||
var types = item.DataType.Split(',').Select(it => it.ToLower()).ToHashSet();
|
||||
var mapingTypes = this.Context.Ado.DbBind.MappingTypes.Select(it => it.Key.ToLower()).ToHashSet();
|
||||
var types = item.DataType.Split(',').ToHashSet(StringComparer.OrdinalIgnoreCase);
|
||||
var mapingTypes = this.Context.Ado.DbBind.MappingTypes.Select(it => it.Key.ToLower()).ToHashSet(StringComparer.OrdinalIgnoreCase);
|
||||
var mappingType = types.FirstOrDefault(it => mapingTypes.Contains(it));
|
||||
if (mappingType != null)
|
||||
{
|
||||
|
@@ -22,7 +22,7 @@ namespace SqlSugar
|
||||
csharpTypeName = "short";
|
||||
if (csharpTypeName.Equals("int64", StringComparison.CurrentCultureIgnoreCase))
|
||||
csharpTypeName = "long";
|
||||
if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
|
||||
if (csharpTypeName.IsInCase("boolean", "bool"))
|
||||
csharpTypeName = "bool";
|
||||
if (csharpTypeName == "DateTimeOffset")
|
||||
csharpTypeName = "DateTime";
|
||||
|
@@ -329,7 +329,7 @@ namespace SqlSugar
|
||||
{
|
||||
method = isNullableType ? getConvertByte : getByte;
|
||||
}
|
||||
else if (bindPropertyType == UtilConstants.StringType && dbTypeName?.ToLower() == "timestamp")
|
||||
else if (bindPropertyType == UtilConstants.StringType && dbTypeName.EqualCase("timestamp"))
|
||||
{
|
||||
method = isNullableType ? getOtherNull.MakeGenericMethod(bindPropertyType) : getOther.MakeGenericMethod(bindPropertyType);
|
||||
}
|
||||
|
@@ -212,7 +212,7 @@ namespace SqlSugar
|
||||
{
|
||||
if (objectNames.HasValue())
|
||||
{
|
||||
this.TableInfoList = this.TableInfoList.Where(it => objectNames.Select(x => x.ToLower()).Contains(it.Name.ToLower())).ToList();
|
||||
this.TableInfoList = this.TableInfoList.Where(it => objectNames.Contains(it.Name, StringComparer.OrdinalIgnoreCase)).ToList();
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
@@ -397,11 +397,11 @@ namespace SqlSugar
|
||||
}
|
||||
public virtual object GetDefaultValue(DbColumnInfo columnInfo, object value)
|
||||
{
|
||||
if (columnInfo.DataType.ObjToString().ToLower().IsIn("varchar", "nvarchar", "varchar2", "nvarchar2") && !string.IsNullOrEmpty(columnInfo.DefaultValue) && Regex.IsMatch(columnInfo.DefaultValue, @"^\w+$"))
|
||||
if (columnInfo.DataType.ObjToString().IsInCase("varchar", "nvarchar", "varchar2", "nvarchar2") && !string.IsNullOrEmpty(columnInfo.DefaultValue) && Regex.IsMatch(columnInfo.DefaultValue, @"^\w+$"))
|
||||
{
|
||||
value = columnInfo.DefaultValue;
|
||||
}
|
||||
else if (columnInfo.DataType.ObjToString().ToLower().IsIn("float", "double", "decimal", "int", "int4", "bigint", "int8", "int2") && columnInfo.DefaultValue.IsInt())
|
||||
else if (columnInfo.DataType.ObjToString().IsInCase("float", "double", "decimal", "int", "int4", "bigint", "int8", "int2") && columnInfo.DefaultValue.IsInt())
|
||||
{
|
||||
value = Convert.ToInt32(columnInfo.DefaultValue);
|
||||
}
|
||||
|
@@ -294,8 +294,8 @@ namespace SqlSugar
|
||||
uInt64TypeName.Add(item.ColumnName);
|
||||
}
|
||||
}
|
||||
var temColumnsList = tempDataTable.Columns.Cast<DataColumn>().Select(it => it.ColumnName.ToLower()).ToList();
|
||||
var columns = dt.Columns.Cast<DataColumn>().Where(it => temColumnsList.Contains(it.ColumnName.ToLower())).ToList();
|
||||
var temColumnsList = tempDataTable.Columns.Cast<DataColumn>().Select(it => it.ColumnName).ToHashSet(StringComparer.OrdinalIgnoreCase);
|
||||
var columns = dt.Columns.Cast<DataColumn>().Where(it => temColumnsList.Contains(it.ColumnName, StringComparer.OrdinalIgnoreCase)).ToList();
|
||||
foreach (DataRow item in dt.Rows)
|
||||
{
|
||||
DataRow dr = tempDataTable.NewRow();
|
||||
|
@@ -265,7 +265,7 @@ namespace SqlSugar
|
||||
else
|
||||
{
|
||||
var bid = InstanceFactory.GetQueryBuilderWithContext(abDb).Builder.GetTranslationColumnName(bPkColumn.DbColumnName);
|
||||
if (!sql.SelectString.Contains(bid?.ToLower(), StringComparison.CurrentCultureIgnoreCase) && !sql.SelectString.Contains('*'))
|
||||
if (!sql.SelectString.Contains(bid, StringComparison.CurrentCultureIgnoreCase) && !sql.SelectString.Contains('*'))
|
||||
{
|
||||
sql.SelectString += ("," + bid + " AS " + bid);
|
||||
}
|
||||
@@ -949,7 +949,7 @@ namespace SqlSugar
|
||||
var selectPkName = queryable.SqlBuilder.GetTranslationColumnName(columnName);
|
||||
if (result.IsSelectNav)
|
||||
{
|
||||
if (result.SelectString?.Contains($" {selectPkName.ToLower()} AS {selectPkName.ToLower()}", StringComparison.CurrentCultureIgnoreCase) == false)
|
||||
if (result.SelectString?.Contains($" {selectPkName} AS {selectPkName}", StringComparison.CurrentCultureIgnoreCase) == false)
|
||||
{
|
||||
result.SelectString = result.SelectString + "," + (selectPkName + " AS " + selectPkName);
|
||||
}
|
||||
|
@@ -1598,7 +1598,7 @@ namespace SqlSugar
|
||||
}
|
||||
}
|
||||
var selects = this.QueryBuilder.GetSelectValueByString();
|
||||
if (selects.ObjToString().ToLower().IsContainsIn(".", "(", " as "))
|
||||
if (selects.ObjToString().IsContainsInCase(".", "(", " as "))
|
||||
{
|
||||
return this.Select<TResult>(selects);
|
||||
}
|
||||
|
@@ -130,7 +130,7 @@ namespace SqlSugar
|
||||
{
|
||||
get
|
||||
{
|
||||
var isDual = queryBuilder.Builder.FullSqlDateNow?.ToLower()?.Contains(" dual") == true;
|
||||
var isDual = queryBuilder.Builder.FullSqlDateNow?.Contains(" dual", StringComparison.OrdinalIgnoreCase) == true;
|
||||
if (isDual)
|
||||
{
|
||||
return " from dual ";
|
||||
|
@@ -7,7 +7,6 @@ namespace SqlSugar
|
||||
/// </summary>
|
||||
public partial class SqlSugarScope : ISqlSugarClient, ITenant
|
||||
{
|
||||
|
||||
private List<ConnectionConfig> _configs;
|
||||
private Action<SqlSugarClient> _configAction;
|
||||
|
||||
@@ -15,25 +14,25 @@ namespace SqlSugar
|
||||
{
|
||||
SqlSugarClient result = null;
|
||||
var key = _configs.GetHashCode().ToString();
|
||||
StackTrace st = new StackTrace(true);
|
||||
StackTrace st = new StackTrace(false);
|
||||
var methods = st.GetFrames();
|
||||
var isAsync = UtilMethods.IsAnyAsyncMethod(methods);
|
||||
if (methods?.Length >= 0)
|
||||
{
|
||||
foreach (var method in methods.Take(35))
|
||||
{
|
||||
var refType = method.GetMethod()?.ReflectedType;
|
||||
if (refType != null)
|
||||
{
|
||||
var getInterfaces = refType.Name.StartsWith('<') ? refType?.ReflectedType?.GetInterfaces() : refType?.GetInterfaces();
|
||||
if (getInterfaces?.Any(it => it.Name.IsIn("IJob")) == true)
|
||||
{
|
||||
key = $"{key}IJob";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//if (methods?.Length >= 0)
|
||||
//{
|
||||
// foreach (var method in methods.Take(35))
|
||||
// {
|
||||
// var refType = method.GetMethod()?.ReflectedType;
|
||||
// if (refType != null)
|
||||
// {
|
||||
// var getInterfaces = refType.Name.StartsWith('<') ? refType?.ReflectedType?.GetInterfaces() : refType?.GetInterfaces();
|
||||
// if (getInterfaces?.Any(it => it.Name.IsIn("IJob")) == true)
|
||||
// {
|
||||
// key = $"{key}IJob";
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
if (isAsync)
|
||||
{
|
||||
result = GetAsyncContext(key);
|
||||
|
@@ -1578,7 +1578,7 @@ namespace SqlSugar
|
||||
parameter.DbType = itemParameter.DbType;
|
||||
if (repeatCount > 500 || (isParameterNameRepeat && repeatList.Any(it => it.Key.EqualCase(itemParameter.ParameterName))))
|
||||
{
|
||||
if (newName.StartsWith(':') && itemSql.Contains(itemParameter.ParameterName.ToLower().Replace(":", "@"), StringComparison.CurrentCultureIgnoreCase))
|
||||
if (newName.StartsWith(':') && itemSql.Contains(itemParameter.ParameterName.Replace(":", "@"), StringComparison.CurrentCultureIgnoreCase))
|
||||
{
|
||||
itemParameter.ParameterName = itemParameter.ParameterName.Replace(":", "@");
|
||||
}
|
||||
@@ -1657,7 +1657,7 @@ namespace SqlSugar
|
||||
parameter.DbType = itemParameter.DbType;
|
||||
if (repeatCount > 500 || (isParameterNameRepeat && repeatList.Any(it => it.Key.EqualCase(itemParameter.ParameterName))))
|
||||
{
|
||||
if (newName.StartsWith(':') && itemSql.Contains(itemParameter.ParameterName.ToLower().Replace(":", "@"), StringComparison.CurrentCultureIgnoreCase))
|
||||
if (newName.StartsWith(':') && itemSql.Contains(itemParameter.ParameterName.Replace(":", "@"), StringComparison.CurrentCultureIgnoreCase))
|
||||
{
|
||||
itemParameter.ParameterName = itemParameter.ParameterName.Replace(":", "@");
|
||||
}
|
||||
|
@@ -8,7 +8,7 @@ namespace SqlSugar
|
||||
public class SqlSugarScopeProvider : ISqlSugarClient
|
||||
{
|
||||
internal SqlSugarProvider conn;
|
||||
internal string initThreadMainId;
|
||||
internal int initThreadMainId;
|
||||
internal string initkey = null;
|
||||
StackFrame[] frames;
|
||||
|
||||
@@ -21,9 +21,9 @@ namespace SqlSugar
|
||||
this.GetContext(true);
|
||||
}
|
||||
|
||||
private static string GetCurrentThreadId()
|
||||
private static int GetCurrentThreadId()
|
||||
{
|
||||
return Environment.CurrentManagedThreadId + "";
|
||||
return Environment.CurrentManagedThreadId;
|
||||
}
|
||||
|
||||
public SqlSugarProvider ScopedContext { get { return GetContext(); } }
|
||||
@@ -79,7 +79,7 @@ namespace SqlSugar
|
||||
{
|
||||
SqlSugarProvider result = null;
|
||||
var key = GetKey(); ;
|
||||
StackTrace st = new StackTrace(true);
|
||||
StackTrace st = new StackTrace(false);
|
||||
var methods = st.GetFrames();
|
||||
var isAsync = UtilMethods.IsAnyAsyncMethod(methods);
|
||||
if (isAsync)
|
||||
@@ -101,24 +101,24 @@ namespace SqlSugar
|
||||
var key = "SqlSugarProviderScope_" + conn.CurrentConnectionConfig.ConfigId;
|
||||
if (frames == null)
|
||||
{
|
||||
frames = new StackTrace(true).GetFrames();
|
||||
}
|
||||
if (true)
|
||||
{
|
||||
foreach (var method in frames.Take(35))
|
||||
{
|
||||
var refType = method.GetMethod()?.ReflectedType;
|
||||
if (refType != null)
|
||||
{
|
||||
var getInterfaces = refType.Name.StartsWith('<') ? refType?.ReflectedType?.GetInterfaces() : refType?.GetInterfaces();
|
||||
if (getInterfaces?.Any(it => it.Name.IsIn("IJob")) == true)
|
||||
{
|
||||
key = $"{key}IJob";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
frames = new StackTrace(false).GetFrames();
|
||||
}
|
||||
//if (true)
|
||||
//{
|
||||
// foreach (var method in frames.Take(35))
|
||||
// {
|
||||
// var refType = method.GetMethod()?.ReflectedType;
|
||||
// if (refType != null)
|
||||
// {
|
||||
// var getInterfaces = refType.Name.StartsWith('<') ? refType?.ReflectedType?.GetInterfaces() : refType?.GetInterfaces();
|
||||
// if (getInterfaces?.Any(it => it.Name.IsIn("IJob")) == true)
|
||||
// {
|
||||
// key = $"{key}IJob";
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
return key;
|
||||
}
|
||||
|
||||
|
@@ -128,9 +128,9 @@ namespace SqlSugar
|
||||
{
|
||||
if (SetColumnsIndex > 0)
|
||||
{
|
||||
var keys = UpdateBuilder.SetValues.Select(it => SqlBuilder.GetNoTranslationColumnName(it.Key.ToLower())).ToList();
|
||||
var keys = UpdateBuilder.SetValues.Select(it => SqlBuilder.GetNoTranslationColumnName(it.Key)).ToList();
|
||||
var addKeys = keys.Where(k => !this.UpdateBuilder.DbColumnInfoList.Any(it => it.PropertyName.Equals(k, StringComparison.CurrentCultureIgnoreCase) || it.DbColumnName.Equals(k, StringComparison.CurrentCultureIgnoreCase))).ToList();
|
||||
var addItems = this.EntityInfo.Columns.Where(it => !GetPrimaryKeys().Any(p => p.Equals(it.PropertyName?.ToLower(), StringComparison.CurrentCultureIgnoreCase) || p.Equals(it.DbColumnName?.ToLower(), StringComparison.CurrentCultureIgnoreCase)) && addKeys.Any(k => it.PropertyName?.ToLower() == k || it.DbColumnName?.ToLower() == k)).ToList();
|
||||
var addItems = this.EntityInfo.Columns.Where(it => !GetPrimaryKeys().Any(p => p.Equals(it.PropertyName, StringComparison.CurrentCultureIgnoreCase) || p.Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase)) && addKeys.Any(k => it.PropertyName?.Equals(k, StringComparison.OrdinalIgnoreCase) == true || it.DbColumnName?.Equals(k, StringComparison.OrdinalIgnoreCase) == true)).ToList();
|
||||
this.UpdateBuilder.DbColumnInfoList.AddRange(addItems.Select(it => new DbColumnInfo() { PropertyName = it.PropertyName, DbColumnName = it.DbColumnName }));
|
||||
}
|
||||
SetColumnsIndex++;
|
||||
@@ -456,8 +456,7 @@ namespace SqlSugar
|
||||
if (this.UpdateBuilder.UpdateColumns.HasValue())
|
||||
{
|
||||
var columns = this.UpdateBuilder.UpdateColumns;
|
||||
this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => GetPrimaryKeys().Select(
|
||||
iit => iit.ToLower()).Contains(it.DbColumnName.ToLower())
|
||||
this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => GetPrimaryKeys().Contains(it.DbColumnName, StringComparer.OrdinalIgnoreCase)
|
||||
|| columns.Contains(it.PropertyName, StringComparer.OrdinalIgnoreCase)
|
||||
|| columns.Contains(it.DbColumnName, StringComparer.OrdinalIgnoreCase)).ToList();
|
||||
}
|
||||
@@ -471,7 +470,7 @@ namespace SqlSugar
|
||||
{
|
||||
continue;
|
||||
}
|
||||
var isContains = this.UpdateBuilder.DbColumnInfoList.Select(it => it.DbColumnName.ToLower()).Contains(pkName.ToLower());
|
||||
var isContains = this.UpdateBuilder.DbColumnInfoList.Select(it => it.DbColumnName).Contains(pkName, StringComparer.OrdinalIgnoreCase);
|
||||
Check.Exception(isContains == false, "Use UpdateColumns().WhereColumn() ,UpdateColumns need {0}", pkName);
|
||||
}
|
||||
}
|
||||
|
@@ -92,12 +92,12 @@ namespace SqlSugar
|
||||
if (this._Result == null) return null;
|
||||
if (this._ResolveExpressType.IsIn(ResolveExpressType.SelectMultiple, ResolveExpressType.SelectSingle))
|
||||
{
|
||||
return this.Result.ToString().Replace(UtilConstants.ReplaceCommaKey, ",").TrimEnd(',');
|
||||
return this.Result.Replace(UtilConstants.ReplaceCommaKey, ",").ToString().TrimEnd(',');
|
||||
}
|
||||
if (IsUpper)
|
||||
return this.Result.ToString().Replace(UtilConstants.ReplaceCommaKey, ",").ToUpper();
|
||||
return this.Result.Replace(UtilConstants.ReplaceCommaKey, ",").ToString().ToUpper();
|
||||
else
|
||||
return this.Result.ToString().Replace(UtilConstants.ReplaceCommaKey, ",");
|
||||
return this.Result.Replace(UtilConstants.ReplaceCommaKey, ",").ToString();
|
||||
}
|
||||
|
||||
public void TrimEnd()
|
||||
@@ -109,7 +109,7 @@ namespace SqlSugar
|
||||
public bool Contains(string value)
|
||||
{
|
||||
if (this.Result.Equals(value)) return true;
|
||||
return (Result.ToString().Contains(value?.ToLower(), StringComparison.CurrentCultureIgnoreCase));
|
||||
return (Result.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase));
|
||||
}
|
||||
|
||||
internal void Insert(int index, string value)
|
||||
|
@@ -297,9 +297,7 @@ namespace SqlSugar
|
||||
else
|
||||
{
|
||||
var p = (base.BaseParameter?.BaseParameter?.CurrentExpression as LambdaExpression)?.Parameters[0].Name;
|
||||
subSql = subSql.Replace(this.Context.SqlTranslationLeft + p + this.Context.SqlTranslationRight + ".", name + ".");
|
||||
subSql = subSql.Replace(this.Context.SqlTranslationLeft + p.ToUpper() + this.Context.SqlTranslationRight + ".", name + ".");
|
||||
subSql = subSql.Replace(this.Context.SqlTranslationLeft + p.ToLower() + this.Context.SqlTranslationRight + ".", name + ".");
|
||||
subSql = subSql.Replace(this.Context.SqlTranslationLeft + p + this.Context.SqlTranslationRight + ".", name + ".", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
}
|
||||
parameter.Context.Result.Append(subSql);
|
||||
|
@@ -718,7 +718,7 @@ namespace SqlSugar
|
||||
info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.Equals(key, StringComparison.CurrentCultureIgnoreCase));
|
||||
if (info == null)
|
||||
{
|
||||
info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.ToLower().EndsWith("." + key.ToLower()));
|
||||
info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.EndsWith($".{key}", StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
}
|
||||
var oldInfo = info;
|
||||
@@ -787,7 +787,7 @@ namespace SqlSugar
|
||||
|
||||
private void Json(Dictionary<string, object> readerValues, Dictionary<string, object> result, string name, string typeName, string shortName = null, PropertyInfo item = null)
|
||||
{
|
||||
var key = (typeName + "." + name).ToLower();
|
||||
var key = (typeName + "." + name);
|
||||
if (readerValues.Any(it => it.Key.EqualCase(key)))
|
||||
{
|
||||
var jsonString = readerValues.First(it => it.Key.EqualCase(key)).Value;
|
||||
@@ -795,7 +795,7 @@ namespace SqlSugar
|
||||
}
|
||||
else
|
||||
{
|
||||
key = (shortName + "." + typeName + "." + name).ToLower();
|
||||
key = (shortName + "." + typeName + "." + name);
|
||||
if (readerValues.Any(it => it.Key.EqualCase(key)))
|
||||
{
|
||||
var jsonString = readerValues.First(it => it.Key.EqualCase(key)).Value;
|
||||
@@ -814,7 +814,7 @@ namespace SqlSugar
|
||||
}
|
||||
private void Json(Dictionary<string, object> readerValues, Dictionary<string, object> result, string name, string typeName, PropertyInfo item)
|
||||
{
|
||||
var key = (typeName + "." + name).ToLower();
|
||||
var key = (typeName + "." + name);
|
||||
if (readerValues.Any(it => it.Key.EqualCase(key)))
|
||||
{
|
||||
var jsonString = readerValues.First(it => it.Key.EqualCase(key)).Value;
|
||||
@@ -822,7 +822,7 @@ namespace SqlSugar
|
||||
}
|
||||
else
|
||||
{
|
||||
key = (item.Name + "." + name).ToLower();
|
||||
key = (item.Name + "." + name);
|
||||
if (readerValues.Any(it => it.Key.EqualCase(key)))
|
||||
{
|
||||
var jsonString = readerValues.First(it => it.Key.EqualCase(key)).Value;
|
||||
|
@@ -46,7 +46,7 @@ namespace SqlSugar
|
||||
};
|
||||
return new { it, array };
|
||||
}).ToList();
|
||||
var columnInfo = list.FirstOrDefault(y => y.array.Select(z => z.ToLower()).Contains(viewColumns.PropertyName.ToLower()));
|
||||
var columnInfo = list.FirstOrDefault(y => y.array.Contains(viewColumns.PropertyName, StringComparer.OrdinalIgnoreCase));
|
||||
if (columnInfo != null)
|
||||
{
|
||||
JoinMapper joinMapper = new JoinMapper()
|
||||
|
@@ -95,7 +95,7 @@ namespace SqlSugar
|
||||
var parvalue = Regex.Match(valueString, @"\@s\:(.+)").Groups[1].Value;
|
||||
if (parvalue == null) parvalue = "";
|
||||
parvalue = parvalue.Trim();
|
||||
if (parvalue.ToLower().IsIn(SqlSplicingOperator))
|
||||
if (parvalue.IsInCase(SqlSplicingOperator))
|
||||
{
|
||||
return parvalue;
|
||||
}
|
||||
|
@@ -33,7 +33,7 @@ namespace SqlSugar
|
||||
}
|
||||
private void AppendAll(JsonQueryParameter jsonQueryParameter, JToken item)
|
||||
{
|
||||
var name = item.Path.ToLower();
|
||||
var name = item.Path;
|
||||
if (IsWhere(name))
|
||||
{
|
||||
AppendWhere(item);
|
||||
|
@@ -37,7 +37,7 @@ namespace SqlSugar
|
||||
|
||||
private void AppendAll(JsonQueryParameter jsonQueryParameter, JToken item)
|
||||
{
|
||||
var name = item.Path.ToLower();
|
||||
var name = item.Path;
|
||||
if (IsName(name))
|
||||
{
|
||||
AppendName(item);
|
||||
|
@@ -13,7 +13,7 @@ namespace SqlSugar
|
||||
}
|
||||
private static bool IsJoinLastAfter(string name)
|
||||
{
|
||||
return name == "joinlastafter";
|
||||
return name.Equals("joinlastafter", StringComparison.CurrentCultureIgnoreCase);
|
||||
}
|
||||
|
||||
private static bool IsPageSize(string name)
|
||||
@@ -58,11 +58,11 @@ namespace SqlSugar
|
||||
|
||||
private static bool IsAnySelect(List<JToken> appendTypeNames)
|
||||
{
|
||||
return appendTypeNames.Any(it => IsSelect(it.Path.ToLower()));
|
||||
return appendTypeNames.Any(it => IsSelect(it.Path));
|
||||
}
|
||||
private static bool IsAnyJoin(List<JToken> appendTypeNames)
|
||||
{
|
||||
return appendTypeNames.Any(it => IsJoin(it.Path.ToLower()));
|
||||
return appendTypeNames.Any(it => IsJoin(it.Path));
|
||||
}
|
||||
private int GetSort(string name)
|
||||
{
|
||||
|
@@ -63,7 +63,7 @@ namespace SqlSugar
|
||||
private void AppendQueryableAll(JsonQueryParameter jsonQueryParameter, JToken item)
|
||||
{
|
||||
SetQueryableParameterIndex();
|
||||
var name = item.Path.ToLower();
|
||||
var name = item.Path;
|
||||
if (IsForm(name))
|
||||
{
|
||||
AppendFrom(item);
|
||||
|
@@ -26,7 +26,7 @@ namespace SqlSugar
|
||||
{
|
||||
var result = this.jobject.AsJEnumerable().ToList();
|
||||
result.Add(JToken.Parse("{JoinLastAfter:null}").First());
|
||||
result = result.OrderBy(it => GetSort(it.Path.ToLower())).ToList();
|
||||
result = result.OrderBy(it => GetSort(it.Path)).ToList();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@@ -56,7 +56,7 @@ namespace SqlSugar
|
||||
|
||||
private void AppendAll(JsonQueryParameter jsonQueryParameter, JToken item)
|
||||
{
|
||||
var name = item.Path.ToLower();
|
||||
var name = item.Path;
|
||||
if (IsTable(name))
|
||||
{
|
||||
AppendTable(item);
|
||||
|
@@ -22,11 +22,11 @@ namespace SqlSugar
|
||||
{
|
||||
List<string> result = new List<string>();
|
||||
var mainTable = JObject.Parse(json).AsJEnumerable().Where(it =>
|
||||
it.Path.ToLower().IsIn(
|
||||
JsonProviderConfig.KeyInsertable.Get().ToLower(),
|
||||
JsonProviderConfig.KeyUpdateable.Get().ToLower(),
|
||||
JsonProviderConfig.KeyDeleteable.Get().ToLower(),
|
||||
JsonProviderConfig.KeyQueryable.Get().ToLower()
|
||||
it.Path.IsInCase(
|
||||
JsonProviderConfig.KeyInsertable.Get(),
|
||||
JsonProviderConfig.KeyUpdateable.Get(),
|
||||
JsonProviderConfig.KeyDeleteable.Get(),
|
||||
JsonProviderConfig.KeyQueryable.Get()
|
||||
)).FirstOrDefault();
|
||||
if (mainTable != null)
|
||||
result.Add(mainTable.First().ToString());
|
||||
|
@@ -18,7 +18,7 @@
|
||||
csharpTypeName = "short";
|
||||
if (csharpTypeName.Equals("uint64", StringComparison.CurrentCultureIgnoreCase))
|
||||
csharpTypeName = "long";
|
||||
if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
|
||||
if (csharpTypeName.IsInCase("boolean", "bool"))
|
||||
csharpTypeName = "bool";
|
||||
if (csharpTypeName == "Guid")
|
||||
csharpTypeName = "string";
|
||||
|
@@ -341,7 +341,7 @@ WHERE table_name = '" + tableName + "'");
|
||||
{
|
||||
defaultValue = "";
|
||||
}
|
||||
if (defaultValue.ToLower().IsIn("sysdate"))
|
||||
if (defaultValue.IsInCase("sysdate"))
|
||||
{
|
||||
var template = AddDefaultValueSql.Replace("'", "");
|
||||
string sql = string.Format(template, tableName, columnName, defaultValue);
|
||||
@@ -613,7 +613,7 @@ WHERE table_name = '" + tableName + "'");
|
||||
}
|
||||
public override bool IsAnyTable(string tableName, bool isCache = true)
|
||||
{
|
||||
var isSchema = this.Context.CurrentConnectionConfig?.ConnectionString?.Replace(" ", "")?.ToLower()?.Contains("schema=") == true;
|
||||
var isSchema = this.Context.CurrentConnectionConfig?.ConnectionString?.Replace(" ", "")?.Contains("schema=", StringComparison.OrdinalIgnoreCase) == true;
|
||||
if (isSchema)
|
||||
{
|
||||
var schema = ExtractSchema(this.Context.CurrentConnectionConfig?.ConnectionString);
|
||||
@@ -654,12 +654,12 @@ WHERE upper(t.TABLE_NAME) = upper('{tableName}')
|
||||
{
|
||||
x.DataType = x.OracleDataType;
|
||||
}
|
||||
if (array.Contains(x.DataType?.ToLower()))
|
||||
if (array.Contains(x.DataType, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
x.Length = 0;
|
||||
x.DecimalDigits = 0;
|
||||
}
|
||||
if (x.DecimalDigits > 0 && x.DataType?.ToLower()?.IsIn("varchar", "clob", "varchar2", "nvarchar2", "nvarchar") == true)
|
||||
if (x.DecimalDigits > 0 && x.DataType?.IsInCase("varchar", "clob", "varchar2", "nvarchar2", "nvarchar") == true)
|
||||
{
|
||||
x.DecimalDigits = 0;
|
||||
}
|
||||
|
@@ -198,12 +198,12 @@ namespace SqlSugar
|
||||
private static string ReplaceKeyWordParameterName(string sql, SugarParameter[] parameters)
|
||||
{
|
||||
sql = ReplaceKeyWordWithAd(sql, parameters);
|
||||
if (parameters.HasValue() && parameters.Any(it => it.ParameterName.ToLower().IsIn(KeyWord)))
|
||||
if (parameters.HasValue() && parameters.Any(it => it.ParameterName.IsInCase(KeyWord)))
|
||||
{
|
||||
int i = 0;
|
||||
foreach (var Parameter in parameters.OrderByDescending(it => it.ParameterName.Length))
|
||||
{
|
||||
if (Parameter.ParameterName?.ToLower().IsContainsIn(KeyWord) == true)
|
||||
if (Parameter.ParameterName?.IsContainsInCase(KeyWord) == true)
|
||||
{
|
||||
var newName = ":p" + i + 100;
|
||||
sql = Regex.Replace(sql, Parameter.ParameterName, newName, RegexOptions.IgnoreCase);
|
||||
|
@@ -82,7 +82,7 @@ namespace SqlSugar
|
||||
foreach (DataColumn column in result.Columns)
|
||||
{
|
||||
|
||||
if (dt.Columns.Cast<DataColumn>().Select(it => it.ColumnName.ToLower()).Contains(column.ColumnName.ToLower()))
|
||||
if (dt.Columns.Cast<DataColumn>().Select(it => it.ColumnName).Contains(column.ColumnName, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
dr[column.ColumnName] = item[column.ColumnName];
|
||||
if (dr[column.ColumnName] == null)
|
||||
|
@@ -648,7 +648,7 @@ WHERE tgrelid = '" + tableName + "'::regclass");
|
||||
{
|
||||
foreach (var item in result)
|
||||
{
|
||||
if (pkList.Select(it => it.ToUpper()).Contains(item.DbColumnName.ToUpper()))
|
||||
if (pkList.Contains(item.DbColumnName, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
item.IsPrimarykey = true;
|
||||
}
|
||||
@@ -679,7 +679,7 @@ WHERE tgrelid = '" + tableName + "'::regclass");
|
||||
{
|
||||
string[] array = new string[] { "int4", "text", "int2", "int8", "date", "bit", "text", "timestamp" };
|
||||
|
||||
if (array.Contains(x.DataType?.ToLower()))
|
||||
if (array.Contains(x.DataType, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
x.Length = 0;
|
||||
x.DecimalDigits = 0;
|
||||
|
@@ -402,7 +402,7 @@ WHERE EVENT_OBJECT_TABLE = '" + tableName + "'");
|
||||
public override bool CreateDatabase(string databaseName, string databaseDirectory = null)
|
||||
{
|
||||
|
||||
if (this.Context.Ado.IsValidConnection() && this.Context.Ado.Connection.Database?.ToLower() == databaseName?.ToLower())
|
||||
if (this.Context.Ado.IsValidConnection() && this.Context.Ado.Connection.Database.EqualCase(databaseName))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@@ -679,7 +679,7 @@ WHERE EVENT_OBJECT_TABLE = '" + tableName + "'");
|
||||
{
|
||||
defaultValue = "";
|
||||
}
|
||||
if (defaultValue.ToLower().IsIn("null", "now()", "current_timestamp") || defaultValue.Contains("current_timestamp", StringComparison.CurrentCultureIgnoreCase) || defaultValue.Contains("()"))
|
||||
if (defaultValue.IsInCase("null", "now()", "current_timestamp") || defaultValue.Contains("current_timestamp", StringComparison.CurrentCultureIgnoreCase) || defaultValue.Contains("()"))
|
||||
{
|
||||
defaultValue = "(" + defaultValue + ")";
|
||||
string sql = string.Format(AddDefaultValueSql.Replace("'", ""), tableName, columnName, defaultValue);
|
||||
@@ -799,7 +799,7 @@ WHERE EVENT_OBJECT_TABLE = '" + tableName + "'");
|
||||
x.DataType = $"{x.DataType}(255)"; // 设置默认长度为 255,你可以根据需要修改
|
||||
}
|
||||
}
|
||||
else if (array.Contains(x.DataType?.ToLower()))
|
||||
else if (array.Contains(x.DataType, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
x.Length = 0;
|
||||
x.DecimalDigits = 0;
|
||||
|
@@ -12,7 +12,7 @@ namespace SqlSugar
|
||||
csharpTypeName = "short";
|
||||
if (csharpTypeName.Equals("int64", StringComparison.CurrentCultureIgnoreCase))
|
||||
csharpTypeName = "long";
|
||||
if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
|
||||
if (csharpTypeName.IsInCase("boolean", "bool"))
|
||||
csharpTypeName = "bool";
|
||||
if (csharpTypeName == "Guid")
|
||||
csharpTypeName = "string";
|
||||
|
@@ -372,7 +372,7 @@ WHERE table_name = '" + tableName + "'");
|
||||
{
|
||||
defaultValue = "";
|
||||
}
|
||||
if (defaultValue.ToLower().IsIn("sysdate"))
|
||||
if (defaultValue.IsInCase("sysdate"))
|
||||
{
|
||||
var template = AddDefaultValueSql.Replace("'", "");
|
||||
string sql = string.Format(template, tableName, columnName, defaultValue);
|
||||
@@ -687,12 +687,12 @@ WHERE table_name = '" + tableName + "'");
|
||||
{
|
||||
x.DataType = x.OracleDataType;
|
||||
}
|
||||
if (array.Contains(x.DataType?.ToLower()))
|
||||
if (array.Contains(x.DataType, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
x.Length = 0;
|
||||
x.DecimalDigits = 0;
|
||||
}
|
||||
if (x.DecimalDigits > 0 && x.DataType?.ToLower()?.IsIn("varchar", "clob", "varchar2", "nvarchar2", "nvarchar") == true)
|
||||
if (x.DecimalDigits > 0 && x.DataType?.IsInCase("varchar", "clob", "varchar2", "nvarchar2", "nvarchar") == true)
|
||||
{
|
||||
x.DecimalDigits = 0;
|
||||
}
|
||||
|
@@ -120,7 +120,7 @@ namespace SqlSugar
|
||||
public override DbCommand GetCommand(string sql, SugarParameter[] parameters)
|
||||
{
|
||||
sql = ReplaceKeyWordParameterName(sql, parameters);
|
||||
if (sql?.EndsWith(';') == true && sql?.TrimStart()?.ToLower().StartsWith("begin", StringComparison.CurrentCultureIgnoreCase) != true && sql?.TrimStart()?.ToLower().Contains("begin", StringComparison.CurrentCultureIgnoreCase) != true)
|
||||
if (sql?.EndsWith(';') == true && sql?.TrimStart()?.StartsWith("begin", StringComparison.CurrentCultureIgnoreCase) != true && sql?.TrimStart()?.Contains("begin", StringComparison.CurrentCultureIgnoreCase) != true)
|
||||
{
|
||||
sql = sql.TrimEnd(';');
|
||||
}
|
||||
@@ -149,7 +149,7 @@ namespace SqlSugar
|
||||
{
|
||||
foreach (var Parameter in parameters.OrderByDescending(x => x.ParameterName?.Length))
|
||||
{
|
||||
if (Parameter.ParameterName?.ToLower().IsContainsStartWithIn(KeyWord) == true)
|
||||
if (Parameter.ParameterName?.IsContainsStartWithInCase(KeyWord) == true)
|
||||
{
|
||||
if (parameters.Count(it => it.ParameterName.StartsWith(Parameter.ParameterName)) == 1)
|
||||
{
|
||||
@@ -158,7 +158,7 @@ namespace SqlSugar
|
||||
sql = Regex.Replace(sql, Parameter.ParameterName, newName, RegexOptions.IgnoreCase);
|
||||
Parameter.ParameterName = newName;
|
||||
}
|
||||
else if (Parameter.ParameterName.ToLower().IsContainsIn(KeyWord))
|
||||
else if (Parameter.ParameterName.IsContainsInCase(KeyWord))
|
||||
{
|
||||
Check.ExceptionEasy($" {Parameter.ParameterName} is key word", $"{Parameter.ParameterName}<7D>ǹؼ<C7B9><D8BC><EFBFBD>");
|
||||
}
|
||||
|
@@ -162,7 +162,7 @@ namespace SqlSugar
|
||||
|
||||
|
||||
|
||||
if (dt.Columns.Cast<DataColumn>().Select(it => it.ColumnName.ToLower()).Contains(column.ColumnName.ToLower()))
|
||||
if (dt.Columns.Cast<DataColumn>().Select(it => it.ColumnName).Contains(column.ColumnName, StringComparer.OrdinalIgnoreCase))
|
||||
|
||||
{
|
||||
|
||||
|
@@ -42,14 +42,25 @@ namespace SqlSugar
|
||||
|
||||
private string GetOracleUpdateColumns(DbColumnInfo m, bool isWhere = false)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
|
||||
sb.Append('"');
|
||||
sb.Append(IsUppper ? m.DbColumnName.ToUpper() : m.DbColumnName);
|
||||
sb.Append('"');
|
||||
sb.Append('=');
|
||||
|
||||
sb.Append(base.GetDbColumn(m, FormatValue(m.Value, m.IsPrimarykey, m.PropertyName)));
|
||||
sb.Append(' ');
|
||||
|
||||
|
||||
var result = string.Format("\"{0}\"={1} ", m.DbColumnName.ToUpper(IsUppper), base.GetDbColumn(m, FormatValue(m.Value, m.IsPrimarykey, m.PropertyName)));
|
||||
if (isWhere && m.Value == null)
|
||||
{
|
||||
result = result.Replace("=NULL ", " is NULL ");
|
||||
sb.Replace("=NULL ", " is NULL ");
|
||||
}
|
||||
return result;
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
public object FormatValue(object value, bool isPrimaryKey, string name)
|
||||
{
|
||||
|
@@ -13,7 +13,7 @@
|
||||
csharpTypeName = "short";
|
||||
if (csharpTypeName.Equals("int64", StringComparison.CurrentCultureIgnoreCase))
|
||||
csharpTypeName = "long";
|
||||
if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
|
||||
if (csharpTypeName.IsInCase("boolean", "bool"))
|
||||
csharpTypeName = "bool";
|
||||
if (csharpTypeName == "DateTimeOffset")
|
||||
csharpTypeName = "DateTime";
|
||||
|
@@ -315,12 +315,12 @@ WHERE tgrelid = '" + tableName + "'::regclass");
|
||||
string sql = string.Format(AddDefaultValueSql, this.SqlBuilder.GetTranslationColumnName(tableName), this.SqlBuilder.GetTranslationColumnName(columnName), "'" + defaultValue + "'");
|
||||
return this.Context.Ado.ExecuteCommand(sql) > 0;
|
||||
}
|
||||
else if (defaultValue?.ToLower()?.Contains("cast(") == true && defaultValue?.StartsWith('\'') == true && defaultValue?.EndsWith('\'') == true)
|
||||
else if (defaultValue?.Contains("cast(", StringComparison.OrdinalIgnoreCase) == true && defaultValue?.StartsWith('\'') == true && defaultValue?.EndsWith('\'') == true)
|
||||
{
|
||||
string sql = string.Format(AddDefaultValueSql, this.SqlBuilder.GetTranslationColumnName(tableName), this.SqlBuilder.GetTranslationColumnName(columnName), defaultValue.Replace("''", "'").TrimEnd('\'').TrimStart('\''));
|
||||
return this.Context.Ado.ExecuteCommand(sql) > 0;
|
||||
}
|
||||
else if (defaultValue?.ToLower()?.Contains("now()") == true)
|
||||
else if (defaultValue?.Contains("now()", StringComparison.OrdinalIgnoreCase) == true)
|
||||
{
|
||||
string sql = string.Format(AddDefaultValueSql, this.SqlBuilder.GetTranslationColumnName(tableName), this.SqlBuilder.GetTranslationColumnName(columnName), defaultValue.TrimEnd('\'').TrimStart('\''));
|
||||
return this.Context.Ado.ExecuteCommand(sql) > 0;
|
||||
@@ -451,7 +451,7 @@ WHERE tgrelid = '" + tableName + "'::regclass");
|
||||
ConvertCreateColumnInfo(item);
|
||||
if (item.DbColumnName.Equals("GUID", StringComparison.CurrentCultureIgnoreCase) && item.Length == 0)
|
||||
{
|
||||
if (item.DataType?.ToLower() != "uuid")
|
||||
if (item.DataType.EqualCase("uuid"))
|
||||
{
|
||||
item.Length = 10;
|
||||
}
|
||||
@@ -485,7 +485,7 @@ WHERE tgrelid = '" + tableName + "'::regclass");
|
||||
foreach (var item in columns)
|
||||
{
|
||||
string columnName = item.DbColumnName;
|
||||
string dataType = item.DataType;
|
||||
string dataType = item.DataType?.ToLower();
|
||||
if (dataType == "varchar" && item.Length == 0)
|
||||
{
|
||||
item.Length = 1;
|
||||
@@ -505,11 +505,11 @@ WHERE tgrelid = '" + tableName + "'::regclass");
|
||||
string addItem = string.Format(this.CreateTableColumn, this.SqlBuilder.GetTranslationColumnName(columnName.ToLower(isAutoToLowerCodeFirst)), dataType, dataSize, nullType, primaryKey, "");
|
||||
if (item.IsIdentity)
|
||||
{
|
||||
if (dataType?.ToLower() == "int")
|
||||
if (dataType == "int")
|
||||
{
|
||||
dataSize = "int4";
|
||||
}
|
||||
else if (dataType?.ToLower() == "long")
|
||||
else if (dataType == "long")
|
||||
{
|
||||
dataSize = "int8";
|
||||
}
|
||||
@@ -564,7 +564,7 @@ WHERE tgrelid = '" + tableName + "'::regclass");
|
||||
{
|
||||
foreach (var item in result)
|
||||
{
|
||||
if (pkList.Select(it => it.ToUpper()).Contains(item.DbColumnName.ToUpper()))
|
||||
if (pkList.Contains(item.DbColumnName, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
item.IsPrimarykey = true;
|
||||
}
|
||||
@@ -645,7 +645,7 @@ WHERE tgrelid = '" + tableName + "'::regclass");
|
||||
{
|
||||
string[] array = new string[] { "uuid", "int4", "text", "int2", "int8", "date", "bit", "text", "timestamp" };
|
||||
|
||||
if (array.Contains(x.DataType?.ToLower()))
|
||||
if (array.Contains(x.DataType, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
x.Length = 0;
|
||||
x.DecimalDigits = 0;
|
||||
|
@@ -499,7 +499,7 @@
|
||||
}
|
||||
public override string GetStringJoinSelector(string result, string separator)
|
||||
{
|
||||
if (result?.ToLower()?.Contains("distinct") == true)
|
||||
if (result?.Contains("distinct", StringComparison.OrdinalIgnoreCase) == true)
|
||||
{
|
||||
return $"string_agg({result},'{separator}') ";
|
||||
}
|
||||
|
@@ -364,7 +364,7 @@ namespace SqlSugar
|
||||
var checks = this.Context.Ado.SqlQuery<string>(sql);
|
||||
foreach (var checkName in checks)
|
||||
{
|
||||
if (checkName?.ToUpper()?.StartsWith("DF__") == true)
|
||||
if (checkName?.StartsWith("DF__", StringComparison.OrdinalIgnoreCase) == true)
|
||||
{
|
||||
this.Context.Ado.ExecuteCommand($"ALTER TABLE {SqlBuilder.GetTranslationColumnName(tableName)} DROP CONSTRAINT {checkName}");
|
||||
}
|
||||
@@ -759,7 +759,7 @@ AND syscomments.text LIKE '%" + tableName + "%'");
|
||||
x.DataType = $"{x.DataType}(max)";
|
||||
}
|
||||
}
|
||||
else if (array.Contains(x.DataType?.ToLower()))
|
||||
else if (array.Contains(x.DataType, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
x.Length = 0;
|
||||
x.DecimalDigits = 0;
|
||||
|
@@ -82,7 +82,7 @@ namespace SqlSugar
|
||||
foreach (DataColumn column in result.Columns)
|
||||
{
|
||||
|
||||
if (dt.Columns.Cast<DataColumn>().Select(it => it.ColumnName.ToLower()).Contains(column.ColumnName.ToLower()))
|
||||
if (dt.Columns.Cast<DataColumn>().Select(it => it.ColumnName).Contains(column.ColumnName, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
dr[column.ColumnName] = item[column.ColumnName];
|
||||
if (dr[column.ColumnName] == null)
|
||||
|
@@ -38,12 +38,21 @@ namespace SqlSugar
|
||||
|
||||
private string GetOracleUpdateColumns(int i, DbColumnInfo m, bool iswhere)
|
||||
{
|
||||
var result = string.Format("\"{0}\"={1}", m.DbColumnName.ToUpper(), base.GetDbColumn(m, FormatValue(i, m.DbColumnName, m.Value, iswhere)));
|
||||
var sb = new StringBuilder();
|
||||
|
||||
sb.Append('"');
|
||||
sb.Append(m.DbColumnName.ToUpper());
|
||||
sb.Append('"');
|
||||
sb.Append('=');
|
||||
sb.Append(base.GetDbColumn(m, FormatValue(i, m.DbColumnName, m.Value, iswhere)));
|
||||
|
||||
|
||||
if (iswhere && m.Value == null)
|
||||
{
|
||||
result = result.Replace("=NULL", " is NULL ");
|
||||
sb.Replace("=NULL", " is NULL ");
|
||||
}
|
||||
return result;
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
public object FormatValue(int i, string name, object value, bool iswhere)
|
||||
|
@@ -17,7 +17,10 @@ namespace SqlSugar
|
||||
{
|
||||
return values.Contains(thisValue);
|
||||
}
|
||||
|
||||
public static bool IsInCase(this string thisValue, params string[] values)
|
||||
{
|
||||
return values.Contains(thisValue, StringComparer.OrdinalIgnoreCase);
|
||||
}
|
||||
public static bool IsContainsIn(this string thisValue, params char[] inValues)
|
||||
{
|
||||
return inValues.Any(it => thisValue.Contains(it));
|
||||
@@ -26,9 +29,13 @@ namespace SqlSugar
|
||||
{
|
||||
return inValues.Any(it => thisValue.Contains(it));
|
||||
}
|
||||
public static bool IsContainsStartWithIn(this string thisValue, params string[] inValues)
|
||||
public static bool IsContainsInCase(this string thisValue, params string[] inValues)
|
||||
{
|
||||
return inValues.Any(it => thisValue.StartsWith(it));
|
||||
return inValues.Any(it => thisValue.Contains(it, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
public static bool IsContainsStartWithInCase(this string thisValue, params string[] inValues)
|
||||
{
|
||||
return inValues.Any(it => thisValue.StartsWith(it, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
public static bool IsNullOrEmpty(this object thisValue)
|
||||
|
@@ -1,22 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<package >
|
||||
<metadata>
|
||||
<id>SqlSugarCore.Dm</id>
|
||||
<version>1.0</version>
|
||||
<authors>sunkaixuan</authors>
|
||||
<owners>Landa</owners>
|
||||
<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>
|
||||
<projectUrl>https://github.com/sunkaixuan/SqlSugar</projectUrl>
|
||||
<iconUrl>https://secure.gravatar.com/avatar/a82c03402497b2e58fd65038a3699b30</iconUrl>
|
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||
<description>dm sqlsugar .net core</description>
|
||||
<copyright>Copyright 2016</copyright>
|
||||
<tags>Asp.net core orm</tags>
|
||||
<dependencies>
|
||||
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
<file src="E:\Code\SqlSugar\Src\Asp.NetCore2\SqlSeverTest\SqlSugar\dll\DmProvider.dll" target="lib\netstandard2.0"></file>
|
||||
</files>
|
||||
</package>
|
@@ -1,22 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<package >
|
||||
<metadata>
|
||||
<id>SqlSugarCore.Kdbndp</id>
|
||||
<version>1.0</version>
|
||||
<authors>sunkaixuan</authors>
|
||||
<owners>Landa</owners>
|
||||
<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>
|
||||
<projectUrl>https://github.com/sunkaixuan/SqlSugar</projectUrl>
|
||||
<iconUrl>https://secure.gravatar.com/avatar/a82c03402497b2e58fd65038a3699b30</iconUrl>
|
||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||
<description>dm sqlsugar .net core</description>
|
||||
<copyright>Copyright 2016</copyright>
|
||||
<tags>Asp.net core orm</tags>
|
||||
<dependencies>
|
||||
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
<file src="E:\Code\SqlSugar\Src\Asp.NetCore2\SqlSeverTest\SqlSugar\dll\Kdbndp.dll" target="lib\netstandard2.0"></file>
|
||||
</files>
|
||||
</package>
|
Binary file not shown.
@@ -1 +0,0 @@
|
||||
%~dp0nuget.exe pack %~dp0Dm.nuspec -OutputDirectory %~dp0
|
@@ -1 +0,0 @@
|
||||
%~dp0nuget.exe pack %~dp0Kdbndp.nuspec -OutputDirectory %~dp0
|
@@ -41,9 +41,9 @@ namespace SqlSugar.TDengine
|
||||
}
|
||||
if (item.DataType?.Contains(',') == true && !Regex.IsMatch(item.DataType, @"\d\,\d"))
|
||||
{
|
||||
var types = item.DataType.Split(',').Select(it => it.ToLower()).ToHashSet();
|
||||
var mapingTypes = this.Context.Ado.DbBind.MappingTypes.Select(it => it.Key.ToLower()).ToHashSet();
|
||||
var mappingType = types.FirstOrDefault(it => mapingTypes.Contains(it));
|
||||
var types = item.DataType.Split(',').ToHashSet(StringComparer.OrdinalIgnoreCase);
|
||||
var mapingTypes = this.Context.Ado.DbBind.MappingTypes.Select(it => it.Key).ToHashSet(StringComparer.OrdinalIgnoreCase);
|
||||
var mappingType = types.FirstOrDefault(it => mapingTypes.Contains(it)).ToLower();
|
||||
if (mappingType != null)
|
||||
{
|
||||
item.DataType = mappingType;
|
||||
@@ -100,10 +100,10 @@ namespace SqlSugar.TDengine
|
||||
if (attr?.Tag1 != null)
|
||||
{
|
||||
entityColumns = entityInfo.Columns.Where(it => it.IsIgnore == false
|
||||
|| it.DbColumnName?.ToLower() == attr.Tag1?.ToLower()
|
||||
|| it.DbColumnName?.ToLower() == attr.Tag2?.ToLower()
|
||||
|| it.DbColumnName?.ToLower() == attr.Tag3?.ToLower()
|
||||
|| it.DbColumnName?.ToLower() == attr.Tag4?.ToLower()
|
||||
|| it.DbColumnName?.EqualCase(attr.Tag1) == true
|
||||
|| it.DbColumnName?.EqualCase(attr.Tag2) == true
|
||||
|| it.DbColumnName?.EqualCase(attr.Tag3) == true
|
||||
|| it.DbColumnName?.EqualCase(attr.Tag4) == true
|
||||
).ToList();
|
||||
foreach (var item in entityColumns)
|
||||
{
|
||||
@@ -228,10 +228,10 @@ namespace SqlSugar.TDengine
|
||||
if (attr?.Tag1 != null)
|
||||
{
|
||||
dbColumns = dbColumns.Where(it =>
|
||||
it.DbColumnName?.ToLower() != attr.Tag1?.ToLower()
|
||||
&& it.DbColumnName?.ToLower() != attr.Tag2?.ToLower()
|
||||
&& it.DbColumnName?.ToLower() != attr.Tag3?.ToLower()
|
||||
&& it.DbColumnName?.ToLower() != attr.Tag4?.ToLower()
|
||||
it.DbColumnName?.EqualCase(attr.Tag1) == true
|
||||
&& it.DbColumnName?.EqualCase(attr.Tag2) == true
|
||||
&& it.DbColumnName?.EqualCase(attr.Tag3) == true
|
||||
&& it.DbColumnName?.EqualCase(attr.Tag4) == true
|
||||
).ToList();
|
||||
}
|
||||
var dbMain = (TDengineDbMaintenance)this.Context.DbMaintenance;
|
||||
|
@@ -12,7 +12,7 @@
|
||||
csharpTypeName = "short";
|
||||
if (string.Equals(csharpTypeName, "int64", StringComparison.OrdinalIgnoreCase))
|
||||
csharpTypeName = "long";
|
||||
if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
|
||||
if (csharpTypeName.IsInCase("boolean", "bool"))
|
||||
csharpTypeName = "bool";
|
||||
if (csharpTypeName == "DateTimeOffset")
|
||||
csharpTypeName = "DateTime";
|
||||
|
@@ -385,11 +385,11 @@ namespace SqlSugar.TDengine
|
||||
//{
|
||||
// dataType = $"DOUBLE(18,4)";
|
||||
//}
|
||||
if (item.Length == 0 && dataType?.ToLower()?.IsIn("nchar", "varchar") == true)
|
||||
if (item.Length == 0 && dataType?.IsInCase("nchar", "varchar") == true)
|
||||
{
|
||||
dataType = "VARCHAR(200)";
|
||||
}
|
||||
if (dataType?.ToLower()?.IsIn("float", "double") == true)
|
||||
if (dataType?.IsInCase("float", "double") == true)
|
||||
{
|
||||
dataSize = null;
|
||||
}
|
||||
|
@@ -116,7 +116,7 @@
|
||||
{
|
||||
if (tableName != null)
|
||||
tableName = tableName.Trim();
|
||||
var columnInfo = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName).FirstOrDefault(z => z.DbColumnName?.ToLower() == columnName?.ToLower());
|
||||
var columnInfo = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName).FirstOrDefault(z => z.DbColumnName?.EqualCase(columnName) == true);
|
||||
if (columnInfo != null)
|
||||
{
|
||||
var cTypeName = this.Context.Ado.DbBind.GetCsharpTypeNameByDbTypeName(columnInfo.DataType);
|
||||
|
@@ -1,8 +1,8 @@
|
||||
<Project>
|
||||
|
||||
<PropertyGroup>
|
||||
<PluginVersion>10.7.31</PluginVersion>
|
||||
<ProPluginVersion>10.7.31</ProPluginVersion>
|
||||
<PluginVersion>10.7.36</PluginVersion>
|
||||
<ProPluginVersion>10.7.36</ProPluginVersion>
|
||||
<AuthenticationVersion>2.5.0</AuthenticationVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
|
@@ -7,7 +7,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CS-Script" Version="4.9.6" />
|
||||
<PackageReference Include="CS-Script" Version="4.9.7" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
@@ -101,13 +101,13 @@ public class DDPTcpSessionClientChannel : TcpSessionClientChannel
|
||||
if (id != Id) log = true;
|
||||
|
||||
//注册ID
|
||||
if (Service is ITcpService tcpService && tcpService.TryGetClient(id, out var oldClient) && oldClient != this)
|
||||
if (Service is ITcpServiceChannel tcpService && tcpService.TryGetClient(id, out var oldClient) && oldClient != this)
|
||||
{
|
||||
Logger?.Debug($"Old socket connections with the same ID {id} will be closed");
|
||||
try
|
||||
{
|
||||
await oldClient.ShutdownAsync(System.Net.Sockets.SocketShutdown.Both).ConfigureAwait(false);
|
||||
await oldClient.CloseAsync().ConfigureAwait(false);
|
||||
oldClient.Dispose();
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
@@ -556,12 +556,11 @@ public abstract class DeviceBase : DisposableObject, IDevice
|
||||
var result = waitData.Check();
|
||||
if (result.IsSuccess)
|
||||
{
|
||||
var response = waitData.WaitResult;
|
||||
return response;
|
||||
return waitData.WaitResult;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw result.Exception ?? new(result.ErrorMessage);
|
||||
throw new(result.ErrorMessage ?? "unknown error");
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -10,8 +10,8 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="9.0.5" />
|
||||
<PackageReference Include="TouchSocket" Version="3.1.6" />
|
||||
<PackageReference Include="TouchSocket.SerialPorts" Version="3.1.6" />
|
||||
<PackageReference Include="TouchSocket" Version="3.1.7" />
|
||||
<PackageReference Include="TouchSocket.SerialPorts" Version="3.1.7" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
@@ -244,6 +244,31 @@ public abstract class BusinessBaseWithCacheIntervalAlarmModel<VarModel, DevModel
|
||||
AlarmChange(alarmVariable);
|
||||
}
|
||||
}
|
||||
public override void PauseThread(bool pause)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
var oldV = CurrentDevice.Pause;
|
||||
base.PauseThread(pause);
|
||||
if (!pause && oldV != pause)
|
||||
{
|
||||
GlobalData.ReadOnlyRealAlarmIdVariables?.ForEach(a =>
|
||||
{
|
||||
AlarmChange(a.Value);
|
||||
});
|
||||
CollectDevices?.ForEach(a =>
|
||||
{
|
||||
if (a.Value.DeviceStatus == DeviceStatusEnum.OnLine && _businessPropertyWithCacheInterval.BusinessUpdateEnum != BusinessUpdateEnum.Interval)
|
||||
DeviceStatusChange(a.Value, a.Value.Adapt<DeviceBasicData>());
|
||||
});
|
||||
IdVariableRuntimes.ForEach(a =>
|
||||
{
|
||||
if (a.Value.IsOnline && _businessPropertyWithCacheInterval.BusinessUpdateEnum != BusinessUpdateEnum.Interval)
|
||||
VariableValueChange(a.Value, a.Value.Adapt<VariableBasicData>());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 当设备状态发生变化时触发此事件处理方法。该方法内部会检查是否需要进行设备上传,如果需要,则调用 <see cref="DeviceChange(DeviceRuntime, DeviceBasicData)"/> 方法。
|
||||
|
@@ -257,4 +257,27 @@ public abstract class BusinessBaseWithCacheIntervalDeviceModel<VarModel, DevMode
|
||||
VariableChange(variableRuntime, variable);
|
||||
}
|
||||
}
|
||||
|
||||
public override void PauseThread(bool pause)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
var oldV = CurrentDevice.Pause;
|
||||
base.PauseThread(pause);
|
||||
if (!pause && oldV != pause)
|
||||
{
|
||||
CollectDevices?.ForEach(a =>
|
||||
{
|
||||
if (a.Value.DeviceStatus == DeviceStatusEnum.OnLine && _businessPropertyWithCacheInterval.BusinessUpdateEnum != BusinessUpdateEnum.Interval)
|
||||
DeviceStatusChange(a.Value, a.Value.Adapt<DeviceBasicData>());
|
||||
});
|
||||
IdVariableRuntimes.ForEach(a =>
|
||||
{
|
||||
if (a.Value.IsOnline && _businessPropertyWithCacheInterval.BusinessUpdateEnum != BusinessUpdateEnum.Interval)
|
||||
VariableValueChange(a.Value, a.Value.Adapt<VariableBasicData>());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -175,4 +175,21 @@ public abstract class BusinessBaseWithCacheIntervalVariableModel<VarModel> : Bus
|
||||
VariableChange(variableRuntime, variable);
|
||||
}
|
||||
}
|
||||
public override void PauseThread(bool pause)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
var oldV = CurrentDevice.Pause;
|
||||
base.PauseThread(pause);
|
||||
if (!pause && oldV != pause)
|
||||
{
|
||||
IdVariableRuntimes.ForEach(a =>
|
||||
{
|
||||
if (a.Value.IsOnline && _businessPropertyWithCacheInterval.BusinessUpdateEnum != BusinessUpdateEnum.Interval)
|
||||
VariableValueChange(a.Value, a.Value.Adapt<VariableBasicData>());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -117,7 +117,7 @@ public abstract class DriverBase : DisposableObject, IDriver
|
||||
/// 暂停
|
||||
/// </summary>
|
||||
/// <param name="pause">暂停</param>
|
||||
public void PauseThread(bool pause)
|
||||
public virtual void PauseThread(bool pause)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
|
@@ -886,6 +886,7 @@ internal sealed class DeviceThreadManage : IAsyncDisposable, IDeviceThreadManage
|
||||
Disposed = true;
|
||||
try
|
||||
{
|
||||
GlobalData.DeviceStatusChangeEvent -= GlobalData_DeviceStatusChangeEvent;
|
||||
await NewDeviceLock.WaitAsync().ConfigureAwait(false);
|
||||
_logger?.TryDispose();
|
||||
await PrivateRemoveDevicesAsync(Drivers.Keys).ConfigureAwait(false);
|
||||
@@ -894,6 +895,8 @@ internal sealed class DeviceThreadManage : IAsyncDisposable, IDeviceThreadManage
|
||||
|
||||
LogMessage?.LogInformation(Localizer["ChannelDispose", CurrentChannel?.Name ?? string.Empty]);
|
||||
|
||||
LogMessage?.Logs?.ForEach(a => a.TryDispose());
|
||||
|
||||
}
|
||||
finally
|
||||
{
|
||||
|
@@ -8,8 +8,8 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
|
||||
<PackageReference Include="Rougamo.Fody" Version="5.0.0" />
|
||||
<PackageReference Include="TouchSocket.Dmtp" Version="3.1.6" />
|
||||
<PackageReference Include="TouchSocket.WebApi.Swagger" Version="3.1.6" />
|
||||
<PackageReference Include="TouchSocket.Dmtp" Version="3.1.7" />
|
||||
<PackageReference Include="TouchSocket.WebApi.Swagger" Version="3.1.7" />
|
||||
<PackageReference Include="ThingsGateway.Authentication" Version="$(AuthenticationVersion)" />
|
||||
<!--<ProjectReference Include="..\..\PluginPro\ThingsGateway.Authentication\ThingsGateway.Authentication.csproj" />-->
|
||||
|
||||
|
@@ -39,19 +39,40 @@ public partial class ChannelTable : IDisposable
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
scheduler = new SmartTriggerScheduler(Notify, TimeSpan.FromMilliseconds(1000));
|
||||
_ = RunTimerAsync();
|
||||
base.OnInitialized();
|
||||
}
|
||||
|
||||
|
||||
private SmartTriggerScheduler scheduler;
|
||||
private IEnumerable<ChannelRuntime>? _previousItemsRef;
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
if (!ReferenceEquals(_previousItemsRef, Items))
|
||||
{
|
||||
_previousItemsRef = Items;
|
||||
Refresh();
|
||||
}
|
||||
base.OnParametersSet();
|
||||
}
|
||||
private void Refresh()
|
||||
{
|
||||
scheduler.Trigger();
|
||||
}
|
||||
private async Task Notify()
|
||||
{
|
||||
if (Disposed) return;
|
||||
if (table != null)
|
||||
await InvokeAsync(table.QueryAsync);
|
||||
}
|
||||
private async Task RunTimerAsync()
|
||||
{
|
||||
while (!Disposed)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (table != null)
|
||||
await InvokeAsync(table.QueryAsync);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@@ -39,10 +39,32 @@ public partial class DeviceTable : IDisposable
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
scheduler = new SmartTriggerScheduler(Notify, TimeSpan.FromMilliseconds(1000));
|
||||
_ = RunTimerAsync();
|
||||
base.OnInitialized();
|
||||
}
|
||||
|
||||
private SmartTriggerScheduler scheduler;
|
||||
private IEnumerable<DeviceRuntime>? _previousItemsRef;
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
if (!ReferenceEquals(_previousItemsRef, Items))
|
||||
{
|
||||
_previousItemsRef = Items;
|
||||
Refresh();
|
||||
}
|
||||
base.OnParametersSet();
|
||||
}
|
||||
private void Refresh()
|
||||
{
|
||||
scheduler.Trigger();
|
||||
}
|
||||
private async Task Notify()
|
||||
{
|
||||
if (Disposed) return;
|
||||
if (table != null)
|
||||
await InvokeAsync(table.QueryAsync);
|
||||
}
|
||||
|
||||
private async Task RunTimerAsync()
|
||||
{
|
||||
@@ -50,8 +72,7 @@ public partial class DeviceTable : IDisposable
|
||||
{
|
||||
try
|
||||
{
|
||||
if (table != null)
|
||||
await InvokeAsync(table.QueryAsync);
|
||||
await InvokeAsync(StateHasChanged);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@@ -20,6 +20,10 @@
|
||||
{
|
||||
"Url": "/ModbusSlave",
|
||||
"Text": "ModbusSlave"
|
||||
},
|
||||
{
|
||||
"Url": "/ModbusGYMaster",
|
||||
"Text": "ModbusGYMaster"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@@ -212,7 +212,7 @@ public partial class ModbusMaster : DtuServiceDeviceBase, IModbusAddress
|
||||
}
|
||||
}
|
||||
|
||||
private ISendMessage GetSendMessage(ModbusAddress modbusAddress, bool read)
|
||||
protected ISendMessage GetSendMessage(ModbusAddress modbusAddress, bool read)
|
||||
{
|
||||
if (ModbusType == ModbusTypeEnum.ModbusRtu)
|
||||
{
|
||||
|
@@ -12,7 +12,7 @@
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
|
||||
<PackageReference Include="xunit" Version="2.9.3" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.0">
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.1">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
|
@@ -40,6 +40,21 @@ public partial class SqlHistoryAlarm : BusinessBaseWithCacheVariableModel<Histor
|
||||
return;
|
||||
AddQueueVarModel(new CacheDBItem<HistoryAlarm>(alarmVariable.Adapt<HistoryAlarm>(_config)));
|
||||
}
|
||||
public override void PauseThread(bool pause)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
var oldV = CurrentDevice.Pause;
|
||||
base.PauseThread(pause);
|
||||
if (!pause && oldV != pause)
|
||||
{
|
||||
GlobalData.ReadOnlyRealAlarmIdVariables?.ForEach(a =>
|
||||
{
|
||||
AlarmWorker_OnAlarmChanged(a.Value);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async ValueTask<OperResult> InserableAsync(List<HistoryAlarm> dbInserts, CancellationToken cancellationToken)
|
||||
{
|
||||
|
@@ -16,7 +16,6 @@ using SqlSugar;
|
||||
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
using ThingsGateway.Extension;
|
||||
using ThingsGateway.Foundation.Modbus;
|
||||
using ThingsGateway.Gateway.Application;
|
||||
using ThingsGateway.NewLife;
|
||||
@@ -33,7 +32,7 @@ public class ModbusSlave : BusinessBase
|
||||
{
|
||||
private readonly ModbusSlaveProperty _driverPropertys = new();
|
||||
|
||||
private readonly ConcurrentQueue<(string, VariableRuntime)> _modbusVariableQueue = new();
|
||||
private readonly ConcurrentDictionary<string, VariableRuntime> ModbusVariableQueue = new();
|
||||
|
||||
private readonly ModbusSlaveVariableProperty _variablePropertys = new();
|
||||
|
||||
@@ -124,7 +123,7 @@ public class ModbusSlave : BusinessBase
|
||||
public override async Task AfterVariablesChangedAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
await base.AfterVariablesChangedAsync(cancellationToken).ConfigureAwait(false);
|
||||
_modbusVariableQueue?.Clear();
|
||||
ModbusVariableQueue?.Clear();
|
||||
IdVariableRuntimes.ForEach(a =>
|
||||
{
|
||||
VariableValueChange(a.Value, default);
|
||||
@@ -145,7 +144,7 @@ public class ModbusSlave : BusinessBase
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
ModbusVariables?.Clear();
|
||||
_modbusVariableQueue?.Clear();
|
||||
ModbusVariableQueue?.Clear();
|
||||
GlobalData.VariableValueChangeEvent -= VariableValueChange;
|
||||
_plc?.SafeDispose();
|
||||
base.Dispose(disposing);
|
||||
@@ -180,19 +179,19 @@ public class ModbusSlave : BusinessBase
|
||||
await Task.Delay(10000, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
var list = _modbusVariableQueue.ToListWithDequeue();
|
||||
var list = ModbusVariableQueue.ToDictWithDequeue();
|
||||
foreach (var item in list)
|
||||
{
|
||||
if (cancellationToken.IsCancellationRequested)
|
||||
break;
|
||||
var type = item.Item2.GetPropertyValue(CurrentDevice.Id, nameof(ModbusSlaveVariableProperty.DataType));
|
||||
var type = item.Value.GetPropertyValue(CurrentDevice.Id, nameof(ModbusSlaveVariableProperty.DataType));
|
||||
if (Enum.TryParse(type, out DataTypeEnum result))
|
||||
{
|
||||
await _plc.WriteAsync(item.Item1, JToken.FromObject(item.Item2.Value), result, cancellationToken).ConfigureAwait(false);
|
||||
await _plc.WriteAsync(item.Key, JToken.FromObject(item.Value.Value), result, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
await _plc.WriteAsync(item.Item1, JToken.FromObject(item.Item2.Value), item.Item2.DataType, cancellationToken).ConfigureAwait(false);
|
||||
await _plc.WriteAsync(item.Key, JToken.FromObject(item.Value.Value), item.Value.DataType, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -259,7 +258,25 @@ public class ModbusSlave : BusinessBase
|
||||
var address = variableRuntime.GetPropertyValue(DeviceId, nameof(_variablePropertys.ServiceAddress));
|
||||
if (address != null && variableRuntime.Value != null)
|
||||
{
|
||||
_modbusVariableQueue?.Enqueue((address, variableRuntime));
|
||||
ModbusVariableQueue?.AddOrUpdate(address, address => variableRuntime, (address, addvalue) => variableRuntime);
|
||||
}
|
||||
}
|
||||
|
||||
public override void PauseThread(bool pause)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
var oldV = CurrentDevice.Pause;
|
||||
base.PauseThread(pause);
|
||||
if (!pause && oldV != pause)
|
||||
{
|
||||
IdVariableRuntimes.ForEach(a =>
|
||||
{
|
||||
VariableValueChange(a.Value, null);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -21,6 +21,7 @@ using System.Collections.Concurrent;
|
||||
using ThingsGateway.Extension;
|
||||
using ThingsGateway.Extension.Generic;
|
||||
using ThingsGateway.Gateway.Application;
|
||||
using ThingsGateway.NewLife.Extension;
|
||||
using ThingsGateway.NewLife.Threading;
|
||||
|
||||
using TouchSocket.Core;
|
||||
@@ -47,7 +48,7 @@ public partial class OpcUaServer : BusinessBase
|
||||
protected override BusinessPropertyBase _businessPropertyBase => _driverPropertys;
|
||||
|
||||
protected IStringLocalizer Localizer { get; private set; }
|
||||
private ConcurrentQueue<VariableBasicData> CollectVariableRuntimes { get; set; } = new();
|
||||
private ConcurrentDictionary<long, VariableBasicData> CollectVariableRuntimes { get; set; } = new();
|
||||
|
||||
private static readonly string[] separator = new string[] { ";" };
|
||||
|
||||
@@ -183,13 +184,9 @@ public partial class OpcUaServer : BusinessBase
|
||||
await Task.Delay(10000, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
var data = CollectVariableRuntimes.ToListWithDequeue();
|
||||
if (data.Count > 0)
|
||||
var varList = CollectVariableRuntimes.ToListWithDequeue();
|
||||
if (varList.Count > 0)
|
||||
{
|
||||
data.Reverse();
|
||||
////变化推送
|
||||
var varList = data.DistinctBy(a => a.Id).ToList();
|
||||
|
||||
if (varList?.Count > 0)
|
||||
{
|
||||
foreach (var item in varList)
|
||||
@@ -411,17 +408,36 @@ public partial class OpcUaServer : BusinessBase
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
private void VariableValueChange(VariableRuntime variableRuntime, VariableBasicData variableData)
|
||||
{
|
||||
if (CurrentDevice.Pause)
|
||||
return;
|
||||
if (DisposedValue) return;
|
||||
if (IdVariableRuntimes.ContainsKey(variableData.Id))
|
||||
CollectVariableRuntimes.Enqueue(variableData);
|
||||
CollectVariableRuntimes.AddOrUpdate(variableData.Id, id => variableData, (id, addValue) => variableData);
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 暂停
|
||||
/// </summary>
|
||||
/// <param name="pause">暂停</param>
|
||||
public override void PauseThread(bool pause)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
var oldV = CurrentDevice.Pause;
|
||||
base.PauseThread(pause);
|
||||
if (!pause && oldV != pause)
|
||||
{
|
||||
IdVariableRuntimes.ForEach(a =>
|
||||
{
|
||||
VariableValueChange(a.Value, a.Value.Adapt<VariableBasicData>());
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -2,6 +2,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="ThingsGateway.Plugin.ModbusC1" Version="$(ProPluginVersion)" GeneratePathProperty="true" Private="false" IncludeAssets="native;" />
|
||||
<PackageReference Include="ThingsGateway.Plugin.ModbusGY" Version="$(ProPluginVersion)" GeneratePathProperty="true" Private="false" IncludeAssets="native;" />
|
||||
|
||||
</ItemGroup>
|
||||
|
||||
@@ -12,6 +13,7 @@
|
||||
<ItemGroup>
|
||||
<!-- setting up the variable for convenience -->
|
||||
<PkgThingsGateway_Plugin_ModbusC1PackageFiles Include="$(PkgThingsGateway_Plugin_ModbusC1)\Content\$(PluginTargetFramework)\**\*.*" />
|
||||
<PkgThingsGateway_Plugin_ModbusGYPackageFiles Include="$(PkgThingsGateway_Plugin_ModbusGY)\Content\$(PluginTargetFramework)\**\*.*" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<PluginFolder>$(TargetDir)Plugins\</PluginFolder>
|
||||
@@ -19,6 +21,7 @@
|
||||
<Message Text="将插件复制到插件目录 $(PluginFolder)" Importance="high" />
|
||||
|
||||
<Copy SourceFiles="@(PkgThingsGateway_Plugin_ModbusC1PackageFiles)" DestinationFolder="$(PluginFolder)%(RecursiveDir)" />
|
||||
<Copy SourceFiles="@(PkgThingsGateway_Plugin_ModbusGYPackageFiles)" DestinationFolder="$(PluginFolder)%(RecursiveDir)" />
|
||||
|
||||
</Target>
|
||||
|
||||
|
@@ -28,6 +28,8 @@
|
||||
<ProjectReference Include="..\PluginPro\ThingsGateway.Plugin.TIANXIN\ThingsGateway.Plugin.TIANXIN.csproj" />
|
||||
<ProjectReference Include="..\PluginPro\ThingsGateway.Plugin.Inovance\ThingsGateway.Plugin.Inovance.csproj" />
|
||||
|
||||
<ProjectReference Include="..\PluginPro\ThingsGateway.Plugin.ModbusGY\ThingsGateway.Plugin.ModbusGY.csproj" />
|
||||
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
|
@@ -103,6 +103,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThingsGateway.Plugin.Synchr
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThingsGateway.SqlSugar", "Admin\ThingsGateway.SqlSugar\ThingsGateway.SqlSugar.csproj", "{544EDA9F-978F-84F7-48BF-FA5888F52FFB}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThingsGateway.DB", "Admin\ThingsGateway.DB\ThingsGateway.DB.csproj", "{317B8159-28B1-49B1-1884-97D1BBDED982}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -273,6 +275,10 @@ Global
|
||||
{544EDA9F-978F-84F7-48BF-FA5888F52FFB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{544EDA9F-978F-84F7-48BF-FA5888F52FFB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{544EDA9F-978F-84F7-48BF-FA5888F52FFB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{317B8159-28B1-49B1-1884-97D1BBDED982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{317B8159-28B1-49B1-1884-97D1BBDED982}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{317B8159-28B1-49B1-1884-97D1BBDED982}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{317B8159-28B1-49B1-1884-97D1BBDED982}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@@ -317,10 +323,11 @@ Global
|
||||
{29DCAC9C-2D0F-E251-E907-F07D804CA117} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
|
||||
{438B86D4-0CAE-DCC3-E952-90CE77BB8661} = {36510D70-161F-4241-B8D0-781E21032816}
|
||||
{544EDA9F-978F-84F7-48BF-FA5888F52FFB} = {72C65578-92A5-4E99-9779-27835B12B32F}
|
||||
{317B8159-28B1-49B1-1884-97D1BBDED982} = {72C65578-92A5-4E99-9779-27835B12B32F}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {199B1B96-4F56-4828-9531-813BA02DB282}
|
||||
RESX_NeutralResourcesLanguage = zh-Hans
|
||||
RESX_Rules = {"EnabledRules":[]}
|
||||
RESX_NeutralResourcesLanguage = zh-Hans
|
||||
SolutionGuid = {199B1B96-4F56-4828-9531-813BA02DB282}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
@@ -16,7 +16,7 @@
|
||||
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="TouchSocket.Dmtp" Version="3.1.6" />
|
||||
<PackageReference Include="TouchSocket.Dmtp" Version="3.1.7" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<Version>10.7.31</Version>
|
||||
<Version>10.7.36</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
Reference in New Issue
Block a user