From 75bef384b46fc87db6bc23599fd5128b5350a7da Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Thu, 2 Oct 2025 00:32:48 +0200 Subject: [PATCH 1/2] feat: allow override for SQLite integer and text types to bool --- Drivers/ColumnMapping.cs | 2 +- Drivers/DbDriver.cs | 2 +- Drivers/MySqlConnectorDriver.cs | 2 +- Drivers/NpgsqlDriver.cs | 4 +- Drivers/SqliteDriver.cs | 52 ++++++++-- .../EndToEndScaffold/Templates/SqliteTests.cs | 21 ++++- .../SqliteDapperTester.generated.cs | 18 ++-- .../EndToEndTests/SqliteTester.generated.cs | 18 ++-- .../SqliteDapperTester.generated.cs | 18 ++-- .../SqliteTester.generated.cs | 18 ++-- examples/SqliteDapperExample/Models.cs | 2 + examples/SqliteDapperExample/QuerySql.cs | 12 ++- examples/SqliteDapperExample/Utils.cs | 18 ++++ examples/SqliteDapperExample/request.json | 89 ++++++++++++++++-- examples/SqliteDapperExample/request.message | Bin 8981 -> 9792 bytes examples/SqliteDapperLegacyExample/Models.cs | 2 + .../SqliteDapperLegacyExample/QuerySql.cs | 12 ++- examples/SqliteDapperLegacyExample/Utils.cs | 18 ++++ .../SqliteDapperLegacyExample/request.json | 89 ++++++++++++++++-- .../SqliteDapperLegacyExample/request.message | Bin 9015 -> 9826 bytes examples/SqliteExample/Models.cs | 2 +- examples/SqliteExample/QuerySql.cs | 26 +++-- examples/SqliteExample/request.json | 89 ++++++++++++++++-- examples/SqliteExample/request.message | Bin 8965 -> 9776 bytes examples/SqliteLegacyExample/Models.cs | 2 + examples/SqliteLegacyExample/QuerySql.cs | 26 +++-- examples/SqliteLegacyExample/request.json | 89 ++++++++++++++++-- examples/SqliteLegacyExample/request.message | Bin 8999 -> 9810 bytes examples/config/sqlite/types/query.sql | 11 ++- examples/config/sqlite/types/schema.sql | 16 ++-- sqlc.ci.yaml | 44 +++++---- sqlc.local.generated.yaml | 44 +++++---- sqlc.request.generated.yaml | 44 +++++---- 33 files changed, 626 insertions(+), 164 deletions(-) diff --git a/Drivers/ColumnMapping.cs b/Drivers/ColumnMapping.cs index 8878043c..0dca3779 100644 --- a/Drivers/ColumnMapping.cs +++ b/Drivers/ColumnMapping.cs @@ -10,7 +10,7 @@ public record DbTypeInfo(int? Length = null, string? NpgsqlTypeOverride = null); public delegate string ConvertFunc(string el); -public delegate string SqlMapperImplFunc(bool isDotnetCore); +public delegate string SqlMapperImplFunc(bool isDotnetCore, string? dbType); public class ColumnMapping( Dictionary dbTypes, diff --git a/Drivers/DbDriver.cs b/Drivers/DbDriver.cs index 6a359104..60ae38e2 100644 --- a/Drivers/DbDriver.cs +++ b/Drivers/DbDriver.cs @@ -187,7 +187,7 @@ private MemberDeclarationSyntax[] GetSqlMapperMemberDeclarations() { return [.. ColumnMappings .Where(m => TypeExistsInQueries(m.Key) && m.Value.SqlMapperImpl is not null) - .Select(m => ParseMemberDeclaration(m.Value.SqlMapperImpl!(Options.DotnetFramework.IsDotnetCore()))!)]; + .Select(m => ParseMemberDeclaration(m.Value.SqlMapperImpl!(Options.DotnetFramework.IsDotnetCore(), null))!)]; } public abstract string TransformQueryText(Query query); diff --git a/Drivers/MySqlConnectorDriver.cs b/Drivers/MySqlConnectorDriver.cs index 2c05cb63..7c4f4e7e 100644 --- a/Drivers/MySqlConnectorDriver.cs +++ b/Drivers/MySqlConnectorDriver.cs @@ -156,7 +156,7 @@ public sealed partial class MySqlConnectorDriver( public override string TransactionClassName => "MySqlTransaction"; - private static readonly SqlMapperImplFunc JsonElementTypeHandler = _ => $$""" + private static readonly SqlMapperImplFunc JsonElementTypeHandler = (_, _) => $$""" private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) diff --git a/Drivers/NpgsqlDriver.cs b/Drivers/NpgsqlDriver.cs index ba01c162..93d97c84 100644 --- a/Drivers/NpgsqlDriver.cs +++ b/Drivers/NpgsqlDriver.cs @@ -344,7 +344,7 @@ public NpgsqlDriver( public override string TransactionClassName => "NpgsqlTransaction"; - private static readonly SqlMapperImplFunc JsonElementTypeHandler = _ => $$""" + private static readonly SqlMapperImplFunc JsonElementTypeHandler = (_, _) => $$""" private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) @@ -361,7 +361,7 @@ public override void SetValue(IDbDataParameter parameter, JsonElement value) } """; - private static readonly SqlMapperImplFunc XmlDocumentTypeHandler = isDotnetCore => $$""" + private static readonly SqlMapperImplFunc XmlDocumentTypeHandler = (isDotnetCore, _) => $$""" private class XmlDocumentTypeHandler : SqlMapper.TypeHandler { public override XmlDocument Parse(object value) diff --git a/Drivers/SqliteDriver.cs b/Drivers/SqliteDriver.cs index 70c4b6fd..490814b2 100644 --- a/Drivers/SqliteDriver.cs +++ b/Drivers/SqliteDriver.cs @@ -27,14 +27,14 @@ public sealed partial class SqliteDriver( { {"blob", new()} }, - readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})" + readerFn: (ordinal, _) => $"{Variable.Reader.AsVarName()}.GetFieldValue({ordinal})" ), ["string"] = new( new() { {"text", new()} }, - readerFn: (ordinal, _) => $"reader.GetString({ordinal})" + readerFn: (ordinal, _) => $"{Variable.Reader.AsVarName()}.GetString({ordinal})" ), ["int"] = new( new() @@ -42,7 +42,7 @@ public sealed partial class SqliteDriver( { "integer", new() }, { "integernotnulldefaultunixepoch", new() } }, - readerFn: (ordinal, _) => $"reader.GetInt32({ordinal})", + readerFn: (ordinal, _) => $"{Variable.Reader.AsVarName()}.GetInt32({ordinal})", convertFunc: x => $"Convert.ToInt32({x})" ), ["decimal"] = new( @@ -50,15 +50,15 @@ public sealed partial class SqliteDriver( { {"real", new()} }, - readerFn: (ordinal, _) => $"reader.GetDecimal({ordinal})" + readerFn: (ordinal, _) => $"{Variable.Reader.AsVarName()}.GetDecimal({ordinal})" ), ["DateTime"] = new( [], readerFn: (ordinal, dbType) => { - if (IntegerDbTypes.Contains(dbType)) - return $"DateTime.UnixEpoch.AddSeconds(reader.GetInt32({ordinal}))"; - return $"DateTime.Parse(reader.GetString({ordinal}))"; + if (IntegerDbTypes.Contains(dbType.ToLower())) + return $"DateTimeOffset.FromUnixTimeSeconds({Variable.Reader.AsVarName()}.GetInt32({ordinal})).DateTime"; + return $"DateTime.Parse({Variable.Reader.AsVarName()}.GetString({ordinal}))"; }, writerFn: (el, dbType, notNull, isDapper, isLegacy) => { @@ -67,6 +67,23 @@ public sealed partial class SqliteDriver( if (IntegerDbTypes.Contains(dbType.ToLower())) return $"{el} != null ? (int?) new DateTimeOffset({elWithOptionalNull}.ToUniversalTime()).ToUnixTimeSeconds() : {nullValue}"; return $"{el} != null ? {elWithOptionalNull}.ToString(\"{DateTimeStringFormat}\") : {nullValue}"; + }, + sqlMapper: "SqlMapper.AddTypeHandler(typeof(DateTime), new DateTimeTypeHandler());", + sqlMapperImpl: DateTimeTypeHandler + ), + ["bool"] = new( + [], + readerFn: (ordinal, dbType) => + { + var getFunc = IntegerDbTypes.Contains(dbType.ToLower()) ? "GetInt32" : "GetString"; + return $"Convert.ToBoolean({Variable.Reader.AsVarName()}.{getFunc}({ordinal}))"; + }, + writerFn: (el, dbType, notNull, isDapper, isLegacy) => + { + var nullValue = isDapper ? "null" : "(object)DBNull.Value"; + var optionalCast = notNull ? string.Empty : "(int?)"; + var convertFunc = IntegerDbTypes.Contains(dbType.ToLower()) ? $"{optionalCast} Convert.ToInt32" : "Convert.ToString"; + return $"{el} != null ? {convertFunc}({el}) : {nullValue}"; } ), ["object"] = new( @@ -74,10 +91,29 @@ public sealed partial class SqliteDriver( { { "any", new() } }, - readerFn: (ordinal, _) => $"reader.GetValue({ordinal})" + readerFn: (ordinal, _) => $"{Variable.Reader.AsVarName()}.GetValue({ordinal})" ) }; + private static readonly SqlMapperImplFunc DateTimeTypeHandler = (_, dbType) => $$""" + private class DateTimeTypeHandler : SqlMapper.TypeHandler + { + public override DateTime Parse(object value) + { + if (value is string s) + return DateTime.Parse(s); + if (value is long l) + return DateTimeOffset.FromUnixTimeSeconds(l).DateTime; + throw new DataException($"Cannot convert {value?.GetType()} to DateTime"); + } + + public override void SetValue(IDbDataParameter parameter, DateTime value) + { + parameter.Value = value; + } + } + """; + public override string TransactionClassName => "SqliteTransaction"; public override ISet GetUsingDirectivesForQueries() diff --git a/end2end/EndToEndScaffold/Templates/SqliteTests.cs b/end2end/EndToEndScaffold/Templates/SqliteTests.cs index fa133a5b..a6f6713f 100644 --- a/end2end/EndToEndScaffold/Templates/SqliteTests.cs +++ b/end2end/EndToEndScaffold/Templates/SqliteTests.cs @@ -10,25 +10,32 @@ public static class SqliteTests { Impl = $$""" [Test] - [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)] + [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, true, false, "2020-01-01 14:15:16", "2025-01-01 17:18:19")] + [TestCase(null, null, null, new byte[] { }, null, null, null, null)] + [TestCase(null, null, null, null, null, null, null, null)] public async Task TestSqliteTypes( int? cInteger, decimal? cReal, string cText, byte[] cBlob, - DateTime cTextDatetimeOverride, + bool? cTextBoolOverride, + bool? cIntegerBoolOverride, + DateTime? cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride) { + if (cTextDatetimeOverride.HasValue && cTextDatetimeOverride.Value.Kind != DateTimeKind.Utc) + cTextDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride.Value, DateTimeKind.Utc); if (cIntegerDatetimeOverride.HasValue && cIntegerDatetimeOverride.Value.Kind != DateTimeKind.Utc) - cIntegerDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride, DateTimeKind.Utc); + cIntegerDatetimeOverride = DateTime.SpecifyKind(cIntegerDatetimeOverride.Value, DateTimeKind.Utc); + await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, + CTextBoolOverride = cTextBoolOverride, + CIntegerBoolOverride = cIntegerBoolOverride, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }); @@ -39,6 +46,8 @@ await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs CReal = cReal, CText = cText, CBlob = cBlob, + CTextBoolOverride = cTextBoolOverride, + CIntegerBoolOverride = cIntegerBoolOverride, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }; @@ -51,6 +60,8 @@ 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)); + Assert.That(x.CTextBoolOverride, Is.EqualTo(y.CTextBoolOverride)); + Assert.That(x.CIntegerBoolOverride, Is.EqualTo(y.CIntegerBoolOverride)); AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); } diff --git a/end2end/EndToEndTests/SqliteDapperTester.generated.cs b/end2end/EndToEndTests/SqliteDapperTester.generated.cs index 61967536..6c300290 100644 --- a/end2end/EndToEndTests/SqliteDapperTester.generated.cs +++ b/end2end/EndToEndTests/SqliteDapperTester.generated.cs @@ -328,20 +328,24 @@ void AssertSingularEquals(QuerySql.GetAuthorByNamePatternRow x, QuerySql.GetAuth } [Test] - [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) + [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, true, false, "2020-01-01 14:15:16", "2025-01-01 17:18:19")] + [TestCase(null, null, null, new byte[] { }, null, null, null, null)] + [TestCase(null, null, null, null, null, null, null, null)] + public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, bool? cTextBoolOverride, bool? cIntegerBoolOverride, DateTime? cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride) { + if (cTextDatetimeOverride.HasValue && cTextDatetimeOverride.Value.Kind != DateTimeKind.Utc) + cTextDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride.Value, DateTimeKind.Utc); 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 }); + cIntegerDatetimeOverride = DateTime.SpecifyKind(cIntegerDatetimeOverride.Value, DateTimeKind.Utc); + await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextBoolOverride = cTextBoolOverride, CIntegerBoolOverride = cIntegerBoolOverride, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }); var expected = new QuerySql.GetSqliteTypesRow { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, + CTextBoolOverride = cTextBoolOverride, + CIntegerBoolOverride = cIntegerBoolOverride, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }; @@ -353,6 +357,8 @@ 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)); + Assert.That(x.CTextBoolOverride, Is.EqualTo(y.CTextBoolOverride)); + Assert.That(x.CIntegerBoolOverride, Is.EqualTo(y.CIntegerBoolOverride)); AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); } diff --git a/end2end/EndToEndTests/SqliteTester.generated.cs b/end2end/EndToEndTests/SqliteTester.generated.cs index 17aec6f6..f3cc01ba 100644 --- a/end2end/EndToEndTests/SqliteTester.generated.cs +++ b/end2end/EndToEndTests/SqliteTester.generated.cs @@ -328,20 +328,24 @@ void AssertSingularEquals(QuerySql.GetAuthorByNamePatternRow x, QuerySql.GetAuth } [Test] - [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) + [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, true, false, "2020-01-01 14:15:16", "2025-01-01 17:18:19")] + [TestCase(null, null, null, new byte[] { }, null, null, null, null)] + [TestCase(null, null, null, null, null, null, null, null)] + public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, bool? cTextBoolOverride, bool? cIntegerBoolOverride, DateTime? cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride) { + if (cTextDatetimeOverride.HasValue && cTextDatetimeOverride.Value.Kind != DateTimeKind.Utc) + cTextDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride.Value, DateTimeKind.Utc); 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 }); + cIntegerDatetimeOverride = DateTime.SpecifyKind(cIntegerDatetimeOverride.Value, DateTimeKind.Utc); + await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextBoolOverride = cTextBoolOverride, CIntegerBoolOverride = cIntegerBoolOverride, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }); var expected = new QuerySql.GetSqliteTypesRow { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, + CTextBoolOverride = cTextBoolOverride, + CIntegerBoolOverride = cIntegerBoolOverride, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }; @@ -353,6 +357,8 @@ 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)); + Assert.That(x.CTextBoolOverride, Is.EqualTo(y.CTextBoolOverride)); + Assert.That(x.CIntegerBoolOverride, Is.EqualTo(y.CIntegerBoolOverride)); AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); } diff --git a/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs b/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs index 586de9df..b0956df6 100644 --- a/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs @@ -328,20 +328,24 @@ void AssertSingularEquals(QuerySql.GetAuthorByNamePatternRow x, QuerySql.GetAuth } [Test] - [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) + [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, true, false, "2020-01-01 14:15:16", "2025-01-01 17:18:19")] + [TestCase(null, null, null, new byte[] { }, null, null, null, null)] + [TestCase(null, null, null, null, null, null, null, null)] + public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, bool? cTextBoolOverride, bool? cIntegerBoolOverride, DateTime? cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride) { + if (cTextDatetimeOverride.HasValue && cTextDatetimeOverride.Value.Kind != DateTimeKind.Utc) + cTextDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride.Value, DateTimeKind.Utc); 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 }); + cIntegerDatetimeOverride = DateTime.SpecifyKind(cIntegerDatetimeOverride.Value, DateTimeKind.Utc); + await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextBoolOverride = cTextBoolOverride, CIntegerBoolOverride = cIntegerBoolOverride, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }); var expected = new QuerySql.GetSqliteTypesRow { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, + CTextBoolOverride = cTextBoolOverride, + CIntegerBoolOverride = cIntegerBoolOverride, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }; @@ -353,6 +357,8 @@ 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)); + Assert.That(x.CTextBoolOverride, Is.EqualTo(y.CTextBoolOverride)); + Assert.That(x.CIntegerBoolOverride, Is.EqualTo(y.CIntegerBoolOverride)); AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); } diff --git a/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs b/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs index 0a16b355..c50edf9f 100644 --- a/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs @@ -328,20 +328,24 @@ void AssertSingularEquals(QuerySql.GetAuthorByNamePatternRow x, QuerySql.GetAuth } [Test] - [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) + [TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, true, false, "2020-01-01 14:15:16", "2025-01-01 17:18:19")] + [TestCase(null, null, null, new byte[] { }, null, null, null, null)] + [TestCase(null, null, null, null, null, null, null, null)] + public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, bool? cTextBoolOverride, bool? cIntegerBoolOverride, DateTime? cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride) { + if (cTextDatetimeOverride.HasValue && cTextDatetimeOverride.Value.Kind != DateTimeKind.Utc) + cTextDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride.Value, DateTimeKind.Utc); 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 }); + cIntegerDatetimeOverride = DateTime.SpecifyKind(cIntegerDatetimeOverride.Value, DateTimeKind.Utc); + await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextBoolOverride = cTextBoolOverride, CIntegerBoolOverride = cIntegerBoolOverride, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }); var expected = new QuerySql.GetSqliteTypesRow { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, + CTextBoolOverride = cTextBoolOverride, + CIntegerBoolOverride = cIntegerBoolOverride, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride }; @@ -353,6 +357,8 @@ 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)); + Assert.That(x.CTextBoolOverride, Is.EqualTo(y.CTextBoolOverride)); + Assert.That(x.CIntegerBoolOverride, Is.EqualTo(y.CIntegerBoolOverride)); AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); } diff --git a/examples/SqliteDapperExample/Models.cs b/examples/SqliteDapperExample/Models.cs index 13186668..ce95a5a1 100644 --- a/examples/SqliteDapperExample/Models.cs +++ b/examples/SqliteDapperExample/Models.cs @@ -23,4 +23,6 @@ public class TypesSqlite public byte[]? CBlob { get; init; } public string? CTextDatetimeOverride { get; init; } public int? CIntegerDatetimeOverride { get; init; } + public string? CTextBoolOverride { get; init; } + public int? CIntegerBoolOverride { get; init; } }; \ No newline at end of file diff --git a/examples/SqliteDapperExample/QuerySql.cs b/examples/SqliteDapperExample/QuerySql.cs index fea7c104..7f936975 100644 --- a/examples/SqliteDapperExample/QuerySql.cs +++ b/examples/SqliteDapperExample/QuerySql.cs @@ -521,7 +521,7 @@ 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, 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)"; + private const string InsertSqliteTypesSql = "INSERT INTO types_sqlite ( c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override, c_text_bool_override, c_integer_bool_override ) VALUES (@c_integer, @c_real, @c_text, @c_blob, @c_text_datetime_override, @c_integer_datetime_override, @c_text_bool_override, @c_integer_bool_override)"; public class InsertSqliteTypesArgs { public int? CInteger { get; init; } @@ -530,6 +530,8 @@ public class InsertSqliteTypesArgs public byte[]? CBlob { get; init; } public DateTime? CTextDatetimeOverride { get; init; } public DateTime? CIntegerDatetimeOverride { get; init; } + public bool? CTextBoolOverride { get; init; } + public bool? CIntegerBoolOverride { get; init; } }; public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) { @@ -540,6 +542,8 @@ public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) 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); + queryParams.Add("c_text_bool_override", args.CTextBoolOverride != null ? Convert.ToString(args.CTextBoolOverride) : null); + queryParams.Add("c_integer_bool_override", args.CIntegerBoolOverride != null ? (int? )Convert.ToInt32(args.CIntegerBoolOverride) : null); if (this.Transaction == null) { using (var connection = new SqliteConnection(ConnectionString)) @@ -579,7 +583,7 @@ public async Task InsertSqliteTypesBatch(List args) } } - 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"; + private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override, c_text_bool_override, c_integer_bool_override FROM types_sqlite LIMIT 1"; public class GetSqliteTypesRow { public int? CInteger { get; init; } @@ -588,6 +592,8 @@ public class GetSqliteTypesRow public byte[]? CBlob { get; init; } public DateTime? CTextDatetimeOverride { get; init; } public DateTime? CIntegerDatetimeOverride { get; init; } + public bool? CTextBoolOverride { get; init; } + public bool? CIntegerBoolOverride { get; init; } }; public async Task GetSqliteTypes() { @@ -634,7 +640,7 @@ public class GetSqliteTypesCntRow public class GetSqliteFunctionsRow { public int? MaxInteger { get; init; } - public required decimal MaxReal { get; init; } + public decimal? MaxReal { get; init; } public object? MaxText { get; init; } }; public async Task GetSqliteFunctions() diff --git a/examples/SqliteDapperExample/Utils.cs b/examples/SqliteDapperExample/Utils.cs index 552ea0c4..51bdcc1f 100644 --- a/examples/SqliteDapperExample/Utils.cs +++ b/examples/SqliteDapperExample/Utils.cs @@ -8,8 +8,26 @@ namespace SqliteDapperExampleGen; public static class Utils { + private class DateTimeTypeHandler : SqlMapper.TypeHandler + { + public override DateTime Parse(object value) + { + if (value is string s) + return DateTime.Parse(s); + if (value is long l) + return DateTimeOffset.FromUnixTimeSeconds(l).DateTime; + throw new DataException($"Cannot convert {value?.GetType()} to DateTime"); + } + + public override void SetValue(IDbDataParameter parameter, DateTime value) + { + parameter.Value = value; + } + } + public static void ConfigureSqlMapper() { + SqlMapper.AddTypeHandler(typeof(DateTime), new DateTimeTypeHandler()); } public static string TransformQueryForSliceArgs(string originalSql, int sliceSize, string paramName) diff --git a/examples/SqliteDapperExample/request.json b/examples/SqliteDapperExample/request.json index c6a11107..9980e088 100644 --- a/examples/SqliteDapperExample/request.json +++ b/examples/SqliteDapperExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteDapperExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwidXNlRGFwcGVyIjp0cnVlfQ==", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3JlYWwiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiZGVjaW1hbCJ9fSx7ImNvbHVtbiI6Iio6Y190ZXh0X2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUifX0seyJjb2x1bW4iOiIqOmNfdGV4dF9ib29sX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImJvb2wifX0seyJjb2x1bW4iOiIqOmNfaW50ZWdlcl9ib29sX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImJvb2wifX1dLCJ0YXJnZXRGcmFtZXdvcmsiOiJuZXQ4LjAiLCJ1c2VEYXBwZXIiOnRydWV9", "process": { "cmd": "./dist/LocalRunner" } @@ -178,6 +178,26 @@ "type": { "name": "INTEGER" } + }, + { + "name": "c_text_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + } + }, + { + "name": "c_integer_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + } } ] } @@ -988,7 +1008,7 @@ "filename": "query.sql" }, { - "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 (?, ?, ?, ?, ?, ?)", + "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 c_text_bool_override,\n c_integer_bool_override\n) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertSqliteTypes", "cmd": ":exec", "parameters": [ @@ -1081,6 +1101,36 @@ }, "originalName": "c_integer_datetime_override" } + }, + { + "number": 7, + "column": { + "name": "c_text_bool_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_bool_override" + } + }, + { + "number": 8, + "column": { + "name": "c_integer_bool_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "c_integer_bool_override" + } } ], "filename": "query.sql", @@ -1145,7 +1195,7 @@ } }, { - "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", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n c_text_datetime_override,\n c_integer_datetime_override,\n c_text_bool_override,\n c_integer_bool_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1207,10 +1257,35 @@ { "name": "c_integer_datetime_override", "length": -1, - "isFuncCall": true, + "table": { + "name": "types_sqlite" + }, "type": { - "name": "any" - } + "name": "INTEGER" + }, + "originalName": "c_integer_datetime_override" + }, + { + "name": "c_text_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_bool_override" + }, + { + "name": "c_integer_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "c_integer_bool_override" } ], "filename": "query.sql" @@ -1316,5 +1391,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZURhcHBlckV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOnRydWUsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZURhcHBlckV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOnRydWUsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y190ZXh0X2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y19pbnRlZ2VyX2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y190ZXh0X2Jvb2xfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiYm9vbCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfaW50ZWdlcl9ib29sX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImJvb2wiLCJub3ROdWxsIjpmYWxzZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" } \ No newline at end of file diff --git a/examples/SqliteDapperExample/request.message b/examples/SqliteDapperExample/request.message index 6bfed14c5b3e7377e9e3b1c0e2fd53c1f8fe3e11..86cf9998b4b260f32b07562dc2c36d38be6d9ea3 100644 GIT binary patch delta 605 zcmbR0cEE>;>)%AC&5WleZqs1uW}Wz8&g6O}_Q{hOoxt=PD6OZ&G1-U73MeKpc^Q)} zlosMFNv$Y}Ps-2FnS4-5i50|9nmk`giUlUb0T!yQjh(zlL3Xk-vpV-AHX)YW#LPUU zPPWaV%(je7rNwI{uMub!$I|y#9RuTt?P#hMQf%Gc!qq%tVddXr&mi260Cnl>&$4;Ik zE=_`KH(!=6U}Q{~JfGEh@@z?2ekFf&_v&b1ccfAT76*cZPO=Kkg>a8;E|nEwX4=HI yxm#fy4x|pZrddhgZuAId*{24TMfu5Vm3ZJW4q?1j(gFb7g3)9E delta 319 zcmX@$Gu4fW>)1r5&5V;KZqs18%rf!89R9rg62H=%93`u?#GK+(oypaVUKnCW7`^!5 z>Pm`Afy#K9FqMTd`6sVqoUvQlzMEJ+Q?%uQ9Qt&N>*uPi$`npvHD8mkaX zZenJhQZMV~US?ZHrgKc2&#?G0Zl1sVL4I args) } } - 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"; + private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override, c_text_bool_override, c_integer_bool_override FROM types_sqlite LIMIT 1"; public class GetSqliteTypesRow { public int? CInteger { get; set; } @@ -589,6 +593,8 @@ public class GetSqliteTypesRow public byte[] CBlob { get; set; } public DateTime? CTextDatetimeOverride { get; set; } public DateTime? CIntegerDatetimeOverride { get; set; } + public bool? CTextBoolOverride { get; set; } + public bool? CIntegerBoolOverride { get; set; } }; public async Task GetSqliteTypes() { @@ -635,7 +641,7 @@ public async Task GetSqliteTypesCnt() public class GetSqliteFunctionsRow { public int? MaxInteger { get; set; } - public decimal MaxReal { get; set; } + public decimal? MaxReal { get; set; } public object MaxText { get; set; } }; public async Task GetSqliteFunctions() diff --git a/examples/SqliteDapperLegacyExample/Utils.cs b/examples/SqliteDapperLegacyExample/Utils.cs index 0c542d77..5f682d42 100644 --- a/examples/SqliteDapperLegacyExample/Utils.cs +++ b/examples/SqliteDapperLegacyExample/Utils.cs @@ -9,8 +9,26 @@ namespace SqliteDapperLegacyExampleGen public static class Utils { + private class DateTimeTypeHandler : SqlMapper.TypeHandler + { + public override DateTime Parse(object value) + { + if (value is string s) + return DateTime.Parse(s); + if (value is long l) + return DateTimeOffset.FromUnixTimeSeconds(l).DateTime; + throw new DataException($"Cannot convert {value?.GetType()} to DateTime"); + } + + public override void SetValue(IDbDataParameter parameter, DateTime value) + { + parameter.Value = value; + } + } + public static void ConfigureSqlMapper() { + SqlMapper.AddTypeHandler(typeof(DateTime), new DateTimeTypeHandler()); } public static string TransformQueryForSliceArgs(string originalSql, int sliceSize, string paramName) diff --git a/examples/SqliteDapperLegacyExample/request.json b/examples/SqliteDapperLegacyExample/request.json index 228b58df..8bfc0f57 100644 --- a/examples/SqliteDapperLegacyExample/request.json +++ b/examples/SqliteDapperLegacyExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteDapperLegacyExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJ1c2VEYXBwZXIiOnRydWV9", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3JlYWwiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiZGVjaW1hbCJ9fSx7ImNvbHVtbiI6Iio6Y190ZXh0X2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUifX0seyJjb2x1bW4iOiIqOmNfdGV4dF9ib29sX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImJvb2wifX0seyJjb2x1bW4iOiIqOmNfaW50ZWdlcl9ib29sX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImJvb2wifX1dLCJ0YXJnZXRGcmFtZXdvcmsiOiJuZXRzdGFuZGFyZDIuMCIsInVzZURhcHBlciI6dHJ1ZX0=", "process": { "cmd": "./dist/LocalRunner" } @@ -178,6 +178,26 @@ "type": { "name": "INTEGER" } + }, + { + "name": "c_text_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + } + }, + { + "name": "c_integer_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + } } ] } @@ -988,7 +1008,7 @@ "filename": "query.sql" }, { - "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 (?, ?, ?, ?, ?, ?)", + "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 c_text_bool_override,\n c_integer_bool_override\n) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertSqliteTypes", "cmd": ":exec", "parameters": [ @@ -1081,6 +1101,36 @@ }, "originalName": "c_integer_datetime_override" } + }, + { + "number": 7, + "column": { + "name": "c_text_bool_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_bool_override" + } + }, + { + "number": 8, + "column": { + "name": "c_integer_bool_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "c_integer_bool_override" + } } ], "filename": "query.sql", @@ -1145,7 +1195,7 @@ } }, { - "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", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n c_text_datetime_override,\n c_integer_datetime_override,\n c_text_bool_override,\n c_integer_bool_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1207,10 +1257,35 @@ { "name": "c_integer_datetime_override", "length": -1, - "isFuncCall": true, + "table": { + "name": "types_sqlite" + }, "type": { - "name": "any" - } + "name": "INTEGER" + }, + "originalName": "c_integer_datetime_override" + }, + { + "name": "c_text_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_bool_override" + }, + { + "name": "c_integer_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "c_integer_bool_override" } ], "filename": "query.sql" @@ -1316,5 +1391,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6dHJ1ZSwib3ZlcnJpZGVEYXBwZXJWZXJzaW9uIjoiIiwib3ZlcnJpZGVzIjpbeyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiaW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9yZWFsIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImRlY2ltYWwiLCJub3ROdWxsIjp0cnVlfX0seyJjb2x1bW4iOiIqOmNfdGV4dF9kYXRldGltZV9vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfaW50ZWdlcl9kYXRldGltZV9vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOmZhbHNlfX1dLCJkZWJ1Z1JlcXVlc3QiOmZhbHNlfQ==" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6dHJ1ZSwib3ZlcnJpZGVEYXBwZXJWZXJzaW9uIjoiIiwib3ZlcnJpZGVzIjpbeyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiaW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9yZWFsIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImRlY2ltYWwiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX3RleHRfYm9vbF9vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJib29sIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y19pbnRlZ2VyX2Jvb2xfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiYm9vbCIsIm5vdE51bGwiOmZhbHNlfX1dLCJkZWJ1Z1JlcXVlc3QiOmZhbHNlfQ==" } \ No newline at end of file diff --git a/examples/SqliteDapperLegacyExample/request.message b/examples/SqliteDapperLegacyExample/request.message index e8aa55e84522141c157f9a7555e55f9e46329809..899015a257d8b205f58a8a24a394768c91029093 100644 GIT binary patch delta 610 zcmdn)_Q;2sYZCiJ=1q+ECT`PXn#nrx*`moG6xk=wXLJJ6e3Sn(T7&rkN*t3Tn5@9; zl}v6>TAH&YwW1_GDL+4Fa+{J83z)HyNgBd{i|{cAa8F_rV#!U+%v0)Q+nmX4%gA(! zdGiVuKSq8bOD>V*c!W6uvN}RS_FUr0@tJugsp+Xj5aR`8RVU}kac%y_Y9+|Jk)7)q zT-Dc6r z{gPsn*Gq6{BRdIhq*f9Khfo|Ar-Ae-@}oI<^I^$iMwaz#Tqh=5NykoJCN52aOE*84 zE?{Iz;F`QaQfBf6R<+6NC1v@Q{Lvk(tB%#7N)cEb2?{@M2{cE-{kFMNR)m@90NdvI x3P%_xuT>PDoW`UBj^-6g6_W*&czCs}kfRA6xeFELC!bg1L5uQ*Km!z%#Q|W0(;xr< delta 311 zcmaFlv)zrE>lWKY=1q*tCT`PXddM>I*&_bD{1U&?oE#;qw8Wg^RGrD~j9wUG7Z|N`cBGnJ|^DXHuRVuBt5$R|+vwsid+XRmn=pC9xzmBr`X4vKw;%_cT@^mfXb5 zJf&XN%?p`r8JW&8ZGOPw$GCYFo0TBzR#vW+jFaa`OHO8zD4x7VLT2+hiT8|~YoxOn zS?;iKou4eD;4s-%LY6ZHXl4n}OpVEJS*4|P6x2)eGAmLG@{=>vHMta^z%f_>B)xg2 zY&s*O;bca64NeEfBvvWr#JtMQJPIPrOfy(FD=8mgWCr?e@ args) } } - 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); + private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override, c_text_bool_override, c_integer_bool_override FROM types_sqlite LIMIT 1"; + public readonly record struct GetSqliteTypesRow(int? CInteger, decimal? CReal, string? CText, byte[]? CBlob, DateTime? CTextDatetimeOverride, DateTime? CIntegerDatetimeOverride, bool? CTextBoolOverride, bool? CIntegerBoolOverride); public async Task GetSqliteTypes() { if (this.Transaction == null) @@ -766,7 +770,9 @@ public async Task InsertSqliteTypesBatch(List args) CText = reader.IsDBNull(2) ? null : reader.GetString(2), 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)) + CIntegerDatetimeOverride = reader.IsDBNull(5) ? null : DateTimeOffset.FromUnixTimeSeconds(reader.GetInt32(5)).DateTime, + CTextBoolOverride = reader.IsDBNull(6) ? null : Convert.ToBoolean(reader.GetString(6)), + CIntegerBoolOverride = reader.IsDBNull(7) ? null : Convert.ToBoolean(reader.GetInt32(7)) }; } } @@ -793,7 +799,9 @@ public async Task InsertSqliteTypesBatch(List args) CText = reader.IsDBNull(2) ? null : reader.GetString(2), 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)) + CIntegerDatetimeOverride = reader.IsDBNull(5) ? null : DateTimeOffset.FromUnixTimeSeconds(reader.GetInt32(5)).DateTime, + CTextBoolOverride = reader.IsDBNull(6) ? null : Convert.ToBoolean(reader.GetString(6)), + CIntegerBoolOverride = reader.IsDBNull(7) ? null : Convert.ToBoolean(reader.GetInt32(7)) }; } } @@ -859,7 +867,7 @@ public async Task InsertSqliteTypesBatch(List args) } 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 readonly record struct GetSqliteFunctionsRow(int? MaxInteger, decimal? MaxReal, object? MaxText); public async Task GetSqliteFunctions() { if (this.Transaction == null) @@ -876,7 +884,7 @@ public async Task InsertSqliteTypesBatch(List args) return new GetSqliteFunctionsRow { MaxInteger = reader.IsDBNull(0) ? null : reader.GetInt32(0), - MaxReal = reader.GetDecimal(1), + MaxReal = reader.IsDBNull(1) ? null : reader.GetDecimal(1), MaxText = reader.IsDBNull(2) ? null : reader.GetValue(2) }; } @@ -900,7 +908,7 @@ public async Task InsertSqliteTypesBatch(List args) return new GetSqliteFunctionsRow { MaxInteger = reader.IsDBNull(0) ? null : reader.GetInt32(0), - MaxReal = reader.GetDecimal(1), + MaxReal = reader.IsDBNull(1) ? null : reader.GetDecimal(1), MaxText = reader.IsDBNull(2) ? null : reader.GetValue(2) }; } diff --git a/examples/SqliteExample/request.json b/examples/SqliteExample/request.json index f53cba53..9471287a 100644 --- a/examples/SqliteExample/request.json +++ b/examples/SqliteExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwidXNlRGFwcGVyIjpmYWxzZX0=", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3JlYWwiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiZGVjaW1hbCJ9fSx7ImNvbHVtbiI6Iio6Y190ZXh0X2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUifX0seyJjb2x1bW4iOiIqOmNfdGV4dF9ib29sX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImJvb2wifX0seyJjb2x1bW4iOiIqOmNfaW50ZWdlcl9ib29sX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImJvb2wifX1dLCJ0YXJnZXRGcmFtZXdvcmsiOiJuZXQ4LjAiLCJ1c2VEYXBwZXIiOmZhbHNlfQ==", "process": { "cmd": "./dist/LocalRunner" } @@ -178,6 +178,26 @@ "type": { "name": "INTEGER" } + }, + { + "name": "c_text_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + } + }, + { + "name": "c_integer_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + } } ] } @@ -988,7 +1008,7 @@ "filename": "query.sql" }, { - "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 (?, ?, ?, ?, ?, ?)", + "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 c_text_bool_override,\n c_integer_bool_override\n) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertSqliteTypes", "cmd": ":exec", "parameters": [ @@ -1081,6 +1101,36 @@ }, "originalName": "c_integer_datetime_override" } + }, + { + "number": 7, + "column": { + "name": "c_text_bool_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_bool_override" + } + }, + { + "number": 8, + "column": { + "name": "c_integer_bool_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "c_integer_bool_override" + } } ], "filename": "query.sql", @@ -1145,7 +1195,7 @@ } }, { - "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", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n c_text_datetime_override,\n c_integer_datetime_override,\n c_text_bool_override,\n c_integer_bool_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1207,10 +1257,35 @@ { "name": "c_integer_datetime_override", "length": -1, - "isFuncCall": true, + "table": { + "name": "types_sqlite" + }, "type": { - "name": "any" - } + "name": "INTEGER" + }, + "originalName": "c_integer_datetime_override" + }, + { + "name": "c_text_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_bool_override" + }, + { + "name": "c_integer_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "c_integer_bool_override" } ], "filename": "query.sql" @@ -1316,5 +1391,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZUV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOmZhbHNlLCJvdmVycmlkZURhcHBlclZlcnNpb24iOiIiLCJvdmVycmlkZXMiOlt7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfaW50ZWdlciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJpbnQiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3JlYWwiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiZGVjaW1hbCIsIm5vdE51bGwiOnRydWV9fSx7ImNvbHVtbiI6Iio6Y190ZXh0X2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y19pbnRlZ2VyX2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fV0sImRlYnVnUmVxdWVzdCI6ZmFsc2V9" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZUV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOmZhbHNlLCJvdmVycmlkZURhcHBlclZlcnNpb24iOiIiLCJvdmVycmlkZXMiOlt7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfaW50ZWdlciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJpbnQiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3JlYWwiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiZGVjaW1hbCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfdGV4dF9kYXRldGltZV9vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfaW50ZWdlcl9kYXRldGltZV9vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfdGV4dF9ib29sX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImJvb2wiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfYm9vbF9vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJib29sIiwibm90TnVsbCI6ZmFsc2V9fV0sImRlYnVnUmVxdWVzdCI6ZmFsc2V9" } \ No newline at end of file diff --git a/examples/SqliteExample/request.message b/examples/SqliteExample/request.message index cc48114f36974bb6b4136c2eb6f4edefdb4b8488..344dee9b36c260d741d066e8f42606a2692d9bf2 100644 GIT binary patch delta 617 zcmZp5+u*~*^?4%GX2$&!w<$5Tu}-`-ZF0U6`{Z^;Coug0O3Nv6Om<+h0*VPtp2cJf zrG+?4QY%X0lk)R(CT~4 z$+p>x*_M&%6!Ydz7C%OQAxkcibBPiy-!Vlu@1RFUPg{ zI;)i+>qd62XN;52N=i=F7cbV+;ZgtsBs1dk%TkMqGE-7vGAJg^6j$B6L;NeFuvR1o zyHF^)?V^(lB*i9Akl@fpb{5=7tt1W(p*Sqg1L;%bM|1Y(C6dLAEbH00PE3}Tj-A{t zE={6qH=mF$U}Q?*nmkcbW^z8O3@{A1L2P~{e{_fIs$+GqQUn&qg2Iwp0?n~-KW@&F y6=7yt%eJ{eVI$+@YDMA6eoQ*RxUZjlPmu@6=7h&Hgpsc(KY6Ya51Qz0B`p9a&(bvj delta 296 zcmdns)9S{=wRSf*B z#B9sRbdG8BK^8y8&E0HPf~;FvxmGexu9cRY{8+qra<7EU=JgWq88^pDXECzeVc|MI z`LDdgWH||0&J>`TB|tMZCZA)KmeNsBFU`xWNG-@u&QRCnQh)--Ud^GqdtWMrNRoCLdH4o_tzm`D95oaRA<^Vvzs< diff --git a/examples/SqliteLegacyExample/Models.cs b/examples/SqliteLegacyExample/Models.cs index 11f02780..d07f1dc8 100644 --- a/examples/SqliteLegacyExample/Models.cs +++ b/examples/SqliteLegacyExample/Models.cs @@ -24,5 +24,7 @@ public class TypesSqlite public byte[] CBlob { get; set; } public string CTextDatetimeOverride { get; set; } public int? CIntegerDatetimeOverride { get; set; } + public string CTextBoolOverride { get; set; } + public int? CIntegerBoolOverride { get; set; } }; } \ No newline at end of file diff --git a/examples/SqliteLegacyExample/QuerySql.cs b/examples/SqliteLegacyExample/QuerySql.cs index e4f85b21..604e0b1f 100644 --- a/examples/SqliteLegacyExample/QuerySql.cs +++ b/examples/SqliteLegacyExample/QuerySql.cs @@ -784,7 +784,7 @@ public async Task DeleteAllAuthors() } } - 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)"; + private const string InsertSqliteTypesSql = "INSERT INTO types_sqlite ( c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override, c_text_bool_override, c_integer_bool_override ) VALUES (@c_integer, @c_real, @c_text, @c_blob, @c_text_datetime_override, @c_integer_datetime_override, @c_text_bool_override, @c_integer_bool_override)"; public class InsertSqliteTypesArgs { public int? CInteger { get; set; } @@ -793,6 +793,8 @@ public class InsertSqliteTypesArgs public byte[] CBlob { get; set; } public DateTime? CTextDatetimeOverride { get; set; } public DateTime? CIntegerDatetimeOverride { get; set; } + public bool? CTextBoolOverride { get; set; } + public bool? CIntegerBoolOverride { get; set; } }; public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) { @@ -809,6 +811,8 @@ public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) 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); + command.Parameters.AddWithValue("@c_text_bool_override", args.CTextBoolOverride != null ? Convert.ToString(args.CTextBoolOverride) : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_bool_override", args.CIntegerBoolOverride != null ? (int? )Convert.ToInt32(args.CIntegerBoolOverride) : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -828,6 +832,8 @@ public async Task InsertSqliteTypes(InsertSqliteTypesArgs args) 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); + command.Parameters.AddWithValue("@c_text_bool_override", args.CTextBoolOverride != null ? Convert.ToString(args.CTextBoolOverride) : (object)DBNull.Value); + command.Parameters.AddWithValue("@c_integer_bool_override", args.CIntegerBoolOverride != null ? (int? )Convert.ToInt32(args.CIntegerBoolOverride) : (object)DBNull.Value); await command.ExecuteNonQueryAsync(); } } @@ -859,7 +865,7 @@ public async Task InsertSqliteTypesBatch(List args) } } - 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"; + private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override, c_text_bool_override, c_integer_bool_override FROM types_sqlite LIMIT 1"; public class GetSqliteTypesRow { public int? CInteger { get; set; } @@ -868,6 +874,8 @@ public class GetSqliteTypesRow public byte[] CBlob { get; set; } public DateTime? CTextDatetimeOverride { get; set; } public DateTime? CIntegerDatetimeOverride { get; set; } + public bool? CTextBoolOverride { get; set; } + public bool? CIntegerBoolOverride { get; set; } }; public async Task GetSqliteTypes() { @@ -889,7 +897,9 @@ public async Task GetSqliteTypes() CText = reader.IsDBNull(2) ? null : reader.GetString(2), 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)) + CIntegerDatetimeOverride = reader.IsDBNull(5) ? (DateTime? )null : DateTimeOffset.FromUnixTimeSeconds(reader.GetInt32(5)).DateTime, + CTextBoolOverride = reader.IsDBNull(6) ? (bool? )null : Convert.ToBoolean(reader.GetString(6)), + CIntegerBoolOverride = reader.IsDBNull(7) ? (bool? )null : Convert.ToBoolean(reader.GetInt32(7)) }; } } @@ -916,7 +926,9 @@ public async Task GetSqliteTypes() CText = reader.IsDBNull(2) ? null : reader.GetString(2), 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)) + CIntegerDatetimeOverride = reader.IsDBNull(5) ? (DateTime? )null : DateTimeOffset.FromUnixTimeSeconds(reader.GetInt32(5)).DateTime, + CTextBoolOverride = reader.IsDBNull(6) ? (bool? )null : Convert.ToBoolean(reader.GetString(6)), + CIntegerBoolOverride = reader.IsDBNull(7) ? (bool? )null : Convert.ToBoolean(reader.GetInt32(7)) }; } } @@ -992,7 +1004,7 @@ public async Task GetSqliteTypesCnt() public class GetSqliteFunctionsRow { public int? MaxInteger { get; set; } - public decimal MaxReal { get; set; } + public decimal? MaxReal { get; set; } public object MaxText { get; set; } }; public async Task GetSqliteFunctions() @@ -1011,7 +1023,7 @@ public async Task GetSqliteFunctions() return new GetSqliteFunctionsRow { MaxInteger = reader.IsDBNull(0) ? (int? )null : reader.GetInt32(0), - MaxReal = reader.GetDecimal(1), + MaxReal = reader.IsDBNull(1) ? (decimal? )null : reader.GetDecimal(1), MaxText = reader.IsDBNull(2) ? null : reader.GetValue(2) }; } @@ -1035,7 +1047,7 @@ public async Task GetSqliteFunctions() return new GetSqliteFunctionsRow { MaxInteger = reader.IsDBNull(0) ? (int? )null : reader.GetInt32(0), - MaxReal = reader.GetDecimal(1), + MaxReal = reader.IsDBNull(1) ? (decimal? )null : reader.GetDecimal(1), MaxText = reader.IsDBNull(2) ? null : reader.GetValue(2) }; } diff --git a/examples/SqliteLegacyExample/request.json b/examples/SqliteLegacyExample/request.json index f14042b2..9cbe112a 100644 --- a/examples/SqliteLegacyExample/request.json +++ b/examples/SqliteLegacyExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteLegacyExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJ1c2VEYXBwZXIiOmZhbHNlfQ==", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmcifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3JlYWwiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiZGVjaW1hbCJ9fSx7ImNvbHVtbiI6Iio6Y190ZXh0X2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUifX0seyJjb2x1bW4iOiIqOmNfdGV4dF9ib29sX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImJvb2wifX0seyJjb2x1bW4iOiIqOmNfaW50ZWdlcl9ib29sX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImJvb2wifX1dLCJ0YXJnZXRGcmFtZXdvcmsiOiJuZXRzdGFuZGFyZDIuMCIsInVzZURhcHBlciI6ZmFsc2V9", "process": { "cmd": "./dist/LocalRunner" } @@ -178,6 +178,26 @@ "type": { "name": "INTEGER" } + }, + { + "name": "c_text_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + } + }, + { + "name": "c_integer_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + } } ] } @@ -988,7 +1008,7 @@ "filename": "query.sql" }, { - "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 (?, ?, ?, ?, ?, ?)", + "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 c_text_bool_override,\n c_integer_bool_override\n) \nVALUES (?, ?, ?, ?, ?, ?, ?, ?)", "name": "InsertSqliteTypes", "cmd": ":exec", "parameters": [ @@ -1081,6 +1101,36 @@ }, "originalName": "c_integer_datetime_override" } + }, + { + "number": 7, + "column": { + "name": "c_text_bool_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_bool_override" + } + }, + { + "number": 8, + "column": { + "name": "c_integer_bool_override", + "length": -1, + "table": { + "schema": "main", + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "c_integer_bool_override" + } } ], "filename": "query.sql", @@ -1145,7 +1195,7 @@ } }, { - "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", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n c_text_datetime_override,\n c_integer_datetime_override,\n c_text_bool_override,\n c_integer_bool_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1207,10 +1257,35 @@ { "name": "c_integer_datetime_override", "length": -1, - "isFuncCall": true, + "table": { + "name": "types_sqlite" + }, "type": { - "name": "any" - } + "name": "INTEGER" + }, + "originalName": "c_integer_datetime_override" + }, + { + "name": "c_text_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "c_text_bool_override" + }, + { + "name": "c_integer_bool_override", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "c_integer_bool_override" } ], "filename": "query.sql" @@ -1316,5 +1391,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6ZmFsc2UsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6ZmFsc2UsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y190ZXh0X2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y19pbnRlZ2VyX2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y190ZXh0X2Jvb2xfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiYm9vbCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfaW50ZWdlcl9ib29sX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImJvb2wiLCJub3ROdWxsIjpmYWxzZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" } \ No newline at end of file diff --git a/examples/SqliteLegacyExample/request.message b/examples/SqliteLegacyExample/request.message index 98d354f7a30732afa00c58fdca0f089f61a6a7c4..1fc6e7318f64804e5cfc97b751f174d18da064e4 100644 GIT binary patch delta 610 zcmZ4PcFBjCtDSu!^Crg26SrwFO<|q*V9w+RitLjoGdcljzR8~%t-*W;C638HOjcm_ zTqZXtEzMbyT2T_8l%Jn7Ih#ouB+3fnC{5m|B*lU(4B;>_2Xaqh6Jp6t%*<2jWZN9a zY|F@Wih1)~7C%OQAxkci;NX-F$&H zRFHKeJJ&PD$qywZCp(K53+iww00FWwJ>rrO%h!slZayRal~GtLl7n3+6w@+UNqKE# z7sTh6r4|)srle{mac~I5VROP{SxNE93KHD>XwKWbL$a8WWj!0$iOKrXv6E+uOXG3b z<~z~_jLZpK(vuG=Nl)gJl>wPJd8wofzmh+uE5Sj+p^nv|N)cEcd4W}0vI@pa^;=1q*VCvMYVy2CQ@!5sd){1U&?oE#;qw8Wg^RGrDyj9wUGM;N{M z;Oa_>N`cCFnJ|@wG5N{El|hVCDyb|;RkBiYNi0bX$;?fiY{eYNJ&jd}B{wlMPpOx6 z^E75#My7L2o3FC?F>apEW+lkFm6dBH-)2u@B=b(vhrWIb6`RcNxcnm7Pj C$Ya$2 diff --git a/examples/config/sqlite/types/query.sql b/examples/config/sqlite/types/query.sql index 2f566c2d..04e19dff 100644 --- a/examples/config/sqlite/types/query.sql +++ b/examples/config/sqlite/types/query.sql @@ -6,9 +6,11 @@ INSERT INTO types_sqlite c_text, c_blob, c_text_datetime_override, - c_integer_datetime_override + c_integer_datetime_override, + c_text_bool_override, + c_integer_bool_override ) -VALUES (?, ?, ?, ?, ?, ?); +VALUES (?, ?, ?, ?, ?, ?, ?, ?); -- name: InsertSqliteTypesBatch :copyfrom INSERT INTO types_sqlite (c_integer, c_real, c_text) VALUES (?, ?, ?); @@ -20,8 +22,9 @@ SELECT c_text, c_blob, c_text_datetime_override, - datetime(c_integer_datetime_override, 'unixepoch') - AS c_integer_datetime_override + c_integer_datetime_override, + c_text_bool_override, + c_integer_bool_override FROM types_sqlite LIMIT 1; diff --git a/examples/config/sqlite/types/schema.sql b/examples/config/sqlite/types/schema.sql index f90f33e8..2a83a6a1 100644 --- a/examples/config/sqlite/types/schema.sql +++ b/examples/config/sqlite/types/schema.sql @@ -1,8 +1,10 @@ CREATE TABLE types_sqlite ( - 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 + c_integer INTEGER, + c_real REAL, + c_text TEXT, + c_blob BLOB, + c_text_datetime_override TEXT, + c_integer_datetime_override INTEGER, + c_text_bool_override TEXT, + c_integer_bool_override INTEGER +); diff --git a/sqlc.ci.yaml b/sqlc.ci.yaml index 878fa495..fc81c317 100644 --- a/sqlc.ci.yaml +++ b/sqlc.ci.yaml @@ -313,23 +313,24 @@ sql: - column: "GetSqliteFunctions:max_integer" csharp_type: type: "int" - notNull: false - column: "GetSqliteFunctions:max_varchar" csharp_type: type: "string" - notNull: false - column: "GetSqliteFunctions:max_real" 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 + - column: "*:c_text_bool_override" + csharp_type: + type: "bool" + - column: "*:c_integer_bool_override" + csharp_type: + type: "bool" - 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" @@ -345,23 +346,24 @@ sql: - column: "GetSqliteFunctions:max_integer" csharp_type: type: "int" - notNull: false - column: "GetSqliteFunctions:max_varchar" csharp_type: type: "string" - notNull: false - column: "GetSqliteFunctions:max_real" 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 + - column: "*:c_text_bool_override" + csharp_type: + type: "bool" + - column: "*:c_integer_bool_override" + csharp_type: + type: "bool" - 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" @@ -377,23 +379,24 @@ sql: - column: "GetSqliteFunctions:max_integer" csharp_type: type: "int" - notNull: false - column: "GetSqliteFunctions:max_varchar" csharp_type: type: "string" - notNull: false - column: "GetSqliteFunctions:max_real" 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 + - column: "*:c_text_bool_override" + csharp_type: + type: "bool" + - column: "*:c_integer_bool_override" + csharp_type: + type: "bool" - 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" @@ -409,20 +412,21 @@ sql: - column: "GetSqliteFunctions:max_integer" csharp_type: type: "int" - notNull: false - column: "GetSqliteFunctions:max_varchar" csharp_type: type: "string" - notNull: false - column: "GetSqliteFunctions:max_real" 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 + - column: "*:c_text_bool_override" + csharp_type: + type: "bool" + - column: "*:c_integer_bool_override" + csharp_type: + type: "bool" \ No newline at end of file diff --git a/sqlc.local.generated.yaml b/sqlc.local.generated.yaml index 5bcbae99..94603a55 100644 --- a/sqlc.local.generated.yaml +++ b/sqlc.local.generated.yaml @@ -310,23 +310,24 @@ sql: - column: "GetSqliteFunctions:max_integer" csharp_type: type: "int" - notNull: false - column: "GetSqliteFunctions:max_varchar" csharp_type: type: "string" - notNull: false - column: "GetSqliteFunctions:max_real" 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 + - column: "*:c_text_bool_override" + csharp_type: + type: "bool" + - column: "*:c_integer_bool_override" + csharp_type: + type: "bool" - 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" @@ -342,23 +343,24 @@ sql: - column: "GetSqliteFunctions:max_integer" csharp_type: type: "int" - notNull: false - column: "GetSqliteFunctions:max_varchar" csharp_type: type: "string" - notNull: false - column: "GetSqliteFunctions:max_real" 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 + - column: "*:c_text_bool_override" + csharp_type: + type: "bool" + - column: "*:c_integer_bool_override" + csharp_type: + type: "bool" - 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" @@ -374,23 +376,24 @@ sql: - column: "GetSqliteFunctions:max_integer" csharp_type: type: "int" - notNull: false - column: "GetSqliteFunctions:max_varchar" csharp_type: type: "string" - notNull: false - column: "GetSqliteFunctions:max_real" 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 + - column: "*:c_text_bool_override" + csharp_type: + type: "bool" + - column: "*:c_integer_bool_override" + csharp_type: + type: "bool" - 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" @@ -406,20 +409,21 @@ sql: - column: "GetSqliteFunctions:max_integer" csharp_type: type: "int" - notNull: false - column: "GetSqliteFunctions:max_varchar" csharp_type: type: "string" - notNull: false - column: "GetSqliteFunctions:max_real" 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 + - column: "*:c_text_bool_override" + csharp_type: + type: "bool" + - column: "*:c_integer_bool_override" + csharp_type: + type: "bool" diff --git a/sqlc.request.generated.yaml b/sqlc.request.generated.yaml index 3467598e..502a9147 100644 --- a/sqlc.request.generated.yaml +++ b/sqlc.request.generated.yaml @@ -318,23 +318,24 @@ sql: - column: "GetSqliteFunctions:max_integer" csharp_type: type: "int" - notNull: false - column: "GetSqliteFunctions:max_varchar" csharp_type: type: "string" - notNull: false - column: "GetSqliteFunctions:max_real" 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 + - column: "*:c_text_bool_override" + csharp_type: + type: "bool" + - column: "*:c_integer_bool_override" + csharp_type: + type: "bool" 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"] @@ -351,23 +352,24 @@ sql: - column: "GetSqliteFunctions:max_integer" csharp_type: type: "int" - notNull: false - column: "GetSqliteFunctions:max_varchar" csharp_type: type: "string" - notNull: false - column: "GetSqliteFunctions:max_real" 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 + - column: "*:c_text_bool_override" + csharp_type: + type: "bool" + - column: "*:c_integer_bool_override" + csharp_type: + type: "bool" 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"] @@ -384,23 +386,24 @@ sql: - column: "GetSqliteFunctions:max_integer" csharp_type: type: "int" - notNull: false - column: "GetSqliteFunctions:max_varchar" csharp_type: type: "string" - notNull: false - column: "GetSqliteFunctions:max_real" 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 + - column: "*:c_text_bool_override" + csharp_type: + type: "bool" + - column: "*:c_integer_bool_override" + csharp_type: + type: "bool" 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"] @@ -417,21 +420,22 @@ sql: - column: "GetSqliteFunctions:max_integer" csharp_type: type: "int" - notNull: false - column: "GetSqliteFunctions:max_varchar" csharp_type: type: "string" - notNull: false - column: "GetSqliteFunctions:max_real" 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 + - column: "*:c_text_bool_override" + csharp_type: + type: "bool" + - column: "*:c_integer_bool_override" + csharp_type: + type: "bool" debugRequest: true From adf7730685e4333bf4f199948f1704781e08c948 Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Thu, 2 Oct 2025 00:37:17 +0200 Subject: [PATCH 2/2] fix: remove redundant param for SqlMapper delegate --- Drivers/ColumnMapping.cs | 2 +- Drivers/DbDriver.cs | 2 +- Drivers/MySqlConnectorDriver.cs | 2 +- Drivers/NpgsqlDriver.cs | 4 ++-- Drivers/SqliteDriver.cs | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Drivers/ColumnMapping.cs b/Drivers/ColumnMapping.cs index 0dca3779..8878043c 100644 --- a/Drivers/ColumnMapping.cs +++ b/Drivers/ColumnMapping.cs @@ -10,7 +10,7 @@ public record DbTypeInfo(int? Length = null, string? NpgsqlTypeOverride = null); public delegate string ConvertFunc(string el); -public delegate string SqlMapperImplFunc(bool isDotnetCore, string? dbType); +public delegate string SqlMapperImplFunc(bool isDotnetCore); public class ColumnMapping( Dictionary dbTypes, diff --git a/Drivers/DbDriver.cs b/Drivers/DbDriver.cs index 60ae38e2..6a359104 100644 --- a/Drivers/DbDriver.cs +++ b/Drivers/DbDriver.cs @@ -187,7 +187,7 @@ private MemberDeclarationSyntax[] GetSqlMapperMemberDeclarations() { return [.. ColumnMappings .Where(m => TypeExistsInQueries(m.Key) && m.Value.SqlMapperImpl is not null) - .Select(m => ParseMemberDeclaration(m.Value.SqlMapperImpl!(Options.DotnetFramework.IsDotnetCore(), null))!)]; + .Select(m => ParseMemberDeclaration(m.Value.SqlMapperImpl!(Options.DotnetFramework.IsDotnetCore()))!)]; } public abstract string TransformQueryText(Query query); diff --git a/Drivers/MySqlConnectorDriver.cs b/Drivers/MySqlConnectorDriver.cs index 7c4f4e7e..2c05cb63 100644 --- a/Drivers/MySqlConnectorDriver.cs +++ b/Drivers/MySqlConnectorDriver.cs @@ -156,7 +156,7 @@ public sealed partial class MySqlConnectorDriver( public override string TransactionClassName => "MySqlTransaction"; - private static readonly SqlMapperImplFunc JsonElementTypeHandler = (_, _) => $$""" + private static readonly SqlMapperImplFunc JsonElementTypeHandler = _ => $$""" private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) diff --git a/Drivers/NpgsqlDriver.cs b/Drivers/NpgsqlDriver.cs index 93d97c84..ba01c162 100644 --- a/Drivers/NpgsqlDriver.cs +++ b/Drivers/NpgsqlDriver.cs @@ -344,7 +344,7 @@ public NpgsqlDriver( public override string TransactionClassName => "NpgsqlTransaction"; - private static readonly SqlMapperImplFunc JsonElementTypeHandler = (_, _) => $$""" + private static readonly SqlMapperImplFunc JsonElementTypeHandler = _ => $$""" private class JsonElementTypeHandler : SqlMapper.TypeHandler { public override JsonElement Parse(object value) @@ -361,7 +361,7 @@ public override void SetValue(IDbDataParameter parameter, JsonElement value) } """; - private static readonly SqlMapperImplFunc XmlDocumentTypeHandler = (isDotnetCore, _) => $$""" + private static readonly SqlMapperImplFunc XmlDocumentTypeHandler = isDotnetCore => $$""" private class XmlDocumentTypeHandler : SqlMapper.TypeHandler { public override XmlDocument Parse(object value) diff --git a/Drivers/SqliteDriver.cs b/Drivers/SqliteDriver.cs index 490814b2..e13a7775 100644 --- a/Drivers/SqliteDriver.cs +++ b/Drivers/SqliteDriver.cs @@ -95,7 +95,7 @@ public sealed partial class SqliteDriver( ) }; - private static readonly SqlMapperImplFunc DateTimeTypeHandler = (_, dbType) => $$""" + private static readonly SqlMapperImplFunc DateTimeTypeHandler = _ => $$""" private class DateTimeTypeHandler : SqlMapper.TypeHandler { public override DateTime Parse(object value)