From 2f1c8790c01c47eb63118c50fdb3ce2e08e7fe2b Mon Sep 17 00:00:00 2001
From: sunkaixuan <610262374@qq.com>
Date: Sun, 30 Jul 2023 22:19:03 +0800
Subject: [PATCH] Add TdengineCore
---
.../SqlSugar - Backup.TDengineCore.csproj | 13 +
.../SqlSugar.TDengineCore.csproj | 13 +
.../TDengine/CodeFirst/TDengineCodeFirst.cs | 90 +++
.../TDengine/DbBind/TDengineDbBind.cs | 153 ++++++
.../TDengine/DbFirst/TDengineDbFirst.cs | 11 +
.../DbMaintenance/TDengineDbMaintenance.cs | 516 ++++++++++++++++++
.../Insertable/TDengineInserttable.cs | 97 ++++
.../Queryable/TDengineSqlQueryable.cs | 69 +++
.../SqlBuilder/PostgreSQLExpressionContext.cs | 474 ++++++++++++++++
.../TDengine/SqlBuilder/TDengineBuilder.cs | 128 +++++
.../SqlBuilder/TDengineDeleteBuilder.cs | 7 +
.../SqlBuilder/TDengineFastBuilder.cs | 54 ++
.../SqlBuilder/TDengineInsertBuilder.cs | 178 ++++++
.../SqlBuilder/TDengineQueryBuilder.cs | 121 ++++
.../SqlBuilder/TDengineUpdateBuilder.cs | 249 +++++++++
.../TDengine/TDengineProvider.cs | 104 ++++
.../TDengineDataAdapter.cs | 155 ++++++
.../Tools/ErrorMessage.cs | 64 +++
.../SqlSugar.TDengineCore/Tools/FileHelper.cs | 70 +++
.../Tools/UtilConstants.cs | 73 +++
.../Tools/UtilExtensions.cs | 136 +++++
.../Tools/UtilMethods.cs | 507 +++++++++++++++++
.../Tools/ValidateExtensions.cs | 172 ++++++
Src/Asp.NetCore2/SqlSugarCore.sln | 15 +
24 files changed, 3469 insertions(+)
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/SqlSugar - Backup.TDengineCore.csproj
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/SqlSugar.TDengineCore.csproj
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/CodeFirst/TDengineCodeFirst.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/DbBind/TDengineDbBind.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/DbFirst/TDengineDbFirst.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/DbMaintenance/TDengineDbMaintenance.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/Insertable/TDengineInserttable.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/Queryable/TDengineSqlQueryable.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/PostgreSQLExpressionContext.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineBuilder.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineDeleteBuilder.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineFastBuilder.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineInsertBuilder.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineQueryBuilder.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineUpdateBuilder.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/TDengineProvider.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengineDataAdapter.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/ErrorMessage.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/FileHelper.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/UtilConstants.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/UtilExtensions.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/UtilMethods.cs
create mode 100644 Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/ValidateExtensions.cs
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/SqlSugar - Backup.TDengineCore.csproj b/Src/Asp.NetCore2/SqlSugar.TDengineCore/SqlSugar - Backup.TDengineCore.csproj
new file mode 100644
index 000000000..6e7116679
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/SqlSugar - Backup.TDengineCore.csproj
@@ -0,0 +1,13 @@
+
+
+
+ netstandard2.1
+ enable
+
+
+
+
+
+
+
+
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/SqlSugar.TDengineCore.csproj b/Src/Asp.NetCore2/SqlSugar.TDengineCore/SqlSugar.TDengineCore.csproj
new file mode 100644
index 000000000..6e7116679
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/SqlSugar.TDengineCore.csproj
@@ -0,0 +1,13 @@
+
+
+
+ netstandard2.1
+ enable
+
+
+
+
+
+
+
+
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/CodeFirst/TDengineCodeFirst.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/CodeFirst/TDengineCodeFirst.cs
new file mode 100644
index 000000000..a7ccf1f7e
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/CodeFirst/TDengineCodeFirst.cs
@@ -0,0 +1,90 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace SqlSugar.TDengine
+{
+ public class TDengineCodeFirst : CodeFirstProvider
+ {
+ protected override void ExistLogicEnd(List dbColumns)
+ {
+ foreach (EntityColumnInfo column in dbColumns)
+ {
+ if (column.DefaultValue != null)
+ {
+ this.Context.DbMaintenance.AddDefaultValue(column.DbTableName,column.DbColumnName,column.DefaultValue.ToSqlValue());
+ }
+ }
+ }
+ public override void NoExistLogic(EntityInfo entityInfo)
+ {
+ var tableName = GetTableName(entityInfo);
+ //Check.Exception(entityInfo.Columns.Where(it => it.IsPrimarykey).Count() > 1, "Use Code First ,The primary key must not exceed 1");
+ List columns = new List();
+ if (entityInfo.Columns.HasValue())
+ {
+ foreach (var item in entityInfo.Columns.Where(it=>it.IsIgnore==false))
+ {
+ DbColumnInfo dbColumnInfo = this.EntityColumnToDbColumn(entityInfo, tableName, item);
+ columns.Add(dbColumnInfo);
+ }
+ if (entityInfo.IsCreateTableFiledSort)
+ {
+ columns = columns.OrderBy(c => c.CreateTableFieldSort).ToList();
+ }
+ }
+ columns = columns.OrderBy(it => it.IsPrimarykey ? 0 : 1).ToList();
+ this.Context.DbMaintenance.CreateTable(tableName, columns,true);
+ }
+ protected override DbColumnInfo EntityColumnToDbColumn(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
+ {
+ var propertyType = UtilMethods.GetUnderType(item.PropertyInfo);
+ var result = new DbColumnInfo()
+ {
+ TableId = entityInfo.Columns.IndexOf(item),
+ DbColumnName = item.DbColumnName.HasValue() ? item.DbColumnName : item.PropertyName,
+ IsPrimarykey = item.IsPrimarykey,
+ IsIdentity = item.IsIdentity,
+ TableName = tableName,
+ IsNullable = item.IsNullable,
+ DefaultValue = item.DefaultValue,
+ ColumnDescription = item.ColumnDescription,
+ Length = item.Length,
+ CreateTableFieldSort = item.CreateTableFieldSort
+ };
+ if (propertyType == UtilConstants.DecType)
+ {
+ result.Scale = item.DecimalDigits;
+ result.DecimalDigits = item.DecimalDigits;
+ }
+ GetDbType(item, propertyType, result);
+ if (result.DataType.Equals("varchar", StringComparison.CurrentCultureIgnoreCase) && result.Length == 0)
+ {
+ result.Length = 1;
+ }
+ return result;
+ }
+
+ protected override void ConvertColumns(List dbColumns)
+ {
+ foreach (var item in dbColumns)
+ {
+ if (item.DataType == "DateTime")
+ {
+ item.Length = 0;
+ }
+ }
+ }
+
+ protected override void ChangeKey(EntityInfo entityInfo, string tableName, EntityColumnInfo item)
+ {
+ this.Context.DbMaintenance.UpdateColumn(tableName, EntityColumnToDbColumn(entityInfo, tableName, item));
+ if (!item.IsPrimarykey)
+ this.Context.DbMaintenance.DropConstraint(tableName,null);
+ if (item.IsPrimarykey)
+ this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName);
+ }
+
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/DbBind/TDengineDbBind.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/DbBind/TDengineDbBind.cs
new file mode 100644
index 000000000..894508236
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/DbBind/TDengineDbBind.cs
@@ -0,0 +1,153 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace SqlSugar.TDengine
+{
+ public class TDengineDbBind : DbBindProvider
+ {
+ public override string GetDbTypeName(string csharpTypeName)
+ {
+ if (csharpTypeName == UtilConstants.ByteArrayType.Name)
+ return "bytea";
+ if (csharpTypeName.ToLower() == "int32")
+ csharpTypeName = "int";
+ if (csharpTypeName.ToLower() == "int16")
+ csharpTypeName = "short";
+ if (csharpTypeName.ToLower() == "int64")
+ csharpTypeName = "long";
+ if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
+ csharpTypeName = "bool";
+ if (csharpTypeName == "DateTimeOffset")
+ csharpTypeName = "DateTime";
+ var mappings = this.MappingTypes.Where(it => it.Value.ToString().Equals(csharpTypeName, StringComparison.CurrentCultureIgnoreCase)).ToList();
+ if (mappings != null && mappings.Count > 0)
+ return mappings.First().Key;
+ else
+ return "varchar";
+ }
+ public override string GetPropertyTypeName(string dbTypeName)
+ {
+ dbTypeName = dbTypeName.ToLower();
+ var propertyTypes = MappingTypes.Where(it => it.Value.ToString().ToLower() == dbTypeName || it.Key.ToLower() == dbTypeName);
+ if (propertyTypes == null)
+ {
+ return "other";
+ }
+ else if (dbTypeName == "xml" || dbTypeName == "string"|| dbTypeName == "jsonb"|| dbTypeName == "json")
+ {
+ return "string";
+ }else if (dbTypeName == "bpchar")//数据库char datatype 查询出来的时候是 bpchar
+ {
+ return "char";
+ }
+ if (dbTypeName == "byte[]")
+ {
+ return "byte[]";
+ }
+ else if (propertyTypes == null || propertyTypes.Count() == 0)
+ {
+ if (dbTypeName.StartsWith("_"))
+ {
+ var dbTypeName2 = dbTypeName.TrimStart('_');
+ return MappingTypes.Where(it => it.Value.ToString().ToLower() == dbTypeName2 || it.Key.ToLower() == dbTypeName2).Select(it => it.Value + "[]").First();
+ }
+ Check.ThrowNotSupportedException(string.Format(" \"{0}\" Type NotSupported, DbBindProvider.GetPropertyTypeName error.", dbTypeName));
+ return null;
+ }
+ else if (propertyTypes.First().Value == CSharpDataType.byteArray)
+ {
+ return "byte[]";
+ }
+ else
+ {
+ return propertyTypes.First().Value.ToString();
+ }
+ }
+ public override List> MappingTypes
+ {
+ get
+ {
+ var extService = this.Context.CurrentConnectionConfig.ConfigureExternalServices;
+ if (extService != null && extService.AppendDataReaderTypeMappings.HasValue())
+ {
+ return extService.AppendDataReaderTypeMappings.Union(MappingTypesConst).ToList();
+ }
+ else
+ {
+ return MappingTypesConst;
+ }
+ }
+ }
+ public static List> MappingTypesConst = new List>(){
+
+ new KeyValuePair("int2",CSharpDataType.@short),
+ new KeyValuePair("int1",CSharpDataType.@byte),
+ new KeyValuePair("smallint",CSharpDataType.@short),
+ new KeyValuePair("int4",CSharpDataType.@int),
+ new KeyValuePair("serial",CSharpDataType.@int),
+ new KeyValuePair("integer",CSharpDataType.@int),
+ new KeyValuePair("int8",CSharpDataType.@long),
+ new KeyValuePair("bigint",CSharpDataType.@long),
+ new KeyValuePair("float4",CSharpDataType.@float),
+ new KeyValuePair("float4",CSharpDataType.Single),
+ new KeyValuePair("real",CSharpDataType.@float),
+ new KeyValuePair("float8",CSharpDataType.@double),
+ new KeyValuePair("double precision",CSharpDataType.@int),
+ new KeyValuePair("numeric",CSharpDataType.@decimal),
+ new KeyValuePair("decimal",CSharpDataType.@decimal),
+ new KeyValuePair("path",CSharpDataType.@decimal),
+ new KeyValuePair("point",CSharpDataType.@decimal),
+ new KeyValuePair("polygon",CSharpDataType.@decimal),
+
+ new KeyValuePair("boolean",CSharpDataType.@bool),
+ new KeyValuePair("bool",CSharpDataType.@bool),
+ new KeyValuePair("box",CSharpDataType.@bool),
+ new KeyValuePair("bytea",CSharpDataType.byteArray),
+
+ new KeyValuePair("varchar",CSharpDataType.@string),
+ new KeyValuePair("character varying",CSharpDataType.@string),
+ new KeyValuePair("geometry",CSharpDataType.@string),
+ new KeyValuePair("name",CSharpDataType.@string),
+ new KeyValuePair("text",CSharpDataType.@string),
+ new KeyValuePair("char",CSharpDataType.@string),
+ new KeyValuePair("character",CSharpDataType.@string),
+ new KeyValuePair("cidr",CSharpDataType.@string),
+ new KeyValuePair("circle",CSharpDataType.@string),
+ new KeyValuePair("tsquery",CSharpDataType.@string),
+ new KeyValuePair("tsvector",CSharpDataType.@string),
+ new KeyValuePair("txid_snapshot",CSharpDataType.@string),
+ new KeyValuePair("uuid",CSharpDataType.Guid),
+ new KeyValuePair("xml",CSharpDataType.@string),
+ new KeyValuePair("json",CSharpDataType.@string),
+
+ new KeyValuePair("interval",CSharpDataType.@decimal),
+ new KeyValuePair("lseg",CSharpDataType.@decimal),
+ new KeyValuePair("macaddr",CSharpDataType.@decimal),
+ new KeyValuePair("money",CSharpDataType.@decimal),
+ new KeyValuePair("timestamp",CSharpDataType.DateTime),
+ new KeyValuePair("timestamp with time zone",CSharpDataType.DateTime),
+ new KeyValuePair("timestamptz",CSharpDataType.DateTime),
+ new KeyValuePair("timestamp without time zone",CSharpDataType.DateTime),
+ new KeyValuePair("date",CSharpDataType.DateTime),
+ new KeyValuePair("time",CSharpDataType.DateTime),
+ new KeyValuePair("time with time zone",CSharpDataType.DateTime),
+ new KeyValuePair("timetz",CSharpDataType.DateTime),
+ new KeyValuePair("time without time zone",CSharpDataType.DateTime),
+
+ new KeyValuePair("bit",CSharpDataType.byteArray),
+ new KeyValuePair("bit varying",CSharpDataType.byteArray),
+ new KeyValuePair("varbit",CSharpDataType.@byte),
+ new KeyValuePair("time",CSharpDataType.TimeSpan),
+ new KeyValuePair("public.geometry",CSharpDataType.@object),
+ new KeyValuePair("inet",CSharpDataType.@object)
+ };
+ public override List StringThrow
+ {
+ get
+ {
+ return new List() { "int32", "datetime", "decimal", "double", "byte" };
+ }
+ }
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/DbFirst/TDengineDbFirst.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/DbFirst/TDengineDbFirst.cs
new file mode 100644
index 000000000..8bb6dbdd4
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/DbFirst/TDengineDbFirst.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace SqlSugar.TDengine
+{
+ public class TDengineDbFirst : DbFirstProvider
+ {
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/DbMaintenance/TDengineDbMaintenance.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/DbMaintenance/TDengineDbMaintenance.cs
new file mode 100644
index 000000000..902509ac7
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/DbMaintenance/TDengineDbMaintenance.cs
@@ -0,0 +1,516 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace SqlSugar.TDengine
+{
+ public class TDengineDbMaintenance : DbMaintenanceProvider
+ {
+ #region DML
+ protected override string GetDataBaseSql
+ {
+ get
+ {
+ return "SELECT datname FROM pg_database";
+ }
+ }
+ protected override string GetColumnInfosByTableNameSql
+ {
+ get
+ {
+ string schema = GetSchema();
+ string sql = @"select cast (pclass.oid as int4) as TableId,cast(ptables.tablename as varchar) as TableName,
+ pcolumn.column_name as DbColumnName,pcolumn.udt_name as DataType,
+ CASE WHEN pcolumn.numeric_scale >0 THEN pcolumn.numeric_precision ELSE pcolumn.character_maximum_length END as Length,
+ pcolumn.column_default as DefaultValue,
+ pcolumn.numeric_scale as DecimalDigits,
+ pcolumn.numeric_scale as Scale,
+ col_description(pclass.oid, pcolumn.ordinal_position) as ColumnDescription,
+ case when pkey.colname = pcolumn.column_name
+ then true else false end as IsPrimaryKey,
+ case when pcolumn.column_default like 'nextval%'
+ then true else false end as IsIdentity,
+ case when pcolumn.is_nullable = 'YES'
+ then true else false end as IsNullable
+ from (select * from pg_tables where upper(tablename) = upper('{0}') and schemaname='" + schema + @"') ptables inner join pg_class pclass
+ on ptables.tablename = pclass.relname inner join (SELECT *
+ FROM information_schema.columns
+ ) pcolumn on pcolumn.table_name = ptables.tablename
+ left join (
+ select pg_class.relname,pg_attribute.attname as colname from
+ pg_constraint inner join pg_class
+ on pg_constraint.conrelid = pg_class.oid
+ inner join pg_attribute on pg_attribute.attrelid = pg_class.oid
+ and pg_attribute.attnum = pg_constraint.conkey[1]
+ inner join pg_type on pg_type.oid = pg_attribute.atttypid
+ where pg_constraint.contype='p'
+ ) pkey on pcolumn.table_name = pkey.relname
+ order by table_catalog, table_schema, ordinal_position";
+ return sql;
+ }
+ }
+
+ protected override string GetTableInfoListSql
+ {
+ get
+ {
+ var schema = GetSchema();
+ return @"select cast(relname as varchar) as Name,
+ cast(obj_description(c.oid,'pg_class') as varchar) as Description from pg_class c
+ inner join
+ pg_namespace n on n.oid = c.relnamespace and nspname='" + schema + @"'
+ inner join
+ pg_tables z on z.tablename=c.relname
+ where relkind in('p', 'r') and relname not like 'hg_%' and relname not like 'sql_%' and schemaname='" + schema + "' order by relname";
+ }
+ }
+ protected override string GetViewInfoListSql
+ {
+ get
+ {
+ return @"select cast(relname as varchar) as Name,cast(Description as varchar) from pg_description
+ join pg_class on pg_description.objoid = pg_class.oid
+ where objsubid = 0 and relname in (SELECT viewname from pg_views
+ WHERE schemaname ='"+GetSchema()+"')";
+ }
+ }
+ #endregion
+
+ #region DDL
+ protected override string CreateDataBaseSql
+ {
+ get
+ {
+ return "CREATE DATABASE {0}";
+ }
+ }
+ protected override string AddPrimaryKeySql
+ {
+ get
+ {
+ return "ALTER TABLE {0} ADD PRIMARY KEY({2}) /*{1}*/";
+ }
+ }
+ protected override string AddColumnToTableSql
+ {
+ get
+ {
+ return "ALTER TABLE {0} ADD COLUMN {1} {2}{3} {4} {5} {6}";
+ }
+ }
+ protected override string AlterColumnToTableSql
+ {
+ get
+ {
+ return "alter table {0} ALTER COLUMN {1} {2}{3} {4} {5} {6}";
+ }
+ }
+ protected override string BackupDataBaseSql
+ {
+ get
+ {
+ return "mysqldump.exe {0} -uroot -p > {1} ";
+ }
+ }
+ protected override string CreateTableSql
+ {
+ get
+ {
+ return "CREATE TABLE {0}(\r\n{1} $PrimaryKey)";
+ }
+ }
+ protected override string CreateTableColumn
+ {
+ get
+ {
+ return "{0} {1}{2} {3} {4} {5}";
+ }
+ }
+ protected override string TruncateTableSql
+ {
+ get
+ {
+ return "TRUNCATE TABLE {0}";
+ }
+ }
+ protected override string BackupTableSql
+ {
+ get
+ {
+ return "create table {0} as (select * from {1} limit {2} offset 0)";
+ }
+ }
+ protected override string DropTableSql
+ {
+ get
+ {
+ return "DROP TABLE {0}";
+ }
+ }
+ protected override string DropColumnToTableSql
+ {
+ get
+ {
+ return "ALTER TABLE {0} DROP COLUMN {1}";
+ }
+ }
+ protected override string DropConstraintSql
+ {
+ get
+ {
+ return "ALTER TABLE {0} DROP CONSTRAINT {1}";
+ }
+ }
+ protected override string RenameColumnSql
+ {
+ get
+ {
+ return "ALTER TABLE {0} RENAME {1} TO {2}";
+ }
+ }
+ protected override string AddColumnRemarkSql => "comment on column {1}.{0} is '{2}'";
+
+ protected override string DeleteColumnRemarkSql => "comment on column {1}.{0} is ''";
+
+ protected override string IsAnyColumnRemarkSql { get { throw new NotSupportedException(); } }
+
+ protected override string AddTableRemarkSql => "comment on table {0} is '{1}'";
+
+ protected override string DeleteTableRemarkSql => "comment on table {0} is ''";
+
+ protected override string IsAnyTableRemarkSql { get { throw new NotSupportedException(); } }
+
+ protected override string RenameTableSql => "alter table {0} to {1}";
+
+ protected override string CreateIndexSql
+ {
+ get
+ {
+ return "CREATE {3} INDEX Index_{0}_{2} ON {0} ({1})";
+ }
+ }
+ protected override string AddDefaultValueSql
+ {
+ get
+ {
+ return "ALTER TABLE {0} ALTER COLUMN {1} SET DEFAULT {2}";
+ }
+ }
+ protected override string IsAnyIndexSql
+ {
+ get
+ {
+ return " SELECT count(1) WHERE upper('{0}') IN ( SELECT upper(indexname) FROM pg_indexes )";
+ }
+ }
+ protected override string IsAnyProcedureSql => throw new NotImplementedException();
+ #endregion
+
+ #region Check
+ protected override string CheckSystemTablePermissionsSql
+ {
+ get
+ {
+ return "select 1 from information_schema.columns limit 1 offset 0";
+ }
+ }
+ #endregion
+
+ #region Scattered
+ protected override string CreateTableNull
+ {
+ get
+ {
+ return "DEFAULT NULL";
+ }
+ }
+ protected override string CreateTableNotNull
+ {
+ get
+ {
+ return "NOT NULL";
+ }
+ }
+ protected override string CreateTablePirmaryKey
+ {
+ get
+ {
+ return "PRIMARY KEY";
+ }
+ }
+ protected override string CreateTableIdentity
+ {
+ get
+ {
+ return "serial";
+ }
+ }
+ #endregion
+
+ #region Methods
+ public override List GetIndexList(string tableName)
+ {
+ var sql = $"SELECT indexname, indexdef FROM pg_indexes WHERE upper(tablename) = upper('{tableName}')";
+ return this.Context.Ado.SqlQuery(sql);
+ }
+ public override List GetProcList(string dbName)
+ {
+ var sql = $"SELECT proname FROM pg_proc p JOIN pg_namespace n ON p.pronamespace = n.oid WHERE n.nspname = '{dbName}'";
+ return this.Context.Ado.SqlQuery(sql);
+ }
+ public override bool AddDefaultValue(string tableName, string columnName, string defaultValue)
+ {
+ return base.AddDefaultValue(this.SqlBuilder.GetTranslationTableName(tableName), this.SqlBuilder.GetTranslationTableName(columnName), defaultValue);
+ }
+ public override bool AddColumnRemark(string columnName, string tableName, string description)
+ {
+ tableName = this.SqlBuilder.GetTranslationTableName(tableName);
+ string sql = string.Format(this.AddColumnRemarkSql, this.SqlBuilder.GetTranslationColumnName(columnName.ToLower(isAutoToLowerCodeFirst)), tableName, description);
+ this.Context.Ado.ExecuteCommand(sql);
+ return true;
+ }
+ public override bool AddTableRemark(string tableName, string description)
+ {
+ tableName = this.SqlBuilder.GetTranslationTableName(tableName);
+ return base.AddTableRemark(tableName, description);
+ }
+ public override bool UpdateColumn(string tableName, DbColumnInfo columnInfo)
+ {
+ tableName = this.SqlBuilder.GetTranslationTableName(tableName);
+ var columnName= this.SqlBuilder.GetTranslationColumnName(columnInfo.DbColumnName);
+ string sql = GetUpdateColumnSql(tableName, columnInfo);
+ this.Context.Ado.ExecuteCommand(sql);
+ var isnull = columnInfo.IsNullable?" DROP NOT NULL ": " SET NOT NULL ";
+ this.Context.Ado.ExecuteCommand(string.Format("alter table {0} alter {1} {2}",tableName,columnName, isnull));
+ return true;
+ }
+
+ protected override string GetUpdateColumnSql(string tableName, DbColumnInfo columnInfo)
+ {
+ string columnName = this.SqlBuilder.GetTranslationColumnName(columnInfo.DbColumnName);
+ tableName = this.SqlBuilder.GetTranslationTableName(tableName);
+ string dataSize = GetSize(columnInfo);
+ string dataType = columnInfo.DataType;
+ if (!string.IsNullOrEmpty(dataType))
+ {
+ dataType = " type " + dataType;
+ }
+ string nullType = "";
+ string primaryKey = null;
+ string identity = null;
+ string result = string.Format(this.AlterColumnToTableSql, tableName, columnName, dataType, dataSize, nullType, primaryKey, identity);
+ return result;
+ }
+
+ ///
+ ///by current connection string
+ ///
+ ///
+ ///
+ public override bool CreateDatabase(string databaseName, string databaseDirectory = null)
+ {
+ if (databaseDirectory != null)
+ {
+ if (!FileHelper.IsExistDirectory(databaseDirectory))
+ {
+ FileHelper.CreateDirectory(databaseDirectory);
+ }
+ }
+ // var oldDatabaseName = this.Context.Ado.Connection.Database;
+ //var connection = this.Context.CurrentConnectionConfig.ConnectionString;
+ //connection = connection.Replace(oldDatabaseName, "");
+ if (this.Context.Ado.IsValidConnection())
+ {
+ return true;
+ }
+ var newDb = this.Context.CopyNew();
+ newDb.Ado.Connection.ChangeDatabase("highgo");
+ newDb.Open();
+ if (!GetDataBaseList(newDb).Any(it => it.Equals(databaseName, StringComparison.CurrentCultureIgnoreCase)))
+ {
+ newDb.Ado.ExecuteCommand(string.Format(CreateDataBaseSql, this.SqlBuilder.SqlTranslationLeft+databaseName+this.SqlBuilder.SqlTranslationRight, databaseDirectory));
+ }
+ newDb.Close();
+ return true;
+ }
+ public override bool AddRemark(EntityInfo entity)
+ {
+ var db = this.Context;
+ var columns = entity.Columns.Where(it => it.IsIgnore == false).ToList();
+
+ foreach (var item in columns)
+ {
+ if (item.ColumnDescription != null)
+ {
+ db.DbMaintenance.AddColumnRemark(item.DbColumnName, item.DbTableName, item.ColumnDescription);
+
+ }
+ }
+ //table remak
+ if (entity.TableDescription != null)
+ {
+ db.DbMaintenance.AddTableRemark(entity.DbTableName, entity.TableDescription);
+ }
+ return true;
+ }
+ public override bool CreateTable(string tableName, List columns, bool isCreatePrimaryKey = true)
+ {
+ if (columns.HasValue())
+ {
+ foreach (var item in columns)
+ {
+ if (item.DbColumnName.Equals("GUID", StringComparison.CurrentCultureIgnoreCase) && item.Length == 0)
+ {
+ item.Length = 10;
+ }
+ }
+ }
+ string sql = GetCreateTableSql(tableName, columns);
+ string primaryKeyInfo = null;
+ if (columns.Any(it => it.IsPrimarykey) && isCreatePrimaryKey)
+ {
+ primaryKeyInfo = string.Format(", Primary key({0})", string.Join(",", columns.Where(it => it.IsPrimarykey).Select(it => this.SqlBuilder.GetTranslationColumnName(it.DbColumnName.ToLower(isAutoToLowerCodeFirst)))));
+
+ }
+ sql = sql.Replace("$PrimaryKey", primaryKeyInfo);
+ this.Context.Ado.ExecuteCommand(sql);
+ return true;
+ }
+ protected override string GetCreateTableSql(string tableName, List columns)
+ {
+ List columnArray = new List();
+ Check.Exception(columns.IsNullOrEmpty(), "No columns found ");
+ foreach (var item in columns)
+ {
+ string columnName = item.DbColumnName;
+ string dataType = item.DataType;
+ if (dataType == "varchar" && item.Length == 0)
+ {
+ item.Length = 1;
+ }
+ //if (dataType == "uuid")
+ //{
+ // item.Length = 50;
+ // dataType = "varchar";
+ //}
+ string dataSize = item.Length > 0 ? string.Format("({0})", item.Length) : null;
+ if (item.DecimalDigits > 0&&item.Length>0 && dataType == "numeric")
+ {
+ dataSize = $"({item.Length},{item.DecimalDigits})";
+ }
+ string nullType = item.IsNullable ? this.CreateTableNull : CreateTableNotNull;
+ string primaryKey = null;
+ string addItem = string.Format(this.CreateTableColumn, this.SqlBuilder.GetTranslationColumnName(columnName.ToLower(isAutoToLowerCodeFirst)), dataType, dataSize, nullType, primaryKey, "");
+ if (item.IsIdentity)
+ {
+ string length = dataType.Substring(dataType.Length - 1);
+ string identityDataType = "serial" + length;
+ addItem = addItem.Replace(dataType, identityDataType);
+ }
+ columnArray.Add(addItem);
+ }
+ string tableString = string.Format(this.CreateTableSql, this.SqlBuilder.GetTranslationTableName(tableName.ToLower(isAutoToLowerCodeFirst)), string.Join(",\r\n", columnArray));
+ return tableString;
+ }
+ public override bool IsAnyConstraint(string constraintName)
+ {
+ throw new NotSupportedException("PgSql IsAnyConstraint NotSupportedException");
+ }
+ public override bool BackupDataBase(string databaseName, string fullFileName)
+ {
+ Check.ThrowNotSupportedException("PgSql BackupDataBase NotSupported");
+ return false;
+ }
+
+ public override List GetColumnInfosByTableName(string tableName, bool isCache = true)
+ {
+ var result= base.GetColumnInfosByTableName(tableName.TrimEnd('"').TrimStart('"').ToLower(), isCache);
+ if (result == null || result.Count() == 0)
+ {
+ result = base.GetColumnInfosByTableName(tableName, isCache);
+ }
+ try
+ {
+ string sql = $@"select
+ kcu.column_name as key_column
+ from information_schema.table_constraints tco
+ join information_schema.key_column_usage kcu
+ on kcu.constraint_name = tco.constraint_name
+ and kcu.constraint_schema = tco.constraint_schema
+ and kcu.constraint_name = tco.constraint_name
+ where tco.constraint_type = 'PRIMARY KEY'
+ and kcu.table_schema='{GetSchema()}' and
+ upper(kcu.table_name)=upper('{tableName.TrimEnd('"').TrimStart('"')}')";
+ List pkList = new List();
+ if (isCache)
+ {
+ pkList=GetListOrCache("GetColumnInfosByTableName_N_Pk"+tableName, sql);
+ }
+ else
+ {
+ pkList = this.Context.Ado.SqlQuery(sql);
+ }
+ if (pkList.Count >1)
+ {
+ foreach (var item in result)
+ {
+ if (pkList.Select(it=>it.ToUpper()).Contains(item.DbColumnName.ToUpper()))
+ {
+ item.IsPrimarykey = true;
+ }
+ }
+ }
+ }
+ catch
+ {
+
+ }
+ return result;
+ }
+ #endregion
+
+ #region Helper
+ private bool isAutoToLowerCodeFirst
+ {
+ get
+ {
+ if (this.Context.CurrentConnectionConfig.MoreSettings == null) return true;
+ else if (
+ this.Context.CurrentConnectionConfig.MoreSettings.PgSqlIsAutoToLower == false &&
+ this.Context.CurrentConnectionConfig.MoreSettings?.PgSqlIsAutoToLowerCodeFirst == false)
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+ }
+ }
+ private string GetSchema()
+ {
+ var schema = "public";
+ if (System.Text.RegularExpressions.Regex.IsMatch(this.Context.CurrentConnectionConfig.ConnectionString.ToLower(), "searchpath="))
+ {
+ var regValue = System.Text.RegularExpressions.Regex.Match(this.Context.CurrentConnectionConfig.ConnectionString.ToLower(), @"searchpath\=(\w+)").Groups[1].Value;
+ if (regValue.HasValue())
+ {
+ schema = regValue;
+ }
+ }
+ else if (System.Text.RegularExpressions.Regex.IsMatch(this.Context.CurrentConnectionConfig.ConnectionString.ToLower(), "search path="))
+ {
+ var regValue = System.Text.RegularExpressions.Regex.Match(this.Context.CurrentConnectionConfig.ConnectionString.ToLower(), @"search path\=(\w+)").Groups[1].Value;
+ if (regValue.HasValue())
+ {
+ schema = regValue;
+ }
+ }
+
+ return schema;
+ }
+
+ #endregion
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/Insertable/TDengineInserttable.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/Insertable/TDengineInserttable.cs
new file mode 100644
index 000000000..ff76c44c3
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/Insertable/TDengineInserttable.cs
@@ -0,0 +1,97 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SqlSugar.TDengine
+{
+ public class TDengineInsertable : InsertableProvider where T : class, new()
+ {
+ public override int ExecuteReturnIdentity()
+ {
+ InsertBuilder.IsReturnIdentity = true;
+ PreToSql();
+ string identityColumn = GetIdentityColumn();
+ string sql = InsertBuilder.ToSqlString().Replace("$PrimaryKey", this.SqlBuilder.GetTranslationColumnName(identityColumn));
+ RestoreMapping();
+ var result = Ado.GetScalar(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray()).ObjToInt();
+ After(sql, result);
+ return result;
+ }
+ public override async Task ExecuteReturnIdentityAsync()
+ {
+ InsertBuilder.IsReturnIdentity = true;
+ PreToSql();
+ string identityColumn = GetIdentityColumn();
+ string sql = InsertBuilder.ToSqlString().Replace("$PrimaryKey", this.SqlBuilder.GetTranslationColumnName(identityColumn));
+ RestoreMapping();
+ var obj = await Ado.GetScalarAsync(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray());
+ var result = obj.ObjToInt();
+ After(sql, result);
+ return result;
+ }
+ public override KeyValuePair> ToSql()
+ {
+ var result= base.ToSql();
+ var primaryKey = GetPrimaryKeys().FirstOrDefault();
+ if (primaryKey != null)
+ {
+ primaryKey = this.SqlBuilder.GetTranslationColumnName(primaryKey);
+ }
+ return new KeyValuePair>(result.Key.Replace("$PrimaryKey", primaryKey), result.Value);
+ }
+
+ public override long ExecuteReturnBigIdentity()
+ {
+ InsertBuilder.IsReturnIdentity = true;
+ PreToSql();
+ string sql = InsertBuilder.ToSqlString().Replace("$PrimaryKey", this.SqlBuilder.GetTranslationColumnName(GetIdentityKeys().FirstOrDefault()));
+ RestoreMapping();
+ var result = Convert.ToInt64(Ado.GetScalar(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray()) ?? "0");
+ After(sql, result);
+ return result;
+ }
+ public override async Task ExecuteReturnBigIdentityAsync()
+ {
+ InsertBuilder.IsReturnIdentity = true;
+ PreToSql();
+ string sql = InsertBuilder.ToSqlString().Replace("$PrimaryKey", this.SqlBuilder.GetTranslationColumnName(GetIdentityKeys().FirstOrDefault()));
+ RestoreMapping();
+ var result = Convert.ToInt64(await Ado.GetScalarAsync(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray()) ?? "0");
+ After(sql, result);
+ return result;
+ }
+
+ public override bool ExecuteCommandIdentityIntoEntity()
+ {
+ var result = InsertObjs.First();
+ var identityKeys = GetIdentityKeys();
+ if (identityKeys.Count == 0) { return this.ExecuteCommand() > 0; }
+ var idValue = ExecuteReturnBigIdentity();
+ Check.Exception(identityKeys.Count > 1, "ExecuteCommandIdentityIntoEntity does not support multiple identity keys");
+ var identityKey = identityKeys.First();
+ object setValue = 0;
+ if (idValue > int.MaxValue)
+ setValue = idValue;
+ else
+ setValue = Convert.ToInt32(idValue);
+ var propertyName = this.Context.EntityMaintenance.GetPropertyName(identityKey);
+ typeof(T).GetProperties().First(t => t.Name.ToUpper() == propertyName.ToUpper()).SetValue(result, setValue, null);
+ return idValue > 0;
+ }
+
+ private string GetIdentityColumn()
+ {
+ var identityColumn = GetIdentityKeys().FirstOrDefault();
+ if (identityColumn == null)
+ {
+ var columns = this.Context.DbMaintenance.GetColumnInfosByTableName(InsertBuilder.GetTableNameString);
+ identityColumn = columns.First(it => it.IsIdentity || it.IsPrimarykey).DbColumnName;
+ }
+ return identityColumn;
+ }
+
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/Queryable/TDengineSqlQueryable.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/Queryable/TDengineSqlQueryable.cs
new file mode 100644
index 000000000..855afeb31
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/Queryable/TDengineSqlQueryable.cs
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SqlSugar.TDengine
+{
+ public class TDengineQueryable : QueryableProvider
+ {
+ public override ISugarQueryable With(string withString)
+ {
+ return this;
+ }
+
+ public override ISugarQueryable PartitionBy(string groupFileds)
+ {
+ this.GroupBy(groupFileds);
+ return this;
+ }
+ }
+ public class HGQueryable : QueryableProvider
+ {
+ public new ISugarQueryable With(string withString)
+ {
+ return this;
+ }
+ }
+ public class HGQueryable : QueryableProvider
+ {
+
+ }
+ public class HGQueryable : QueryableProvider
+ {
+
+ }
+ public class HGQueryable : QueryableProvider
+ {
+
+ }
+ public class HGQueryable : QueryableProvider
+ {
+
+ }
+ public class HGQueryable : QueryableProvider
+ {
+
+ }
+ public class HGQueryable : QueryableProvider
+ {
+
+ }
+ public class HGQueryable : QueryableProvider
+ {
+
+ }
+ public class HGQueryable : QueryableProvider
+ {
+
+ }
+ public class HGQueryable : QueryableProvider
+ {
+
+ }
+ public class HGQueryable : QueryableProvider
+ {
+
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/PostgreSQLExpressionContext.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/PostgreSQLExpressionContext.cs
new file mode 100644
index 000000000..5fa489711
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/PostgreSQLExpressionContext.cs
@@ -0,0 +1,474 @@
+using System;
+using System.Linq;
+namespace SqlSugar.TDengine
+{
+ public class TDengineExpressionContext : ExpressionContext, ILambdaExpressions
+ {
+ public SqlSugarProvider Context { get; set; }
+ public TDengineExpressionContext()
+ {
+ base.DbMehtods = new TDengineExpressionContextMethod();
+ }
+ public override string SqlTranslationLeft
+ {
+ get
+ {
+ return "\"";
+ }
+ }
+ public override string SqlTranslationRight
+ {
+ get
+ {
+ return "\"";
+ }
+ }
+ public override string GetTranslationText(string name)
+ {
+ return SqlTranslationLeft + name.ToLower(isAutoToLower) + SqlTranslationRight;
+ }
+ public bool isAutoToLower
+ {
+ get
+ {
+ return base.PgSqlIsAutoToLower;
+ }
+ }
+ public override string GetTranslationTableName(string entityName, bool isMapping = true)
+ {
+ Check.ArgumentNullException(entityName, string.Format(ErrorMessage.ObjNotExist, "Table Name"));
+ if (IsTranslationText(entityName)) return entityName;
+ isMapping = isMapping && this.MappingTables.HasValue();
+ var isComplex = entityName.Contains(UtilConstants.Dot);
+ if (isMapping && isComplex)
+ {
+ var columnInfo = entityName.Split(UtilConstants.DotChar);
+ var mappingInfo = this.MappingTables.FirstOrDefault(it => it.EntityName.Equals(columnInfo.Last(), StringComparison.CurrentCultureIgnoreCase));
+ if (mappingInfo != null)
+ {
+ columnInfo[columnInfo.Length - 1] = mappingInfo.EntityName;
+ }
+ return string.Join(UtilConstants.Dot, columnInfo.Select(it => GetTranslationText(it)));
+ }
+ else if (isMapping)
+ {
+ var mappingInfo = this.MappingTables.FirstOrDefault(it => it.EntityName.Equals(entityName, StringComparison.CurrentCultureIgnoreCase));
+
+ var tableName = mappingInfo?.DbTableName+"";
+ if (tableName.Contains("."))
+ {
+ tableName = string.Join(UtilConstants.Dot, tableName.Split(UtilConstants.DotChar).Select(it => GetTranslationText(it)));
+ return tableName;
+ }
+
+ return SqlTranslationLeft + (mappingInfo == null ? entityName : mappingInfo.DbTableName).ToLower(isAutoToLower) + SqlTranslationRight;
+ }
+ else if (isComplex)
+ {
+ return string.Join(UtilConstants.Dot, entityName.Split(UtilConstants.DotChar).Select(it => GetTranslationText(it)));
+ }
+ else
+ {
+ return GetTranslationText(entityName);
+ }
+ }
+ public override string GetTranslationColumnName(string columnName)
+ {
+ Check.ArgumentNullException(columnName, string.Format(ErrorMessage.ObjNotExist, "Column Name"));
+ if (columnName.Substring(0, 1) == this.SqlParameterKeyWord)
+ {
+ return columnName;
+ }
+ if (IsTranslationText(columnName)) return columnName;
+ if (columnName.Contains(UtilConstants.Dot))
+ {
+ return string.Join(UtilConstants.Dot, columnName.Split(UtilConstants.DotChar).Select(it => GetTranslationText(it)));
+ }
+ else
+ {
+ return GetTranslationText(columnName);
+ }
+ }
+ public override string GetDbColumnName(string entityName, string propertyName)
+ {
+ if (this.MappingColumns.HasValue())
+ {
+ var mappingInfo = this.MappingColumns.SingleOrDefault(it => it.EntityName == entityName && it.PropertyName == propertyName);
+ return (mappingInfo == null ? propertyName : mappingInfo.DbColumnName).ToLower(isAutoToLower);
+ }
+ else
+ {
+ return propertyName.ToLower(isAutoToLower);
+ }
+ }
+
+ public string GetValue(object entityValue)
+ {
+ if (entityValue == null)
+ return null;
+ var type = UtilMethods.GetUnderType(entityValue.GetType());
+ if (UtilConstants.NumericalTypes.Contains(type))
+ {
+ return entityValue.ToString();
+ }
+ else if (type == UtilConstants.DateType)
+ {
+ return this.DbMehtods.ToDate(new MethodCallExpressionModel()
+ {
+ Args = new System.Collections.Generic.List() {
+ new MethodCallExpressionArgs(){ MemberName=$"'{entityValue}'" }
+ }
+ });
+ }
+ else
+ {
+ return this.DbMehtods.ToString(new MethodCallExpressionModel()
+ {
+ Args = new System.Collections.Generic.List() {
+ new MethodCallExpressionArgs(){ MemberName=$"'{entityValue}'" }
+ }
+ });
+ }
+ }
+ }
+ public class TDengineExpressionContextMethod : DefaultDbMethod, IDbMethods
+ {
+ public override string CharIndex(MethodCallExpressionModel model)
+ {
+ return string.Format(" (strpos ({1},{0})-1)", model.Args[0].MemberName, model.Args[1].MemberName);
+ }
+ public override string TrueValue()
+ {
+ return "true";
+ }
+ public override string FalseValue()
+ {
+ return "false";
+ }
+ public override string DateDiff(MethodCallExpressionModel model)
+ {
+ var parameter = (DateType)(Enum.Parse(typeof(DateType), model.Args[0].MemberValue.ObjToString()));
+ var begin = model.Args[1].MemberName;
+ var end = model.Args[2].MemberName;
+ switch (parameter)
+ {
+ case DateType.Year:
+ return $" ( DATE_PART('Year', {end} ) - DATE_PART('Year', {begin}) )";
+ case DateType.Month:
+ return $" ( ( DATE_PART('Year', {end} ) - DATE_PART('Year', {begin}) ) * 12 + (DATE_PART('month', {end}) - DATE_PART('month', {begin})) )";
+ case DateType.Day:
+ return $" ( DATE_PART('day', {end} - {begin}) )";
+ case DateType.Hour:
+ return $" ( ( DATE_PART('day', {end} - {begin}) ) * 24 + DATE_PART('hour', {end} - {begin} ) )";
+ case DateType.Minute:
+ return $" ( ( ( DATE_PART('day', {end} - {begin}) ) * 24 + DATE_PART('hour', {end} - {begin} ) ) * 60 + DATE_PART('minute', {end} - {begin} ) )";
+ case DateType.Second:
+ return $" ( ( ( DATE_PART('day', {end} - {begin}) ) * 24 + DATE_PART('hour', {end} - {begin} ) ) * 60 + DATE_PART('minute', {end} - {begin} ) ) * 60 + DATE_PART('second', {end} - {begin} )";
+ case DateType.Millisecond:
+ break;
+ default:
+ break;
+ }
+ throw new Exception(parameter + " datediff no support");
+ }
+ public override string IIF(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ var parameter2 = model.Args[1];
+ var parameter3 = model.Args[2];
+ if (parameter.Type == UtilConstants.BoolType)
+ {
+ parameter.MemberName = parameter.MemberName.ToString().Replace("=1", "=true");
+ parameter2.MemberName = false;
+ parameter3.MemberName = true;
+ }
+ return string.Format("( CASE WHEN {0} THEN {1} ELSE {2} END )", parameter.MemberName, parameter2.MemberName, parameter3.MemberName);
+ }
+ public override string DateValue(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ var parameter2 = model.Args[1];
+ var format = "dd";
+ if (parameter2.MemberValue.ObjToString() == DateType.Year.ToString())
+ {
+ format = "yyyy";
+ }
+ if (parameter2.MemberValue.ObjToString() == DateType.Month.ToString())
+ {
+ format = "MM";
+ }
+ if (parameter2.MemberValue.ObjToString() == DateType.Day.ToString())
+ {
+ format = "dd";
+ }
+ if (parameter2.MemberValue.ObjToString() == DateType.Hour.ToString())
+ {
+ format = "hh";
+ }
+ if (parameter2.MemberValue.ObjToString() == DateType.Minute.ToString())
+ {
+ format = "mi";
+ }
+ if (parameter2.MemberValue.ObjToString() == DateType.Second.ToString())
+ {
+ format = "ss";
+ }
+ if (parameter2.MemberValue.ObjToString() == DateType.Millisecond.ToString())
+ {
+ format = "ms";
+ }
+ if (parameter2.MemberValue.ObjToString() == DateType.Weekday.ToString())
+ {
+ return $" extract(DOW FROM cast({parameter.MemberName} as TIMESTAMP)) ";
+ }
+
+ return string.Format(" cast( to_char({1},'{0}')as integer ) ", format, parameter.MemberName);
+ }
+
+ public override string Contains(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ var parameter2 = model.Args[1];
+ return string.Format(" ({0} like concat('%',{1},'%')) ", parameter.MemberName, parameter2.MemberName );
+ }
+
+ public override string StartsWith(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ var parameter2 = model.Args[1];
+ return string.Format(" ({0} like concat({1},'%')) ", parameter.MemberName, parameter2.MemberName);
+ }
+
+ public override string EndsWith(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ var parameter2 = model.Args[1];
+ return string.Format(" ({0} like concat('%',{1}))", parameter.MemberName,parameter2.MemberName);
+ }
+
+ public override string DateIsSameDay(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ var parameter2 = model.Args[1];
+ return string.Format(" ( to_char({0},'yyyy-MM-dd')=to_char({1},'yyyy-MM-dd') ) ", parameter.MemberName, parameter2.MemberName); ;
+ }
+
+ public override string HasValue(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ return string.Format("( {0} IS NOT NULL )", parameter.MemberName);
+ }
+
+ public override string DateIsSameByType(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ var parameter2 = model.Args[1];
+ var parameter3 = model.Args[2];
+ DateType dateType =(DateType)parameter3.MemberValue;
+ var format = "yyyy-MM-dd";
+ if (dateType == DateType.Quarter)
+ {
+ return string.Format(" (date_trunc('quarter',{0})=date_trunc('quarter',{1}) ) ", parameter.MemberName, parameter2.MemberName,format);
+ }
+ switch (dateType)
+ {
+ case DateType.Year:
+ format = "yyyy";
+ break;
+ case DateType.Month:
+ format = "yyyy-MM";
+ break;
+ case DateType.Day:
+ break;
+ case DateType.Hour:
+ format = "yyyy-MM-dd HH";
+ break;
+ case DateType.Second:
+ format = "yyyy-MM-dd HH:mm:ss";
+ break;
+ case DateType.Minute:
+ format = "yyyy-MM-dd HH:mm";
+ break;
+ case DateType.Millisecond:
+ format = "yyyy-MM-dd HH:mm.ms";
+ break;
+ default:
+ break;
+ }
+ return string.Format(" ( to_char({0},'{2}')=to_char({1},'{2}') ) ", parameter.MemberName, parameter2.MemberName, format);
+ }
+
+ public override string ToDate(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ return string.Format(" CAST({0} AS timestamp)", parameter.MemberName);
+ }
+ public override string DateAddByType(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ var parameter2 = model.Args[1];
+ var parameter3 = model.Args[2];
+ return string.Format(" ({1} + ({2}||'{0}')::INTERVAL) ", parameter3.MemberValue, parameter.MemberName, parameter2.MemberName);
+ }
+
+ public override string DateAddDay(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ var parameter2 = model.Args[1];
+ return string.Format(" ({0} + ({1}||'day')::INTERVAL) ", parameter.MemberName, parameter2.MemberName);
+ }
+
+ public override string ToInt32(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ return string.Format(" CAST({0} AS INT4)", parameter.MemberName);
+ }
+
+ public override string ToInt64(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ return string.Format(" CAST({0} AS INT8)", parameter.MemberName);
+ }
+
+ public override string ToString(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ return string.Format(" CAST({0} AS VARCHAR)", parameter.MemberName);
+ }
+
+ public override string ToGuid(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ return string.Format(" CAST({0} AS UUID)", parameter.MemberName);
+ }
+
+ public override string ToDouble(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ return string.Format(" CAST({0} AS DECIMAL(18,4))", parameter.MemberName);
+ }
+
+ public override string ToBool(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ return string.Format(" CAST({0} AS boolean)", parameter.MemberName);
+ }
+
+ public override string ToDecimal(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ return string.Format(" CAST({0} AS DECIMAL(18,4))", parameter.MemberName);
+ }
+
+ public override string Length(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ return string.Format(" LENGTH({0})", parameter.MemberName);
+ }
+ public override string MergeString(params string[] strings)
+ {
+ return " concat("+string.Join(",", strings).Replace("+", "") + ") ";
+ }
+ public override string IsNull(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ var parameter1 = model.Args[1];
+ return string.Format("(CASE WHEN {0} IS NULL THEN {1} ELSE {0} END)", parameter.MemberName, parameter1.MemberName);
+ }
+ public override string GetDate()
+ {
+ return "NOW()";
+ }
+ public override string GetRandom()
+ {
+ return "RANDOM()";
+ }
+
+ public override string EqualTrue(string fieldName)
+ {
+ return "( " + fieldName + "=true )";
+ }
+
+ public override string JsonField(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ var parameter1 = model.Args[1];
+ //var parameter2 = model.Args[2];
+ //var parameter3= model.Args[3];
+ var result= GetJson(parameter.MemberName, parameter1.MemberName, model.Args.Count()==2);
+ if (model.Args.Count > 2)
+ {
+ result = GetJson(result, model.Args[2].MemberName, model.Args.Count() == 3);
+ }
+ if (model.Args.Count > 3)
+ {
+ result = GetJson(result, model.Args[3].MemberName, model.Args.Count() == 4);
+ }
+ if (model.Args.Count > 4)
+ {
+ result = GetJson(result, model.Args[4].MemberName, model.Args.Count() == 5);
+ }
+ if (model.Args.Count > 5)
+ {
+ result = GetJson(result, model.Args[5].MemberName, model.Args.Count() == 6);
+ }
+ return result;
+ }
+
+ public override string JsonContainsFieldName(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ var parameter1 = model.Args[1];
+ return $"({parameter.MemberName}::jsonb ?{parameter1.MemberName})";
+ }
+
+ private string GetJson(object memberName1, object memberName2,bool isLast)
+ {
+ if (isLast)
+ {
+ return $"({memberName1}::json->>{memberName2})";
+ }
+ else
+ {
+ return $"({memberName1}->{memberName2})";
+ }
+ }
+
+ public override string JsonArrayLength(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ //var parameter1 = model.Args[1];
+ return $" json_array_length({parameter.MemberName}::json) ";
+ }
+
+ public override string JsonParse(MethodCallExpressionModel model)
+ {
+ var parameter = model.Args[0];
+ //var parameter1 = model.Args[1];
+ return $" ({parameter.MemberName}::json) ";
+ }
+
+ public override string JsonArrayAny(MethodCallExpressionModel model)
+ {
+ if (SqlSugar.UtilMethods.IsNumber(model.Args[1].MemberValue.GetType().Name))
+ {
+ return $" {model.Args[0].MemberName}::jsonb @> '[{model.Args[1].MemberValue.ObjToStringNoTrim().ToSqlFilter()}]'::jsonb";
+ }
+ else
+ {
+ return $" {model.Args[0].MemberName}::jsonb @> '[\"{model.Args[1].MemberValue}\"]'::jsonb";
+ }
+ }
+ public override string JsonListObjectAny(MethodCallExpressionModel model)
+ {
+ if (SqlSugar.UtilMethods.IsNumber(model.Args[2].MemberValue.GetType().Name))
+ {
+ return $" {model.Args[0].MemberName}::jsonb @> '[{{\"{model.Args[1].MemberValue}\":{model.Args[2].MemberValue}}}]'::jsonb";
+ }
+ else
+ {
+ return $" {model.Args[0].MemberName}::jsonb @> '[{{\"{model.Args[1].MemberValue}\":\"{model.Args[2].MemberValue.ObjToStringNoTrim().ToSqlFilter()}\"}}]'::jsonb";
+ }
+ }
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineBuilder.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineBuilder.cs
new file mode 100644
index 000000000..7826dc26e
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineBuilder.cs
@@ -0,0 +1,128 @@
+using System;
+using System.Linq;
+using System.Text.RegularExpressions;
+
+namespace SqlSugar.TDengine
+{
+ public class TDengineBuilder : SqlBuilderProvider
+ {
+ public override string SqlTranslationLeft
+ {
+ get
+ {
+ return "\"";
+ }
+ }
+ public override string SqlTranslationRight
+ {
+ get
+ {
+ return "\"";
+ }
+ }
+ public override string SqlDateNow
+ {
+ get
+ {
+ return "current_date";
+ }
+ }
+ public override string FullSqlDateNow
+ {
+ get
+ {
+ return "select current_date";
+ }
+ }
+
+ public bool isAutoToLower
+ {
+ get
+ {
+ if (this.Context.CurrentConnectionConfig.MoreSettings == null) return true;
+ return this.Context.CurrentConnectionConfig.MoreSettings.PgSqlIsAutoToLower;
+ }
+ }
+ public override string GetTranslationColumnName(string propertyName)
+ {
+ if (propertyName.Contains(".")&& !propertyName.Contains(SqlTranslationLeft))
+ {
+ return string.Join(".", propertyName.Split('.').Select(it => $"{SqlTranslationLeft}{it.ToLower(isAutoToLower)}{SqlTranslationRight}"));
+ }
+
+ if (propertyName.Contains(SqlTranslationLeft)) return propertyName;
+ else
+ return SqlTranslationLeft + propertyName.ToLower(isAutoToLower) + SqlTranslationRight;
+ }
+
+ //public override string GetNoTranslationColumnName(string name)
+ //{
+ // return name.TrimEnd(Convert.ToChar(SqlTranslationRight)).TrimStart(Convert.ToChar(SqlTranslationLeft)).ToLower();
+ //}
+ public override string GetTranslationColumnName(string entityName, string propertyName)
+ {
+ Check.ArgumentNullException(entityName, string.Format(ErrorMessage.ObjNotExist, "Table Name"));
+ Check.ArgumentNullException(propertyName, string.Format(ErrorMessage.ObjNotExist, "Column Name"));
+ var context = this.Context;
+ var mappingInfo = context
+ .MappingColumns
+ .FirstOrDefault(it =>
+ it.EntityName.Equals(entityName, StringComparison.CurrentCultureIgnoreCase) &&
+ it.PropertyName.Equals(propertyName, StringComparison.CurrentCultureIgnoreCase));
+ return (mappingInfo == null ? SqlTranslationLeft + propertyName.ToLower(isAutoToLower) + SqlTranslationRight : SqlTranslationLeft + mappingInfo.DbColumnName.ToLower(isAutoToLower) + SqlTranslationRight);
+ }
+
+ public override string GetTranslationTableName(string name)
+ {
+ Check.ArgumentNullException(name, string.Format(ErrorMessage.ObjNotExist, "Table Name"));
+ var context = this.Context;
+
+ var mappingInfo = context
+ .MappingTables
+ .FirstOrDefault(it => it.EntityName.Equals(name, StringComparison.CurrentCultureIgnoreCase));
+ if (mappingInfo == null && name.Contains(".") && name.Contains("\""))
+ {
+ return name;
+ }
+ name = (mappingInfo == null ? name : mappingInfo.DbTableName);
+ if (name.Contains(".")&& !name.Contains("(")&&!name.Contains("\".\""))
+ {
+ return string.Join(".", name.ToLower(isAutoToLower).Split('.').Select(it => SqlTranslationLeft + it + SqlTranslationRight));
+ }
+ else if (name.Contains("("))
+ {
+ return name;
+ }
+ else if (name.Contains(SqlTranslationLeft) && name.Contains(SqlTranslationRight))
+ {
+ return name;
+ }
+ else
+ {
+ return SqlTranslationLeft + name.ToLower(isAutoToLower).TrimEnd('"').TrimStart('"') + SqlTranslationRight;
+ }
+ }
+ public override string GetUnionFomatSql(string sql)
+ {
+ return " ( " + sql + " ) ";
+ }
+
+ public override Type GetNullType(string tableName, string columnName)
+ {
+ if (tableName != null)
+ tableName = tableName.Trim();
+ var columnInfo=this.Context.DbMaintenance.GetColumnInfosByTableName(tableName).FirstOrDefault(z => z.DbColumnName?.ToLower()==columnName?.ToLower());
+ if (columnInfo != null)
+ {
+ var cTypeName=this.Context.Ado.DbBind.GetCsharpTypeNameByDbTypeName(columnInfo.DataType);
+ var value=SqlSugar.UtilMethods.GetTypeByTypeName(cTypeName);
+ if (value != null)
+ {
+ var key = "GetNullType_" + tableName + columnName;
+ return new ReflectionInoCacheService().GetOrCreate(key, () => value);
+ }
+ }
+ return null;
+ }
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineDeleteBuilder.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineDeleteBuilder.cs
new file mode 100644
index 000000000..b8eed82e4
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineDeleteBuilder.cs
@@ -0,0 +1,7 @@
+namespace SqlSugar.TDengine
+{
+ public class TDengineDeleteBuilder : DeleteBuilder
+ {
+
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineFastBuilder.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineFastBuilder.cs
new file mode 100644
index 000000000..9260b11bd
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineFastBuilder.cs
@@ -0,0 +1,54 @@
+
+using SqlSugar.TDengineAdo;
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace SqlSugar.TDengine
+{
+ public class TDengineFastBuilder : FastBuilder, IFastBuilder
+ {
+
+ private EntityInfo entityInfo;
+
+ public TDengineFastBuilder(EntityInfo entityInfo)
+ {
+ this.entityInfo = entityInfo;
+ }
+
+ public override string UpdateSql { get; set; } = @"UPDATE {1} SET {0} FROM {2} AS TE WHERE {3}
+";
+
+ //public virtual async Task UpdateByTempAsync(string tableName, string tempName, string[] updateColumns, string[] whereColumns)
+ //{
+ // Check.ArgumentNullException(!updateColumns.Any(), "update columns count is 0");
+ // Check.ArgumentNullException(!whereColumns.Any(), "where columns count is 0");
+ // var sets = string.Join(",", updateColumns.Select(it => $"TM.{it}=TE.{it}"));
+ // var wheres = string.Join(",", whereColumns.Select(it => $"TM.{it}=TE.{it}"));
+ // string sql = string.Format(UpdateSql, sets, tableName, tempName, wheres);
+ // return await this.Context.Ado.ExecuteCommandAsync(sql);
+ //}
+ public async Task ExecuteBulkCopyAsync(DataTable dt)
+ {
+ return 0;
+ }
+
+ private void BulkCopy(DataTable dt, string copyString, TDengineConnection conn, List columns)
+ {
+ throw new NotSupportedException();
+ }
+
+
+ public override async Task UpdateByTempAsync(string tableName, string tempName, string[] updateColumns, string[] whereColumns)
+ {
+ throw new NotSupportedException();
+ }
+ public override async Task CreateTempAsync(DataTable dt)
+ {
+ throw new NotSupportedException();
+ }
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineInsertBuilder.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineInsertBuilder.cs
new file mode 100644
index 000000000..f59f3f312
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineInsertBuilder.cs
@@ -0,0 +1,178 @@
+using System;
+using System.Linq;
+using System.Text;
+
+namespace SqlSugar.TDengine
+{
+ public class TDengineInsertBuilder : InsertBuilder
+ {
+ public override string SqlTemplate
+ {
+ get
+ {
+ if (IsReturnIdentity)
+ {
+ return @"INSERT INTO {0}
+ ({1})
+ VALUES
+ ({2}) returning $PrimaryKey";
+ }
+ else
+ {
+ return @"INSERT INTO {0}
+ ({1})
+ VALUES
+ ({2}) ;";
+
+ }
+ }
+ }
+ public override string SqlTemplateBatch => "INSERT INTO {0} ({1})";
+ public override string SqlTemplateBatchUnion => " VALUES ";
+
+ public override string SqlTemplateBatchSelect => " {0} ";
+
+ public override Func ConvertInsertReturnIdFunc { get; set; } = (name, sql) =>
+ {
+ return sql.Trim().TrimEnd(';')+ $"returning {name} ";
+ };
+ public override string ToSqlString()
+ {
+ if (IsNoInsertNull)
+ {
+ DbColumnInfoList = DbColumnInfoList.Where(it => it.Value != null).ToList();
+ }
+ var groupList = DbColumnInfoList.GroupBy(it => it.TableId).ToList();
+ var isSingle = groupList.Count() == 1;
+ string columnsString = string.Join(",", groupList.First().Select(it => Builder.GetTranslationColumnName(it.DbColumnName)));
+ if (isSingle)
+ {
+ string columnParametersString = string.Join(",", this.DbColumnInfoList.Select(it =>base.GetDbColumn(it, Builder.SqlParameterKeyWord + it.DbColumnName)));
+ ActionMinDate();
+ return string.Format(SqlTemplate, GetTableNameString, columnsString, columnParametersString);
+ }
+ else
+ {
+ StringBuilder batchInsetrSql = new StringBuilder();
+ int pageSize = 200;
+ int pageIndex = 1;
+ if (IsNoPage&&IsReturnPkList)
+ {
+ pageSize = groupList.Count;
+ }
+ int totalRecord = groupList.Count;
+ int pageCount = (totalRecord + pageSize - 1) / pageSize;
+ while (pageCount >= pageIndex)
+ {
+ batchInsetrSql.AppendFormat(SqlTemplateBatch, GetTableNameString, columnsString);
+ int i = 0;
+ foreach (var columns in groupList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList())
+ {
+ var isFirst = i == 0;
+ if (isFirst)
+ {
+ batchInsetrSql.Append(SqlTemplateBatchUnion);
+ }
+ batchInsetrSql.Append("\r\n ( " + string.Join(",", columns.Select(it =>
+ {
+ if (it.InsertServerTime || it.InsertSql.HasValue()||it.SqlParameterDbType is Type|| it?.PropertyType?.Name=="DateOnly" || it?.PropertyType?.Name == "TimeOnly")
+ {
+ return GetDbColumn(it, null);
+ }
+ object value = null;
+ if (it.Value is DateTime)
+ {
+ value = ((DateTime)it.Value).ToString("O");
+ }
+ else if (it.Value is DateTimeOffset)
+ {
+ return FormatDateTimeOffset(it.Value);
+ }
+ else if (it.IsArray&&it.Value!=null)
+ {
+ return FormatValue(it.Value,it.PropertyName,i,it);
+ }
+ else
+ {
+ value = it.Value;
+ }
+ if (value == null||value==DBNull.Value)
+ {
+ return string.Format(SqlTemplateBatchSelect, "NULL");
+ }
+ return string.Format(SqlTemplateBatchSelect, "'" + value.ObjToStringNoTrim().ToSqlFilter() + "'");
+ })) + "),");
+ ++i;
+ }
+ pageIndex++;
+ batchInsetrSql.Remove(batchInsetrSql.Length - 1,1).Append("\r\n;\r\n");
+ }
+ return batchInsetrSql.ToString();
+ }
+ }
+
+ public object FormatValue(object value, string name, int i, DbColumnInfo columnInfo)
+ {
+ if (value == null)
+ {
+ return "NULL";
+ }
+ else
+ {
+ var type = value.GetType();
+ if (type == UtilConstants.DateType || columnInfo.IsArray || columnInfo.IsJson)
+ {
+ var parameterName = this.Builder.SqlParameterKeyWord + name + i;
+ var paramter = new SugarParameter(parameterName, value);
+ if (columnInfo.IsJson)
+ {
+ paramter.IsJson = true;
+ }
+ if (columnInfo.IsArray)
+ {
+ paramter.IsArray = true;
+ }
+ this.Parameters.Add(paramter);
+ return parameterName;
+ }
+ else if (type == UtilConstants.ByteArrayType)
+ {
+ string bytesString = "0x" + BitConverter.ToString((byte[])value);
+ return bytesString;
+ }
+ else if (type.IsEnum())
+ {
+ if (this.Context.CurrentConnectionConfig.MoreSettings?.TableEnumIsString == true)
+ {
+ return value.ToSqlValue();
+ }
+ else
+ {
+ return Convert.ToInt64(value);
+ }
+ }
+ else if (type == UtilConstants.DateTimeOffsetType)
+ {
+ return FormatDateTimeOffset(value);
+ }
+ else if (type == UtilConstants.BoolType)
+ {
+ return value.ObjToBool() ? "1" : "0";
+ }
+ else if (type == UtilConstants.StringType || type == UtilConstants.ObjType)
+ {
+ return "'" + value.ToString().ToSqlFilter() + "'";
+ }
+ else
+ {
+ return "'" + value.ToString() + "'";
+ }
+ }
+ }
+ public override string FormatDateTimeOffset(object value)
+ {
+ return "'" + ((DateTimeOffset)value).ToString("o") + "'";
+ }
+
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineQueryBuilder.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineQueryBuilder.cs
new file mode 100644
index 000000000..5e4604b66
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineQueryBuilder.cs
@@ -0,0 +1,121 @@
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+
+namespace SqlSugar.TDengine
+{
+ public partial class TDengineQueryBuilder : QueryBuilder
+ {
+ #region Sql Template
+ public override string PageTempalte
+ {
+ get
+ {
+ /*
+ SELECT * FROM TABLE WHERE CONDITION ORDER BY ID DESC LIMIT 10 offset 0
+ */
+ var template = "SELECT {0} FROM {1} {2} {3} {4} LIMIT {6} offset {5}";
+ return template;
+ }
+ }
+ public override string DefaultOrderByTemplate
+ {
+ get
+ {
+ return "ORDER BY NOW() ";
+ }
+ }
+
+ #endregion
+
+ #region Common Methods
+ public override string GetTableNameString
+ {
+ get
+ {
+ if (this.TableShortName != null&&this.Context.CurrentConnectionConfig?.MoreSettings?.PgSqlIsAutoToLower==false)
+ {
+ this.TableShortName = Builder.GetTranslationColumnName(this.TableShortName);
+ }
+ return base.GetTableNameString;
+ }
+ }
+ public override bool IsComplexModel(string sql)
+ {
+ return Regex.IsMatch(sql, @"AS ""\w+\.\w+""")|| Regex.IsMatch(sql, @"AS ""\w+\.\w+\.\w+""");
+ }
+ public override string ToSqlString()
+ {
+ base.AppendFilter();
+ string oldOrderValue = this.OrderByValue;
+ string result = null;
+ sql = new StringBuilder();
+ sql.AppendFormat(SqlTemplate, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, (Skip != null || Take != null) ? null : GetOrderByString);
+ if (IsCount) { return sql.ToString(); }
+ if (Skip != null && Take == null)
+ {
+ if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
+ result = string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, (Skip != null || Take != null) ? null : GetOrderByString, Skip.ObjToInt(), long.MaxValue);
+ }
+ else if (Skip == null && Take != null)
+ {
+ if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
+ result = string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, 0, Take.ObjToInt());
+ }
+ else if (Skip != null && Take != null)
+ {
+ if (this.OrderByValue == "ORDER BY ") this.OrderByValue += GetSelectValue.Split(',')[0];
+ result = string.Format(PageTempalte, GetSelectValue, GetTableNameString, GetWhereValueString, GetGroupByString + HavingInfos, GetOrderByString, Skip.ObjToInt() > 0 ? Skip.ObjToInt() : 0, Take);
+ }
+ else
+ {
+ result = sql.ToString();
+ }
+ this.OrderByValue = oldOrderValue;
+ result = GetSqlQuerySql(result);
+ if (result.IndexOf("-- No table") > 0)
+ {
+ return "-- No table";
+ }
+ if (TranLock != null)
+ {
+ result = result + TranLock;
+ }
+ return result;
+ }
+
+ #endregion
+
+ #region Get SQL Partial
+ public override string GetSelectValue
+ {
+ get
+ {
+ string result = string.Empty;
+ if (this.SelectValue == null || this.SelectValue is string)
+ {
+ result = GetSelectValueByString();
+ }
+ else
+ {
+ result = GetSelectValueByExpression();
+ }
+ if (this.SelectType == ResolveExpressType.SelectMultiple)
+ {
+ this.SelectCacheKey = this.SelectCacheKey + string.Join("-", this.JoinQueryInfos.Select(it => it.TableName));
+ }
+ if (IsDistinct)
+ {
+ result = "distinct "+result;
+ }
+ if (this.SubToListParameters != null && this.SubToListParameters.Any())
+ {
+ result = SubToListMethod(result);
+ }
+ return result;
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineUpdateBuilder.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineUpdateBuilder.cs
new file mode 100644
index 000000000..a6d2bfbc8
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/SqlBuilder/TDengineUpdateBuilder.cs
@@ -0,0 +1,249 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace SqlSugar.TDengine
+{
+ public class TDengineUpdateBuilder : UpdateBuilder
+ {
+ public override string SqlTemplateBatch
+ {
+ get
+ {
+ return @"UPDATE {1} {2} SET {0} FROM ${{0}} ";
+ }
+ }
+ public override string SqlTemplateJoin
+ {
+ get
+ {
+ return @" (VALUES
+ {0}
+
+ ) AS T ({2}) WHERE {1}
+ ";
+ }
+ }
+
+ public override string SqlTemplateBatchUnion
+ {
+ get
+ {
+ return ",";
+ }
+ }
+
+ public object FormatValue(object value,string name,int i,DbColumnInfo columnInfo)
+ {
+ if (value == null)
+ {
+ return "NULL";
+ }
+ else
+ {
+ var type =UtilMethods.GetUnderType(value.GetType());
+ if (type == UtilConstants.DateType||columnInfo.IsArray||columnInfo.IsJson)
+ {
+ var parameterName = this.Builder.SqlParameterKeyWord + name + i;
+ var paramter = new SugarParameter(parameterName, value);
+ if (columnInfo.IsJson)
+ {
+ paramter.IsJson = true;
+ }
+ if (columnInfo.IsArray)
+ {
+ paramter.IsArray = true;
+ }
+ this.Parameters.Add(paramter);
+ return parameterName;
+ }
+ else if (type == UtilConstants.DateTimeOffsetType)
+ {
+ return FormatDateTimeOffset(value);
+ }
+ else if (type == UtilConstants.ByteArrayType)
+ {
+ string bytesString = "0x" + BitConverter.ToString((byte[])value);
+ return bytesString;
+ }
+ else if (type.IsEnum())
+ {
+ if (this.Context.CurrentConnectionConfig.MoreSettings?.TableEnumIsString == true)
+ {
+ return value.ToSqlValue();
+ }
+ else
+ {
+ return Convert.ToInt64(value);
+ }
+ }
+ else if (type == UtilConstants.BoolType)
+ {
+ return value.ObjToBool() ? "1" : "0";
+ }
+ else if (type == UtilConstants.StringType || type == UtilConstants.ObjType)
+ {
+ return "'" + value.ToString().ToSqlFilter() + "'";
+ }
+ else
+ {
+ return "'" + value.ToString() + "'";
+ }
+ }
+ }
+
+ protected override string TomultipleSqlString(List> groupList)
+ {
+ Check.Exception(PrimaryKeys == null || PrimaryKeys.Count == 0, " Update List need Primary key");
+ int pageSize = 200;
+ int pageIndex = 1;
+ int totalRecord = groupList.Count;
+ int pageCount = (totalRecord + pageSize - 1) / pageSize;
+ StringBuilder batchUpdateSql = new StringBuilder();
+ while (pageCount >= pageIndex)
+ {
+ StringBuilder updateTable = new StringBuilder();
+ string setValues = string.Join(",", groupList.First().Where(it => it.IsPrimarykey == false && (it.IsIdentity == false || (IsOffIdentity && it.IsIdentity))).Select(it =>
+ {
+ if (SetValues.IsValuable())
+ {
+ var setValue = SetValues.Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName));
+ if (setValue != null && setValue.Any())
+ {
+ return setValue.First().Value;
+ }
+ }
+ var result = string.Format("{0}=T.{0}", Builder.GetTranslationColumnName(it.DbColumnName));
+ return result;
+ }));
+ string tempColumnValue = string.Join(",", groupList.First().Select(it =>
+ {
+ if (SetValues.IsValuable())
+ {
+ var setValue = SetValues.Where(sv => sv.Key == Builder.GetTranslationColumnName(it.DbColumnName));
+ if (setValue != null && setValue.Any())
+ {
+ return setValue.First().Value;
+ }
+ }
+ var result = Builder.GetTranslationColumnName(it.DbColumnName);
+ return result;
+ }));
+ batchUpdateSql.AppendFormat(SqlTemplateBatch.ToString(), setValues, GetTableNameStringNoWith, TableWithString);
+ int i = 0;
+ var tableColumnList = this.Context.DbMaintenance.GetColumnInfosByTableName(GetTableNameStringNoWith);
+
+ foreach (var columns in groupList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList())
+ {
+ var isFirst = i == 0;
+ if (!isFirst)
+ {
+ updateTable.Append(SqlTemplateBatchUnion);
+ }
+ updateTable.Append("\r\n (" + string.Join(",", columns.Select(it =>
+ {
+ var columnInfo = tableColumnList.FirstOrDefault(x => x.DbColumnName.Equals(it.DbColumnName, StringComparison.OrdinalIgnoreCase));
+ var dbType = columnInfo?.DataType;
+ if (dbType == null) {
+ var typeName = it.PropertyType.Name.ToLower();
+ if (columnInfo==null&&it.PropertyType.IsEnum)
+ {
+ if (this.Context.CurrentConnectionConfig?.MoreSettings?.TableEnumIsString!=true)
+ {
+ typeName = "int";
+ }
+ }
+ if (typeName == "int32")
+ typeName = "int";
+ if (typeName == "int64")
+ typeName = "long";
+ if (typeName == "int16")
+ typeName = "short";
+ if (typeName == "boolean")
+ typeName = "bool";
+
+ var isAnyType = TDengineDbBind.MappingTypesConst.Where(x => x.Value.ToString().ToLower() == typeName).Any();
+ if (isAnyType)
+ {
+ dbType = TDengineDbBind.MappingTypesConst.Where(x => x.Value.ToString().ToLower() == typeName).FirstOrDefault().Key;
+ }
+ else {
+ dbType = "varchar";
+ }
+ }
+ return string.Format("CAST({0} AS {1})", base.GetDbColumn(it,FormatValue(it.Value,it.DbColumnName,i,it)), dbType);
+
+ })) + ")");
+ ++i;
+ }
+ pageIndex++;
+ updateTable.Append("\r\n");
+ string whereString = null;
+ if (this.WhereValues.HasValue())
+ {
+ foreach (var item in WhereValues)
+ {
+ var isFirst = whereString == null;
+ whereString += (isFirst ? null : " AND ");
+ whereString += item;
+ }
+ }
+ else if (PrimaryKeys.HasValue())
+ {
+ foreach (var item in PrimaryKeys)
+ {
+ var isFirst = whereString == null;
+ whereString += (isFirst ? null : " AND ");
+ whereString += string.Format("{0}.{1}=T.{1}", GetTableNameStringNoWith, Builder.GetTranslationColumnName(item));
+ }
+ }
+ var format = string.Format(SqlTemplateJoin, updateTable, whereString, tempColumnValue);
+ batchUpdateSql.Replace("${0}", format);
+ batchUpdateSql.Append(";");
+ }
+ batchUpdateSql = GetBatchUpdateSql(batchUpdateSql);
+ return batchUpdateSql.ToString();
+ }
+
+ private StringBuilder GetBatchUpdateSql(StringBuilder batchUpdateSql)
+ {
+ if (ReSetValueBySqlExpListType == null && ReSetValueBySqlExpList != null)
+ {
+ var result = batchUpdateSql.ToString();
+ foreach (var item in ReSetValueBySqlExpList)
+ {
+ var dbColumnName = item.Value.DbColumnName;
+ if (item.Value.Type == ReSetValueBySqlExpListModelType.List)
+ {
+ result = result.Replace($"{dbColumnName}=T.{dbColumnName}", $"{dbColumnName}={GetTableNameString}.{dbColumnName}{item.Value.Sql}T.{dbColumnName}");
+ }
+ else
+ {
+ result = result.Replace($"{dbColumnName}=T.{dbColumnName}", $"{dbColumnName}={item.Value.Sql.Replace(dbColumnName, $"{Builder.GetTranslationColumnName(this.TableName)}.{dbColumnName}")}");
+ }
+ batchUpdateSql = new StringBuilder(result);
+ }
+ }
+
+ return batchUpdateSql;
+ }
+ protected override string GetJoinUpdate(string columnsString, ref string whereString)
+ {
+ var formString = $" {Builder.GetTranslationColumnName(this.TableName)} AS {Builder.GetTranslationColumnName(this.ShortName)} ";
+ var joinString = "";
+ foreach (var item in this.JoinInfos)
+ {
+ whereString += " AND "+item.JoinWhere;
+ joinString += $"\r\n FROM {Builder.GetTranslationColumnName(item.TableName)} {Builder.GetTranslationColumnName(item.ShortName)} ";
+ }
+ var tableName = formString + "\r\n ";
+ columnsString = columnsString.Replace(Builder.GetTranslationColumnName(this.ShortName)+".","")+joinString;
+ return string.Format(SqlTemplate, tableName, columnsString, whereString);
+ }
+ public override string FormatDateTimeOffset(object value)
+ {
+ return "'" + ((DateTimeOffset)value).ToString("o") + "'";
+ }
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/TDengineProvider.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/TDengineProvider.cs
new file mode 100644
index 000000000..dc31e69a8
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengine/TDengineProvider.cs
@@ -0,0 +1,104 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.Common;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using SqlSugar.TDengineAdo;
+namespace SqlSugar.TDengine
+{
+ public partial class TDengineProvider : AdoProvider
+ {
+ public TDengineProvider()
+ {
+
+
+ }
+ public override IDbConnection Connection
+ {
+ get
+ {
+ if (base._DbConnection == null)
+ {
+ try
+ {
+ var TDengineConnectionString = base.Context.CurrentConnectionConfig.ConnectionString;
+ base._DbConnection = new TDengineConnection(TDengineConnectionString);
+ }
+ catch (Exception)
+ {
+ throw;
+
+ }
+ }
+ return base._DbConnection;
+ }
+ set
+ {
+ base._DbConnection = value;
+ }
+ }
+
+ public override void BeginTran(string transactionName)
+ {
+
+ }
+ ///
+ /// Only SqlServer
+ ///
+ ///
+ ///
+ public override void BeginTran(IsolationLevel iso, string transactionName)
+ {
+
+ }
+ public override IDataAdapter GetAdapter()
+ {
+ return new SqlSugar.TDengineCore.TDengineDataAdapter();
+ }
+ public override DbCommand GetCommand(string sql, SugarParameter[] parameters)
+ {
+ TDengineCommand sqlCommand = new TDengineCommand(sql, (TDengineConnection)this.Connection);
+ sqlCommand.CommandType = this.CommandType;
+ sqlCommand.CommandTimeout = this.CommandTimeOut;
+ //if (this.Transaction != null)
+ //{
+ // sqlCommand.Transaction = (TDengineTransaction)this.Transaction;
+ //}
+ if (parameters.HasValue())
+ {
+ IDataParameter[] ipars = ToIDbDataParameter(parameters);
+ sqlCommand.Parameters.AddRange((TDengineParameter[])ipars);
+ }
+ CheckConnection();
+ return sqlCommand;
+ }
+ public override void SetCommandToAdapter(IDataAdapter dataAdapter, DbCommand command)
+ {
+ ((TDengineDataAdapter)dataAdapter).SelectCommand = (TDengineCommand)command;
+ }
+ ///
+ /// if mysql return MySqlParameter[] pars
+ /// if sqlerver return SqlParameter[] pars ...
+ ///
+ ///
+ ///
+ public override IDataParameter[] ToIDbDataParameter(params SugarParameter[] parameters)
+ {
+ if (parameters == null || parameters.Length == 0) return null;
+ TDengineParameter[] result = new TDengineParameter[parameters.Length];
+ int i = 0;
+ foreach (var parameter in parameters)
+ {
+ if (parameter.Value == null) parameter.Value = DBNull.Value;
+
+ var sqlParameter = new TDengineParameter(parameter.ParameterName,parameter.Value,parameter.DbType,0);
+ result[0]=sqlParameter;
+ i++;
+ }
+ return result;
+ }
+
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengineDataAdapter.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengineDataAdapter.cs
new file mode 100644
index 000000000..99b1a645f
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/TDengineDataAdapter.cs
@@ -0,0 +1,155 @@
+using SqlSugar.TDengineAdo;
+using System;
+using System.Data.Common;
+using System.Data;
+
+namespace SqlSugar.TDengineCore
+{
+ ///
+ /// 数据填充器
+ ///
+ public class TDengineDataAdapter : IDataAdapter
+ {
+ private TDengineCommand command;
+ private string sql;
+ private TDengineConnection _TDengineConnection;
+
+ ///
+ /// SqlDataAdapter
+ ///
+ ///
+ public TDengineDataAdapter(TDengineCommand command)
+ {
+ this.command = command;
+ }
+
+ public TDengineDataAdapter()
+ {
+
+ }
+
+ ///
+ /// SqlDataAdapter
+ ///
+ ///
+ ///
+ public TDengineDataAdapter(string sql, TDengineConnection _TDengineConnection)
+ {
+ this.sql = sql;
+ this._TDengineConnection = _TDengineConnection;
+ }
+
+ ///
+ /// SelectCommand
+ ///
+ public TDengineCommand SelectCommand
+ {
+ get
+ {
+ if (this.command == null)
+ {
+ this.command = new TDengineCommand(this.sql, this._TDengineConnection);
+ }
+ return this.command;
+ }
+ set
+ {
+ this.command = value;
+ }
+ }
+
+ public MissingMappingAction MissingMappingAction { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
+ public MissingSchemaAction MissingSchemaAction { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
+
+ public ITableMappingCollection TableMappings => throw new NotImplementedException();
+
+ ///
+ /// Fill
+ ///
+ ///
+ public void Fill(DataTable dt)
+ {
+ if (dt == null)
+ {
+ dt = new DataTable();
+ }
+ var columns = dt.Columns;
+ var rows = dt.Rows;
+ using (DbDataReader dr = command.ExecuteReader())
+ {
+ for (int i = 0; i < dr.FieldCount; i++)
+ {
+ string name = dr.GetName(i).Trim();
+ if (!columns.Contains(name))
+ columns.Add(new DataColumn(name, dr.GetFieldType(i)));
+ else
+ {
+ columns.Add(new DataColumn(name + i, dr.GetFieldType(i)));
+ }
+ }
+
+ while (dr.Read())
+ {
+ DataRow daRow = dt.NewRow();
+ for (int i = 0; i < columns.Count; i++)
+ {
+ daRow[columns[i].ColumnName] = dr.GetValue(i);
+ }
+ dt.Rows.Add(daRow);
+ }
+ }
+
+ dt.AcceptChanges();
+ }
+
+ ///
+ /// Fill
+ ///
+ ///
+ public void Fill(DataSet ds)
+ {
+ if (ds == null)
+ {
+ ds = new DataSet();
+ }
+ using (DbDataReader dr = command.ExecuteReader())
+ {
+ do
+ {
+ var dt = new DataTable();
+ var columns = dt.Columns;
+ var rows = dt.Rows;
+ for (int i = 0; i < dr.FieldCount; i++)
+ {
+ string name = dr.GetName(i).Trim();
+ if (!columns.Contains(name))
+ columns.Add(new DataColumn(name, dr.GetFieldType(i)));
+ else
+ {
+ columns.Add(new DataColumn(name + i, dr.GetFieldType(i)));
+ }
+
+ }
+
+ while (dr.Read())
+ {
+ DataRow daRow = dt.NewRow();
+ for (int i = 0; i < columns.Count; i++)
+ {
+ daRow[columns[i].ColumnName] = dr.GetValue(i);
+ }
+ dt.Rows.Add(daRow);
+ }
+ dt.AcceptChanges();
+ ds.Tables.Add(dt);
+ } while (dr.NextResult());
+ }
+ }
+
+ public DataTable[] FillSchema(DataSet dataSet, SchemaType schemaType)
+ {
+ throw new NotImplementedException();
+ }
+
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/ErrorMessage.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/ErrorMessage.cs
new file mode 100644
index 000000000..e3aed66b8
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/ErrorMessage.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+namespace SqlSugar.TDengine
+{
+ internal static partial class ErrorMessage
+ {
+ internal static LanguageType SugarLanguageType { get; set; } = LanguageType.Default;
+ internal static string ObjNotExist
+ {
+ get
+ {
+ return GetThrowMessage("{0} does not exist.",
+ "{0}不存在。");
+ }
+ }
+ internal static string EntityMappingError
+ {
+ get
+ {
+ return GetThrowMessage("Entity mapping error.{0}",
+ "实体与表映射出错。{0}");
+ }
+ }
+
+ public static string NotSupportedDictionary
+ {
+ get
+ {
+ return GetThrowMessage("This type of Dictionary is not supported for the time being. You can try Dictionary, or contact the author!!",
+ "暂时不支持该类型的Dictionary 你可以试试 Dictionary或者联系作者!!");
+ }
+ }
+
+ public static string NotSupportedArray
+ {
+ get
+ {
+ return GetThrowMessage("This type of Array is not supported for the time being. You can try object[] or contact the author!!",
+ "暂时不支持该类型的Array 你可以试试 object[] 或者联系作者!!");
+ }
+ }
+
+ internal static string GetThrowMessage(string enMessage, string cnMessage, params string[] args)
+ {
+ if (SugarLanguageType == LanguageType.Default)
+ {
+ List formatArgs = new List() { enMessage, cnMessage };
+ formatArgs.AddRange(args);
+ return string.Format(@"中文提示 : {1}
+English Message : {0}", formatArgs.ToArray());
+ }
+ else if (SugarLanguageType == LanguageType.English)
+ {
+ return enMessage;
+ }
+ else
+ {
+ return cnMessage;
+ }
+ }
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/FileHelper.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/FileHelper.cs
new file mode 100644
index 000000000..cfc61711f
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/FileHelper.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+
+namespace SqlSugar.TDengine
+{
+ internal class FileHelper
+ {
+ public static void CreateFile(string filePath, string text, Encoding encoding)
+ {
+ try
+ {
+ if (IsExistFile(filePath))
+ {
+ DeleteFile(filePath);
+ }
+ if (!IsExistFile(filePath))
+ {
+ string directoryPath = GetDirectoryFromFilePath(filePath);
+ CreateDirectory(directoryPath);
+
+ //Create File
+ FileInfo file = new FileInfo(filePath);
+ using (FileStream stream = file.Create())
+ {
+ using (StreamWriter writer = new StreamWriter(stream, encoding))
+ {
+ writer.Write(text);
+ writer.Flush();
+ }
+ }
+ }
+ }
+ catch(Exception ex)
+ {
+ throw ex;
+ }
+ }
+ public static bool IsExistDirectory(string directoryPath)
+ {
+ return Directory.Exists(directoryPath);
+ }
+ public static void CreateDirectory(string directoryPath)
+ {
+ if (!IsExistDirectory(directoryPath))
+ {
+ Directory.CreateDirectory(directoryPath);
+ }
+ }
+ public static void DeleteFile(string filePath)
+ {
+ if (IsExistFile(filePath))
+ {
+ File.Delete(filePath);
+ }
+ }
+ public static string GetDirectoryFromFilePath(string filePath)
+ {
+ FileInfo file = new FileInfo(filePath);
+ DirectoryInfo directory = file.Directory;
+ return directory.FullName;
+ }
+ public static bool IsExistFile(string filePath)
+ {
+ return File.Exists(filePath);
+ }
+ }
+}
diff --git a/Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/UtilConstants.cs b/Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/UtilConstants.cs
new file mode 100644
index 000000000..b36385a27
--- /dev/null
+++ b/Src/Asp.NetCore2/SqlSugar.TDengineCore/Tools/UtilConstants.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Dynamic;
+using System.Linq;
+using System.Text;
+namespace SqlSugar.TDengine
+{
+ internal static class UtilConstants
+ {
+ public const string Dot = ".";
+ public const char DotChar = '.';
+ internal const string Space = " ";
+ internal const char SpaceChar =' ';
+ internal const string AssemblyName = "SqlSugar";
+ internal const string ReplaceKey = "{662E689B-17A1-4D06-9D27-F29EAB8BC3D6}";
+ internal const string ReplaceCommaKey = "{112A689B-17A1-4A06-9D27-A39EAB8BC3D5}";
+
+ internal static Type IntType = typeof(int);
+ internal static Type LongType = typeof(long);
+ internal static Type GuidType = typeof(Guid);
+ internal static Type BoolType = typeof(bool);
+ internal static Type BoolTypeNull = typeof(bool?);
+ internal static Type ByteType = typeof(Byte);
+ internal static Type ObjType = typeof(object);
+ internal static Type DobType = typeof(double);
+ internal static Type FloatType = typeof(float);
+ internal static Type ShortType = typeof(short);
+ internal static Type DecType = typeof(decimal);
+ internal static Type StringType = typeof(string);
+ internal static Type DateType = typeof(DateTime);
+ internal static Type DateTimeOffsetType = typeof(DateTimeOffset);
+ internal static Type TimeSpanType = typeof(TimeSpan);
+ internal static Type ByteArrayType = typeof(byte[]);
+ internal static Type ModelType= typeof(ModelContext);
+ internal static Type DynamicType = typeof(ExpandoObject);
+ internal static Type Dicii = typeof(KeyValuePair);
+ internal static Type DicIS = typeof(KeyValuePair);
+ internal static Type DicSi = typeof(KeyValuePair);
+ internal static Type DicSS = typeof(KeyValuePair);
+ internal static Type DicOO = typeof(KeyValuePair