mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-17 19:43:21 +08:00
v3.2.682 优化 KingbaseES 兼容 V8R3/V8R6;#931 #325
This commit is contained in:
parent
f96dcbafde
commit
674d7421b3
@ -11,7 +11,7 @@
|
|||||||
<!--
|
<!--
|
||||||
经常出于版本交叉问题,暂时关闭,在每个项目上设置版本号
|
经常出于版本交叉问题,暂时关闭,在每个项目上设置版本号
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<LangVersion>latest</LangVersion>
|
<LangVersion>latest</LangVersion>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<Title>$(AssemblyName)</Title>
|
<Title>$(AssemblyName)</Title>
|
||||||
<IsPackable>true</IsPackable>
|
<IsPackable>true</IsPackable>
|
||||||
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
|
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<PackageProjectUrl>https://github.com/2881099/FreeSql</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/2881099/FreeSql</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/2881099/FreeSql</RepositoryUrl>
|
<RepositoryUrl>https://github.com/2881099/FreeSql</RepositoryUrl>
|
||||||
<PackageTags>FreeSql DbFirst 实体生成器</PackageTags>
|
<PackageTags>FreeSql DbFirst 实体生成器</PackageTags>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -158,11 +158,11 @@ public class g
|
|||||||
public static IFreeSql shentong => shentongLazy.Value;
|
public static IFreeSql shentong => shentongLazy.Value;
|
||||||
|
|
||||||
static Lazy<IFreeSql> kingbaseESLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
|
static Lazy<IFreeSql> kingbaseESLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
|
||||||
//.UseConnectionString(FreeSql.DataType.KingbaseES, "Server=127.0.0.1;Port=54321;UID=USER2;PWD=123456789;database=TDB2")
|
.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"))
|
//.UseConnectionFactory(FreeSql.DataType.KingbaseES, () => new Kdbndp.KdbndpConnection("Server=127.0.0.1;Port=54321;UID=USER2;PWD=123456789;database=TDB2"))
|
||||||
//.UseAutoSyncStructure(true)
|
.UseAutoSyncStructure(true)
|
||||||
.UseLazyLoading(true)
|
.UseLazyLoading(true)
|
||||||
.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
|
.UseNameConvert(FreeSql.Internal.NameConvertType.ToLower)
|
||||||
.UseNoneCommandParameter(true)
|
.UseNoneCommandParameter(true)
|
||||||
|
|
||||||
.UseMonitorCommand(
|
.UseMonitorCommand(
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
<SignAssembly>False</SignAssembly>
|
<SignAssembly>False</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<Title>$(AssemblyName)</Title>
|
<Title>$(AssemblyName)</Title>
|
||||||
<IsPackable>true</IsPackable>
|
<IsPackable>true</IsPackable>
|
||||||
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
|
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
|
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
|
||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
<Authors>FreeSql;ncc;YeXiangQin</Authors>
|
<Authors>FreeSql;ncc;YeXiangQin</Authors>
|
||||||
<Description>FreeSql 数据库实现,基于 人大金仓数据库 V008R003 Ado.Net (Kdbndp)</Description>
|
<Description>FreeSql 数据库实现,基于 人大金仓数据库 V008R003/V008R006 Ado.Net (Kdbndp)</Description>
|
||||||
<PackageProjectUrl>https://github.com/2881099/FreeSql</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/2881099/FreeSql</PackageProjectUrl>
|
||||||
<RepositoryUrl>https://github.com/2881099/FreeSql</RepositoryUrl>
|
<RepositoryUrl>https://github.com/2881099/FreeSql</RepositoryUrl>
|
||||||
<RepositoryType>git</RepositoryType>
|
<RepositoryType>git</RepositoryType>
|
||||||
@ -15,7 +15,7 @@
|
|||||||
<Title>$(AssemblyName)</Title>
|
<Title>$(AssemblyName)</Title>
|
||||||
<IsPackable>true</IsPackable>
|
<IsPackable>true</IsPackable>
|
||||||
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
|
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -70,8 +70,39 @@ namespace FreeSql.KingbaseES
|
|||||||
return null;
|
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)
|
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 sb = new StringBuilder();
|
||||||
var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列
|
var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列
|
||||||
|
|
||||||
@ -82,14 +113,14 @@ namespace FreeSql.KingbaseES
|
|||||||
if (tb == null) throw new Exception(CoreStrings.S_Type_IsNot_Migrable(obj.entityType.FullName));
|
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));
|
if (tb.Columns.Any() == false) throw new Exception(CoreStrings.S_Type_IsNot_Migrable_0Attributes(obj.entityType.FullName));
|
||||||
var tbname = _commonUtils.SplitTableName(tb.DbName);
|
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); //旧表名
|
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)
|
if (string.IsNullOrEmpty(obj.tableName) == false)
|
||||||
{
|
{
|
||||||
var tbtmpname = _commonUtils.SplitTableName(obj.tableName);
|
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])
|
if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1])
|
||||||
{
|
{
|
||||||
tbname = tbtmpname;
|
tbname = tbtmpname;
|
||||||
@ -98,16 +129,16 @@ namespace FreeSql.KingbaseES
|
|||||||
}
|
}
|
||||||
//codefirst 不支持表名、模式名、数据库名中带 .
|
//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");
|
sb.Append("CREATE SCHEMA IF NOT EXISTS ").Append(tbname[0]).Append(";\r\n");
|
||||||
|
|
||||||
var sbalter = new StringBuilder();
|
var sbalter = new StringBuilder();
|
||||||
var istmpatler = false; //创建临时表,导入数据,删除旧表,修改
|
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 (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;
|
tboldname = null;
|
||||||
}
|
}
|
||||||
@ -167,7 +198,7 @@ namespace FreeSql.KingbaseES
|
|||||||
tboldname = null; //如果新表已经存在,不走改表名逻辑
|
tboldname = null; //如果新表已经存在,不走改表名逻辑
|
||||||
|
|
||||||
//对比字段,只可以修改类型、增加字段、有限的修改字段名;保证安全不删除字段
|
//对比字段,只可以修改类型、增加字段、有限的修改字段名;保证安全不删除字段
|
||||||
var sql = _commonUtils.FormatSql(@"
|
var sql = _commonUtils.FormatSql($@"
|
||||||
select
|
select
|
||||||
a.attname,
|
a.attname,
|
||||||
t.typname,
|
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 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,
|
case when a.attnotnull then '0' else '1' end as is_nullable,
|
||||||
--e.adsrc,
|
--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,
|
a.attndims,
|
||||||
d.description as comment
|
d.description as comment
|
||||||
from sys_class c
|
from {pg_}class c
|
||||||
inner join sys_attribute a on a.attnum > 0 and a.attrelid = c.oid
|
inner join {pg_}attribute a on a.attnum > 0 and a.attrelid = c.oid
|
||||||
inner join sys_type t on t.oid = a.atttypid
|
inner join {pg_}type t on t.oid = a.atttypid
|
||||||
left join sys_type t2 on t2.oid = t.typelem
|
left join {pg_}type t2 on t2.oid = t.typelem
|
||||||
left join sys_description d on d.objoid = a.attrelid and d.objsubid = a.attnum
|
left join {pg_}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
|
left join {pg_}attrdef e on e.adrelid = a.attrelid and e.adnum = a.attnum
|
||||||
inner join sys_namespace ns on ns.oid = c.relnamespace
|
inner join {pg_}namespace ns on ns.oid = c.relnamespace
|
||||||
inner join sys_namespace ns2 on ns2.oid = t.typnamespace
|
inner join {pg_}namespace ns2 on ns2.oid = t.typnamespace
|
||||||
where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname);
|
where ns.nspname = {{0}} and c.relname = {{1}}", tboldname ?? tbname);
|
||||||
var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
||||||
var tbstruct = ds.ToDictionary(a => string.Concat(a[0]), a =>
|
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 (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");
|
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
|
select
|
||||||
c.attname,
|
c.attname,
|
||||||
b.relname,
|
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
|
case when indisunique = 't' then 1 else 0 end IsUnique
|
||||||
from sys_index a
|
from {pg_}index a
|
||||||
inner join sys_class b on b.oid = a.indexrelid
|
inner join {pg_}class b on b.oid = a.indexrelid
|
||||||
inner join sys_attribute c on c.attnum > 0 and c.attrelid = b.oid
|
inner join {pg_}attribute c on c.attnum > 0 and c.attrelid = b.oid
|
||||||
inner join sys_namespace ns on ns.oid = b.relnamespace
|
inner join {pg_}namespace ns on ns.oid = b.relnamespace
|
||||||
inner join sys_class d on d.oid = a.indrelid
|
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);
|
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]) });
|
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)
|
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)
|
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
|
d.description
|
||||||
from sys_class a
|
from {pg_}class a
|
||||||
inner join sys_namespace b on b.oid = a.relnamespace
|
inner join {pg_}namespace b on b.oid = a.relnamespace
|
||||||
left join sys_description d on d.objoid = a.oid and objsubid = 0
|
left join {pg_}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}
|
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 b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS')", tbname[0], tbname[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 ?? ""))
|
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");
|
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);
|
sb.Append(sbalter);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
var oldpk = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(@" select sys_constraint.conname as pk_name from sys_constraint
|
var oldpk = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql($@" select {pg_}constraint.conname as pk_name from {pg_}constraint
|
||||||
inner join sys_class on sys_constraint.conrelid = sys_class.oid
|
inner join {pg_}class on {pg_}constraint.conrelid = {pg_}class.oid
|
||||||
inner join sys_namespace on sys_namespace.oid = sys_class.relnamespace
|
inner join {pg_}namespace on {pg_}namespace.oid = {pg_}class.relnamespace
|
||||||
where sys_namespace.nspname={0} and sys_class.relname={1} and sys_constraint.contype='p'
|
where {pg_}namespace.nspname={{0}} and {pg_}class.relname={{1}} and {pg_}constraint.contype='p'
|
||||||
", tbname))?.ToString();
|
", tbname))?.ToString();
|
||||||
if (string.IsNullOrEmpty(oldpk) == false)
|
if (string.IsNullOrEmpty(oldpk) == false)
|
||||||
sb.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(oldpk).Append(";\r\n");
|
sb.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(oldpk).Append(";\r\n");
|
||||||
|
@ -102,9 +102,17 @@ namespace FreeSql.KingbaseES
|
|||||||
public string GetCsTypeValue(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbType, out var trydc) ? trydc.csTypeValue : null;
|
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;
|
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<string> GetDatabases()
|
public List<string> 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);
|
var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
||||||
return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList();
|
return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList();
|
||||||
}
|
}
|
||||||
@ -112,10 +120,11 @@ namespace FreeSql.KingbaseES
|
|||||||
public bool ExistsTable(string name, bool ignoreCase)
|
public bool ExistsTable(string name, bool ignoreCase)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(name)) return false;
|
if (string.IsNullOrEmpty(name)) return false;
|
||||||
|
var pg_ = getpg_();
|
||||||
var tbname = _commonUtils.SplitTableName(name);
|
var tbname = _commonUtils.SplitTableName(name);
|
||||||
if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
|
if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
|
||||||
if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
|
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";
|
return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,6 +133,7 @@ namespace FreeSql.KingbaseES
|
|||||||
|
|
||||||
public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
|
public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
|
||||||
{
|
{
|
||||||
|
var pg_ = getpg_();
|
||||||
var olddatabase = "";
|
var olddatabase = "";
|
||||||
using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
|
using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
|
||||||
{
|
{
|
||||||
@ -155,12 +165,12 @@ a.schemaname,
|
|||||||
a.tablename ,
|
a.tablename ,
|
||||||
d.description,
|
d.description,
|
||||||
'TABLE'
|
'TABLE'
|
||||||
from sys_tables a
|
from {pg_}tables a
|
||||||
inner join sys_namespace b on b.nspname = a.schemaname
|
inner join {pg_}namespace b on b.nspname = a.schemaname
|
||||||
inner join sys_class c on c.relnamespace = b.oid and c.relname = a.tablename
|
inner join {pg_}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
|
left join {pg_}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')
|
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 b.nspname || '.' || a.tablename not in ('PUBLIC.SPATIAL_REF_SYS')
|
and upper(b.nspname || '.' || a.tablename) not in ('PUBLIC.SPATIAL_REF_SYS')
|
||||||
|
|
||||||
union all
|
union all
|
||||||
|
|
||||||
@ -170,11 +180,11 @@ b.nspname,
|
|||||||
a.relname,
|
a.relname,
|
||||||
d.description,
|
d.description,
|
||||||
'VIEW'
|
'VIEW'
|
||||||
from sys_class a
|
from {pg_}class a
|
||||||
inner join sys_namespace b on b.oid = a.relnamespace
|
inner join {pg_}namespace b on b.oid = a.relnamespace
|
||||||
left join sys_description d on d.objoid = a.oid and objsubid = 0
|
left join {pg_}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')
|
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 b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS')
|
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])}")}";
|
{(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);
|
var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
||||||
if (ds == null) return loc1;
|
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 t.typelem = 0 then t.typname else t2.typname end,
|
||||||
case when a.attnotnull then 0 else 1 end as is_nullable,
|
case when a.attnotnull then 0 else 1 end as is_nullable,
|
||||||
--e.adsrc as is_identity, pg12以下
|
--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,
|
d.description as comment,
|
||||||
a.attndims,
|
a.attndims,
|
||||||
case when t.typelem = 0 then t.typtype else t2.typtype end,
|
case when t.typelem = 0 then t.typtype else t2.typtype end,
|
||||||
ns2.nspname,
|
ns2.nspname,
|
||||||
a.attnum
|
a.attnum
|
||||||
from sys_class c
|
from {pg_}class c
|
||||||
inner join sys_attribute a on a.attnum > 0 and a.attrelid = c.oid
|
inner join {pg_}attribute a on a.attnum > 0 and a.attrelid = c.oid
|
||||||
inner join sys_type t on t.oid = a.atttypid
|
inner join {pg_}type t on t.oid = a.atttypid
|
||||||
left join sys_type t2 on t2.oid = t.typelem
|
left join {pg_}type t2 on t2.oid = t.typelem
|
||||||
left join sys_description d on d.objoid = a.attrelid and d.objsubid = a.attnum
|
left join {pg_}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
|
left join {pg_}attrdef e on e.adrelid = a.attrelid and e.adnum = a.attnum
|
||||||
inner join sys_namespace ns on ns.oid = c.relnamespace
|
inner join {pg_}namespace ns on ns.oid = c.relnamespace
|
||||||
inner join sys_namespace ns2 on ns2.oid = t.typnamespace
|
inner join {pg_}namespace ns2 on ns2.oid = t.typnamespace
|
||||||
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || c.relname")}";
|
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || c.relname")}";
|
||||||
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
||||||
if (ds == null) return loc1;
|
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.indisunique then 1 else 0 end IsUnique,
|
||||||
case when a.indisprimary then 1 else 0 end IsPrimary,
|
case when a.indisprimary then 1 else 0 end IsPrimary,
|
||||||
case when a.indisclustered then 0 else 1 end IsClustered,
|
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,
|
a.indkey::text,
|
||||||
c.attnum
|
c.attnum
|
||||||
from sys_index a
|
from {pg_}index a
|
||||||
inner join sys_class b on b.oid = a.indexrelid
|
inner join {pg_}class b on b.oid = a.indexrelid
|
||||||
inner join sys_attribute c on c.attnum > 0 and c.attrelid = b.oid
|
inner join {pg_}attribute c on c.attnum > 0 and c.attrelid = b.oid
|
||||||
inner join sys_namespace ns on ns.oid = b.relnamespace
|
inner join {pg_}namespace ns on ns.oid = b.relnamespace
|
||||||
inner join sys_class d on d.oid = a.indrelid
|
inner join {pg_}class d on d.oid = a.indrelid
|
||||||
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")}
|
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")}
|
||||||
";
|
";
|
||||||
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
||||||
@ -395,18 +405,18 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")
|
|||||||
sql = $@"
|
sql = $@"
|
||||||
select
|
select
|
||||||
ns.nspname || '.' || b.relname as table_id,
|
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,
|
a.conname as FKId,
|
||||||
ns2.nspname || '.' || c.relname as ref_table_id,
|
ns2.nspname || '.' || c.relname as ref_table_id,
|
||||||
1 as IsForeignKey,
|
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_sln,
|
||||||
null ref_table
|
null ref_table
|
||||||
from sys_constraint a
|
from {pg_}constraint a
|
||||||
inner join sys_class b on b.oid = a.conrelid
|
inner join {pg_}class b on b.oid = a.conrelid
|
||||||
inner join sys_class c on c.oid = a.confrelid
|
inner join {pg_}class c on c.oid = a.confrelid
|
||||||
inner join sys_namespace ns on ns.oid = b.relnamespace
|
inner join {pg_}namespace ns on ns.oid = b.relnamespace
|
||||||
inner join sys_namespace ns2 on ns2.oid = c.relnamespace
|
inner join {pg_}namespace ns2 on ns2.oid = c.relnamespace
|
||||||
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")}
|
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")}
|
||||||
";
|
";
|
||||||
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
||||||
@ -499,15 +509,16 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")
|
|||||||
}
|
}
|
||||||
public List<DbEnumInfo> GetEnumsByDatabase(params string[] database)
|
public List<DbEnumInfo> GetEnumsByDatabase(params string[] database)
|
||||||
{
|
{
|
||||||
|
var pg_ = getpg_();
|
||||||
if (database == null || database.Length == 0) return new List<DbEnumInfo>();
|
if (database == null || database.Length == 0) return new List<DbEnumInfo>();
|
||||||
var drs = _orm.Ado.Query<GetEnumsByDatabaseQueryInfo>(CommandType.Text, _commonUtils.FormatSql(@"
|
var drs = _orm.Ado.Query<GetEnumsByDatabaseQueryInfo>(CommandType.Text, _commonUtils.FormatSql($@"
|
||||||
select
|
select
|
||||||
ns.nspname || '.' || a.typname AS name,
|
ns.nspname || '.' || a.typname AS name,
|
||||||
b.enumlabel AS label
|
b.enumlabel AS label
|
||||||
from sys_type a
|
from {pg_}type a
|
||||||
inner join sys_enum b on b.enumtypid = a.oid
|
inner join {pg_}enum b on b.enumtypid = a.oid
|
||||||
inner join sys_namespace ns on ns.oid = a.typnamespace
|
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));
|
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<string, Dictionary<string, string>>();
|
var ret = new Dictionary<string, Dictionary<string, string>>();
|
||||||
foreach (var dr in drs)
|
foreach (var dr in drs)
|
||||||
{
|
{
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -74,8 +74,39 @@ namespace FreeSql.Odbc.KingbaseES
|
|||||||
return null;
|
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)
|
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 sb = new StringBuilder();
|
||||||
var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列
|
var seqcols = new List<NativeTuple<ColumnInfo, string[], bool>>(); //序列
|
||||||
|
|
||||||
@ -86,14 +117,14 @@ namespace FreeSql.Odbc.KingbaseES
|
|||||||
if (tb == null) throw new Exception(CoreStrings.S_Type_IsNot_Migrable(obj.entityType.FullName));
|
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));
|
if (tb.Columns.Any() == false) throw new Exception(CoreStrings.S_Type_IsNot_Migrable_0Attributes(obj.entityType.FullName));
|
||||||
var tbname = _commonUtils.SplitTableName(tb.DbName);
|
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); //旧表名
|
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)
|
if (string.IsNullOrEmpty(obj.tableName) == false)
|
||||||
{
|
{
|
||||||
var tbtmpname = _commonUtils.SplitTableName(obj.tableName);
|
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])
|
if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1])
|
||||||
{
|
{
|
||||||
tbname = tbtmpname;
|
tbname = tbtmpname;
|
||||||
@ -102,16 +133,16 @@ namespace FreeSql.Odbc.KingbaseES
|
|||||||
}
|
}
|
||||||
//codefirst 不支持表名、模式名、数据库名中带 .
|
//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");
|
sb.Append("CREATE SCHEMA IF NOT EXISTS ").Append(tbname[0]).Append(";\r\n");
|
||||||
|
|
||||||
var sbalter = new StringBuilder();
|
var sbalter = new StringBuilder();
|
||||||
var istmpatler = false; //创建临时表,导入数据,删除旧表,修改
|
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 (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;
|
tboldname = null;
|
||||||
}
|
}
|
||||||
@ -171,7 +202,7 @@ namespace FreeSql.Odbc.KingbaseES
|
|||||||
tboldname = null; //如果新表已经存在,不走改表名逻辑
|
tboldname = null; //如果新表已经存在,不走改表名逻辑
|
||||||
|
|
||||||
//对比字段,只可以修改类型、增加字段、有限的修改字段名;保证安全不删除字段
|
//对比字段,只可以修改类型、增加字段、有限的修改字段名;保证安全不删除字段
|
||||||
var sql = _commonUtils.FormatSql(@"
|
var sql = _commonUtils.FormatSql($@"
|
||||||
select
|
select
|
||||||
a.attname,
|
a.attname,
|
||||||
t.typname,
|
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 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,
|
case when a.attnotnull then '0' else '1' end as is_nullable,
|
||||||
--e.adsrc,
|
--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,
|
a.attndims,
|
||||||
d.description as comment
|
d.description as comment
|
||||||
from sys_class c
|
from {pg_}class c
|
||||||
inner join sys_attribute a on a.attnum > 0 and a.attrelid = c.oid
|
inner join {pg_}attribute a on a.attnum > 0 and a.attrelid = c.oid
|
||||||
inner join sys_type t on t.oid = a.atttypid
|
inner join {pg_}type t on t.oid = a.atttypid
|
||||||
left join sys_type t2 on t2.oid = t.typelem
|
left join {pg_}type t2 on t2.oid = t.typelem
|
||||||
left join sys_description d on d.objoid = a.attrelid and d.objsubid = a.attnum
|
left join {pg_}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
|
left join {pg_}attrdef e on e.adrelid = a.attrelid and e.adnum = a.attnum
|
||||||
inner join sys_namespace ns on ns.oid = c.relnamespace
|
inner join {pg_}namespace ns on ns.oid = c.relnamespace
|
||||||
inner join sys_namespace ns2 on ns2.oid = t.typnamespace
|
inner join {pg_}namespace ns2 on ns2.oid = t.typnamespace
|
||||||
where ns.nspname = {0} and c.relname = {1}", tboldname ?? tbname);
|
where ns.nspname = {{0}} and c.relname = {{1}}", tboldname ?? tbname);
|
||||||
var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
||||||
var tbstruct = ds.ToDictionary(a => string.Concat(a[0]), a =>
|
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 (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");
|
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
|
select
|
||||||
c.attname,
|
c.attname,
|
||||||
b.relname,
|
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
|
case when indisunique = 't' then 1 else 0 end IsUnique
|
||||||
from sys_index a
|
from {pg_}index a
|
||||||
inner join sys_class b on b.oid = a.indexrelid
|
inner join {pg_}class b on b.oid = a.indexrelid
|
||||||
inner join sys_attribute c on c.attnum > 0 and c.attrelid = b.oid
|
inner join {pg_}attribute c on c.attnum > 0 and c.attrelid = b.oid
|
||||||
inner join sys_namespace ns on ns.oid = b.relnamespace
|
inner join {pg_}namespace ns on ns.oid = b.relnamespace
|
||||||
inner join sys_class d on d.oid = a.indrelid
|
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);
|
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]) });
|
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)
|
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)
|
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
|
d.description
|
||||||
from sys_class a
|
from {pg_}class a
|
||||||
inner join sys_namespace b on b.oid = a.relnamespace
|
inner join {pg_}namespace b on b.oid = a.relnamespace
|
||||||
left join sys_description d on d.objoid = a.oid and objsubid = 0
|
left join {pg_}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}
|
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 b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS')", tbname[0], tbname[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 ?? ""))
|
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");
|
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);
|
sb.Append(sbalter);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
var oldpk = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(@" select sys_constraint.conname as pk_name from sys_constraint
|
var oldpk = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql($@" select {pg_}constraint.conname as pk_name from {pg_}constraint
|
||||||
inner join sys_class on sys_constraint.conrelid = sys_class.oid
|
inner join {pg_}class on {pg_}constraint.conrelid = {pg_}class.oid
|
||||||
inner join sys_namespace on sys_namespace.oid = sys_class.relnamespace
|
inner join {pg_}namespace on {pg_}namespace.oid = {pg_}class.relnamespace
|
||||||
where sys_namespace.nspname={0} and sys_class.relname={1} and sys_constraint.contype='p'
|
where {pg_}namespace.nspname={{0}} and {pg_}class.relname={{1}} and {pg_}constraint.contype='p'
|
||||||
", tbname))?.ToString();
|
", tbname))?.ToString();
|
||||||
if (string.IsNullOrEmpty(oldpk) == false)
|
if (string.IsNullOrEmpty(oldpk) == false)
|
||||||
sb.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(oldpk).Append(";\r\n");
|
sb.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(oldpk).Append(";\r\n");
|
||||||
|
@ -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 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;
|
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<string> GetDatabases()
|
public List<string> 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);
|
var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
||||||
return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList();
|
return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList();
|
||||||
}
|
}
|
||||||
@ -113,10 +121,11 @@ namespace FreeSql.Odbc.KingbaseES
|
|||||||
public bool ExistsTable(string name, bool ignoreCase)
|
public bool ExistsTable(string name, bool ignoreCase)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(name)) return false;
|
if (string.IsNullOrEmpty(name)) return false;
|
||||||
|
var pg_ = getpg_();
|
||||||
var tbname = _commonUtils.SplitTableName(name);
|
var tbname = _commonUtils.SplitTableName(name);
|
||||||
if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
|
if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
|
||||||
if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
|
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";
|
return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,6 +134,7 @@ namespace FreeSql.Odbc.KingbaseES
|
|||||||
|
|
||||||
public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
|
public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
|
||||||
{
|
{
|
||||||
|
var pg_ = getpg_();
|
||||||
var olddatabase = "";
|
var olddatabase = "";
|
||||||
using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
|
using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
|
||||||
{
|
{
|
||||||
@ -156,12 +166,12 @@ a.schemaname,
|
|||||||
a.tablename ,
|
a.tablename ,
|
||||||
d.description,
|
d.description,
|
||||||
'TABLE'
|
'TABLE'
|
||||||
from sys_tables a
|
from {pg_}tables a
|
||||||
inner join sys_namespace b on b.nspname = a.schemaname
|
inner join {pg_}namespace b on b.nspname = a.schemaname
|
||||||
inner join sys_class c on c.relnamespace = b.oid and c.relname = a.tablename
|
inner join {pg_}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
|
left join {pg_}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')
|
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 b.nspname || '.' || a.tablename not in ('PUBLIC.SPATIAL_REF_SYS')
|
and upper(b.nspname || '.' || a.tablename) not in ('PUBLIC.SPATIAL_REF_SYS')
|
||||||
|
|
||||||
union all
|
union all
|
||||||
|
|
||||||
@ -171,11 +181,11 @@ b.nspname,
|
|||||||
a.relname,
|
a.relname,
|
||||||
d.description,
|
d.description,
|
||||||
'VIEW'
|
'VIEW'
|
||||||
from sys_class a
|
from {pg_}class a
|
||||||
inner join sys_namespace b on b.oid = a.relnamespace
|
inner join {pg_}namespace b on b.oid = a.relnamespace
|
||||||
left join sys_description d on d.objoid = a.oid and objsubid = 0
|
left join {pg_}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')
|
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 b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS')
|
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])}")}";
|
{(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);
|
var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
||||||
if (ds == null) return loc1;
|
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 t.typelem = 0 then t.typname else t2.typname end,
|
||||||
case when a.attnotnull then 0 else 1 end as is_nullable,
|
case when a.attnotnull then 0 else 1 end as is_nullable,
|
||||||
--e.adsrc as is_identity, pg12以下
|
--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,
|
d.description as comment,
|
||||||
a.attndims,
|
a.attndims,
|
||||||
case when t.typelem = 0 then t.typtype else t2.typtype end,
|
case when t.typelem = 0 then t.typtype else t2.typtype end,
|
||||||
ns2.nspname,
|
ns2.nspname,
|
||||||
a.attnum
|
a.attnum
|
||||||
from sys_class c
|
from {pg_}class c
|
||||||
inner join sys_attribute a on a.attnum > 0 and a.attrelid = c.oid
|
inner join {pg_}attribute a on a.attnum > 0 and a.attrelid = c.oid
|
||||||
inner join sys_type t on t.oid = a.atttypid
|
inner join {pg_}type t on t.oid = a.atttypid
|
||||||
left join sys_type t2 on t2.oid = t.typelem
|
left join {pg_}type t2 on t2.oid = t.typelem
|
||||||
left join sys_description d on d.objoid = a.attrelid and d.objsubid = a.attnum
|
left join {pg_}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
|
left join {pg_}attrdef e on e.adrelid = a.attrelid and e.adnum = a.attnum
|
||||||
inner join sys_namespace ns on ns.oid = c.relnamespace
|
inner join {pg_}namespace ns on ns.oid = c.relnamespace
|
||||||
inner join sys_namespace ns2 on ns2.oid = t.typnamespace
|
inner join {pg_}namespace ns2 on ns2.oid = t.typnamespace
|
||||||
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || c.relname")}";
|
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || c.relname")}";
|
||||||
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
||||||
if (ds == null) return loc1;
|
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.indisunique then 1 else 0 end IsUnique,
|
||||||
case when a.indisprimary then 1 else 0 end IsPrimary,
|
case when a.indisprimary then 1 else 0 end IsPrimary,
|
||||||
case when a.indisclustered then 0 else 1 end IsClustered,
|
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,
|
a.indkey::text,
|
||||||
c.attnum
|
c.attnum
|
||||||
from sys_index a
|
from {pg_}index a
|
||||||
inner join sys_class b on b.oid = a.indexrelid
|
inner join {pg_}class b on b.oid = a.indexrelid
|
||||||
inner join sys_attribute c on c.attnum > 0 and c.attrelid = b.oid
|
inner join {pg_}attribute c on c.attnum > 0 and c.attrelid = b.oid
|
||||||
inner join sys_namespace ns on ns.oid = b.relnamespace
|
inner join {pg_}namespace ns on ns.oid = b.relnamespace
|
||||||
inner join sys_class d on d.oid = a.indrelid
|
inner join {pg_}class d on d.oid = a.indrelid
|
||||||
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")}
|
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")}
|
||||||
";
|
";
|
||||||
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
||||||
@ -396,18 +406,18 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")
|
|||||||
sql = $@"
|
sql = $@"
|
||||||
select
|
select
|
||||||
ns.nspname || '.' || b.relname as table_id,
|
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,
|
a.conname as FKId,
|
||||||
ns2.nspname || '.' || c.relname as ref_table_id,
|
ns2.nspname || '.' || c.relname as ref_table_id,
|
||||||
1 as IsForeignKey,
|
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_sln,
|
||||||
null ref_table
|
null ref_table
|
||||||
from sys_constraint a
|
from {pg_}constraint a
|
||||||
inner join sys_class b on b.oid = a.conrelid
|
inner join {pg_}class b on b.oid = a.conrelid
|
||||||
inner join sys_class c on c.oid = a.confrelid
|
inner join {pg_}class c on c.oid = a.confrelid
|
||||||
inner join sys_namespace ns on ns.oid = b.relnamespace
|
inner join {pg_}namespace ns on ns.oid = b.relnamespace
|
||||||
inner join sys_namespace ns2 on ns2.oid = c.relnamespace
|
inner join {pg_}namespace ns2 on ns2.oid = c.relnamespace
|
||||||
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")}
|
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")}
|
||||||
";
|
";
|
||||||
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
|
||||||
@ -500,15 +510,16 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")
|
|||||||
}
|
}
|
||||||
public List<DbEnumInfo> GetEnumsByDatabase(params string[] database)
|
public List<DbEnumInfo> GetEnumsByDatabase(params string[] database)
|
||||||
{
|
{
|
||||||
|
var pg_ = getpg_();
|
||||||
if (database == null || database.Length == 0) return new List<DbEnumInfo>();
|
if (database == null || database.Length == 0) return new List<DbEnumInfo>();
|
||||||
var drs = _orm.Ado.Query<GetEnumsByDatabaseQueryInfo>(CommandType.Text, _commonUtils.FormatSql(@"
|
var drs = _orm.Ado.Query<GetEnumsByDatabaseQueryInfo>(CommandType.Text, _commonUtils.FormatSql($@"
|
||||||
select
|
select
|
||||||
ns.nspname || '.' || a.typname AS name,
|
ns.nspname || '.' || a.typname AS name,
|
||||||
b.enumlabel AS label
|
b.enumlabel AS label
|
||||||
from sys_type a
|
from {pg_}type a
|
||||||
inner join sys_enum b on b.enumtypid = a.oid
|
inner join {pg_}enum b on b.enumtypid = a.oid
|
||||||
inner join sys_namespace ns on ns.oid = a.typnamespace
|
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));
|
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<string, Dictionary<string, string>>();
|
var ret = new Dictionary<string, Dictionary<string, string>>();
|
||||||
foreach (var dr in drs)
|
foreach (var dr in drs)
|
||||||
{
|
{
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<Title>$(AssemblyName)</Title>
|
<Title>$(AssemblyName)</Title>
|
||||||
<IsPackable>true</IsPackable>
|
<IsPackable>true</IsPackable>
|
||||||
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
|
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<SignAssembly>true</SignAssembly>
|
<SignAssembly>true</SignAssembly>
|
||||||
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
<AssemblyOriginatorKeyFile>key.snk</AssemblyOriginatorKeyFile>
|
||||||
<DelaySign>false</DelaySign>
|
<DelaySign>false</DelaySign>
|
||||||
<Version>3.2.681</Version>
|
<Version>3.2.682</Version>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user