diff --git a/Drivers/ColumnMapping.cs b/Drivers/ColumnMapping.cs index 05f51481..8878043c 100644 --- a/Drivers/ColumnMapping.cs +++ b/Drivers/ColumnMapping.cs @@ -1,13 +1,12 @@ -using System; using System.Collections.Generic; namespace SqlcGenCsharp.Drivers; public record DbTypeInfo(int? Length = null, string? NpgsqlTypeOverride = null); -public delegate string ReaderFn(int ordinal); +public delegate string ReaderFn(int ordinal, string dbType); -public delegate string WriterFn(string el, bool notNull, bool isDapper); +public delegate string WriterFn(string el, string dbType, bool notNull, bool isDapper, bool isLegacy); public delegate string ConvertFunc(string el); diff --git a/Drivers/DbDriver.cs b/Drivers/DbDriver.cs index c96fecf6..6a359104 100644 --- a/Drivers/DbDriver.cs +++ b/Drivers/DbDriver.cs @@ -257,8 +257,10 @@ protected bool CopyFromQueryExists() { if (query is null) return null; - return Options.Overrides.FirstOrDefault(o => - o.Column == $"{query.Name}:{column.Name}" || o.Column == $"*:{column.Name}"); + foreach (var overrideOption in Options.Overrides) + if (overrideOption.Column == $"{query.Name}:{column.Name}" || overrideOption.Column == $"*:{column.Name}") + return overrideOption; + return null; } // If the column data type is overridden, we need to check for nulls in generated code @@ -337,29 +339,29 @@ private static bool DoesColumnMappingApply(ColumnMapping columnMapping, Column c if (writerFn is not null) return writerFn; - static string DefaultWriterFn(string el, bool notNull, bool isDapper) => notNull ? el : $"{el} ?? (object)DBNull.Value"; + static string DefaultWriterFn(string el, string dbType, bool notNull, bool isDapper, bool isLegacy) => notNull ? el : $"{el} ?? (object)DBNull.Value"; return Options.UseDapper ? null : DefaultWriterFn; } /* Column reader methods */ - private string GetColumnReader(CsharpTypeOption csharpTypeOption, int ordinal) + private string GetColumnReader(CsharpTypeOption csharpTypeOption, Column column, int ordinal) { if (ColumnMappings.TryGetValue(csharpTypeOption.Type, out var value)) - return value.ReaderFn(ordinal); + return value.ReaderFn(ordinal, column.Type.Name); throw new NotSupportedException($"Could not find column mapping for type override: {csharpTypeOption.Type}"); } public virtual string GetColumnReader(Column column, int ordinal, Query? query) { if (FindOverrideForQueryColumn(query, column) is { CsharpType: var csharpType }) - return GetColumnReader(csharpType, ordinal); + return GetColumnReader(csharpType, column, ordinal); foreach (var columnMapping in ColumnMappings.Values .Where(columnMapping => DoesColumnMappingApply(columnMapping, column))) { if (column.IsArray) - return columnMapping.ReaderArrayFn?.Invoke(ordinal) ?? throw new InvalidOperationException("ReaderArrayFn is null"); - return columnMapping.ReaderFn(ordinal); + return columnMapping.ReaderArrayFn?.Invoke(ordinal, column.Type.Name) ?? throw new InvalidOperationException("ReaderArrayFn is null"); + return columnMapping.ReaderFn(ordinal, column.Type.Name); } throw new NotSupportedException($"column {column.Name} has unsupported column type: {column.Type.Name} in {GetType().Name}"); } diff --git a/Drivers/Generators/CommonGen.cs b/Drivers/Generators/CommonGen.cs index 088be948..71c22265 100644 --- a/Drivers/Generators/CommonGen.cs +++ b/Drivers/Generators/CommonGen.cs @@ -28,7 +28,7 @@ public string AddParametersToCommand(Query query) var notNull = dbDriver.IsColumnNotNull(p.Column, query); var writerFn = dbDriver.GetWriterFn(p.Column, query); - var paramToWrite = writerFn is null ? param : writerFn(param, notNull, dbDriver.Options.UseDapper); + var paramToWrite = writerFn is null ? param : writerFn(param, p.Column.Type.Name, notNull, dbDriver.Options.UseDapper, dbDriver.Options.DotnetFramework.IsDotnetLegacy()); var addParamToCommand = $"""{commandVar}.Parameters.AddWithValue("@{p.Column.Name}", {paramToWrite});"""; return addParamToCommand; }).JoinByNewLine(); @@ -57,7 +57,7 @@ public string ConstructDapperParamsDict(Query query) var notNull = dbDriver.IsColumnNotNull(p.Column, query); var writerFn = dbDriver.GetWriterFn(p.Column, query); - var paramToWrite = writerFn is null ? $"{argsVar}.{param}" : writerFn($"{argsVar}.{param}", notNull, dbDriver.Options.UseDapper); + var paramToWrite = writerFn is null ? $"{argsVar}.{param}" : writerFn($"{argsVar}.{param}", p.Column.Type.Name, notNull, dbDriver.Options.UseDapper, dbDriver.Options.DotnetFramework.IsDotnetLegacy()); var addParamToDict = $"{queryParamsVar}.Add(\"{p.Column.Name}\", {paramToWrite});"; return addParamToDict; }); diff --git a/Drivers/MySqlConnectorDriver.cs b/Drivers/MySqlConnectorDriver.cs index d302333d..2c05cb63 100644 --- a/Drivers/MySqlConnectorDriver.cs +++ b/Drivers/MySqlConnectorDriver.cs @@ -26,7 +26,7 @@ public sealed partial class MySqlConnectorDriver( { { "tinyint", new(Length: 1) } }, - ordinal => $"reader.GetBoolean({ordinal})" + readerFn: (ordinal, _) => $"reader.GetBoolean({ordinal})" ), ["short"] = new( new() @@ -35,7 +35,7 @@ public sealed partial class MySqlConnectorDriver( { "smallint", new() }, { "year", new() } }, - ordinal => $"reader.GetInt16({ordinal})" + readerFn: (ordinal, _) => $"reader.GetInt16({ordinal})" ), ["int"] = new( new() @@ -44,7 +44,7 @@ public sealed partial class MySqlConnectorDriver( { "integer", new() }, { "mediumint", new() } }, - ordinal => $"reader.GetInt32({ordinal})", + readerFn: (ordinal, _) => $"reader.GetInt32({ordinal})", convertFunc: x => $"Convert.ToInt32{x}" ), ["long"] = new( @@ -52,7 +52,7 @@ public sealed partial class MySqlConnectorDriver( { { "bigint", new() } }, - ordinal => $"reader.GetInt64({ordinal})", + readerFn: (ordinal, _) => $"reader.GetInt64({ordinal})", convertFunc: x => $"Convert.ToInt64{x}" ), ["double"] = new( @@ -61,14 +61,14 @@ public sealed partial class MySqlConnectorDriver( { "double", new() }, { "float", new() } }, - ordinal => $"reader.GetDouble({ordinal})" + readerFn: (ordinal, _) => $"reader.GetDouble({ordinal})" ), ["decimal"] = new( new() { { "decimal", new() } }, - ordinal => $"reader.GetDecimal({ordinal})" + readerFn: (ordinal, _) => $"reader.GetDecimal({ordinal})" ), /* Binary data types */ @@ -77,7 +77,7 @@ public sealed partial class MySqlConnectorDriver( { { "bit", new() } }, - ordinal => $"reader.GetFieldValue({ordinal})" + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})" ), ["byte[]"] = new( new() @@ -89,7 +89,7 @@ public sealed partial class MySqlConnectorDriver( { "tinyblob", new() }, { "varbinary", new() } }, - ordinal => $"reader.GetFieldValue({ordinal})" + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})" ), /* String data types */ @@ -104,7 +104,7 @@ public sealed partial class MySqlConnectorDriver( { "varchar", new() }, { "var_string", new() }, }, - ordinal => $"reader.GetString({ordinal})" + readerFn: (ordinal, _) => $"reader.GetString({ordinal})" ), /* Date and time data types */ @@ -115,14 +115,14 @@ public sealed partial class MySqlConnectorDriver( { "datetime", new() }, { "timestamp", new() } }, - readerFn: ordinal => $"reader.GetDateTime({ordinal})" + readerFn: (ordinal, _) => $"reader.GetDateTime({ordinal})" ), ["TimeSpan"] = new( new() { { "time", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})" + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})" ), /* Unstructured data types */ @@ -131,8 +131,8 @@ public sealed partial class MySqlConnectorDriver( { { "json", new() } }, - readerFn: ordinal => $"JsonSerializer.Deserialize(reader.GetString({ordinal}))", - writerFn: (el, notNull, isDapper) => + readerFn: (ordinal, _) => $"JsonSerializer.Deserialize(reader.GetString({ordinal}))", + writerFn: (el, _, notNull, isDapper, isLegacy) => { if (notNull) return $"{el}.GetRawText()"; @@ -150,7 +150,7 @@ public sealed partial class MySqlConnectorDriver( { { "any", new() } }, - ordinal => $"reader.GetValue({ordinal})" + readerFn: (ordinal, _) => $"reader.GetValue({ordinal})" ) }; @@ -621,7 +621,7 @@ private bool IsSetDataType(Column column) return writerFn; if (GetEnumType(column) is { } enumType && IsSetDataType(column, enumType)) - return (el, notNull, isDapper) => + return (el, dbType, notNull, isDapper, isLegacy) => { var stringJoinStmt = $"string.Join(\",\", {el})"; var nullValue = isDapper ? "null" : "(object)DBNull.Value"; @@ -630,7 +630,7 @@ private bool IsSetDataType(Column column) : $"{el} != null ? {stringJoinStmt} : {nullValue}"; }; - static string DefaultWriterFn(string el, bool notNull, bool isDapper) => notNull ? el : $"{el} ?? (object)DBNull.Value"; + static string DefaultWriterFn(string el, string dbType, bool notNull, bool isDapper, bool isLegacy) => notNull ? el : $"{el} ?? (object)DBNull.Value"; return Options.UseDapper ? null : DefaultWriterFn; } diff --git a/Drivers/NpgsqlDriver.cs b/Drivers/NpgsqlDriver.cs index 409d7570..ba01c162 100644 --- a/Drivers/NpgsqlDriver.cs +++ b/Drivers/NpgsqlDriver.cs @@ -1,7 +1,6 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Plugin; using SqlcGenCsharp.Drivers.Generators; -using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; @@ -38,16 +37,16 @@ public NpgsqlDriver( { "bool", new() }, { "boolean", new() } }, - readerFn: ordinal => $"reader.GetBoolean({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + 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})", + readerFn: (ordinal, _) => $"reader.GetInt16({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", convertFunc: x => $"Convert.ToInt16({x})" ), ["int"] = new( @@ -58,8 +57,8 @@ public NpgsqlDriver( { "int4", new() }, { "serial", new() } }, - readerFn: ordinal => $"reader.GetInt32({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetInt32({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", convertFunc: x => $"Convert.ToInt32({x})" ), ["long"] = new( @@ -69,8 +68,8 @@ public NpgsqlDriver( { "bigint", new() }, { "bigserial", new() } }, - readerFn: ordinal => $"reader.GetInt64({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetInt64({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", convertFunc: x => $"Convert.ToInt64({x})" ), ["float"] = new( @@ -79,8 +78,8 @@ public NpgsqlDriver( { "float4", new() }, { "real", new() } }, - readerFn: ordinal => $"reader.GetFloat({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + readerFn: (ordinal, _) => $"reader.GetFloat({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})" ), ["decimal"] = new( new() @@ -89,16 +88,16 @@ public NpgsqlDriver( { "decimal", new() }, { "money", new(NpgsqlTypeOverride: "NpgsqlDbType.Money") } }, - readerFn: ordinal => $"reader.GetDecimal({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + 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})" + readerFn: (ordinal, _) => $"reader.GetDouble({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})" ), /* String data types */ @@ -114,8 +113,8 @@ public NpgsqlDriver( { "jsonpath", new() }, { "macaddr8", new() } }, - readerFn: ordinal => $"reader.GetString({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + readerFn: (ordinal, _) => $"reader.GetString({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})" ), /* Date and time data types */ @@ -125,8 +124,8 @@ public NpgsqlDriver( { "time", new(NpgsqlTypeOverride: "NpgsqlDbType.Time") }, { "interval", new(NpgsqlTypeOverride: "NpgsqlDbType.Interval") } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})" ), ["DateTime"] = new( new() @@ -135,8 +134,8 @@ public NpgsqlDriver( { "timestamp", new() }, { "timestamptz", new() } }, - readerFn: ordinal => $"reader.GetDateTime({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + readerFn: (ordinal, _) => $"reader.GetDateTime({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})" ), /* Unstructured data types */ @@ -146,8 +145,8 @@ public NpgsqlDriver( { "json", new(NpgsqlTypeOverride: "NpgsqlDbType.Json") }, { "jsonb", new(NpgsqlTypeOverride: "NpgsqlDbType.Jsonb") } }, - readerFn: ordinal => $"JsonSerializer.Deserialize(reader.GetString({ordinal}))", - writerFn: (el, notNull, isDapper) => + readerFn: (ordinal, _) => $"JsonSerializer.Deserialize(reader.GetString({ordinal}))", + writerFn: (el, _, notNull, isDapper, isLegacy) => { if (notNull) return $"{el}"; @@ -163,7 +162,7 @@ public NpgsqlDriver( { { "xml", new(NpgsqlTypeOverride: "NpgsqlDbType.Xml") } }, - readerFn: ordinal => $$""" + readerFn: (ordinal, dbType) => $$""" (new Func((r, o) => { var xmlDoc = new XmlDocument(); @@ -171,7 +170,7 @@ public NpgsqlDriver( return xmlDoc; }))({{Variable.Reader.AsVarName()}}, {{ordinal}}) """, - writerFn: (el, notNull, isDapper) => + writerFn: (el, dbType, notNull, isDapper, isLegacy) => { if (notNull) return $"{el}.OuterXml"; @@ -189,8 +188,8 @@ public NpgsqlDriver( { { "point", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", usingDirective: "NpgsqlTypes", sqlMapper: "SqlMapper.AddTypeHandler(typeof(NpgsqlPoint), new NpgsqlTypeHandler());" ), @@ -199,8 +198,8 @@ public NpgsqlDriver( { { "line", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", usingDirective: "NpgsqlTypes", sqlMapper: "SqlMapper.AddTypeHandler(typeof(NpgsqlLine), new NpgsqlTypeHandler());" ), @@ -209,8 +208,8 @@ public NpgsqlDriver( { { "lseg", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", usingDirective: "NpgsqlTypes", sqlMapper: "SqlMapper.AddTypeHandler(typeof(NpgsqlLSeg), new NpgsqlTypeHandler());" ), @@ -219,8 +218,8 @@ public NpgsqlDriver( { { "box", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", usingDirective: "NpgsqlTypes", sqlMapper: "SqlMapper.AddTypeHandler(typeof(NpgsqlBox), new NpgsqlTypeHandler());" ), @@ -229,8 +228,8 @@ public NpgsqlDriver( { { "path", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", usingDirective: "NpgsqlTypes", sqlMapper: "SqlMapper.AddTypeHandler(typeof(NpgsqlPath), new NpgsqlTypeHandler());" ), @@ -239,8 +238,8 @@ public NpgsqlDriver( { { "polygon", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", usingDirective: "NpgsqlTypes", sqlMapper: "SqlMapper.AddTypeHandler(typeof(NpgsqlPolygon), new NpgsqlTypeHandler());" ), @@ -249,8 +248,8 @@ public NpgsqlDriver( { { "circle", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", usingDirective: "NpgsqlTypes", sqlMapper: "SqlMapper.AddTypeHandler(typeof(NpgsqlCircle), new NpgsqlTypeHandler());" ), @@ -261,8 +260,8 @@ public NpgsqlDriver( { { "cidr", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", usingDirective: "NpgsqlTypes", sqlMapper: "SqlMapper.AddTypeHandler(typeof(NpgsqlCidr), new NpgsqlTypeHandler());" ), @@ -271,8 +270,8 @@ public NpgsqlDriver( { { "inet", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", usingDirective: "System.Net", sqlMapper: "SqlMapper.AddTypeHandler(typeof(IPAddress), new NpgsqlTypeHandler());" ), @@ -281,8 +280,8 @@ public NpgsqlDriver( { { "macaddr", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", usingDirective: "System.Net.NetworkInformation", sqlMapper: "SqlMapper.AddTypeHandler(typeof(PhysicalAddress), new NpgsqlTypeHandler());" ), @@ -293,8 +292,8 @@ public NpgsqlDriver( { { "tsquery", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", usingDirective: "NpgsqlTypes", sqlMapper: "SqlMapper.AddTypeHandler(typeof(NpgsqlTsQuery), new NpgsqlTypeHandler());" ), @@ -303,8 +302,8 @@ public NpgsqlDriver( { { "tsvector", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", usingDirective: "NpgsqlTypes", sqlMapper: "SqlMapper.AddTypeHandler(typeof(NpgsqlTsVector), new NpgsqlTypeHandler());" ), @@ -315,8 +314,8 @@ public NpgsqlDriver( { { "uuid", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})", + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", convertFunc: x => $"Guid.Parse({x}?.ToString())" ), ["byte[]"] = new( @@ -331,15 +330,15 @@ public NpgsqlDriver( { "tinyblob", new() }, { "varbinary", new() } }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})", - readerArrayFn: ordinal => $"reader.GetFieldValue({ordinal})" + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})", + readerArrayFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})" ), ["object"] = new( new() { { "anyarray", new() } }, - ordinal => $"reader.GetValue({ordinal})" + readerFn: (ordinal, _) => $"reader.GetValue({ordinal})" ) }; @@ -580,7 +579,7 @@ string AddRowsToCopyCommand() var typeOverride = GetColumnDbTypeOverride(p.Column); var param = $"{rowVar}.{p.Column.Name.ToPascalCase()}"; var writerFn = GetWriterFn(p.Column, query); - var paramToWrite = writerFn is null ? param : writerFn(param, p.Column.NotNull, false); + var paramToWrite = writerFn is null ? param : writerFn(param, p.Column.Type.Name, p.Column.NotNull, false, !Options.DotnetFramework.IsDotnetLegacy()); var partialStmt = $"await {writerVar}.WriteAsync({paramToWrite}"; return typeOverride is null ? $"{partialStmt});" @@ -606,7 +605,7 @@ string AddRowsToCopyCommand() if (GetEnumType(column) is not null) { - return (el, notNull, isDapper) => + return (el, dbType, notNull, isDapper, isLegacy) => { var nullValue = isDapper ? "null" : "(object)DBNull.Value"; return notNull @@ -615,7 +614,7 @@ string AddRowsToCopyCommand() }; } - static string DefaultWriterFn(string el, bool notNull, bool isDapper) => notNull ? el : $"{el} ?? (object)DBNull.Value"; + static string DefaultWriterFn(string el, string dbType, bool notNull, bool isDapper, bool isLegacy) => notNull ? el : $"{el} ?? (object)DBNull.Value"; return Options.UseDapper ? null : DefaultWriterFn; } diff --git a/Drivers/SqliteDriver.cs b/Drivers/SqliteDriver.cs index 9997a8e1..70c4b6fd 100644 --- a/Drivers/SqliteDriver.cs +++ b/Drivers/SqliteDriver.cs @@ -1,6 +1,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using Plugin; using SqlcGenCsharp.Drivers.Generators; +using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; @@ -14,6 +15,10 @@ public sealed partial class SqliteDriver( IList queries) : DbDriver(options, catalog, queries), IOne, IMany, IExec, IExecRows, IExecLastId, ICopyFrom { + private static readonly HashSet IntegerDbTypes = ["integer", "integernotnulldefaultunixepoch"]; + + private const string DateTimeStringFormat = "yyyy-MM-dd HH:mm:ss"; // Default format for DateTime strings - TODO make configurable via Options + protected override Dictionary ColumnMappings { get; } = new() { @@ -22,14 +27,14 @@ public sealed partial class SqliteDriver( { {"blob", new()} }, - ordinal => $"reader.GetFieldValue({ordinal})" + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})" ), ["string"] = new( new() { {"text", new()} }, - ordinal => $"reader.GetString({ordinal})" + readerFn: (ordinal, _) => $"reader.GetString({ordinal})" ), ["int"] = new( new() @@ -37,7 +42,7 @@ public sealed partial class SqliteDriver( { "integer", new() }, { "integernotnulldefaultunixepoch", new() } }, - ordinal => $"reader.GetInt32({ordinal})", + readerFn: (ordinal, _) => $"reader.GetInt32({ordinal})", convertFunc: x => $"Convert.ToInt32({x})" ), ["decimal"] = new( @@ -45,14 +50,31 @@ public sealed partial class SqliteDriver( { {"real", new()} }, - ordinal => $"reader.GetDecimal({ordinal})" + readerFn: (ordinal, _) => $"reader.GetDecimal({ordinal})" + ), + ["DateTime"] = new( + [], + readerFn: (ordinal, dbType) => + { + if (IntegerDbTypes.Contains(dbType)) + return $"DateTime.UnixEpoch.AddSeconds(reader.GetInt32({ordinal}))"; + return $"DateTime.Parse(reader.GetString({ordinal}))"; + }, + writerFn: (el, dbType, notNull, isDapper, isLegacy) => + { + var nullValue = isDapper ? "null" : "(object)DBNull.Value"; + var elWithOptionalNull = notNull ? el : $"{el}.Value"; + if (IntegerDbTypes.Contains(dbType.ToLower())) + return $"{el} != null ? (int?) new DateTimeOffset({elWithOptionalNull}.ToUniversalTime()).ToUnixTimeSeconds() : {nullValue}"; + return $"{el} != null ? {elWithOptionalNull}.ToString(\"{DateTimeStringFormat}\") : {nullValue}"; + } ), ["object"] = new( new() { { "any", new() } }, - ordinal => $"reader.GetValue({ordinal})" + readerFn: (ordinal, _) => $"reader.GetValue({ordinal})" ) }; diff --git a/PluginOptions/DotnetFramework.cs b/PluginOptions/DotnetFramework.cs index 5dd3e790..df75a5f1 100644 --- a/PluginOptions/DotnetFramework.cs +++ b/PluginOptions/DotnetFramework.cs @@ -35,4 +35,9 @@ public static bool IsDotnetCore(this DotnetFramework me) { return me == DotnetFramework.Dotnet80; } + + public static bool IsDotnetLegacy(this DotnetFramework me) + { + return !IsDotnetCore(me); + } } \ No newline at end of file diff --git a/docs/06_Sqlite.md b/docs/06_Sqlite.md index 8d027c73..959d6441 100644 --- a/docs/06_Sqlite.md +++ b/docs/06_Sqlite.md @@ -34,5 +34,16 @@ INSERT INTO tab1 (field1, field2) VALUES | text | ✅ | | blob | ✅ | +## Useful Overrides +It's possible to use the override data type functionality of the plugin thus overcoming the limited +amount of data types that are supported by SQLite. The supported overrides are specified below: + +| DB Type | C# Type Override | Supported? | Description | +|---------|------------------|------------|------------------------------------------------------------------| +| integer | DateTime | ✅ | Unix Epoch - seconds since 1-1-1970 | +| text | DateTime | ✅ | String representation of the datetime in a configurable format | +| integer | bool | ❌ | If x equals 0 -> False, otherwise -> True | +| text | bool | ❌ | Converts string to a boolean value using Convert.ToBoolean rules | + diff --git a/end2end/EndToEndScaffold/Templates/SqliteTests.cs b/end2end/EndToEndScaffold/Templates/SqliteTests.cs index ae627b5e..fa133a5b 100644 --- a/end2end/EndToEndScaffold/Templates/SqliteTests.cs +++ b/end2end/EndToEndScaffold/Templates/SqliteTests.cs @@ -10,21 +10,27 @@ public static class SqliteTests { Impl = $$""" [Test] - [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 })] - [TestCase(null, null, null, new byte[] { })] - [TestCase(null, null, null, null)] + [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, "2020-01-01 14:15:16", "2025-01-01 17:18:19")] + [TestCase(null, null, null, new byte[] { }, null, null)] + [TestCase(null, null, null, null, null, null)] public async Task TestSqliteTypes( int? cInteger, decimal? cReal, string cText, - byte[] cBlob) + byte[] cBlob, + DateTime cTextDatetimeOverride, + DateTime? cIntegerDatetimeOverride) { + if (cIntegerDatetimeOverride.HasValue && cIntegerDatetimeOverride.Value.Kind != DateTimeKind.Utc) + cIntegerDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride, DateTimeKind.Utc); await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, - CBlob = cBlob + CBlob = cBlob, + CTextDatetimeOverride = cTextDatetimeOverride, + CIntegerDatetimeOverride = cIntegerDatetimeOverride }); var expected = new QuerySql.GetSqliteTypesRow @@ -32,7 +38,9 @@ await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs CInteger = cInteger, CReal = cReal, CText = cText, - CBlob = cBlob + CBlob = cBlob, + CTextDatetimeOverride = cTextDatetimeOverride, + CIntegerDatetimeOverride = cIntegerDatetimeOverride }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); @@ -43,6 +51,24 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR Assert.That(x.CReal, Is.EqualTo(y.CReal)); Assert.That(x.CText, Is.EqualTo(y.CText)); Assert.That(x.CBlob, Is.EqualTo(y.CBlob)); + AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); + AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); + } + + void AssertDateTimeEquals(DateTime? x, DateTime? y) + { + Assert.That(x.HasValue, Is.EqualTo(y.HasValue)); + if (!x.HasValue) + return; + + var xv = x.Value; + var yv = y.Value; + Assert.That(xv.Year, Is.EqualTo(yv.Year)); + Assert.That(xv.Month, Is.EqualTo(yv.Month)); + Assert.That(xv.Day, Is.EqualTo(yv.Day)); + Assert.That(xv.Hour, Is.EqualTo(yv.Hour)); + Assert.That(xv.Minute, Is.EqualTo(yv.Minute)); + Assert.That(xv.Second, Is.EqualTo(yv.Second)); } } """ diff --git a/end2end/EndToEndTests/SqliteDapperTester.generated.cs b/end2end/EndToEndTests/SqliteDapperTester.generated.cs index a42aa61b..61967536 100644 --- a/end2end/EndToEndTests/SqliteDapperTester.generated.cs +++ b/end2end/EndToEndTests/SqliteDapperTester.generated.cs @@ -328,18 +328,22 @@ void AssertSingularEquals(QuerySql.GetAuthorByNamePatternRow x, QuerySql.GetAuth } [Test] - [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 })] - [TestCase(null, null, null, new byte[] { })] - [TestCase(null, null, null, null)] - public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob) + [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, "2020-01-01 14:15:16", "2025-01-01 17:18:19")] + [TestCase(null, null, null, new byte[] { }, null, null)] + [TestCase(null, null, null, null, null, null)] + public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, DateTime cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride) { - await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob }); + if (cIntegerDatetimeOverride.HasValue && cIntegerDatetimeOverride.Value.Kind != DateTimeKind.Utc) + cIntegerDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride, DateTimeKind.Utc); + await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }); var expected = new QuerySql.GetSqliteTypesRow { CInteger = cInteger, CReal = cReal, CText = cText, - CBlob = cBlob + CBlob = cBlob, + CTextDatetimeOverride = cTextDatetimeOverride, + CIntegerDatetimeOverride = cIntegerDatetimeOverride }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual); @@ -349,6 +353,23 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR Assert.That(x.CReal, Is.EqualTo(y.CReal)); Assert.That(x.CText, Is.EqualTo(y.CText)); Assert.That(x.CBlob, Is.EqualTo(y.CBlob)); + AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); + AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); + } + + void AssertDateTimeEquals(DateTime? x, DateTime? y) + { + Assert.That(x.HasValue, Is.EqualTo(y.HasValue)); + if (!x.HasValue) + return; + var xv = x.Value; + var yv = y.Value; + Assert.That(xv.Year, Is.EqualTo(yv.Year)); + Assert.That(xv.Month, Is.EqualTo(yv.Month)); + Assert.That(xv.Day, Is.EqualTo(yv.Day)); + Assert.That(xv.Hour, Is.EqualTo(yv.Hour)); + Assert.That(xv.Minute, Is.EqualTo(yv.Minute)); + Assert.That(xv.Second, Is.EqualTo(yv.Second)); } } diff --git a/end2end/EndToEndTests/SqliteTester.generated.cs b/end2end/EndToEndTests/SqliteTester.generated.cs index 61f62be7..17aec6f6 100644 --- a/end2end/EndToEndTests/SqliteTester.generated.cs +++ b/end2end/EndToEndTests/SqliteTester.generated.cs @@ -328,18 +328,22 @@ void AssertSingularEquals(QuerySql.GetAuthorByNamePatternRow x, QuerySql.GetAuth } [Test] - [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 })] - [TestCase(null, null, null, new byte[] { })] - [TestCase(null, null, null, null)] - public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob) + [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, "2020-01-01 14:15:16", "2025-01-01 17:18:19")] + [TestCase(null, null, null, new byte[] { }, null, null)] + [TestCase(null, null, null, null, null, null)] + public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, DateTime cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride) { - await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob }); + if (cIntegerDatetimeOverride.HasValue && cIntegerDatetimeOverride.Value.Kind != DateTimeKind.Utc) + cIntegerDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride, DateTimeKind.Utc); + await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }); var expected = new QuerySql.GetSqliteTypesRow { CInteger = cInteger, CReal = cReal, CText = cText, - CBlob = cBlob + CBlob = cBlob, + CTextDatetimeOverride = cTextDatetimeOverride, + CIntegerDatetimeOverride = cIntegerDatetimeOverride }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual.Value); @@ -349,6 +353,23 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR Assert.That(x.CReal, Is.EqualTo(y.CReal)); Assert.That(x.CText, Is.EqualTo(y.CText)); Assert.That(x.CBlob, Is.EqualTo(y.CBlob)); + AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); + AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); + } + + void AssertDateTimeEquals(DateTime? x, DateTime? y) + { + Assert.That(x.HasValue, Is.EqualTo(y.HasValue)); + if (!x.HasValue) + return; + var xv = x.Value; + var yv = y.Value; + Assert.That(xv.Year, Is.EqualTo(yv.Year)); + Assert.That(xv.Month, Is.EqualTo(yv.Month)); + Assert.That(xv.Day, Is.EqualTo(yv.Day)); + Assert.That(xv.Hour, Is.EqualTo(yv.Hour)); + Assert.That(xv.Minute, Is.EqualTo(yv.Minute)); + Assert.That(xv.Second, Is.EqualTo(yv.Second)); } } diff --git a/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs b/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs index b71db001..586de9df 100644 --- a/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs @@ -328,18 +328,22 @@ void AssertSingularEquals(QuerySql.GetAuthorByNamePatternRow x, QuerySql.GetAuth } [Test] - [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 })] - [TestCase(null, null, null, new byte[] { })] - [TestCase(null, null, null, null)] - public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob) + [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, "2020-01-01 14:15:16", "2025-01-01 17:18:19")] + [TestCase(null, null, null, new byte[] { }, null, null)] + [TestCase(null, null, null, null, null, null)] + public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, DateTime cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride) { - await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob }); + if (cIntegerDatetimeOverride.HasValue && cIntegerDatetimeOverride.Value.Kind != DateTimeKind.Utc) + cIntegerDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride, DateTimeKind.Utc); + await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }); var expected = new QuerySql.GetSqliteTypesRow { CInteger = cInteger, CReal = cReal, CText = cText, - CBlob = cBlob + CBlob = cBlob, + CTextDatetimeOverride = cTextDatetimeOverride, + CIntegerDatetimeOverride = cIntegerDatetimeOverride }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual); @@ -349,6 +353,23 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR Assert.That(x.CReal, Is.EqualTo(y.CReal)); Assert.That(x.CText, Is.EqualTo(y.CText)); Assert.That(x.CBlob, Is.EqualTo(y.CBlob)); + AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); + AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); + } + + void AssertDateTimeEquals(DateTime? x, DateTime? y) + { + Assert.That(x.HasValue, Is.EqualTo(y.HasValue)); + if (!x.HasValue) + return; + var xv = x.Value; + var yv = y.Value; + Assert.That(xv.Year, Is.EqualTo(yv.Year)); + Assert.That(xv.Month, Is.EqualTo(yv.Month)); + Assert.That(xv.Day, Is.EqualTo(yv.Day)); + Assert.That(xv.Hour, Is.EqualTo(yv.Hour)); + Assert.That(xv.Minute, Is.EqualTo(yv.Minute)); + Assert.That(xv.Second, Is.EqualTo(yv.Second)); } } diff --git a/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs b/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs index 2e434715..0a16b355 100644 --- a/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs @@ -328,18 +328,22 @@ void AssertSingularEquals(QuerySql.GetAuthorByNamePatternRow x, QuerySql.GetAuth } [Test] - [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 })] - [TestCase(null, null, null, new byte[] { })] - [TestCase(null, null, null, null)] - public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob) + [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, "2020-01-01 14:15:16", "2025-01-01 17:18:19")] + [TestCase(null, null, null, new byte[] { }, null, null)] + [TestCase(null, null, null, null, null, null)] + public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, DateTime cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride) { - await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob }); + if (cIntegerDatetimeOverride.HasValue && cIntegerDatetimeOverride.Value.Kind != DateTimeKind.Utc) + cIntegerDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride, DateTimeKind.Utc); + await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }); var expected = new QuerySql.GetSqliteTypesRow { CInteger = cInteger, CReal = cReal, CText = cText, - CBlob = cBlob + CBlob = cBlob, + CTextDatetimeOverride = cTextDatetimeOverride, + CIntegerDatetimeOverride = cIntegerDatetimeOverride }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual); @@ -349,6 +353,23 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR Assert.That(x.CReal, Is.EqualTo(y.CReal)); Assert.That(x.CText, Is.EqualTo(y.CText)); Assert.That(x.CBlob, Is.EqualTo(y.CBlob)); + AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); + AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); + } + + void AssertDateTimeEquals(DateTime? x, DateTime? y) + { + Assert.That(x.HasValue, Is.EqualTo(y.HasValue)); + if (!x.HasValue) + return; + var xv = x.Value; + var yv = y.Value; + Assert.That(xv.Year, Is.EqualTo(yv.Year)); + Assert.That(xv.Month, Is.EqualTo(yv.Month)); + Assert.That(xv.Day, Is.EqualTo(yv.Day)); + Assert.That(xv.Hour, Is.EqualTo(yv.Hour)); + Assert.That(xv.Minute, Is.EqualTo(yv.Minute)); + Assert.That(xv.Second, Is.EqualTo(yv.Second)); } } diff --git a/examples/SqliteDapperExample/Models.cs b/examples/SqliteDapperExample/Models.cs index 8518a279..13186668 100644 --- a/examples/SqliteDapperExample/Models.cs +++ b/examples/SqliteDapperExample/Models.cs @@ -21,4 +21,6 @@ public class TypesSqlite public decimal? CReal { get; init; } public string? CText { get; init; } public byte[]? CBlob { get; init; } + public string? CTextDatetimeOverride { get; init; } + public int? CIntegerDatetimeOverride { get; init; } }; \ No newline at end of file diff --git a/examples/SqliteDapperExample/QuerySql.cs b/examples/SqliteDapperExample/QuerySql.cs index bcaeb84b..fea7c104 100644 --- a/examples/SqliteDapperExample/QuerySql.cs +++ b/examples/SqliteDapperExample/QuerySql.cs @@ -521,13 +521,15 @@ public async Task DeleteAllAuthors() await this.Transaction.Connection.ExecuteAsync(DeleteAllAuthorsSql, transaction: this.Transaction); } - private const string InsertSqliteTypesSql = "INSERT INTO types_sqlite (c_integer, c_real, c_text, c_blob) VALUES (@c_integer, @c_real, @c_text, @c_blob)"; + private const string InsertSqliteTypesSql = "INSERT INTO types_sqlite ( c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override ) VALUES (@c_integer, @c_real, @c_text, @c_blob, @c_text_datetime_override, @c_integer_datetime_override)"; public class InsertSqliteTypesArgs { public int? CInteger { get; init; } public decimal? CReal { get; init; } public string? CText { get; init; } public byte[]? CBlob { get; init; } + public DateTime? CTextDatetimeOverride { get; init; } + public DateTime? CIntegerDatetimeOverride { get; init; } }; public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) { @@ -536,6 +538,8 @@ public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) queryParams.Add("c_real", args.CReal); queryParams.Add("c_text", args.CText); queryParams.Add("c_blob", args.CBlob); + queryParams.Add("c_text_datetime_override", args.CTextDatetimeOverride != null ? args.CTextDatetimeOverride.Value.ToString("yyyy-MM-dd HH:mm:ss") : null); + queryParams.Add("c_integer_datetime_override", args.CIntegerDatetimeOverride != null ? (int? )new DateTimeOffset(args.CIntegerDatetimeOverride.Value.ToUniversalTime()).ToUnixTimeSeconds() : null); if (this.Transaction == null) { using (var connection = new SqliteConnection(ConnectionString)) @@ -575,13 +579,15 @@ public async Task InsertSqliteTypesBatch(List args) } } - private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1"; + private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, c_text_datetime_override, datetime(c_integer_datetime_override, 'unixepoch') AS c_integer_datetime_override FROM types_sqlite LIMIT 1"; public class GetSqliteTypesRow { public int? CInteger { get; init; } public decimal? CReal { get; init; } public string? CText { get; init; } public byte[]? CBlob { get; init; } + public DateTime? CTextDatetimeOverride { get; init; } + public DateTime? CIntegerDatetimeOverride { get; init; } }; public async Task GetSqliteTypes() { @@ -599,7 +605,7 @@ public class GetSqliteTypesRow return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetSqliteTypesSql, transaction: this.Transaction); } - private const string GetSqliteTypesCntSql = "SELECT c_integer, c_real, c_text, c_blob, COUNT(*) AS cnt FROM types_sqlite GROUP BY c_integer, c_real, c_text, c_blob LIMIT 1"; + private const string GetSqliteTypesCntSql = "SELECT c_integer, c_real, c_text, c_blob, count(*) AS cnt FROM types_sqlite GROUP BY c_integer, c_real, c_text, c_blob LIMIT 1"; public class GetSqliteTypesCntRow { public int? CInteger { get; init; } @@ -624,7 +630,7 @@ public class GetSqliteTypesCntRow return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetSqliteTypesCntSql, transaction: this.Transaction); } - private const string GetSqliteFunctionsSql = "SELECT MAX(c_integer) AS max_integer, MAX(c_real) AS max_real, MAX(c_text) AS max_text FROM types_sqlite"; + private const string GetSqliteFunctionsSql = "SELECT max(c_integer) AS max_integer, max(c_real) AS max_real, max(c_text) AS max_text FROM types_sqlite"; public class GetSqliteFunctionsRow { public int? MaxInteger { get; init; } diff --git a/examples/SqliteDapperExample/request.json b/examples/SqliteDapperExample/request.json index 00fc2790..c6a11107 100644 --- a/examples/SqliteDapperExample/request.json +++ b/examples/SqliteDapperExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteDapperExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwidXNlRGFwcGVyIjp0cnVlfQ==", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwidXNlRGFwcGVyIjp0cnVlfQ==", "process": { "cmd": "./dist/LocalRunner" } @@ -158,6 +158,26 @@ "type": { "name": "BLOB" } + }, + { + "name": "c_text_datetime_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + } + }, + { + "name": "c_integer_datetime_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + } } ] } @@ -968,7 +988,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO types_sqlite \n(c_integer, c_real, c_text, c_blob) \nVALUES (?, ?, ?, ?)", + "text": "INSERT INTO types_sqlite \n(\n c_integer,\n c_real,\n c_text,\n c_blob,\n c_text_datetime_override,\n c_integer_datetime_override\n) \nVALUES (?, ?, ?, ?, ?, ?)", "name": "InsertSqliteTypes", "cmd": ":exec", "parameters": [ @@ -1031,6 +1051,36 @@ }, "originalName": "c_blob" } + }, + { + "number": 5, + "column": { + "name": "c_text_datetime_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_datetime_override" + } + }, + { + "number": 6, + "column": { + "name": "c_integer_datetime_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "c_integer_datetime_override" + } } ], "filename": "query.sql", @@ -1095,7 +1145,7 @@ } }, { - "text": "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n c_text_datetime_override,\n datetime(c_integer_datetime_override, 'unixepoch')\n AS c_integer_datetime_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1142,12 +1192,31 @@ "name": "BLOB" }, "originalName": "c_blob" + }, + { + "name": "c_text_datetime_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_datetime_override" + }, + { + "name": "c_integer_datetime_override", + "length": -1, + "isFuncCall": true, + "type": { + "name": "any" + } } ], "filename": "query.sql" }, { - "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n COUNT(*) AS cnt\nFROM types_sqlite\nGROUP BY c_integer, c_real, c_text, c_blob\nLIMIT 1", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n count(*) AS cnt\nFROM types_sqlite\nGROUP BY c_integer, c_real, c_text, c_blob\nLIMIT 1", "name": "GetSqliteTypesCnt", "cmd": ":one", "columns": [ @@ -1208,7 +1277,7 @@ "filename": "query.sql" }, { - "text": "SELECT\n MAX(c_integer) AS max_integer,\n MAX(c_real) AS max_real,\n MAX(c_text) AS max_text\nFROM types_sqlite", + "text": "SELECT\n max(c_integer) AS max_integer,\n max(c_real) AS max_real,\n max(c_text) AS max_text\nFROM types_sqlite", "name": "GetSqliteFunctions", "cmd": ":one", "columns": [ @@ -1247,5 +1316,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZURhcHBlckV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOnRydWUsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZURhcHBlckV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOnRydWUsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" } \ No newline at end of file diff --git a/examples/SqliteDapperExample/request.message b/examples/SqliteDapperExample/request.message index d14c5beb..6bfed14c 100644 Binary files a/examples/SqliteDapperExample/request.message and b/examples/SqliteDapperExample/request.message differ diff --git a/examples/SqliteDapperLegacyExample/Models.cs b/examples/SqliteDapperLegacyExample/Models.cs index ae820a09..ab4efc16 100644 --- a/examples/SqliteDapperLegacyExample/Models.cs +++ b/examples/SqliteDapperLegacyExample/Models.cs @@ -22,5 +22,7 @@ public class TypesSqlite public decimal? CReal { get; set; } public string CText { get; set; } public byte[] CBlob { get; set; } + public string CTextDatetimeOverride { get; set; } + public int? CIntegerDatetimeOverride { get; set; } }; } \ No newline at end of file diff --git a/examples/SqliteDapperLegacyExample/QuerySql.cs b/examples/SqliteDapperLegacyExample/QuerySql.cs index 9a3db218..49c65897 100644 --- a/examples/SqliteDapperLegacyExample/QuerySql.cs +++ b/examples/SqliteDapperLegacyExample/QuerySql.cs @@ -522,13 +522,15 @@ public async Task DeleteAllAuthors() await this.Transaction.Connection.ExecuteAsync(DeleteAllAuthorsSql, transaction: this.Transaction); } - private const string InsertSqliteTypesSql = "INSERT INTO types_sqlite (c_integer, c_real, c_text, c_blob) VALUES (@c_integer, @c_real, @c_text, @c_blob)"; + private const string InsertSqliteTypesSql = "INSERT INTO types_sqlite ( c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override ) VALUES (@c_integer, @c_real, @c_text, @c_blob, @c_text_datetime_override, @c_integer_datetime_override)"; public class InsertSqliteTypesArgs { public int? CInteger { get; set; } public decimal? CReal { get; set; } public string CText { get; set; } public byte[] CBlob { get; set; } + public DateTime? CTextDatetimeOverride { get; set; } + public DateTime? CIntegerDatetimeOverride { get; set; } }; public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) { @@ -537,6 +539,8 @@ public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) queryParams.Add("c_real", args.CReal); queryParams.Add("c_text", args.CText); queryParams.Add("c_blob", args.CBlob); + queryParams.Add("c_text_datetime_override", args.CTextDatetimeOverride != null ? args.CTextDatetimeOverride.Value.ToString("yyyy-MM-dd HH:mm:ss") : null); + queryParams.Add("c_integer_datetime_override", args.CIntegerDatetimeOverride != null ? (int? )new DateTimeOffset(args.CIntegerDatetimeOverride.Value.ToUniversalTime()).ToUnixTimeSeconds() : null); if (this.Transaction == null) { using (var connection = new SqliteConnection(ConnectionString)) @@ -576,13 +580,15 @@ public async Task InsertSqliteTypesBatch(List args) } } - private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1"; + private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, c_text_datetime_override, datetime(c_integer_datetime_override, 'unixepoch') AS c_integer_datetime_override FROM types_sqlite LIMIT 1"; public class GetSqliteTypesRow { public int? CInteger { get; set; } public decimal? CReal { get; set; } public string CText { get; set; } public byte[] CBlob { get; set; } + public DateTime? CTextDatetimeOverride { get; set; } + public DateTime? CIntegerDatetimeOverride { get; set; } }; public async Task GetSqliteTypes() { @@ -600,7 +606,7 @@ public async Task GetSqliteTypes() return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetSqliteTypesSql, transaction: this.Transaction); } - private const string GetSqliteTypesCntSql = "SELECT c_integer, c_real, c_text, c_blob, COUNT(*) AS cnt FROM types_sqlite GROUP BY c_integer, c_real, c_text, c_blob LIMIT 1"; + private const string GetSqliteTypesCntSql = "SELECT c_integer, c_real, c_text, c_blob, count(*) AS cnt FROM types_sqlite GROUP BY c_integer, c_real, c_text, c_blob LIMIT 1"; public class GetSqliteTypesCntRow { public int? CInteger { get; set; } @@ -625,7 +631,7 @@ public async Task GetSqliteTypesCnt() return await this.Transaction.Connection.QueryFirstOrDefaultAsync(GetSqliteTypesCntSql, transaction: this.Transaction); } - private const string GetSqliteFunctionsSql = "SELECT MAX(c_integer) AS max_integer, MAX(c_real) AS max_real, MAX(c_text) AS max_text FROM types_sqlite"; + private const string GetSqliteFunctionsSql = "SELECT max(c_integer) AS max_integer, max(c_real) AS max_real, max(c_text) AS max_text FROM types_sqlite"; public class GetSqliteFunctionsRow { public int? MaxInteger { get; set; } diff --git a/examples/SqliteDapperLegacyExample/request.json b/examples/SqliteDapperLegacyExample/request.json index a005622b..228b58df 100644 --- a/examples/SqliteDapperLegacyExample/request.json +++ b/examples/SqliteDapperLegacyExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteDapperLegacyExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJ1c2VEYXBwZXIiOnRydWV9", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJ1c2VEYXBwZXIiOnRydWV9", "process": { "cmd": "./dist/LocalRunner" } @@ -158,6 +158,26 @@ "type": { "name": "BLOB" } + }, + { + "name": "c_text_datetime_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + } + }, + { + "name": "c_integer_datetime_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + } } ] } @@ -968,7 +988,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO types_sqlite \n(c_integer, c_real, c_text, c_blob) \nVALUES (?, ?, ?, ?)", + "text": "INSERT INTO types_sqlite \n(\n c_integer,\n c_real,\n c_text,\n c_blob,\n c_text_datetime_override,\n c_integer_datetime_override\n) \nVALUES (?, ?, ?, ?, ?, ?)", "name": "InsertSqliteTypes", "cmd": ":exec", "parameters": [ @@ -1031,6 +1051,36 @@ }, "originalName": "c_blob" } + }, + { + "number": 5, + "column": { + "name": "c_text_datetime_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_datetime_override" + } + }, + { + "number": 6, + "column": { + "name": "c_integer_datetime_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "c_integer_datetime_override" + } } ], "filename": "query.sql", @@ -1095,7 +1145,7 @@ } }, { - "text": "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n c_text_datetime_override,\n datetime(c_integer_datetime_override, 'unixepoch')\n AS c_integer_datetime_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1142,12 +1192,31 @@ "name": "BLOB" }, "originalName": "c_blob" + }, + { + "name": "c_text_datetime_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_datetime_override" + }, + { + "name": "c_integer_datetime_override", + "length": -1, + "isFuncCall": true, + "type": { + "name": "any" + } } ], "filename": "query.sql" }, { - "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n COUNT(*) AS cnt\nFROM types_sqlite\nGROUP BY c_integer, c_real, c_text, c_blob\nLIMIT 1", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n count(*) AS cnt\nFROM types_sqlite\nGROUP BY c_integer, c_real, c_text, c_blob\nLIMIT 1", "name": "GetSqliteTypesCnt", "cmd": ":one", "columns": [ @@ -1208,7 +1277,7 @@ "filename": "query.sql" }, { - "text": "SELECT\n MAX(c_integer) AS max_integer,\n MAX(c_real) AS max_real,\n MAX(c_text) AS max_text\nFROM types_sqlite", + "text": "SELECT\n max(c_integer) AS max_integer,\n max(c_real) AS max_real,\n max(c_text) AS max_text\nFROM types_sqlite", "name": "GetSqliteFunctions", "cmd": ":one", "columns": [ @@ -1247,5 +1316,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6dHJ1ZSwib3ZlcnJpZGVEYXBwZXJWZXJzaW9uIjoiIiwib3ZlcnJpZGVzIjpbeyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiaW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9yZWFsIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImRlY2ltYWwiLCJub3ROdWxsIjp0cnVlfX1dLCJkZWJ1Z1JlcXVlc3QiOmZhbHNlfQ==" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6dHJ1ZSwib3ZlcnJpZGVEYXBwZXJWZXJzaW9uIjoiIiwib3ZlcnJpZGVzIjpbeyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiaW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9yZWFsIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImRlY2ltYWwiLCJub3ROdWxsIjp0cnVlfX0seyJjb2x1bW4iOiIqOmNfdGV4dF9kYXRldGltZV9vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfaW50ZWdlcl9kYXRldGltZV9vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOmZhbHNlfX1dLCJkZWJ1Z1JlcXVlc3QiOmZhbHNlfQ==" } \ No newline at end of file diff --git a/examples/SqliteDapperLegacyExample/request.message b/examples/SqliteDapperLegacyExample/request.message index 6b790025..e8aa55e8 100644 Binary files a/examples/SqliteDapperLegacyExample/request.message and b/examples/SqliteDapperLegacyExample/request.message differ diff --git a/examples/SqliteExample/Models.cs b/examples/SqliteExample/Models.cs index e266ada0..46b155f1 100644 --- a/examples/SqliteExample/Models.cs +++ b/examples/SqliteExample/Models.cs @@ -4,4 +4,4 @@ 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); -public readonly record struct TypesSqlite(int? CInteger, decimal? CReal, string? CText, byte[]? CBlob); \ No newline at end of file +public readonly record struct TypesSqlite(int? CInteger, decimal? CReal, string? CText, byte[]? CBlob, string? CTextDatetimeOverride, int? CIntegerDatetimeOverride); \ No newline at end of file diff --git a/examples/SqliteExample/QuerySql.cs b/examples/SqliteExample/QuerySql.cs index 9a9d7ce2..b9cace11 100644 --- a/examples/SqliteExample/QuerySql.cs +++ b/examples/SqliteExample/QuerySql.cs @@ -682,8 +682,8 @@ public async Task DeleteAllAuthors() } } - private const string InsertSqliteTypesSql = "INSERT INTO types_sqlite (c_integer, c_real, c_text, c_blob) VALUES (@c_integer, @c_real, @c_text, @c_blob)"; - public readonly record struct InsertSqliteTypesArgs(int? CInteger, decimal? CReal, string? CText, byte[]? CBlob); + private const string InsertSqliteTypesSql = "INSERT INTO types_sqlite ( c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override ) VALUES (@c_integer, @c_real, @c_text, @c_blob, @c_text_datetime_override, @c_integer_datetime_override)"; + public readonly record struct InsertSqliteTypesArgs(int? CInteger, decimal? CReal, string? CText, byte[]? CBlob, DateTime? CTextDatetimeOverride, DateTime? CIntegerDatetimeOverride); public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) { if (this.Transaction == null) @@ -697,6 +697,8 @@ public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) command.Parameters.AddWithValue("@c_real", args.CReal ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_text", args.CText ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_blob", args.CBlob ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_text_datetime_override", args.CTextDatetimeOverride != null ? args.CTextDatetimeOverride.Value.ToString("yyyy-MM-dd HH:mm:ss") : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_datetime_override", args.CIntegerDatetimeOverride != null ? (int? )new DateTimeOffset(args.CIntegerDatetimeOverride.Value.ToUniversalTime()).ToUnixTimeSeconds() : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -714,6 +716,8 @@ public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) command.Parameters.AddWithValue("@c_real", args.CReal ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_text", args.CText ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_blob", args.CBlob ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_text_datetime_override", args.CTextDatetimeOverride != null ? args.CTextDatetimeOverride.Value.ToString("yyyy-MM-dd HH:mm:ss") : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_datetime_override", args.CIntegerDatetimeOverride != null ? (int? )new DateTimeOffset(args.CIntegerDatetimeOverride.Value.ToUniversalTime()).ToUnixTimeSeconds() : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -740,8 +744,8 @@ public async Task InsertSqliteTypesBatch(List args) } } - private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1"; - public readonly record struct GetSqliteTypesRow(int? CInteger, decimal? CReal, string? CText, byte[]? CBlob); + private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, c_text_datetime_override, datetime(c_integer_datetime_override, 'unixepoch') AS c_integer_datetime_override FROM types_sqlite LIMIT 1"; + public readonly record struct GetSqliteTypesRow(int? CInteger, decimal? CReal, string? CText, byte[]? CBlob, DateTime? CTextDatetimeOverride, DateTime? CIntegerDatetimeOverride); public async Task GetSqliteTypes() { if (this.Transaction == null) @@ -760,7 +764,9 @@ public async Task InsertSqliteTypesBatch(List args) CInteger = reader.IsDBNull(0) ? null : reader.GetInt32(0), CReal = reader.IsDBNull(1) ? null : reader.GetDecimal(1), CText = reader.IsDBNull(2) ? null : reader.GetString(2), - CBlob = reader.IsDBNull(3) ? null : reader.GetFieldValue(3) + CBlob = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), + CTextDatetimeOverride = reader.IsDBNull(4) ? null : DateTime.Parse(reader.GetString(4)), + CIntegerDatetimeOverride = reader.IsDBNull(5) ? null : DateTime.Parse(reader.GetString(5)) }; } } @@ -785,7 +791,9 @@ public async Task InsertSqliteTypesBatch(List args) CInteger = reader.IsDBNull(0) ? null : reader.GetInt32(0), CReal = reader.IsDBNull(1) ? null : reader.GetDecimal(1), CText = reader.IsDBNull(2) ? null : reader.GetString(2), - CBlob = reader.IsDBNull(3) ? null : reader.GetFieldValue(3) + CBlob = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), + CTextDatetimeOverride = reader.IsDBNull(4) ? null : DateTime.Parse(reader.GetString(4)), + CIntegerDatetimeOverride = reader.IsDBNull(5) ? null : DateTime.Parse(reader.GetString(5)) }; } } @@ -794,7 +802,7 @@ public async Task InsertSqliteTypesBatch(List args) return null; } - private const string GetSqliteTypesCntSql = "SELECT c_integer, c_real, c_text, c_blob, COUNT(*) AS cnt FROM types_sqlite GROUP BY c_integer, c_real, c_text, c_blob LIMIT 1"; + private const string GetSqliteTypesCntSql = "SELECT c_integer, c_real, c_text, c_blob, count(*) AS cnt FROM types_sqlite GROUP BY c_integer, c_real, c_text, c_blob LIMIT 1"; public readonly record struct GetSqliteTypesCntRow(int? CInteger, decimal? CReal, string? CText, byte[]? CBlob, int Cnt); public async Task GetSqliteTypesCnt() { @@ -850,7 +858,7 @@ public async Task InsertSqliteTypesBatch(List args) return null; } - private const string GetSqliteFunctionsSql = "SELECT MAX(c_integer) AS max_integer, MAX(c_real) AS max_real, MAX(c_text) AS max_text FROM types_sqlite"; + private const string GetSqliteFunctionsSql = "SELECT max(c_integer) AS max_integer, max(c_real) AS max_real, max(c_text) AS max_text FROM types_sqlite"; public readonly record struct GetSqliteFunctionsRow(int? MaxInteger, decimal MaxReal, object? MaxText); public async Task GetSqliteFunctions() { diff --git a/examples/SqliteExample/request.json b/examples/SqliteExample/request.json index 407c978c..f53cba53 100644 --- a/examples/SqliteExample/request.json +++ b/examples/SqliteExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwidXNlRGFwcGVyIjpmYWxzZX0=", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwidXNlRGFwcGVyIjpmYWxzZX0=", "process": { "cmd": "./dist/LocalRunner" } @@ -158,6 +158,26 @@ "type": { "name": "BLOB" } + }, + { + "name": "c_text_datetime_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + } + }, + { + "name": "c_integer_datetime_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + } } ] } @@ -968,7 +988,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO types_sqlite \n(c_integer, c_real, c_text, c_blob) \nVALUES (?, ?, ?, ?)", + "text": "INSERT INTO types_sqlite \n(\n c_integer,\n c_real,\n c_text,\n c_blob,\n c_text_datetime_override,\n c_integer_datetime_override\n) \nVALUES (?, ?, ?, ?, ?, ?)", "name": "InsertSqliteTypes", "cmd": ":exec", "parameters": [ @@ -1031,6 +1051,36 @@ }, "originalName": "c_blob" } + }, + { + "number": 5, + "column": { + "name": "c_text_datetime_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_datetime_override" + } + }, + { + "number": 6, + "column": { + "name": "c_integer_datetime_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "c_integer_datetime_override" + } } ], "filename": "query.sql", @@ -1095,7 +1145,7 @@ } }, { - "text": "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n c_text_datetime_override,\n datetime(c_integer_datetime_override, 'unixepoch')\n AS c_integer_datetime_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1142,12 +1192,31 @@ "name": "BLOB" }, "originalName": "c_blob" + }, + { + "name": "c_text_datetime_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_datetime_override" + }, + { + "name": "c_integer_datetime_override", + "length": -1, + "isFuncCall": true, + "type": { + "name": "any" + } } ], "filename": "query.sql" }, { - "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n COUNT(*) AS cnt\nFROM types_sqlite\nGROUP BY c_integer, c_real, c_text, c_blob\nLIMIT 1", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n count(*) AS cnt\nFROM types_sqlite\nGROUP BY c_integer, c_real, c_text, c_blob\nLIMIT 1", "name": "GetSqliteTypesCnt", "cmd": ":one", "columns": [ @@ -1208,7 +1277,7 @@ "filename": "query.sql" }, { - "text": "SELECT\n MAX(c_integer) AS max_integer,\n MAX(c_real) AS max_real,\n MAX(c_text) AS max_text\nFROM types_sqlite", + "text": "SELECT\n max(c_integer) AS max_integer,\n max(c_real) AS max_real,\n max(c_text) AS max_text\nFROM types_sqlite", "name": "GetSqliteFunctions", "cmd": ":one", "columns": [ @@ -1247,5 +1316,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZUV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOmZhbHNlLCJvdmVycmlkZURhcHBlclZlcnNpb24iOiIiLCJvdmVycmlkZXMiOlt7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfaW50ZWdlciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJpbnQiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3JlYWwiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiZGVjaW1hbCIsIm5vdE51bGwiOnRydWV9fV0sImRlYnVnUmVxdWVzdCI6ZmFsc2V9" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZUV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOmZhbHNlLCJvdmVycmlkZURhcHBlclZlcnNpb24iOiIiLCJvdmVycmlkZXMiOlt7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfaW50ZWdlciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJpbnQiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3JlYWwiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiZGVjaW1hbCIsIm5vdE51bGwiOnRydWV9fSx7ImNvbHVtbiI6Iio6Y190ZXh0X2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y19pbnRlZ2VyX2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fV0sImRlYnVnUmVxdWVzdCI6ZmFsc2V9" } \ No newline at end of file diff --git a/examples/SqliteExample/request.message b/examples/SqliteExample/request.message index 8f7fa9fb..cc48114f 100644 Binary files a/examples/SqliteExample/request.message and b/examples/SqliteExample/request.message differ diff --git a/examples/SqliteLegacyExample/Models.cs b/examples/SqliteLegacyExample/Models.cs index b27dbdf1..11f02780 100644 --- a/examples/SqliteLegacyExample/Models.cs +++ b/examples/SqliteLegacyExample/Models.cs @@ -22,5 +22,7 @@ public class TypesSqlite public decimal? CReal { get; set; } public string CText { get; set; } public byte[] CBlob { get; set; } + public string CTextDatetimeOverride { get; set; } + public int? CIntegerDatetimeOverride { get; set; } }; } \ No newline at end of file diff --git a/examples/SqliteLegacyExample/QuerySql.cs b/examples/SqliteLegacyExample/QuerySql.cs index 2892f905..e4f85b21 100644 --- a/examples/SqliteLegacyExample/QuerySql.cs +++ b/examples/SqliteLegacyExample/QuerySql.cs @@ -784,13 +784,15 @@ public async Task DeleteAllAuthors() } } - private const string InsertSqliteTypesSql = "INSERT INTO types_sqlite (c_integer, c_real, c_text, c_blob) VALUES (@c_integer, @c_real, @c_text, @c_blob)"; + private const string InsertSqliteTypesSql = "INSERT INTO types_sqlite ( c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override ) VALUES (@c_integer, @c_real, @c_text, @c_blob, @c_text_datetime_override, @c_integer_datetime_override)"; public class InsertSqliteTypesArgs { public int? CInteger { get; set; } public decimal? CReal { get; set; } public string CText { get; set; } public byte[] CBlob { get; set; } + public DateTime? CTextDatetimeOverride { get; set; } + public DateTime? CIntegerDatetimeOverride { get; set; } }; public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) { @@ -805,6 +807,8 @@ public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) command.Parameters.AddWithValue("@c_real", args.CReal ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_text", args.CText ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_blob", args.CBlob ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_text_datetime_override", args.CTextDatetimeOverride != null ? args.CTextDatetimeOverride.Value.ToString("yyyy-MM-dd HH:mm:ss") : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_datetime_override", args.CIntegerDatetimeOverride != null ? (int? )new DateTimeOffset(args.CIntegerDatetimeOverride.Value.ToUniversalTime()).ToUnixTimeSeconds() : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -822,6 +826,8 @@ public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) command.Parameters.AddWithValue("@c_real", args.CReal ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_text", args.CText ?? (object)DBNull.Value); command.Parameters.AddWithValue("@c_blob", args.CBlob ?? (object)DBNull.Value); + command.Parameters.AddWithValue("@c_text_datetime_override", args.CTextDatetimeOverride != null ? args.CTextDatetimeOverride.Value.ToString("yyyy-MM-dd HH:mm:ss") : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_datetime_override", args.CIntegerDatetimeOverride != null ? (int? )new DateTimeOffset(args.CIntegerDatetimeOverride.Value.ToUniversalTime()).ToUnixTimeSeconds() : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -853,13 +859,15 @@ public async Task InsertSqliteTypesBatch(List args) } } - private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1"; + private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, c_text_datetime_override, datetime(c_integer_datetime_override, 'unixepoch') AS c_integer_datetime_override FROM types_sqlite LIMIT 1"; public class GetSqliteTypesRow { public int? CInteger { get; set; } public decimal? CReal { get; set; } public string CText { get; set; } public byte[] CBlob { get; set; } + public DateTime? CTextDatetimeOverride { get; set; } + public DateTime? CIntegerDatetimeOverride { get; set; } }; public async Task GetSqliteTypes() { @@ -879,7 +887,9 @@ public async Task GetSqliteTypes() CInteger = reader.IsDBNull(0) ? (int? )null : reader.GetInt32(0), CReal = reader.IsDBNull(1) ? (decimal? )null : reader.GetDecimal(1), CText = reader.IsDBNull(2) ? null : reader.GetString(2), - CBlob = reader.IsDBNull(3) ? null : reader.GetFieldValue(3) + CBlob = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), + CTextDatetimeOverride = reader.IsDBNull(4) ? (DateTime? )null : DateTime.Parse(reader.GetString(4)), + CIntegerDatetimeOverride = reader.IsDBNull(5) ? (DateTime? )null : DateTime.Parse(reader.GetString(5)) }; } } @@ -904,7 +914,9 @@ public async Task GetSqliteTypes() CInteger = reader.IsDBNull(0) ? (int? )null : reader.GetInt32(0), CReal = reader.IsDBNull(1) ? (decimal? )null : reader.GetDecimal(1), CText = reader.IsDBNull(2) ? null : reader.GetString(2), - CBlob = reader.IsDBNull(3) ? null : reader.GetFieldValue(3) + CBlob = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), + CTextDatetimeOverride = reader.IsDBNull(4) ? (DateTime? )null : DateTime.Parse(reader.GetString(4)), + CIntegerDatetimeOverride = reader.IsDBNull(5) ? (DateTime? )null : DateTime.Parse(reader.GetString(5)) }; } } @@ -913,7 +925,7 @@ public async Task GetSqliteTypes() return null; } - private const string GetSqliteTypesCntSql = "SELECT c_integer, c_real, c_text, c_blob, COUNT(*) AS cnt FROM types_sqlite GROUP BY c_integer, c_real, c_text, c_blob LIMIT 1"; + private const string GetSqliteTypesCntSql = "SELECT c_integer, c_real, c_text, c_blob, count(*) AS cnt FROM types_sqlite GROUP BY c_integer, c_real, c_text, c_blob LIMIT 1"; public class GetSqliteTypesCntRow { public int? CInteger { get; set; } @@ -976,7 +988,7 @@ public async Task GetSqliteTypesCnt() return null; } - private const string GetSqliteFunctionsSql = "SELECT MAX(c_integer) AS max_integer, MAX(c_real) AS max_real, MAX(c_text) AS max_text FROM types_sqlite"; + private const string GetSqliteFunctionsSql = "SELECT max(c_integer) AS max_integer, max(c_real) AS max_real, max(c_text) AS max_text FROM types_sqlite"; public class GetSqliteFunctionsRow { public int? MaxInteger { get; set; } diff --git a/examples/SqliteLegacyExample/request.json b/examples/SqliteLegacyExample/request.json index 1de23ed5..f14042b2 100644 --- a/examples/SqliteLegacyExample/request.json +++ b/examples/SqliteLegacyExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteLegacyExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJ1c2VEYXBwZXIiOmZhbHNlfQ==", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJ1c2VEYXBwZXIiOmZhbHNlfQ==", "process": { "cmd": "./dist/LocalRunner" } @@ -158,6 +158,26 @@ "type": { "name": "BLOB" } + }, + { + "name": "c_text_datetime_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + } + }, + { + "name": "c_integer_datetime_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + } } ] } @@ -968,7 +988,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO types_sqlite \n(c_integer, c_real, c_text, c_blob) \nVALUES (?, ?, ?, ?)", + "text": "INSERT INTO types_sqlite \n(\n c_integer,\n c_real,\n c_text,\n c_blob,\n c_text_datetime_override,\n c_integer_datetime_override\n) \nVALUES (?, ?, ?, ?, ?, ?)", "name": "InsertSqliteTypes", "cmd": ":exec", "parameters": [ @@ -1031,6 +1051,36 @@ }, "originalName": "c_blob" } + }, + { + "number": 5, + "column": { + "name": "c_text_datetime_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_datetime_override" + } + }, + { + "number": 6, + "column": { + "name": "c_integer_datetime_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "c_integer_datetime_override" + } } ], "filename": "query.sql", @@ -1095,7 +1145,7 @@ } }, { - "text": "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n c_text_datetime_override,\n datetime(c_integer_datetime_override, 'unixepoch')\n AS c_integer_datetime_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1142,12 +1192,31 @@ "name": "BLOB" }, "originalName": "c_blob" + }, + { + "name": "c_text_datetime_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_datetime_override" + }, + { + "name": "c_integer_datetime_override", + "length": -1, + "isFuncCall": true, + "type": { + "name": "any" + } } ], "filename": "query.sql" }, { - "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n COUNT(*) AS cnt\nFROM types_sqlite\nGROUP BY c_integer, c_real, c_text, c_blob\nLIMIT 1", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n count(*) AS cnt\nFROM types_sqlite\nGROUP BY c_integer, c_real, c_text, c_blob\nLIMIT 1", "name": "GetSqliteTypesCnt", "cmd": ":one", "columns": [ @@ -1208,7 +1277,7 @@ "filename": "query.sql" }, { - "text": "SELECT\n MAX(c_integer) AS max_integer,\n MAX(c_real) AS max_real,\n MAX(c_text) AS max_text\nFROM types_sqlite", + "text": "SELECT\n max(c_integer) AS max_integer,\n max(c_real) AS max_real,\n max(c_text) AS max_text\nFROM types_sqlite", "name": "GetSqliteFunctions", "cmd": ":one", "columns": [ @@ -1247,5 +1316,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6ZmFsc2UsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6ZmFsc2UsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" } \ No newline at end of file diff --git a/examples/SqliteLegacyExample/request.message b/examples/SqliteLegacyExample/request.message index fdef83c1..98d354f7 100644 Binary files a/examples/SqliteLegacyExample/request.message and b/examples/SqliteLegacyExample/request.message differ diff --git a/examples/config/sqlite/types/query.sql b/examples/config/sqlite/types/query.sql index f3074a00..2f566c2d 100644 --- a/examples/config/sqlite/types/query.sql +++ b/examples/config/sqlite/types/query.sql @@ -1,13 +1,29 @@ -- name: InsertSqliteTypes :exec INSERT INTO types_sqlite -(c_integer, c_real, c_text, c_blob) -VALUES (?, ?, ?, ?); +( + c_integer, + c_real, + c_text, + c_blob, + c_text_datetime_override, + c_integer_datetime_override +) +VALUES (?, ?, ?, ?, ?, ?); -- name: InsertSqliteTypesBatch :copyfrom INSERT INTO types_sqlite (c_integer, c_real, c_text) VALUES (?, ?, ?); -- name: GetSqliteTypes :one -SELECT * FROM types_sqlite LIMIT 1; +SELECT + c_integer, + c_real, + c_text, + c_blob, + c_text_datetime_override, + datetime(c_integer_datetime_override, 'unixepoch') + AS c_integer_datetime_override +FROM types_sqlite +LIMIT 1; -- name: GetSqliteTypesCnt :one SELECT @@ -15,16 +31,16 @@ SELECT c_real, c_text, c_blob, - COUNT(*) AS cnt + count(*) AS cnt FROM types_sqlite GROUP BY c_integer, c_real, c_text, c_blob LIMIT 1; -- name: GetSqliteFunctions :one SELECT - MAX(c_integer) AS max_integer, - MAX(c_real) AS max_real, - MAX(c_text) AS max_text + max(c_integer) AS max_integer, + max(c_real) AS max_real, + max(c_text) AS max_text FROM types_sqlite; -- name: DeleteAllSqliteTypes :exec diff --git a/examples/config/sqlite/types/schema.sql b/examples/config/sqlite/types/schema.sql index f5f7e7d6..f90f33e8 100644 --- a/examples/config/sqlite/types/schema.sql +++ b/examples/config/sqlite/types/schema.sql @@ -1,6 +1,8 @@ CREATE TABLE types_sqlite ( - c_integer INTEGER, - c_real REAL, - c_text TEXT, - c_blob BLOB -); + c_integer INTEGER, + c_real REAL, + c_text TEXT, + c_blob BLOB, + c_text_datetime_override TEXT DEFAULT (datetime('now')), + c_integer_datetime_override INTEGER +); \ No newline at end of file diff --git a/sqlc.ci.yaml b/sqlc.ci.yaml index 63ddb063..878fa495 100644 --- a/sqlc.ci.yaml +++ b/sqlc.ci.yaml @@ -322,6 +322,14 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:c_text_datetime_override" + csharp_type: + type: "DateTime" + notNull: false + - column: "*:c_integer_datetime_override" + csharp_type: + type: "DateTime" + notNull: false - schema: ["examples/config/sqlite/authors/schema.sql", "examples/config/sqlite/types/schema.sql"] queries: ["examples/config/sqlite/authors/query.sql", "examples/config/sqlite/types/query.sql"] engine: "sqlite" @@ -346,6 +354,14 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:c_text_datetime_override" + csharp_type: + type: "DateTime" + notNull: false + - column: "*:c_integer_datetime_override" + csharp_type: + type: "DateTime" + notNull: false - schema: ["examples/config/sqlite/authors/schema.sql", "examples/config/sqlite/types/schema.sql"] queries: ["examples/config/sqlite/authors/query.sql", "examples/config/sqlite/types/query.sql"] engine: "sqlite" @@ -370,6 +386,14 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:c_text_datetime_override" + csharp_type: + type: "DateTime" + notNull: false + - column: "*:c_integer_datetime_override" + csharp_type: + type: "DateTime" + notNull: false - schema: ["examples/config/sqlite/authors/schema.sql", "examples/config/sqlite/types/schema.sql"] queries: ["examples/config/sqlite/authors/query.sql", "examples/config/sqlite/types/query.sql"] engine: "sqlite" @@ -394,3 +418,11 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:c_text_datetime_override" + csharp_type: + type: "DateTime" + notNull: false + - column: "*:c_integer_datetime_override" + csharp_type: + type: "DateTime" + notNull: false \ No newline at end of file diff --git a/sqlc.local.generated.yaml b/sqlc.local.generated.yaml index 221cbdb5..5bcbae99 100644 --- a/sqlc.local.generated.yaml +++ b/sqlc.local.generated.yaml @@ -319,6 +319,14 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:c_text_datetime_override" + csharp_type: + type: "DateTime" + notNull: false + - column: "*:c_integer_datetime_override" + csharp_type: + type: "DateTime" + notNull: false - schema: ["examples/config/sqlite/authors/schema.sql", "examples/config/sqlite/types/schema.sql"] queries: ["examples/config/sqlite/authors/query.sql", "examples/config/sqlite/types/query.sql"] engine: "sqlite" @@ -343,6 +351,14 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:c_text_datetime_override" + csharp_type: + type: "DateTime" + notNull: false + - column: "*:c_integer_datetime_override" + csharp_type: + type: "DateTime" + notNull: false - schema: ["examples/config/sqlite/authors/schema.sql", "examples/config/sqlite/types/schema.sql"] queries: ["examples/config/sqlite/authors/query.sql", "examples/config/sqlite/types/query.sql"] engine: "sqlite" @@ -367,6 +383,14 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:c_text_datetime_override" + csharp_type: + type: "DateTime" + notNull: false + - column: "*:c_integer_datetime_override" + csharp_type: + type: "DateTime" + notNull: false - schema: ["examples/config/sqlite/authors/schema.sql", "examples/config/sqlite/types/schema.sql"] queries: ["examples/config/sqlite/authors/query.sql", "examples/config/sqlite/types/query.sql"] engine: "sqlite" @@ -391,3 +415,11 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:c_text_datetime_override" + csharp_type: + type: "DateTime" + notNull: false + - column: "*:c_integer_datetime_override" + csharp_type: + type: "DateTime" + notNull: false diff --git a/sqlc.request.generated.yaml b/sqlc.request.generated.yaml index 9c8049a3..3467598e 100644 --- a/sqlc.request.generated.yaml +++ b/sqlc.request.generated.yaml @@ -327,6 +327,14 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:c_text_datetime_override" + csharp_type: + type: "DateTime" + notNull: false + - column: "*:c_integer_datetime_override" + csharp_type: + type: "DateTime" + notNull: false debugRequest: true - schema: ["examples/config/sqlite/authors/schema.sql", "examples/config/sqlite/types/schema.sql"] queries: ["examples/config/sqlite/authors/query.sql", "examples/config/sqlite/types/query.sql"] @@ -352,6 +360,14 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:c_text_datetime_override" + csharp_type: + type: "DateTime" + notNull: false + - column: "*:c_integer_datetime_override" + csharp_type: + type: "DateTime" + notNull: false debugRequest: true - schema: ["examples/config/sqlite/authors/schema.sql", "examples/config/sqlite/types/schema.sql"] queries: ["examples/config/sqlite/authors/query.sql", "examples/config/sqlite/types/query.sql"] @@ -377,6 +393,14 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:c_text_datetime_override" + csharp_type: + type: "DateTime" + notNull: false + - column: "*:c_integer_datetime_override" + csharp_type: + type: "DateTime" + notNull: false debugRequest: true - schema: ["examples/config/sqlite/authors/schema.sql", "examples/config/sqlite/types/schema.sql"] queries: ["examples/config/sqlite/authors/query.sql", "examples/config/sqlite/types/query.sql"] @@ -402,4 +426,12 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:c_text_datetime_override" + csharp_type: + type: "DateTime" + notNull: false + - column: "*:c_integer_datetime_override" + csharp_type: + type: "DateTime" + notNull: false debugRequest: true