diff --git a/Directory.Build.props b/Directory.Build.props index d7d239a5..17d059ba 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index 7463474e..fb6d1bae 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.681 + 3.2.682 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index b0ffb1cd..ac3ade93 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index a120a60b..f53d008a 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.681 + 3.2.682 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index 54fcf184..bee270ac 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 5473119d..4e172c6e 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.681 + 3.2.682 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 912f3382..ed84e779 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 6ddc1152..dbd72ed1 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 203b8371..dd043acf 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/FreeSql.Tests/FreeSql.Tests/g.cs b/FreeSql.Tests/FreeSql.Tests/g.cs index 301675c4..2bd1833b 100644 --- a/FreeSql.Tests/FreeSql.Tests/g.cs +++ b/FreeSql.Tests/FreeSql.Tests/g.cs @@ -158,11 +158,11 @@ public class g public static IFreeSql shentong => shentongLazy.Value; static Lazy kingbaseESLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() - //.UseConnectionString(FreeSql.DataType.KingbaseES, "Server=127.0.0.1;Port=54321;UID=USER2;PWD=123456789;database=TDB2") - .UseConnectionFactory(FreeSql.DataType.KingbaseES, () => new Kdbndp.KdbndpConnection("Server=127.0.0.1;Port=54321;UID=USER2;PWD=123456789;database=TDB2")) - //.UseAutoSyncStructure(true) + .UseConnectionString(FreeSql.DataType.KingbaseES, "Server=121.36.59.173;Port=54321;UID=system;PWD=abc.123;database=test;max pool size=4") + //.UseConnectionFactory(FreeSql.DataType.KingbaseES, () => new Kdbndp.KdbndpConnection("Server=127.0.0.1;Port=54321;UID=USER2;PWD=123456789;database=TDB2")) + .UseAutoSyncStructure(true) .UseLazyLoading(true) - .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) + .UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) .UseNoneCommandParameter(true) .UseMonitorCommand( diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 838497ff..32342309 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index 079c82df..07cf3035 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index 568c3273..2d436150 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index dfda469f..4f48afcc 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index de739b6d..a1423a07 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 56b1eb48..3222e85d 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index cb9ca34e..467de14c 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -4,7 +4,7 @@ netstandard2.0;net461 true FreeSql;ncc;YeXiangQin - FreeSql 数据库实现,基于 人大金仓数据库 V008R003 Ado.Net (Kdbndp) + FreeSql 数据库实现,基于 人大金仓数据库 V008R003/V008R006 Ado.Net (Kdbndp) https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql git @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESCodeFirst.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESCodeFirst.cs index 26c2b9c4..c4970060 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESCodeFirst.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESCodeFirst.cs @@ -70,8 +70,39 @@ namespace FreeSql.KingbaseES return null; } + public bool? _isSysV8R3 = null; + object _isSysV8R3Lock = new object(); + public void InitIsSysV8R3() + { + if (_isSysV8R3 == null) + lock (_isSysV8R3Lock) + if (_isSysV8R3 == null) + { + try + { + _orm.Ado.ExecuteNonQuery(" select 1"); + } + catch + { + return; + } + try + { + _orm.Ado.ExecuteNonQuery(" select 1 from sys_tables limit 1"); + _isSysV8R3 = true; + } + catch //42P01: 关系 "sys_tables" 不存在 + { + _isSysV8R3 = false; + } + } + } + protected override string GetComparisonDDLStatements(params TypeAndName[] objects) { + InitIsSysV8R3(); + var pg_ = _isSysV8R3 == true ? "sys_" : "pg_"; + var public_ = _isSysV8R3 == true ? "PUBLIC" : "public"; var sb = new StringBuilder(); var seqcols = new List>(); //序列 @@ -82,14 +113,14 @@ namespace FreeSql.KingbaseES if (tb == null) throw new Exception(CoreStrings.S_Type_IsNot_Migrable(obj.entityType.FullName)); if (tb.Columns.Any() == false) throw new Exception(CoreStrings.S_Type_IsNot_Migrable_0Attributes(obj.entityType.FullName)); var tbname = _commonUtils.SplitTableName(tb.DbName); - if (tbname?.Length == 1) tbname = new[] { "PUBLIC", tbname[0] }; + if (tbname?.Length == 1) tbname = new[] { public_, tbname[0] }; var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //旧表名 - if (tboldname?.Length == 1) tboldname = new[] { "PUBLIC", tboldname[0] }; + if (tboldname?.Length == 1) tboldname = new[] { public_, tboldname[0] }; if (string.IsNullOrEmpty(obj.tableName) == false) { var tbtmpname = _commonUtils.SplitTableName(obj.tableName); - if (tbtmpname?.Length == 1) tbtmpname = new[] { "PUBLIC", tbtmpname[0] }; + if (tbtmpname?.Length == 1) tbtmpname = new[] { public_, tbtmpname[0] }; if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) { tbname = tbtmpname; @@ -98,16 +129,16 @@ namespace FreeSql.KingbaseES } //codefirst 不支持表名、模式名、数据库名中带 . - if (string.Compare(tbname[0], "PUBLIC", true) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from sys_namespace where nspname={0}", tbname[0])) == null) //创建模式 + if (string.Compare(tbname[0], public_, true) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql($" select 1 from {pg_}namespace where nspname={{0}}", tbname[0])) == null) //创建模式 sb.Append("CREATE SCHEMA IF NOT EXISTS ").Append(tbname[0]).Append(";\r\n"); var sbalter = new StringBuilder(); var istmpatler = false; //创建临时表,导入数据,删除旧表,修改 - if (_orm.Ado.ExecuteScalar(CommandType.Text, string.Format(" select 1 from sys_tables a inner join sys_namespace b on b.nspname = a.schemaname where b.nspname || '.' || a.tablename = '{0}.{1}'", tbname)) == null) + if (_orm.Ado.ExecuteScalar(CommandType.Text, string.Format($" select 1 from {pg_}tables a inner join {pg_}namespace b on b.nspname = a.schemaname where b.nspname || '.' || a.tablename = '{{0}}.{{1}}'", tbname)) == null) { //表不存在 if (tboldname != null) { - if (_orm.Ado.ExecuteScalar(CommandType.Text, string.Format(" select 1 from sys_tables a inner join sys_namespace b on b.nspname = a.schemaname where b.nspname || '.' || a.tablename = '{0}.{1}'", tboldname)) == null) + if (_orm.Ado.ExecuteScalar(CommandType.Text, string.Format($" select 1 from {pg_}tables a inner join {pg_}namespace b on b.nspname = a.schemaname where b.nspname || '.' || a.tablename = '{{0}}.{{1}}'", tboldname)) == null) //旧表不存在 tboldname = null; } @@ -167,7 +198,7 @@ namespace FreeSql.KingbaseES tboldname = null; //如果新表已经存在,不走改表名逻辑 //对比字段,只可以修改类型、增加字段、有限的修改字段名;保证安全不删除字段 - var sql = _commonUtils.FormatSql(@" + var sql = _commonUtils.FormatSql($@" select a.attname, t.typname, @@ -175,18 +206,18 @@ case when a.atttypmod > 0 and a.atttypmod < 32767 then a.atttypmod - 4 else a.at case when t.typelem > 0 and t.typinput::varchar = 'ARRAY_IN' then t2.typname else t.typname end, case when a.attnotnull then '0' else '1' end as is_nullable, --e.adsrc, -(select sys_get_expr(adbin, adrelid) from sys_attrdef where adrelid = e.adrelid limit 1) is_identity, +(select {pg_}get_expr(adbin, adrelid) from {pg_}attrdef where adrelid = e.adrelid limit 1) is_identity, a.attndims, d.description as comment -from sys_class c -inner join sys_attribute a on a.attnum > 0 and a.attrelid = c.oid -inner join sys_type t on t.oid = a.atttypid -left join sys_type t2 on t2.oid = t.typelem -left join sys_description d on d.objoid = a.attrelid and d.objsubid = a.attnum -left join sys_attrdef e on e.adrelid = a.attrelid and e.adnum = a.attnum -inner join sys_namespace ns on ns.oid = c.relnamespace -inner join sys_namespace ns2 on ns2.oid = t.typnamespace -where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname); +from {pg_}class c +inner join {pg_}attribute a on a.attnum > 0 and a.attrelid = c.oid +inner join {pg_}type t on t.oid = a.atttypid +left join {pg_}type t2 on t2.oid = t.typelem +left join {pg_}description d on d.objoid = a.attrelid and d.objsubid = a.attnum +left join {pg_}attrdef e on e.adrelid = a.attrelid and e.adnum = a.attnum +inner join {pg_}namespace ns on ns.oid = c.relnamespace +inner join {pg_}namespace ns2 on ns2.oid = t.typnamespace +where ns.nspname = {{0}} and c.relname = {{1}}", tboldname ?? tbname); var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); var tbstruct = ds.ToDictionary(a => string.Concat(a[0]), a => { @@ -265,18 +296,18 @@ where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname); if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true)); if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment)).Append(";\r\n"); } - var dsuksql = _commonUtils.FormatSql(@" + var dsuksql = _commonUtils.FormatSql($@" select c.attname, b.relname, -case when sys_index_column_has_property(b.oid, c.attnum, 'desc') = 't' then 1 else 0 end IsDesc, +case when {pg_}index_column_has_property(b.oid, c.attnum, 'desc') = 't' then 1 else 0 end IsDesc, case when indisunique = 't' then 1 else 0 end IsUnique -from sys_index a -inner join sys_class b on b.oid = a.indexrelid -inner join sys_attribute c on c.attnum > 0 and c.attrelid = b.oid -inner join sys_namespace ns on ns.oid = b.relnamespace -inner join sys_class d on d.oid = a.indrelid -where ns.nspname in ({0}) and d.relname in ({1}) and a.indisprimary = 'f'", tboldname ?? tbname); +from {pg_}index a +inner join {pg_}class b on b.oid = a.indexrelid +inner join {pg_}attribute c on c.attnum > 0 and c.attrelid = b.oid +inner join {pg_}namespace ns on ns.oid = b.relnamespace +inner join {pg_}class d on d.oid = a.indrelid +where ns.nspname in ({{0}}) and d.relname in ({{1}}) and a.indisprimary = 'f'", tboldname ?? tbname); var dsuk = _orm.Ado.ExecuteArray(CommandType.Text, dsuksql).Select(a => new[] { string.Concat(a[0]), string.Concat(a[1]), string.Concat(a[2]), string.Concat(a[3]) }); foreach (var uk in tb.Indexes) { @@ -301,23 +332,23 @@ where ns.nspname in ({0}) and d.relname in ({1}) and a.indisprimary = 'f'", tbol } if (istmpatler == false) { - var dbcomment = string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(@" select + var dbcomment = string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql($@" select d.description -from sys_class a -inner join sys_namespace b on b.oid = a.relnamespace -left join sys_description d on d.objoid = a.oid and objsubid = 0 -where b.nspname not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') and a.relkind in ('r') and b.nspname = {0} and a.relname = {1} -and b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS')", tbname[0], tbname[1]))); +from {pg_}class a +inner join {pg_}namespace b on b.oid = a.relnamespace +left join {pg_}description d on d.objoid = a.oid and objsubid = 0 +where upper(b.nspname) not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') and a.relkind in ('r') and b.nspname = {{0}} and a.relname = {{1}} +and upper(b.nspname || '.' || a.relname) not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS')", tbname[0], tbname[1]))); if (dbcomment != (tb.Comment ?? "")) sbalter.Append("COMMENT ON TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tb.Comment)).Append(";\r\n"); sb.Append(sbalter); continue; } - var oldpk = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(@" select sys_constraint.conname as pk_name from sys_constraint -inner join sys_class on sys_constraint.conrelid = sys_class.oid -inner join sys_namespace on sys_namespace.oid = sys_class.relnamespace -where sys_namespace.nspname={0} and sys_class.relname={1} and sys_constraint.contype='p' + var oldpk = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql($@" select {pg_}constraint.conname as pk_name from {pg_}constraint +inner join {pg_}class on {pg_}constraint.conrelid = {pg_}class.oid +inner join {pg_}namespace on {pg_}namespace.oid = {pg_}class.relnamespace +where {pg_}namespace.nspname={{0}} and {pg_}class.relname={{1}} and {pg_}constraint.contype='p' ", tbname))?.ToString(); if (string.IsNullOrEmpty(oldpk) == false) sb.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(oldpk).Append(";\r\n"); diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESDbFirst.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESDbFirst.cs index a0ea6f47..141b9082 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESDbFirst.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESDbFirst.cs @@ -102,9 +102,17 @@ namespace FreeSql.KingbaseES public string GetCsTypeValue(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbType, out var trydc) ? trydc.csTypeValue : null; public string GetDataReaderMethod(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbType, out var trydc) ? trydc.dataReaderMethod : null; + string getpg_() + { + var codefirstProvider = _orm.CodeFirst as KingbaseESCodeFirst; + codefirstProvider.InitIsSysV8R3(); + return codefirstProvider._isSysV8R3 == true ? "sys_" : "pg_"; + } + public List GetDatabases() { - var sql = @" select datname from sys_database where datname not in ('TEMPLATE1', 'TEMPLATE0', 'TEMPLATE2')"; + var pg_ = getpg_(); + var sql = $@" select datname from {pg_}database where datname not in ('TEMPLATE1', 'TEMPLATE0', 'TEMPLATE2')"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } @@ -112,10 +120,11 @@ namespace FreeSql.KingbaseES public bool ExistsTable(string name, bool ignoreCase) { if (string.IsNullOrEmpty(name)) return false; + var pg_ = getpg_(); var tbname = _commonUtils.SplitTableName(name); if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] }; if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); - var sql = $" select 1 from sys_tables a inner join sys_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}"; + var sql = $" select 1 from {pg_}tables a inner join {pg_}namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}"; return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } @@ -124,6 +133,7 @@ namespace FreeSql.KingbaseES public List GetTables(string[] database, string tablename, bool ignoreCase) { + var pg_ = getpg_(); var olddatabase = ""; using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) { @@ -155,12 +165,12 @@ a.schemaname, a.tablename , d.description, 'TABLE' -from sys_tables a -inner join sys_namespace b on b.nspname = a.schemaname -inner join sys_class c on c.relnamespace = b.oid and c.relname = a.tablename -left join sys_description d on d.objoid = c.oid and objsubid = 0 -where a.schemaname not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') -and b.nspname || '.' || a.tablename not in ('PUBLIC.SPATIAL_REF_SYS') +from {pg_}tables a +inner join {pg_}namespace b on b.nspname = a.schemaname +inner join {pg_}class c on c.relnamespace = b.oid and c.relname = a.tablename +left join {pg_}description d on d.objoid = c.oid and objsubid = 0 +where upper(a.schemaname) not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') +and upper(b.nspname || '.' || a.tablename) not in ('PUBLIC.SPATIAL_REF_SYS') union all @@ -170,11 +180,11 @@ b.nspname, a.relname, d.description, 'VIEW' -from sys_class a -inner join sys_namespace b on b.oid = a.relnamespace -left join sys_description d on d.objoid = a.oid and objsubid = 0 -where b.nspname not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') and a.relkind in ('m','v') -and b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS') +from {pg_}class a +inner join {pg_}namespace b on b.oid = a.relnamespace +left join {pg_}description d on d.objoid = a.oid and objsubid = 0 +where upper(b.nspname) not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') and a.relkind in ('m','v') +and upper(b.nspname || '.' || a.relname) not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS') {(tbname == null ? "" : $") ft_dbf where {(ignoreCase ? "lower(schemaname)" : "schemaname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(tablename)" : "tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}")}"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -240,20 +250,20 @@ case when a.atttypmod > 0 and a.atttypmod < 32767 then a.atttypmod - 4 else a.at case when t.typelem = 0 then t.typname else t2.typname end, case when a.attnotnull then 0 else 1 end as is_nullable, --e.adsrc as is_identity, pg12以下 -(select sys_get_expr(adbin, adrelid) from sys_attrdef where adrelid = e.adrelid and adnum = e.adnum limit 1) is_identity, +(select {pg_}get_expr(adbin, adrelid) from {pg_}attrdef where adrelid = e.adrelid and adnum = e.adnum limit 1) is_identity, d.description as comment, a.attndims, case when t.typelem = 0 then t.typtype else t2.typtype end, ns2.nspname, a.attnum -from sys_class c -inner join sys_attribute a on a.attnum > 0 and a.attrelid = c.oid -inner join sys_type t on t.oid = a.atttypid -left join sys_type t2 on t2.oid = t.typelem -left join sys_description d on d.objoid = a.attrelid and d.objsubid = a.attnum -left join sys_attrdef e on e.adrelid = a.attrelid and e.adnum = a.attnum -inner join sys_namespace ns on ns.oid = c.relnamespace -inner join sys_namespace ns2 on ns2.oid = t.typnamespace +from {pg_}class c +inner join {pg_}attribute a on a.attnum > 0 and a.attrelid = c.oid +inner join {pg_}type t on t.oid = a.atttypid +left join {pg_}type t2 on t2.oid = t.typelem +left join {pg_}description d on d.objoid = a.attrelid and d.objsubid = a.attnum +left join {pg_}attrdef e on e.adrelid = a.attrelid and e.adnum = a.attnum +inner join {pg_}namespace ns on ns.oid = c.relnamespace +inner join {pg_}namespace ns2 on ns2.oid = t.typnamespace where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || c.relname")}"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -321,14 +331,14 @@ b.relname as index_id, case when a.indisunique then 1 else 0 end IsUnique, case when a.indisprimary then 1 else 0 end IsPrimary, case when a.indisclustered then 0 else 1 end IsClustered, -case when sys_index_column_has_property(b.oid, c.attnum, 'desc') = 't' then 1 else 0 end IsDesc, +case when {pg_}index_column_has_property(b.oid, c.attnum, 'desc') = 't' then 1 else 0 end IsDesc, a.indkey::text, c.attnum -from sys_index a -inner join sys_class b on b.oid = a.indexrelid -inner join sys_attribute c on c.attnum > 0 and c.attrelid = b.oid -inner join sys_namespace ns on ns.oid = b.relnamespace -inner join sys_class d on d.oid = a.indrelid +from {pg_}index a +inner join {pg_}class b on b.oid = a.indexrelid +inner join {pg_}attribute c on c.attnum > 0 and c.attrelid = b.oid +inner join {pg_}namespace ns on ns.oid = b.relnamespace +inner join {pg_}class d on d.oid = a.indrelid where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")} "; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); @@ -395,18 +405,18 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname") sql = $@" select ns.nspname || '.' || b.relname as table_id, -array(select attname from sys_attribute where attrelid = a.conrelid and attnum = any(a.conkey)) as column_name, +array(select attname from {pg_}attribute where attrelid = a.conrelid and attnum = any(a.conkey)) as column_name, a.conname as FKId, ns2.nspname || '.' || c.relname as ref_table_id, 1 as IsForeignKey, -array(select attname from sys_attribute where attrelid = a.confrelid and attnum = any(a.confkey)) as ref_column, +array(select attname from {pg_}attribute where attrelid = a.confrelid and attnum = any(a.confkey)) as ref_column, null ref_sln, null ref_table -from sys_constraint a -inner join sys_class b on b.oid = a.conrelid -inner join sys_class c on c.oid = a.confrelid -inner join sys_namespace ns on ns.oid = b.relnamespace -inner join sys_namespace ns2 on ns2.oid = c.relnamespace +from {pg_}constraint a +inner join {pg_}class b on b.oid = a.conrelid +inner join {pg_}class c on c.oid = a.confrelid +inner join {pg_}namespace ns on ns.oid = b.relnamespace +inner join {pg_}namespace ns2 on ns2.oid = c.relnamespace where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")} "; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); @@ -499,15 +509,16 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname") } public List GetEnumsByDatabase(params string[] database) { + var pg_ = getpg_(); if (database == null || database.Length == 0) return new List(); - var drs = _orm.Ado.Query(CommandType.Text, _commonUtils.FormatSql(@" + var drs = _orm.Ado.Query(CommandType.Text, _commonUtils.FormatSql($@" select ns.nspname || '.' || a.typname AS name, b.enumlabel AS label -from sys_type a -inner join sys_enum b on b.enumtypid = a.oid -inner join sys_namespace ns on ns.oid = a.typnamespace -where a.typtype = 'e' and ns.nspname in (SELECT schema_name FROM information_schema.schemata where catalog_name in {0})", database)); +from {pg_}type a +inner join {pg_}enum b on b.enumtypid = a.oid +inner join {pg_}namespace ns on ns.oid = a.typnamespace +where a.typtype = 'e' and ns.nspname in (SELECT schema_name FROM information_schema.schemata where catalog_name in {{0}})", database)); var ret = new Dictionary>(); foreach (var dr in drs) { diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 255d4554..dc8f7f28 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index da20db90..01643c90 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 2e43479a..8a45de08 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index 9bc1bcf6..c4295a1f 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESCodeFirst.cs index 68ef79f7..954faae5 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESCodeFirst.cs @@ -74,8 +74,39 @@ namespace FreeSql.Odbc.KingbaseES return null; } + public bool? _isSysV8R3 = null; + object _isSysV8R3Lock = new object(); + public void InitIsSysV8R3() + { + if (_isSysV8R3 == null) + lock (_isSysV8R3Lock) + if (_isSysV8R3 == null) + { + try + { + _orm.Ado.ExecuteNonQuery(" select 1"); + } + catch + { + return; + } + try + { + _orm.Ado.ExecuteNonQuery(" select 1 from sys_tables limit 1"); + _isSysV8R3 = true; + } + catch //42P01: 关系 "sys_tables" 不存在 + { + _isSysV8R3 = false; + } + } + } + protected override string GetComparisonDDLStatements(params TypeAndName[] objects) { + InitIsSysV8R3(); + var pg_ = _isSysV8R3 == true ? "sys_" : "pg_"; + var public_ = _isSysV8R3 == true ? "PUBLIC" : "public"; var sb = new StringBuilder(); var seqcols = new List>(); //序列 @@ -86,14 +117,14 @@ namespace FreeSql.Odbc.KingbaseES if (tb == null) throw new Exception(CoreStrings.S_Type_IsNot_Migrable(obj.entityType.FullName)); if (tb.Columns.Any() == false) throw new Exception(CoreStrings.S_Type_IsNot_Migrable_0Attributes(obj.entityType.FullName)); var tbname = _commonUtils.SplitTableName(tb.DbName); - if (tbname?.Length == 1) tbname = new[] { "PUBLIC", tbname[0] }; + if (tbname?.Length == 1) tbname = new[] { public_, tbname[0] }; var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //旧表名 - if (tboldname?.Length == 1) tboldname = new[] { "PUBLIC", tboldname[0] }; + if (tboldname?.Length == 1) tboldname = new[] { public_, tboldname[0] }; if (string.IsNullOrEmpty(obj.tableName) == false) { var tbtmpname = _commonUtils.SplitTableName(obj.tableName); - if (tbtmpname?.Length == 1) tbtmpname = new[] { "PUBLIC", tbtmpname[0] }; + if (tbtmpname?.Length == 1) tbtmpname = new[] { public_, tbtmpname[0] }; if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1]) { tbname = tbtmpname; @@ -102,16 +133,16 @@ namespace FreeSql.Odbc.KingbaseES } //codefirst 不支持表名、模式名、数据库名中带 . - if (string.Compare(tbname[0], "PUBLIC", true) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from sys_namespace where nspname={0}", tbname[0])) == null) //创建模式 + if (string.Compare(tbname[0], public_, true) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql($" select 1 from {pg_}namespace where nspname={{0}}", tbname[0])) == null) //创建模式 sb.Append("CREATE SCHEMA IF NOT EXISTS ").Append(tbname[0]).Append(";\r\n"); var sbalter = new StringBuilder(); var istmpatler = false; //创建临时表,导入数据,删除旧表,修改 - if (_orm.Ado.ExecuteScalar(CommandType.Text, string.Format(" select 1 from sys_tables a inner join sys_namespace b on b.nspname = a.schemaname where b.nspname || '.' || a.tablename = '{0}.{1}'", tbname)) == null) + if (_orm.Ado.ExecuteScalar(CommandType.Text, string.Format($" select 1 from {pg_}tables a inner join {pg_}namespace b on b.nspname = a.schemaname where b.nspname || '.' || a.tablename = '{{0}}.{{1}}'", tbname)) == null) { //表不存在 if (tboldname != null) { - if (_orm.Ado.ExecuteScalar(CommandType.Text, string.Format(" select 1 from sys_tables a inner join sys_namespace b on b.nspname = a.schemaname where b.nspname || '.' || a.tablename = '{0}.{1}'", tboldname)) == null) + if (_orm.Ado.ExecuteScalar(CommandType.Text, string.Format($" select 1 from {pg_}tables a inner join {pg_}namespace b on b.nspname = a.schemaname where b.nspname || '.' || a.tablename = '{{0}}.{{1}}'", tboldname)) == null) //旧表不存在 tboldname = null; } @@ -171,7 +202,7 @@ namespace FreeSql.Odbc.KingbaseES tboldname = null; //如果新表已经存在,不走改表名逻辑 //对比字段,只可以修改类型、增加字段、有限的修改字段名;保证安全不删除字段 - var sql = _commonUtils.FormatSql(@" + var sql = _commonUtils.FormatSql($@" select a.attname, t.typname, @@ -179,18 +210,18 @@ case when a.atttypmod > 0 and a.atttypmod < 32767 then a.atttypmod - 4 else a.at case when t.typelem > 0 and t.typinput::varchar = 'ARRAY_IN' then t2.typname else t.typname end, case when a.attnotnull then '0' else '1' end as is_nullable, --e.adsrc, -(select sys_get_expr(adbin, adrelid) from sys_attrdef where adrelid = e.adrelid limit 1) is_identity, +(select {pg_}get_expr(adbin, adrelid) from {pg_}attrdef where adrelid = e.adrelid limit 1) is_identity, a.attndims, d.description as comment -from sys_class c -inner join sys_attribute a on a.attnum > 0 and a.attrelid = c.oid -inner join sys_type t on t.oid = a.atttypid -left join sys_type t2 on t2.oid = t.typelem -left join sys_description d on d.objoid = a.attrelid and d.objsubid = a.attnum -left join sys_attrdef e on e.adrelid = a.attrelid and e.adnum = a.attnum -inner join sys_namespace ns on ns.oid = c.relnamespace -inner join sys_namespace ns2 on ns2.oid = t.typnamespace -where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname); +from {pg_}class c +inner join {pg_}attribute a on a.attnum > 0 and a.attrelid = c.oid +inner join {pg_}type t on t.oid = a.atttypid +left join {pg_}type t2 on t2.oid = t.typelem +left join {pg_}description d on d.objoid = a.attrelid and d.objsubid = a.attnum +left join {pg_}attrdef e on e.adrelid = a.attrelid and e.adnum = a.attnum +inner join {pg_}namespace ns on ns.oid = c.relnamespace +inner join {pg_}namespace ns2 on ns2.oid = t.typnamespace +where ns.nspname = {{0}} and c.relname = {{1}}", tboldname ?? tbname); var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); var tbstruct = ds.ToDictionary(a => string.Concat(a[0]), a => { @@ -269,18 +300,18 @@ where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname); if (tbcol.Attribute.IsIdentity == true) seqcols.Add(NativeTuple.Create(tbcol, tbname, tbcol.Attribute.IsIdentity == true)); if (string.IsNullOrEmpty(tbcol.Comment) == false) sbalter.Append("COMMENT ON COLUMN ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbcol.Attribute.Name}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tbcol.Comment)).Append(";\r\n"); } - var dsuksql = _commonUtils.FormatSql(@" + var dsuksql = _commonUtils.FormatSql($@" select c.attname, b.relname, -case when sys_index_column_has_property(b.oid, c.attnum, 'desc') = 't' then 1 else 0 end IsDesc, +case when {pg_}index_column_has_property(b.oid, c.attnum, 'desc') = 't' then 1 else 0 end IsDesc, case when indisunique = 't' then 1 else 0 end IsUnique -from sys_index a -inner join sys_class b on b.oid = a.indexrelid -inner join sys_attribute c on c.attnum > 0 and c.attrelid = b.oid -inner join sys_namespace ns on ns.oid = b.relnamespace -inner join sys_class d on d.oid = a.indrelid -where ns.nspname in ({0}) and d.relname in ({1}) and a.indisprimary = 'f'", tboldname ?? tbname); +from {pg_}index a +inner join {pg_}class b on b.oid = a.indexrelid +inner join {pg_}attribute c on c.attnum > 0 and c.attrelid = b.oid +inner join {pg_}namespace ns on ns.oid = b.relnamespace +inner join {pg_}class d on d.oid = a.indrelid +where ns.nspname in ({{0}}) and d.relname in ({{1}}) and a.indisprimary = 'f'", tboldname ?? tbname); var dsuk = _orm.Ado.ExecuteArray(CommandType.Text, dsuksql).Select(a => new[] { string.Concat(a[0]), string.Concat(a[1]), string.Concat(a[2]), string.Concat(a[3]) }); foreach (var uk in tb.Indexes) { @@ -305,23 +336,23 @@ where ns.nspname in ({0}) and d.relname in ({1}) and a.indisprimary = 'f'", tbol } if (istmpatler == false) { - var dbcomment = string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(@" select + var dbcomment = string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql($@" select d.description -from sys_class a -inner join sys_namespace b on b.oid = a.relnamespace -left join sys_description d on d.objoid = a.oid and objsubid = 0 -where b.nspname not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') and a.relkind in ('r') and b.nspname = {0} and a.relname = {1} -and b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS')", tbname[0], tbname[1]))); +from {pg_}class a +inner join {pg_}namespace b on b.oid = a.relnamespace +left join {pg_}description d on d.objoid = a.oid and objsubid = 0 +where upper(b.nspname) not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') and a.relkind in ('r') and b.nspname = {{0}} and a.relname = {{1}} +and upper(b.nspname || '.' || a.relname) not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS')", tbname[0], tbname[1]))); if (dbcomment != (tb.Comment ?? "")) sbalter.Append("COMMENT ON TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" IS ").Append(_commonUtils.FormatSql("{0}", tb.Comment)).Append(";\r\n"); sb.Append(sbalter); continue; } - var oldpk = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(@" select sys_constraint.conname as pk_name from sys_constraint -inner join sys_class on sys_constraint.conrelid = sys_class.oid -inner join sys_namespace on sys_namespace.oid = sys_class.relnamespace -where sys_namespace.nspname={0} and sys_class.relname={1} and sys_constraint.contype='p' + var oldpk = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql($@" select {pg_}constraint.conname as pk_name from {pg_}constraint +inner join {pg_}class on {pg_}constraint.conrelid = {pg_}class.oid +inner join {pg_}namespace on {pg_}namespace.oid = {pg_}class.relnamespace +where {pg_}namespace.nspname={{0}} and {pg_}class.relname={{1}} and {pg_}constraint.contype='p' ", tbname))?.ToString(); if (string.IsNullOrEmpty(oldpk) == false) sb.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(oldpk).Append(";\r\n"); diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs index 5ddd59f6..1f20cc6a 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs @@ -103,9 +103,17 @@ namespace FreeSql.Odbc.KingbaseES public string GetCsTypeValue(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbType, out var trydc) ? trydc.csTypeValue : null; public string GetDataReaderMethod(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbType, out var trydc) ? trydc.dataReaderMethod : null; + string getpg_() + { + var codefirstProvider = _orm.CodeFirst as OdbcKingbaseESCodeFirst; + codefirstProvider.InitIsSysV8R3(); + return codefirstProvider._isSysV8R3 == true ? "sys_" : "pg_"; + } + public List GetDatabases() { - var sql = @" select datname from sys_database where datname not in ('TEMPLATE1', 'TEMPLATE0', 'TEMPLATE2')"; + var pg_ = getpg_(); + var sql = $@" select datname from {pg_}database where datname not in ('TEMPLATE1', 'TEMPLATE0', 'TEMPLATE2')"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } @@ -113,10 +121,11 @@ namespace FreeSql.Odbc.KingbaseES public bool ExistsTable(string name, bool ignoreCase) { if (string.IsNullOrEmpty(name)) return false; + var pg_ = getpg_(); var tbname = _commonUtils.SplitTableName(name); if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] }; if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); - var sql = $" select 1 from sys_tables a inner join sys_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}"; + var sql = $" select 1 from {pg_}tables a inner join {pg_}namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}"; return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } @@ -125,6 +134,7 @@ namespace FreeSql.Odbc.KingbaseES public List GetTables(string[] database, string tablename, bool ignoreCase) { + var pg_ = getpg_(); var olddatabase = ""; using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) { @@ -156,12 +166,12 @@ a.schemaname, a.tablename , d.description, 'TABLE' -from sys_tables a -inner join sys_namespace b on b.nspname = a.schemaname -inner join sys_class c on c.relnamespace = b.oid and c.relname = a.tablename -left join sys_description d on d.objoid = c.oid and objsubid = 0 -where a.schemaname not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') -and b.nspname || '.' || a.tablename not in ('PUBLIC.SPATIAL_REF_SYS') +from {pg_}tables a +inner join {pg_}namespace b on b.nspname = a.schemaname +inner join {pg_}class c on c.relnamespace = b.oid and c.relname = a.tablename +left join {pg_}description d on d.objoid = c.oid and objsubid = 0 +where upper(a.schemaname) not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') +and upper(b.nspname || '.' || a.tablename) not in ('PUBLIC.SPATIAL_REF_SYS') union all @@ -171,11 +181,11 @@ b.nspname, a.relname, d.description, 'VIEW' -from sys_class a -inner join sys_namespace b on b.oid = a.relnamespace -left join sys_description d on d.objoid = a.oid and objsubid = 0 -where b.nspname not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') and a.relkind in ('m','v') -and b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS') +from {pg_}class a +inner join {pg_}namespace b on b.oid = a.relnamespace +left join {pg_}description d on d.objoid = a.oid and objsubid = 0 +where upper(b.nspname) not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') and a.relkind in ('m','v') +and upper(b.nspname || '.' || a.relname) not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS') {(tbname == null ? "" : $") ft_dbf where {(ignoreCase ? "lower(schemaname)" : "schemaname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(tablename)" : "tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}")}"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -241,20 +251,20 @@ case when a.atttypmod > 0 and a.atttypmod < 32767 then a.atttypmod - 4 else a.at case when t.typelem = 0 then t.typname else t2.typname end, case when a.attnotnull then 0 else 1 end as is_nullable, --e.adsrc as is_identity, pg12以下 -(select sys_get_expr(adbin, adrelid) from sys_attrdef where adrelid = e.adrelid and adnum = e.adnum limit 1) is_identity, +(select {pg_}get_expr(adbin, adrelid) from {pg_}attrdef where adrelid = e.adrelid and adnum = e.adnum limit 1) is_identity, d.description as comment, a.attndims, case when t.typelem = 0 then t.typtype else t2.typtype end, ns2.nspname, a.attnum -from sys_class c -inner join sys_attribute a on a.attnum > 0 and a.attrelid = c.oid -inner join sys_type t on t.oid = a.atttypid -left join sys_type t2 on t2.oid = t.typelem -left join sys_description d on d.objoid = a.attrelid and d.objsubid = a.attnum -left join sys_attrdef e on e.adrelid = a.attrelid and e.adnum = a.attnum -inner join sys_namespace ns on ns.oid = c.relnamespace -inner join sys_namespace ns2 on ns2.oid = t.typnamespace +from {pg_}class c +inner join {pg_}attribute a on a.attnum > 0 and a.attrelid = c.oid +inner join {pg_}type t on t.oid = a.atttypid +left join {pg_}type t2 on t2.oid = t.typelem +left join {pg_}description d on d.objoid = a.attrelid and d.objsubid = a.attnum +left join {pg_}attrdef e on e.adrelid = a.attrelid and e.adnum = a.attnum +inner join {pg_}namespace ns on ns.oid = c.relnamespace +inner join {pg_}namespace ns2 on ns2.oid = t.typnamespace where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || c.relname")}"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -322,14 +332,14 @@ b.relname as index_id, case when a.indisunique then 1 else 0 end IsUnique, case when a.indisprimary then 1 else 0 end IsPrimary, case when a.indisclustered then 0 else 1 end IsClustered, -case when sys_index_column_has_property(b.oid, c.attnum, 'desc') = 't' then 1 else 0 end IsDesc, +case when {pg_}index_column_has_property(b.oid, c.attnum, 'desc') = 't' then 1 else 0 end IsDesc, a.indkey::text, c.attnum -from sys_index a -inner join sys_class b on b.oid = a.indexrelid -inner join sys_attribute c on c.attnum > 0 and c.attrelid = b.oid -inner join sys_namespace ns on ns.oid = b.relnamespace -inner join sys_class d on d.oid = a.indrelid +from {pg_}index a +inner join {pg_}class b on b.oid = a.indexrelid +inner join {pg_}attribute c on c.attnum > 0 and c.attrelid = b.oid +inner join {pg_}namespace ns on ns.oid = b.relnamespace +inner join {pg_}class d on d.oid = a.indrelid where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")} "; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); @@ -396,18 +406,18 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname") sql = $@" select ns.nspname || '.' || b.relname as table_id, -array(select attname from sys_attribute where attrelid = a.conrelid and attnum = any(a.conkey)) as column_name, +array(select attname from {pg_}attribute where attrelid = a.conrelid and attnum = any(a.conkey)) as column_name, a.conname as FKId, ns2.nspname || '.' || c.relname as ref_table_id, 1 as IsForeignKey, -array(select attname from sys_attribute where attrelid = a.confrelid and attnum = any(a.confkey)) as ref_column, +array(select attname from {pg_}attribute where attrelid = a.confrelid and attnum = any(a.confkey)) as ref_column, null ref_sln, null ref_table -from sys_constraint a -inner join sys_class b on b.oid = a.conrelid -inner join sys_class c on c.oid = a.confrelid -inner join sys_namespace ns on ns.oid = b.relnamespace -inner join sys_namespace ns2 on ns2.oid = c.relnamespace +from {pg_}constraint a +inner join {pg_}class b on b.oid = a.conrelid +inner join {pg_}class c on c.oid = a.confrelid +inner join {pg_}namespace ns on ns.oid = b.relnamespace +inner join {pg_}namespace ns2 on ns2.oid = c.relnamespace where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")} "; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); @@ -500,15 +510,16 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname") } public List GetEnumsByDatabase(params string[] database) { + var pg_ = getpg_(); if (database == null || database.Length == 0) return new List(); - var drs = _orm.Ado.Query(CommandType.Text, _commonUtils.FormatSql(@" + var drs = _orm.Ado.Query(CommandType.Text, _commonUtils.FormatSql($@" select ns.nspname || '.' || a.typname AS name, b.enumlabel AS label -from sys_type a -inner join sys_enum b on b.enumtypid = a.oid -inner join sys_namespace ns on ns.oid = a.typnamespace -where a.typtype = 'e' and ns.nspname in (SELECT schema_name FROM information_schema.schemata where catalog_name in {0})", database)); +from {pg_}type a +inner join {pg_}enum b on b.enumtypid = a.oid +inner join {pg_}namespace ns on ns.oid = a.typnamespace +where a.typtype = 'e' and ns.nspname in (SELECT schema_name FROM information_schema.schemata where catalog_name in {{0}})", database)); var ret = new Dictionary>(); foreach (var dr in drs) { diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 8ec2ad76..e314d28e 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index d2294631..5553cb83 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 83d5db9b..4c5bc6b4 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index b7c40379..da46ef15 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 41a8b8a3..599cd5b3 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 43505de5..711783d2 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index cac773c0..0d256218 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index 22684a2c..29d158d7 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.681 + 3.2.682