diff --git a/CodeGenerator/Generators/EnumsGen.cs b/CodeGenerator/Generators/EnumsGen.cs index 04dd6617..f4649b85 100644 --- a/CodeGenerator/Generators/EnumsGen.cs +++ b/CodeGenerator/Generators/EnumsGen.cs @@ -21,10 +21,6 @@ public enum {{name}} {{enumValuesDef}} } """)!; - - if (dbDriver.Options.UseDapper) - return [enumType]; - var enumExtensions = ParseMemberDeclaration($$""" public static class {{name}}Extensions { @@ -40,6 +36,11 @@ public static class {{name}}Extensions { return StringToEnum[me]; } + + public static {{name}}[] To{{name}}Arr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } """)!; return [enumType, enumExtensions]; diff --git a/CodegenTests/CodegenUtilsTests.cs b/CodegenTests/CodegenUtilsTests.cs index 377f67bd..3890e9e4 100644 --- a/CodegenTests/CodegenUtilsTests.cs +++ b/CodegenTests/CodegenUtilsTests.cs @@ -145,9 +145,6 @@ public void TestMysqlCopyFromGenerateUtilsMembers() var expected = new HashSet { MySqlConnectorDriver.NullToStringCsvConverter, - MySqlConnectorDriver.BoolToBitCsvConverter, - MySqlConnectorDriver.ByteCsvConverter, - MySqlConnectorDriver.ByteArrayCsvConverter }; var actual = members .FindAll(m => m is ClassDeclarationSyntax) diff --git a/Drivers/DbDriver.cs b/Drivers/DbDriver.cs index 01c0fb95..1225266d 100644 --- a/Drivers/DbDriver.cs +++ b/Drivers/DbDriver.cs @@ -21,7 +21,7 @@ public abstract class DbDriver public Dictionary> Enums { get; } - private IList Queries { get; } + protected IList Queries { get; } private HashSet NullableTypesInDotnetCore { get; } = [ @@ -59,15 +59,13 @@ public abstract class DbDriver public abstract Dictionary ColumnMappings { get; } protected const string JsonElementTypeHandler = - """ - public class JsonElementTypeHandler : SqlMapper.TypeHandler + """ + private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) { if (value is string s) return JsonDocument.Parse(s).RootElement; - if (value is null) - return default; throw new DataException($"Cannot convert {value?.GetType()} to JsonElement"); } @@ -76,7 +74,7 @@ public override void SetValue(IDbDataParameter parameter, JsonElement value) parameter.Value = value.GetRawText(); } } - """; + """; protected const string TransformQueryForSliceArgsImpl = """ public static string TransformQueryForSliceArgs(string originalSql, int sliceSize, string paramName) @@ -148,7 +146,7 @@ private ISet GetUsingDirectivesForColumnMappings() public virtual ISet GetUsingDirectivesForUtils() { - return new HashSet() + return new HashSet { "System.Linq" } @@ -158,20 +156,24 @@ public virtual ISet GetUsingDirectivesForUtils() public virtual ISet GetUsingDirectivesForModels() { - return GetUsingDirectivesForColumnMappings(); + return new HashSet + { + "System.Linq" + } + .AddRangeExcludeNulls(GetUsingDirectivesForColumnMappings()); } - public virtual string[] GetConstructorStatements() + public string[] GetConstructorStatements() { return [$"this.{Variable.ConnectionString.AsPropertyName()} = {Variable.ConnectionString.AsVarName()};"]; } - public virtual string[] GetTransactionConstructorStatements() + public string[] GetTransactionConstructorStatements() { return [$"this.{Variable.Transaction.AsPropertyName()} = {Variable.Transaction.AsVarName()};"]; } - protected ISet GetConfigureSqlMappings() + protected virtual ISet GetConfigureSqlMappings() { return ColumnMappings .Where(m => TypeExistsInQueries(m.Key) && m.Value.SqlMapper is not null) @@ -200,9 +202,15 @@ public static void ConfigureSqlMapper() protected bool TypeExistsInQueries(string csharpType) { - return Queries - .SelectMany(query => query.Columns) - .Any(column => csharpType == GetCsharpTypeWithoutNullableSuffix(column, null)); + return Queries.Any(q => TypeExistsInQuery(csharpType, q)); + } + + protected bool TypeExistsInQuery(string csharpType, Query query) + { + return query.Columns + .Any(column => csharpType == GetCsharpTypeWithoutNullableSuffix(column, query)) || + query.Params + .Any(p => csharpType == GetCsharpTypeWithoutNullableSuffix(p.Column, query)); } public string AddNullableSuffixIfNeeded(string csharpType, bool notNull) @@ -218,6 +226,16 @@ public string GetCsharpType(Column column, Query? query) return AddNullableSuffixIfNeeded(csharpType, IsColumnNotNull(column, query)); } + public string GetColumnSchema(Column column) + { + return column.Table.Schema == DefaultSchema ? string.Empty : column.Table.Schema; + } + + public virtual string GetEnumTypeAsCsharpType(Column column, Plugin.Enum enumType) + { + return column.Type.Name.ToModelName(GetColumnSchema(column), DefaultSchema); + } + public string GetCsharpTypeWithoutNullableSuffix(Column column, Query? query) { if (column.EmbedTable != null) @@ -226,8 +244,8 @@ public string GetCsharpTypeWithoutNullableSuffix(Column column, Query? query) if (string.IsNullOrEmpty(column.Type.Name)) return "object"; - if (IsEnumType(column)) - return column.Type.Name.ToModelName(column.Table.Schema, DefaultSchema); + if (GetEnumType(column) is { } enumType) + return GetEnumTypeAsCsharpType(column, enumType); if (FindOverrideForQueryColumn(query, column) is { CsharpType: var csharpType }) return csharpType.Type; @@ -242,14 +260,14 @@ public string GetCsharpTypeWithoutNullableSuffix(Column column, Query? query) throw new NotSupportedException($"Column {column.Name} has unsupported column type: {column.Type.Name}"); } - private bool IsEnumType(Column column) + public Plugin.Enum? GetEnumType(Column column) { if (column.Table is null) - return false; - var enumSchema = column.Table.Schema == DefaultSchema ? string.Empty : column.Table.Schema; - if (!Enums.TryGetValue(enumSchema, value: out var enumsInSchema)) - return false; - return enumsInSchema.ContainsKey(column.Type.Name); + return null; + var schemaName = GetColumnSchema(column); + if (!Enums.TryGetValue(schemaName, value: out var enumsInSchema)) + return null; + return enumsInSchema.GetValueOrDefault(column.Type.Name); } private static bool DoesColumnMappingApply(ColumnMapping columnMapping, Column column) @@ -269,16 +287,20 @@ private string GetColumnReader(CsharpTypeOption csharpTypeOption, int ordinal) throw new NotSupportedException($"Could not find column mapping for type override: {csharpTypeOption.Type}"); } - private string GetEnumReader(Column column, int ordinal) + private string GetEnumReader(Column column, int ordinal, Plugin.Enum enumType) { var enumName = column.Type.Name.ToModelName(column.Table.Schema, DefaultSchema); - return $"{Variable.Reader.AsVarName()}.GetString({ordinal}).To{enumName}()"; + var fullEnumType = GetEnumTypeAsCsharpType(column, enumType); + var readStmt = $"{Variable.Reader.AsVarName()}.GetString({ordinal})"; + if (fullEnumType.EndsWith("[]")) + return $"{readStmt}.To{enumName}Arr()"; + return $"{readStmt}.To{enumName}()"; } public string GetColumnReader(Column column, int ordinal, Query? query) { - if (IsEnumType(column)) - return GetEnumReader(column, ordinal); + if (GetEnumType(column) is { } enumType) + return GetEnumReader(column, ordinal, enumType); if (FindOverrideForQueryColumn(query, column) is { CsharpType: var csharpType }) return GetColumnReader(csharpType, ordinal); diff --git a/Drivers/Generators/CommonGen.cs b/Drivers/Generators/CommonGen.cs index 1f6ff72d..4a4a8892 100644 --- a/Drivers/Generators/CommonGen.cs +++ b/Drivers/Generators/CommonGen.cs @@ -21,10 +21,22 @@ public static string GetMethodParameterList(string argInterface, IEnumerable notNull ? el : $"{el} ?? (object)DBNull.Value"; - return dbDriver.Options.UseDapper ? null : defaultWriterFn; + if (dbDriver.GetEnumType(column) is { } enumType) + if (dbDriver.GetEnumTypeAsCsharpType(column, enumType).EndsWith("[]")) + return (el, notNull, isDapper) => + { + var stringJoinStmt = $"string.Join(\",\", {el})"; + var nullValue = isDapper ? "null" : "(object)DBNull.Value"; + return notNull + ? stringJoinStmt + : $"{el} != null ? {stringJoinStmt} : {nullValue}"; + }; + + string DefaultWriterFn(string el, bool notNull, bool isDapper) => notNull ? el : $"{el} ?? (object)DBNull.Value"; + return dbDriver.Options.UseDapper ? null : DefaultWriterFn; } + // TODO: extract AddWithValue statement generation to a method + possible override for Npgsql for type override public string AddParametersToCommand(Query query) { return query.Params.Select(p => diff --git a/Drivers/MySqlConnectorDriver.cs b/Drivers/MySqlConnectorDriver.cs index b02177a2..4d9afabf 100644 --- a/Drivers/MySqlConnectorDriver.cs +++ b/Drivers/MySqlConnectorDriver.cs @@ -26,6 +26,7 @@ public partial class MySqlConnectorDriver( public override Dictionary ColumnMappings { get; } = new() { + /* Numeric data types */ ["bool"] = new( new() { @@ -42,6 +43,16 @@ public partial class MySqlConnectorDriver( }, ordinal => $"reader.GetInt16({ordinal})" ), + ["int"] = new( + new() + { + { "int", new() }, + { "integer", new() }, + { "mediumint", new() } + }, + ordinal => $"reader.GetInt32({ordinal})", + convertFunc: x => $"Convert.ToInt32{x}" + ), ["long"] = new( new() { @@ -50,7 +61,24 @@ public partial class MySqlConnectorDriver( ordinal => $"reader.GetInt64({ordinal})", convertFunc: x => $"Convert.ToInt64{x}" ), - ["byte"] = new ColumnMapping( + ["double"] = new( + new() + { + { "double", new() }, + { "float", new() } + }, + ordinal => $"reader.GetDouble({ordinal})" + ), + ["decimal"] = new( + new() + { + { "decimal", new() } + }, + ordinal => $"reader.GetDecimal({ordinal})" + ), + + /* Binary data types */ + ["byte"] = new( new() { { "bit", new() } @@ -69,6 +97,8 @@ public partial class MySqlConnectorDriver( }, ordinal => $"reader.GetFieldValue({ordinal})" ), + + /* String data types */ ["string"] = new( new() { @@ -83,6 +113,8 @@ public partial class MySqlConnectorDriver( }, ordinal => $"reader.GetString({ordinal})" ), + + /* Date and time data types */ ["DateTime"] = new( new() { @@ -92,31 +124,8 @@ public partial class MySqlConnectorDriver( }, ordinal => $"reader.GetDateTime({ordinal})" ), - ["int"] = new( - new() - { - { "int", new() }, - { "integer", new() }, - { "mediumint", new() } - }, - ordinal => $"reader.GetInt32({ordinal})", - convertFunc: x => $"Convert.ToInt32{x}" - ), - ["double"] = new( - new() - { - { "double", new() }, - { "float", new() } - }, - ordinal => $"reader.GetDouble({ordinal})" - ), - ["decimal"] = new( - new() - { - { "decimal", new() } - }, - ordinal => $"reader.GetDecimal({ordinal})" - ), + + /* Unstructured data types */ ["JsonElement"] = new( new() { @@ -128,12 +137,14 @@ public partial class MySqlConnectorDriver( if (notNull) return $"{el}.GetRawText()"; var nullValue = isDapper ? "null" : "(object)DBNull.Value"; - return $"{el}.HasValue ? {el}.Value.GetRawText() : {nullValue}"; + return $"{el}?.GetRawText() ?? {nullValue}"; }, usingDirective: "System.Text.Json", sqlMapper: "SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler());", sqlMapperImpl: JsonElementTypeHandler ), + + /* Other data types */ ["object"] = new( new() { @@ -145,6 +156,24 @@ public partial class MySqlConnectorDriver( public override string TransactionClassName => "MySqlTransaction"; + private readonly Func _setTypeHandlerFunc = x => + $$""" + private class {{x}}TypeHandler : SqlMapper.TypeHandler<{{x}}[]> + { + public override {{x}}[] Parse(object value) + { + if (value is string s) + return s.To{{x}}Arr(); + throw new DataException($"Cannot convert {value?.GetType()} to {{x}}[]"); + } + + public override void SetValue(IDbDataParameter parameter, {{x}}[] value) + { + parameter.Value = string.Join(",", value); + } + } + """; + public override ISet GetUsingDirectivesForQueries() { return base @@ -193,18 +222,70 @@ public override ISet GetUsingDirectivesForUtils() ); } + private bool IsSetType(Column column) + { + var enumType = GetEnumType(column); + return enumType is not null && IsEnumOfTypeSet(column, enumType); + } + + protected override ISet GetConfigureSqlMappings() + { + var setSqlMappings = Queries + .SelectMany(q => q.Columns) + .Where(IsSetType) + .Select(c => + { + var enumName = c.Type.Name.ToModelName(GetColumnSchema(c), DefaultSchema); + return $"SqlMapper.AddTypeHandler(typeof({enumName}[]), new {enumName}TypeHandler());"; + }) + .Distinct(); + + return base + .GetConfigureSqlMappings() + .AddRangeExcludeNulls(setSqlMappings); + } + + private MemberDeclarationSyntax[] GetSetTypeHandlers() + { + return Queries + .SelectMany(q => q.Columns) + .Where(c => + { + var enumType = GetEnumType(c); + return enumType is not null && IsEnumOfTypeSet(c, enumType); + }) + .Select(c => _setTypeHandlerFunc(c.Type.Name.ToModelName(GetColumnSchema(c), DefaultSchema))) + .Distinct() + .Select(m => ParseMemberDeclaration(m)!) + .ToArray(); + } + public override MemberDeclarationSyntax[] GetMemberDeclarationsForUtils() { var memberDeclarations = base .GetMemberDeclarationsForUtils() - .AddRangeIf([ParseMemberDeclaration(TransformQueryForSliceArgsImpl)!], SliceQueryExists()); + .AddRangeIf([ParseMemberDeclaration(TransformQueryForSliceArgsImpl)!], SliceQueryExists()) + .AddRangeIf(GetSetTypeHandlers(), Options.UseDapper); if (!CopyFromQueryExists()) - return [.. memberDeclarations]; + return memberDeclarations.ToArray(); - var csvConverters = new List + foreach (var query in Queries) { - ParseMemberDeclaration($$""" + if (query.Cmd != ":copyfrom") + continue; + foreach (var p in query.Params) + { + if (!IsSetType(p.Column)) + continue; + var enumName = p.Column.Type.Name.ToModelName(GetColumnSchema(p.Column), DefaultSchema); + memberDeclarations = memberDeclarations.AddRangeExcludeNulls([ParseMemberDeclaration(SetCsvConverterFunc(enumName))!]); + } + } + + return memberDeclarations + .AddRangeIf([ + ParseMemberDeclaration($$""" public class {{NullToStringCsvConverter}} : DefaultTypeConverter { public override {{AddNullableSuffixIfNeeded("string", false)}} ConvertToString( @@ -214,6 +295,8 @@ public class {{NullToStringCsvConverter}} : DefaultTypeConverter } } """)!, + ], CopyFromQueryExists()) + .AddRangeIf([ ParseMemberDeclaration($$""" public class BoolToBitCsvConverter : DefaultTypeConverter { @@ -232,7 +315,9 @@ public class BoolToBitCsvConverter : DefaultTypeConverter } } """)!, - ParseMemberDeclaration($$""" + ], CopyFromQueryExists() && TypeExistsInQueries("bool")) + .AddRangeIf([ + ParseMemberDeclaration($$""" public class ByteCsvConverter : DefaultTypeConverter { public override {{AddNullableSuffixIfNeeded("string", false)}} ConvertToString( @@ -246,7 +331,9 @@ public class ByteCsvConverter : DefaultTypeConverter } } """)!, - ParseMemberDeclaration($$""" + ], CopyFromQueryExists() && TypeExistsInQueries("byte")) + .AddRangeIf([ + ParseMemberDeclaration($$""" public class ByteArrayCsvConverter : DefaultTypeConverter { public override {{AddNullableSuffixIfNeeded("string", false)}} ConvertToString( @@ -259,10 +346,25 @@ public class ByteArrayCsvConverter : DefaultTypeConverter return base.ConvertToString(value, row, memberMapData); } } - """)! - }; + """)!, + ], CopyFromQueryExists() && TypeExistsInQueries("byte[]")) + .ToArray(); - return [.. memberDeclarations, .. csvConverters]; + string SetCsvConverterFunc(string x) => + $$""" + public class {{x}}CsvConverter : DefaultTypeConverter + { + public override {{AddNullableSuffixIfNeeded("string", false)}} ConvertToString( + {{AddNullableSuffixIfNeeded("object", false)}} value, IWriterRow row, MemberMapData memberMapData) + { + if (value == null) + return @"\N"; + if (value is {{x}}[] arrVal) + return string.Join(",", arrVal); + return base.ConvertToString(value, row, memberMapData); + } + } + """; } public override ConnectionGenCommands EstablishConnection(Query query) @@ -364,7 +466,7 @@ public string GetCopyFromImpl(Query query, string queryTextConstant) var {{optionsVar}} = new TypeConverterOptions { Formats = new[] { supportedDateTimeFormat } }; {{csvWriterVar}}.Context.TypeConverterOptionsCache.AddOptions({{optionsVar}}); {{csvWriterVar}}.Context.TypeConverterOptionsCache.AddOptions({{optionsVar}}); - {{GetBoolAndByteConverters().JoinByNewLine()}} + {{GetBoolAndByteConverters(query).JoinByNewLine()}} {{GetCsvNullConverters(query).JoinByNewLine()}} await {{csvWriterVar}}.WriteRecordsAsync({{Variable.Args.AsVarName()}}); } @@ -404,7 +506,10 @@ private ISet GetCsvNullConverters(Query query) foreach (var p in query.Params) { var csharpType = GetCsharpTypeWithoutNullableSuffix(p.Column, query); - if (!BoolAndByteTypes.Contains(csharpType) && TypeExistsInQueries(csharpType)) + if ( + !BoolAndByteTypes.Contains(csharpType) && + !IsSetType(p.Column) && + TypeExistsInQuery(csharpType, query)) { var nullableCsharpType = AddNullableSuffixIfNeeded(csharpType, false); converters.Add($"{Variable.CsvWriter.AsVarName()}.Context.TypeConverterCache.AddConverter<{nullableCsharpType}>({nullConverterFn});"); @@ -413,7 +518,7 @@ private ISet GetCsvNullConverters(Query query) return converters; } - private ISet GetBoolAndByteConverters() + private ISet GetBoolAndByteConverters(Query query) { var csvWriterVar = Variable.CsvWriter.AsVarName(); return new HashSet() @@ -422,21 +527,49 @@ private ISet GetBoolAndByteConverters() $"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded("bool", true)}>(new Utils.{BoolToBitCsvConverter}());", $"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded("bool", false)}>(new Utils.{BoolToBitCsvConverter}());" ], - TypeExistsInQueries("bool") + TypeExistsInQuery("bool", query) ) .AddRangeIf( [ $"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded("byte", true)}>(new Utils.{ByteCsvConverter}());", $"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded("byte", false)}>(new Utils.{ByteCsvConverter}());", ], - TypeExistsInQueries("byte") + TypeExistsInQuery("byte", query) ) .AddRangeIf( [ $"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded("byte[]", true)}>(new Utils.{ByteArrayCsvConverter}());", $"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded("byte[]", false)}>(new Utils.{ByteArrayCsvConverter}());", ], - TypeExistsInQueries("byte[]") - ); + TypeExistsInQuery("byte[]", query) + ) + .AddRangeExcludeNulls(GetSetConverters(query)); + } + + private ISet GetSetConverters(Query query) + { + var converters = new HashSet(); + foreach (var p in query.Params) + { + if (!IsSetType(p.Column)) + continue; + + var enumName = p.Column.Type.Name.ToModelName(GetColumnSchema(p.Column), DefaultSchema); + var csvWriterVar = Variable.CsvWriter.AsVarName(); + converters.Add($"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded($"{enumName}[]", true)}>(new Utils.{enumName}CsvConverter());"); + converters.Add($"{csvWriterVar}.Context.TypeConverterCache.AddConverter<{AddNullableSuffixIfNeeded($"{enumName}[]", false)}>(new Utils.{enumName}CsvConverter());"); + } + return converters; + } + + private static bool IsEnumOfTypeSet(Column column, Plugin.Enum enumType) + { + return column.Length > enumType.Vals.Select(v => v.Length).Sum(); + } + + public override string GetEnumTypeAsCsharpType(Column column, Plugin.Enum enumType) + { + var enumName = column.Type.Name.ToModelName(GetColumnSchema(column), DefaultSchema); + return IsEnumOfTypeSet(column, enumType) ? $"{enumName}[]" : enumName; } } \ No newline at end of file diff --git a/Drivers/NpgsqlDriver.cs b/Drivers/NpgsqlDriver.cs index cb9837b8..a707ac46 100644 --- a/Drivers/NpgsqlDriver.cs +++ b/Drivers/NpgsqlDriver.cs @@ -34,6 +34,37 @@ public NpgsqlDriver( public sealed override Dictionary ColumnMappings { get; } = new() { + /* Numeric data types */ + ["bool"] = new( + new() + { + { "bool", new() }, + { "boolean", new() } + }, + readerFn: ordinal => $"reader.GetBoolean({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + ), + ["short"] = new( + new() + { + { "int2", new() } + }, + readerFn: ordinal => $"reader.GetInt16({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + convertFunc: x => $"Convert.ToInt16({x})" + ), + ["int"] = new( + new() + { + { "integer", new() }, + { "int", new() }, + { "int4", new() }, + { "serial", new() } + }, + readerFn: ordinal => $"reader.GetInt32({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + convertFunc: x => $"Convert.ToInt32({x})" + ), ["long"] = new( new() { @@ -45,21 +76,34 @@ public NpgsqlDriver( readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", convertFunc: x => $"Convert.ToInt64({x})" ), - ["byte[]"] = new( + ["float"] = new( new() { - { "binary", new() }, - { "bit", new() }, - { "bytea", new() }, - { "blob", new() }, - { "longblob", new() }, - { "mediumblob", new() }, - { "tinyblob", new() }, - { "varbinary", new() } + { "float4", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + readerFn: ordinal => $"reader.GetFloat({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + ), + ["decimal"] = new( + new() + { + { "numeric", new() }, + { "decimal", new() }, + { "money", new(NpgsqlTypeOverride: "NpgsqlDbType.Money") } + }, + readerFn: ordinal => $"reader.GetDecimal({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + ), + ["double"] = new( + new() + { + { "float8", new() } + }, + readerFn: ordinal => $"reader.GetDouble({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" ), + + /* String data types */ ["string"] = new( new() { @@ -69,21 +113,14 @@ public NpgsqlDriver( { "bpchar", new() }, { "tinytext", new() }, { "varchar", new() }, - { "jsonpath", new(NpgsqlTypeOverride: "NpgsqlDbType.JsonPath") }, - { "macaddr8", new(NpgsqlTypeOverride: "NpgsqlDbType.MacAddr8") } + { "jsonpath", new() }, + { "macaddr8", new() } }, readerFn: ordinal => $"reader.GetString({ordinal})", readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" ), - ["Guid"] = new( - new() - { - { "uuid", new() } - }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", - convertFunc: x => $"Guid.Parse({x}?.ToString())" - ), + + /* Date and time data types */ ["TimeSpan"] = new( new() { @@ -103,6 +140,8 @@ public NpgsqlDriver( readerFn: ordinal => $"reader.GetDateTime({ordinal})", readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" ), + + /* Unstructured data types */ ["JsonElement"] = new( new() { @@ -121,62 +160,32 @@ public NpgsqlDriver( sqlMapper: "SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler());", sqlMapperImpl: JsonElementTypeHandler ), - ["short"] = new( + ["XmlDocument"] = new( new() { - { "int2", new() } + { "xml", new(NpgsqlTypeOverride: "NpgsqlDbType.Xml") } }, - readerFn: ordinal => $"reader.GetInt16({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", - convertFunc: x => $"Convert.ToInt16({x})" - ), - ["int"] = new( - new() - { - { "integer", new() }, - { "int", new() }, - { "int4", new() }, - { "serial", new() } - }, - readerFn: ordinal => $"reader.GetInt32({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", - convertFunc: x => $"Convert.ToInt32({x})" - ), - ["float"] = new( - new() - { - { "float4", new() } - }, - readerFn: ordinal => $"reader.GetFloat({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" - ), - ["decimal"] = new( - new() - { - { "numeric", new() }, - { "decimal", new() }, - { "money", new(NpgsqlTypeOverride: "NpgsqlDbType.Money") } - }, - readerFn: ordinal => $"reader.GetDecimal({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" - ), - ["double"] = new( - new() - { - { "float8", new() } - }, - readerFn: ordinal => $"reader.GetDouble({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" - ), - ["bool"] = new( - new() + readerFn: ordinal => $$""" + (new Func((r, o) => + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(r.GetString(o)); + return xmlDoc; + }))({{Variable.Reader.AsVarName()}}, {{ordinal}}) + """, + writerFn: (el, notNull, isDapper) => { - { "bool", new() }, - { "boolean", new() } + if (notNull) + return $"{el}.OuterXml"; + var nullValue = isDapper ? "null" : "(object)DBNull.Value"; + return $"{el} != null ? {el}.OuterXml : {nullValue}"; }, - readerFn: ordinal => $"reader.GetBoolean({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + usingDirective: "System.Xml", + sqlMapper: "SqlMapper.AddTypeHandler(typeof(XmlDocument), new XmlDocumentTypeHandler());", + sqlMapperImpl: XmlDocumentTypeHandler ), + + /* Geometric data types */ ["NpgsqlPoint"] = new( new() { @@ -247,6 +256,8 @@ public NpgsqlDriver( usingDirective: "NpgsqlTypes", sqlMapper: "RegisterNpgsqlTypeHandler();" ), + + /* Network data types */ ["NpgsqlCidr"] = new( new() { @@ -277,6 +288,32 @@ public NpgsqlDriver( usingDirective: "System.Net.NetworkInformation", sqlMapper: "RegisterNpgsqlTypeHandler();" ), + + /* Other data types */ + ["Guid"] = new( + new() + { + { "uuid", new() } + }, + readerFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + convertFunc: x => $"Guid.Parse({x}?.ToString())" + ), + ["byte[]"] = new( + new() + { + { "binary", new() }, + { "bit", new() }, + { "bytea", new() }, + { "blob", new() }, + { "longblob", new() }, + { "mediumblob", new() }, + { "tinyblob", new() }, + { "varbinary", new() } + }, + readerFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + ), ["object"] = new( new() { @@ -288,6 +325,28 @@ public NpgsqlDriver( public override string TransactionClassName => "NpgsqlTransaction"; + protected const string XmlDocumentTypeHandler = + """ + private class XmlDocumentTypeHandler : SqlMapper.TypeHandler + { + public override XmlDocument Parse(object value) + { + if (value is string s) + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(s); + return xmlDoc; + } + throw new DataException($"Cannot convert {value?.GetType()} to XmlDocument"); + } + + public override void SetValue(IDbDataParameter parameter, XmlDocument value) + { + parameter.Value = value.OuterXml; + } + } + """; + public override ISet GetUsingDirectivesForQueries() { return base.GetUsingDirectivesForQueries().AddRangeExcludeNulls( diff --git a/Drivers/Variable.cs b/Drivers/Variable.cs index 1fbcc8ab..b6fd98d6 100644 --- a/Drivers/Variable.cs +++ b/Drivers/Variable.cs @@ -14,6 +14,7 @@ public enum Variable Loader, CsvWriter, NullConverterFn, + SetConverterFn, Args, QueryParams, diff --git a/docs/03_Usage.md b/docs/03_Usage.md index 23df9433..208c31a2 100644 --- a/docs/03_Usage.md +++ b/docs/03_Usage.md @@ -31,6 +31,7 @@ overrides: ## Supported Features - тЬЕ means the feature is fully supported. +- тЪая╕П means SQLC does not yet support this feature, so it cannot be supported by the plugin yet. - ЁЯЪл means the database does not support the feature. - тЭМ means the feature is not supported by the plugin (but could be supported by the database). diff --git a/docs/04_Postgres.md b/docs/04_Postgres.md index 24534496..2f980017 100644 --- a/docs/04_Postgres.md +++ b/docs/04_Postgres.md @@ -55,9 +55,9 @@ we consider support for the different data types separately for batch inserts an | path | тЬЕ | тЬЕ | | polygon | тЬЕ | тЬЕ | | circle | тЬЕ | тЬЕ | -| cidr | тЬЕ | тЭМ | -| inet | тЬЕ | тЭМ | -| macaddr | тЬЕ | тЭМ | +| cidr | тЬЕ | тЬЕ | +| inet | тЬЕ | тЬЕ | +| macaddr | тЬЕ | тЬЕ | | macaddr8 | тЬЕ | тЭМ | | tsvector | тЭМ | тЭМ | | tsquery | тЭМ | тЭМ | @@ -65,7 +65,7 @@ we consider support for the different data types separately for batch inserts an | json | тЬЕ | тЭМ | | jsonb | тЬЕ | тЭМ | | jsonpath | тЬЕ | тЭМ | -| xml | тЭМ | тЭМ | +| xml | тЬЕ | тЭМ | | enum | тЭМ | тЭМ | *** `time with time zone` is not useful and not recommended to use by Postgres themselves - diff --git a/docs/05_MySql.md b/docs/05_MySql.md index dac6800b..6aef8aaa 100644 --- a/docs/05_MySql.md +++ b/docs/05_MySql.md @@ -41,45 +41,45 @@ Since in batch insert the data is not validated by the SQL itself but written an we consider support for the different data types separately for batch inserts and everything else. | DB Type | Supported? | Supported in Batch? | -|---------------------------|------------|---------------------| -| bool, boolean, tinyint(1) | тЬЕ | тЬЕ | -| bit | тЬЕ | тЬЕ | -| tinyint | тЬЕ | тЬЕ | -| smallint | тЬЕ | тЬЕ | -| mediumint | тЬЕ | тЬЕ | -| integer, int | тЬЕ | тЬЕ | -| bigint | тЬЕ | тЬЕ | -| real | тЬЕ | тЬЕ | -| numeric | тЬЕ | тЬЕ | -| decimal | тЬЕ | тЬЕ | -| double precision | тЬЕ | тЬЕ | -| year | тЬЕ | тЬЕ | -| date | тЬЕ | тЬЕ | -| timestamp | тЬЕ | тЬЕ | -| char | тЬЕ | тЬЕ | -| nchar, national char | тЬЕ | тЬЕ | -| varchar | тЬЕ | тЬЕ | -| tinytext | тЬЕ | тЬЕ | -| mediumtext | тЬЕ | тЬЕ | -| text | тЬЕ | тЬЕ | -| longtext | тЬЕ | тЬЕ | -| binary | тЬЕ | тЬЕ | -| varbinary | тЬЕ | тЬЕ | -| tinyblob | тЬЕ | тЬЕ | -| blob | тЬЕ | тЬЕ | -| mediumblob | тЬЕ | тЬЕ | -| longblob | тЬЕ | тЬЕ | -| enum | тЬЕ | тЬЕ | -| set | тЭМ | тЭМ | -| json | тЬЕ | тЬЕ | -| geometry | тЭМ | тЭМ | -| point | тЭМ | тЭМ | -| linestring | тЭМ | тЭМ | -| polygon | тЭМ | тЭМ | -| multipoint | тЭМ | тЭМ | -| multilinestring | тЭМ | тЭМ | -| multipolygon | тЭМ | тЭМ | -| geometrycollection | тЭМ | тЭМ | +|---------------------------|----|-------------| +| bool, boolean, tinyint(1) | тЬЕ | тЬЕ | +| bit | тЬЕ | тЬЕ | +| tinyint | тЬЕ | тЬЕ | +| smallint | тЬЕ | тЬЕ | +| mediumint | тЬЕ | тЬЕ | +| integer, int | тЬЕ | тЬЕ | +| bigint | тЬЕ | тЬЕ | +| real | тЬЕ | тЬЕ | +| numeric | тЬЕ | тЬЕ | +| decimal | тЬЕ | тЬЕ | +| double precision | тЬЕ | тЬЕ | +| year | тЬЕ | тЬЕ | +| date | тЬЕ | тЬЕ | +| timestamp | тЬЕ | тЬЕ | +| char | тЬЕ | тЬЕ | +| nchar, national char | тЬЕ | тЬЕ | +| varchar | тЬЕ | тЬЕ | +| tinytext | тЬЕ | тЬЕ | +| mediumtext | тЬЕ | тЬЕ | +| text | тЬЕ | тЬЕ | +| longtext | тЬЕ | тЬЕ | +| binary | тЬЕ | тЬЕ | +| varbinary | тЬЕ | тЬЕ | +| tinyblob | тЬЕ | тЬЕ | +| blob | тЬЕ | тЬЕ | +| mediumblob | тЬЕ | тЬЕ | +| longblob | тЬЕ | тЬЕ | +| enum | тЬЕ | тЬЕ | +| set | тЬЕ | тЬЕ | +| json | тЬЕ | тЬЕ | +| geometry | тЪая╕П | тЪая╕П | +| point | тЪая╕П | тЪая╕П | +| linestring | тЪая╕П | тЪая╕П | +| polygon | тЪая╕П | тЪая╕П | +| multipoint | тЪая╕П | тЪая╕П | +| multilinestring | тЪая╕П | тЪая╕П | +| multipolygon | тЪая╕П | тЪая╕П | +| geometrycollection | тЪая╕П | тЪая╕П | diff --git a/end2end/EndToEndScaffold/Config.cs b/end2end/EndToEndScaffold/Config.cs index 880bdd8c..9fcca5fb 100644 --- a/end2end/EndToEndScaffold/Config.cs +++ b/end2end/EndToEndScaffold/Config.cs @@ -50,12 +50,14 @@ public enum KnownTestType PostgresFloatingPointCopyFrom, PostgresDateTimeCopyFrom, PostgresGuidCopyFrom, + PostgresNetworkCopyFrom, PostgresArrayCopyFrom, PostgresGeoDataTypes, PostgresGeoCopyFrom, PostgresNetworkDataTypes, PostgresJsonDataTypes, PostgresInvalidJson, + PostgresXmlDataTypes, ArrayAsParam, MultipleArraysAsParams, @@ -202,6 +204,7 @@ internal static class Config KnownTestType.PostgresJsonDataTypes, KnownTestType.PostgresInvalidJson, KnownTestType.PostgresNetworkDataTypes, + KnownTestType.PostgresXmlDataTypes, KnownTestType.PostgresStringCopyFrom, KnownTestType.PostgresIntegerCopyFrom, @@ -209,6 +212,7 @@ internal static class Config KnownTestType.PostgresDateTimeCopyFrom, KnownTestType.PostgresGuidCopyFrom, KnownTestType.PostgresArrayCopyFrom, + KnownTestType.PostgresNetworkCopyFrom, ] } }, @@ -244,6 +248,7 @@ internal static class Config KnownTestType.PostgresJsonDataTypes, KnownTestType.PostgresInvalidJson, KnownTestType.PostgresNetworkDataTypes, + KnownTestType.PostgresXmlDataTypes, KnownTestType.PostgresStringCopyFrom, KnownTestType.PostgresIntegerCopyFrom, @@ -251,6 +256,7 @@ internal static class Config KnownTestType.PostgresDateTimeCopyFrom, KnownTestType.PostgresGuidCopyFrom, KnownTestType.PostgresArrayCopyFrom, + KnownTestType.PostgresNetworkCopyFrom ] } }, diff --git a/end2end/EndToEndScaffold/Program.cs b/end2end/EndToEndScaffold/Program.cs index 469ffab3..1e3c3d1a 100644 --- a/end2end/EndToEndScaffold/Program.cs +++ b/end2end/EndToEndScaffold/Program.cs @@ -42,8 +42,9 @@ private static string GetFileContents(string testClassName, bool isLegacyDotnet) var optionalUsingPostgresTypes = config.TestNamespace.Contains("Npgsql") ? "using NpgsqlTypes;" : string.Empty; var optionalUsingSystemNet = config.TestNamespace.Contains("Npgsql") ? "using System.Net;" : string.Empty; var optionalUsingSystemNetNetworkInformation = config.TestNamespace.Contains("Npgsql") ? "using System.Net.NetworkInformation;" : string.Empty; - var namespaceToTest = isLegacyDotnet ? config.LegacyTestNamespace : config.TestNamespace; var optionalUsingSystemTextJson = config.TestNamespace.Contains("MySqlConnector") || config.TestNamespace.Contains("Npgsql") ? "using System.Text.Json;" : string.Empty; + var optionalUsingSystemXml = config.TestNamespace.Contains("Npgsql") ? "using System.Xml;" : string.Empty; + var namespaceToTest = isLegacyDotnet ? config.LegacyTestNamespace : config.TestNamespace; return ParseCompilationUnit( $$""" @@ -52,6 +53,7 @@ private static string GetFileContents(string testClassName, bool isLegacyDotnet) {{optionalUsingSystemNet}} {{optionalUsingSystemNetNetworkInformation}} {{optionalUsingSystemTextJson}} + {{optionalUsingSystemXml}} using NUnit.Framework; using NUnit.Framework.Legacy; using System; diff --git a/end2end/EndToEndScaffold/Templates/MySqlTests.cs b/end2end/EndToEndScaffold/Templates/MySqlTests.cs index d8c7fd81..76dbcf15 100644 --- a/end2end/EndToEndScaffold/Templates/MySqlTests.cs +++ b/end2end/EndToEndScaffold/Templates/MySqlTests.cs @@ -250,21 +250,31 @@ void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow { Impl = $$""" [Test] - [TestCase(MysqlTypesCEnum.Medium)] - [TestCase(null)] - public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum) + [TestCase(MysqlTypesCEnum.Medium, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(null, null)] + public async Task TestMySqlStringTypes( + MysqlTypesCEnum? cEnum, + MysqlTypesCSet[] cSet) { await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }); var expected = new QuerySql.GetMysqlTypesRow { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypes(); - Assert.That(actual{{Consts.UnknownRecordValuePlaceholder}}.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); + + void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow y) + { + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } """ }, @@ -592,25 +602,37 @@ public async Task TestMySqlTransactionRollback() { Impl = $$""" [Test] - [TestCase(100, MysqlTypesCEnum.Big)] - [TestCase(500, MysqlTypesCEnum.Small)] - [TestCase(10, null)] - public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum) + [TestCase(100, MysqlTypesCEnum.Big, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(500, MysqlTypesCEnum.Small, new[] { MysqlTypesCSet.Milk })] + [TestCase(10, null, null)] + public async Task TestCopyFrom( + int batchSize, + MysqlTypesCEnum? cEnum, + MysqlTypesCSet[] cSet) { var batchArgs = Enumerable.Range(0, batchSize) .Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }) .ToList(); await QuerySql.InsertMysqlTypesBatch(batchArgs); var expected = new QuerySql.GetMysqlTypesCntRow { Cnt = batchSize, - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypesCnt(); - Assert.That(actual{{Consts.UnknownRecordValuePlaceholder}}.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); + + void AssertSingularEquals(QuerySql.GetMysqlTypesCntRow x, QuerySql.GetMysqlTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } """ }, @@ -624,25 +646,30 @@ await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = {{Consts.BojackAuthor}}, Name = {{Consts.BojackBookTitle}}, - BioType = ExtendedBiosBioType.Memoir + BioType = ExtendedBiosBioType.Memoir, + AuthorType = new ExtendedBiosAuthorType[] { ExtendedBiosAuthorType.Author, ExtendedBiosAuthorType.Translator } }); var expected = new QuerySql.GetFirstExtendedBioByTypeRow { AuthorName = {{Consts.BojackAuthor}}, Name = {{Consts.BojackBookTitle}}, - BioType = ExtendedBiosBioType.Memoir + BioType = ExtendedBiosBioType.Memoir, + AuthorType = new ExtendedBiosAuthorType[] { ExtendedBiosAuthorType.Author, ExtendedBiosAuthorType.Translator } }; var actual = await this.QuerySql.GetFirstExtendedBioByType(new QuerySql.GetFirstExtendedBioByTypeArgs { BioType = ExtendedBiosBioType.Memoir }); - Assert.That(SingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}})); + AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); } - private static bool SingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) + private void AssertSingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) { - return x.AuthorName.Equals(y.AuthorName) && x.Name.Equals(y.Name) && x.BioType.Equals(y.BioType); + Assert.That(x.AuthorName, Is.EqualTo(y.AuthorName)); + Assert.That(x.Name, Is.EqualTo(y.Name)); + Assert.That(x.BioType, Is.EqualTo(y.BioType)); + Assert.That(x.AuthorType, Is.EqualTo(y.AuthorType)); } """ }, diff --git a/end2end/EndToEndScaffold/Templates/PostgresTests.cs b/end2end/EndToEndScaffold/Templates/PostgresTests.cs index 30c25be6..52cbc6c3 100644 --- a/end2end/EndToEndScaffold/Templates/PostgresTests.cs +++ b/end2end/EndToEndScaffold/Templates/PostgresTests.cs @@ -225,7 +225,7 @@ public async Task TestPostgresArrayTypes( DateTime[] cDateArray, DateTime[] cTimestampArray) { - await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs + await QuerySql.InsertPostgresArrayTypes(new QuerySql.InsertPostgresArrayTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, @@ -236,7 +236,7 @@ await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs CTimestampArray = cTimestampArray }); - var expected = new QuerySql.GetPostgresTypesRow + var expected = new QuerySql.GetPostgresArrayTypesRow { CBytea = cBytea, CBooleanArray = cBooleanArray, @@ -246,10 +246,10 @@ await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs CDateArray = cDateArray, CTimestampArray = cTimestampArray }; - var actual = await QuerySql.GetPostgresTypes(); + var actual = await QuerySql.GetPostgresArrayTypes(); AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); - void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesRow x, QuerySql.GetPostgresArrayTypesRow y) { Assert.That(x.CBytea, Is.EqualTo(y.CBytea)); Assert.That(x.CTextArray, Is.EqualTo(y.CTextArray)); @@ -525,7 +525,6 @@ public void TestPostgresInvalidJson() } """ }, - [KnownTestType.PostgresNetworkDataTypes] = new TestImpl { Impl = $$""" @@ -598,21 +597,25 @@ public async Task TestArrayCopyFrom( byte[] cBytea) { var batchArgs = Enumerable.Range(0, batchSize) - .Select(_ => new QuerySql.InsertPostgresTypesBatchArgs + .Select(_ => new QuerySql.InsertPostgresArrayTypesBatchArgs { CBytea = cBytea }) .ToList(); - await QuerySql.InsertPostgresTypesBatch(batchArgs); - var expected = new QuerySql.GetPostgresTypesCntRow + await QuerySql.InsertPostgresArrayTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresArrayTypesCntRow { Cnt = batchSize, CBytea = cBytea }; - var actual = await QuerySql.GetPostgresTypesCnt(); + + var actual = await QuerySql.GetPostgresArrayTypesCnt(); + AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); - Assert.That(actual{{Consts.UnknownRecordValuePlaceholder}}.Cnt, Is.EqualTo(expected.Cnt)); - Assert.That(actual{{Consts.UnknownRecordValuePlaceholder}}.CBytea, Is.EqualTo(expected.CBytea)); + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesCntRow x, QuerySql.GetPostgresArrayTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + } } """ }, @@ -954,6 +957,103 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre } } """ + }, + [KnownTestType.PostgresXmlDataTypes] = new TestImpl + { + Impl = $$""" + [Test] + [TestCase("Good morning xml, the world says hello")] + [TestCase(null)] + public async Task TestPostgresXmlDataTypes(string cXml) + { + XmlDocument parsedXml = null; + if (cXml != null) + { + parsedXml = new XmlDocument(); + parsedXml.LoadXml(cXml); + } + + await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs + { + CXml = parsedXml + }); + + var expected = new QuerySql.GetPostgresTypesRow + { + CXml = parsedXml + }; + + var actual = await QuerySql.GetPostgresTypes(); + AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); + + void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + { + if (x.CXml == null && y.CXml == null) + return; + Assert.That(x.CXml.OuterXml, Is.EqualTo(y.CXml.OuterXml)); + } + } + """ + }, + [KnownTestType.PostgresNetworkCopyFrom] = new TestImpl + { + Impl = $$""" + private static IEnumerable PostgresNetworkCopyFromTestCases + { + get + { + yield return new TestCaseData( + 200, + new NpgsqlCidr("192.168.1.0/24"), + new IPAddress(new byte[] { 192, 168, 1, 1 }), + new PhysicalAddress(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 }) + ).SetName("Valid Network Copy From"); + yield return new TestCaseData( + 10, + null, + null, + null + ).SetName("Null Network Copy From"); + } + } + + [Test] + [TestCaseSource(nameof(PostgresNetworkCopyFromTestCases))] + public async Task TestPostgresNetworkCopyFrom( + int batchSize, + NpgsqlCidr? cCidr, + IPAddress cInet, + PhysicalAddress cMacaddr) + { + var batchArgs = Enumerable.Range(0, batchSize) + .Select(_ => new QuerySql.InsertPostgresTypesBatchArgs + { + CCidr = cCidr, + CInet = cInet, + CMacaddr = cMacaddr + }) + .ToList(); + await QuerySql.InsertPostgresTypesBatch(batchArgs); + + var expected = new QuerySql.GetPostgresTypesCntRow + { + Cnt = batchSize, + CCidr = cCidr, + CInet = cInet, + CMacaddr = cMacaddr + }; + var actual = await QuerySql.GetPostgresTypesCnt(); + AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); + + void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CCidr, Is.EqualTo(y.CCidr)); + Assert.That(x.CInet, Is.EqualTo(y.CInet)); + Assert.That(x.CMacaddr, Is.EqualTo(y.CMacaddr)); + } + } + """ } }; } \ No newline at end of file diff --git a/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs b/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs index 41ed65a2..bbd69996 100644 --- a/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs +++ b/end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs @@ -474,17 +474,23 @@ void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow } [Test] - [TestCase(MysqlTypesCEnum.Medium)] - [TestCase(null)] - public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum) + [TestCase(MysqlTypesCEnum.Medium, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(null, null)] + public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum }); + await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum, CSet = cSet }); var expected = new QuerySql.GetMysqlTypesRow { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypes(); - Assert.That(actual.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow y) + { + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } [Test] @@ -513,20 +519,28 @@ private static void AssertSingularEquals(QuerySql.GetMysqlFunctionsRow expected, [Test] public async Task TestMySqlScopedSchemaEnum() { - await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir }); + await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir, AuthorType = new ExtendedBiosAuthorType[] { ExtendedBiosAuthorType.Author, ExtendedBiosAuthorType.Translator } }); var expected = new QuerySql.GetFirstExtendedBioByTypeRow { AuthorName = "Bojack Horseman", Name = "One Trick Pony", - BioType = ExtendedBiosBioType.Memoir + BioType = ExtendedBiosBioType.Memoir, + AuthorType = new ExtendedBiosAuthorType[] + { + ExtendedBiosAuthorType.Author, + ExtendedBiosAuthorType.Translator + } }; var actual = await this.QuerySql.GetFirstExtendedBioByType(new QuerySql.GetFirstExtendedBioByTypeArgs { BioType = ExtendedBiosBioType.Memoir }); - Assert.That(SingularEquals(expected, actual)); + AssertSingularEquals(expected, actual); } - private static bool SingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) + private void AssertSingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) { - return x.AuthorName.Equals(y.AuthorName) && x.Name.Equals(y.Name) && x.BioType.Equals(y.BioType); + Assert.That(x.AuthorName, Is.EqualTo(y.AuthorName)); + Assert.That(x.Name, Is.EqualTo(y.Name)); + Assert.That(x.BioType, Is.EqualTo(y.BioType)); + Assert.That(x.AuthorType, Is.EqualTo(y.AuthorType)); } [Test] @@ -738,20 +752,27 @@ public async Task TestBinaryCopyFrom(int batchSize, byte? cBit, byte[] cBinary, } [Test] - [TestCase(100, MysqlTypesCEnum.Big)] - [TestCase(500, MysqlTypesCEnum.Small)] - [TestCase(10, null)] - public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum) + [TestCase(100, MysqlTypesCEnum.Big, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(500, MysqlTypesCEnum.Small, new[] { MysqlTypesCSet.Milk })] + [TestCase(10, null, null)] + public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum }).ToList(); + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum, CSet = cSet }).ToList(); await QuerySql.InsertMysqlTypesBatch(batchArgs); var expected = new QuerySql.GetMysqlTypesCntRow { Cnt = batchSize, - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypesCnt(); - Assert.That(actual.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetMysqlTypesCntRow x, QuerySql.GetMysqlTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } } } diff --git a/end2end/EndToEndTests/MySqlConnectorTester.generated.cs b/end2end/EndToEndTests/MySqlConnectorTester.generated.cs index 039ec10d..97605d41 100644 --- a/end2end/EndToEndTests/MySqlConnectorTester.generated.cs +++ b/end2end/EndToEndTests/MySqlConnectorTester.generated.cs @@ -474,17 +474,23 @@ void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow } [Test] - [TestCase(MysqlTypesCEnum.Medium)] - [TestCase(null)] - public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum) + [TestCase(MysqlTypesCEnum.Medium, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(null, null)] + public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum }); + await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum, CSet = cSet }); var expected = new QuerySql.GetMysqlTypesRow { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypes(); - Assert.That(actual.Value.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual.Value); + void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow y) + { + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } [Test] @@ -513,20 +519,28 @@ private static void AssertSingularEquals(QuerySql.GetMysqlFunctionsRow expected, [Test] public async Task TestMySqlScopedSchemaEnum() { - await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir }); + await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir, AuthorType = new ExtendedBiosAuthorType[] { ExtendedBiosAuthorType.Author, ExtendedBiosAuthorType.Translator } }); var expected = new QuerySql.GetFirstExtendedBioByTypeRow { AuthorName = "Bojack Horseman", Name = "One Trick Pony", - BioType = ExtendedBiosBioType.Memoir + BioType = ExtendedBiosBioType.Memoir, + AuthorType = new ExtendedBiosAuthorType[] + { + ExtendedBiosAuthorType.Author, + ExtendedBiosAuthorType.Translator + } }; var actual = await this.QuerySql.GetFirstExtendedBioByType(new QuerySql.GetFirstExtendedBioByTypeArgs { BioType = ExtendedBiosBioType.Memoir }); - Assert.That(SingularEquals(expected, actual.Value)); + AssertSingularEquals(expected, actual.Value); } - private static bool SingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) + private void AssertSingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) { - return x.AuthorName.Equals(y.AuthorName) && x.Name.Equals(y.Name) && x.BioType.Equals(y.BioType); + Assert.That(x.AuthorName, Is.EqualTo(y.AuthorName)); + Assert.That(x.Name, Is.EqualTo(y.Name)); + Assert.That(x.BioType, Is.EqualTo(y.BioType)); + Assert.That(x.AuthorType, Is.EqualTo(y.AuthorType)); } [Test] @@ -738,20 +752,27 @@ public async Task TestBinaryCopyFrom(int batchSize, byte? cBit, byte[] cBinary, } [Test] - [TestCase(100, MysqlTypesCEnum.Big)] - [TestCase(500, MysqlTypesCEnum.Small)] - [TestCase(10, null)] - public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum) + [TestCase(100, MysqlTypesCEnum.Big, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(500, MysqlTypesCEnum.Small, new[] { MysqlTypesCSet.Milk })] + [TestCase(10, null, null)] + public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum }).ToList(); + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum, CSet = cSet }).ToList(); await QuerySql.InsertMysqlTypesBatch(batchArgs); var expected = new QuerySql.GetMysqlTypesCntRow { Cnt = batchSize, - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypesCnt(); - Assert.That(actual.Value.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual.Value); + void AssertSingularEquals(QuerySql.GetMysqlTypesCntRow x, QuerySql.GetMysqlTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } } } diff --git a/end2end/EndToEndTests/NpgsqlDapperTester.cs b/end2end/EndToEndTests/NpgsqlDapperTester.cs index 2a702193..425855b6 100644 --- a/end2end/EndToEndTests/NpgsqlDapperTester.cs +++ b/end2end/EndToEndTests/NpgsqlDapperTester.cs @@ -16,5 +16,6 @@ public async Task EmptyTestsTable() await QuerySql.TruncateAuthors(); await QuerySql.TruncatePostgresTypes(); await QuerySql.TruncatePostgresGeoTypes(); + await QuerySql.TruncatePostgresArrayTypes(); } } \ No newline at end of file diff --git a/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs b/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs index 10e8eeef..7acfb102 100644 --- a/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs +++ b/end2end/EndToEndTests/NpgsqlDapperTester.generated.cs @@ -3,6 +3,7 @@ using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; using NUnit.Framework; using NUnit.Framework.Legacy; using System; @@ -405,8 +406,8 @@ private static IEnumerable PostgresArrayTypesTestCases [TestCaseSource(nameof(PostgresArrayTypesTestCases))] public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, string[] cTextArray, int[] cIntegerArray, decimal[] cDecimalArray, DateTime[] cDateArray, DateTime[] cTimestampArray) { - await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); - var expected = new QuerySql.GetPostgresTypesRow + await QuerySql.InsertPostgresArrayTypes(new QuerySql.InsertPostgresArrayTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); + var expected = new QuerySql.GetPostgresArrayTypesRow { CBytea = cBytea, CBooleanArray = cBooleanArray, @@ -416,9 +417,9 @@ public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, st CDateArray = cDateArray, CTimestampArray = cTimestampArray }; - var actual = await QuerySql.GetPostgresTypes(); + var actual = await QuerySql.GetPostgresArrayTypes(); AssertSingularEquals(expected, actual); - void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesRow x, QuerySql.GetPostgresArrayTypesRow y) { Assert.That(x.CBytea, Is.EqualTo(y.CBytea)); Assert.That(x.CTextArray, Is.EqualTo(y.CTextArray)); @@ -660,22 +661,58 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre } } + private static IEnumerable PostgresNetworkCopyFromTestCases + { + get + { + yield return new TestCaseData(200, new NpgsqlCidr("192.168.1.0/24"), new IPAddress(new byte[] { 192, 168, 1, 1 }), new PhysicalAddress(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 })).SetName("Valid Network Copy From"); + yield return new TestCaseData(10, null, null, null).SetName("Null Network Copy From"); + } + } + + [Test] + [TestCaseSource(nameof(PostgresNetworkCopyFromTestCases))] + public async Task TestPostgresNetworkCopyFrom(int batchSize, NpgsqlCidr? cCidr, IPAddress cInet, PhysicalAddress cMacaddr) + { + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CCidr = cCidr, CInet = cInet, CMacaddr = cMacaddr }).ToList(); + await QuerySql.InsertPostgresTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresTypesCntRow + { + Cnt = batchSize, + CCidr = cCidr, + CInet = cInet, + CMacaddr = cMacaddr + }; + var actual = await QuerySql.GetPostgresTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CCidr, Is.EqualTo(y.CCidr)); + Assert.That(x.CInet, Is.EqualTo(y.CInet)); + Assert.That(x.CMacaddr, Is.EqualTo(y.CMacaddr)); + } + } + [Test] [TestCase(100, new byte[] { 0x53, 0x56 })] [TestCase(10, new byte[] { })] [TestCase(10, null)] public async Task TestArrayCopyFrom(int batchSize, byte[] cBytea) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CBytea = cBytea }).ToList(); - await QuerySql.InsertPostgresTypesBatch(batchArgs); - var expected = new QuerySql.GetPostgresTypesCntRow + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresArrayTypesBatchArgs { CBytea = cBytea }).ToList(); + await QuerySql.InsertPostgresArrayTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresArrayTypesCntRow { Cnt = batchSize, CBytea = cBytea }; - var actual = await QuerySql.GetPostgresTypesCnt(); - Assert.That(actual.Cnt, Is.EqualTo(expected.Cnt)); - Assert.That(actual.CBytea, Is.EqualTo(expected.CBytea)); + var actual = await QuerySql.GetPostgresArrayTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesCntRow x, QuerySql.GetPostgresArrayTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + } } private static IEnumerable PostgresGeoTypesTestCases @@ -825,6 +862,33 @@ public void TestPostgresInvalidJson() Assert.ThrowsAsync(async () => await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CJsonpath = "SOME INVALID JSONPATH" })); } + [Test] + [TestCase("Good morning xml, the world says hello")] + [TestCase(null)] + public async Task TestPostgresXmlDataTypes(string cXml) + { + XmlDocument parsedXml = null; + if (cXml != null) + { + parsedXml = new XmlDocument(); + parsedXml.LoadXml(cXml); + } + + await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CXml = parsedXml }); + var expected = new QuerySql.GetPostgresTypesRow + { + CXml = parsedXml + }; + var actual = await QuerySql.GetPostgresTypes(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + { + if (x.CXml == null && y.CXml == null) + return; + Assert.That(x.CXml.OuterXml, Is.EqualTo(y.CXml.OuterXml)); + } + } + [Test] public async Task TestArray() { diff --git a/end2end/EndToEndTests/NpgsqlTester.cs b/end2end/EndToEndTests/NpgsqlTester.cs index 2eb7aa13..39093f3e 100644 --- a/end2end/EndToEndTests/NpgsqlTester.cs +++ b/end2end/EndToEndTests/NpgsqlTester.cs @@ -16,5 +16,6 @@ public async Task EmptyTestsTables() await QuerySql.TruncateAuthors(); await QuerySql.TruncatePostgresTypes(); await QuerySql.TruncatePostgresGeoTypes(); + await QuerySql.TruncatePostgresArrayTypes(); } } \ No newline at end of file diff --git a/end2end/EndToEndTests/NpgsqlTester.generated.cs b/end2end/EndToEndTests/NpgsqlTester.generated.cs index e4cae233..0bf4630a 100644 --- a/end2end/EndToEndTests/NpgsqlTester.generated.cs +++ b/end2end/EndToEndTests/NpgsqlTester.generated.cs @@ -3,6 +3,7 @@ using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; using NUnit.Framework; using NUnit.Framework.Legacy; using System; @@ -405,8 +406,8 @@ private static IEnumerable PostgresArrayTypesTestCases [TestCaseSource(nameof(PostgresArrayTypesTestCases))] public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, string[] cTextArray, int[] cIntegerArray, decimal[] cDecimalArray, DateTime[] cDateArray, DateTime[] cTimestampArray) { - await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); - var expected = new QuerySql.GetPostgresTypesRow + await QuerySql.InsertPostgresArrayTypes(new QuerySql.InsertPostgresArrayTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); + var expected = new QuerySql.GetPostgresArrayTypesRow { CBytea = cBytea, CBooleanArray = cBooleanArray, @@ -416,9 +417,9 @@ public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, st CDateArray = cDateArray, CTimestampArray = cTimestampArray }; - var actual = await QuerySql.GetPostgresTypes(); + var actual = await QuerySql.GetPostgresArrayTypes(); AssertSingularEquals(expected, actual.Value); - void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesRow x, QuerySql.GetPostgresArrayTypesRow y) { Assert.That(x.CBytea, Is.EqualTo(y.CBytea)); Assert.That(x.CTextArray, Is.EqualTo(y.CTextArray)); @@ -660,22 +661,58 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre } } + private static IEnumerable PostgresNetworkCopyFromTestCases + { + get + { + yield return new TestCaseData(200, new NpgsqlCidr("192.168.1.0/24"), new IPAddress(new byte[] { 192, 168, 1, 1 }), new PhysicalAddress(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 })).SetName("Valid Network Copy From"); + yield return new TestCaseData(10, null, null, null).SetName("Null Network Copy From"); + } + } + + [Test] + [TestCaseSource(nameof(PostgresNetworkCopyFromTestCases))] + public async Task TestPostgresNetworkCopyFrom(int batchSize, NpgsqlCidr? cCidr, IPAddress cInet, PhysicalAddress cMacaddr) + { + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CCidr = cCidr, CInet = cInet, CMacaddr = cMacaddr }).ToList(); + await QuerySql.InsertPostgresTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresTypesCntRow + { + Cnt = batchSize, + CCidr = cCidr, + CInet = cInet, + CMacaddr = cMacaddr + }; + var actual = await QuerySql.GetPostgresTypesCnt(); + AssertSingularEquals(expected, actual.Value); + void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CCidr, Is.EqualTo(y.CCidr)); + Assert.That(x.CInet, Is.EqualTo(y.CInet)); + Assert.That(x.CMacaddr, Is.EqualTo(y.CMacaddr)); + } + } + [Test] [TestCase(100, new byte[] { 0x53, 0x56 })] [TestCase(10, new byte[] { })] [TestCase(10, null)] public async Task TestArrayCopyFrom(int batchSize, byte[] cBytea) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CBytea = cBytea }).ToList(); - await QuerySql.InsertPostgresTypesBatch(batchArgs); - var expected = new QuerySql.GetPostgresTypesCntRow + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresArrayTypesBatchArgs { CBytea = cBytea }).ToList(); + await QuerySql.InsertPostgresArrayTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresArrayTypesCntRow { Cnt = batchSize, CBytea = cBytea }; - var actual = await QuerySql.GetPostgresTypesCnt(); - Assert.That(actual.Value.Cnt, Is.EqualTo(expected.Cnt)); - Assert.That(actual.Value.CBytea, Is.EqualTo(expected.CBytea)); + var actual = await QuerySql.GetPostgresArrayTypesCnt(); + AssertSingularEquals(expected, actual.Value); + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesCntRow x, QuerySql.GetPostgresArrayTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + } } private static IEnumerable PostgresGeoTypesTestCases @@ -825,6 +862,33 @@ public void TestPostgresInvalidJson() Assert.ThrowsAsync(async () => await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CJsonpath = "SOME INVALID JSONPATH" })); } + [Test] + [TestCase("Good morning xml, the world says hello")] + [TestCase(null)] + public async Task TestPostgresXmlDataTypes(string cXml) + { + XmlDocument parsedXml = null; + if (cXml != null) + { + parsedXml = new XmlDocument(); + parsedXml.LoadXml(cXml); + } + + await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CXml = parsedXml }); + var expected = new QuerySql.GetPostgresTypesRow + { + CXml = parsedXml + }; + var actual = await QuerySql.GetPostgresTypes(); + AssertSingularEquals(expected, actual.Value); + void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + { + if (x.CXml == null && y.CXml == null) + return; + Assert.That(x.CXml.OuterXml, Is.EqualTo(y.CXml.OuterXml)); + } + } + [Test] public async Task TestArray() { diff --git a/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs b/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs index 96096318..02515ada 100644 --- a/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.generated.cs @@ -474,17 +474,23 @@ void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow } [Test] - [TestCase(MysqlTypesCEnum.Medium)] - [TestCase(null)] - public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum) + [TestCase(MysqlTypesCEnum.Medium, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(null, null)] + public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum }); + await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum, CSet = cSet }); var expected = new QuerySql.GetMysqlTypesRow { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypes(); - Assert.That(actual.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow y) + { + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } [Test] @@ -513,20 +519,28 @@ private static void AssertSingularEquals(QuerySql.GetMysqlFunctionsRow expected, [Test] public async Task TestMySqlScopedSchemaEnum() { - await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir }); + await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir, AuthorType = new ExtendedBiosAuthorType[] { ExtendedBiosAuthorType.Author, ExtendedBiosAuthorType.Translator } }); var expected = new QuerySql.GetFirstExtendedBioByTypeRow { AuthorName = "Bojack Horseman", Name = "One Trick Pony", - BioType = ExtendedBiosBioType.Memoir + BioType = ExtendedBiosBioType.Memoir, + AuthorType = new ExtendedBiosAuthorType[] + { + ExtendedBiosAuthorType.Author, + ExtendedBiosAuthorType.Translator + } }; var actual = await this.QuerySql.GetFirstExtendedBioByType(new QuerySql.GetFirstExtendedBioByTypeArgs { BioType = ExtendedBiosBioType.Memoir }); - Assert.That(SingularEquals(expected, actual)); + AssertSingularEquals(expected, actual); } - private static bool SingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) + private void AssertSingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) { - return x.AuthorName.Equals(y.AuthorName) && x.Name.Equals(y.Name) && x.BioType.Equals(y.BioType); + Assert.That(x.AuthorName, Is.EqualTo(y.AuthorName)); + Assert.That(x.Name, Is.EqualTo(y.Name)); + Assert.That(x.BioType, Is.EqualTo(y.BioType)); + Assert.That(x.AuthorType, Is.EqualTo(y.AuthorType)); } [Test] @@ -738,20 +752,27 @@ public async Task TestBinaryCopyFrom(int batchSize, byte? cBit, byte[] cBinary, } [Test] - [TestCase(100, MysqlTypesCEnum.Big)] - [TestCase(500, MysqlTypesCEnum.Small)] - [TestCase(10, null)] - public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum) + [TestCase(100, MysqlTypesCEnum.Big, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(500, MysqlTypesCEnum.Small, new[] { MysqlTypesCSet.Milk })] + [TestCase(10, null, null)] + public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum }).ToList(); + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum, CSet = cSet }).ToList(); await QuerySql.InsertMysqlTypesBatch(batchArgs); var expected = new QuerySql.GetMysqlTypesCntRow { Cnt = batchSize, - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypesCnt(); - Assert.That(actual.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetMysqlTypesCntRow x, QuerySql.GetMysqlTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } } } diff --git a/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs b/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs index 90cf6073..b47d9870 100644 --- a/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/MySqlConnectorTester.generated.cs @@ -474,17 +474,23 @@ void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow } [Test] - [TestCase(MysqlTypesCEnum.Medium)] - [TestCase(null)] - public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum) + [TestCase(MysqlTypesCEnum.Medium, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(null, null)] + public async Task TestMySqlStringTypes(MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum }); + await QuerySql.InsertMysqlTypes(new QuerySql.InsertMysqlTypesArgs { CEnum = cEnum, CSet = cSet }); var expected = new QuerySql.GetMysqlTypesRow { - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypes(); - Assert.That(actual.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetMysqlTypesRow x, QuerySql.GetMysqlTypesRow y) + { + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } [Test] @@ -513,20 +519,28 @@ private static void AssertSingularEquals(QuerySql.GetMysqlFunctionsRow expected, [Test] public async Task TestMySqlScopedSchemaEnum() { - await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir }); + await this.QuerySql.CreateExtendedBio(new QuerySql.CreateExtendedBioArgs { AuthorName = "Bojack Horseman", Name = "One Trick Pony", BioType = ExtendedBiosBioType.Memoir, AuthorType = new ExtendedBiosAuthorType[] { ExtendedBiosAuthorType.Author, ExtendedBiosAuthorType.Translator } }); var expected = new QuerySql.GetFirstExtendedBioByTypeRow { AuthorName = "Bojack Horseman", Name = "One Trick Pony", - BioType = ExtendedBiosBioType.Memoir + BioType = ExtendedBiosBioType.Memoir, + AuthorType = new ExtendedBiosAuthorType[] + { + ExtendedBiosAuthorType.Author, + ExtendedBiosAuthorType.Translator + } }; var actual = await this.QuerySql.GetFirstExtendedBioByType(new QuerySql.GetFirstExtendedBioByTypeArgs { BioType = ExtendedBiosBioType.Memoir }); - Assert.That(SingularEquals(expected, actual)); + AssertSingularEquals(expected, actual); } - private static bool SingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) + private void AssertSingularEquals(QuerySql.GetFirstExtendedBioByTypeRow x, QuerySql.GetFirstExtendedBioByTypeRow y) { - return x.AuthorName.Equals(y.AuthorName) && x.Name.Equals(y.Name) && x.BioType.Equals(y.BioType); + Assert.That(x.AuthorName, Is.EqualTo(y.AuthorName)); + Assert.That(x.Name, Is.EqualTo(y.Name)); + Assert.That(x.BioType, Is.EqualTo(y.BioType)); + Assert.That(x.AuthorType, Is.EqualTo(y.AuthorType)); } [Test] @@ -738,20 +752,27 @@ public async Task TestBinaryCopyFrom(int batchSize, byte? cBit, byte[] cBinary, } [Test] - [TestCase(100, MysqlTypesCEnum.Big)] - [TestCase(500, MysqlTypesCEnum.Small)] - [TestCase(10, null)] - public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum) + [TestCase(100, MysqlTypesCEnum.Big, new[] { MysqlTypesCSet.Tea, MysqlTypesCSet.Coffee })] + [TestCase(500, MysqlTypesCEnum.Small, new[] { MysqlTypesCSet.Milk })] + [TestCase(10, null, null)] + public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum, MysqlTypesCSet[] cSet) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum }).ToList(); + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertMysqlTypesBatchArgs { CEnum = cEnum, CSet = cSet }).ToList(); await QuerySql.InsertMysqlTypesBatch(batchArgs); var expected = new QuerySql.GetMysqlTypesCntRow { Cnt = batchSize, - CEnum = cEnum + CEnum = cEnum, + CSet = cSet }; var actual = await QuerySql.GetMysqlTypesCnt(); - Assert.That(actual.CEnum, Is.EqualTo(expected.CEnum)); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetMysqlTypesCntRow x, QuerySql.GetMysqlTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CEnum, Is.EqualTo(y.CEnum)); + Assert.That(x.CSet, Is.EqualTo(y.CSet)); + } } } } diff --git a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.cs b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.cs index afd0968b..faf30835 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.cs @@ -16,6 +16,7 @@ public async Task EmptyTestsTable() await QuerySql.TruncateAuthors(); await QuerySql.TruncatePostgresTypes(); await QuerySql.TruncatePostgresGeoTypes(); + await QuerySql.TruncatePostgresArrayTypes(); } } } \ No newline at end of file diff --git a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs index 9ecb0435..c96eab8b 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlDapperTester.generated.cs @@ -3,6 +3,7 @@ using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; using NUnit.Framework; using NUnit.Framework.Legacy; using System; @@ -405,8 +406,8 @@ private static IEnumerable PostgresArrayTypesTestCases [TestCaseSource(nameof(PostgresArrayTypesTestCases))] public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, string[] cTextArray, int[] cIntegerArray, decimal[] cDecimalArray, DateTime[] cDateArray, DateTime[] cTimestampArray) { - await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); - var expected = new QuerySql.GetPostgresTypesRow + await QuerySql.InsertPostgresArrayTypes(new QuerySql.InsertPostgresArrayTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); + var expected = new QuerySql.GetPostgresArrayTypesRow { CBytea = cBytea, CBooleanArray = cBooleanArray, @@ -416,9 +417,9 @@ public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, st CDateArray = cDateArray, CTimestampArray = cTimestampArray }; - var actual = await QuerySql.GetPostgresTypes(); + var actual = await QuerySql.GetPostgresArrayTypes(); AssertSingularEquals(expected, actual); - void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesRow x, QuerySql.GetPostgresArrayTypesRow y) { Assert.That(x.CBytea, Is.EqualTo(y.CBytea)); Assert.That(x.CTextArray, Is.EqualTo(y.CTextArray)); @@ -660,22 +661,58 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre } } + private static IEnumerable PostgresNetworkCopyFromTestCases + { + get + { + yield return new TestCaseData(200, new NpgsqlCidr("192.168.1.0/24"), new IPAddress(new byte[] { 192, 168, 1, 1 }), new PhysicalAddress(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 })).SetName("Valid Network Copy From"); + yield return new TestCaseData(10, null, null, null).SetName("Null Network Copy From"); + } + } + + [Test] + [TestCaseSource(nameof(PostgresNetworkCopyFromTestCases))] + public async Task TestPostgresNetworkCopyFrom(int batchSize, NpgsqlCidr? cCidr, IPAddress cInet, PhysicalAddress cMacaddr) + { + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CCidr = cCidr, CInet = cInet, CMacaddr = cMacaddr }).ToList(); + await QuerySql.InsertPostgresTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresTypesCntRow + { + Cnt = batchSize, + CCidr = cCidr, + CInet = cInet, + CMacaddr = cMacaddr + }; + var actual = await QuerySql.GetPostgresTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CCidr, Is.EqualTo(y.CCidr)); + Assert.That(x.CInet, Is.EqualTo(y.CInet)); + Assert.That(x.CMacaddr, Is.EqualTo(y.CMacaddr)); + } + } + [Test] [TestCase(100, new byte[] { 0x53, 0x56 })] [TestCase(10, new byte[] { })] [TestCase(10, null)] public async Task TestArrayCopyFrom(int batchSize, byte[] cBytea) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CBytea = cBytea }).ToList(); - await QuerySql.InsertPostgresTypesBatch(batchArgs); - var expected = new QuerySql.GetPostgresTypesCntRow + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresArrayTypesBatchArgs { CBytea = cBytea }).ToList(); + await QuerySql.InsertPostgresArrayTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresArrayTypesCntRow { Cnt = batchSize, CBytea = cBytea }; - var actual = await QuerySql.GetPostgresTypesCnt(); - Assert.That(actual.Cnt, Is.EqualTo(expected.Cnt)); - Assert.That(actual.CBytea, Is.EqualTo(expected.CBytea)); + var actual = await QuerySql.GetPostgresArrayTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesCntRow x, QuerySql.GetPostgresArrayTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + } } private static IEnumerable PostgresGeoTypesTestCases @@ -825,6 +862,33 @@ public void TestPostgresInvalidJson() Assert.ThrowsAsync(async () => await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CJsonpath = "SOME INVALID JSONPATH" })); } + [Test] + [TestCase("Good morning xml, the world says hello")] + [TestCase(null)] + public async Task TestPostgresXmlDataTypes(string cXml) + { + XmlDocument parsedXml = null; + if (cXml != null) + { + parsedXml = new XmlDocument(); + parsedXml.LoadXml(cXml); + } + + await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CXml = parsedXml }); + var expected = new QuerySql.GetPostgresTypesRow + { + CXml = parsedXml + }; + var actual = await QuerySql.GetPostgresTypes(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + { + if (x.CXml == null && y.CXml == null) + return; + Assert.That(x.CXml.OuterXml, Is.EqualTo(y.CXml.OuterXml)); + } + } + [Test] public async Task TestArray() { diff --git a/end2end/EndToEndTestsLegacy/NpgsqlTester.cs b/end2end/EndToEndTestsLegacy/NpgsqlTester.cs index 0bdc3dbb..202843f4 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlTester.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlTester.cs @@ -16,6 +16,7 @@ public async Task EmptyTestsTable() await QuerySql.TruncateAuthors(); await QuerySql.TruncatePostgresTypes(); await QuerySql.TruncatePostgresGeoTypes(); + await QuerySql.TruncatePostgresArrayTypes(); } } } \ No newline at end of file diff --git a/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs b/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs index 2060aa5c..233f3dcd 100644 --- a/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/NpgsqlTester.generated.cs @@ -3,6 +3,7 @@ using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; using NUnit.Framework; using NUnit.Framework.Legacy; using System; @@ -405,8 +406,8 @@ private static IEnumerable PostgresArrayTypesTestCases [TestCaseSource(nameof(PostgresArrayTypesTestCases))] public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, string[] cTextArray, int[] cIntegerArray, decimal[] cDecimalArray, DateTime[] cDateArray, DateTime[] cTimestampArray) { - await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); - var expected = new QuerySql.GetPostgresTypesRow + await QuerySql.InsertPostgresArrayTypes(new QuerySql.InsertPostgresArrayTypesArgs { CBytea = cBytea, CBooleanArray = cBooleanArray, CTextArray = cTextArray, CIntegerArray = cIntegerArray, CDecimalArray = cDecimalArray, CDateArray = cDateArray, CTimestampArray = cTimestampArray }); + var expected = new QuerySql.GetPostgresArrayTypesRow { CBytea = cBytea, CBooleanArray = cBooleanArray, @@ -416,9 +417,9 @@ public async Task TestPostgresArrayTypes(byte[] cBytea, bool[] cBooleanArray, st CDateArray = cDateArray, CTimestampArray = cTimestampArray }; - var actual = await QuerySql.GetPostgresTypes(); + var actual = await QuerySql.GetPostgresArrayTypes(); AssertSingularEquals(expected, actual); - void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesRow x, QuerySql.GetPostgresArrayTypesRow y) { Assert.That(x.CBytea, Is.EqualTo(y.CBytea)); Assert.That(x.CTextArray, Is.EqualTo(y.CTextArray)); @@ -660,22 +661,58 @@ void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgre } } + private static IEnumerable PostgresNetworkCopyFromTestCases + { + get + { + yield return new TestCaseData(200, new NpgsqlCidr("192.168.1.0/24"), new IPAddress(new byte[] { 192, 168, 1, 1 }), new PhysicalAddress(new byte[] { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 })).SetName("Valid Network Copy From"); + yield return new TestCaseData(10, null, null, null).SetName("Null Network Copy From"); + } + } + + [Test] + [TestCaseSource(nameof(PostgresNetworkCopyFromTestCases))] + public async Task TestPostgresNetworkCopyFrom(int batchSize, NpgsqlCidr? cCidr, IPAddress cInet, PhysicalAddress cMacaddr) + { + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CCidr = cCidr, CInet = cInet, CMacaddr = cMacaddr }).ToList(); + await QuerySql.InsertPostgresTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresTypesCntRow + { + Cnt = batchSize, + CCidr = cCidr, + CInet = cInet, + CMacaddr = cMacaddr + }; + var actual = await QuerySql.GetPostgresTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresTypesCntRow x, QuerySql.GetPostgresTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + Assert.That(x.CCidr, Is.EqualTo(y.CCidr)); + Assert.That(x.CInet, Is.EqualTo(y.CInet)); + Assert.That(x.CMacaddr, Is.EqualTo(y.CMacaddr)); + } + } + [Test] [TestCase(100, new byte[] { 0x53, 0x56 })] [TestCase(10, new byte[] { })] [TestCase(10, null)] public async Task TestArrayCopyFrom(int batchSize, byte[] cBytea) { - var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresTypesBatchArgs { CBytea = cBytea }).ToList(); - await QuerySql.InsertPostgresTypesBatch(batchArgs); - var expected = new QuerySql.GetPostgresTypesCntRow + var batchArgs = Enumerable.Range(0, batchSize).Select(_ => new QuerySql.InsertPostgresArrayTypesBatchArgs { CBytea = cBytea }).ToList(); + await QuerySql.InsertPostgresArrayTypesBatch(batchArgs); + var expected = new QuerySql.GetPostgresArrayTypesCntRow { Cnt = batchSize, CBytea = cBytea }; - var actual = await QuerySql.GetPostgresTypesCnt(); - Assert.That(actual.Cnt, Is.EqualTo(expected.Cnt)); - Assert.That(actual.CBytea, Is.EqualTo(expected.CBytea)); + var actual = await QuerySql.GetPostgresArrayTypesCnt(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresArrayTypesCntRow x, QuerySql.GetPostgresArrayTypesCntRow y) + { + Assert.That(x.Cnt, Is.EqualTo(y.Cnt)); + } } private static IEnumerable PostgresGeoTypesTestCases @@ -825,6 +862,33 @@ public void TestPostgresInvalidJson() Assert.ThrowsAsync(async () => await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CJsonpath = "SOME INVALID JSONPATH" })); } + [Test] + [TestCase("Good morning xml, the world says hello")] + [TestCase(null)] + public async Task TestPostgresXmlDataTypes(string cXml) + { + XmlDocument parsedXml = null; + if (cXml != null) + { + parsedXml = new XmlDocument(); + parsedXml.LoadXml(cXml); + } + + await QuerySql.InsertPostgresTypes(new QuerySql.InsertPostgresTypesArgs { CXml = parsedXml }); + var expected = new QuerySql.GetPostgresTypesRow + { + CXml = parsedXml + }; + var actual = await QuerySql.GetPostgresTypes(); + AssertSingularEquals(expected, actual); + void AssertSingularEquals(QuerySql.GetPostgresTypesRow x, QuerySql.GetPostgresTypesRow y) + { + if (x.CXml == null && y.CXml == null) + return; + Assert.That(x.CXml.OuterXml, Is.EqualTo(y.CXml.OuterXml)); + } + } + [Test] public async Task TestArray() { diff --git a/examples/MySqlConnectorDapperExample/Models.cs b/examples/MySqlConnectorDapperExample/Models.cs index a3892826..299063de 100644 --- a/examples/MySqlConnectorDapperExample/Models.cs +++ b/examples/MySqlConnectorDapperExample/Models.cs @@ -1,6 +1,7 @@ // auto-generated by sqlc - do not edit using System; using System.Collections.Generic; +using System.Linq; using System.Text.Json; namespace MySqlConnectorDapperExampleGen; @@ -47,9 +48,10 @@ public class MysqlType public string? CMediumtext { get; init; } public string? CText { get; init; } public string? CLongtext { get; init; } - public MysqlTypesCEnum? CEnum { get; init; } public JsonElement? CJson { get; init; } public JsonElement? CJsonStringOverride { get; init; } + public MysqlTypesCEnum? CEnum { get; init; } + public MysqlTypesCSet[]? CSet { get; init; } public byte? CBit { get; init; } public byte[]? CBinary { get; init; } public byte[]? CVarbinary { get; init; } @@ -63,6 +65,7 @@ public class ExtendedBio public string? AuthorName { get; init; } public string? Name { get; init; } public ExtendedBiosBioType? BioType { get; init; } + public ExtendedBiosAuthorType[]? AuthorType { get; init; } }; public enum MysqlTypesCEnum { @@ -72,10 +75,106 @@ public enum MysqlTypesCEnum Big = 3 } +public static class MysqlTypesCEnumExtensions +{ + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = MysqlTypesCEnum.Invalid, + ["small"] = MysqlTypesCEnum.Small, + ["medium"] = MysqlTypesCEnum.Medium, + ["big"] = MysqlTypesCEnum.Big + }; + public static MysqlTypesCEnum ToMysqlTypesCEnum(this string me) + { + return StringToEnum[me]; + } + + public static MysqlTypesCEnum[] ToMysqlTypesCEnumArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } +} + +public enum MysqlTypesCSet +{ + Invalid = 0, // reserved for invalid enum value + Tea = 1, + Coffee = 2, + Milk = 3 +} + +public static class MysqlTypesCSetExtensions +{ + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = MysqlTypesCSet.Invalid, + ["tea"] = MysqlTypesCSet.Tea, + ["coffee"] = MysqlTypesCSet.Coffee, + ["milk"] = MysqlTypesCSet.Milk + }; + public static MysqlTypesCSet ToMysqlTypesCSet(this string me) + { + return StringToEnum[me]; + } + + public static MysqlTypesCSet[] ToMysqlTypesCSetArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } +} + public enum ExtendedBiosBioType { Invalid = 0, // reserved for invalid enum value Autobiography = 1, Biography = 2, Memoir = 3 +} + +public static class ExtendedBiosBioTypeExtensions +{ + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = ExtendedBiosBioType.Invalid, + ["Autobiography"] = ExtendedBiosBioType.Autobiography, + ["Biography"] = ExtendedBiosBioType.Biography, + ["Memoir"] = ExtendedBiosBioType.Memoir + }; + public static ExtendedBiosBioType ToExtendedBiosBioType(this string me) + { + return StringToEnum[me]; + } + + public static ExtendedBiosBioType[] ToExtendedBiosBioTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } +} + +public enum ExtendedBiosAuthorType +{ + Invalid = 0, // reserved for invalid enum value + Author = 1, + Editor = 2, + Translator = 3 +} + +public static class ExtendedBiosAuthorTypeExtensions +{ + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = ExtendedBiosAuthorType.Invalid, + ["Author"] = ExtendedBiosAuthorType.Author, + ["Editor"] = ExtendedBiosAuthorType.Editor, + ["Translator"] = ExtendedBiosAuthorType.Translator + }; + public static ExtendedBiosAuthorType ToExtendedBiosAuthorType(this string me) + { + return StringToEnum[me]; + } + + public static ExtendedBiosAuthorType[] ToExtendedBiosAuthorTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } \ No newline at end of file diff --git a/examples/MySqlConnectorDapperExample/QuerySql.cs b/examples/MySqlConnectorDapperExample/QuerySql.cs index e8dd0a40..bbf56feb 100644 --- a/examples/MySqlConnectorDapperExample/QuerySql.cs +++ b/examples/MySqlConnectorDapperExample/QuerySql.cs @@ -528,7 +528,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_enum, @c_json, @c_json_string_override, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; + private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_json, @c_json_string_override, @c_enum, @c_set, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; public class InsertMysqlTypesArgs { public byte? CBit { get; init; } @@ -555,9 +555,10 @@ public class InsertMysqlTypesArgs public string? CMediumtext { get; init; } public string? CText { get; init; } public string? CLongtext { get; init; } - public MysqlTypesCEnum? CEnum { get; init; } public JsonElement? CJson { get; init; } public string? CJsonStringOverride { get; init; } + public MysqlTypesCEnum? CEnum { get; init; } + public MysqlTypesCSet[]? CSet { get; init; } public short? CYear { get; init; } public DateTime? CDate { get; init; } public DateTime? CDatetime { get; init; } @@ -596,9 +597,10 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) queryParams.Add("c_mediumtext", args.CMediumtext); queryParams.Add("c_text", args.CText); queryParams.Add("c_longtext", args.CLongtext); - queryParams.Add("c_enum", args.CEnum); - queryParams.Add("c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : null); + queryParams.Add("c_json", args.CJson?.GetRawText() ?? null); queryParams.Add("c_json_string_override", args.CJsonStringOverride); + queryParams.Add("c_enum", args.CEnum); + queryParams.Add("c_set", args.CSet != null ? string.Join(",", args.CSet) : null); queryParams.Add("c_year", args.CYear); queryParams.Add("c_date", args.CDate); queryParams.Add("c_datetime", args.CDatetime); @@ -653,9 +655,10 @@ public class InsertMysqlTypesBatchArgs public string? CMediumtext { get; init; } public string? CText { get; init; } public string? CLongtext { get; init; } - public MysqlTypesCEnum? CEnum { get; init; } public JsonElement? CJson { get; init; } public string? CJsonStringOverride { get; init; } + public MysqlTypesCEnum? CEnum { get; init; } + public MysqlTypesCSet[]? CSet { get; init; } public short? CYear { get; init; } public DateTime? CDate { get; init; } public DateTime? CDatetime { get; init; } @@ -694,14 +697,16 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteArrayCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteArrayCsvConverter()); + csvWriter.Context.TypeConverterCache.AddConverter(new Utils.MysqlTypesCSetCsvConverter()); + csvWriter.Context.TypeConverterCache.AddConverter(new Utils.MysqlTypesCSetCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); - csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); + csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); await csvWriter.WriteRecordsAsync(args); } @@ -720,13 +725,13 @@ public async Task InsertMysqlTypesBatch(List args) NumberOfLinesToSkip = 1, LineTerminator = "\n" }; - loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_enum", "c_json", "c_json_string_override", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); + loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_json", "c_json_string_override", "c_enum", "c_set", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); await loader.LoadAsync(); await connection.CloseAsync(); } } - private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; + private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; public class GetMysqlTypesRow { public bool? CBool { get; init; } @@ -757,9 +762,10 @@ public class GetMysqlTypesRow public string? CMediumtext { get; init; } public string? CText { get; init; } public string? CLongtext { get; init; } - public MysqlTypesCEnum? CEnum { get; init; } public JsonElement? CJson { get; init; } public string? CJsonStringOverride { get; init; } + public MysqlTypesCEnum? CEnum { get; init; } + public MysqlTypesCSet[]? CSet { get; init; } public byte? CBit { get; init; } public byte[]? CBinary { get; init; } public byte[]? CVarbinary { get; init; } @@ -787,7 +793,7 @@ public class GetMysqlTypesRow return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetMysqlTypesSql, transaction: this.Transaction); } - private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; + private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; public class GetMysqlTypesCntRow { public required long Cnt { get; init; } @@ -815,9 +821,10 @@ public class GetMysqlTypesCntRow public string? CMediumtext { get; init; } public string? CText { get; init; } public string? CLongtext { get; init; } - public MysqlTypesCEnum? CEnum { get; init; } public JsonElement? CJson { get; init; } public string? CJsonStringOverride { get; init; } + public MysqlTypesCEnum? CEnum { get; init; } + public MysqlTypesCSet[]? CSet { get; init; } public short? CYear { get; init; } public DateTime? CDate { get; init; } public DateTime? CDatetime { get; init; } @@ -895,12 +902,13 @@ public async Task TruncateMysqlTypes() await this.Transaction.Connection.ExecuteAsync(TruncateMysqlTypesSql, transaction: this.Transaction); } - private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (@author_name, @name, @bio_type)"; + private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (@author_name, @name, @bio_type, @author_type)"; public class CreateExtendedBioArgs { public string? AuthorName { get; init; } public string? Name { get; init; } public ExtendedBiosBioType? BioType { get; init; } + public ExtendedBiosAuthorType[]? AuthorType { get; init; } }; public async Task CreateExtendedBio(CreateExtendedBioArgs args) { @@ -908,6 +916,7 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) queryParams.Add("author_name", args.AuthorName); queryParams.Add("name", args.Name); queryParams.Add("bio_type", args.BioType); + queryParams.Add("author_type", args.AuthorType != null ? string.Join(",", args.AuthorType) : null); if (this.Transaction == null) { using (var connection = new MySqlConnection(ConnectionString)) @@ -926,12 +935,13 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) await this.Transaction.Connection.ExecuteAsync(CreateExtendedBioSql, queryParams, transaction: this.Transaction); } - private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; + private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; public class GetFirstExtendedBioByTypeRow { public string? AuthorName { get; init; } public string? Name { get; init; } public ExtendedBiosBioType? BioType { get; init; } + public ExtendedBiosAuthorType[]? AuthorType { get; init; } }; public class GetFirstExtendedBioByTypeArgs { diff --git a/examples/MySqlConnectorDapperExample/Utils.cs b/examples/MySqlConnectorDapperExample/Utils.cs index 97309842..b2b76e0f 100644 --- a/examples/MySqlConnectorDapperExample/Utils.cs +++ b/examples/MySqlConnectorDapperExample/Utils.cs @@ -10,14 +10,12 @@ namespace MySqlConnectorDapperExampleGen; public static class Utils { - public class JsonElementTypeHandler : SqlMapper.TypeHandler + private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) { if (value is string s) return JsonDocument.Parse(s).RootElement; - if (value is null) - return default; throw new DataException($"Cannot convert {value?.GetType()} to JsonElement"); } @@ -30,6 +28,8 @@ public override void SetValue(IDbDataParameter parameter, JsonElement value) public static void ConfigureSqlMapper() { SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler()); + SqlMapper.AddTypeHandler(typeof(MysqlTypesCSet[]), new MysqlTypesCSetTypeHandler()); + SqlMapper.AddTypeHandler(typeof(ExtendedBiosAuthorType[]), new ExtendedBiosAuthorTypeTypeHandler()); } public static string TransformQueryForSliceArgs(string originalSql, int sliceSize, string paramName) @@ -38,6 +38,48 @@ public static string TransformQueryForSliceArgs(string originalSql, int sliceSiz return originalSql.Replace($"/*SLICE:{paramName}*/@{paramName}", string.Join(",", paramArgs)); } + private class MysqlTypesCSetTypeHandler : SqlMapper.TypeHandler + { + public override MysqlTypesCSet[] Parse(object value) + { + if (value is string s) + return s.ToMysqlTypesCSetArr(); + throw new DataException($"Cannot convert {value?.GetType()} to MysqlTypesCSet[]"); + } + + public override void SetValue(IDbDataParameter parameter, MysqlTypesCSet[] value) + { + parameter.Value = string.Join(",", value); + } + } + + private class ExtendedBiosAuthorTypeTypeHandler : SqlMapper.TypeHandler + { + public override ExtendedBiosAuthorType[] Parse(object value) + { + if (value is string s) + return s.ToExtendedBiosAuthorTypeArr(); + throw new DataException($"Cannot convert {value?.GetType()} to ExtendedBiosAuthorType[]"); + } + + public override void SetValue(IDbDataParameter parameter, ExtendedBiosAuthorType[] value) + { + parameter.Value = string.Join(",", value); + } + } + + public class MysqlTypesCSetCsvConverter : DefaultTypeConverter + { + public override string? ConvertToString(object? value, IWriterRow row, MemberMapData memberMapData) + { + if (value == null) + return @"\N"; + if (value is MysqlTypesCSet[] arrVal) + return string.Join(",", arrVal); + return base.ConvertToString(value, row, memberMapData); + } + } + public class NullToStringCsvConverter : DefaultTypeConverter { public override string? ConvertToString(object? value, IWriterRow row, MemberMapData memberMapData) diff --git a/examples/MySqlConnectorDapperExample/request.json b/examples/MySqlConnectorDapperExample/request.json index ecaebaf5..c9ba1e68 100644 --- a/examples/MySqlConnectorDapperExample/request.json +++ b/examples/MySqlConnectorDapperExample/request.json @@ -398,17 +398,17 @@ } }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" } }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -418,13 +418,23 @@ } }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" + } + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" } }, { @@ -509,6 +519,14 @@ "big" ] }, + { + "name": "mysql_types_c_set", + "vals": [ + "tea", + "coffee", + "milk" + ] + }, { "name": "bios_bio_type", "vals": [ @@ -516,6 +534,14 @@ "Biography", "Memoir" ] + }, + { + "name": "bios_author_type", + "vals": [ + "Author", + "Editor", + "Translator" + ] } ] }, @@ -560,6 +586,17 @@ "type": { "name": "bios_bio_type" } + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + } } ] } @@ -1269,7 +1306,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypes", "cmd": ":exec", "parameters": [ @@ -1636,22 +1673,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -1660,26 +1697,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -1694,7 +1746,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -1709,7 +1761,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -1724,7 +1776,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -1739,7 +1791,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -1754,7 +1806,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -1769,7 +1821,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -1784,7 +1836,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -1799,7 +1851,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -1814,7 +1866,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -1835,7 +1887,7 @@ } }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -2202,22 +2254,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -2226,26 +2278,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -2260,7 +2327,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -2275,7 +2342,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -2290,7 +2357,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -2305,7 +2372,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -2320,7 +2387,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -2335,7 +2402,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -2350,7 +2417,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -2365,7 +2432,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -2380,7 +2447,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -2401,7 +2468,7 @@ } }, { - "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", + "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", "name": "GetMysqlTypes", "cmd": ":one", "columns": [ @@ -2714,18 +2781,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -2733,18 +2800,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_bit", @@ -2827,7 +2905,7 @@ "filename": "query.sql" }, { - "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", + "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", "name": "GetMysqlTypesCnt", "cmd": ":one", "columns": [ @@ -3105,18 +3183,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -3124,18 +3202,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_year", @@ -3292,7 +3381,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (?, ?, ?)", + "text": "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (?, ?, ?, ?)", "name": "CreateExtendedBio", "cmd": ":exec", "parameters": [ @@ -3340,6 +3429,21 @@ }, "originalName": "bio_type" } + }, + { + "number": 4, + "column": { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" + } } ], "filename": "query.sql", @@ -3349,7 +3453,7 @@ } }, { - "text": "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = ? LIMIT 1", + "text": "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = ? LIMIT 1", "name": "GetFirstExtendedBioByType", "cmd": ":one", "columns": [ @@ -3388,6 +3492,18 @@ "name": "bios_bio_type" }, "originalName": "bio_type" + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" } ], "parameters": [ diff --git a/examples/MySqlConnectorDapperExample/request.message b/examples/MySqlConnectorDapperExample/request.message index 324a9d97..124f5e87 100644 Binary files a/examples/MySqlConnectorDapperExample/request.message and b/examples/MySqlConnectorDapperExample/request.message differ diff --git a/examples/MySqlConnectorDapperLegacyExample/Models.cs b/examples/MySqlConnectorDapperLegacyExample/Models.cs index 3d12c5a7..5ec196f7 100644 --- a/examples/MySqlConnectorDapperLegacyExample/Models.cs +++ b/examples/MySqlConnectorDapperLegacyExample/Models.cs @@ -3,6 +3,7 @@ namespace MySqlConnectorDapperLegacyExampleGen { using System; using System.Collections.Generic; + using System.Linq; using System.Text.Json; public class Author @@ -48,9 +49,10 @@ public class MysqlType public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public JsonElement? CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public byte? CBit { get; set; } public byte[] CBinary { get; set; } public byte[] CVarbinary { get; set; } @@ -64,6 +66,7 @@ public class ExtendedBio public string AuthorName { get; set; } public string Name { get; set; } public ExtendedBiosBioType? BioType { get; set; } + public ExtendedBiosAuthorType[] AuthorType { get; set; } }; public enum MysqlTypesCEnum { @@ -73,6 +76,54 @@ public enum MysqlTypesCEnum Big = 3 } + public static class MysqlTypesCEnumExtensions + { + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = MysqlTypesCEnum.Invalid, + ["small"] = MysqlTypesCEnum.Small, + ["medium"] = MysqlTypesCEnum.Medium, + ["big"] = MysqlTypesCEnum.Big + }; + public static MysqlTypesCEnum ToMysqlTypesCEnum(this string me) + { + return StringToEnum[me]; + } + + public static MysqlTypesCEnum[] ToMysqlTypesCEnumArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } + } + + public enum MysqlTypesCSet + { + Invalid = 0, // reserved for invalid enum value + Tea = 1, + Coffee = 2, + Milk = 3 + } + + public static class MysqlTypesCSetExtensions + { + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = MysqlTypesCSet.Invalid, + ["tea"] = MysqlTypesCSet.Tea, + ["coffee"] = MysqlTypesCSet.Coffee, + ["milk"] = MysqlTypesCSet.Milk + }; + public static MysqlTypesCSet ToMysqlTypesCSet(this string me) + { + return StringToEnum[me]; + } + + public static MysqlTypesCSet[] ToMysqlTypesCSetArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } + } + public enum ExtendedBiosBioType { Invalid = 0, // reserved for invalid enum value @@ -80,4 +131,52 @@ public enum ExtendedBiosBioType Biography = 2, Memoir = 3 } + + public static class ExtendedBiosBioTypeExtensions + { + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = ExtendedBiosBioType.Invalid, + ["Autobiography"] = ExtendedBiosBioType.Autobiography, + ["Biography"] = ExtendedBiosBioType.Biography, + ["Memoir"] = ExtendedBiosBioType.Memoir + }; + public static ExtendedBiosBioType ToExtendedBiosBioType(this string me) + { + return StringToEnum[me]; + } + + public static ExtendedBiosBioType[] ToExtendedBiosBioTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } + } + + public enum ExtendedBiosAuthorType + { + Invalid = 0, // reserved for invalid enum value + Author = 1, + Editor = 2, + Translator = 3 + } + + public static class ExtendedBiosAuthorTypeExtensions + { + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = ExtendedBiosAuthorType.Invalid, + ["Author"] = ExtendedBiosAuthorType.Author, + ["Editor"] = ExtendedBiosAuthorType.Editor, + ["Translator"] = ExtendedBiosAuthorType.Translator + }; + public static ExtendedBiosAuthorType ToExtendedBiosAuthorType(this string me) + { + return StringToEnum[me]; + } + + public static ExtendedBiosAuthorType[] ToExtendedBiosAuthorTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } + } } \ No newline at end of file diff --git a/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs b/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs index 12a09c9a..80f6df60 100644 --- a/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs +++ b/examples/MySqlConnectorDapperLegacyExample/QuerySql.cs @@ -529,7 +529,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_enum, @c_json, @c_json_string_override, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; + private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_json, @c_json_string_override, @c_enum, @c_set, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; public class InsertMysqlTypesArgs { public byte? CBit { get; set; } @@ -556,9 +556,10 @@ public class InsertMysqlTypesArgs public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public short? CYear { get; set; } public DateTime? CDate { get; set; } public DateTime? CDatetime { get; set; } @@ -597,9 +598,10 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) queryParams.Add("c_mediumtext", args.CMediumtext); queryParams.Add("c_text", args.CText); queryParams.Add("c_longtext", args.CLongtext); - queryParams.Add("c_enum", args.CEnum); - queryParams.Add("c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : null); + queryParams.Add("c_json", args.CJson?.GetRawText() ?? null); queryParams.Add("c_json_string_override", args.CJsonStringOverride); + queryParams.Add("c_enum", args.CEnum); + queryParams.Add("c_set", args.CSet != null ? string.Join(",", args.CSet) : null); queryParams.Add("c_year", args.CYear); queryParams.Add("c_date", args.CDate); queryParams.Add("c_datetime", args.CDatetime); @@ -654,9 +656,10 @@ public class InsertMysqlTypesBatchArgs public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public short? CYear { get; set; } public DateTime? CDate { get; set; } public DateTime? CDatetime { get; set; } @@ -694,14 +697,15 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteArrayCsvConverter()); + csvWriter.Context.TypeConverterCache.AddConverter(new Utils.MysqlTypesCSetCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); - csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); + csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); await csvWriter.WriteRecordsAsync(args); } @@ -720,13 +724,13 @@ public async Task InsertMysqlTypesBatch(List args) NumberOfLinesToSkip = 1, LineTerminator = "\n" }; - loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_enum", "c_json", "c_json_string_override", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); + loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_json", "c_json_string_override", "c_enum", "c_set", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); await loader.LoadAsync(); await connection.CloseAsync(); } } - private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; + private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; public class GetMysqlTypesRow { public bool? CBool { get; set; } @@ -757,9 +761,10 @@ public class GetMysqlTypesRow public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public byte? CBit { get; set; } public byte[] CBinary { get; set; } public byte[] CVarbinary { get; set; } @@ -787,7 +792,7 @@ public async Task GetMysqlTypes() return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetMysqlTypesSql, transaction: this.Transaction); } - private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; + private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; public class GetMysqlTypesCntRow { public long Cnt { get; set; } @@ -815,9 +820,10 @@ public class GetMysqlTypesCntRow public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public short? CYear { get; set; } public DateTime? CDate { get; set; } public DateTime? CDatetime { get; set; } @@ -895,12 +901,13 @@ public async Task TruncateMysqlTypes() await this.Transaction.Connection.ExecuteAsync(TruncateMysqlTypesSql, transaction: this.Transaction); } - private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (@author_name, @name, @bio_type)"; + private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (@author_name, @name, @bio_type, @author_type)"; public class CreateExtendedBioArgs { public string AuthorName { get; set; } public string Name { get; set; } public ExtendedBiosBioType? BioType { get; set; } + public ExtendedBiosAuthorType[] AuthorType { get; set; } }; public async Task CreateExtendedBio(CreateExtendedBioArgs args) { @@ -908,6 +915,7 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) queryParams.Add("author_name", args.AuthorName); queryParams.Add("name", args.Name); queryParams.Add("bio_type", args.BioType); + queryParams.Add("author_type", args.AuthorType != null ? string.Join(",", args.AuthorType) : null); if (this.Transaction == null) { using (var connection = new MySqlConnection(ConnectionString)) @@ -926,12 +934,13 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) await this.Transaction.Connection.ExecuteAsync(CreateExtendedBioSql, queryParams, transaction: this.Transaction); } - private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; + private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; public class GetFirstExtendedBioByTypeRow { public string AuthorName { get; set; } public string Name { get; set; } public ExtendedBiosBioType? BioType { get; set; } + public ExtendedBiosAuthorType[] AuthorType { get; set; } }; public class GetFirstExtendedBioByTypeArgs { diff --git a/examples/MySqlConnectorDapperLegacyExample/Utils.cs b/examples/MySqlConnectorDapperLegacyExample/Utils.cs index 22bcd6cb..0bc1ed4a 100644 --- a/examples/MySqlConnectorDapperLegacyExample/Utils.cs +++ b/examples/MySqlConnectorDapperLegacyExample/Utils.cs @@ -11,14 +11,12 @@ namespace MySqlConnectorDapperLegacyExampleGen public static class Utils { - public class JsonElementTypeHandler : SqlMapper.TypeHandler + private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) { if (value is string s) return JsonDocument.Parse(s).RootElement; - if (value is null) - return default; throw new DataException($"Cannot convert {value?.GetType()} to JsonElement"); } @@ -31,6 +29,8 @@ public override void SetValue(IDbDataParameter parameter, JsonElement value) public static void ConfigureSqlMapper() { SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler()); + SqlMapper.AddTypeHandler(typeof(MysqlTypesCSet[]), new MysqlTypesCSetTypeHandler()); + SqlMapper.AddTypeHandler(typeof(ExtendedBiosAuthorType[]), new ExtendedBiosAuthorTypeTypeHandler()); } public static string TransformQueryForSliceArgs(string originalSql, int sliceSize, string paramName) @@ -39,6 +39,48 @@ public static string TransformQueryForSliceArgs(string originalSql, int sliceSiz return originalSql.Replace($"/*SLICE:{paramName}*/@{paramName}", string.Join(",", paramArgs)); } + private class MysqlTypesCSetTypeHandler : SqlMapper.TypeHandler + { + public override MysqlTypesCSet[] Parse(object value) + { + if (value is string s) + return s.ToMysqlTypesCSetArr(); + throw new DataException($"Cannot convert {value?.GetType()} to MysqlTypesCSet[]"); + } + + public override void SetValue(IDbDataParameter parameter, MysqlTypesCSet[] value) + { + parameter.Value = string.Join(",", value); + } + } + + private class ExtendedBiosAuthorTypeTypeHandler : SqlMapper.TypeHandler + { + public override ExtendedBiosAuthorType[] Parse(object value) + { + if (value is string s) + return s.ToExtendedBiosAuthorTypeArr(); + throw new DataException($"Cannot convert {value?.GetType()} to ExtendedBiosAuthorType[]"); + } + + public override void SetValue(IDbDataParameter parameter, ExtendedBiosAuthorType[] value) + { + parameter.Value = string.Join(",", value); + } + } + + public class MysqlTypesCSetCsvConverter : DefaultTypeConverter + { + public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) + { + if (value == null) + return @"\N"; + if (value is MysqlTypesCSet[] arrVal) + return string.Join(",", arrVal); + return base.ConvertToString(value, row, memberMapData); + } + } + public class NullToStringCsvConverter : DefaultTypeConverter { public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) diff --git a/examples/MySqlConnectorDapperLegacyExample/request.json b/examples/MySqlConnectorDapperLegacyExample/request.json index 182684f1..3e1218db 100644 --- a/examples/MySqlConnectorDapperLegacyExample/request.json +++ b/examples/MySqlConnectorDapperLegacyExample/request.json @@ -398,17 +398,17 @@ } }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" } }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -418,13 +418,23 @@ } }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" + } + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" } }, { @@ -509,6 +519,14 @@ "big" ] }, + { + "name": "mysql_types_c_set", + "vals": [ + "tea", + "coffee", + "milk" + ] + }, { "name": "bios_bio_type", "vals": [ @@ -516,6 +534,14 @@ "Biography", "Memoir" ] + }, + { + "name": "bios_author_type", + "vals": [ + "Author", + "Editor", + "Translator" + ] } ] }, @@ -560,6 +586,17 @@ "type": { "name": "bios_bio_type" } + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + } } ] } @@ -1269,7 +1306,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypes", "cmd": ":exec", "parameters": [ @@ -1636,22 +1673,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -1660,26 +1697,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -1694,7 +1746,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -1709,7 +1761,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -1724,7 +1776,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -1739,7 +1791,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -1754,7 +1806,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -1769,7 +1821,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -1784,7 +1836,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -1799,7 +1851,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -1814,7 +1866,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -1835,7 +1887,7 @@ } }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -2202,22 +2254,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -2226,26 +2278,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -2260,7 +2327,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -2275,7 +2342,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -2290,7 +2357,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -2305,7 +2372,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -2320,7 +2387,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -2335,7 +2402,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -2350,7 +2417,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -2365,7 +2432,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -2380,7 +2447,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -2401,7 +2468,7 @@ } }, { - "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", + "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", "name": "GetMysqlTypes", "cmd": ":one", "columns": [ @@ -2714,18 +2781,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -2733,18 +2800,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_bit", @@ -2827,7 +2905,7 @@ "filename": "query.sql" }, { - "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", + "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", "name": "GetMysqlTypesCnt", "cmd": ":one", "columns": [ @@ -3105,18 +3183,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -3124,18 +3202,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_year", @@ -3292,7 +3381,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (?, ?, ?)", + "text": "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (?, ?, ?, ?)", "name": "CreateExtendedBio", "cmd": ":exec", "parameters": [ @@ -3340,6 +3429,21 @@ }, "originalName": "bio_type" } + }, + { + "number": 4, + "column": { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" + } } ], "filename": "query.sql", @@ -3349,7 +3453,7 @@ } }, { - "text": "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = ? LIMIT 1", + "text": "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = ? LIMIT 1", "name": "GetFirstExtendedBioByType", "cmd": ":one", "columns": [ @@ -3388,6 +3492,18 @@ "name": "bios_bio_type" }, "originalName": "bio_type" + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" } ], "parameters": [ diff --git a/examples/MySqlConnectorDapperLegacyExample/request.message b/examples/MySqlConnectorDapperLegacyExample/request.message index 23c0ca6f..2ab67f13 100644 Binary files a/examples/MySqlConnectorDapperLegacyExample/request.message and b/examples/MySqlConnectorDapperLegacyExample/request.message differ diff --git a/examples/MySqlConnectorExample/Models.cs b/examples/MySqlConnectorExample/Models.cs index 1918eae8..9a1e896c 100644 --- a/examples/MySqlConnectorExample/Models.cs +++ b/examples/MySqlConnectorExample/Models.cs @@ -1,13 +1,14 @@ // auto-generated by sqlc - do not edit using System; using System.Collections.Generic; +using System.Linq; using System.Text.Json; namespace MySqlConnectorExampleGen; public readonly record struct Author(long Id, string Name, string? Bio); public readonly record struct Book(long Id, string Name, long AuthorId, string? Description); -public readonly record struct MysqlType(bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CDecimal, decimal? CDec, decimal? CNumeric, decimal? CFixed, double? CDouble, double? CDoublePrecision, short? CYear, DateTime? CDate, string? CTime, DateTime? CDatetime, DateTime? CTimestamp, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, MysqlTypesCEnum? CEnum, JsonElement? CJson, JsonElement? CJsonStringOverride, byte? CBit, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); -public readonly record struct ExtendedBio(string? AuthorName, string? Name, ExtendedBiosBioType? BioType); +public readonly record struct MysqlType(bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CDecimal, decimal? CDec, decimal? CNumeric, decimal? CFixed, double? CDouble, double? CDoublePrecision, short? CYear, DateTime? CDate, string? CTime, DateTime? CDatetime, DateTime? CTimestamp, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, JsonElement? CJson, JsonElement? CJsonStringOverride, MysqlTypesCEnum? CEnum, MysqlTypesCSet[]? CSet, byte? CBit, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); +public readonly record struct ExtendedBio(string? AuthorName, string? Name, ExtendedBiosBioType? BioType, ExtendedBiosAuthorType[]? AuthorType); public enum MysqlTypesCEnum { Invalid = 0, // reserved for invalid enum value @@ -29,6 +30,39 @@ public static MysqlTypesCEnum ToMysqlTypesCEnum(this string me) { return StringToEnum[me]; } + + public static MysqlTypesCEnum[] ToMysqlTypesCEnumArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } +} + +public enum MysqlTypesCSet +{ + Invalid = 0, // reserved for invalid enum value + Tea = 1, + Coffee = 2, + Milk = 3 +} + +public static class MysqlTypesCSetExtensions +{ + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = MysqlTypesCSet.Invalid, + ["tea"] = MysqlTypesCSet.Tea, + ["coffee"] = MysqlTypesCSet.Coffee, + ["milk"] = MysqlTypesCSet.Milk + }; + public static MysqlTypesCSet ToMysqlTypesCSet(this string me) + { + return StringToEnum[me]; + } + + public static MysqlTypesCSet[] ToMysqlTypesCSetArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } public enum ExtendedBiosBioType @@ -52,4 +86,37 @@ public static ExtendedBiosBioType ToExtendedBiosBioType(this string me) { return StringToEnum[me]; } + + public static ExtendedBiosBioType[] ToExtendedBiosBioTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } +} + +public enum ExtendedBiosAuthorType +{ + Invalid = 0, // reserved for invalid enum value + Author = 1, + Editor = 2, + Translator = 3 +} + +public static class ExtendedBiosAuthorTypeExtensions +{ + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = ExtendedBiosAuthorType.Invalid, + ["Author"] = ExtendedBiosAuthorType.Author, + ["Editor"] = ExtendedBiosAuthorType.Editor, + ["Translator"] = ExtendedBiosAuthorType.Translator + }; + public static ExtendedBiosAuthorType ToExtendedBiosAuthorType(this string me) + { + return StringToEnum[me]; + } + + public static ExtendedBiosAuthorType[] ToExtendedBiosAuthorTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } \ No newline at end of file diff --git a/examples/MySqlConnectorExample/QuerySql.cs b/examples/MySqlConnectorExample/QuerySql.cs index 6991ec60..378f5ff2 100644 --- a/examples/MySqlConnectorExample/QuerySql.cs +++ b/examples/MySqlConnectorExample/QuerySql.cs @@ -654,8 +654,8 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_enum, @c_json, @c_json_string_override, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; - public readonly record struct InsertMysqlTypesArgs(byte? CBit, bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, decimal? CDecimal, decimal? CDec, decimal? CNumeric, decimal? CFixed, double? CFloat, double? CDouble, double? CDoublePrecision, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, MysqlTypesCEnum? CEnum, JsonElement? CJson, string? CJsonStringOverride, short? CYear, DateTime? CDate, DateTime? CDatetime, DateTime? CTimestamp, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); + private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_json, @c_json_string_override, @c_enum, @c_set, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; + public readonly record struct InsertMysqlTypesArgs(byte? CBit, bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, decimal? CDecimal, decimal? CDec, decimal? CNumeric, decimal? CFixed, double? CFloat, double? CDouble, double? CDoublePrecision, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, JsonElement? CJson, string? CJsonStringOverride, MysqlTypesCEnum? CEnum, MysqlTypesCSet[]? CSet, short? CYear, DateTime? CDate, DateTime? CDatetime, DateTime? CTimestamp, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) { if (this.Transaction == null) @@ -689,9 +689,10 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) command.Parameters.AddWithValue("@c_mediumtext", args.CMediumtext ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_text", args.CText ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_longtext", args.CLongtext ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_json", args.CJson?.GetRawText() ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_set", args.CSet != null ? string.Join(",", args.CSet) : (object)DBNull.Value); command.Parameters.AddWithValue("@c_year", args.CYear ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_date", args.CDate ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_datetime", args.CDatetime ?? (object)DBNull.Value); @@ -742,9 +743,10 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) command.Parameters.AddWithValue("@c_mediumtext", args.CMediumtext ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_text", args.CText ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_longtext", args.CLongtext ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_json", args.CJson?.GetRawText() ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_set", args.CSet != null ? string.Join(",", args.CSet) : (object)DBNull.Value); command.Parameters.AddWithValue("@c_year", args.CYear ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_date", args.CDate ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_datetime", args.CDatetime ?? (object)DBNull.Value); @@ -759,7 +761,7 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) } } - public readonly record struct InsertMysqlTypesBatchArgs(byte? CBit, bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CNumeric, decimal? CDecimal, decimal? CDec, decimal? CFixed, double? CDouble, double? CDoublePrecision, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, MysqlTypesCEnum? CEnum, JsonElement? CJson, string? CJsonStringOverride, short? CYear, DateTime? CDate, DateTime? CDatetime, DateTime? CTimestamp, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); + public readonly record struct InsertMysqlTypesBatchArgs(byte? CBit, bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CNumeric, decimal? CDecimal, decimal? CDec, decimal? CFixed, double? CDouble, double? CDoublePrecision, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, JsonElement? CJson, string? CJsonStringOverride, MysqlTypesCEnum? CEnum, MysqlTypesCSet[]? CSet, short? CYear, DateTime? CDate, DateTime? CDatetime, DateTime? CTimestamp, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); public async Task InsertMysqlTypesBatch(List args) { const string supportedDateTimeFormat = "yyyy-MM-dd H:mm:ss"; @@ -787,14 +789,16 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteArrayCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteArrayCsvConverter()); + csvWriter.Context.TypeConverterCache.AddConverter(new Utils.MysqlTypesCSetCsvConverter()); + csvWriter.Context.TypeConverterCache.AddConverter(new Utils.MysqlTypesCSetCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); - csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); + csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); await csvWriter.WriteRecordsAsync(args); } @@ -813,14 +817,14 @@ public async Task InsertMysqlTypesBatch(List args) NumberOfLinesToSkip = 1, LineTerminator = "\n" }; - loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_enum", "c_json", "c_json_string_override", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); + loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_json", "c_json_string_override", "c_enum", "c_set", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); await loader.LoadAsync(); await connection.CloseAsync(); } } - private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; - public readonly record struct GetMysqlTypesRow(bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CDecimal, decimal? CDec, decimal? CNumeric, decimal? CFixed, double? CDouble, double? CDoublePrecision, short? CYear, DateTime? CDate, string? CTime, DateTime? CDatetime, DateTime? CTimestamp, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, MysqlTypesCEnum? CEnum, JsonElement? CJson, string? CJsonStringOverride, byte? CBit, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); + private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; + public readonly record struct GetMysqlTypesRow(bool? CBool, bool? CBoolean, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CDecimal, decimal? CDec, decimal? CNumeric, decimal? CFixed, double? CDouble, double? CDoublePrecision, short? CYear, DateTime? CDate, string? CTime, DateTime? CDatetime, DateTime? CTimestamp, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, JsonElement? CJson, string? CJsonStringOverride, MysqlTypesCEnum? CEnum, MysqlTypesCSet[]? CSet, byte? CBit, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); public async Task GetMysqlTypes() { if (this.Transaction == null) @@ -864,16 +868,17 @@ public async Task InsertMysqlTypesBatch(List args) CMediumtext = reader.IsDBNull(25) ? null : reader.GetString(25), CText = reader.IsDBNull(26) ? null : reader.GetString(26), CLongtext = reader.IsDBNull(27) ? null : reader.GetString(27), - CEnum = reader.IsDBNull(28) ? null : reader.GetString(28).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(29) ? null : JsonSerializer.Deserialize(reader.GetString(29)), - CJsonStringOverride = reader.IsDBNull(30) ? null : reader.GetString(30), - CBit = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(28) ? null : JsonSerializer.Deserialize(reader.GetString(28)), + CJsonStringOverride = reader.IsDBNull(29) ? null : reader.GetString(29), + CEnum = reader.IsDBNull(30) ? null : reader.GetString(30).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(31) ? null : reader.GetString(31).ToMysqlTypesCSetArr(), + CBit = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -926,16 +931,17 @@ public async Task InsertMysqlTypesBatch(List args) CMediumtext = reader.IsDBNull(25) ? null : reader.GetString(25), CText = reader.IsDBNull(26) ? null : reader.GetString(26), CLongtext = reader.IsDBNull(27) ? null : reader.GetString(27), - CEnum = reader.IsDBNull(28) ? null : reader.GetString(28).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(29) ? null : JsonSerializer.Deserialize(reader.GetString(29)), - CJsonStringOverride = reader.IsDBNull(30) ? null : reader.GetString(30), - CBit = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(28) ? null : JsonSerializer.Deserialize(reader.GetString(28)), + CJsonStringOverride = reader.IsDBNull(29) ? null : reader.GetString(29), + CEnum = reader.IsDBNull(30) ? null : reader.GetString(30).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(31) ? null : reader.GetString(31).ToMysqlTypesCSetArr(), + CBit = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -944,8 +950,8 @@ public async Task InsertMysqlTypesBatch(List args) return null; } - private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; - public readonly record struct GetMysqlTypesCntRow(long Cnt, bool? CBool, bool? CBoolean, byte? CBit, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CNumeric, decimal? CDecimal, decimal? CDec, decimal? CFixed, double? CDouble, double? CDoublePrecision, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, MysqlTypesCEnum? CEnum, JsonElement? CJson, string? CJsonStringOverride, short? CYear, DateTime? CDate, DateTime? CDatetime, DateTime? CTimestamp, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); + private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; + public readonly record struct GetMysqlTypesCntRow(long Cnt, bool? CBool, bool? CBoolean, byte? CBit, short? CTinyint, short? CSmallint, int? CMediumint, int? CInt, int? CInteger, long? CBigint, double? CFloat, decimal? CNumeric, decimal? CDecimal, decimal? CDec, decimal? CFixed, double? CDouble, double? CDoublePrecision, string? CChar, string? CNchar, string? CNationalChar, string? CVarchar, string? CTinytext, string? CMediumtext, string? CText, string? CLongtext, JsonElement? CJson, string? CJsonStringOverride, MysqlTypesCEnum? CEnum, MysqlTypesCSet[]? CSet, short? CYear, DateTime? CDate, DateTime? CDatetime, DateTime? CTimestamp, byte[]? CBinary, byte[]? CVarbinary, byte[]? CTinyblob, byte[]? CBlob, byte[]? CMediumblob, byte[]? CLongblob); public async Task GetMysqlTypesCnt() { if (this.Transaction == null) @@ -986,19 +992,20 @@ public async Task InsertMysqlTypesBatch(List args) CMediumtext = reader.IsDBNull(22) ? null : reader.GetString(22), CText = reader.IsDBNull(23) ? null : reader.GetString(23), CLongtext = reader.IsDBNull(24) ? null : reader.GetString(24), - CEnum = reader.IsDBNull(25) ? null : reader.GetString(25).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(26) ? null : JsonSerializer.Deserialize(reader.GetString(26)), - CJsonStringOverride = reader.IsDBNull(27) ? null : reader.GetString(27), - CYear = reader.IsDBNull(28) ? null : reader.GetInt16(28), - CDate = reader.IsDBNull(29) ? null : reader.GetDateTime(29), - CDatetime = reader.IsDBNull(30) ? null : reader.GetDateTime(30), - CTimestamp = reader.IsDBNull(31) ? null : reader.GetDateTime(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(25) ? null : JsonSerializer.Deserialize(reader.GetString(25)), + CJsonStringOverride = reader.IsDBNull(26) ? null : reader.GetString(26), + CEnum = reader.IsDBNull(27) ? null : reader.GetString(27).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(28) ? null : reader.GetString(28).ToMysqlTypesCSetArr(), + CYear = reader.IsDBNull(29) ? null : reader.GetInt16(29), + CDate = reader.IsDBNull(30) ? null : reader.GetDateTime(30), + CDatetime = reader.IsDBNull(31) ? null : reader.GetDateTime(31), + CTimestamp = reader.IsDBNull(32) ? null : reader.GetDateTime(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -1048,19 +1055,20 @@ public async Task InsertMysqlTypesBatch(List args) CMediumtext = reader.IsDBNull(22) ? null : reader.GetString(22), CText = reader.IsDBNull(23) ? null : reader.GetString(23), CLongtext = reader.IsDBNull(24) ? null : reader.GetString(24), - CEnum = reader.IsDBNull(25) ? null : reader.GetString(25).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(26) ? null : JsonSerializer.Deserialize(reader.GetString(26)), - CJsonStringOverride = reader.IsDBNull(27) ? null : reader.GetString(27), - CYear = reader.IsDBNull(28) ? null : reader.GetInt16(28), - CDate = reader.IsDBNull(29) ? null : reader.GetDateTime(29), - CDatetime = reader.IsDBNull(30) ? null : reader.GetDateTime(30), - CTimestamp = reader.IsDBNull(31) ? null : reader.GetDateTime(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(25) ? null : JsonSerializer.Deserialize(reader.GetString(25)), + CJsonStringOverride = reader.IsDBNull(26) ? null : reader.GetString(26), + CEnum = reader.IsDBNull(27) ? null : reader.GetString(27).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(28) ? null : reader.GetString(28).ToMysqlTypesCSetArr(), + CYear = reader.IsDBNull(29) ? null : reader.GetInt16(29), + CDate = reader.IsDBNull(30) ? null : reader.GetDateTime(30), + CDatetime = reader.IsDBNull(31) ? null : reader.GetDateTime(31), + CTimestamp = reader.IsDBNull(32) ? null : reader.GetDateTime(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -1154,8 +1162,8 @@ public async Task TruncateMysqlTypes() } } - private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (@author_name, @name, @bio_type)"; - public readonly record struct CreateExtendedBioArgs(string? AuthorName, string? Name, ExtendedBiosBioType? BioType); + private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (@author_name, @name, @bio_type, @author_type)"; + public readonly record struct CreateExtendedBioArgs(string? AuthorName, string? Name, ExtendedBiosBioType? BioType, ExtendedBiosAuthorType[]? AuthorType); public async Task CreateExtendedBio(CreateExtendedBioArgs args) { if (this.Transaction == null) @@ -1168,6 +1176,7 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) command.Parameters.AddWithValue("@author_name", args.AuthorName ?? (object)DBNull.Value); command.Parameters.AddWithValue("@name", args.Name ?? (object)DBNull.Value); command.Parameters.AddWithValue("@bio_type", args.BioType ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@author_type", args.AuthorType != null ? string.Join(",", args.AuthorType) : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -1187,12 +1196,13 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) command.Parameters.AddWithValue("@author_name", args.AuthorName ?? (object)DBNull.Value); command.Parameters.AddWithValue("@name", args.Name ?? (object)DBNull.Value); command.Parameters.AddWithValue("@bio_type", args.BioType ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@author_type", args.AuthorType != null ? string.Join(",", args.AuthorType) : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } - private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; - public readonly record struct GetFirstExtendedBioByTypeRow(string? AuthorName, string? Name, ExtendedBiosBioType? BioType); + private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; + public readonly record struct GetFirstExtendedBioByTypeRow(string? AuthorName, string? Name, ExtendedBiosBioType? BioType, ExtendedBiosAuthorType[]? AuthorType); public readonly record struct GetFirstExtendedBioByTypeArgs(ExtendedBiosBioType? BioType); public async Task GetFirstExtendedBioByType(GetFirstExtendedBioByTypeArgs args) { @@ -1212,7 +1222,8 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) { AuthorName = reader.IsDBNull(0) ? null : reader.GetString(0), Name = reader.IsDBNull(1) ? null : reader.GetString(1), - BioType = reader.IsDBNull(2) ? null : reader.GetString(2).ToExtendedBiosBioType() + BioType = reader.IsDBNull(2) ? null : reader.GetString(2).ToExtendedBiosBioType(), + AuthorType = reader.IsDBNull(3) ? null : reader.GetString(3).ToExtendedBiosAuthorTypeArr() }; } } @@ -1240,7 +1251,8 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) { AuthorName = reader.IsDBNull(0) ? null : reader.GetString(0), Name = reader.IsDBNull(1) ? null : reader.GetString(1), - BioType = reader.IsDBNull(2) ? null : reader.GetString(2).ToExtendedBiosBioType() + BioType = reader.IsDBNull(2) ? null : reader.GetString(2).ToExtendedBiosBioType(), + AuthorType = reader.IsDBNull(3) ? null : reader.GetString(3).ToExtendedBiosAuthorTypeArr() }; } } diff --git a/examples/MySqlConnectorExample/Utils.cs b/examples/MySqlConnectorExample/Utils.cs index add93409..741d29f7 100644 --- a/examples/MySqlConnectorExample/Utils.cs +++ b/examples/MySqlConnectorExample/Utils.cs @@ -13,6 +13,18 @@ public static string TransformQueryForSliceArgs(string originalSql, int sliceSiz return originalSql.Replace($"/*SLICE:{paramName}*/@{paramName}", string.Join(",", paramArgs)); } + public class MysqlTypesCSetCsvConverter : DefaultTypeConverter + { + public override string? ConvertToString(object? value, IWriterRow row, MemberMapData memberMapData) + { + if (value == null) + return @"\N"; + if (value is MysqlTypesCSet[] arrVal) + return string.Join(",", arrVal); + return base.ConvertToString(value, row, memberMapData); + } + } + public class NullToStringCsvConverter : DefaultTypeConverter { public override string? ConvertToString(object? value, IWriterRow row, MemberMapData memberMapData) diff --git a/examples/MySqlConnectorExample/request.json b/examples/MySqlConnectorExample/request.json index 04a6f3da..8097883f 100644 --- a/examples/MySqlConnectorExample/request.json +++ b/examples/MySqlConnectorExample/request.json @@ -398,17 +398,17 @@ } }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" } }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -418,13 +418,23 @@ } }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" + } + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" } }, { @@ -509,6 +519,14 @@ "big" ] }, + { + "name": "mysql_types_c_set", + "vals": [ + "tea", + "coffee", + "milk" + ] + }, { "name": "bios_bio_type", "vals": [ @@ -516,6 +534,14 @@ "Biography", "Memoir" ] + }, + { + "name": "bios_author_type", + "vals": [ + "Author", + "Editor", + "Translator" + ] } ] }, @@ -560,6 +586,17 @@ "type": { "name": "bios_bio_type" } + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + } } ] } @@ -1269,7 +1306,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypes", "cmd": ":exec", "parameters": [ @@ -1636,22 +1673,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -1660,26 +1697,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -1694,7 +1746,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -1709,7 +1761,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -1724,7 +1776,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -1739,7 +1791,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -1754,7 +1806,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -1769,7 +1821,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -1784,7 +1836,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -1799,7 +1851,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -1814,7 +1866,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -1835,7 +1887,7 @@ } }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -2202,22 +2254,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -2226,26 +2278,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -2260,7 +2327,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -2275,7 +2342,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -2290,7 +2357,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -2305,7 +2372,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -2320,7 +2387,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -2335,7 +2402,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -2350,7 +2417,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -2365,7 +2432,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -2380,7 +2447,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -2401,7 +2468,7 @@ } }, { - "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", + "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", "name": "GetMysqlTypes", "cmd": ":one", "columns": [ @@ -2714,18 +2781,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -2733,18 +2800,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_bit", @@ -2827,7 +2905,7 @@ "filename": "query.sql" }, { - "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", + "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", "name": "GetMysqlTypesCnt", "cmd": ":one", "columns": [ @@ -3105,18 +3183,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -3124,18 +3202,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_year", @@ -3292,7 +3381,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (?, ?, ?)", + "text": "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (?, ?, ?, ?)", "name": "CreateExtendedBio", "cmd": ":exec", "parameters": [ @@ -3340,6 +3429,21 @@ }, "originalName": "bio_type" } + }, + { + "number": 4, + "column": { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" + } } ], "filename": "query.sql", @@ -3349,7 +3453,7 @@ } }, { - "text": "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = ? LIMIT 1", + "text": "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = ? LIMIT 1", "name": "GetFirstExtendedBioByType", "cmd": ":one", "columns": [ @@ -3388,6 +3492,18 @@ "name": "bios_bio_type" }, "originalName": "bio_type" + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" } ], "parameters": [ diff --git a/examples/MySqlConnectorExample/request.message b/examples/MySqlConnectorExample/request.message index 25147dde..603ba7f5 100644 Binary files a/examples/MySqlConnectorExample/request.message and b/examples/MySqlConnectorExample/request.message differ diff --git a/examples/MySqlConnectorLegacyExample/Models.cs b/examples/MySqlConnectorLegacyExample/Models.cs index 2391ced1..83f58691 100644 --- a/examples/MySqlConnectorLegacyExample/Models.cs +++ b/examples/MySqlConnectorLegacyExample/Models.cs @@ -3,6 +3,7 @@ namespace MySqlConnectorLegacyExampleGen { using System; using System.Collections.Generic; + using System.Linq; using System.Text.Json; public class Author @@ -48,9 +49,10 @@ public class MysqlType public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public JsonElement? CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public byte? CBit { get; set; } public byte[] CBinary { get; set; } public byte[] CVarbinary { get; set; } @@ -64,6 +66,7 @@ public class ExtendedBio public string AuthorName { get; set; } public string Name { get; set; } public ExtendedBiosBioType? BioType { get; set; } + public ExtendedBiosAuthorType[] AuthorType { get; set; } }; public enum MysqlTypesCEnum { @@ -86,6 +89,39 @@ public static MysqlTypesCEnum ToMysqlTypesCEnum(this string me) { return StringToEnum[me]; } + + public static MysqlTypesCEnum[] ToMysqlTypesCEnumArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } + } + + public enum MysqlTypesCSet + { + Invalid = 0, // reserved for invalid enum value + Tea = 1, + Coffee = 2, + Milk = 3 + } + + public static class MysqlTypesCSetExtensions + { + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = MysqlTypesCSet.Invalid, + ["tea"] = MysqlTypesCSet.Tea, + ["coffee"] = MysqlTypesCSet.Coffee, + ["milk"] = MysqlTypesCSet.Milk + }; + public static MysqlTypesCSet ToMysqlTypesCSet(this string me) + { + return StringToEnum[me]; + } + + public static MysqlTypesCSet[] ToMysqlTypesCSetArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } public enum ExtendedBiosBioType @@ -109,5 +145,38 @@ public static ExtendedBiosBioType ToExtendedBiosBioType(this string me) { return StringToEnum[me]; } + + public static ExtendedBiosBioType[] ToExtendedBiosBioTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } + } + + public enum ExtendedBiosAuthorType + { + Invalid = 0, // reserved for invalid enum value + Author = 1, + Editor = 2, + Translator = 3 + } + + public static class ExtendedBiosAuthorTypeExtensions + { + private static readonly Dictionary StringToEnum = new Dictionary() + { + [string.Empty] = ExtendedBiosAuthorType.Invalid, + ["Author"] = ExtendedBiosAuthorType.Author, + ["Editor"] = ExtendedBiosAuthorType.Editor, + ["Translator"] = ExtendedBiosAuthorType.Translator + }; + public static ExtendedBiosAuthorType ToExtendedBiosAuthorType(this string me) + { + return StringToEnum[me]; + } + + public static ExtendedBiosAuthorType[] ToExtendedBiosAuthorTypeArr(this string me) + { + return me.Split(',').ToList().Select(v => StringToEnum[v]).ToArray(); + } } } \ No newline at end of file diff --git a/examples/MySqlConnectorLegacyExample/QuerySql.cs b/examples/MySqlConnectorLegacyExample/QuerySql.cs index 4f500e5c..0357dd17 100644 --- a/examples/MySqlConnectorLegacyExample/QuerySql.cs +++ b/examples/MySqlConnectorLegacyExample/QuerySql.cs @@ -741,7 +741,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_enum, @c_json, @c_json_string_override, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; + private const string InsertMysqlTypesSql = "INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) VALUES ( @c_bit, @c_bool, @c_boolean, @c_tinyint, @c_smallint, @c_mediumint, @c_int, @c_integer, @c_bigint, @c_decimal, @c_dec, @c_numeric, @c_fixed, @c_float, @c_double, @c_double_precision, @c_char, @c_nchar, @c_national_char, @c_varchar, @c_tinytext, @c_mediumtext, @c_text, @c_longtext, @c_json, @c_json_string_override, @c_enum, @c_set, @c_year, @c_date, @c_datetime, @c_timestamp, @c_binary, @c_varbinary, @c_tinyblob, @c_blob, @c_mediumblob, @c_longblob ) "; public class InsertMysqlTypesArgs { public byte? CBit { get; set; } @@ -768,9 +768,10 @@ public class InsertMysqlTypesArgs public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public short? CYear { get; set; } public DateTime? CDate { get; set; } public DateTime? CDatetime { get; set; } @@ -815,9 +816,10 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) command.Parameters.AddWithValue("@c_mediumtext", args.CMediumtext ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_text", args.CText ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_longtext", args.CLongtext ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_json", args.CJson?.GetRawText() ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_set", args.CSet != null ? string.Join(",", args.CSet) : (object)DBNull.Value); command.Parameters.AddWithValue("@c_year", args.CYear ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_date", args.CDate ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_datetime", args.CDatetime ?? (object)DBNull.Value); @@ -868,9 +870,10 @@ public async Task InsertMysqlTypes(InsertMysqlTypesArgs args) command.Parameters.AddWithValue("@c_mediumtext", args.CMediumtext ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_text", args.CText ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_longtext", args.CLongtext ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_json", args.CJson.HasValue ? args.CJson.Value.GetRawText() : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_json", args.CJson?.GetRawText() ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_enum", args.CEnum ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_set", args.CSet != null ? string.Join(",", args.CSet) : (object)DBNull.Value); command.Parameters.AddWithValue("@c_year", args.CYear ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_date", args.CDate ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_datetime", args.CDatetime ?? (object)DBNull.Value); @@ -911,9 +914,10 @@ public class InsertMysqlTypesBatchArgs public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public short? CYear { get; set; } public DateTime? CDate { get; set; } public DateTime? CDatetime { get; set; } @@ -951,14 +955,15 @@ public async Task InsertMysqlTypesBatch(List args) csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(new Utils.ByteArrayCsvConverter()); + csvWriter.Context.TypeConverterCache.AddConverter(new Utils.MysqlTypesCSetCsvConverter()); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); - csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); + csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); csvWriter.Context.TypeConverterCache.AddConverter(nullConverterFn); await csvWriter.WriteRecordsAsync(args); } @@ -977,13 +982,13 @@ public async Task InsertMysqlTypesBatch(List args) NumberOfLinesToSkip = 1, LineTerminator = "\n" }; - loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_enum", "c_json", "c_json_string_override", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); + loader.Columns.AddRange(new List { "c_bit", "c_bool", "c_boolean", "c_tinyint", "c_smallint", "c_mediumint", "c_int", "c_integer", "c_bigint", "c_float", "c_numeric", "c_decimal", "c_dec", "c_fixed", "c_double", "c_double_precision", "c_char", "c_nchar", "c_national_char", "c_varchar", "c_tinytext", "c_mediumtext", "c_text", "c_longtext", "c_json", "c_json_string_override", "c_enum", "c_set", "c_year", "c_date", "c_datetime", "c_timestamp", "c_binary", "c_varbinary", "c_tinyblob", "c_blob", "c_mediumblob", "c_longblob" }); await loader.LoadAsync(); await connection.CloseAsync(); } } - private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; + private const string GetMysqlTypesSql = "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1"; public class GetMysqlTypesRow { public bool? CBool { get; set; } @@ -1014,9 +1019,10 @@ public class GetMysqlTypesRow public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public byte? CBit { get; set; } public byte[] CBinary { get; set; } public byte[] CVarbinary { get; set; } @@ -1068,16 +1074,17 @@ public async Task GetMysqlTypes() CMediumtext = reader.IsDBNull(25) ? null : reader.GetString(25), CText = reader.IsDBNull(26) ? null : reader.GetString(26), CLongtext = reader.IsDBNull(27) ? null : reader.GetString(27), - CEnum = reader.IsDBNull(28) ? (MysqlTypesCEnum? )null : reader.GetString(28).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(29) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(29)), - CJsonStringOverride = reader.IsDBNull(30) ? null : reader.GetString(30), - CBit = reader.IsDBNull(31) ? (byte? )null : reader.GetFieldValue(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(28) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(28)), + CJsonStringOverride = reader.IsDBNull(29) ? null : reader.GetString(29), + CEnum = reader.IsDBNull(30) ? (MysqlTypesCEnum? )null : reader.GetString(30).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(31) ? null : reader.GetString(31).ToMysqlTypesCSetArr(), + CBit = reader.IsDBNull(32) ? (byte? )null : reader.GetFieldValue(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -1130,16 +1137,17 @@ public async Task GetMysqlTypes() CMediumtext = reader.IsDBNull(25) ? null : reader.GetString(25), CText = reader.IsDBNull(26) ? null : reader.GetString(26), CLongtext = reader.IsDBNull(27) ? null : reader.GetString(27), - CEnum = reader.IsDBNull(28) ? (MysqlTypesCEnum? )null : reader.GetString(28).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(29) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(29)), - CJsonStringOverride = reader.IsDBNull(30) ? null : reader.GetString(30), - CBit = reader.IsDBNull(31) ? (byte? )null : reader.GetFieldValue(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(28) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(28)), + CJsonStringOverride = reader.IsDBNull(29) ? null : reader.GetString(29), + CEnum = reader.IsDBNull(30) ? (MysqlTypesCEnum? )null : reader.GetString(30).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(31) ? null : reader.GetString(31).ToMysqlTypesCSetArr(), + CBit = reader.IsDBNull(32) ? (byte? )null : reader.GetFieldValue(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -1148,7 +1156,7 @@ public async Task GetMysqlTypes() return null; } - private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; + private const string GetMysqlTypesCntSql = "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float , c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool , c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1 "; public class GetMysqlTypesCntRow { public long Cnt { get; set; } @@ -1176,9 +1184,10 @@ public class GetMysqlTypesCntRow public string CMediumtext { get; set; } public string CText { get; set; } public string CLongtext { get; set; } - public MysqlTypesCEnum? CEnum { get; set; } public JsonElement? CJson { get; set; } public string CJsonStringOverride { get; set; } + public MysqlTypesCEnum? CEnum { get; set; } + public MysqlTypesCSet[] CSet { get; set; } public short? CYear { get; set; } public DateTime? CDate { get; set; } public DateTime? CDatetime { get; set; } @@ -1230,19 +1239,20 @@ public async Task GetMysqlTypesCnt() CMediumtext = reader.IsDBNull(22) ? null : reader.GetString(22), CText = reader.IsDBNull(23) ? null : reader.GetString(23), CLongtext = reader.IsDBNull(24) ? null : reader.GetString(24), - CEnum = reader.IsDBNull(25) ? (MysqlTypesCEnum? )null : reader.GetString(25).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(26) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(26)), - CJsonStringOverride = reader.IsDBNull(27) ? null : reader.GetString(27), - CYear = reader.IsDBNull(28) ? (short? )null : reader.GetInt16(28), - CDate = reader.IsDBNull(29) ? (DateTime? )null : reader.GetDateTime(29), - CDatetime = reader.IsDBNull(30) ? (DateTime? )null : reader.GetDateTime(30), - CTimestamp = reader.IsDBNull(31) ? (DateTime? )null : reader.GetDateTime(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(25) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(25)), + CJsonStringOverride = reader.IsDBNull(26) ? null : reader.GetString(26), + CEnum = reader.IsDBNull(27) ? (MysqlTypesCEnum? )null : reader.GetString(27).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(28) ? null : reader.GetString(28).ToMysqlTypesCSetArr(), + CYear = reader.IsDBNull(29) ? (short? )null : reader.GetInt16(29), + CDate = reader.IsDBNull(30) ? (DateTime? )null : reader.GetDateTime(30), + CDatetime = reader.IsDBNull(31) ? (DateTime? )null : reader.GetDateTime(31), + CTimestamp = reader.IsDBNull(32) ? (DateTime? )null : reader.GetDateTime(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -1292,19 +1302,20 @@ public async Task GetMysqlTypesCnt() CMediumtext = reader.IsDBNull(22) ? null : reader.GetString(22), CText = reader.IsDBNull(23) ? null : reader.GetString(23), CLongtext = reader.IsDBNull(24) ? null : reader.GetString(24), - CEnum = reader.IsDBNull(25) ? (MysqlTypesCEnum? )null : reader.GetString(25).ToMysqlTypesCEnum(), - CJson = reader.IsDBNull(26) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(26)), - CJsonStringOverride = reader.IsDBNull(27) ? null : reader.GetString(27), - CYear = reader.IsDBNull(28) ? (short? )null : reader.GetInt16(28), - CDate = reader.IsDBNull(29) ? (DateTime? )null : reader.GetDateTime(29), - CDatetime = reader.IsDBNull(30) ? (DateTime? )null : reader.GetDateTime(30), - CTimestamp = reader.IsDBNull(31) ? (DateTime? )null : reader.GetDateTime(31), - CBinary = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CVarbinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CTinyblob = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CBlob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), - CMediumblob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), - CLongblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37) + CJson = reader.IsDBNull(25) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(25)), + CJsonStringOverride = reader.IsDBNull(26) ? null : reader.GetString(26), + CEnum = reader.IsDBNull(27) ? (MysqlTypesCEnum? )null : reader.GetString(27).ToMysqlTypesCEnum(), + CSet = reader.IsDBNull(28) ? null : reader.GetString(28).ToMysqlTypesCSetArr(), + CYear = reader.IsDBNull(29) ? (short? )null : reader.GetInt16(29), + CDate = reader.IsDBNull(30) ? (DateTime? )null : reader.GetDateTime(30), + CDatetime = reader.IsDBNull(31) ? (DateTime? )null : reader.GetDateTime(31), + CTimestamp = reader.IsDBNull(32) ? (DateTime? )null : reader.GetDateTime(32), + CBinary = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), + CVarbinary = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), + CTinyblob = reader.IsDBNull(35) ? null : reader.GetFieldValue(35), + CBlob = reader.IsDBNull(36) ? null : reader.GetFieldValue(36), + CMediumblob = reader.IsDBNull(37) ? null : reader.GetFieldValue(37), + CLongblob = reader.IsDBNull(38) ? null : reader.GetFieldValue(38) }; } } @@ -1403,12 +1414,13 @@ public async Task TruncateMysqlTypes() } } - private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (@author_name, @name, @bio_type)"; + private const string CreateExtendedBioSql = "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (@author_name, @name, @bio_type, @author_type)"; public class CreateExtendedBioArgs { public string AuthorName { get; set; } public string Name { get; set; } public ExtendedBiosBioType? BioType { get; set; } + public ExtendedBiosAuthorType[] AuthorType { get; set; } }; public async Task CreateExtendedBio(CreateExtendedBioArgs args) { @@ -1422,6 +1434,7 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) command.Parameters.AddWithValue("@author_name", args.AuthorName ?? (object)DBNull.Value); command.Parameters.AddWithValue("@name", args.Name ?? (object)DBNull.Value); command.Parameters.AddWithValue("@bio_type", args.BioType ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@author_type", args.AuthorType != null ? string.Join(",", args.AuthorType) : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -1441,16 +1454,18 @@ public async Task CreateExtendedBio(CreateExtendedBioArgs args) command.Parameters.AddWithValue("@author_name", args.AuthorName ?? (object)DBNull.Value); command.Parameters.AddWithValue("@name", args.Name ?? (object)DBNull.Value); command.Parameters.AddWithValue("@bio_type", args.BioType ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@author_type", args.AuthorType != null ? string.Join(",", args.AuthorType) : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } - private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; + private const string GetFirstExtendedBioByTypeSql = "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = @bio_type LIMIT 1"; public class GetFirstExtendedBioByTypeRow { public string AuthorName { get; set; } public string Name { get; set; } public ExtendedBiosBioType? BioType { get; set; } + public ExtendedBiosAuthorType[] AuthorType { get; set; } }; public class GetFirstExtendedBioByTypeArgs { @@ -1474,7 +1489,8 @@ public async Task GetFirstExtendedBioByType(GetFir { AuthorName = reader.IsDBNull(0) ? null : reader.GetString(0), Name = reader.IsDBNull(1) ? null : reader.GetString(1), - BioType = reader.IsDBNull(2) ? (ExtendedBiosBioType? )null : reader.GetString(2).ToExtendedBiosBioType() + BioType = reader.IsDBNull(2) ? (ExtendedBiosBioType? )null : reader.GetString(2).ToExtendedBiosBioType(), + AuthorType = reader.IsDBNull(3) ? null : reader.GetString(3).ToExtendedBiosAuthorTypeArr() }; } } @@ -1502,7 +1518,8 @@ public async Task GetFirstExtendedBioByType(GetFir { AuthorName = reader.IsDBNull(0) ? null : reader.GetString(0), Name = reader.IsDBNull(1) ? null : reader.GetString(1), - BioType = reader.IsDBNull(2) ? (ExtendedBiosBioType? )null : reader.GetString(2).ToExtendedBiosBioType() + BioType = reader.IsDBNull(2) ? (ExtendedBiosBioType? )null : reader.GetString(2).ToExtendedBiosBioType(), + AuthorType = reader.IsDBNull(3) ? null : reader.GetString(3).ToExtendedBiosAuthorTypeArr() }; } } diff --git a/examples/MySqlConnectorLegacyExample/Utils.cs b/examples/MySqlConnectorLegacyExample/Utils.cs index 351b629b..2912c7ea 100644 --- a/examples/MySqlConnectorLegacyExample/Utils.cs +++ b/examples/MySqlConnectorLegacyExample/Utils.cs @@ -14,6 +14,18 @@ public static string TransformQueryForSliceArgs(string originalSql, int sliceSiz return originalSql.Replace($"/*SLICE:{paramName}*/@{paramName}", string.Join(",", paramArgs)); } + public class MysqlTypesCSetCsvConverter : DefaultTypeConverter + { + public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) + { + if (value == null) + return @"\N"; + if (value is MysqlTypesCSet[] arrVal) + return string.Join(",", arrVal); + return base.ConvertToString(value, row, memberMapData); + } + } + public class NullToStringCsvConverter : DefaultTypeConverter { public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) diff --git a/examples/MySqlConnectorLegacyExample/request.json b/examples/MySqlConnectorLegacyExample/request.json index 791be11e..7c97aba4 100644 --- a/examples/MySqlConnectorLegacyExample/request.json +++ b/examples/MySqlConnectorLegacyExample/request.json @@ -398,17 +398,17 @@ } }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" } }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -418,13 +418,23 @@ } }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" + } + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" } }, { @@ -509,6 +519,14 @@ "big" ] }, + { + "name": "mysql_types_c_set", + "vals": [ + "tea", + "coffee", + "milk" + ] + }, { "name": "bios_bio_type", "vals": [ @@ -516,6 +534,14 @@ "Biography", "Memoir" ] + }, + { + "name": "bios_author_type", + "vals": [ + "Author", + "Editor", + "Translator" + ] } ] }, @@ -560,6 +586,17 @@ "type": { "name": "bios_bio_type" } + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + } } ] } @@ -1269,7 +1306,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypes", "cmd": ":exec", "parameters": [ @@ -1636,22 +1673,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -1660,26 +1697,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -1694,7 +1746,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -1709,7 +1761,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -1724,7 +1776,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -1739,7 +1791,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -1754,7 +1806,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -1769,7 +1821,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -1784,7 +1836,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -1799,7 +1851,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -1814,7 +1866,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -1835,7 +1887,7 @@ } }, { - "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, \n c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + "text": "INSERT INTO mysql_types \n(c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp,\n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertMysqlTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -2202,22 +2254,22 @@ { "number": 25, "column": { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" } }, { "number": 26, "column": { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "schema": "public", @@ -2226,26 +2278,41 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" } }, { "number": 27, "column": { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "schema": "public", "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" } }, { "number": 28, + "column": { + "name": "c_set", + "length": 15, + "table": { + "schema": "public", + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" + } + }, + { + "number": 29, "column": { "name": "c_year", "length": -1, @@ -2260,7 +2327,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_date", "length": -1, @@ -2275,7 +2342,7 @@ } }, { - "number": 30, + "number": 31, "column": { "name": "c_datetime", "length": 19, @@ -2290,7 +2357,7 @@ } }, { - "number": 31, + "number": 32, "column": { "name": "c_timestamp", "length": 19, @@ -2305,7 +2372,7 @@ } }, { - "number": 32, + "number": 33, "column": { "name": "c_binary", "length": 3, @@ -2320,7 +2387,7 @@ } }, { - "number": 33, + "number": 34, "column": { "name": "c_varbinary", "length": 10, @@ -2335,7 +2402,7 @@ } }, { - "number": 34, + "number": 35, "column": { "name": "c_tinyblob", "length": -1, @@ -2350,7 +2417,7 @@ } }, { - "number": 35, + "number": 36, "column": { "name": "c_blob", "length": -1, @@ -2365,7 +2432,7 @@ } }, { - "number": 36, + "number": 37, "column": { "name": "c_mediumblob", "length": -1, @@ -2380,7 +2447,7 @@ } }, { - "number": 37, + "number": 38, "column": { "name": "c_longblob", "length": -1, @@ -2401,7 +2468,7 @@ } }, { - "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, c_json, c_json_string_override, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", + "text": "SELECT c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_decimal, c_dec, c_numeric, c_fixed, c_double, c_double_precision, c_year, c_date, c_time, c_datetime, c_timestamp, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_json, c_json_string_override, c_enum, c_set, c_bit, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types LIMIT 1", "name": "GetMysqlTypes", "cmd": ":one", "columns": [ @@ -2714,18 +2781,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -2733,18 +2800,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_bit", @@ -2827,7 +2905,7 @@ "filename": "query.sql" }, { - "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", + "text": "SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nFROM mysql_types\nGROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, \n c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, \n c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, \n c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, \n c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob\nLIMIT 1", "name": "GetMysqlTypesCnt", "cmd": ":one", "columns": [ @@ -3105,18 +3183,18 @@ "originalName": "c_longtext" }, { - "name": "c_enum", - "length": 6, + "name": "c_json", + "length": -1, "table": { "name": "mysql_types" }, "type": { - "name": "mysql_types_c_enum" + "name": "json" }, - "originalName": "c_enum" + "originalName": "c_json" }, { - "name": "c_json", + "name": "c_json_string_override", "length": -1, "table": { "name": "mysql_types" @@ -3124,18 +3202,29 @@ "type": { "name": "json" }, - "originalName": "c_json" + "originalName": "c_json_string_override" }, { - "name": "c_json_string_override", - "length": -1, + "name": "c_enum", + "length": 6, "table": { "name": "mysql_types" }, "type": { - "name": "json" + "name": "mysql_types_c_enum" }, - "originalName": "c_json_string_override" + "originalName": "c_enum" + }, + { + "name": "c_set", + "length": 15, + "table": { + "name": "mysql_types" + }, + "type": { + "name": "mysql_types_c_set" + }, + "originalName": "c_set" }, { "name": "c_year", @@ -3292,7 +3381,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO extended.bios (author_name, name, bio_type) VALUES (?, ?, ?)", + "text": "INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (?, ?, ?, ?)", "name": "CreateExtendedBio", "cmd": ":exec", "parameters": [ @@ -3340,6 +3429,21 @@ }, "originalName": "bio_type" } + }, + { + "number": 4, + "column": { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" + } } ], "filename": "query.sql", @@ -3349,7 +3453,7 @@ } }, { - "text": "SELECT author_name, name, bio_type FROM extended.bios WHERE bio_type = ? LIMIT 1", + "text": "SELECT author_name, name, bio_type, author_type FROM extended.bios WHERE bio_type = ? LIMIT 1", "name": "GetFirstExtendedBioByType", "cmd": ":one", "columns": [ @@ -3388,6 +3492,18 @@ "name": "bios_bio_type" }, "originalName": "bio_type" + }, + { + "name": "author_type", + "length": 24, + "table": { + "schema": "extended", + "name": "bios" + }, + "type": { + "name": "bios_author_type" + }, + "originalName": "author_type" } ], "parameters": [ diff --git a/examples/MySqlConnectorLegacyExample/request.message b/examples/MySqlConnectorLegacyExample/request.message index e7aadc4e..1fd01367 100644 Binary files a/examples/MySqlConnectorLegacyExample/request.message and b/examples/MySqlConnectorLegacyExample/request.message differ diff --git a/examples/NpgsqlDapperExample/Models.cs b/examples/NpgsqlDapperExample/Models.cs index 2f20b05f..17307005 100644 --- a/examples/NpgsqlDapperExample/Models.cs +++ b/examples/NpgsqlDapperExample/Models.cs @@ -1,9 +1,11 @@ // auto-generated by sqlc - do not edit using NpgsqlTypes; using System; +using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; namespace NpgsqlDapperExampleGen; public class Author @@ -45,18 +47,12 @@ public class PostgresType public JsonElement? CJsonStringOverride { get; init; } public JsonElement? CJsonb { get; init; } public string? CJsonpath { get; init; } + public XmlDocument? CXml { get; init; } public NpgsqlCidr? CCidr { get; init; } public IPAddress? CInet { get; init; } public PhysicalAddress? CMacaddr { get; init; } public string? CMacaddr8 { get; init; } public Guid? CUuid { get; init; } - public byte[]? CBytea { get; init; } - public bool[]? CBooleanArray { get; init; } - public string[]? CTextArray { get; init; } - public int[]? CIntegerArray { get; init; } - public decimal[]? CDecimalArray { get; init; } - public DateTime[]? CDateArray { get; init; } - public DateTime[]? CTimestampArray { get; init; } }; public class PostgresGeometricType { @@ -67,4 +63,14 @@ public class PostgresGeometricType public NpgsqlPath? CPath { get; init; } public NpgsqlPolygon? CPolygon { get; init; } public NpgsqlCircle? CCircle { get; init; } +}; +public class PostgresArrayType +{ + public byte[]? CBytea { get; init; } + public bool[]? CBooleanArray { get; init; } + public string[]? CTextArray { get; init; } + public int[]? CIntegerArray { get; init; } + public decimal[]? CDecimalArray { get; init; } + public DateTime[]? CDateArray { get; init; } + public DateTime[]? CTimestampArray { get; init; } }; \ No newline at end of file diff --git a/examples/NpgsqlDapperExample/QuerySql.cs b/examples/NpgsqlDapperExample/QuerySql.cs index 4fa8985d..9aa99e01 100644 --- a/examples/NpgsqlDapperExample/QuerySql.cs +++ b/examples/NpgsqlDapperExample/QuerySql.cs @@ -14,6 +14,7 @@ using System.Net.NetworkInformation; using System.Text.Json; using System.Threading.Tasks; +using System.Xml; namespace NpgsqlDapperExampleGen; public class QuerySql @@ -528,7 +529,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8 ) "; public class InsertPostgresTypesArgs { public bool? CBoolean { get; init; } @@ -556,17 +557,11 @@ public class InsertPostgresTypesArgs public string? CJsonStringOverride { get; init; } public JsonElement? CJsonb { get; init; } public string? CJsonpath { get; init; } + public XmlDocument? CXml { get; init; } public NpgsqlCidr? CCidr { get; init; } public IPAddress? CInet { get; init; } public PhysicalAddress? CMacaddr { get; init; } public string? CMacaddr8 { get; init; } - public byte[]? CBytea { get; init; } - public bool[]? CBooleanArray { get; init; } - public string[]? CTextArray { get; init; } - public int[]? CIntegerArray { get; init; } - public decimal[]? CDecimalArray { get; init; } - public DateTime[]? CDateArray { get; init; } - public DateTime[]? CTimestampArray { get; init; } }; public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) { @@ -596,17 +591,11 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) queryParams.Add("c_json_string_override", args.CJsonStringOverride); queryParams.Add("c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : null); queryParams.Add("c_jsonpath", args.CJsonpath); + queryParams.Add("c_xml", args.CXml != null ? args.CXml.OuterXml : null); queryParams.Add("c_cidr", args.CCidr); queryParams.Add("c_inet", args.CInet); queryParams.Add("c_macaddr", args.CMacaddr); queryParams.Add("c_macaddr8", args.CMacaddr8); - queryParams.Add("c_bytea", args.CBytea); - queryParams.Add("c_boolean_array", args.CBooleanArray); - queryParams.Add("c_text_array", args.CTextArray); - queryParams.Add("c_integer_array", args.CIntegerArray); - queryParams.Add("c_decimal_array", args.CDecimalArray); - queryParams.Add("c_date_array", args.CDateArray); - queryParams.Add("c_timestamp_array", args.CTimestampArray); if (this.Transaction == null) { using (var connection = new NpgsqlConnection(ConnectionString)) @@ -625,7 +614,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) await this.Transaction.Connection.ExecuteAsync(InsertPostgresTypesSql, queryParams, transaction: this.Transaction); } - private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea) FROM STDIN (FORMAT BINARY)"; + private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; public class InsertPostgresTypesBatchArgs { public bool? CBoolean { get; init; } @@ -648,7 +637,9 @@ public class InsertPostgresTypesBatchArgs public string? CBpchar { get; init; } public string? CText { get; init; } public Guid? CUuid { get; init; } - public byte[]? CBytea { get; init; } + public NpgsqlCidr? CCidr { get; init; } + public IPAddress? CInet { get; init; } + public PhysicalAddress? CMacaddr { get; init; } }; public async Task InsertPostgresTypesBatch(List args) { @@ -680,7 +671,9 @@ public async Task InsertPostgresTypesBatch(List ar await writer.WriteAsync(row.CBpchar); await writer.WriteAsync(row.CText); await writer.WriteAsync(row.CUuid); - await writer.WriteAsync(row.CBytea); + await writer.WriteAsync(row.CCidr); + await writer.WriteAsync(row.CInet); + await writer.WriteAsync(row.CMacaddr); } await writer.CompleteAsync(); @@ -690,7 +683,7 @@ public async Task InsertPostgresTypesBatch(List ar } } - private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; + private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8 FROM postgres_types LIMIT 1 "; public class GetPostgresTypesRow { public bool? CBoolean { get; init; } @@ -718,17 +711,11 @@ public class GetPostgresTypesRow public string? CJsonStringOverride { get; init; } public JsonElement? CJsonb { get; init; } public string? CJsonpath { get; init; } + public XmlDocument? CXml { get; init; } public NpgsqlCidr? CCidr { get; init; } public IPAddress? CInet { get; init; } public PhysicalAddress? CMacaddr { get; init; } public string? CMacaddr8 { get; init; } - public byte[]? CBytea { get; init; } - public bool[]? CBooleanArray { get; init; } - public string[]? CTextArray { get; init; } - public int[]? CIntegerArray { get; init; } - public decimal[]? CDecimalArray { get; init; } - public DateTime[]? CDateArray { get; init; } - public DateTime[]? CTimestampArray { get; init; } }; public async Task GetPostgresTypes() { @@ -749,7 +736,7 @@ public class GetPostgresTypesRow return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresTypesSql, transaction: this.Transaction); } - private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea LIMIT 1 "; + private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr LIMIT 1 "; public class GetPostgresTypesCntRow { public short? CSmallint { get; init; } @@ -772,7 +759,9 @@ public class GetPostgresTypesCntRow public string? CBpchar { get; init; } public string? CText { get; init; } public Guid? CUuid { get; init; } - public byte[]? CBytea { get; init; } + public NpgsqlCidr? CCidr { get; init; } + public IPAddress? CInet { get; init; } + public PhysicalAddress? CMacaddr { get; init; } public required long Cnt { get; init; } }; public async Task GetPostgresTypesCnt() @@ -967,4 +956,144 @@ public async Task TruncatePostgresGeoTypes() await this.Transaction.Connection.ExecuteAsync(TruncatePostgresGeoTypesSql, transaction: this.Transaction); } + + private const string InsertPostgresArrayTypesSql = "INSERT INTO postgres_array_types(c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + public class InsertPostgresArrayTypesArgs + { + public byte[]? CBytea { get; init; } + public bool[]? CBooleanArray { get; init; } + public string[]? CTextArray { get; init; } + public int[]? CIntegerArray { get; init; } + public decimal[]? CDecimalArray { get; init; } + public DateTime[]? CDateArray { get; init; } + public DateTime[]? CTimestampArray { get; init; } + }; + public async Task InsertPostgresArrayTypes(InsertPostgresArrayTypesArgs args) + { + var queryParams = new Dictionary(); + queryParams.Add("c_bytea", args.CBytea); + queryParams.Add("c_boolean_array", args.CBooleanArray); + queryParams.Add("c_text_array", args.CTextArray); + queryParams.Add("c_integer_array", args.CIntegerArray); + queryParams.Add("c_decimal_array", args.CDecimalArray); + queryParams.Add("c_date_array", args.CDateArray); + queryParams.Add("c_timestamp_array", args.CTimestampArray); + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.ExecuteAsync(InsertPostgresArrayTypesSql, queryParams); + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + await this.Transaction.Connection.ExecuteAsync(InsertPostgresArrayTypesSql, queryParams, transaction: this.Transaction); + } + + private const string GetPostgresArrayTypesSql = "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1"; + public class GetPostgresArrayTypesRow + { + public byte[]? CBytea { get; init; } + public bool[]? CBooleanArray { get; init; } + public string[]? CTextArray { get; init; } + public int[]? CIntegerArray { get; init; } + public decimal[]? CDecimalArray { get; init; } + public DateTime[]? CDateArray { get; init; } + public DateTime[]? CTimestampArray { get; init; } + }; + public async Task GetPostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + var result = await connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesSql); + return result; + } + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesSql, transaction: this.Transaction); + } + + private const string InsertPostgresArrayTypesBatchSql = "COPY postgres_array_types (c_bytea) FROM STDIN (FORMAT BINARY)"; + public class InsertPostgresArrayTypesBatchArgs + { + public byte[]? CBytea { get; init; } + }; + public async Task InsertPostgresArrayTypesBatch(List args) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.OpenAsync(); + using (var writer = await connection.BeginBinaryImportAsync(InsertPostgresArrayTypesBatchSql)) + { + foreach (var row in args) + { + await writer.StartRowAsync(); + await writer.WriteAsync(row.CBytea); + } + + await writer.CompleteAsync(); + } + + await connection.CloseAsync(); + } + } + + private const string GetPostgresArrayTypesCntSql = "SELECT c_bytea , COUNT (* ) AS cnt FROM postgres_array_types GROUP BY c_bytea LIMIT 1 "; + public class GetPostgresArrayTypesCntRow + { + public byte[]? CBytea { get; init; } + public required long Cnt { get; init; } + }; + public async Task GetPostgresArrayTypesCnt() + { + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + var result = await connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesCntSql); + return result; + } + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesCntSql, transaction: this.Transaction); + } + + private const string TruncatePostgresArrayTypesSql = "TRUNCATE TABLE postgres_array_types"; + public async Task TruncatePostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.ExecuteAsync(TruncatePostgresArrayTypesSql); + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + await this.Transaction.Connection.ExecuteAsync(TruncatePostgresArrayTypesSql, transaction: this.Transaction); + } } \ No newline at end of file diff --git a/examples/NpgsqlDapperExample/Utils.cs b/examples/NpgsqlDapperExample/Utils.cs index 625c2e08..0c800aac 100644 --- a/examples/NpgsqlDapperExample/Utils.cs +++ b/examples/NpgsqlDapperExample/Utils.cs @@ -6,18 +6,17 @@ using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; namespace NpgsqlDapperExampleGen; public static class Utils { - public class JsonElementTypeHandler : SqlMapper.TypeHandler + private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) { if (value is string s) return JsonDocument.Parse(s).RootElement; - if (value is null) - return default; throw new DataException($"Cannot convert {value?.GetType()} to JsonElement"); } @@ -27,9 +26,30 @@ public override void SetValue(IDbDataParameter parameter, JsonElement value) } } + private class XmlDocumentTypeHandler : SqlMapper.TypeHandler + { + public override XmlDocument Parse(object value) + { + if (value is string s) + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(s); + return xmlDoc; + } + + throw new DataException($"Cannot convert {value?.GetType()} to XmlDocument"); + } + + public override void SetValue(IDbDataParameter parameter, XmlDocument value) + { + parameter.Value = value.OuterXml; + } + } + public static void ConfigureSqlMapper() { SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler()); + SqlMapper.AddTypeHandler(typeof(XmlDocument), new XmlDocumentTypeHandler()); RegisterNpgsqlTypeHandler(); RegisterNpgsqlTypeHandler(); RegisterNpgsqlTypeHandler(); diff --git a/examples/NpgsqlDapperExample/request.json b/examples/NpgsqlDapperExample/request.json index d4b220e6..c7520d91 100644 --- a/examples/NpgsqlDapperExample/request.json +++ b/examples/NpgsqlDapperExample/request.json @@ -374,6 +374,16 @@ "name": "jsonpath" } }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + } + }, { "name": "c_cidr", "length": -1, @@ -423,169 +433,176 @@ "type": { "name": "uuid" } - }, + } + ] + }, + { + "rel": { + "name": "postgres_geometric_types" + }, + "columns": [ { - "name": "c_bytea", + "name": "c_point", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "bytea" + "name": "point" } }, { - "name": "c_boolean_array", - "isArray": true, + "name": "c_line", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "arrayDims": 1 + "name": "line" + } }, { - "name": "c_text_array", - "isArray": true, + "name": "c_lseg", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "text" - }, - "arrayDims": 1 + "name": "lseg" + } }, { - "name": "c_integer_array", - "isArray": true, + "name": "c_box", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "arrayDims": 1 + "name": "box" + } }, { - "name": "c_decimal_array", - "isArray": true, + "name": "c_path", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "arrayDims": 1 + "name": "path" + } }, { - "name": "c_date_array", - "isArray": true, + "name": "c_polygon", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "date" - }, - "arrayDims": 1 + "name": "polygon" + } }, { - "name": "c_timestamp_array", - "isArray": true, + "name": "c_circle", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "arrayDims": 1 + "name": "circle" + } } ] }, { "rel": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "columns": [ { - "name": "c_point", + "name": "c_bytea", "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "point" + "name": "bytea" } }, { - "name": "c_line", + "name": "c_boolean_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "line" - } + "schema": "pg_catalog", + "name": "bool" + }, + "arrayDims": 1 }, { - "name": "c_lseg", + "name": "c_text_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "lseg" - } + "name": "text" + }, + "arrayDims": 1 }, { - "name": "c_box", + "name": "c_integer_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "box" - } + "schema": "pg_catalog", + "name": "int4" + }, + "arrayDims": 1 }, { - "name": "c_path", + "name": "c_decimal_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "path" - } + "schema": "pg_catalog", + "name": "numeric" + }, + "arrayDims": 1 }, { - "name": "c_polygon", + "name": "c_date_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "polygon" - } + "name": "date" + }, + "arrayDims": 1 }, { - "name": "c_circle", + "name": "c_timestamp_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "circle" - } + "schema": "pg_catalog", + "name": "timestamp" + }, + "arrayDims": 1 } ] } @@ -33190,7 +33207,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26,\n $27,\n $28::macaddr,\n $29::macaddr8,\n $30, \n $31,\n $32, \n $33,\n $34,\n $35,\n $36\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8\n)", "name": "InsertPostgresTypes", "cmd": ":exec", "parameters": [ @@ -33572,6 +33589,16 @@ }, { "number": 26, + "column": { + "name": "c_xml", + "length": -1, + "type": { + "name": "xml" + } + } + }, + { + "number": 27, "column": { "name": "c_cidr", "length": -1, @@ -33587,7 +33614,7 @@ } }, { - "number": 27, + "number": 28, "column": { "name": "c_inet", "length": -1, @@ -33603,7 +33630,7 @@ } }, { - "number": 28, + "number": 29, "column": { "name": "c_macaddr", "length": -1, @@ -33613,7 +33640,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_macaddr8", "length": -1, @@ -33621,130 +33648,6 @@ "name": "macaddr8" } } - }, - { - "number": 30, - "column": { - "name": "c_bytea", - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - } - }, - { - "number": 31, - "column": { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - } - }, - { - "number": 32, - "column": { - "name": "c_text_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - } - }, - { - "number": 33, - "column": { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - } - }, - { - "number": 34, - "column": { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - } - }, - { - "number": 35, - "column": { - "name": "c_date_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - } - }, - { - "number": 36, - "column": { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 - } } ], "filename": "query.sql", @@ -33753,7 +33656,7 @@ } }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23\n)", "name": "InsertPostgresTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -34060,16 +33963,46 @@ { "number": 21, "column": { - "name": "c_bytea", + "name": "c_cidr", "length": -1, "table": { "schema": "public", "name": "postgres_types" }, "type": { - "name": "bytea" + "name": "cidr" }, - "originalName": "c_bytea" + "originalName": "c_cidr" + } + }, + { + "number": 22, + "column": { + "name": "c_inet", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + } + }, + { + "number": 23, + "column": { + "name": "c_macaddr", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" } } ], @@ -34079,7 +34012,7 @@ } }, { - "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", + "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8\nFROM postgres_types \nLIMIT 1", "name": "GetPostgresTypes", "cmd": ":one", "columns": [ @@ -34374,6 +34307,17 @@ }, "originalName": "c_jsonpath" }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + }, + "originalName": "c_xml" + }, { "name": "c_cidr", "length": -1, @@ -34414,105 +34358,12 @@ "type": { "name": "text" } - }, - { - "name": "c_bytea", - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - }, - { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - }, - { - "name": "c_text_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - }, - { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - }, - { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - }, - { - "name": "c_date_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - }, - { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 } ], "filename": "query.sql" }, { - "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\nLIMIT 1", + "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", "name": "GetPostgresTypesCnt", "cmd": ":one", "columns": [ @@ -34752,15 +34603,37 @@ "originalName": "c_uuid" }, { - "name": "c_bytea", + "name": "c_cidr", "length": -1, "table": { "name": "postgres_types" }, "type": { - "name": "bytea" + "name": "cidr" }, - "originalName": "c_bytea" + "originalName": "c_cidr" + }, + { + "name": "c_inet", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + }, + { + "name": "c_macaddr", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" }, { "name": "cnt", @@ -35137,6 +35010,295 @@ "name": "TruncatePostgresGeoTypes", "cmd": ":exec", "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types\n(\n c_bytea,\n c_boolean_array,\n c_text_array,\n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES ($1, $2, $3, $4, $5, $6, $7)", + "name": "InsertPostgresArrayTypes", + "cmd": ":exec", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + }, + { + "number": 2, + "column": { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + } + }, + { + "number": 3, + "column": { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + } + }, + { + "number": 4, + "column": { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + } + }, + { + "number": 5, + "column": { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + } + }, + { + "number": 6, + "column": { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + } + }, + { + "number": 7, + "column": { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1", + "name": "GetPostgresArrayTypes", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + }, + { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + }, + { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + }, + { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + }, + { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + }, + { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + ], + "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types (c_bytea) VALUES ($1)", + "name": "InsertPostgresArrayTypesBatch", + "cmd": ":copyfrom", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_array_types\nGROUP BY\n c_bytea\nLIMIT 1", + "name": "GetPostgresArrayTypesCnt", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "cnt", + "notNull": true, + "length": -1, + "isFuncCall": true, + "type": { + "name": "bigint" + } + } + ], + "filename": "query.sql" + }, + { + "text": "TRUNCATE TABLE postgres_array_types", + "name": "TruncatePostgresArrayTypes", + "cmd": ":exec", + "filename": "query.sql" } ], "sqlc_version": "v1.27.0", diff --git a/examples/NpgsqlDapperExample/request.message b/examples/NpgsqlDapperExample/request.message index d7603cf5..8b05217a 100644 --- a/examples/NpgsqlDapperExample/request.message +++ b/examples/NpgsqlDapperExample/request.message @@ -3,7 +3,7 @@ 2 postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/query.sqlbЗ examples/NpgsqlDapperExamplecsharp╚{"debugRequest":true,"generateCsproj":true,"namespaceName":"NpgsqlDapperExampleGen","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"notNull":false,"type":"int"}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"notNull":false,"type":"string"}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"notNull":true,"type":"DateTime"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"net8.0","useDapper":true}* -./dist/LocalRunner╖х public"ЛpublicГ +./dist/LocalRunnerйц public"¤publicГ authors) id0         R authorsb  bigserial& name0         R authorsbtext# @@ -13,7 +13,7 @@ postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/qu name0         Rbooksbtext5 author_id0         Rbooksb pg_catalogint8) - description0         RbooksbtextК + description0         Rbooksbtextф postgres_types< c_boolean0         Rpostgres_typesb pg_catalogbool7 @@ -58,25 +58,15 @@ pg_catalogvarchar1 c_jsonb0         Rpostgres_typesbjsonb5 c_jsonpath0         Rpostgres_typesb -jsonpath- +jsonpath+ +c_xml0         Rpostgres_typesbxml- c_cidr0         Rpostgres_typesbcidr- c_inet0         Rpostgres_typesbinet3 c_macaddr0         Rpostgres_typesb macaddr5 c_macaddr80         Rpostgres_typesb macaddr8- -c_uuid0         Rpostgres_typesbuuid/ -c_bytea0         Rpostgres_typesbbyteaG -c_boolean_array 0         Rpostgres_typesb -pg_catalogboolИ8 - c_text_array 0         Rpostgres_typesbtextИG -c_integer_array 0         Rpostgres_typesb -pg_catalogint4ИJ -c_decimal_array 0         Rpostgres_typesb -pg_catalognumericИ8 - c_date_array 0         Rpostgres_typesbdateИN -c_timestamp_array 0         Rpostgres_typesb -pg_catalog timestampИ╡ +c_uuid0         Rpostgres_typesbuuid╡ postgres_geometric_types9 c_point0         Rpostgres_geometric_typesbpoint7 c_line0         Rpostgres_geometric_typesbline7 @@ -84,7 +74,19 @@ pg_catalog timestamp c_box0         Rpostgres_geometric_typesbbox7 c_path0         Rpostgres_geometric_typesbpath= c_polygon0         Rpostgres_geometric_typesb polygon; -c_circle0         Rpostgres_geometric_typesbcircle" pg_temp"ц▓ +c_circle0         Rpostgres_geometric_typesbcircleХ +postgres_array_types5 +c_bytea0         Rpostgres_array_typesbbyteaM +c_boolean_array 0         Rpostgres_array_typesb +pg_catalogboolИ> + c_text_array 0         Rpostgres_array_typesbtextИM +c_integer_array 0         Rpostgres_array_typesb +pg_catalogint4ИP +c_decimal_array 0         Rpostgres_array_typesb +pg_catalognumericИ> + c_date_array 0         Rpostgres_array_typesbdateИT +c_timestamp_array 0         Rpostgres_array_typesb +pg_catalog timestampИ" pg_temp"ц▓ pg_catalogЙ & @@ -10296,8 +10298,8 @@ WHERE books.name = $1GetAuthorsByBookName:many"- name0         R authorsbtextzname"( bio0         R authorsbtextzbio" books0         brbooks*.* -name0         Rbooksbtextzname: query.sql╢ -▌INSERT INTO postgres_types +name0         Rbooksbtextzname: query.sqlИ +мINSERT INTO postgres_types ( c_boolean, c_bit, @@ -10324,17 +10326,11 @@ WHERE books.name = $1GetAuthorsByBookName:many"- c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, - c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8 ) VALUES ( $1, @@ -10362,17 +10358,11 @@ VALUES ( $23::json, $24::jsonb, $25::jsonpath, - $26, + $26::xml, $27, - $28::macaddr, - $29::macaddr8, - $30, - $31, - $32, - $33, - $34, - $35, - $36 + $28, + $29::macaddr, + $30::macaddr8 )InsertPostgresTypes:exec*TP c_boolean0         8Rpublicpostgres_typesbpg_catalog.boolz c_boolean*KG c_bit0         8Rpublicpostgres_typesbpg_catalog.bitzc_bit*VR @@ -10405,21 +10395,15 @@ c_interval*PL c_jsonb0         bjsonb*'# c_jsonpath0         b -jsonpath*C? -c_cidr0         8Rpublicpostgres_typesbcidrzc_cidr*C? -c_inet0         8Rpublicpostgres_typesbinetzc_inet*%! - c_macaddr0         b macaddr*'# +jsonpath* +c_xml0         bxml*C? +c_cidr0         8Rpublicpostgres_typesbcidrzc_cidr*C? +c_inet0         8Rpublicpostgres_typesbinetzc_inet*%! + c_macaddr0         b macaddr*'# c_macaddr80         b -macaddr8*FB -c_bytea0         8Rpublicpostgres_typesbbyteazc_bytea*ea -c_boolean_array 0         8Rpublicpostgres_typesbpg_catalog.boolzc_boolean_arrayИ*T P - c_text_array 0         8Rpublicpostgres_typesbtextz c_text_arrayИ*e!a -c_integer_array 0         8Rpublicpostgres_typesbpg_catalog.int4zc_integer_arrayИ*h"d -c_decimal_array 0         8Rpublicpostgres_typesbpg_catalog.numericzc_decimal_arrayИ*T#P - c_date_array 0         8Rpublicpostgres_typesbdatez c_date_arrayИ*n$j -c_timestamp_array 0         8Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_arrayИ: query.sqlBpostgres_types╧ -░INSERT INTO postgres_types +macaddr8: query.sqlBpostgres_typesЗ +▄INSERT INTO postgres_types ( c_boolean, c_smallint, @@ -10441,7 +10425,9 @@ c_macaddr80 c_bpchar, c_text, c_uuid, - c_bytea + c_cidr, + c_inet, + c_macaddr ) VALUES ( $1, @@ -10464,7 +10450,9 @@ VALUES ( $18, $19, $20, - $21 + $21, + $22, + $23 )InsertPostgresTypesBatch :copyfrom*RN c_boolean0         Rpublicpostgres_typesbpg_catalog.boolz c_boolean*TP @@ -10490,9 +10478,11 @@ c_interval*NJ c_character_varying0         Rpublicpostgres_typesbpg_catalog.varcharzc_character_varying*GC c_bpchar0         Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0         Rpublicpostgres_typesbtextzc_text*A= -c_uuid0         Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0         Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types╡ -ВSELECT +c_uuid0         Rpublicpostgres_typesbuuidzc_uuid*A= +c_cidr0         Rpublicpostgres_typesbcidrzc_cidr*A= +c_inet0         Rpublicpostgres_typesbinetzc_inet*JF + c_macaddr0         Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_typesн +ДSELECT c_boolean, c_bit, c_smallint, @@ -10518,17 +10508,11 @@ c_interval*NJ c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, - c_macaddr8::TEXT AS c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8::TEXT AS c_macaddr8 FROM postgres_types LIMIT 1GetPostgresTypes:one"G c_boolean0         Rpostgres_typesb @@ -10578,24 +10562,14 @@ pg_catalogvarcharzc_character_varying"; c_jsonpath0         Rpostgres_typesb jsonpathz -c_jsonpath"5 +c_jsonpath"2 +c_xml0         Rpostgres_typesbxmlzc_xml"5 c_cidr0         Rpostgres_typesbcidrzc_cidr"5 c_inet0         Rpostgres_typesbinetzc_inet"> c_macaddr0         Rpostgres_typesb macaddrz c_macaddr"! -c_macaddr80         btext"8 -c_bytea0         Rpostgres_typesbbyteazc_bytea"X -c_boolean_array 0         Rpostgres_typesb -pg_catalogboolzc_boolean_arrayИ"F - c_text_array 0         Rpostgres_typesbtextz c_text_arrayИ"X -c_integer_array 0         Rpostgres_typesb -pg_catalogint4zc_integer_arrayИ"[ -c_decimal_array 0         Rpostgres_typesb -pg_catalognumericzc_decimal_arrayИ"F - c_date_array 0         Rpostgres_typesbdatez c_date_arrayИ"a -c_timestamp_array 0         Rpostgres_typesb -pg_catalog timestampzc_timestamp_arrayИ: query.sql№ -╞SELECT +c_macaddr80         btext: query.sqlд +·SELECT c_smallint, c_boolean, c_integer, @@ -10616,7 +10590,9 @@ pg_catalog timestampzc_timestamp_array c_bpchar, c_text, c_uuid, - c_bytea, + c_cidr, + c_inet, + c_macaddr, COUNT(*) AS cnt FROM postgres_types GROUP BY @@ -10640,7 +10616,9 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea + c_cidr, + c_inet, + c_macaddr LIMIT 1GetPostgresTypesCnt:one"I c_smallint0         Rpostgres_typesb @@ -10680,8 +10658,10 @@ pg_catalogvarcharz c_varchar"^ pg_catalogvarcharzc_character_varying"; c_bpchar0         Rpostgres_typesbbpcharzc_bpchar"5 c_text0         Rpostgres_typesbtextzc_text"5 -c_uuid0         Rpostgres_typesbuuidzc_uuid"8 -c_bytea0         Rpostgres_typesbbyteazc_bytea" +c_uuid0         Rpostgres_typesbuuidzc_uuid"5 +c_cidr0         Rpostgres_typesbcidrzc_cidr"5 +c_inet0         Rpostgres_typesbinetzc_inet"> + c_macaddr0         Rpostgres_typesb macaddrz c_macaddr" cnt0         @bbigint: query.sql░ ЖSELECT MAX(c_integer) AS max_integer, @@ -10725,4 +10705,46 @@ hSELECT c_point, c_line, c_lseg, c_box, c_path, c_polygon, c_circle FROM postgre c_polygon0         Rpostgres_geometric_typesb polygonz c_polygon"E c_circle0         Rpostgres_geometric_typesbcirclezc_circle: query.sqlH TRUNCATE TABLE postgres_typesTruncatePostgresTypes:exec: query.sqlU -'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql"v1.27.0* {"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"net8.0","namespaceName":"NpgsqlDapperExampleGen","useDapper":true,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file +'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql═ +╬INSERT INTO postgres_array_types +( + c_bytea, + c_boolean_array, + c_text_array, + c_integer_array, + c_decimal_array, + c_date_array, + c_timestamp_array +) +VALUES ($1, $2, $3, $4, $5, $6, $7)InsertPostgresArrayTypes:exec*JF +c_bytea0         Rpublicpostgres_array_typesbbyteazc_bytea*ie +c_boolean_array 0         Rpublicpostgres_array_typesbpg_catalog.boolzc_boolean_arrayИ*XT + c_text_array 0         Rpublicpostgres_array_typesbtextz c_text_arrayИ*ie +c_integer_array 0         Rpublicpostgres_array_typesbpg_catalog.int4zc_integer_arrayИ*lh +c_decimal_array 0         Rpublicpostgres_array_typesbpg_catalog.numericzc_decimal_arrayИ*XT + c_date_array 0         Rpublicpostgres_array_typesbdatez c_date_arrayИ*rn +c_timestamp_array 0         Rpublicpostgres_array_typesbpg_catalog.timestampzc_timestamp_arrayИ: query.sqlBpostgres_array_typesе +ТSELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1GetPostgresArrayTypes:one"> +c_bytea0         Rpostgres_array_typesbbyteazc_bytea"^ +c_boolean_array 0         Rpostgres_array_typesb +pg_catalogboolzc_boolean_arrayИ"L + c_text_array 0         Rpostgres_array_typesbtextz c_text_arrayИ"^ +c_integer_array 0         Rpostgres_array_typesb +pg_catalogint4zc_integer_arrayИ"a +c_decimal_array 0         Rpostgres_array_typesb +pg_catalognumericzc_decimal_arrayИ"L + c_date_array 0         Rpostgres_array_typesbdatez c_date_arrayИ"g +c_timestamp_array 0         Rpostgres_array_typesb +pg_catalog timestampzc_timestamp_arrayИ: query.sql╤ +6INSERT INTO postgres_array_types (c_bytea) VALUES ($1)InsertPostgresArrayTypesBatch :copyfrom*JF +c_bytea0         Rpublicpostgres_array_typesbbyteazc_bytea: query.sqlBpostgres_array_typesы +^SELECT + c_bytea, + COUNT(*) AS cnt +FROM postgres_array_types +GROUP BY + c_bytea +LIMIT 1GetPostgresArrayTypesCnt:one"> +c_bytea0         Rpostgres_array_typesbbyteazc_bytea" +cnt0         @bbigint: query.sqlS +#TRUNCATE TABLE postgres_array_typesTruncatePostgresArrayTypes:exec: query.sql"v1.27.0* {"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"net8.0","namespaceName":"NpgsqlDapperExampleGen","useDapper":true,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file diff --git a/examples/NpgsqlDapperLegacyExample/Models.cs b/examples/NpgsqlDapperLegacyExample/Models.cs index df908aea..b495a364 100644 --- a/examples/NpgsqlDapperLegacyExample/Models.cs +++ b/examples/NpgsqlDapperLegacyExample/Models.cs @@ -3,9 +3,11 @@ namespace NpgsqlDapperLegacyExampleGen { using NpgsqlTypes; using System; + using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Text.Json; + using System.Xml; public class Author { @@ -46,18 +48,12 @@ public class PostgresType public JsonElement? CJsonStringOverride { get; set; } public JsonElement? CJsonb { get; set; } public string CJsonpath { get; set; } + public XmlDocument CXml { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } public string CMacaddr8 { get; set; } public Guid? CUuid { get; set; } - public byte[] CBytea { get; set; } - public bool[] CBooleanArray { get; set; } - public string[] CTextArray { get; set; } - public int[] CIntegerArray { get; set; } - public decimal[] CDecimalArray { get; set; } - public DateTime[] CDateArray { get; set; } - public DateTime[] CTimestampArray { get; set; } }; public class PostgresGeometricType { @@ -69,4 +65,14 @@ public class PostgresGeometricType public NpgsqlPolygon? CPolygon { get; set; } public NpgsqlCircle? CCircle { get; set; } }; + public class PostgresArrayType + { + public byte[] CBytea { get; set; } + public bool[] CBooleanArray { get; set; } + public string[] CTextArray { get; set; } + public int[] CIntegerArray { get; set; } + public decimal[] CDecimalArray { get; set; } + public DateTime[] CDateArray { get; set; } + public DateTime[] CTimestampArray { get; set; } + }; } \ No newline at end of file diff --git a/examples/NpgsqlDapperLegacyExample/QuerySql.cs b/examples/NpgsqlDapperLegacyExample/QuerySql.cs index 740a5a21..782d4024 100644 --- a/examples/NpgsqlDapperLegacyExample/QuerySql.cs +++ b/examples/NpgsqlDapperLegacyExample/QuerySql.cs @@ -16,6 +16,7 @@ namespace NpgsqlDapperLegacyExampleGen using System.Net.NetworkInformation; using System.Text.Json; using System.Threading.Tasks; + using System.Xml; public class QuerySql { @@ -529,7 +530,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8 ) "; public class InsertPostgresTypesArgs { public bool? CBoolean { get; set; } @@ -557,17 +558,11 @@ public class InsertPostgresTypesArgs public string CJsonStringOverride { get; set; } public JsonElement? CJsonb { get; set; } public string CJsonpath { get; set; } + public XmlDocument CXml { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } public string CMacaddr8 { get; set; } - public byte[] CBytea { get; set; } - public bool[] CBooleanArray { get; set; } - public string[] CTextArray { get; set; } - public int[] CIntegerArray { get; set; } - public decimal[] CDecimalArray { get; set; } - public DateTime[] CDateArray { get; set; } - public DateTime[] CTimestampArray { get; set; } }; public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) { @@ -597,17 +592,11 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) queryParams.Add("c_json_string_override", args.CJsonStringOverride); queryParams.Add("c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : null); queryParams.Add("c_jsonpath", args.CJsonpath); + queryParams.Add("c_xml", args.CXml != null ? args.CXml.OuterXml : null); queryParams.Add("c_cidr", args.CCidr); queryParams.Add("c_inet", args.CInet); queryParams.Add("c_macaddr", args.CMacaddr); queryParams.Add("c_macaddr8", args.CMacaddr8); - queryParams.Add("c_bytea", args.CBytea); - queryParams.Add("c_boolean_array", args.CBooleanArray); - queryParams.Add("c_text_array", args.CTextArray); - queryParams.Add("c_integer_array", args.CIntegerArray); - queryParams.Add("c_decimal_array", args.CDecimalArray); - queryParams.Add("c_date_array", args.CDateArray); - queryParams.Add("c_timestamp_array", args.CTimestampArray); if (this.Transaction == null) { using (var connection = new NpgsqlConnection(ConnectionString)) @@ -626,7 +615,7 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) await this.Transaction.Connection.ExecuteAsync(InsertPostgresTypesSql, queryParams, transaction: this.Transaction); } - private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea) FROM STDIN (FORMAT BINARY)"; + private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; public class InsertPostgresTypesBatchArgs { public bool? CBoolean { get; set; } @@ -649,7 +638,9 @@ public class InsertPostgresTypesBatchArgs public string CBpchar { get; set; } public string CText { get; set; } public Guid? CUuid { get; set; } - public byte[] CBytea { get; set; } + public NpgsqlCidr? CCidr { get; set; } + public IPAddress CInet { get; set; } + public PhysicalAddress CMacaddr { get; set; } }; public async Task InsertPostgresTypesBatch(List args) { @@ -681,7 +672,9 @@ public async Task InsertPostgresTypesBatch(List ar await writer.WriteAsync(row.CBpchar); await writer.WriteAsync(row.CText); await writer.WriteAsync(row.CUuid); - await writer.WriteAsync(row.CBytea); + await writer.WriteAsync(row.CCidr); + await writer.WriteAsync(row.CInet); + await writer.WriteAsync(row.CMacaddr); } await writer.CompleteAsync(); @@ -691,7 +684,7 @@ public async Task InsertPostgresTypesBatch(List ar } } - private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; + private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8 FROM postgres_types LIMIT 1 "; public class GetPostgresTypesRow { public bool? CBoolean { get; set; } @@ -719,17 +712,11 @@ public class GetPostgresTypesRow public string CJsonStringOverride { get; set; } public JsonElement? CJsonb { get; set; } public string CJsonpath { get; set; } + public XmlDocument CXml { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } public string CMacaddr8 { get; set; } - public byte[] CBytea { get; set; } - public bool[] CBooleanArray { get; set; } - public string[] CTextArray { get; set; } - public int[] CIntegerArray { get; set; } - public decimal[] CDecimalArray { get; set; } - public DateTime[] CDateArray { get; set; } - public DateTime[] CTimestampArray { get; set; } }; public async Task GetPostgresTypes() { @@ -750,7 +737,7 @@ public async Task GetPostgresTypes() return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresTypesSql, transaction: this.Transaction); } - private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea LIMIT 1 "; + private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr LIMIT 1 "; public class GetPostgresTypesCntRow { public short? CSmallint { get; set; } @@ -773,7 +760,9 @@ public class GetPostgresTypesCntRow public string CBpchar { get; set; } public string CText { get; set; } public Guid? CUuid { get; set; } - public byte[] CBytea { get; set; } + public NpgsqlCidr? CCidr { get; set; } + public IPAddress CInet { get; set; } + public PhysicalAddress CMacaddr { get; set; } public long Cnt { get; set; } }; public async Task GetPostgresTypesCnt() @@ -968,5 +957,145 @@ public async Task TruncatePostgresGeoTypes() await this.Transaction.Connection.ExecuteAsync(TruncatePostgresGeoTypesSql, transaction: this.Transaction); } + + private const string InsertPostgresArrayTypesSql = "INSERT INTO postgres_array_types(c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + public class InsertPostgresArrayTypesArgs + { + public byte[] CBytea { get; set; } + public bool[] CBooleanArray { get; set; } + public string[] CTextArray { get; set; } + public int[] CIntegerArray { get; set; } + public decimal[] CDecimalArray { get; set; } + public DateTime[] CDateArray { get; set; } + public DateTime[] CTimestampArray { get; set; } + }; + public async Task InsertPostgresArrayTypes(InsertPostgresArrayTypesArgs args) + { + var queryParams = new Dictionary(); + queryParams.Add("c_bytea", args.CBytea); + queryParams.Add("c_boolean_array", args.CBooleanArray); + queryParams.Add("c_text_array", args.CTextArray); + queryParams.Add("c_integer_array", args.CIntegerArray); + queryParams.Add("c_decimal_array", args.CDecimalArray); + queryParams.Add("c_date_array", args.CDateArray); + queryParams.Add("c_timestamp_array", args.CTimestampArray); + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.ExecuteAsync(InsertPostgresArrayTypesSql, queryParams); + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + await this.Transaction.Connection.ExecuteAsync(InsertPostgresArrayTypesSql, queryParams, transaction: this.Transaction); + } + + private const string GetPostgresArrayTypesSql = "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1"; + public class GetPostgresArrayTypesRow + { + public byte[] CBytea { get; set; } + public bool[] CBooleanArray { get; set; } + public string[] CTextArray { get; set; } + public int[] CIntegerArray { get; set; } + public decimal[] CDecimalArray { get; set; } + public DateTime[] CDateArray { get; set; } + public DateTime[] CTimestampArray { get; set; } + }; + public async Task GetPostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + var result = await connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesSql); + return result; + } + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesSql, transaction: this.Transaction); + } + + private const string InsertPostgresArrayTypesBatchSql = "COPY postgres_array_types (c_bytea) FROM STDIN (FORMAT BINARY)"; + public class InsertPostgresArrayTypesBatchArgs + { + public byte[] CBytea { get; set; } + }; + public async Task InsertPostgresArrayTypesBatch(List args) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.OpenAsync(); + using (var writer = await connection.BeginBinaryImportAsync(InsertPostgresArrayTypesBatchSql)) + { + foreach (var row in args) + { + await writer.StartRowAsync(); + await writer.WriteAsync(row.CBytea); + } + + await writer.CompleteAsync(); + } + + await connection.CloseAsync(); + } + } + + private const string GetPostgresArrayTypesCntSql = "SELECT c_bytea , COUNT (* ) AS cnt FROM postgres_array_types GROUP BY c_bytea LIMIT 1 "; + public class GetPostgresArrayTypesCntRow + { + public byte[] CBytea { get; set; } + public long Cnt { get; set; } + }; + public async Task GetPostgresArrayTypesCnt() + { + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + var result = await connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesCntSql); + return result; + } + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetPostgresArrayTypesCntSql, transaction: this.Transaction); + } + + private const string TruncatePostgresArrayTypesSql = "TRUNCATE TABLE postgres_array_types"; + public async Task TruncatePostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.ExecuteAsync(TruncatePostgresArrayTypesSql); + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + await this.Transaction.Connection.ExecuteAsync(TruncatePostgresArrayTypesSql, transaction: this.Transaction); + } } } \ No newline at end of file diff --git a/examples/NpgsqlDapperLegacyExample/Utils.cs b/examples/NpgsqlDapperLegacyExample/Utils.cs index 8d3d27be..585d0584 100644 --- a/examples/NpgsqlDapperLegacyExample/Utils.cs +++ b/examples/NpgsqlDapperLegacyExample/Utils.cs @@ -8,17 +8,16 @@ namespace NpgsqlDapperLegacyExampleGen using System.Net; using System.Net.NetworkInformation; using System.Text.Json; + using System.Xml; public static class Utils { - public class JsonElementTypeHandler : SqlMapper.TypeHandler + private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) { if (value is string s) return JsonDocument.Parse(s).RootElement; - if (value is null) - return default; throw new DataException($"Cannot convert {value?.GetType()} to JsonElement"); } @@ -28,9 +27,30 @@ public override void SetValue(IDbDataParameter parameter, JsonElement value) } } + private class XmlDocumentTypeHandler : SqlMapper.TypeHandler + { + public override XmlDocument Parse(object value) + { + if (value is string s) + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(s); + return xmlDoc; + } + + throw new DataException($"Cannot convert {value?.GetType()} to XmlDocument"); + } + + public override void SetValue(IDbDataParameter parameter, XmlDocument value) + { + parameter.Value = value.OuterXml; + } + } + public static void ConfigureSqlMapper() { SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler()); + SqlMapper.AddTypeHandler(typeof(XmlDocument), new XmlDocumentTypeHandler()); RegisterNpgsqlTypeHandler(); RegisterNpgsqlTypeHandler(); RegisterNpgsqlTypeHandler(); diff --git a/examples/NpgsqlDapperLegacyExample/request.json b/examples/NpgsqlDapperLegacyExample/request.json index f1505a5c..3360c681 100644 --- a/examples/NpgsqlDapperLegacyExample/request.json +++ b/examples/NpgsqlDapperLegacyExample/request.json @@ -374,6 +374,16 @@ "name": "jsonpath" } }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + } + }, { "name": "c_cidr", "length": -1, @@ -423,169 +433,176 @@ "type": { "name": "uuid" } - }, + } + ] + }, + { + "rel": { + "name": "postgres_geometric_types" + }, + "columns": [ { - "name": "c_bytea", + "name": "c_point", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "bytea" + "name": "point" } }, { - "name": "c_boolean_array", - "isArray": true, + "name": "c_line", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "arrayDims": 1 + "name": "line" + } }, { - "name": "c_text_array", - "isArray": true, + "name": "c_lseg", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "text" - }, - "arrayDims": 1 + "name": "lseg" + } }, { - "name": "c_integer_array", - "isArray": true, + "name": "c_box", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "arrayDims": 1 + "name": "box" + } }, { - "name": "c_decimal_array", - "isArray": true, + "name": "c_path", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "arrayDims": 1 + "name": "path" + } }, { - "name": "c_date_array", - "isArray": true, + "name": "c_polygon", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "date" - }, - "arrayDims": 1 + "name": "polygon" + } }, { - "name": "c_timestamp_array", - "isArray": true, + "name": "c_circle", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "arrayDims": 1 + "name": "circle" + } } ] }, { "rel": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "columns": [ { - "name": "c_point", + "name": "c_bytea", "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "point" + "name": "bytea" } }, { - "name": "c_line", + "name": "c_boolean_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "line" - } + "schema": "pg_catalog", + "name": "bool" + }, + "arrayDims": 1 }, { - "name": "c_lseg", + "name": "c_text_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "lseg" - } + "name": "text" + }, + "arrayDims": 1 }, { - "name": "c_box", + "name": "c_integer_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "box" - } + "schema": "pg_catalog", + "name": "int4" + }, + "arrayDims": 1 }, { - "name": "c_path", + "name": "c_decimal_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "path" - } + "schema": "pg_catalog", + "name": "numeric" + }, + "arrayDims": 1 }, { - "name": "c_polygon", + "name": "c_date_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "polygon" - } + "name": "date" + }, + "arrayDims": 1 }, { - "name": "c_circle", + "name": "c_timestamp_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "circle" - } + "schema": "pg_catalog", + "name": "timestamp" + }, + "arrayDims": 1 } ] } @@ -33190,7 +33207,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26,\n $27,\n $28::macaddr,\n $29::macaddr8,\n $30, \n $31,\n $32, \n $33,\n $34,\n $35,\n $36\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8\n)", "name": "InsertPostgresTypes", "cmd": ":exec", "parameters": [ @@ -33572,6 +33589,16 @@ }, { "number": 26, + "column": { + "name": "c_xml", + "length": -1, + "type": { + "name": "xml" + } + } + }, + { + "number": 27, "column": { "name": "c_cidr", "length": -1, @@ -33587,7 +33614,7 @@ } }, { - "number": 27, + "number": 28, "column": { "name": "c_inet", "length": -1, @@ -33603,7 +33630,7 @@ } }, { - "number": 28, + "number": 29, "column": { "name": "c_macaddr", "length": -1, @@ -33613,7 +33640,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_macaddr8", "length": -1, @@ -33621,130 +33648,6 @@ "name": "macaddr8" } } - }, - { - "number": 30, - "column": { - "name": "c_bytea", - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - } - }, - { - "number": 31, - "column": { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - } - }, - { - "number": 32, - "column": { - "name": "c_text_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - } - }, - { - "number": 33, - "column": { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - } - }, - { - "number": 34, - "column": { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - } - }, - { - "number": 35, - "column": { - "name": "c_date_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - } - }, - { - "number": 36, - "column": { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 - } } ], "filename": "query.sql", @@ -33753,7 +33656,7 @@ } }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23\n)", "name": "InsertPostgresTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -34060,16 +33963,46 @@ { "number": 21, "column": { - "name": "c_bytea", + "name": "c_cidr", "length": -1, "table": { "schema": "public", "name": "postgres_types" }, "type": { - "name": "bytea" + "name": "cidr" }, - "originalName": "c_bytea" + "originalName": "c_cidr" + } + }, + { + "number": 22, + "column": { + "name": "c_inet", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + } + }, + { + "number": 23, + "column": { + "name": "c_macaddr", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" } } ], @@ -34079,7 +34012,7 @@ } }, { - "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", + "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8\nFROM postgres_types \nLIMIT 1", "name": "GetPostgresTypes", "cmd": ":one", "columns": [ @@ -34374,6 +34307,17 @@ }, "originalName": "c_jsonpath" }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + }, + "originalName": "c_xml" + }, { "name": "c_cidr", "length": -1, @@ -34414,105 +34358,12 @@ "type": { "name": "text" } - }, - { - "name": "c_bytea", - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - }, - { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - }, - { - "name": "c_text_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - }, - { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - }, - { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - }, - { - "name": "c_date_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - }, - { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 } ], "filename": "query.sql" }, { - "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\nLIMIT 1", + "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", "name": "GetPostgresTypesCnt", "cmd": ":one", "columns": [ @@ -34752,15 +34603,37 @@ "originalName": "c_uuid" }, { - "name": "c_bytea", + "name": "c_cidr", "length": -1, "table": { "name": "postgres_types" }, "type": { - "name": "bytea" + "name": "cidr" }, - "originalName": "c_bytea" + "originalName": "c_cidr" + }, + { + "name": "c_inet", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + }, + { + "name": "c_macaddr", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" }, { "name": "cnt", @@ -35137,6 +35010,295 @@ "name": "TruncatePostgresGeoTypes", "cmd": ":exec", "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types\n(\n c_bytea,\n c_boolean_array,\n c_text_array,\n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES ($1, $2, $3, $4, $5, $6, $7)", + "name": "InsertPostgresArrayTypes", + "cmd": ":exec", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + }, + { + "number": 2, + "column": { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + } + }, + { + "number": 3, + "column": { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + } + }, + { + "number": 4, + "column": { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + } + }, + { + "number": 5, + "column": { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + } + }, + { + "number": 6, + "column": { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + } + }, + { + "number": 7, + "column": { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1", + "name": "GetPostgresArrayTypes", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + }, + { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + }, + { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + }, + { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + }, + { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + }, + { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + ], + "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types (c_bytea) VALUES ($1)", + "name": "InsertPostgresArrayTypesBatch", + "cmd": ":copyfrom", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_array_types\nGROUP BY\n c_bytea\nLIMIT 1", + "name": "GetPostgresArrayTypesCnt", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "cnt", + "notNull": true, + "length": -1, + "isFuncCall": true, + "type": { + "name": "bigint" + } + } + ], + "filename": "query.sql" + }, + { + "text": "TRUNCATE TABLE postgres_array_types", + "name": "TruncatePostgresArrayTypes", + "cmd": ":exec", + "filename": "query.sql" } ], "sqlc_version": "v1.27.0", diff --git a/examples/NpgsqlDapperLegacyExample/request.message b/examples/NpgsqlDapperLegacyExample/request.message index 1eeedbbc..0bf7eb12 100644 --- a/examples/NpgsqlDapperLegacyExample/request.message +++ b/examples/NpgsqlDapperLegacyExample/request.message @@ -3,7 +3,7 @@ 2 postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/query.sqlbЫ "examples/NpgsqlDapperLegacyExamplecsharp╓{"debugRequest":true,"generateCsproj":true,"namespaceName":"NpgsqlDapperLegacyExampleGen","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"notNull":false,"type":"int"}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"notNull":false,"type":"string"}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"notNull":true,"type":"DateTime"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"netstandard2.0","useDapper":true}* -./dist/LocalRunner╖х public"ЛpublicГ +./dist/LocalRunnerйц public"¤publicГ authors) id0         R authorsb  bigserial& name0         R authorsbtext# @@ -13,7 +13,7 @@ postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/qu name0         Rbooksbtext5 author_id0         Rbooksb pg_catalogint8) - description0         RbooksbtextК + description0         Rbooksbtextф postgres_types< c_boolean0         Rpostgres_typesb pg_catalogbool7 @@ -58,25 +58,15 @@ pg_catalogvarchar1 c_jsonb0         Rpostgres_typesbjsonb5 c_jsonpath0         Rpostgres_typesb -jsonpath- +jsonpath+ +c_xml0         Rpostgres_typesbxml- c_cidr0         Rpostgres_typesbcidr- c_inet0         Rpostgres_typesbinet3 c_macaddr0         Rpostgres_typesb macaddr5 c_macaddr80         Rpostgres_typesb macaddr8- -c_uuid0         Rpostgres_typesbuuid/ -c_bytea0         Rpostgres_typesbbyteaG -c_boolean_array 0         Rpostgres_typesb -pg_catalogboolИ8 - c_text_array 0         Rpostgres_typesbtextИG -c_integer_array 0         Rpostgres_typesb -pg_catalogint4ИJ -c_decimal_array 0         Rpostgres_typesb -pg_catalognumericИ8 - c_date_array 0         Rpostgres_typesbdateИN -c_timestamp_array 0         Rpostgres_typesb -pg_catalog timestampИ╡ +c_uuid0         Rpostgres_typesbuuid╡ postgres_geometric_types9 c_point0         Rpostgres_geometric_typesbpoint7 c_line0         Rpostgres_geometric_typesbline7 @@ -84,7 +74,19 @@ pg_catalog timestamp c_box0         Rpostgres_geometric_typesbbox7 c_path0         Rpostgres_geometric_typesbpath= c_polygon0         Rpostgres_geometric_typesb polygon; -c_circle0         Rpostgres_geometric_typesbcircle" pg_temp"ц▓ +c_circle0         Rpostgres_geometric_typesbcircleХ +postgres_array_types5 +c_bytea0         Rpostgres_array_typesbbyteaM +c_boolean_array 0         Rpostgres_array_typesb +pg_catalogboolИ> + c_text_array 0         Rpostgres_array_typesbtextИM +c_integer_array 0         Rpostgres_array_typesb +pg_catalogint4ИP +c_decimal_array 0         Rpostgres_array_typesb +pg_catalognumericИ> + c_date_array 0         Rpostgres_array_typesbdateИT +c_timestamp_array 0         Rpostgres_array_typesb +pg_catalog timestampИ" pg_temp"ц▓ pg_catalogЙ & @@ -10296,8 +10298,8 @@ WHERE books.name = $1GetAuthorsByBookName:many"- name0         R authorsbtextzname"( bio0         R authorsbtextzbio" books0         brbooks*.* -name0         Rbooksbtextzname: query.sql╢ -▌INSERT INTO postgres_types +name0         Rbooksbtextzname: query.sqlИ +мINSERT INTO postgres_types ( c_boolean, c_bit, @@ -10324,17 +10326,11 @@ WHERE books.name = $1GetAuthorsByBookName:many"- c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, - c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8 ) VALUES ( $1, @@ -10362,17 +10358,11 @@ VALUES ( $23::json, $24::jsonb, $25::jsonpath, - $26, + $26::xml, $27, - $28::macaddr, - $29::macaddr8, - $30, - $31, - $32, - $33, - $34, - $35, - $36 + $28, + $29::macaddr, + $30::macaddr8 )InsertPostgresTypes:exec*TP c_boolean0         8Rpublicpostgres_typesbpg_catalog.boolz c_boolean*KG c_bit0         8Rpublicpostgres_typesbpg_catalog.bitzc_bit*VR @@ -10405,21 +10395,15 @@ c_interval*PL c_jsonb0         bjsonb*'# c_jsonpath0         b -jsonpath*C? -c_cidr0         8Rpublicpostgres_typesbcidrzc_cidr*C? -c_inet0         8Rpublicpostgres_typesbinetzc_inet*%! - c_macaddr0         b macaddr*'# +jsonpath* +c_xml0         bxml*C? +c_cidr0         8Rpublicpostgres_typesbcidrzc_cidr*C? +c_inet0         8Rpublicpostgres_typesbinetzc_inet*%! + c_macaddr0         b macaddr*'# c_macaddr80         b -macaddr8*FB -c_bytea0         8Rpublicpostgres_typesbbyteazc_bytea*ea -c_boolean_array 0         8Rpublicpostgres_typesbpg_catalog.boolzc_boolean_arrayИ*T P - c_text_array 0         8Rpublicpostgres_typesbtextz c_text_arrayИ*e!a -c_integer_array 0         8Rpublicpostgres_typesbpg_catalog.int4zc_integer_arrayИ*h"d -c_decimal_array 0         8Rpublicpostgres_typesbpg_catalog.numericzc_decimal_arrayИ*T#P - c_date_array 0         8Rpublicpostgres_typesbdatez c_date_arrayИ*n$j -c_timestamp_array 0         8Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_arrayИ: query.sqlBpostgres_types╧ -░INSERT INTO postgres_types +macaddr8: query.sqlBpostgres_typesЗ +▄INSERT INTO postgres_types ( c_boolean, c_smallint, @@ -10441,7 +10425,9 @@ c_macaddr80 c_bpchar, c_text, c_uuid, - c_bytea + c_cidr, + c_inet, + c_macaddr ) VALUES ( $1, @@ -10464,7 +10450,9 @@ VALUES ( $18, $19, $20, - $21 + $21, + $22, + $23 )InsertPostgresTypesBatch :copyfrom*RN c_boolean0         Rpublicpostgres_typesbpg_catalog.boolz c_boolean*TP @@ -10490,9 +10478,11 @@ c_interval*NJ c_character_varying0         Rpublicpostgres_typesbpg_catalog.varcharzc_character_varying*GC c_bpchar0         Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0         Rpublicpostgres_typesbtextzc_text*A= -c_uuid0         Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0         Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types╡ -ВSELECT +c_uuid0         Rpublicpostgres_typesbuuidzc_uuid*A= +c_cidr0         Rpublicpostgres_typesbcidrzc_cidr*A= +c_inet0         Rpublicpostgres_typesbinetzc_inet*JF + c_macaddr0         Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_typesн +ДSELECT c_boolean, c_bit, c_smallint, @@ -10518,17 +10508,11 @@ c_interval*NJ c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, - c_macaddr8::TEXT AS c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8::TEXT AS c_macaddr8 FROM postgres_types LIMIT 1GetPostgresTypes:one"G c_boolean0         Rpostgres_typesb @@ -10578,24 +10562,14 @@ pg_catalogvarcharzc_character_varying"; c_jsonpath0         Rpostgres_typesb jsonpathz -c_jsonpath"5 +c_jsonpath"2 +c_xml0         Rpostgres_typesbxmlzc_xml"5 c_cidr0         Rpostgres_typesbcidrzc_cidr"5 c_inet0         Rpostgres_typesbinetzc_inet"> c_macaddr0         Rpostgres_typesb macaddrz c_macaddr"! -c_macaddr80         btext"8 -c_bytea0         Rpostgres_typesbbyteazc_bytea"X -c_boolean_array 0         Rpostgres_typesb -pg_catalogboolzc_boolean_arrayИ"F - c_text_array 0         Rpostgres_typesbtextz c_text_arrayИ"X -c_integer_array 0         Rpostgres_typesb -pg_catalogint4zc_integer_arrayИ"[ -c_decimal_array 0         Rpostgres_typesb -pg_catalognumericzc_decimal_arrayИ"F - c_date_array 0         Rpostgres_typesbdatez c_date_arrayИ"a -c_timestamp_array 0         Rpostgres_typesb -pg_catalog timestampzc_timestamp_arrayИ: query.sql№ -╞SELECT +c_macaddr80         btext: query.sqlд +·SELECT c_smallint, c_boolean, c_integer, @@ -10616,7 +10590,9 @@ pg_catalog timestampzc_timestamp_array c_bpchar, c_text, c_uuid, - c_bytea, + c_cidr, + c_inet, + c_macaddr, COUNT(*) AS cnt FROM postgres_types GROUP BY @@ -10640,7 +10616,9 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea + c_cidr, + c_inet, + c_macaddr LIMIT 1GetPostgresTypesCnt:one"I c_smallint0         Rpostgres_typesb @@ -10680,8 +10658,10 @@ pg_catalogvarcharz c_varchar"^ pg_catalogvarcharzc_character_varying"; c_bpchar0         Rpostgres_typesbbpcharzc_bpchar"5 c_text0         Rpostgres_typesbtextzc_text"5 -c_uuid0         Rpostgres_typesbuuidzc_uuid"8 -c_bytea0         Rpostgres_typesbbyteazc_bytea" +c_uuid0         Rpostgres_typesbuuidzc_uuid"5 +c_cidr0         Rpostgres_typesbcidrzc_cidr"5 +c_inet0         Rpostgres_typesbinetzc_inet"> + c_macaddr0         Rpostgres_typesb macaddrz c_macaddr" cnt0         @bbigint: query.sql░ ЖSELECT MAX(c_integer) AS max_integer, @@ -10725,4 +10705,46 @@ hSELECT c_point, c_line, c_lseg, c_box, c_path, c_polygon, c_circle FROM postgre c_polygon0         Rpostgres_geometric_typesb polygonz c_polygon"E c_circle0         Rpostgres_geometric_typesbcirclezc_circle: query.sqlH TRUNCATE TABLE postgres_typesTruncatePostgresTypes:exec: query.sqlU -'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql"v1.27.0*Н{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"netstandard2.0","namespaceName":"NpgsqlDapperLegacyExampleGen","useDapper":true,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file +'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql═ +╬INSERT INTO postgres_array_types +( + c_bytea, + c_boolean_array, + c_text_array, + c_integer_array, + c_decimal_array, + c_date_array, + c_timestamp_array +) +VALUES ($1, $2, $3, $4, $5, $6, $7)InsertPostgresArrayTypes:exec*JF +c_bytea0         Rpublicpostgres_array_typesbbyteazc_bytea*ie +c_boolean_array 0         Rpublicpostgres_array_typesbpg_catalog.boolzc_boolean_arrayИ*XT + c_text_array 0         Rpublicpostgres_array_typesbtextz c_text_arrayИ*ie +c_integer_array 0         Rpublicpostgres_array_typesbpg_catalog.int4zc_integer_arrayИ*lh +c_decimal_array 0         Rpublicpostgres_array_typesbpg_catalog.numericzc_decimal_arrayИ*XT + c_date_array 0         Rpublicpostgres_array_typesbdatez c_date_arrayИ*rn +c_timestamp_array 0         Rpublicpostgres_array_typesbpg_catalog.timestampzc_timestamp_arrayИ: query.sqlBpostgres_array_typesе +ТSELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1GetPostgresArrayTypes:one"> +c_bytea0         Rpostgres_array_typesbbyteazc_bytea"^ +c_boolean_array 0         Rpostgres_array_typesb +pg_catalogboolzc_boolean_arrayИ"L + c_text_array 0         Rpostgres_array_typesbtextz c_text_arrayИ"^ +c_integer_array 0         Rpostgres_array_typesb +pg_catalogint4zc_integer_arrayИ"a +c_decimal_array 0         Rpostgres_array_typesb +pg_catalognumericzc_decimal_arrayИ"L + c_date_array 0         Rpostgres_array_typesbdatez c_date_arrayИ"g +c_timestamp_array 0         Rpostgres_array_typesb +pg_catalog timestampzc_timestamp_arrayИ: query.sql╤ +6INSERT INTO postgres_array_types (c_bytea) VALUES ($1)InsertPostgresArrayTypesBatch :copyfrom*JF +c_bytea0         Rpublicpostgres_array_typesbbyteazc_bytea: query.sqlBpostgres_array_typesы +^SELECT + c_bytea, + COUNT(*) AS cnt +FROM postgres_array_types +GROUP BY + c_bytea +LIMIT 1GetPostgresArrayTypesCnt:one"> +c_bytea0         Rpostgres_array_typesbbyteazc_bytea" +cnt0         @bbigint: query.sqlS +#TRUNCATE TABLE postgres_array_typesTruncatePostgresArrayTypes:exec: query.sql"v1.27.0*Н{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"netstandard2.0","namespaceName":"NpgsqlDapperLegacyExampleGen","useDapper":true,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file diff --git a/examples/NpgsqlExample/Models.cs b/examples/NpgsqlExample/Models.cs index 7391c3d4..ead0cb95 100644 --- a/examples/NpgsqlExample/Models.cs +++ b/examples/NpgsqlExample/Models.cs @@ -1,12 +1,15 @@ // auto-generated by sqlc - do not edit using NpgsqlTypes; using System; +using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Text.Json; +using System.Xml; namespace NpgsqlExampleGen; public readonly record struct Author(long Id, string Name, string? Bio); public readonly record struct Book(Guid Id, string Name, long AuthorId, string? Description); -public readonly record struct PostgresType(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, decimal? CDecimal, decimal? CNumeric, float? CReal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, JsonElement? CJson, JsonElement? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, Guid? CUuid, byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); -public readonly record struct PostgresGeometricType(NpgsqlPoint? CPoint, NpgsqlLine? CLine, NpgsqlLSeg? CLseg, NpgsqlBox? CBox, NpgsqlPath? CPath, NpgsqlPolygon? CPolygon, NpgsqlCircle? CCircle); \ No newline at end of file +public readonly record struct PostgresType(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, decimal? CDecimal, decimal? CNumeric, float? CReal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, JsonElement? CJson, JsonElement? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, XmlDocument? CXml, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, Guid? CUuid); +public readonly record struct PostgresGeometricType(NpgsqlPoint? CPoint, NpgsqlLine? CLine, NpgsqlLSeg? CLseg, NpgsqlBox? CBox, NpgsqlPath? CPath, NpgsqlPolygon? CPolygon, NpgsqlCircle? CCircle); +public readonly record struct PostgresArrayType(byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); \ No newline at end of file diff --git a/examples/NpgsqlExample/QuerySql.cs b/examples/NpgsqlExample/QuerySql.cs index 84a720b7..8034e3f0 100644 --- a/examples/NpgsqlExample/QuerySql.cs +++ b/examples/NpgsqlExample/QuerySql.cs @@ -13,6 +13,7 @@ using System.Net.NetworkInformation; using System.Text.Json; using System.Threading.Tasks; +using System.Xml; namespace NpgsqlExampleGen; public class QuerySql @@ -653,8 +654,8 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; - public readonly record struct InsertPostgresTypesArgs(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, JsonElement? CJson, string? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); + private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8 ) "; + public readonly record struct InsertPostgresTypesArgs(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, JsonElement? CJson, string? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, XmlDocument? CXml, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8); public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) { if (this.Transaction == null) @@ -688,17 +689,11 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonpath", args.CJsonpath ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_xml", args.CXml != null ? args.CXml.OuterXml : (object)DBNull.Value); command.Parameters.AddWithValue("@c_cidr", args.CCidr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_inet", args.CInet ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr", args.CMacaddr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr8", args.CMacaddr8 ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -740,23 +735,17 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonpath", args.CJsonpath ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_xml", args.CXml != null ? args.CXml.OuterXml : (object)DBNull.Value); command.Parameters.AddWithValue("@c_cidr", args.CCidr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_inet", args.CInet ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr", args.CMacaddr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr8", args.CMacaddr8 ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } - private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea) FROM STDIN (FORMAT BINARY)"; - public readonly record struct InsertPostgresTypesBatchArgs(bool? CBoolean, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, byte[]? CBytea); + private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; + public readonly record struct InsertPostgresTypesBatchArgs(bool? CBoolean, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr); public async Task InsertPostgresTypesBatch(List args) { using (var connection = new NpgsqlConnection(ConnectionString)) @@ -787,7 +776,9 @@ public async Task InsertPostgresTypesBatch(List ar await writer.WriteAsync(row.CBpchar ?? (object)DBNull.Value); await writer.WriteAsync(row.CText ?? (object)DBNull.Value); await writer.WriteAsync(row.CUuid ?? (object)DBNull.Value); - await writer.WriteAsync(row.CBytea ?? (object)DBNull.Value); + await writer.WriteAsync(row.CCidr ?? (object)DBNull.Value); + await writer.WriteAsync(row.CInet ?? (object)DBNull.Value); + await writer.WriteAsync(row.CMacaddr ?? (object)DBNull.Value); } await writer.CompleteAsync(); @@ -797,8 +788,8 @@ public async Task InsertPostgresTypesBatch(List ar } } - private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; - public readonly record struct GetPostgresTypesRow(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, JsonElement? CJson, string? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8, byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); + private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8 FROM postgres_types LIMIT 1 "; + public readonly record struct GetPostgresTypesRow(bool? CBoolean, byte[]? CBit, short? CSmallint, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, JsonElement? CJson, string? CJsonStringOverride, JsonElement? CJsonb, string? CJsonpath, XmlDocument? CXml, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, string? CMacaddr8); public async Task GetPostgresTypes() { if (this.Transaction == null) @@ -838,17 +829,16 @@ public async Task InsertPostgresTypesBatch(List ar CJsonStringOverride = reader.IsDBNull(22) ? null : reader.GetString(22), CJsonb = reader.IsDBNull(23) ? null : JsonSerializer.Deserialize(reader.GetString(23)), CJsonpath = reader.IsDBNull(24) ? null : reader.GetString(24), - CCidr = reader.IsDBNull(25) ? null : reader.GetFieldValue(25), - CInet = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), - CMacaddr = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), - CMacaddr8 = reader.IsDBNull(28) ? null : reader.GetString(28), - CBytea = reader.IsDBNull(29) ? null : reader.GetFieldValue(29), - CBooleanArray = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), - CTextArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CIntegerArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CDecimalArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CDateArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CTimestampArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35) + CXml = reader.IsDBNull(25) ? null : (new Func((r, o) => + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(r.GetString(o)); + return xmlDoc; + }))(reader, 25), + CCidr = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), + CInet = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), + CMacaddr = reader.IsDBNull(28) ? null : reader.GetFieldValue(28), + CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29) }; } } @@ -898,17 +888,16 @@ public async Task InsertPostgresTypesBatch(List ar CJsonStringOverride = reader.IsDBNull(22) ? null : reader.GetString(22), CJsonb = reader.IsDBNull(23) ? null : JsonSerializer.Deserialize(reader.GetString(23)), CJsonpath = reader.IsDBNull(24) ? null : reader.GetString(24), - CCidr = reader.IsDBNull(25) ? null : reader.GetFieldValue(25), - CInet = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), - CMacaddr = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), - CMacaddr8 = reader.IsDBNull(28) ? null : reader.GetString(28), - CBytea = reader.IsDBNull(29) ? null : reader.GetFieldValue(29), - CBooleanArray = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), - CTextArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CIntegerArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CDecimalArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CDateArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CTimestampArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35) + CXml = reader.IsDBNull(25) ? null : (new Func((r, o) => + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(r.GetString(o)); + return xmlDoc; + }))(reader, 25), + CCidr = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), + CInet = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), + CMacaddr = reader.IsDBNull(28) ? null : reader.GetFieldValue(28), + CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29) }; } } @@ -917,8 +906,8 @@ public async Task InsertPostgresTypesBatch(List ar return null; } - private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea LIMIT 1 "; - public readonly record struct GetPostgresTypesCntRow(short? CSmallint, bool? CBoolean, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, byte[]? CBytea, long Cnt); + private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr LIMIT 1 "; + public readonly record struct GetPostgresTypesCntRow(short? CSmallint, bool? CBoolean, int? CInteger, long? CBigint, float? CReal, decimal? CNumeric, decimal? CDecimal, double? CDoublePrecision, decimal? CMoney, DateTime? CDate, TimeSpan? CTime, DateTime? CTimestamp, DateTime? CTimestampWithTz, TimeSpan? CInterval, string? CChar, string? CVarchar, string? CCharacterVarying, string? CBpchar, string? CText, Guid? CUuid, NpgsqlCidr? CCidr, IPAddress? CInet, PhysicalAddress? CMacaddr, long Cnt); public async Task GetPostgresTypesCnt() { if (this.Transaction == null) @@ -953,8 +942,10 @@ public async Task InsertPostgresTypesBatch(List ar CBpchar = reader.IsDBNull(17) ? null : reader.GetString(17), CText = reader.IsDBNull(18) ? null : reader.GetString(18), CUuid = reader.IsDBNull(19) ? null : reader.GetFieldValue(19), - CBytea = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), - Cnt = reader.GetInt64(21) + CCidr = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), + CInet = reader.IsDBNull(21) ? null : reader.GetFieldValue(21), + CMacaddr = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), + Cnt = reader.GetInt64(23) }; } } @@ -999,8 +990,10 @@ public async Task InsertPostgresTypesBatch(List ar CBpchar = reader.IsDBNull(17) ? null : reader.GetString(17), CText = reader.IsDBNull(18) ? null : reader.GetString(18), CUuid = reader.IsDBNull(19) ? null : reader.GetFieldValue(19), - CBytea = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), - Cnt = reader.GetInt64(21) + CCidr = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), + CInet = reader.IsDBNull(21) ? null : reader.GetFieldValue(21), + CMacaddr = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), + Cnt = reader.GetInt64(23) }; } } @@ -1254,4 +1247,213 @@ public async Task TruncatePostgresGeoTypes() await command.ExecuteNonQueryAsync(); } } + + private const string InsertPostgresArrayTypesSql = "INSERT INTO postgres_array_types(c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + public readonly record struct InsertPostgresArrayTypesArgs(byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); + public async Task InsertPostgresArrayTypes(InsertPostgresArrayTypesArgs args) + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(InsertPostgresArrayTypesSql)) + { + command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); + await command.ExecuteNonQueryAsync(); + } + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = InsertPostgresArrayTypesSql; + command.Transaction = this.Transaction; + command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); + await command.ExecuteNonQueryAsync(); + } + } + + private const string GetPostgresArrayTypesSql = "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1"; + public readonly record struct GetPostgresArrayTypesRow(byte[]? CBytea, bool[]? CBooleanArray, string[]? CTextArray, int[]? CIntegerArray, decimal[]? CDecimalArray, DateTime[]? CDateArray, DateTime[]? CTimestampArray); + public async Task GetPostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(GetPostgresArrayTypesSql)) + { + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + CBooleanArray = reader.IsDBNull(1) ? null : reader.GetFieldValue(1), + CTextArray = reader.IsDBNull(2) ? null : reader.GetFieldValue(2), + CIntegerArray = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), + CDecimalArray = reader.IsDBNull(4) ? null : reader.GetFieldValue(4), + CDateArray = reader.IsDBNull(5) ? null : reader.GetFieldValue(5), + CTimestampArray = reader.IsDBNull(6) ? null : reader.GetFieldValue(6) + }; + } + } + } + } + + return null; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = GetPostgresArrayTypesSql; + command.Transaction = this.Transaction; + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + CBooleanArray = reader.IsDBNull(1) ? null : reader.GetFieldValue(1), + CTextArray = reader.IsDBNull(2) ? null : reader.GetFieldValue(2), + CIntegerArray = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), + CDecimalArray = reader.IsDBNull(4) ? null : reader.GetFieldValue(4), + CDateArray = reader.IsDBNull(5) ? null : reader.GetFieldValue(5), + CTimestampArray = reader.IsDBNull(6) ? null : reader.GetFieldValue(6) + }; + } + } + } + + return null; + } + + private const string InsertPostgresArrayTypesBatchSql = "COPY postgres_array_types (c_bytea) FROM STDIN (FORMAT BINARY)"; + public readonly record struct InsertPostgresArrayTypesBatchArgs(byte[]? CBytea); + public async Task InsertPostgresArrayTypesBatch(List args) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.OpenAsync(); + using (var writer = await connection.BeginBinaryImportAsync(InsertPostgresArrayTypesBatchSql)) + { + foreach (var row in args) + { + await writer.StartRowAsync(); + await writer.WriteAsync(row.CBytea ?? (object)DBNull.Value); + } + + await writer.CompleteAsync(); + } + + await connection.CloseAsync(); + } + } + + private const string GetPostgresArrayTypesCntSql = "SELECT c_bytea , COUNT (* ) AS cnt FROM postgres_array_types GROUP BY c_bytea LIMIT 1 "; + public readonly record struct GetPostgresArrayTypesCntRow(byte[]? CBytea, long Cnt); + public async Task GetPostgresArrayTypesCnt() + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(GetPostgresArrayTypesCntSql)) + { + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesCntRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + Cnt = reader.GetInt64(1) + }; + } + } + } + } + + return null; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = GetPostgresArrayTypesCntSql; + command.Transaction = this.Transaction; + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesCntRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + Cnt = reader.GetInt64(1) + }; + } + } + } + + return null; + } + + private const string TruncatePostgresArrayTypesSql = "TRUNCATE TABLE postgres_array_types"; + public async Task TruncatePostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(TruncatePostgresArrayTypesSql)) + { + await command.ExecuteNonQueryAsync(); + } + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = TruncatePostgresArrayTypesSql; + command.Transaction = this.Transaction; + await command.ExecuteNonQueryAsync(); + } + } } \ No newline at end of file diff --git a/examples/NpgsqlExample/request.json b/examples/NpgsqlExample/request.json index a5bd3436..e9e6d63f 100644 --- a/examples/NpgsqlExample/request.json +++ b/examples/NpgsqlExample/request.json @@ -374,6 +374,16 @@ "name": "jsonpath" } }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + } + }, { "name": "c_cidr", "length": -1, @@ -423,169 +433,176 @@ "type": { "name": "uuid" } - }, + } + ] + }, + { + "rel": { + "name": "postgres_geometric_types" + }, + "columns": [ { - "name": "c_bytea", + "name": "c_point", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "bytea" + "name": "point" } }, { - "name": "c_boolean_array", - "isArray": true, + "name": "c_line", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "arrayDims": 1 + "name": "line" + } }, { - "name": "c_text_array", - "isArray": true, + "name": "c_lseg", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "text" - }, - "arrayDims": 1 + "name": "lseg" + } }, { - "name": "c_integer_array", - "isArray": true, + "name": "c_box", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "arrayDims": 1 + "name": "box" + } }, { - "name": "c_decimal_array", - "isArray": true, + "name": "c_path", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "arrayDims": 1 + "name": "path" + } }, { - "name": "c_date_array", - "isArray": true, + "name": "c_polygon", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "date" - }, - "arrayDims": 1 + "name": "polygon" + } }, { - "name": "c_timestamp_array", - "isArray": true, + "name": "c_circle", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "arrayDims": 1 + "name": "circle" + } } ] }, { "rel": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "columns": [ { - "name": "c_point", + "name": "c_bytea", "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "point" + "name": "bytea" } }, { - "name": "c_line", + "name": "c_boolean_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "line" - } + "schema": "pg_catalog", + "name": "bool" + }, + "arrayDims": 1 }, { - "name": "c_lseg", + "name": "c_text_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "lseg" - } + "name": "text" + }, + "arrayDims": 1 }, { - "name": "c_box", + "name": "c_integer_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "box" - } + "schema": "pg_catalog", + "name": "int4" + }, + "arrayDims": 1 }, { - "name": "c_path", + "name": "c_decimal_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "path" - } + "schema": "pg_catalog", + "name": "numeric" + }, + "arrayDims": 1 }, { - "name": "c_polygon", + "name": "c_date_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "polygon" - } + "name": "date" + }, + "arrayDims": 1 }, { - "name": "c_circle", + "name": "c_timestamp_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "circle" - } + "schema": "pg_catalog", + "name": "timestamp" + }, + "arrayDims": 1 } ] } @@ -33190,7 +33207,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26,\n $27,\n $28::macaddr,\n $29::macaddr8,\n $30, \n $31,\n $32, \n $33,\n $34,\n $35,\n $36\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8\n)", "name": "InsertPostgresTypes", "cmd": ":exec", "parameters": [ @@ -33572,6 +33589,16 @@ }, { "number": 26, + "column": { + "name": "c_xml", + "length": -1, + "type": { + "name": "xml" + } + } + }, + { + "number": 27, "column": { "name": "c_cidr", "length": -1, @@ -33587,7 +33614,7 @@ } }, { - "number": 27, + "number": 28, "column": { "name": "c_inet", "length": -1, @@ -33603,7 +33630,7 @@ } }, { - "number": 28, + "number": 29, "column": { "name": "c_macaddr", "length": -1, @@ -33613,7 +33640,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_macaddr8", "length": -1, @@ -33621,130 +33648,6 @@ "name": "macaddr8" } } - }, - { - "number": 30, - "column": { - "name": "c_bytea", - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - } - }, - { - "number": 31, - "column": { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - } - }, - { - "number": 32, - "column": { - "name": "c_text_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - } - }, - { - "number": 33, - "column": { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - } - }, - { - "number": 34, - "column": { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - } - }, - { - "number": 35, - "column": { - "name": "c_date_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - } - }, - { - "number": 36, - "column": { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 - } } ], "filename": "query.sql", @@ -33753,7 +33656,7 @@ } }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23\n)", "name": "InsertPostgresTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -34060,16 +33963,46 @@ { "number": 21, "column": { - "name": "c_bytea", + "name": "c_cidr", "length": -1, "table": { "schema": "public", "name": "postgres_types" }, "type": { - "name": "bytea" + "name": "cidr" }, - "originalName": "c_bytea" + "originalName": "c_cidr" + } + }, + { + "number": 22, + "column": { + "name": "c_inet", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + } + }, + { + "number": 23, + "column": { + "name": "c_macaddr", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" } } ], @@ -34079,7 +34012,7 @@ } }, { - "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", + "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8\nFROM postgres_types \nLIMIT 1", "name": "GetPostgresTypes", "cmd": ":one", "columns": [ @@ -34374,6 +34307,17 @@ }, "originalName": "c_jsonpath" }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + }, + "originalName": "c_xml" + }, { "name": "c_cidr", "length": -1, @@ -34414,105 +34358,12 @@ "type": { "name": "text" } - }, - { - "name": "c_bytea", - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - }, - { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - }, - { - "name": "c_text_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - }, - { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - }, - { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - }, - { - "name": "c_date_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - }, - { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 } ], "filename": "query.sql" }, { - "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\nLIMIT 1", + "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", "name": "GetPostgresTypesCnt", "cmd": ":one", "columns": [ @@ -34752,15 +34603,37 @@ "originalName": "c_uuid" }, { - "name": "c_bytea", + "name": "c_cidr", "length": -1, "table": { "name": "postgres_types" }, "type": { - "name": "bytea" + "name": "cidr" }, - "originalName": "c_bytea" + "originalName": "c_cidr" + }, + { + "name": "c_inet", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + }, + { + "name": "c_macaddr", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" }, { "name": "cnt", @@ -35137,6 +35010,295 @@ "name": "TruncatePostgresGeoTypes", "cmd": ":exec", "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types\n(\n c_bytea,\n c_boolean_array,\n c_text_array,\n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES ($1, $2, $3, $4, $5, $6, $7)", + "name": "InsertPostgresArrayTypes", + "cmd": ":exec", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + }, + { + "number": 2, + "column": { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + } + }, + { + "number": 3, + "column": { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + } + }, + { + "number": 4, + "column": { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + } + }, + { + "number": 5, + "column": { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + } + }, + { + "number": 6, + "column": { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + } + }, + { + "number": 7, + "column": { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1", + "name": "GetPostgresArrayTypes", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + }, + { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + }, + { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + }, + { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + }, + { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + }, + { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + ], + "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types (c_bytea) VALUES ($1)", + "name": "InsertPostgresArrayTypesBatch", + "cmd": ":copyfrom", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_array_types\nGROUP BY\n c_bytea\nLIMIT 1", + "name": "GetPostgresArrayTypesCnt", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "cnt", + "notNull": true, + "length": -1, + "isFuncCall": true, + "type": { + "name": "bigint" + } + } + ], + "filename": "query.sql" + }, + { + "text": "TRUNCATE TABLE postgres_array_types", + "name": "TruncatePostgresArrayTypes", + "cmd": ":exec", + "filename": "query.sql" } ], "sqlc_version": "v1.27.0", diff --git a/examples/NpgsqlExample/request.message b/examples/NpgsqlExample/request.message index ff950149..3d5a7604 100644 --- a/examples/NpgsqlExample/request.message +++ b/examples/NpgsqlExample/request.message @@ -3,7 +3,7 @@ 2 postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/query.sqlb№ examples/NpgsqlExamplecsharp├{"debugRequest":true,"generateCsproj":true,"namespaceName":"NpgsqlExampleGen","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"notNull":false,"type":"int"}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"notNull":false,"type":"string"}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"notNull":true,"type":"DateTime"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"net8.0","useDapper":false}* -./dist/LocalRunner╖х public"ЛpublicГ +./dist/LocalRunnerйц public"¤publicГ authors) id0         R authorsb  bigserial& name0         R authorsbtext# @@ -13,7 +13,7 @@ postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/qu name0         Rbooksbtext5 author_id0         Rbooksb pg_catalogint8) - description0         RbooksbtextК + description0         Rbooksbtextф postgres_types< c_boolean0         Rpostgres_typesb pg_catalogbool7 @@ -58,25 +58,15 @@ pg_catalogvarchar1 c_jsonb0         Rpostgres_typesbjsonb5 c_jsonpath0         Rpostgres_typesb -jsonpath- +jsonpath+ +c_xml0         Rpostgres_typesbxml- c_cidr0         Rpostgres_typesbcidr- c_inet0         Rpostgres_typesbinet3 c_macaddr0         Rpostgres_typesb macaddr5 c_macaddr80         Rpostgres_typesb macaddr8- -c_uuid0         Rpostgres_typesbuuid/ -c_bytea0         Rpostgres_typesbbyteaG -c_boolean_array 0         Rpostgres_typesb -pg_catalogboolИ8 - c_text_array 0         Rpostgres_typesbtextИG -c_integer_array 0         Rpostgres_typesb -pg_catalogint4ИJ -c_decimal_array 0         Rpostgres_typesb -pg_catalognumericИ8 - c_date_array 0         Rpostgres_typesbdateИN -c_timestamp_array 0         Rpostgres_typesb -pg_catalog timestampИ╡ +c_uuid0         Rpostgres_typesbuuid╡ postgres_geometric_types9 c_point0         Rpostgres_geometric_typesbpoint7 c_line0         Rpostgres_geometric_typesbline7 @@ -84,7 +74,19 @@ pg_catalog timestamp c_box0         Rpostgres_geometric_typesbbox7 c_path0         Rpostgres_geometric_typesbpath= c_polygon0         Rpostgres_geometric_typesb polygon; -c_circle0         Rpostgres_geometric_typesbcircle" pg_temp"ц▓ +c_circle0         Rpostgres_geometric_typesbcircleХ +postgres_array_types5 +c_bytea0         Rpostgres_array_typesbbyteaM +c_boolean_array 0         Rpostgres_array_typesb +pg_catalogboolИ> + c_text_array 0         Rpostgres_array_typesbtextИM +c_integer_array 0         Rpostgres_array_typesb +pg_catalogint4ИP +c_decimal_array 0         Rpostgres_array_typesb +pg_catalognumericИ> + c_date_array 0         Rpostgres_array_typesbdateИT +c_timestamp_array 0         Rpostgres_array_typesb +pg_catalog timestampИ" pg_temp"ц▓ pg_catalogЙ & @@ -10296,8 +10298,8 @@ WHERE books.name = $1GetAuthorsByBookName:many"- name0         R authorsbtextzname"( bio0         R authorsbtextzbio" books0         brbooks*.* -name0         Rbooksbtextzname: query.sql╢ -▌INSERT INTO postgres_types +name0         Rbooksbtextzname: query.sqlИ +мINSERT INTO postgres_types ( c_boolean, c_bit, @@ -10324,17 +10326,11 @@ WHERE books.name = $1GetAuthorsByBookName:many"- c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, - c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8 ) VALUES ( $1, @@ -10362,17 +10358,11 @@ VALUES ( $23::json, $24::jsonb, $25::jsonpath, - $26, + $26::xml, $27, - $28::macaddr, - $29::macaddr8, - $30, - $31, - $32, - $33, - $34, - $35, - $36 + $28, + $29::macaddr, + $30::macaddr8 )InsertPostgresTypes:exec*TP c_boolean0         8Rpublicpostgres_typesbpg_catalog.boolz c_boolean*KG c_bit0         8Rpublicpostgres_typesbpg_catalog.bitzc_bit*VR @@ -10405,21 +10395,15 @@ c_interval*PL c_jsonb0         bjsonb*'# c_jsonpath0         b -jsonpath*C? -c_cidr0         8Rpublicpostgres_typesbcidrzc_cidr*C? -c_inet0         8Rpublicpostgres_typesbinetzc_inet*%! - c_macaddr0         b macaddr*'# +jsonpath* +c_xml0         bxml*C? +c_cidr0         8Rpublicpostgres_typesbcidrzc_cidr*C? +c_inet0         8Rpublicpostgres_typesbinetzc_inet*%! + c_macaddr0         b macaddr*'# c_macaddr80         b -macaddr8*FB -c_bytea0         8Rpublicpostgres_typesbbyteazc_bytea*ea -c_boolean_array 0         8Rpublicpostgres_typesbpg_catalog.boolzc_boolean_arrayИ*T P - c_text_array 0         8Rpublicpostgres_typesbtextz c_text_arrayИ*e!a -c_integer_array 0         8Rpublicpostgres_typesbpg_catalog.int4zc_integer_arrayИ*h"d -c_decimal_array 0         8Rpublicpostgres_typesbpg_catalog.numericzc_decimal_arrayИ*T#P - c_date_array 0         8Rpublicpostgres_typesbdatez c_date_arrayИ*n$j -c_timestamp_array 0         8Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_arrayИ: query.sqlBpostgres_types╧ -░INSERT INTO postgres_types +macaddr8: query.sqlBpostgres_typesЗ +▄INSERT INTO postgres_types ( c_boolean, c_smallint, @@ -10441,7 +10425,9 @@ c_macaddr80 c_bpchar, c_text, c_uuid, - c_bytea + c_cidr, + c_inet, + c_macaddr ) VALUES ( $1, @@ -10464,7 +10450,9 @@ VALUES ( $18, $19, $20, - $21 + $21, + $22, + $23 )InsertPostgresTypesBatch :copyfrom*RN c_boolean0         Rpublicpostgres_typesbpg_catalog.boolz c_boolean*TP @@ -10490,9 +10478,11 @@ c_interval*NJ c_character_varying0         Rpublicpostgres_typesbpg_catalog.varcharzc_character_varying*GC c_bpchar0         Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0         Rpublicpostgres_typesbtextzc_text*A= -c_uuid0         Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0         Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types╡ -ВSELECT +c_uuid0         Rpublicpostgres_typesbuuidzc_uuid*A= +c_cidr0         Rpublicpostgres_typesbcidrzc_cidr*A= +c_inet0         Rpublicpostgres_typesbinetzc_inet*JF + c_macaddr0         Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_typesн +ДSELECT c_boolean, c_bit, c_smallint, @@ -10518,17 +10508,11 @@ c_interval*NJ c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, - c_macaddr8::TEXT AS c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8::TEXT AS c_macaddr8 FROM postgres_types LIMIT 1GetPostgresTypes:one"G c_boolean0         Rpostgres_typesb @@ -10578,24 +10562,14 @@ pg_catalogvarcharzc_character_varying"; c_jsonpath0         Rpostgres_typesb jsonpathz -c_jsonpath"5 +c_jsonpath"2 +c_xml0         Rpostgres_typesbxmlzc_xml"5 c_cidr0         Rpostgres_typesbcidrzc_cidr"5 c_inet0         Rpostgres_typesbinetzc_inet"> c_macaddr0         Rpostgres_typesb macaddrz c_macaddr"! -c_macaddr80         btext"8 -c_bytea0         Rpostgres_typesbbyteazc_bytea"X -c_boolean_array 0         Rpostgres_typesb -pg_catalogboolzc_boolean_arrayИ"F - c_text_array 0         Rpostgres_typesbtextz c_text_arrayИ"X -c_integer_array 0         Rpostgres_typesb -pg_catalogint4zc_integer_arrayИ"[ -c_decimal_array 0         Rpostgres_typesb -pg_catalognumericzc_decimal_arrayИ"F - c_date_array 0         Rpostgres_typesbdatez c_date_arrayИ"a -c_timestamp_array 0         Rpostgres_typesb -pg_catalog timestampzc_timestamp_arrayИ: query.sql№ -╞SELECT +c_macaddr80         btext: query.sqlд +·SELECT c_smallint, c_boolean, c_integer, @@ -10616,7 +10590,9 @@ pg_catalog timestampzc_timestamp_array c_bpchar, c_text, c_uuid, - c_bytea, + c_cidr, + c_inet, + c_macaddr, COUNT(*) AS cnt FROM postgres_types GROUP BY @@ -10640,7 +10616,9 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea + c_cidr, + c_inet, + c_macaddr LIMIT 1GetPostgresTypesCnt:one"I c_smallint0         Rpostgres_typesb @@ -10680,8 +10658,10 @@ pg_catalogvarcharz c_varchar"^ pg_catalogvarcharzc_character_varying"; c_bpchar0         Rpostgres_typesbbpcharzc_bpchar"5 c_text0         Rpostgres_typesbtextzc_text"5 -c_uuid0         Rpostgres_typesbuuidzc_uuid"8 -c_bytea0         Rpostgres_typesbbyteazc_bytea" +c_uuid0         Rpostgres_typesbuuidzc_uuid"5 +c_cidr0         Rpostgres_typesbcidrzc_cidr"5 +c_inet0         Rpostgres_typesbinetzc_inet"> + c_macaddr0         Rpostgres_typesb macaddrz c_macaddr" cnt0         @bbigint: query.sql░ ЖSELECT MAX(c_integer) AS max_integer, @@ -10725,4 +10705,46 @@ hSELECT c_point, c_line, c_lseg, c_box, c_path, c_polygon, c_circle FROM postgre c_polygon0         Rpostgres_geometric_typesb polygonz c_polygon"E c_circle0         Rpostgres_geometric_typesbcirclezc_circle: query.sqlH TRUNCATE TABLE postgres_typesTruncatePostgresTypes:exec: query.sqlU -'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql"v1.27.0*·{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"net8.0","namespaceName":"NpgsqlExampleGen","useDapper":false,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file +'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql═ +╬INSERT INTO postgres_array_types +( + c_bytea, + c_boolean_array, + c_text_array, + c_integer_array, + c_decimal_array, + c_date_array, + c_timestamp_array +) +VALUES ($1, $2, $3, $4, $5, $6, $7)InsertPostgresArrayTypes:exec*JF +c_bytea0         Rpublicpostgres_array_typesbbyteazc_bytea*ie +c_boolean_array 0         Rpublicpostgres_array_typesbpg_catalog.boolzc_boolean_arrayИ*XT + c_text_array 0         Rpublicpostgres_array_typesbtextz c_text_arrayИ*ie +c_integer_array 0         Rpublicpostgres_array_typesbpg_catalog.int4zc_integer_arrayИ*lh +c_decimal_array 0         Rpublicpostgres_array_typesbpg_catalog.numericzc_decimal_arrayИ*XT + c_date_array 0         Rpublicpostgres_array_typesbdatez c_date_arrayИ*rn +c_timestamp_array 0         Rpublicpostgres_array_typesbpg_catalog.timestampzc_timestamp_arrayИ: query.sqlBpostgres_array_typesе +ТSELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1GetPostgresArrayTypes:one"> +c_bytea0         Rpostgres_array_typesbbyteazc_bytea"^ +c_boolean_array 0         Rpostgres_array_typesb +pg_catalogboolzc_boolean_arrayИ"L + c_text_array 0         Rpostgres_array_typesbtextz c_text_arrayИ"^ +c_integer_array 0         Rpostgres_array_typesb +pg_catalogint4zc_integer_arrayИ"a +c_decimal_array 0         Rpostgres_array_typesb +pg_catalognumericzc_decimal_arrayИ"L + c_date_array 0         Rpostgres_array_typesbdatez c_date_arrayИ"g +c_timestamp_array 0         Rpostgres_array_typesb +pg_catalog timestampzc_timestamp_arrayИ: query.sql╤ +6INSERT INTO postgres_array_types (c_bytea) VALUES ($1)InsertPostgresArrayTypesBatch :copyfrom*JF +c_bytea0         Rpublicpostgres_array_typesbbyteazc_bytea: query.sqlBpostgres_array_typesы +^SELECT + c_bytea, + COUNT(*) AS cnt +FROM postgres_array_types +GROUP BY + c_bytea +LIMIT 1GetPostgresArrayTypesCnt:one"> +c_bytea0         Rpostgres_array_typesbbyteazc_bytea" +cnt0         @bbigint: query.sqlS +#TRUNCATE TABLE postgres_array_typesTruncatePostgresArrayTypes:exec: query.sql"v1.27.0*·{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"net8.0","namespaceName":"NpgsqlExampleGen","useDapper":false,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file diff --git a/examples/NpgsqlLegacyExample/Models.cs b/examples/NpgsqlLegacyExample/Models.cs index 3d9f5cbc..3778fa9f 100644 --- a/examples/NpgsqlLegacyExample/Models.cs +++ b/examples/NpgsqlLegacyExample/Models.cs @@ -3,9 +3,11 @@ namespace NpgsqlLegacyExampleGen { using NpgsqlTypes; using System; + using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Text.Json; + using System.Xml; public class Author { @@ -46,18 +48,12 @@ public class PostgresType public JsonElement? CJsonStringOverride { get; set; } public JsonElement? CJsonb { get; set; } public string CJsonpath { get; set; } + public XmlDocument CXml { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } public string CMacaddr8 { get; set; } public Guid? CUuid { get; set; } - public byte[] CBytea { get; set; } - public bool[] CBooleanArray { get; set; } - public string[] CTextArray { get; set; } - public int[] CIntegerArray { get; set; } - public decimal[] CDecimalArray { get; set; } - public DateTime[] CDateArray { get; set; } - public DateTime[] CTimestampArray { get; set; } }; public class PostgresGeometricType { @@ -69,4 +65,14 @@ public class PostgresGeometricType public NpgsqlPolygon? CPolygon { get; set; } public NpgsqlCircle? CCircle { get; set; } }; + public class PostgresArrayType + { + public byte[] CBytea { get; set; } + public bool[] CBooleanArray { get; set; } + public string[] CTextArray { get; set; } + public int[] CIntegerArray { get; set; } + public decimal[] CDecimalArray { get; set; } + public DateTime[] CDateArray { get; set; } + public DateTime[] CTimestampArray { get; set; } + }; } \ No newline at end of file diff --git a/examples/NpgsqlLegacyExample/QuerySql.cs b/examples/NpgsqlLegacyExample/QuerySql.cs index f865bfb3..c7df7495 100644 --- a/examples/NpgsqlLegacyExample/QuerySql.cs +++ b/examples/NpgsqlLegacyExample/QuerySql.cs @@ -15,6 +15,7 @@ namespace NpgsqlLegacyExampleGen using System.Net.NetworkInformation; using System.Text.Json; using System.Threading.Tasks; + using System.Xml; public class QuerySql { @@ -751,7 +752,7 @@ public async Task> GetAuthorsByBookName(GetAuthors } } - private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8, @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + private const string InsertPostgresTypesSql = "INSERT INTO postgres_types(c_boolean, c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8) VALUES ( @c_boolean, @c_bit, @c_smallint, @c_integer, @c_bigint, @c_real, @c_numeric, @c_decimal, @c_double_precision, @c_money, @c_date, @c_time, @c_timestamp, @c_timestamp_with_tz, @c_interval, @c_char, @c_varchar, @c_character_varying, @c_bpchar, @c_text, @c_uuid, @c_json :: json, @c_json_string_override :: json, @c_jsonb :: jsonb, @c_jsonpath :: jsonpath, @c_xml :: xml, @c_cidr, @c_inet, @c_macaddr :: macaddr, @c_macaddr8 :: macaddr8 ) "; public class InsertPostgresTypesArgs { public bool? CBoolean { get; set; } @@ -779,17 +780,11 @@ public class InsertPostgresTypesArgs public string CJsonStringOverride { get; set; } public JsonElement? CJsonb { get; set; } public string CJsonpath { get; set; } + public XmlDocument CXml { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } public string CMacaddr8 { get; set; } - public byte[] CBytea { get; set; } - public bool[] CBooleanArray { get; set; } - public string[] CTextArray { get; set; } - public int[] CIntegerArray { get; set; } - public decimal[] CDecimalArray { get; set; } - public DateTime[] CDateArray { get; set; } - public DateTime[] CTimestampArray { get; set; } }; public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) { @@ -824,17 +819,11 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonpath", args.CJsonpath ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_xml", args.CXml != null ? args.CXml.OuterXml : (object)DBNull.Value); command.Parameters.AddWithValue("@c_cidr", args.CCidr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_inet", args.CInet ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr", args.CMacaddr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr8", args.CMacaddr8 ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -876,22 +865,16 @@ public async Task InsertPostgresTypes(InsertPostgresTypesArgs args) command.Parameters.AddWithValue("@c_json_string_override", args.CJsonStringOverride ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonb", args.CJsonb.HasValue ? args.CJsonb.Value.GetRawText() : (object)DBNull.Value); command.Parameters.AddWithValue("@c_jsonpath", args.CJsonpath ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_xml", args.CXml != null ? args.CXml.OuterXml : (object)DBNull.Value); command.Parameters.AddWithValue("@c_cidr", args.CCidr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_inet", args.CInet ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr", args.CMacaddr ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_macaddr8", args.CMacaddr8 ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); - command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } - private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea) FROM STDIN (FORMAT BINARY)"; + private const string InsertPostgresTypesBatchSql = "COPY postgres_types (c_boolean, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr) FROM STDIN (FORMAT BINARY)"; public class InsertPostgresTypesBatchArgs { public bool? CBoolean { get; set; } @@ -914,7 +897,9 @@ public class InsertPostgresTypesBatchArgs public string CBpchar { get; set; } public string CText { get; set; } public Guid? CUuid { get; set; } - public byte[] CBytea { get; set; } + public NpgsqlCidr? CCidr { get; set; } + public IPAddress CInet { get; set; } + public PhysicalAddress CMacaddr { get; set; } }; public async Task InsertPostgresTypesBatch(List args) { @@ -946,7 +931,9 @@ public async Task InsertPostgresTypesBatch(List ar await writer.WriteAsync(row.CBpchar ?? (object)DBNull.Value); await writer.WriteAsync(row.CText ?? (object)DBNull.Value); await writer.WriteAsync(row.CUuid ?? (object)DBNull.Value); - await writer.WriteAsync(row.CBytea ?? (object)DBNull.Value); + await writer.WriteAsync(row.CCidr ?? (object)DBNull.Value); + await writer.WriteAsync(row.CInet ?? (object)DBNull.Value); + await writer.WriteAsync(row.CMacaddr ?? (object)DBNull.Value); } await writer.CompleteAsync(); @@ -956,7 +943,7 @@ public async Task InsertPostgresTypesBatch(List ar } } - private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8, c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_types LIMIT 1 "; + private const string GetPostgresTypesSql = "SELECT c_boolean , c_bit, c_smallint, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_json, c_json_string_override, c_jsonb, c_jsonpath, c_xml, c_cidr, c_inet, c_macaddr, c_macaddr8 :: TEXT AS c_macaddr8 FROM postgres_types LIMIT 1 "; public class GetPostgresTypesRow { public bool? CBoolean { get; set; } @@ -984,17 +971,11 @@ public class GetPostgresTypesRow public string CJsonStringOverride { get; set; } public JsonElement? CJsonb { get; set; } public string CJsonpath { get; set; } + public XmlDocument CXml { get; set; } public NpgsqlCidr? CCidr { get; set; } public IPAddress CInet { get; set; } public PhysicalAddress CMacaddr { get; set; } public string CMacaddr8 { get; set; } - public byte[] CBytea { get; set; } - public bool[] CBooleanArray { get; set; } - public string[] CTextArray { get; set; } - public int[] CIntegerArray { get; set; } - public decimal[] CDecimalArray { get; set; } - public DateTime[] CDateArray { get; set; } - public DateTime[] CTimestampArray { get; set; } }; public async Task GetPostgresTypes() { @@ -1035,17 +1016,16 @@ public async Task GetPostgresTypes() CJsonStringOverride = reader.IsDBNull(22) ? null : reader.GetString(22), CJsonb = reader.IsDBNull(23) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(23)), CJsonpath = reader.IsDBNull(24) ? null : reader.GetString(24), - CCidr = reader.IsDBNull(25) ? (NpgsqlCidr? )null : reader.GetFieldValue(25), - CInet = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), - CMacaddr = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), - CMacaddr8 = reader.IsDBNull(28) ? null : reader.GetString(28), - CBytea = reader.IsDBNull(29) ? null : reader.GetFieldValue(29), - CBooleanArray = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), - CTextArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CIntegerArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CDecimalArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CDateArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CTimestampArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35) + CXml = reader.IsDBNull(25) ? null : (new Func((r, o) => + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(r.GetString(o)); + return xmlDoc; + }))(reader, 25), + CCidr = reader.IsDBNull(26) ? (NpgsqlCidr? )null : reader.GetFieldValue(26), + CInet = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), + CMacaddr = reader.IsDBNull(28) ? null : reader.GetFieldValue(28), + CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29) }; } } @@ -1095,17 +1075,16 @@ public async Task GetPostgresTypes() CJsonStringOverride = reader.IsDBNull(22) ? null : reader.GetString(22), CJsonb = reader.IsDBNull(23) ? (JsonElement? )null : JsonSerializer.Deserialize(reader.GetString(23)), CJsonpath = reader.IsDBNull(24) ? null : reader.GetString(24), - CCidr = reader.IsDBNull(25) ? (NpgsqlCidr? )null : reader.GetFieldValue(25), - CInet = reader.IsDBNull(26) ? null : reader.GetFieldValue(26), - CMacaddr = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), - CMacaddr8 = reader.IsDBNull(28) ? null : reader.GetString(28), - CBytea = reader.IsDBNull(29) ? null : reader.GetFieldValue(29), - CBooleanArray = reader.IsDBNull(30) ? null : reader.GetFieldValue(30), - CTextArray = reader.IsDBNull(31) ? null : reader.GetFieldValue(31), - CIntegerArray = reader.IsDBNull(32) ? null : reader.GetFieldValue(32), - CDecimalArray = reader.IsDBNull(33) ? null : reader.GetFieldValue(33), - CDateArray = reader.IsDBNull(34) ? null : reader.GetFieldValue(34), - CTimestampArray = reader.IsDBNull(35) ? null : reader.GetFieldValue(35) + CXml = reader.IsDBNull(25) ? null : (new Func((r, o) => + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(r.GetString(o)); + return xmlDoc; + }))(reader, 25), + CCidr = reader.IsDBNull(26) ? (NpgsqlCidr? )null : reader.GetFieldValue(26), + CInet = reader.IsDBNull(27) ? null : reader.GetFieldValue(27), + CMacaddr = reader.IsDBNull(28) ? null : reader.GetFieldValue(28), + CMacaddr8 = reader.IsDBNull(29) ? null : reader.GetString(29) }; } } @@ -1114,7 +1093,7 @@ public async Task GetPostgresTypes() return null; } - private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_bytea LIMIT 1 "; + private const string GetPostgresTypesCntSql = "SELECT c_smallint , c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr, COUNT (* ) AS cnt FROM postgres_types GROUP BY c_smallint, c_boolean, c_integer, c_bigint, c_real, c_numeric, c_decimal, c_double_precision, c_money, c_date, c_time, c_timestamp, c_timestamp_with_tz, c_interval, c_char, c_varchar, c_character_varying, c_bpchar, c_text, c_uuid, c_cidr, c_inet, c_macaddr LIMIT 1 "; public class GetPostgresTypesCntRow { public short? CSmallint { get; set; } @@ -1137,7 +1116,9 @@ public class GetPostgresTypesCntRow public string CBpchar { get; set; } public string CText { get; set; } public Guid? CUuid { get; set; } - public byte[] CBytea { get; set; } + public NpgsqlCidr? CCidr { get; set; } + public IPAddress CInet { get; set; } + public PhysicalAddress CMacaddr { get; set; } public long Cnt { get; set; } }; public async Task GetPostgresTypesCnt() @@ -1174,8 +1155,10 @@ public async Task GetPostgresTypesCnt() CBpchar = reader.IsDBNull(17) ? null : reader.GetString(17), CText = reader.IsDBNull(18) ? null : reader.GetString(18), CUuid = reader.IsDBNull(19) ? (Guid? )null : reader.GetFieldValue(19), - CBytea = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), - Cnt = reader.GetInt64(21) + CCidr = reader.IsDBNull(20) ? (NpgsqlCidr? )null : reader.GetFieldValue(20), + CInet = reader.IsDBNull(21) ? null : reader.GetFieldValue(21), + CMacaddr = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), + Cnt = reader.GetInt64(23) }; } } @@ -1220,8 +1203,10 @@ public async Task GetPostgresTypesCnt() CBpchar = reader.IsDBNull(17) ? null : reader.GetString(17), CText = reader.IsDBNull(18) ? null : reader.GetString(18), CUuid = reader.IsDBNull(19) ? (Guid? )null : reader.GetFieldValue(19), - CBytea = reader.IsDBNull(20) ? null : reader.GetFieldValue(20), - Cnt = reader.GetInt64(21) + CCidr = reader.IsDBNull(20) ? (NpgsqlCidr? )null : reader.GetFieldValue(20), + CInet = reader.IsDBNull(21) ? null : reader.GetFieldValue(21), + CMacaddr = reader.IsDBNull(22) ? null : reader.GetFieldValue(22), + Cnt = reader.GetInt64(23) }; } } @@ -1507,5 +1492,239 @@ public async Task TruncatePostgresGeoTypes() await command.ExecuteNonQueryAsync(); } } + + private const string InsertPostgresArrayTypesSql = "INSERT INTO postgres_array_types(c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array) VALUES ( @c_bytea, @c_boolean_array, @c_text_array, @c_integer_array, @c_decimal_array, @c_date_array, @c_timestamp_array ) "; + public class InsertPostgresArrayTypesArgs + { + public byte[] CBytea { get; set; } + public bool[] CBooleanArray { get; set; } + public string[] CTextArray { get; set; } + public int[] CIntegerArray { get; set; } + public decimal[] CDecimalArray { get; set; } + public DateTime[] CDateArray { get; set; } + public DateTime[] CTimestampArray { get; set; } + }; + public async Task InsertPostgresArrayTypes(InsertPostgresArrayTypesArgs args) + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(InsertPostgresArrayTypesSql)) + { + command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); + await command.ExecuteNonQueryAsync(); + } + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = InsertPostgresArrayTypesSql; + command.Transaction = this.Transaction; + command.Parameters.AddWithValue("@c_bytea", args.CBytea ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_boolean_array", args.CBooleanArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_text_array", args.CTextArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_array", args.CIntegerArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_decimal_array", args.CDecimalArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_date_array", args.CDateArray ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_timestamp_array", args.CTimestampArray ?? (object)DBNull.Value); + await command.ExecuteNonQueryAsync(); + } + } + + private const string GetPostgresArrayTypesSql = "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1"; + public class GetPostgresArrayTypesRow + { + public byte[] CBytea { get; set; } + public bool[] CBooleanArray { get; set; } + public string[] CTextArray { get; set; } + public int[] CIntegerArray { get; set; } + public decimal[] CDecimalArray { get; set; } + public DateTime[] CDateArray { get; set; } + public DateTime[] CTimestampArray { get; set; } + }; + public async Task GetPostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(GetPostgresArrayTypesSql)) + { + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + CBooleanArray = reader.IsDBNull(1) ? null : reader.GetFieldValue(1), + CTextArray = reader.IsDBNull(2) ? null : reader.GetFieldValue(2), + CIntegerArray = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), + CDecimalArray = reader.IsDBNull(4) ? null : reader.GetFieldValue(4), + CDateArray = reader.IsDBNull(5) ? null : reader.GetFieldValue(5), + CTimestampArray = reader.IsDBNull(6) ? null : reader.GetFieldValue(6) + }; + } + } + } + } + + return null; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = GetPostgresArrayTypesSql; + command.Transaction = this.Transaction; + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + CBooleanArray = reader.IsDBNull(1) ? null : reader.GetFieldValue(1), + CTextArray = reader.IsDBNull(2) ? null : reader.GetFieldValue(2), + CIntegerArray = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), + CDecimalArray = reader.IsDBNull(4) ? null : reader.GetFieldValue(4), + CDateArray = reader.IsDBNull(5) ? null : reader.GetFieldValue(5), + CTimestampArray = reader.IsDBNull(6) ? null : reader.GetFieldValue(6) + }; + } + } + } + + return null; + } + + private const string InsertPostgresArrayTypesBatchSql = "COPY postgres_array_types (c_bytea) FROM STDIN (FORMAT BINARY)"; + public class InsertPostgresArrayTypesBatchArgs + { + public byte[] CBytea { get; set; } + }; + public async Task InsertPostgresArrayTypesBatch(List args) + { + using (var connection = new NpgsqlConnection(ConnectionString)) + { + await connection.OpenAsync(); + using (var writer = await connection.BeginBinaryImportAsync(InsertPostgresArrayTypesBatchSql)) + { + foreach (var row in args) + { + await writer.StartRowAsync(); + await writer.WriteAsync(row.CBytea ?? (object)DBNull.Value); + } + + await writer.CompleteAsync(); + } + + await connection.CloseAsync(); + } + } + + private const string GetPostgresArrayTypesCntSql = "SELECT c_bytea , COUNT (* ) AS cnt FROM postgres_array_types GROUP BY c_bytea LIMIT 1 "; + public class GetPostgresArrayTypesCntRow + { + public byte[] CBytea { get; set; } + public long Cnt { get; set; } + }; + public async Task GetPostgresArrayTypesCnt() + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(GetPostgresArrayTypesCntSql)) + { + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesCntRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + Cnt = reader.GetInt64(1) + }; + } + } + } + } + + return null; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = GetPostgresArrayTypesCntSql; + command.Transaction = this.Transaction; + using (var reader = await command.ExecuteReaderAsync()) + { + if (await reader.ReadAsync()) + { + return new GetPostgresArrayTypesCntRow + { + CBytea = reader.IsDBNull(0) ? null : reader.GetFieldValue(0), + Cnt = reader.GetInt64(1) + }; + } + } + } + + return null; + } + + private const string TruncatePostgresArrayTypesSql = "TRUNCATE TABLE postgres_array_types"; + public async Task TruncatePostgresArrayTypes() + { + if (this.Transaction == null) + { + using (var connection = NpgsqlDataSource.Create(ConnectionString)) + { + using (var command = connection.CreateCommand(TruncatePostgresArrayTypesSql)) + { + await command.ExecuteNonQueryAsync(); + } + } + + return; + } + + if (this.Transaction?.Connection == null || this.Transaction?.Connection.State != System.Data.ConnectionState.Open) + { + throw new System.InvalidOperationException("Transaction is provided, but its connection is null."); + } + + using (var command = this.Transaction.Connection.CreateCommand()) + { + command.CommandText = TruncatePostgresArrayTypesSql; + command.Transaction = this.Transaction; + await command.ExecuteNonQueryAsync(); + } + } } } \ No newline at end of file diff --git a/examples/NpgsqlLegacyExample/request.json b/examples/NpgsqlLegacyExample/request.json index 152879cd..54141e9d 100644 --- a/examples/NpgsqlLegacyExample/request.json +++ b/examples/NpgsqlLegacyExample/request.json @@ -374,6 +374,16 @@ "name": "jsonpath" } }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + } + }, { "name": "c_cidr", "length": -1, @@ -423,169 +433,176 @@ "type": { "name": "uuid" } - }, + } + ] + }, + { + "rel": { + "name": "postgres_geometric_types" + }, + "columns": [ { - "name": "c_bytea", + "name": "c_point", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "bytea" + "name": "point" } }, { - "name": "c_boolean_array", - "isArray": true, + "name": "c_line", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "arrayDims": 1 + "name": "line" + } }, { - "name": "c_text_array", - "isArray": true, + "name": "c_lseg", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "text" - }, - "arrayDims": 1 + "name": "lseg" + } }, { - "name": "c_integer_array", - "isArray": true, + "name": "c_box", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "arrayDims": 1 + "name": "box" + } }, { - "name": "c_decimal_array", - "isArray": true, + "name": "c_path", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "arrayDims": 1 + "name": "path" + } }, { - "name": "c_date_array", - "isArray": true, + "name": "c_polygon", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "name": "date" - }, - "arrayDims": 1 + "name": "polygon" + } }, { - "name": "c_timestamp_array", - "isArray": true, + "name": "c_circle", "length": -1, "table": { - "name": "postgres_types" + "name": "postgres_geometric_types" }, "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "arrayDims": 1 + "name": "circle" + } } ] }, { "rel": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "columns": [ { - "name": "c_point", + "name": "c_bytea", "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "point" + "name": "bytea" } }, { - "name": "c_line", + "name": "c_boolean_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "line" - } + "schema": "pg_catalog", + "name": "bool" + }, + "arrayDims": 1 }, { - "name": "c_lseg", + "name": "c_text_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "lseg" - } + "name": "text" + }, + "arrayDims": 1 }, { - "name": "c_box", + "name": "c_integer_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "box" - } + "schema": "pg_catalog", + "name": "int4" + }, + "arrayDims": 1 }, { - "name": "c_path", + "name": "c_decimal_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "path" - } + "schema": "pg_catalog", + "name": "numeric" + }, + "arrayDims": 1 }, { - "name": "c_polygon", + "name": "c_date_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "polygon" - } + "name": "date" + }, + "arrayDims": 1 }, { - "name": "c_circle", + "name": "c_timestamp_array", + "isArray": true, "length": -1, "table": { - "name": "postgres_geometric_types" + "name": "postgres_array_types" }, "type": { - "name": "circle" - } + "schema": "pg_catalog", + "name": "timestamp" + }, + "arrayDims": 1 } ] } @@ -33190,7 +33207,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26,\n $27,\n $28::macaddr,\n $29::macaddr8,\n $30, \n $31,\n $32, \n $33,\n $34,\n $35,\n $36\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8\n)\nVALUES (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9,\n $10,\n $11,\n $12,\n $13,\n $14,\n $15,\n $16,\n $17,\n $18,\n $19,\n $20,\n $21,\n $22::json, \n $23::json, \n $24::jsonb,\n $25::jsonpath,\n $26::xml,\n $27,\n $28,\n $29::macaddr,\n $30::macaddr8\n)", "name": "InsertPostgresTypes", "cmd": ":exec", "parameters": [ @@ -33572,6 +33589,16 @@ }, { "number": 26, + "column": { + "name": "c_xml", + "length": -1, + "type": { + "name": "xml" + } + } + }, + { + "number": 27, "column": { "name": "c_cidr", "length": -1, @@ -33587,7 +33614,7 @@ } }, { - "number": 27, + "number": 28, "column": { "name": "c_inet", "length": -1, @@ -33603,7 +33630,7 @@ } }, { - "number": 28, + "number": 29, "column": { "name": "c_macaddr", "length": -1, @@ -33613,7 +33640,7 @@ } }, { - "number": 29, + "number": 30, "column": { "name": "c_macaddr8", "length": -1, @@ -33621,130 +33648,6 @@ "name": "macaddr8" } } - }, - { - "number": 30, - "column": { - "name": "c_bytea", - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - } - }, - { - "number": 31, - "column": { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - } - }, - { - "number": 32, - "column": { - "name": "c_text_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - } - }, - { - "number": 33, - "column": { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - } - }, - { - "number": 34, - "column": { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - } - }, - { - "number": 35, - "column": { - "name": "c_date_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - } - }, - { - "number": 36, - "column": { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "isNamedParam": true, - "table": { - "schema": "public", - "name": "postgres_types" - }, - "type": { - "name": "pg_catalog.timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 - } } ], "filename": "query.sql", @@ -33753,7 +33656,7 @@ } }, { - "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21\n)", + "text": "INSERT INTO postgres_types\n(\n c_boolean,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\n)\nVALUES (\n $1, \n $2, \n $3, \n $4, \n $5, \n $6, \n $7, \n $8, \n $9, \n $10, \n $11, \n $12, \n $13, \n $14, \n $15, \n $16, \n $17, \n $18,\n $19,\n $20,\n $21,\n $22,\n $23\n)", "name": "InsertPostgresTypesBatch", "cmd": ":copyfrom", "parameters": [ @@ -34060,16 +33963,46 @@ { "number": 21, "column": { - "name": "c_bytea", + "name": "c_cidr", "length": -1, "table": { "schema": "public", "name": "postgres_types" }, "type": { - "name": "bytea" + "name": "cidr" }, - "originalName": "c_bytea" + "originalName": "c_cidr" + } + }, + { + "number": 22, + "column": { + "name": "c_inet", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + } + }, + { + "number": 23, + "column": { + "name": "c_macaddr", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" } } ], @@ -34079,7 +34012,7 @@ } }, { - "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8,\n c_bytea, \n c_boolean_array,\n c_text_array, \n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\nFROM postgres_types \nLIMIT 1", + "text": "SELECT \n c_boolean,\n c_bit,\n c_smallint,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_json,\n c_json_string_override,\n c_jsonb,\n c_jsonpath,\n c_xml,\n c_cidr,\n c_inet,\n c_macaddr,\n c_macaddr8::TEXT AS c_macaddr8\nFROM postgres_types \nLIMIT 1", "name": "GetPostgresTypes", "cmd": ":one", "columns": [ @@ -34374,6 +34307,17 @@ }, "originalName": "c_jsonpath" }, + { + "name": "c_xml", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "xml" + }, + "originalName": "c_xml" + }, { "name": "c_cidr", "length": -1, @@ -34414,105 +34358,12 @@ "type": { "name": "text" } - }, - { - "name": "c_bytea", - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "bytea" - }, - "originalName": "c_bytea" - }, - { - "name": "c_boolean_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "bool" - }, - "originalName": "c_boolean_array", - "arrayDims": 1 - }, - { - "name": "c_text_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "text" - }, - "originalName": "c_text_array", - "arrayDims": 1 - }, - { - "name": "c_integer_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "int4" - }, - "originalName": "c_integer_array", - "arrayDims": 1 - }, - { - "name": "c_decimal_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "numeric" - }, - "originalName": "c_decimal_array", - "arrayDims": 1 - }, - { - "name": "c_date_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "name": "date" - }, - "originalName": "c_date_array", - "arrayDims": 1 - }, - { - "name": "c_timestamp_array", - "isArray": true, - "length": -1, - "table": { - "name": "postgres_types" - }, - "type": { - "schema": "pg_catalog", - "name": "timestamp" - }, - "originalName": "c_timestamp_array", - "arrayDims": 1 } ], "filename": "query.sql" }, { - "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_bytea\nLIMIT 1", + "text": "SELECT\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr,\n COUNT(*) AS cnt\nFROM postgres_types\nGROUP BY\n c_smallint,\n c_boolean,\n c_integer,\n c_bigint,\n c_real,\n c_numeric,\n c_decimal,\n c_double_precision,\n c_money,\n c_date,\n c_time,\n c_timestamp,\n c_timestamp_with_tz,\n c_interval,\n c_char,\n c_varchar,\n c_character_varying,\n c_bpchar,\n c_text,\n c_uuid,\n c_cidr,\n c_inet,\n c_macaddr\nLIMIT 1", "name": "GetPostgresTypesCnt", "cmd": ":one", "columns": [ @@ -34752,15 +34603,37 @@ "originalName": "c_uuid" }, { - "name": "c_bytea", + "name": "c_cidr", "length": -1, "table": { "name": "postgres_types" }, "type": { - "name": "bytea" + "name": "cidr" }, - "originalName": "c_bytea" + "originalName": "c_cidr" + }, + { + "name": "c_inet", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "inet" + }, + "originalName": "c_inet" + }, + { + "name": "c_macaddr", + "length": -1, + "table": { + "name": "postgres_types" + }, + "type": { + "name": "macaddr" + }, + "originalName": "c_macaddr" }, { "name": "cnt", @@ -35137,6 +35010,295 @@ "name": "TruncatePostgresGeoTypes", "cmd": ":exec", "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types\n(\n c_bytea,\n c_boolean_array,\n c_text_array,\n c_integer_array,\n c_decimal_array,\n c_date_array,\n c_timestamp_array\n)\nVALUES ($1, $2, $3, $4, $5, $6, $7)", + "name": "InsertPostgresArrayTypes", + "cmd": ":exec", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + }, + { + "number": 2, + "column": { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + } + }, + { + "number": 3, + "column": { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + } + }, + { + "number": 4, + "column": { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + } + }, + { + "number": 5, + "column": { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + } + }, + { + "number": 6, + "column": { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + } + }, + { + "number": 7, + "column": { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "pg_catalog.timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1", + "name": "GetPostgresArrayTypes", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "c_boolean_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "bool" + }, + "originalName": "c_boolean_array", + "arrayDims": 1 + }, + { + "name": "c_text_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "text" + }, + "originalName": "c_text_array", + "arrayDims": 1 + }, + { + "name": "c_integer_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "int4" + }, + "originalName": "c_integer_array", + "arrayDims": 1 + }, + { + "name": "c_decimal_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "numeric" + }, + "originalName": "c_decimal_array", + "arrayDims": 1 + }, + { + "name": "c_date_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "date" + }, + "originalName": "c_date_array", + "arrayDims": 1 + }, + { + "name": "c_timestamp_array", + "isArray": true, + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "schema": "pg_catalog", + "name": "timestamp" + }, + "originalName": "c_timestamp_array", + "arrayDims": 1 + } + ], + "filename": "query.sql" + }, + { + "text": "INSERT INTO postgres_array_types (c_bytea) VALUES ($1)", + "name": "InsertPostgresArrayTypesBatch", + "cmd": ":copyfrom", + "parameters": [ + { + "number": 1, + "column": { + "name": "c_bytea", + "length": -1, + "table": { + "schema": "public", + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + } + } + ], + "filename": "query.sql", + "insert_into_table": { + "name": "postgres_array_types" + } + }, + { + "text": "SELECT\n c_bytea,\n COUNT(*) AS cnt\nFROM postgres_array_types\nGROUP BY\n c_bytea\nLIMIT 1", + "name": "GetPostgresArrayTypesCnt", + "cmd": ":one", + "columns": [ + { + "name": "c_bytea", + "length": -1, + "table": { + "name": "postgres_array_types" + }, + "type": { + "name": "bytea" + }, + "originalName": "c_bytea" + }, + { + "name": "cnt", + "notNull": true, + "length": -1, + "isFuncCall": true, + "type": { + "name": "bigint" + } + } + ], + "filename": "query.sql" + }, + { + "text": "TRUNCATE TABLE postgres_array_types", + "name": "TruncatePostgresArrayTypes", + "cmd": ":exec", + "filename": "query.sql" } ], "sqlc_version": "v1.27.0", diff --git a/examples/NpgsqlLegacyExample/request.message b/examples/NpgsqlLegacyExample/request.message index e6aa12d9..f5579efe 100644 --- a/examples/NpgsqlLegacyExample/request.message +++ b/examples/NpgsqlLegacyExample/request.message @@ -3,7 +3,7 @@ 2 postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/query.sqlbР examples/NpgsqlLegacyExamplecsharp╤{"debugRequest":true,"generateCsproj":true,"namespaceName":"NpgsqlLegacyExampleGen","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"notNull":false,"type":"int"}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"notNull":false,"type":"string"}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"notNull":true,"type":"DateTime"}},{"column":"*:c_json_string_override","csharp_type":{"notNull":false,"type":"string"}},{"column":"*:c_macaddr8","csharp_type":{"notNull":false,"type":"string"}}],"targetFramework":"netstandard2.0","useDapper":false}* -./dist/LocalRunner╖х public"ЛpublicГ +./dist/LocalRunnerйц public"¤publicГ authors) id0         R authorsb  bigserial& name0         R authorsbtext# @@ -13,7 +13,7 @@ postgresql%examples/config/postgresql/schema.sql"$examples/config/postgresql/qu name0         Rbooksbtext5 author_id0         Rbooksb pg_catalogint8) - description0         RbooksbtextК + description0         Rbooksbtextф postgres_types< c_boolean0         Rpostgres_typesb pg_catalogbool7 @@ -58,25 +58,15 @@ pg_catalogvarchar1 c_jsonb0         Rpostgres_typesbjsonb5 c_jsonpath0         Rpostgres_typesb -jsonpath- +jsonpath+ +c_xml0         Rpostgres_typesbxml- c_cidr0         Rpostgres_typesbcidr- c_inet0         Rpostgres_typesbinet3 c_macaddr0         Rpostgres_typesb macaddr5 c_macaddr80         Rpostgres_typesb macaddr8- -c_uuid0         Rpostgres_typesbuuid/ -c_bytea0         Rpostgres_typesbbyteaG -c_boolean_array 0         Rpostgres_typesb -pg_catalogboolИ8 - c_text_array 0         Rpostgres_typesbtextИG -c_integer_array 0         Rpostgres_typesb -pg_catalogint4ИJ -c_decimal_array 0         Rpostgres_typesb -pg_catalognumericИ8 - c_date_array 0         Rpostgres_typesbdateИN -c_timestamp_array 0         Rpostgres_typesb -pg_catalog timestampИ╡ +c_uuid0         Rpostgres_typesbuuid╡ postgres_geometric_types9 c_point0         Rpostgres_geometric_typesbpoint7 c_line0         Rpostgres_geometric_typesbline7 @@ -84,7 +74,19 @@ pg_catalog timestamp c_box0         Rpostgres_geometric_typesbbox7 c_path0         Rpostgres_geometric_typesbpath= c_polygon0         Rpostgres_geometric_typesb polygon; -c_circle0         Rpostgres_geometric_typesbcircle" pg_temp"ц▓ +c_circle0         Rpostgres_geometric_typesbcircleХ +postgres_array_types5 +c_bytea0         Rpostgres_array_typesbbyteaM +c_boolean_array 0         Rpostgres_array_typesb +pg_catalogboolИ> + c_text_array 0         Rpostgres_array_typesbtextИM +c_integer_array 0         Rpostgres_array_typesb +pg_catalogint4ИP +c_decimal_array 0         Rpostgres_array_typesb +pg_catalognumericИ> + c_date_array 0         Rpostgres_array_typesbdateИT +c_timestamp_array 0         Rpostgres_array_typesb +pg_catalog timestampИ" pg_temp"ц▓ pg_catalogЙ & @@ -10296,8 +10298,8 @@ WHERE books.name = $1GetAuthorsByBookName:many"- name0         R authorsbtextzname"( bio0         R authorsbtextzbio" books0         brbooks*.* -name0         Rbooksbtextzname: query.sql╢ -▌INSERT INTO postgres_types +name0         Rbooksbtextzname: query.sqlИ +мINSERT INTO postgres_types ( c_boolean, c_bit, @@ -10324,17 +10326,11 @@ WHERE books.name = $1GetAuthorsByBookName:many"- c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, - c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8 ) VALUES ( $1, @@ -10362,17 +10358,11 @@ VALUES ( $23::json, $24::jsonb, $25::jsonpath, - $26, + $26::xml, $27, - $28::macaddr, - $29::macaddr8, - $30, - $31, - $32, - $33, - $34, - $35, - $36 + $28, + $29::macaddr, + $30::macaddr8 )InsertPostgresTypes:exec*TP c_boolean0         8Rpublicpostgres_typesbpg_catalog.boolz c_boolean*KG c_bit0         8Rpublicpostgres_typesbpg_catalog.bitzc_bit*VR @@ -10405,21 +10395,15 @@ c_interval*PL c_jsonb0         bjsonb*'# c_jsonpath0         b -jsonpath*C? -c_cidr0         8Rpublicpostgres_typesbcidrzc_cidr*C? -c_inet0         8Rpublicpostgres_typesbinetzc_inet*%! - c_macaddr0         b macaddr*'# +jsonpath* +c_xml0         bxml*C? +c_cidr0         8Rpublicpostgres_typesbcidrzc_cidr*C? +c_inet0         8Rpublicpostgres_typesbinetzc_inet*%! + c_macaddr0         b macaddr*'# c_macaddr80         b -macaddr8*FB -c_bytea0         8Rpublicpostgres_typesbbyteazc_bytea*ea -c_boolean_array 0         8Rpublicpostgres_typesbpg_catalog.boolzc_boolean_arrayИ*T P - c_text_array 0         8Rpublicpostgres_typesbtextz c_text_arrayИ*e!a -c_integer_array 0         8Rpublicpostgres_typesbpg_catalog.int4zc_integer_arrayИ*h"d -c_decimal_array 0         8Rpublicpostgres_typesbpg_catalog.numericzc_decimal_arrayИ*T#P - c_date_array 0         8Rpublicpostgres_typesbdatez c_date_arrayИ*n$j -c_timestamp_array 0         8Rpublicpostgres_typesbpg_catalog.timestampzc_timestamp_arrayИ: query.sqlBpostgres_types╧ -░INSERT INTO postgres_types +macaddr8: query.sqlBpostgres_typesЗ +▄INSERT INTO postgres_types ( c_boolean, c_smallint, @@ -10441,7 +10425,9 @@ c_macaddr80 c_bpchar, c_text, c_uuid, - c_bytea + c_cidr, + c_inet, + c_macaddr ) VALUES ( $1, @@ -10464,7 +10450,9 @@ VALUES ( $18, $19, $20, - $21 + $21, + $22, + $23 )InsertPostgresTypesBatch :copyfrom*RN c_boolean0         Rpublicpostgres_typesbpg_catalog.boolz c_boolean*TP @@ -10490,9 +10478,11 @@ c_interval*NJ c_character_varying0         Rpublicpostgres_typesbpg_catalog.varcharzc_character_varying*GC c_bpchar0         Rpublicpostgres_typesbbpcharzc_bpchar*A= c_text0         Rpublicpostgres_typesbtextzc_text*A= -c_uuid0         Rpublicpostgres_typesbuuidzc_uuid*D@ -c_bytea0         Rpublicpostgres_typesbbyteazc_bytea: query.sqlBpostgres_types╡ -ВSELECT +c_uuid0         Rpublicpostgres_typesbuuidzc_uuid*A= +c_cidr0         Rpublicpostgres_typesbcidrzc_cidr*A= +c_inet0         Rpublicpostgres_typesbinetzc_inet*JF + c_macaddr0         Rpublicpostgres_typesb macaddrz c_macaddr: query.sqlBpostgres_typesн +ДSELECT c_boolean, c_bit, c_smallint, @@ -10518,17 +10508,11 @@ c_interval*NJ c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, - c_macaddr8::TEXT AS c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8::TEXT AS c_macaddr8 FROM postgres_types LIMIT 1GetPostgresTypes:one"G c_boolean0         Rpostgres_typesb @@ -10578,24 +10562,14 @@ pg_catalogvarcharzc_character_varying"; c_jsonpath0         Rpostgres_typesb jsonpathz -c_jsonpath"5 +c_jsonpath"2 +c_xml0         Rpostgres_typesbxmlzc_xml"5 c_cidr0         Rpostgres_typesbcidrzc_cidr"5 c_inet0         Rpostgres_typesbinetzc_inet"> c_macaddr0         Rpostgres_typesb macaddrz c_macaddr"! -c_macaddr80         btext"8 -c_bytea0         Rpostgres_typesbbyteazc_bytea"X -c_boolean_array 0         Rpostgres_typesb -pg_catalogboolzc_boolean_arrayИ"F - c_text_array 0         Rpostgres_typesbtextz c_text_arrayИ"X -c_integer_array 0         Rpostgres_typesb -pg_catalogint4zc_integer_arrayИ"[ -c_decimal_array 0         Rpostgres_typesb -pg_catalognumericzc_decimal_arrayИ"F - c_date_array 0         Rpostgres_typesbdatez c_date_arrayИ"a -c_timestamp_array 0         Rpostgres_typesb -pg_catalog timestampzc_timestamp_arrayИ: query.sql№ -╞SELECT +c_macaddr80         btext: query.sqlд +·SELECT c_smallint, c_boolean, c_integer, @@ -10616,7 +10590,9 @@ pg_catalog timestampzc_timestamp_array c_bpchar, c_text, c_uuid, - c_bytea, + c_cidr, + c_inet, + c_macaddr, COUNT(*) AS cnt FROM postgres_types GROUP BY @@ -10640,7 +10616,9 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea + c_cidr, + c_inet, + c_macaddr LIMIT 1GetPostgresTypesCnt:one"I c_smallint0         Rpostgres_typesb @@ -10680,8 +10658,10 @@ pg_catalogvarcharz c_varchar"^ pg_catalogvarcharzc_character_varying"; c_bpchar0         Rpostgres_typesbbpcharzc_bpchar"5 c_text0         Rpostgres_typesbtextzc_text"5 -c_uuid0         Rpostgres_typesbuuidzc_uuid"8 -c_bytea0         Rpostgres_typesbbyteazc_bytea" +c_uuid0         Rpostgres_typesbuuidzc_uuid"5 +c_cidr0         Rpostgres_typesbcidrzc_cidr"5 +c_inet0         Rpostgres_typesbinetzc_inet"> + c_macaddr0         Rpostgres_typesb macaddrz c_macaddr" cnt0         @bbigint: query.sql░ ЖSELECT MAX(c_integer) AS max_integer, @@ -10725,4 +10705,46 @@ hSELECT c_point, c_line, c_lseg, c_box, c_path, c_polygon, c_circle FROM postgre c_polygon0         Rpostgres_geometric_typesb polygonz c_polygon"E c_circle0         Rpostgres_geometric_typesbcirclezc_circle: query.sqlH TRUNCATE TABLE postgres_typesTruncatePostgresTypes:exec: query.sqlU -'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql"v1.27.0*И{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"netstandard2.0","namespaceName":"NpgsqlLegacyExampleGen","useDapper":false,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file +'TRUNCATE TABLE postgres_geometric_typesTruncatePostgresGeoTypes:exec: query.sql═ +╬INSERT INTO postgres_array_types +( + c_bytea, + c_boolean_array, + c_text_array, + c_integer_array, + c_decimal_array, + c_date_array, + c_timestamp_array +) +VALUES ($1, $2, $3, $4, $5, $6, $7)InsertPostgresArrayTypes:exec*JF +c_bytea0         Rpublicpostgres_array_typesbbyteazc_bytea*ie +c_boolean_array 0         Rpublicpostgres_array_typesbpg_catalog.boolzc_boolean_arrayИ*XT + c_text_array 0         Rpublicpostgres_array_typesbtextz c_text_arrayИ*ie +c_integer_array 0         Rpublicpostgres_array_typesbpg_catalog.int4zc_integer_arrayИ*lh +c_decimal_array 0         Rpublicpostgres_array_typesbpg_catalog.numericzc_decimal_arrayИ*XT + c_date_array 0         Rpublicpostgres_array_typesbdatez c_date_arrayИ*rn +c_timestamp_array 0         Rpublicpostgres_array_typesbpg_catalog.timestampzc_timestamp_arrayИ: query.sqlBpostgres_array_typesе +ТSELECT c_bytea, c_boolean_array, c_text_array, c_integer_array, c_decimal_array, c_date_array, c_timestamp_array FROM postgres_array_types LIMIT 1GetPostgresArrayTypes:one"> +c_bytea0         Rpostgres_array_typesbbyteazc_bytea"^ +c_boolean_array 0         Rpostgres_array_typesb +pg_catalogboolzc_boolean_arrayИ"L + c_text_array 0         Rpostgres_array_typesbtextz c_text_arrayИ"^ +c_integer_array 0         Rpostgres_array_typesb +pg_catalogint4zc_integer_arrayИ"a +c_decimal_array 0         Rpostgres_array_typesb +pg_catalognumericzc_decimal_arrayИ"L + c_date_array 0         Rpostgres_array_typesbdatez c_date_arrayИ"g +c_timestamp_array 0         Rpostgres_array_typesb +pg_catalog timestampzc_timestamp_arrayИ: query.sql╤ +6INSERT INTO postgres_array_types (c_bytea) VALUES ($1)InsertPostgresArrayTypesBatch :copyfrom*JF +c_bytea0         Rpublicpostgres_array_typesbbyteazc_bytea: query.sqlBpostgres_array_typesы +^SELECT + c_bytea, + COUNT(*) AS cnt +FROM postgres_array_types +GROUP BY + c_bytea +LIMIT 1GetPostgresArrayTypesCnt:one"> +c_bytea0         Rpostgres_array_typesbbyteazc_bytea" +cnt0         @bbigint: query.sqlS +#TRUNCATE TABLE postgres_array_typesTruncatePostgresArrayTypes:exec: query.sql"v1.27.0*И{"overrideDriverVersion":"","generateCsproj":true,"targetFramework":"netstandard2.0","namespaceName":"NpgsqlLegacyExampleGen","useDapper":false,"overrideDapperVersion":"","overrides":[{"column":"GetPostgresFunctions:max_integer","csharp_type":{"type":"int","notNull":false}},{"column":"GetPostgresFunctions:max_varchar","csharp_type":{"type":"string","notNull":false}},{"column":"GetPostgresFunctions:max_timestamp","csharp_type":{"type":"DateTime","notNull":true}},{"column":"*:c_json_string_override","csharp_type":{"type":"string","notNull":false}},{"column":"*:c_macaddr8","csharp_type":{"type":"string","notNull":false}}],"debugRequest":false} \ No newline at end of file diff --git a/examples/SqliteDapperExample/Models.cs b/examples/SqliteDapperExample/Models.cs index 16cd98fa..8518a279 100644 --- a/examples/SqliteDapperExample/Models.cs +++ b/examples/SqliteDapperExample/Models.cs @@ -1,4 +1,6 @@ // auto-generated by sqlc - do not edit +using System.Linq; + namespace SqliteDapperExampleGen; public class Author { diff --git a/examples/SqliteDapperLegacyExample/Models.cs b/examples/SqliteDapperLegacyExample/Models.cs index e45fabdc..ae820a09 100644 --- a/examples/SqliteDapperLegacyExample/Models.cs +++ b/examples/SqliteDapperLegacyExample/Models.cs @@ -1,6 +1,8 @@ // auto-generated by sqlc - do not edit namespace SqliteDapperLegacyExampleGen { + using System.Linq; + public class Author { public int Id { get; set; } diff --git a/examples/SqliteExample/Models.cs b/examples/SqliteExample/Models.cs index 1947bb76..e266ada0 100644 --- a/examples/SqliteExample/Models.cs +++ b/examples/SqliteExample/Models.cs @@ -1,4 +1,6 @@ // auto-generated by sqlc - do not edit +using System.Linq; + namespace SqliteExampleGen; public readonly record struct Author(int Id, string Name, string? Bio); public readonly record struct Book(int Id, string Name, int AuthorId, string? Description); diff --git a/examples/SqliteLegacyExample/Models.cs b/examples/SqliteLegacyExample/Models.cs index 0a3112f3..b27dbdf1 100644 --- a/examples/SqliteLegacyExample/Models.cs +++ b/examples/SqliteLegacyExample/Models.cs @@ -1,6 +1,8 @@ // auto-generated by sqlc - do not edit namespace SqliteLegacyExampleGen { + using System.Linq; + public class Author { public int Id { get; set; } diff --git a/examples/config/mysql/query.sql b/examples/config/mysql/query.sql index 33ad29d4..570f4a33 100644 --- a/examples/config/mysql/query.sql +++ b/examples/config/mysql/query.sql @@ -60,19 +60,19 @@ WHERE books.name = ?; INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_decimal, c_dec, c_numeric, c_fixed, c_float, c_double, c_double_precision, - c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, - c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, + c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, + c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) -VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); +VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); -- name: InsertMysqlTypesBatch :copyfrom INSERT INTO mysql_types (c_bit, c_bool, c_boolean, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, - c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, c_enum, - c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, + c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, + c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob) -VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); +VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); -- name: GetMysqlTypes :one SELECT * FROM mysql_types LIMIT 1; @@ -81,13 +81,13 @@ SELECT * FROM mysql_types LIMIT 1; SELECT COUNT(1) AS cnt, c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, - c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, + c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob FROM mysql_types GROUP BY c_bool, c_boolean, c_bit, c_tinyint, c_smallint, c_mediumint, c_int, c_integer, c_bigint, c_float, c_numeric, c_decimal, c_dec, c_fixed, c_double, c_double_precision, c_char, c_nchar, c_national_char, c_varchar, c_tinytext, c_mediumtext, c_text, c_longtext, - c_enum, c_json, c_json_string_override, c_year, c_date, c_datetime, c_timestamp, + c_json, c_json_string_override, c_enum, c_set, c_year, c_date, c_datetime, c_timestamp, c_binary, c_varbinary, c_tinyblob, c_blob, c_mediumblob, c_longblob LIMIT 1; @@ -99,7 +99,7 @@ FROM mysql_types; TRUNCATE TABLE mysql_types; -- name: CreateExtendedBio :exec -INSERT INTO extended.bios (author_name, name, bio_type) VALUES (?, ?, ?); +INSERT INTO extended.bios (author_name, name, bio_type, author_type) VALUES (?, ?, ?, ?); -- name: GetFirstExtendedBioByType :one SELECT * FROM extended.bios WHERE bio_type = ? LIMIT 1; diff --git a/examples/config/mysql/schema.sql b/examples/config/mysql/schema.sql index cfcd816b..9094a7d8 100644 --- a/examples/config/mysql/schema.sql +++ b/examples/config/mysql/schema.sql @@ -42,18 +42,21 @@ CREATE TABLE mysql_types ( c_timestamp TIMESTAMP, /* String data types */ - c_char CHAR, - c_nchar NCHAR, - c_national_char NATIONAL CHAR, - c_varchar VARCHAR(100), - c_tinytext TINYTEXT, - c_mediumtext MEDIUMTEXT, - c_text TEXT, - c_longtext LONGTEXT, - c_enum ENUM ('small', 'medium', 'big'), + c_char CHAR, + c_nchar NCHAR, + c_national_char NATIONAL CHAR, + c_varchar VARCHAR(100), + c_tinytext TINYTEXT, + c_mediumtext MEDIUMTEXT, + c_text TEXT, + c_longtext LONGTEXT, c_json JSON, - c_json_string_override JSON, - + c_json_string_override JSON, + + /* Pre-defined types */ + c_enum ENUM ('small', 'medium', 'big'), + c_set SET ('tea', 'coffee', 'milk'), + /* Binary data types */ c_bit BIT(8), c_binary BINARY(3), @@ -70,5 +73,6 @@ CREATE TABLE extended.bios ( author_name VARCHAR(100), name VARCHAR(100), bio_type ENUM ('Autobiography', 'Biography', 'Memoir'), + author_type SET ('Author', 'Editor', 'Translator'), PRIMARY KEY (author_name, name) ); diff --git a/examples/config/postgresql/query.sql b/examples/config/postgresql/query.sql index 670850cb..085d6390 100644 --- a/examples/config/postgresql/query.sql +++ b/examples/config/postgresql/query.sql @@ -98,17 +98,11 @@ INSERT INTO postgres_types c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, - c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8 ) VALUES ( sqlc.narg('c_boolean'), @@ -136,17 +130,11 @@ VALUES ( sqlc.narg('c_json_string_override')::json, sqlc.narg('c_jsonb')::jsonb, sqlc.narg('c_jsonpath')::jsonpath, + sqlc.narg('c_xml')::xml, sqlc.narg('c_cidr'), sqlc.narg('c_inet'), sqlc.narg('c_macaddr')::macaddr, - sqlc.narg('c_macaddr8')::macaddr8, - sqlc.narg('c_bytea'), - sqlc.narg('c_boolean_array'), - sqlc.narg('c_text_array'), - sqlc.narg('c_integer_array'), - sqlc.narg('c_decimal_array'), - sqlc.narg('c_date_array'), - sqlc.narg('c_timestamp_array') + sqlc.narg('c_macaddr8')::macaddr8 ); -- name: InsertPostgresTypesBatch :copyfrom @@ -172,7 +160,9 @@ INSERT INTO postgres_types c_bpchar, c_text, c_uuid, - c_bytea + c_cidr, + c_inet, + c_macaddr ) VALUES ( $1, @@ -195,7 +185,9 @@ VALUES ( $18, $19, $20, - $21 + $21, + $22, + $23 ); -- name: GetPostgresTypes :one @@ -225,17 +217,11 @@ SELECT c_json_string_override, c_jsonb, c_jsonpath, + c_xml, c_cidr, c_inet, c_macaddr, - c_macaddr8::TEXT AS c_macaddr8, - c_bytea, - c_boolean_array, - c_text_array, - c_integer_array, - c_decimal_array, - c_date_array, - c_timestamp_array + c_macaddr8::TEXT AS c_macaddr8 FROM postgres_types LIMIT 1; @@ -261,7 +247,9 @@ SELECT c_bpchar, c_text, c_uuid, - c_bytea, + c_cidr, + c_inet, + c_macaddr, COUNT(*) AS cnt FROM postgres_types GROUP BY @@ -285,7 +273,9 @@ GROUP BY c_bpchar, c_text, c_uuid, - c_bytea + c_cidr, + c_inet, + c_macaddr LIMIT 1; -- name: GetPostgresFunctions :one @@ -315,3 +305,34 @@ TRUNCATE TABLE postgres_types; -- name: TruncatePostgresGeoTypes :exec TRUNCATE TABLE postgres_geometric_types; + +-- name: InsertPostgresArrayTypes :exec +INSERT INTO postgres_array_types +( + c_bytea, + c_boolean_array, + c_text_array, + c_integer_array, + c_decimal_array, + c_date_array, + c_timestamp_array +) +VALUES ($1, $2, $3, $4, $5, $6, $7); + +-- name: GetPostgresArrayTypes :one +SELECT * FROM postgres_array_types LIMIT 1; + +-- name: InsertPostgresArrayTypesBatch :copyfrom +INSERT INTO postgres_array_types (c_bytea) VALUES ($1); + +-- name: GetPostgresArrayTypesCnt :one +SELECT + c_bytea, + COUNT(*) AS cnt +FROM postgres_array_types +GROUP BY + c_bytea +LIMIT 1; + +-- name: TruncatePostgresArrayTypes :exec +TRUNCATE TABLE postgres_array_types; \ No newline at end of file diff --git a/examples/config/postgresql/schema.sql b/examples/config/postgresql/schema.sql index 7f7c3890..62b03f38 100644 --- a/examples/config/postgresql/schema.sql +++ b/examples/config/postgresql/schema.sql @@ -46,6 +46,7 @@ CREATE TABLE postgres_types ( c_json_string_override JSON, c_jsonb JSONB, c_jsonpath JSONPATH, + c_xml XML, /* Network Address Data Types */ c_cidr CIDR, @@ -54,16 +55,7 @@ CREATE TABLE postgres_types ( c_macaddr8 MACADDR8, /* Special Data Types */ - c_uuid UUID, - - /* Array Data Types */ - c_bytea BYTEA, - c_boolean_array BOOLEAN [], - c_text_array TEXT [], - c_integer_array INTEGER [], - c_decimal_array DECIMAL(10, 7) [], - c_date_array DATE [], - c_timestamp_array TIMESTAMP [] + c_uuid UUID ); CREATE TABLE postgres_geometric_types ( @@ -75,3 +67,13 @@ CREATE TABLE postgres_geometric_types ( c_polygon POLYGON, c_circle CIRCLE ); + +CREATE TABLE postgres_array_types ( + c_bytea BYTEA, + c_boolean_array BOOLEAN [], + c_text_array TEXT [], + c_integer_array INTEGER [], + c_decimal_array DECIMAL(10, 7) [], + c_date_array DATE [], + c_timestamp_array TIMESTAMP [] +); \ No newline at end of file