mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-15 23:42:51 +08:00
793 lines
38 KiB
C#
793 lines
38 KiB
C#
using FreeSql.DatabaseModel;
|
|
using FreeSql.Internal;
|
|
using FreeSql.Internal.Model;
|
|
using Newtonsoft.Json.Linq;
|
|
using NpgsqlTypes;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Net.NetworkInformation;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace FreeSql.QuestDb
|
|
{
|
|
class QuestDbDbFirst : IDbFirst
|
|
{
|
|
IFreeSql _orm;
|
|
protected CommonUtils _commonUtils;
|
|
protected CommonExpression _commonExpression;
|
|
|
|
public QuestDbDbFirst(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression)
|
|
{
|
|
_orm = orm;
|
|
_commonUtils = commonUtils;
|
|
_commonExpression = commonExpression;
|
|
}
|
|
|
|
public bool IsPg10 => ServerVersion >= 10;
|
|
|
|
public int ServerVersion
|
|
{
|
|
get
|
|
{
|
|
if (_ServerVersionValue == 0 && _orm.Ado.MasterPool != null)
|
|
using (var conn = _orm.Ado.MasterPool.Get())
|
|
{
|
|
try
|
|
{
|
|
_ServerVersionValue = ParsePgVersion(conn.Value.ServerVersion, 10, 0).Item2;
|
|
}
|
|
catch
|
|
{
|
|
_ServerVersionValue = 9;
|
|
}
|
|
}
|
|
|
|
return _ServerVersionValue;
|
|
}
|
|
}
|
|
|
|
int _ServerVersionValue = 0;
|
|
|
|
public int GetDbType(DbColumnInfo column) => (int)GetNpgsqlDbType(column);
|
|
|
|
NpgsqlDbType GetNpgsqlDbType(DbColumnInfo column)
|
|
{
|
|
var dbtype = column.DbTypeText;
|
|
var isarray = dbtype?.EndsWith("[]") == true;
|
|
if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2);
|
|
NpgsqlDbType ret = NpgsqlDbType.Unknown;
|
|
switch (dbtype?.ToLower().TrimStart('_'))
|
|
{
|
|
case "short":
|
|
ret = NpgsqlDbType.Smallint;
|
|
break;
|
|
case "int":
|
|
ret = NpgsqlDbType.Integer;
|
|
break;
|
|
case "long":
|
|
ret = NpgsqlDbType.Bigint;
|
|
break;
|
|
case "numeric":
|
|
ret = NpgsqlDbType.Numeric;
|
|
break;
|
|
case "float":
|
|
ret = NpgsqlDbType.Real;
|
|
break;
|
|
case "double":
|
|
ret = NpgsqlDbType.Double;
|
|
break;
|
|
case "char":
|
|
ret = NpgsqlDbType.Char;
|
|
break;
|
|
case "string":
|
|
ret = NpgsqlDbType.Varchar;
|
|
break;
|
|
case "timestamp":
|
|
ret = NpgsqlDbType.Timestamp;
|
|
break;
|
|
case "timestamptz":
|
|
ret = NpgsqlDbType.TimestampTz;
|
|
break;
|
|
case "date":
|
|
ret = NpgsqlDbType.Date;
|
|
break;
|
|
case "time":
|
|
ret = NpgsqlDbType.Time;
|
|
break;
|
|
case "timetz":
|
|
ret = NpgsqlDbType.TimeTz;
|
|
break;
|
|
case "interval":
|
|
ret = NpgsqlDbType.Interval;
|
|
break;
|
|
|
|
case "bool":
|
|
ret = NpgsqlDbType.Boolean;
|
|
break;
|
|
case "bytea":
|
|
ret = NpgsqlDbType.Bytea;
|
|
break;
|
|
case "bit":
|
|
ret = NpgsqlDbType.Bit;
|
|
break;
|
|
case "varbit":
|
|
ret = NpgsqlDbType.Varbit;
|
|
break;
|
|
|
|
case "point":
|
|
ret = NpgsqlDbType.Point;
|
|
break;
|
|
case "line":
|
|
ret = NpgsqlDbType.Line;
|
|
break;
|
|
case "lseg":
|
|
ret = NpgsqlDbType.LSeg;
|
|
break;
|
|
case "box":
|
|
ret = NpgsqlDbType.Box;
|
|
break;
|
|
case "path":
|
|
ret = NpgsqlDbType.Path;
|
|
break;
|
|
case "polygon":
|
|
ret = NpgsqlDbType.Polygon;
|
|
break;
|
|
case "circle":
|
|
ret = NpgsqlDbType.Circle;
|
|
break;
|
|
|
|
case "cidr":
|
|
ret = NpgsqlDbType.Cidr;
|
|
break;
|
|
case "inet":
|
|
ret = NpgsqlDbType.Inet;
|
|
break;
|
|
case "macaddr":
|
|
ret = NpgsqlDbType.MacAddr;
|
|
break;
|
|
|
|
case "json":
|
|
ret = NpgsqlDbType.Json;
|
|
break;
|
|
case "jsonb":
|
|
ret = NpgsqlDbType.Jsonb;
|
|
break;
|
|
case "uuid":
|
|
ret = NpgsqlDbType.Uuid;
|
|
break;
|
|
|
|
case "int4range":
|
|
ret = NpgsqlDbType.Range | NpgsqlDbType.Integer;
|
|
break;
|
|
case "int8range":
|
|
ret = NpgsqlDbType.Range | NpgsqlDbType.Bigint;
|
|
break;
|
|
case "numrange":
|
|
ret = NpgsqlDbType.Range | NpgsqlDbType.Numeric;
|
|
break;
|
|
case "tsrange":
|
|
ret = NpgsqlDbType.Range | NpgsqlDbType.Timestamp;
|
|
break;
|
|
case "tstzrange":
|
|
ret = NpgsqlDbType.Range | NpgsqlDbType.TimestampTz;
|
|
break;
|
|
case "daterange":
|
|
ret = NpgsqlDbType.Range | NpgsqlDbType.Date;
|
|
break;
|
|
|
|
case "hstore":
|
|
ret = NpgsqlDbType.Hstore;
|
|
break;
|
|
case "geometry":
|
|
ret = NpgsqlDbType.Geometry;
|
|
break;
|
|
}
|
|
|
|
return isarray ? (ret | NpgsqlDbType.Array) : ret;
|
|
}
|
|
|
|
static readonly
|
|
Dictionary<int, (string csConvert, string csParse, string csStringify, string csType, Type csTypeInfo, Type
|
|
csNullableTypeInfo, string csTypeValue, string dataReaderMethod)> _dicDbToCs =
|
|
new Dictionary<int, (string csConvert, string csParse, string csStringify, string csType, Type
|
|
csTypeInfo, Type csNullableTypeInfo, string csTypeValue, string dataReaderMethod)>()
|
|
{
|
|
{
|
|
(int)NpgsqlDbType.Smallint,
|
|
("(short?)", "short.Parse({0})", "{0}.ToString()", "short?", typeof(short), typeof(short?),
|
|
"{0}.Value", "GetInt16")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Integer,
|
|
("(int?)", "int.Parse({0})", "{0}.ToString()", "int?", typeof(int), typeof(int?), "{0}.Value",
|
|
"GetInt32")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Bigint,
|
|
("(long?)", "long.Parse({0})", "{0}.ToString()", "long?", typeof(long), typeof(long?),
|
|
"{0}.Value", "GetInt64")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Numeric,
|
|
("(decimal?)", "decimal.Parse({0})", "{0}.ToString()", "decimal?", typeof(decimal),
|
|
typeof(decimal?), "{0}.Value", "GetDecimal")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Real,
|
|
("(float?)", "float.Parse({0})", "{0}.ToString()", "float?", typeof(float), typeof(float?),
|
|
"{0}.Value", "GetFloat")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Double,
|
|
("(double?)", "double.Parse({0})", "{0}.ToString()", "double?", typeof(double), typeof(double?),
|
|
"{0}.Value", "GetDouble")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Money,
|
|
("(decimal?)", "decimal.Parse({0})", "{0}.ToString()", "decimal?", typeof(decimal),
|
|
typeof(decimal?), "{0}.Value", "GetDecimal")
|
|
},
|
|
|
|
{
|
|
(int)NpgsqlDbType.Char,
|
|
("", "{0}.Replace(StringifySplit, \"|\")", "{0}.Replace(\"|\", StringifySplit)", "string",
|
|
typeof(string), typeof(string), "{0}", "GetString")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Varchar,
|
|
("", "{0}.Replace(StringifySplit, \"|\")", "{0}.Replace(\"|\", StringifySplit)", "string",
|
|
typeof(string), typeof(string), "{0}", "GetString")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Text,
|
|
("", "{0}.Replace(StringifySplit, \"|\")", "{0}.Replace(\"|\", StringifySplit)", "string",
|
|
typeof(string), typeof(string), "{0}", "GetString")
|
|
},
|
|
|
|
{
|
|
(int)NpgsqlDbType.Timestamp,
|
|
("(DateTime?)", "new DateTime(long.Parse({0}))", "{0}.Ticks.ToString()", "DateTime?",
|
|
typeof(DateTime), typeof(DateTime?), "{0}.Value", "GetDateTime")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.TimestampTz,
|
|
("(DateTime?)", "new DateTime(long.Parse({0}))", "{0}.Ticks.ToString()", "DateTime?",
|
|
typeof(DateTime), typeof(DateTime?), "{0}.Value", "GetDateTime")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Date,
|
|
("(DateTime?)", "new DateTime(long.Parse({0}))", "{0}.Ticks.ToString()", "DateTime?",
|
|
typeof(DateTime), typeof(DateTime?), "{0}.Value", "GetDateTime")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Time,
|
|
("(TimeSpan?)", "TimeSpan.Parse(double.Parse({0}))", "{0}.Ticks.ToString()", "TimeSpan?",
|
|
typeof(TimeSpan), typeof(TimeSpan?), "{0}.Value", "GetValue")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.TimeTz,
|
|
("(TimeSpan?)", "TimeSpan.Parse(double.Parse({0}))", "{0}.Ticks.ToString()", "TimeSpan?",
|
|
typeof(TimeSpan), typeof(TimeSpan?), "{0}.Value", "GetValue")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Interval,
|
|
("(TimeSpan?)", "TimeSpan.Parse(double.Parse({0}))", "{0}.Ticks.ToString()", "TimeSpan?",
|
|
typeof(TimeSpan), typeof(TimeSpan?), "{0}.Value", "GetValue")
|
|
},
|
|
|
|
{
|
|
(int)NpgsqlDbType.Boolean,
|
|
("(bool?)", "{0} == \"1\"", "{0} == true ? \"1\" : \"0\"", "bool?", typeof(bool), typeof(bool?),
|
|
"{0}.Value", "GetBoolean")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Bytea,
|
|
("(byte[])", "Convert.FromBase64String({0})", "Convert.ToBase64String({0})", "byte[]",
|
|
typeof(byte[]), typeof(byte[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Bit,
|
|
("(BitArray)", "{0}.ToBitArray()", "{0}.To1010()", "BitArray", typeof(BitArray),
|
|
typeof(BitArray), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Varbit,
|
|
("(BitArray)", "{0}.ToBitArray()", "{0}.To1010()", "BitArray", typeof(BitArray),
|
|
typeof(BitArray), "{0}", "GetValue")
|
|
},
|
|
|
|
{
|
|
(int)NpgsqlDbType.Point,
|
|
("(NpgsqlPoint?)", "NpgsqlPoint.Parse({0})", "{0}.ToString()", "NpgsqlPoint",
|
|
typeof(NpgsqlPoint), typeof(NpgsqlPoint?), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Line,
|
|
("(NpgsqlLine?)", "NpgsqlLine.Parse({0})", "{0}.ToString()", "NpgsqlLine", typeof(NpgsqlLine),
|
|
typeof(NpgsqlLine?), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.LSeg,
|
|
("(NpgsqlLSeg?)", "NpgsqlLSeg.Parse({0})", "{0}.ToString()", "NpgsqlLSeg", typeof(NpgsqlLSeg),
|
|
typeof(NpgsqlLSeg?), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Box,
|
|
("(NpgsqlBox?)", "NpgsqlBox.Parse({0})", "{0}.ToString()", "NpgsqlBox", typeof(NpgsqlBox),
|
|
typeof(NpgsqlBox?), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Path,
|
|
("(NpgsqlPath?)", "NpgsqlPath.Parse({0})", "{0}.ToString()", "NpgsqlPath", typeof(NpgsqlPath),
|
|
typeof(NpgsqlPath?), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Polygon,
|
|
("(NpgsqlPolygon?)", "NpgsqlPolygon.Parse({0})", "{0}.ToString()", "NpgsqlPolygon",
|
|
typeof(NpgsqlPolygon), typeof(NpgsqlPolygon?), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Circle,
|
|
("(NpgsqlCircle?)", "NpgsqlCircle.Parse({0})", "{0}.ToString()", "NpgsqlCircle",
|
|
typeof(NpgsqlCircle), typeof(NpgsqlCircle?), "{0}", "GetValue")
|
|
},
|
|
|
|
{
|
|
(int)NpgsqlDbType.Cidr,
|
|
("((IPAddress, int)?)", "(IPAddress, int)({0})", "{0}.ToString()", "(IPAddress, int)",
|
|
typeof((IPAddress, int)), typeof((IPAddress, int)?), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Inet,
|
|
("(IPAddress)", "IPAddress.Parse({0})", "{0}.ToString()", "IPAddress", typeof(IPAddress),
|
|
typeof(IPAddress), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.MacAddr,
|
|
("(PhysicalAddress?)", "PhysicalAddress.Parse({0})", "{0}.ToString()", "PhysicalAddress",
|
|
typeof(PhysicalAddress), typeof(PhysicalAddress), "{0}", "GetValue")
|
|
},
|
|
|
|
{
|
|
(int)NpgsqlDbType.Json,
|
|
("(JToken)", "JToken.Parse({0})", "{0}.ToString()", "JToken", typeof(JToken), typeof(JToken),
|
|
"{0}", "GetString")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Jsonb,
|
|
("(JToken)", "JToken.Parse({0})", "{0}.ToString()", "JToken", typeof(JToken), typeof(JToken),
|
|
"{0}", "GetString")
|
|
},
|
|
{
|
|
(int)NpgsqlDbType.Uuid,
|
|
("(Guid?)", "Guid.Parse({0})", "{0}.ToString()", "Guid", typeof(Guid), typeof(Guid?), "{0}",
|
|
"GetString")
|
|
},
|
|
|
|
{
|
|
(int)(NpgsqlDbType.Range | NpgsqlDbType.Integer),
|
|
("(NpgsqlRange<int>?)", "{0}.ToNpgsqlRange<int>()", "{0}.ToString()", "NpgsqlRange<int>",
|
|
typeof(NpgsqlRange<int>), typeof(NpgsqlRange<int>?), "{0}", "GetString")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Range | NpgsqlDbType.Bigint),
|
|
("(NpgsqlRange<long>?)", "{0}.ToNpgsqlRange<long>()", "{0}.ToString()", "NpgsqlRange<long>",
|
|
typeof(NpgsqlRange<long>), typeof(NpgsqlRange<long>?), "{0}", "GetString")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Range | NpgsqlDbType.Numeric),
|
|
("(NpgsqlRange<decimal>?)", "{0}.ToNpgsqlRange<decimal>()", "{0}.ToString()",
|
|
"NpgsqlRange<decimal>", typeof(NpgsqlRange<decimal>), typeof(NpgsqlRange<decimal>?), "{0}",
|
|
"GetString")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Range | NpgsqlDbType.Timestamp),
|
|
("(NpgsqlRange<DateTime>?)", "{0}.ToNpgsqlRange<DateTime>()", "{0}.ToString()",
|
|
"NpgsqlRange<DateTime>", typeof(NpgsqlRange<DateTime>), typeof(NpgsqlRange<DateTime>?),
|
|
"{0}", "GetString")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Range | NpgsqlDbType.TimestampTz),
|
|
("(NpgsqlRange<DateTime>?)", "{0}.ToNpgsqlRange<DateTime>()", "{0}.ToString()",
|
|
"NpgsqlRange<DateTime>", typeof(NpgsqlRange<DateTime>), typeof(NpgsqlRange<DateTime>?),
|
|
"{0}", "GetString")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Range | NpgsqlDbType.Date),
|
|
("(NpgsqlRange<DateTime>?)", "{0}.ToNpgsqlRange<DateTime>()", "{0}.ToString()",
|
|
"NpgsqlRange<DateTime>", typeof(NpgsqlRange<DateTime>), typeof(NpgsqlRange<DateTime>?),
|
|
"{0}", "GetString")
|
|
},
|
|
|
|
{
|
|
(int)NpgsqlDbType.Hstore,
|
|
("(Dictionary<string, string>)",
|
|
"JsonConvert.DeserializeObject<Dictionary<string, string>>({0})",
|
|
"JsonConvert.SerializeObject({0})", "Dictionary<string, string>",
|
|
typeof(Dictionary<string, string>), typeof(Dictionary<string, string>), "{0}", "GetValue")
|
|
},
|
|
|
|
/*** array ***/
|
|
|
|
{
|
|
(int)(NpgsqlDbType.Smallint | NpgsqlDbType.Array),
|
|
("(short[])", "JsonConvert.DeserializeObject<short[]>({0})", "JsonConvert.SerializeObject({0})",
|
|
"short[]", typeof(short[]), typeof(short[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Integer | NpgsqlDbType.Array),
|
|
("(int[])", "JsonConvert.DeserializeObject<int[]>({0})", "JsonConvert.SerializeObject({0})",
|
|
"int[]", typeof(int[]), typeof(int[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Bigint | NpgsqlDbType.Array),
|
|
("(long[])", "JsonConvert.DeserializeObject<long[]>({0})", "JsonConvert.SerializeObject({0})",
|
|
"long[]", typeof(long[]), typeof(long[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Numeric | NpgsqlDbType.Array),
|
|
("(decimal[])", "JsonConvert.DeserializeObject<decimal[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "decimal[]", typeof(decimal[]), typeof(decimal[]),
|
|
"{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Real | NpgsqlDbType.Array),
|
|
("(float[])", "JsonConvert.DeserializeObject<float[]>({0})", "JsonConvert.SerializeObject({0})",
|
|
"float[]", typeof(float[]), typeof(float[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Double | NpgsqlDbType.Array),
|
|
("(double[])", "JsonConvert.DeserializeObject<double[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "double[]", typeof(double[]), typeof(double[]), "{0}",
|
|
"GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Money | NpgsqlDbType.Array),
|
|
("(decimal[])", "JsonConvert.DeserializeObject<decimal[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "decimal[]", typeof(decimal[]), typeof(decimal[]),
|
|
"{0}", "GetValue")
|
|
},
|
|
|
|
{
|
|
(int)(NpgsqlDbType.Char | NpgsqlDbType.Array),
|
|
("(string[])", "JsonConvert.DeserializeObject<string[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "string[]", typeof(string[]), typeof(string[]), "{0}",
|
|
"GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Varchar | NpgsqlDbType.Array),
|
|
("(string[])", "JsonConvert.DeserializeObject<string[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "string[]", typeof(string[]), typeof(string[]), "{0}",
|
|
"GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Text | NpgsqlDbType.Array),
|
|
("(string[])", "JsonConvert.DeserializeObject<string[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "string[]", typeof(string[]), typeof(string[]), "{0}",
|
|
"GetValue")
|
|
},
|
|
|
|
{
|
|
(int)(NpgsqlDbType.Timestamp | NpgsqlDbType.Array),
|
|
("(DateTime[])", "JsonConvert.DeserializeObject<DateTime[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "DateTime[]", typeof(DateTime[]), typeof(DateTime[]),
|
|
"{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.TimestampTz | NpgsqlDbType.Array),
|
|
("(DateTime[])", "JsonConvert.DeserializeObject<DateTime[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "DateTime[]", typeof(DateTime[]), typeof(DateTime[]),
|
|
"{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Date | NpgsqlDbType.Array),
|
|
("(DateTime[])", "JsonConvert.DeserializeObject<DateTime[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "DateTime[]", typeof(DateTime[]), typeof(DateTime[]),
|
|
"{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Time | NpgsqlDbType.Array),
|
|
("(TimeSpan[])", "JsonConvert.DeserializeObject<TimeSpan[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "TimeSpan[]", typeof(TimeSpan[]), typeof(TimeSpan[]),
|
|
"{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.TimeTz | NpgsqlDbType.Array),
|
|
("(TimeSpan[])", "JsonConvert.DeserializeObject<TimeSpan[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "TimeSpan[]", typeof(TimeSpan[]), typeof(TimeSpan[]),
|
|
"{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Interval | NpgsqlDbType.Array),
|
|
("(TimeSpan[])", "JsonConvert.DeserializeObject<TimeSpan[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "TimeSpan[]", typeof(TimeSpan[]), typeof(TimeSpan[]),
|
|
"{0}", "GetValue")
|
|
},
|
|
|
|
{
|
|
(int)(NpgsqlDbType.Boolean | NpgsqlDbType.Array),
|
|
("(bool[])", "JsonConvert.DeserializeObject<bool[]>({0})", "JsonConvert.SerializeObject({0})",
|
|
"bool[]", typeof(bool[]), typeof(bool[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Bytea | NpgsqlDbType.Array),
|
|
("(byte[][])", "JsonConvert.DeserializeObject<byte[][]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "byte[][]", typeof(byte[][]), typeof(byte[][]), "{0}",
|
|
"GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Bit | NpgsqlDbType.Array),
|
|
("(BitArray[])", "JsonConvert.DeserializeObject<BitArray[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "BitArray[]", typeof(BitArray[]), typeof(BitArray[]),
|
|
"{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Varbit | NpgsqlDbType.Array),
|
|
("(BitArray[])", "JsonConvert.DeserializeObject<BitArray[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "BitArray[]", typeof(BitArray[]), typeof(BitArray[]),
|
|
"{0}", "GetValue")
|
|
},
|
|
|
|
{
|
|
(int)(NpgsqlDbType.Point | NpgsqlDbType.Array),
|
|
("(NpgsqlPoint[])", "JsonConvert.DeserializeObject<NpgsqlPoint[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "NpgsqlPoint[]", typeof(NpgsqlPoint[]),
|
|
typeof(NpgsqlPoint[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Line | NpgsqlDbType.Array),
|
|
("(NpgsqlLine[])", "JsonConvert.DeserializeObject<BNpgsqlLineitArray[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "NpgsqlLine[]", typeof(NpgsqlLine[]),
|
|
typeof(NpgsqlLine[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.LSeg | NpgsqlDbType.Array),
|
|
("(NpgsqlLSeg[])", "JsonConvert.DeserializeObject<NpgsqlLSeg[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "NpgsqlLSeg[]", typeof(NpgsqlLSeg[]),
|
|
typeof(NpgsqlLSeg[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Box | NpgsqlDbType.Array),
|
|
("(NpgsqlBox[])", "JsonConvert.DeserializeObject<NpgsqlBox[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "NpgsqlBox[]", typeof(NpgsqlBox[]), typeof(NpgsqlBox[]),
|
|
"{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Path | NpgsqlDbType.Array),
|
|
("(NpgsqlPath[])", "JsonConvert.DeserializeObject<NpgsqlPath[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "NpgsqlPath[]", typeof(NpgsqlPath[]),
|
|
typeof(NpgsqlPath[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Polygon | NpgsqlDbType.Array),
|
|
("(NpgsqlPolygon[])", "JsonConvert.DeserializeObject<NpgsqlPolygon[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "NpgsqlPolygon[]", typeof(NpgsqlPolygon[]),
|
|
typeof(NpgsqlPolygon[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Circle | NpgsqlDbType.Array),
|
|
("(NpgsqlCircle[])", "JsonConvert.DeserializeObject<NpgsqlCircle[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "NpgsqlCircle[]", typeof(NpgsqlCircle[]),
|
|
typeof(NpgsqlCircle[]), "{0}", "GetValue")
|
|
},
|
|
|
|
{
|
|
(int)(NpgsqlDbType.Cidr | NpgsqlDbType.Array),
|
|
("((IPAddress, int)[])", "JsonConvert.DeserializeObject<(IPAddress, int)[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "(IPAddress, int)[]", typeof((IPAddress, int)[]),
|
|
typeof((IPAddress, int)[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Inet | NpgsqlDbType.Array),
|
|
("(IPAddress[])", "JsonConvert.DeserializeObject<IPAddress[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "IPAddress[]", typeof(IPAddress[]), typeof(IPAddress[]),
|
|
"{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.MacAddr | NpgsqlDbType.Array),
|
|
("(PhysicalAddress[])", "JsonConvert.DeserializeObject<PhysicalAddress[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "PhysicalAddress[]", typeof(PhysicalAddress[]),
|
|
typeof(PhysicalAddress[]), "{0}", "GetValue")
|
|
},
|
|
|
|
{
|
|
(int)(NpgsqlDbType.Json | NpgsqlDbType.Array),
|
|
("(JToken[])", "JsonConvert.DeserializeObject<JToken[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "JToken[]", typeof(JToken[]), typeof(JToken[]), "{0}",
|
|
"GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Jsonb | NpgsqlDbType.Array),
|
|
("(JToken[])", "JsonConvert.DeserializeObject<JToken[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "JToken[]", typeof(JToken[]), typeof(JToken[]), "{0}",
|
|
"GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Uuid | NpgsqlDbType.Array),
|
|
("(Guid[])", "JsonConvert.DeserializeObject<Guid[]>({0})", "JsonConvert.SerializeObject({0})",
|
|
"Guid[]", typeof(Guid[]), typeof(Guid[]), "{0}", "GetValue")
|
|
},
|
|
|
|
{
|
|
(int)(NpgsqlDbType.Range | NpgsqlDbType.Integer | NpgsqlDbType.Array),
|
|
("(NpgsqlRange<int>[])", "JsonConvert.DeserializeObject<NpgsqlRange<int>[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "NpgsqlRange<int>[]", typeof(NpgsqlRange<int>[]),
|
|
typeof(NpgsqlRange<int>[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Range | NpgsqlDbType.Bigint | NpgsqlDbType.Array),
|
|
("(NpgsqlRange<long>[])", "JsonConvert.DeserializeObject<NpgsqlRange<long>[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "NpgsqlRange<long>[]", typeof(NpgsqlRange<long>[]),
|
|
typeof(NpgsqlRange<long>[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Range | NpgsqlDbType.Numeric | NpgsqlDbType.Array),
|
|
("(NpgsqlRange<decimal>[])", "JsonConvert.DeserializeObject<NpgsqlRange<decimal>[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "NpgsqlRange<decimal>[]",
|
|
typeof(NpgsqlRange<decimal>[]), typeof(NpgsqlRange<decimal>[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Range | NpgsqlDbType.Timestamp | NpgsqlDbType.Array),
|
|
("(NpgsqlRange<DateTime>[])", "JsonConvert.DeserializeObject<NpgsqlRange<DateTime>[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "NpgsqlRange<DateTime>[]",
|
|
typeof(NpgsqlRange<DateTime>[]), typeof(NpgsqlRange<DateTime>[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Range | NpgsqlDbType.TimestampTz | NpgsqlDbType.Array),
|
|
("(NpgsqlRange<DateTime>[])", "JsonConvert.DeserializeObject<NpgsqlRange<DateTime>[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "NpgsqlRange<DateTime>[]",
|
|
typeof(NpgsqlRange<DateTime>[]), typeof(NpgsqlRange<DateTime>[]), "{0}", "GetValue")
|
|
},
|
|
{
|
|
(int)(NpgsqlDbType.Range | NpgsqlDbType.Date | NpgsqlDbType.Array),
|
|
("(NpgsqlRange<DateTime>[])", "JsonConvert.DeserializeObject<NpgsqlRange<DateTime>[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "NpgsqlRange<DateTime>[]",
|
|
typeof(NpgsqlRange<DateTime>[]), typeof(NpgsqlRange<DateTime>[]), "{0}", "GetValue")
|
|
},
|
|
|
|
{
|
|
(int)(NpgsqlDbType.Hstore | NpgsqlDbType.Array),
|
|
("(Dictionary<string, string>[])",
|
|
"JsonConvert.DeserializeObject<Dictionary<string, string>[]>({0})",
|
|
"JsonConvert.SerializeObject({0})", "Dictionary<string, string>[]",
|
|
typeof(Dictionary<string, string>[]), typeof(Dictionary<string, string>[]), "{0}",
|
|
"GetValue")
|
|
},
|
|
};
|
|
|
|
public string GetCsConvert(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbType, out var trydc)
|
|
? (column.IsNullable ? trydc.csConvert : trydc.csConvert.Replace("?", ""))
|
|
: null;
|
|
|
|
public string GetCsParse(DbColumnInfo column) =>
|
|
_dicDbToCs.TryGetValue(column.DbType, out var trydc) ? trydc.csParse : null;
|
|
|
|
public string GetCsStringify(DbColumnInfo column) =>
|
|
_dicDbToCs.TryGetValue(column.DbType, out var trydc) ? trydc.csStringify : null;
|
|
|
|
public string GetCsType(DbColumnInfo column) => _dicDbToCs.TryGetValue(column.DbType, out var trydc)
|
|
? (column.IsNullable ? trydc.csType : trydc.csType.Replace("?", ""))
|
|
: null;
|
|
|
|
public Type GetCsTypeInfo(DbColumnInfo column) =>
|
|
_dicDbToCs.TryGetValue(column.DbType, out var trydc) ? trydc.csTypeInfo : 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 List<string> GetDatabases()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public bool ExistsTable(string name, bool ignoreCase)
|
|
{
|
|
if (string.IsNullOrEmpty(name)) return false;
|
|
var tbnameArray = _commonUtils.SplitTableName(name);
|
|
var tbname = string.Empty;
|
|
if (tbnameArray?.Length == 1)
|
|
tbname = tbnameArray.FirstOrDefault();
|
|
var resList = _orm.Ado.Query<string>(CommandType.Text, @"SHOW TABLES");
|
|
var res = false;
|
|
if (ignoreCase)
|
|
res = resList.Any(s => s.ToLower().Equals(tbname.ToLower()));
|
|
else
|
|
res = resList.Any(s => s.Equals(tbname));
|
|
return res;
|
|
}
|
|
|
|
public DbTableInfo GetTableByName(string name, bool ignoreCase = true)
|
|
{
|
|
var tableColumns = _orm.Ado.ExecuteDataTable($"SHOW COLUMNS FROM '{name}'");
|
|
List<DbColumnInfo> dbColumnInfos = new List<DbColumnInfo>();
|
|
var dbTableInfo = new DbTableInfo()
|
|
{
|
|
Name = name,
|
|
Columns = new List<DbColumnInfo>()
|
|
};
|
|
foreach (DataRow tableColumnsRow in tableColumns.Rows)
|
|
{
|
|
dbColumnInfos.Add(new DbColumnInfo()
|
|
{
|
|
Name = tableColumnsRow["column"].ToString(),
|
|
DbTypeText = tableColumnsRow["type"].ToString(),
|
|
Table = dbTableInfo,
|
|
});
|
|
}
|
|
|
|
dbTableInfo.Columns = dbColumnInfos;
|
|
return dbTableInfo;
|
|
}
|
|
|
|
public List<DbTableInfo> GetTablesByDatabase(params string[] database)
|
|
{
|
|
return GetTables(database, null, false);
|
|
}
|
|
|
|
public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
|
|
{
|
|
var resList = _orm.Ado.Query<string>(CommandType.Text, @"SHOW TABLES");
|
|
|
|
var tables = new List<DbTableInfo>();
|
|
|
|
resList.ForEach(s =>
|
|
{
|
|
var tableColumns = _orm.Ado.ExecuteDataTable($"SHOW COLUMNS FROM '{s}'");
|
|
List<DbColumnInfo> dbColumnInfos = new List<DbColumnInfo>();
|
|
var dbTableInfo = new DbTableInfo()
|
|
{
|
|
Name = s,
|
|
Columns = new List<DbColumnInfo>()
|
|
};
|
|
foreach (DataRow tableColumnsRow in tableColumns.Rows)
|
|
{
|
|
dbColumnInfos.Add(new DbColumnInfo()
|
|
{
|
|
Name = tableColumnsRow["column"].ToString(),
|
|
DbTypeText = tableColumnsRow["type"].ToString(),
|
|
Table = dbTableInfo,
|
|
});
|
|
}
|
|
|
|
dbTableInfo.Columns = dbColumnInfos;
|
|
tables.Add(dbTableInfo);
|
|
});
|
|
return tables;
|
|
}
|
|
|
|
public List<DbEnumInfo> GetEnumsByDatabase(params string[] database)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public static NativeTuple<bool, int, int> ParsePgVersion(string versionString, int v1, int v2)
|
|
{
|
|
int[] version = new int[] { 0, 0 };
|
|
var vmatch = Regex.Match(versionString, @"(\d+)\.(\d+)");
|
|
if (vmatch.Success)
|
|
{
|
|
version[0] = int.Parse(vmatch.Groups[1].Value);
|
|
version[1] = int.Parse(vmatch.Groups[2].Value);
|
|
}
|
|
else
|
|
{
|
|
vmatch = Regex.Match(versionString, @"(\d+)");
|
|
version[0] = int.Parse(vmatch.Groups[1].Value);
|
|
}
|
|
|
|
if (version[0] > v1)
|
|
return NativeTuple.Create(true, version[0], version[1]);
|
|
if (version[0] == v1 && version[1] >= v2)
|
|
return NativeTuple.Create(true, version[0], version[1]);
|
|
return NativeTuple.Create(false, version[0], version[1]);
|
|
}
|
|
}
|
|
} |