From 7712c7f92223a7bc69d5648840be1ec90294d239 Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Wed, 24 Sep 2025 21:50:47 +0200 Subject: [PATCH 1/5] feat: add option to override string to DateTime for Sqlite --- Drivers/DbDriver.cs | 6 ++- Drivers/SqliteDriver.cs | 12 +++-- .../EndToEndScaffold/Templates/SqliteTests.cs | 24 ++++++++- .../SqliteDapperTester.generated.cs | 24 ++++++++- .../EndToEndTests/SqliteTester.generated.cs | 24 ++++++++- .../SqliteDapperTester.generated.cs | 24 ++++++++- .../SqliteTester.generated.cs | 24 ++++++++- examples/SqliteDapperExample/Models.cs | 2 + examples/SqliteDapperExample/QuerySql.cs | 4 +- examples/SqliteDapperExample/request.json | 48 ++++++++++++++++-- examples/SqliteDapperExample/request.message | Bin 7906 -> 8458 bytes examples/SqliteDapperLegacyExample/Models.cs | 2 + .../SqliteDapperLegacyExample/QuerySql.cs | 4 +- .../SqliteDapperLegacyExample/request.json | 48 ++++++++++++++++-- .../SqliteDapperLegacyExample/request.message | Bin 7940 -> 8492 bytes examples/SqliteExample/Models.cs | 2 +- examples/SqliteExample/QuerySql.cs | 12 +++-- examples/SqliteExample/request.json | 48 ++++++++++++++++-- examples/SqliteExample/request.message | Bin 7890 -> 8442 bytes examples/SqliteLegacyExample/Models.cs | 2 + examples/SqliteLegacyExample/QuerySql.cs | 12 +++-- examples/SqliteLegacyExample/request.json | 48 ++++++++++++++++-- examples/SqliteLegacyExample/request.message | Bin 7924 -> 8476 bytes examples/config/sqlite/types/schema.sql | 10 ++-- sqlc.ci.yaml | 32 ++++++++++++ sqlc.local.generated.yaml | 32 ++++++++++++ sqlc.request.generated.yaml | 32 ++++++++++++ 27 files changed, 439 insertions(+), 37 deletions(-) diff --git a/Drivers/DbDriver.cs b/Drivers/DbDriver.cs index c96fecf6..0741b7ff 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 diff --git a/Drivers/SqliteDriver.cs b/Drivers/SqliteDriver.cs index 9997a8e1..7dd0b635 100644 --- a/Drivers/SqliteDriver.cs +++ b/Drivers/SqliteDriver.cs @@ -22,14 +22,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 +37,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,7 +45,11 @@ public sealed partial class SqliteDriver( { {"real", new()} }, - ordinal => $"reader.GetDecimal({ordinal})" + readerFn: ordinal => $"reader.GetDecimal({ordinal})" + ), + ["DateTime"] = new( + new() { }, + readerFn: ordinal => $"DateTime.Parse(reader.GetString({ordinal}))" ), ["object"] = new( new() diff --git a/end2end/EndToEndScaffold/Templates/SqliteTests.cs b/end2end/EndToEndScaffold/Templates/SqliteTests.cs index ae627b5e..b1e242e0 100644 --- a/end2end/EndToEndScaffold/Templates/SqliteTests.cs +++ b/end2end/EndToEndScaffold/Templates/SqliteTests.cs @@ -32,7 +32,9 @@ await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs CInteger = cInteger, CReal = cReal, CText = cText, - CBlob = cBlob + CBlob = cBlob, + CreatedAt = DateTime.UtcNow, + UpdatedAt = DateTime.UtcNow }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); @@ -43,6 +45,26 @@ 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)); + AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt); + AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt); + } + + void AssertDateTimeEquals(DateTime? x, DateTime? y) + { + if (x.HasValue) + Assert.That(y.HasValue); + else + AssertDateTimeValueEquals(x.Value, y.Value); + } + + void AssertDateTimeValueEquals(DateTime x, DateTime y) + { + Assert.That(x.Year, Is.EqualTo(y.Year)); + Assert.That(x.Month, Is.EqualTo(y.Month)); + Assert.That(x.Day, Is.EqualTo(y.Day)); + Assert.That(x.Hour, Is.EqualTo(y.Hour)); + Assert.That(x.Minute, Is.EqualTo(y.Minute)); + Assert.That(x.Second, Is.EqualTo(y.Second)); } } """ diff --git a/end2end/EndToEndTests/SqliteDapperTester.generated.cs b/end2end/EndToEndTests/SqliteDapperTester.generated.cs index a42aa61b..af910d86 100644 --- a/end2end/EndToEndTests/SqliteDapperTester.generated.cs +++ b/end2end/EndToEndTests/SqliteDapperTester.generated.cs @@ -339,7 +339,9 @@ public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, b CInteger = cInteger, CReal = cReal, CText = cText, - CBlob = cBlob + CBlob = cBlob, + CreatedAt = DateTime.UtcNow, + UpdatedAt = DateTime.UtcNow }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual); @@ -349,6 +351,26 @@ 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)); + AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt); + AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt); + } + + void AssertDateTimeEquals(DateTime? x, DateTime? y) + { + if (x.HasValue) + Assert.That(y.HasValue); + else + AssertDateTimeValueEquals(x.Value, y.Value); + } + + void AssertDateTimeValueEquals(DateTime x, DateTime y) + { + Assert.That(x.Year, Is.EqualTo(y.Year)); + Assert.That(x.Month, Is.EqualTo(y.Month)); + Assert.That(x.Day, Is.EqualTo(y.Day)); + Assert.That(x.Hour, Is.EqualTo(y.Hour)); + Assert.That(x.Minute, Is.EqualTo(y.Minute)); + Assert.That(x.Second, Is.EqualTo(y.Second)); } } diff --git a/end2end/EndToEndTests/SqliteTester.generated.cs b/end2end/EndToEndTests/SqliteTester.generated.cs index 61f62be7..cf10c43e 100644 --- a/end2end/EndToEndTests/SqliteTester.generated.cs +++ b/end2end/EndToEndTests/SqliteTester.generated.cs @@ -339,7 +339,9 @@ public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, b CInteger = cInteger, CReal = cReal, CText = cText, - CBlob = cBlob + CBlob = cBlob, + CreatedAt = DateTime.UtcNow, + UpdatedAt = DateTime.UtcNow }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual.Value); @@ -349,6 +351,26 @@ 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)); + AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt); + AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt); + } + + void AssertDateTimeEquals(DateTime? x, DateTime? y) + { + if (x.HasValue) + Assert.That(y.HasValue); + else + AssertDateTimeValueEquals(x.Value, y.Value); + } + + void AssertDateTimeValueEquals(DateTime x, DateTime y) + { + Assert.That(x.Year, Is.EqualTo(y.Year)); + Assert.That(x.Month, Is.EqualTo(y.Month)); + Assert.That(x.Day, Is.EqualTo(y.Day)); + Assert.That(x.Hour, Is.EqualTo(y.Hour)); + Assert.That(x.Minute, Is.EqualTo(y.Minute)); + Assert.That(x.Second, Is.EqualTo(y.Second)); } } diff --git a/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs b/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs index b71db001..14c452e3 100644 --- a/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs @@ -339,7 +339,9 @@ public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, b CInteger = cInteger, CReal = cReal, CText = cText, - CBlob = cBlob + CBlob = cBlob, + CreatedAt = DateTime.UtcNow, + UpdatedAt = DateTime.UtcNow }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual); @@ -349,6 +351,26 @@ 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)); + AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt); + AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt); + } + + void AssertDateTimeEquals(DateTime? x, DateTime? y) + { + if (x.HasValue) + Assert.That(y.HasValue); + else + AssertDateTimeValueEquals(x.Value, y.Value); + } + + void AssertDateTimeValueEquals(DateTime x, DateTime y) + { + Assert.That(x.Year, Is.EqualTo(y.Year)); + Assert.That(x.Month, Is.EqualTo(y.Month)); + Assert.That(x.Day, Is.EqualTo(y.Day)); + Assert.That(x.Hour, Is.EqualTo(y.Hour)); + Assert.That(x.Minute, Is.EqualTo(y.Minute)); + Assert.That(x.Second, Is.EqualTo(y.Second)); } } diff --git a/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs b/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs index 2e434715..463a3331 100644 --- a/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs @@ -339,7 +339,9 @@ public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, b CInteger = cInteger, CReal = cReal, CText = cText, - CBlob = cBlob + CBlob = cBlob, + CreatedAt = DateTime.UtcNow, + UpdatedAt = DateTime.UtcNow }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual); @@ -349,6 +351,26 @@ 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)); + AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt); + AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt); + } + + void AssertDateTimeEquals(DateTime? x, DateTime? y) + { + if (x.HasValue) + Assert.That(y.HasValue); + else + AssertDateTimeValueEquals(x.Value, y.Value); + } + + void AssertDateTimeValueEquals(DateTime x, DateTime y) + { + Assert.That(x.Year, Is.EqualTo(y.Year)); + Assert.That(x.Month, Is.EqualTo(y.Month)); + Assert.That(x.Day, Is.EqualTo(y.Day)); + Assert.That(x.Hour, Is.EqualTo(y.Hour)); + Assert.That(x.Minute, Is.EqualTo(y.Minute)); + Assert.That(x.Second, Is.EqualTo(y.Second)); } } diff --git a/examples/SqliteDapperExample/Models.cs b/examples/SqliteDapperExample/Models.cs index 8518a279..a82eea7a 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? CreatedAt { get; init; } + public int? UpdatedAt { get; init; } }; \ No newline at end of file diff --git a/examples/SqliteDapperExample/QuerySql.cs b/examples/SqliteDapperExample/QuerySql.cs index bcaeb84b..48d3beab 100644 --- a/examples/SqliteDapperExample/QuerySql.cs +++ b/examples/SqliteDapperExample/QuerySql.cs @@ -575,13 +575,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, created_at, updated_at 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 required DateTime CreatedAt { get; init; } + public DateTime? UpdatedAt { get; init; } }; public async Task GetSqliteTypes() { diff --git a/examples/SqliteDapperExample/request.json b/examples/SqliteDapperExample/request.json index 00fc2790..ec6cc5b1 100644 --- a/examples/SqliteDapperExample/request.json +++ b/examples/SqliteDapperExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteDapperExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwidXNlRGFwcGVyIjp0cnVlfQ==", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJEYXRlVGltZSJ9fV0sInRhcmdldEZyYW1ld29yayI6Im5ldDguMCIsInVzZURhcHBlciI6dHJ1ZX0=", "process": { "cmd": "./dist/LocalRunner" } @@ -158,6 +158,26 @@ "type": { "name": "BLOB" } + }, + { + "name": "created_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + } + }, + { + "name": "updated_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + } } ] } @@ -1095,7 +1115,7 @@ } }, { - "text": "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1", + "text": "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1142,6 +1162,28 @@ "name": "BLOB" }, "originalName": "c_blob" + }, + { + "name": "created_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "created_at" + }, + { + "name": "updated_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "updated_at" } ], "filename": "query.sql" @@ -1247,5 +1289,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZURhcHBlckV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOnRydWUsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZURhcHBlckV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOnRydWUsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fV0sImRlYnVnUmVxdWVzdCI6ZmFsc2V9" } \ No newline at end of file diff --git a/examples/SqliteDapperExample/request.message b/examples/SqliteDapperExample/request.message index d14c5beb20c84acf67d6dc602bf72ff71f7183be..8fd0307eb1a18a2611ffa48fc8729a0770d34878 100644 GIT binary patch delta 456 zcmaE4+vUW}wTx{d^CqTGEEBh@Gi_$s_#lr_LZ@0OIX|Z~H&4k*Ny{p^C^fMpH6=c= zWU>sChO!Hg6Ox&ms#IHxs;;yk1))xQ@;ydA9wfD~lO1GbC+9G!bA4wKV#!U+%u{-| zc`lP3Bhz}O$#6c?*hFB6x=WO**d$@95+ zHs54 zZf=AtN;dzL6k%q1#j=@Sb`PF_a*&fWf_q*^DKEdouQVq|$*QENG!;*{;nJ3tm{SbY Y7ptR`lA2VS9+X;Gnp#|KBk zvor%f0RqYalXL{i1saV43OJJ+3n7#15D&B11>_S1!U76HlfW4$vKkEmvx*xO0|L_n Mv!EWl0h99}7Z)@k^8f$< diff --git a/examples/SqliteDapperLegacyExample/Models.cs b/examples/SqliteDapperLegacyExample/Models.cs index ae820a09..608ef36b 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 CreatedAt { get; set; } + public int? UpdatedAt { get; set; } }; } \ No newline at end of file diff --git a/examples/SqliteDapperLegacyExample/QuerySql.cs b/examples/SqliteDapperLegacyExample/QuerySql.cs index 9a3db218..6d87750c 100644 --- a/examples/SqliteDapperLegacyExample/QuerySql.cs +++ b/examples/SqliteDapperLegacyExample/QuerySql.cs @@ -576,13 +576,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, created_at, updated_at 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 CreatedAt { get; set; } + public DateTime? UpdatedAt { get; set; } }; public async Task GetSqliteTypes() { diff --git a/examples/SqliteDapperLegacyExample/request.json b/examples/SqliteDapperLegacyExample/request.json index a005622b..ada7c1d2 100644 --- a/examples/SqliteDapperLegacyExample/request.json +++ b/examples/SqliteDapperLegacyExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteDapperLegacyExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJ1c2VEYXBwZXIiOnRydWV9", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJEYXRlVGltZSJ9fV0sInRhcmdldEZyYW1ld29yayI6Im5ldHN0YW5kYXJkMi4wIiwidXNlRGFwcGVyIjp0cnVlfQ==", "process": { "cmd": "./dist/LocalRunner" } @@ -158,6 +158,26 @@ "type": { "name": "BLOB" } + }, + { + "name": "created_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + } + }, + { + "name": "updated_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + } } ] } @@ -1095,7 +1115,7 @@ } }, { - "text": "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1", + "text": "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1142,6 +1162,28 @@ "name": "BLOB" }, "originalName": "c_blob" + }, + { + "name": "created_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "created_at" + }, + { + "name": "updated_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "updated_at" } ], "filename": "query.sql" @@ -1247,5 +1289,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6dHJ1ZSwib3ZlcnJpZGVEYXBwZXJWZXJzaW9uIjoiIiwib3ZlcnJpZGVzIjpbeyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiaW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9yZWFsIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImRlY2ltYWwiLCJub3ROdWxsIjp0cnVlfX1dLCJkZWJ1Z1JlcXVlc3QiOmZhbHNlfQ==" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6dHJ1ZSwib3ZlcnJpZGVEYXBwZXJWZXJzaW9uIjoiIiwib3ZlcnJpZGVzIjpbeyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiaW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9yZWFsIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImRlY2ltYWwiLCJub3ROdWxsIjp0cnVlfX0seyJjb2x1bW4iOiIqOmNyZWF0ZWRfYXQiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjp0cnVlfX0seyJjb2x1bW4iOiIqOnVwZGF0ZWRfYXQiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" } \ No newline at end of file diff --git a/examples/SqliteDapperLegacyExample/request.message b/examples/SqliteDapperLegacyExample/request.message index 6b7900259ff3b2bf0a7ee4fbab94addbc0afc714..01a28aa766a61e403a7349702b4f50484865e123 100644 GIT binary patch delta 425 zcmZp%TjRvcwTo>c^CqS?)`{D7nGUjSd{)9Jp;N7toS##go2O)@q-B*{l$uzQni8K_ zGWk5Cv_VNxX{wG=No7GQP}T(~6Ox&ms#IHxs;RUf1))ik1Ey|rI8y-EcNQU*+{Da0 zrFWY*GTAXQt!JA2k@*y#kUkd|l3jw*@&#qHlW$09Na!da%+OIlXxt>p%gCo>jc&zcd2v=rBx{xIu-V2_h2(_I zyiy{}Og~sQE6bk36IQ$BB#mI+R?<<*%P;XO&B;-+0)-!*&;n{hgjS=R@Z`60;sBr* Bj4c2F delta 128 zcmV-`0Du3iLWDj83Zn&)1F{0|1Ch5a0;&VC=5zs*@d8Z>k^~Y2ZDDC{B8js|13m!) z$^nyz1j+>(jRFcdlP?P)ldlX6v*`ur6AQuu3PMvwOhrRfAd?UmA+r=34FR*B8x#Wq i;RCa@9?Ah1T`VGGWny(_Qe|; 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, created_at, updated_at FROM types_sqlite LIMIT 1"; + public readonly record struct GetSqliteTypesRow(int? CInteger, decimal? CReal, string? CText, byte[]? CBlob, DateTime CreatedAt, DateTime? UpdatedAt); public async Task GetSqliteTypes() { if (this.Transaction == null) @@ -760,7 +760,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), + CreatedAt = DateTime.Parse(reader.GetString(4)), + UpdatedAt = reader.IsDBNull(5) ? null : DateTime.Parse(reader.GetString(5)) }; } } @@ -785,7 +787,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), + CreatedAt = DateTime.Parse(reader.GetString(4)), + UpdatedAt = reader.IsDBNull(5) ? null : DateTime.Parse(reader.GetString(5)) }; } } diff --git a/examples/SqliteExample/request.json b/examples/SqliteExample/request.json index 407c978c..fc41599f 100644 --- a/examples/SqliteExample/request.json +++ b/examples/SqliteExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwidXNlRGFwcGVyIjpmYWxzZX0=", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJEYXRlVGltZSJ9fV0sInRhcmdldEZyYW1ld29yayI6Im5ldDguMCIsInVzZURhcHBlciI6ZmFsc2V9", "process": { "cmd": "./dist/LocalRunner" } @@ -158,6 +158,26 @@ "type": { "name": "BLOB" } + }, + { + "name": "created_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + } + }, + { + "name": "updated_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + } } ] } @@ -1095,7 +1115,7 @@ } }, { - "text": "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1", + "text": "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1142,6 +1162,28 @@ "name": "BLOB" }, "originalName": "c_blob" + }, + { + "name": "created_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "created_at" + }, + { + "name": "updated_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "updated_at" } ], "filename": "query.sql" @@ -1247,5 +1289,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZUV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOmZhbHNlLCJvdmVycmlkZURhcHBlclZlcnNpb24iOiIiLCJvdmVycmlkZXMiOlt7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfaW50ZWdlciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJpbnQiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3JlYWwiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiZGVjaW1hbCIsIm5vdE51bGwiOnRydWV9fV0sImRlYnVnUmVxdWVzdCI6ZmFsc2V9" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZUV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOmZhbHNlLCJvdmVycmlkZURhcHBlclZlcnNpb24iOiIiLCJvdmVycmlkZXMiOlt7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfaW50ZWdlciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJpbnQiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3JlYWwiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiZGVjaW1hbCIsIm5vdE51bGwiOnRydWV9fSx7ImNvbHVtbiI6Iio6Y3JlYXRlZF9hdCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOnRydWV9fSx7ImNvbHVtbiI6Iio6dXBkYXRlZF9hdCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOmZhbHNlfX1dLCJkZWJ1Z1JlcXVlc3QiOmZhbHNlfQ==" } \ No newline at end of file diff --git a/examples/SqliteExample/request.message b/examples/SqliteExample/request.message index 8f7fa9fb783e9a008b799a1ef3421490b8aacb5b..523a8bf775127058d4337b0ff13af813e99b9a9c 100644 GIT binary patch delta 431 zcmca)`^%A;Yc|_N=1ok`Stf2*WLn3v@m2<-gif_ma(+%}Zl02rl9p9+QEFmIYD#=! z$z%a04P_S~CnPgBRjIZXRb6R83PPRq_Dr5!-&urMauYN2l-_Ng#AL_F zw4Q15CFWCnLi$`>NLI+R$WIby;S)0A;zBa;J+s>8IV_SQEZ3R2q9*T@(2&qkKxooY zKq%e(P=c3{Pstk7P*zDKdz9?Z&F85?vT*Y|NfBnIr!1RUWVho94+A+#BbXnRbd>V) tOZ-Z6a+It}ib_-Q1P?B4X^A<-Kz*?~N-3#HrRhPbg{7&*B}!HhaR9A-kcI#N delta 108 zcmV-y0F(dvLDD?~3WNob1F{0p1Ch5O0+$1^+Gqij*#brik^~Y2ZDDC{B8jsp13m!) z$^nyU1j+>(jRFcdlMo9blaLGyv&seM6AQuu3PMvwOhrRfAd~SHA+z-v4FR)%8x#Wq O&I7ZR9=8FL;~*EES0iBn diff --git a/examples/SqliteLegacyExample/Models.cs b/examples/SqliteLegacyExample/Models.cs index b27dbdf1..a0971a44 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 CreatedAt { get; set; } + public int? UpdatedAt { get; set; } }; } \ No newline at end of file diff --git a/examples/SqliteLegacyExample/QuerySql.cs b/examples/SqliteLegacyExample/QuerySql.cs index 2892f905..7ca7125f 100644 --- a/examples/SqliteLegacyExample/QuerySql.cs +++ b/examples/SqliteLegacyExample/QuerySql.cs @@ -853,13 +853,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, created_at, updated_at 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 CreatedAt { get; set; } + public DateTime? UpdatedAt { get; set; } }; public async Task GetSqliteTypes() { @@ -879,7 +881,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), + CreatedAt = DateTime.Parse(reader.GetString(4)), + UpdatedAt = reader.IsDBNull(5) ? (DateTime? )null : DateTime.Parse(reader.GetString(5)) }; } } @@ -904,7 +908,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), + CreatedAt = DateTime.Parse(reader.GetString(4)), + UpdatedAt = reader.IsDBNull(5) ? (DateTime? )null : DateTime.Parse(reader.GetString(5)) }; } } diff --git a/examples/SqliteLegacyExample/request.json b/examples/SqliteLegacyExample/request.json index 1de23ed5..7dd1f01b 100644 --- a/examples/SqliteLegacyExample/request.json +++ b/examples/SqliteLegacyExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteLegacyExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJ1c2VEYXBwZXIiOmZhbHNlfQ==", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJEYXRlVGltZSJ9fV0sInRhcmdldEZyYW1ld29yayI6Im5ldHN0YW5kYXJkMi4wIiwidXNlRGFwcGVyIjpmYWxzZX0=", "process": { "cmd": "./dist/LocalRunner" } @@ -158,6 +158,26 @@ "type": { "name": "BLOB" } + }, + { + "name": "created_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + } + }, + { + "name": "updated_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + } } ] } @@ -1095,7 +1115,7 @@ } }, { - "text": "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1", + "text": "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1142,6 +1162,28 @@ "name": "BLOB" }, "originalName": "c_blob" + }, + { + "name": "created_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "TEXT" + }, + "originalName": "created_at" + }, + { + "name": "updated_at", + "length": -1, + "table": { + "name": "types_sqlite" + }, + "type": { + "name": "INTEGER" + }, + "originalName": "updated_at" } ], "filename": "query.sql" @@ -1247,5 +1289,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6ZmFsc2UsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6ZmFsc2UsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fV0sImRlYnVnUmVxdWVzdCI6ZmFsc2V9" } \ No newline at end of file diff --git a/examples/SqliteLegacyExample/request.message b/examples/SqliteLegacyExample/request.message index fdef83c10b0ecc45c64e28f37f86711a8c81bbef..d0bf072c53fd44e5cdfbe20ed8fe1320489e355c 100644 GIT binary patch delta 395 zcmexjJI9HcYdzaU=1ok$Stf2*XWGNE@j)J=gif_ma(+%}Zl02rl9p9+QEFmIYD#=! z$z&NO4P_S~CnPgBRjIZXRb6R83PPRq;K95A($y_o{JzOx9ibAU5(I5wX>KBk zvpoYo0RqYalYIorv#bRf6a>No3PO{~87Q*}8Vv!HTNn$oo*M}R0^9?$sUF1v7hNnO XWMyJ?XHsQxb!BsOB06SaY;$FO#pWg= diff --git a/examples/config/sqlite/types/schema.sql b/examples/config/sqlite/types/schema.sql index f5f7e7d6..145a4202 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, + created_at TEXT DEFAULT (datetime('now')), + updated_at INTEGER DEFAULT (datetime('now')) ); diff --git a/sqlc.ci.yaml b/sqlc.ci.yaml index 63ddb063..86ed0149 100644 --- a/sqlc.ci.yaml +++ b/sqlc.ci.yaml @@ -322,6 +322,14 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:created_at" + csharp_type: + type: "DateTime" + notNull: true + - column: "*:updated_at" + 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: "*:created_at" + csharp_type: + type: "DateTime" + notNull: true + - column: "*:updated_at" + 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: "*:created_at" + csharp_type: + type: "DateTime" + notNull: true + - column: "*:updated_at" + 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: "*:created_at" + csharp_type: + type: "DateTime" + notNull: true + - column: "*:updated_at" + 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..cd4e387a 100644 --- a/sqlc.local.generated.yaml +++ b/sqlc.local.generated.yaml @@ -319,6 +319,14 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:created_at" + csharp_type: + type: "DateTime" + notNull: true + - column: "*:updated_at" + 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: "*:created_at" + csharp_type: + type: "DateTime" + notNull: true + - column: "*:updated_at" + 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: "*:created_at" + csharp_type: + type: "DateTime" + notNull: true + - column: "*:updated_at" + 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: "*:created_at" + csharp_type: + type: "DateTime" + notNull: true + - column: "*:updated_at" + csharp_type: + type: "DateTime" + notNull: false diff --git a/sqlc.request.generated.yaml b/sqlc.request.generated.yaml index 9c8049a3..1e301376 100644 --- a/sqlc.request.generated.yaml +++ b/sqlc.request.generated.yaml @@ -327,6 +327,14 @@ sql: csharp_type: type: "decimal" notNull: true + - column: "*:created_at" + csharp_type: + type: "DateTime" + notNull: true + - column: "*:updated_at" + 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: "*:created_at" + csharp_type: + type: "DateTime" + notNull: true + - column: "*:updated_at" + 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: "*:created_at" + csharp_type: + type: "DateTime" + notNull: true + - column: "*:updated_at" + 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: "*:created_at" + csharp_type: + type: "DateTime" + notNull: true + - column: "*:updated_at" + csharp_type: + type: "DateTime" + notNull: false debugRequest: true From e6180351e14f484ceaa8210628a7fe657b1d61c9 Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Wed, 24 Sep 2025 22:12:22 +0200 Subject: [PATCH 2/5] fix: add example of storing datetime value as Sqlite integer --- examples/SqliteDapperExample/QuerySql.cs | 6 +++--- examples/SqliteDapperExample/request.json | 15 ++++++--------- examples/SqliteDapperExample/request.message | Bin 8458 -> 8490 bytes .../SqliteDapperLegacyExample/QuerySql.cs | 6 +++--- .../SqliteDapperLegacyExample/request.json | 15 ++++++--------- .../SqliteDapperLegacyExample/request.message | Bin 8492 -> 8524 bytes examples/SqliteExample/QuerySql.cs | 6 +++--- examples/SqliteExample/request.json | 15 ++++++--------- examples/SqliteExample/request.message | Bin 8442 -> 8474 bytes examples/SqliteLegacyExample/QuerySql.cs | 6 +++--- examples/SqliteLegacyExample/request.json | 15 ++++++--------- examples/SqliteLegacyExample/request.message | Bin 8476 -> 8508 bytes examples/config/sqlite/types/query.sql | 18 +++++++++++++----- examples/config/sqlite/types/schema.sql | 4 ++-- 14 files changed, 51 insertions(+), 55 deletions(-) diff --git a/examples/SqliteDapperExample/QuerySql.cs b/examples/SqliteDapperExample/QuerySql.cs index 48d3beab..95352c3b 100644 --- a/examples/SqliteDapperExample/QuerySql.cs +++ b/examples/SqliteDapperExample/QuerySql.cs @@ -575,7 +575,7 @@ public async Task InsertSqliteTypesBatch(List args) } } - private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1"; + private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, created_at, datetime(updated_at, 'unixepoch') AS updated_at FROM types_sqlite LIMIT 1"; public class GetSqliteTypesRow { public int? CInteger { get; init; } @@ -601,7 +601,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; } @@ -626,7 +626,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 ec6cc5b1..3b6f1f99 100644 --- a/examples/SqliteDapperExample/request.json +++ b/examples/SqliteDapperExample/request.json @@ -1115,7 +1115,7 @@ } }, { - "text": "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n created_at,\n datetime(updated_at, 'unixepoch') AS updated_at\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1177,19 +1177,16 @@ { "name": "updated_at", "length": -1, - "table": { - "name": "types_sqlite" - }, + "isFuncCall": true, "type": { - "name": "INTEGER" - }, - "originalName": "updated_at" + "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": [ @@ -1250,7 +1247,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": [ diff --git a/examples/SqliteDapperExample/request.message b/examples/SqliteDapperExample/request.message index 8fd0307eb1a18a2611ffa48fc8729a0770d34878..dea1ff080eca67bc0a4fac38295b04c4225bfde1 100644 GIT binary patch delta 202 zcmeBjTIIB1k0i@?X0GXzXGz-!B^RY8mZYY{Czj}NDF8tVkXMqKo2pS-0AhkA6x2)e zGAmLG@{=>vH5D9#6%cY args) } } - private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1"; + private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, created_at, datetime(updated_at, 'unixepoch') AS updated_at FROM types_sqlite LIMIT 1"; public class GetSqliteTypesRow { public int? CInteger { get; set; } @@ -602,7 +602,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; } @@ -627,7 +627,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 ada7c1d2..0184ee9e 100644 --- a/examples/SqliteDapperLegacyExample/request.json +++ b/examples/SqliteDapperLegacyExample/request.json @@ -1115,7 +1115,7 @@ } }, { - "text": "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n created_at,\n datetime(updated_at, 'unixepoch') AS updated_at\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1177,19 +1177,16 @@ { "name": "updated_at", "length": -1, - "table": { - "name": "types_sqlite" - }, + "isFuncCall": true, "type": { - "name": "INTEGER" - }, - "originalName": "updated_at" + "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": [ @@ -1250,7 +1247,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": [ diff --git a/examples/SqliteDapperLegacyExample/request.message b/examples/SqliteDapperLegacyExample/request.message index 01a28aa766a61e403a7349702b4f50484865e123..42a1a2fa1b2a651aef36eddb292e5b649d5d97a1 100644 GIT binary patch delta 175 zcmZ4EbjE4J1xc3g%v{qauamY9N-j!GEJ;m?Pb|^lQUHP!Ag?4dH&vsw0K^1KD5#g_ zWmcpXgReraCG=1H9MshsR_8hR0KrWaAaRrdKd7Eq*GXO(jJKq2R delta 173 zcmX@(w8m+}1xfDf%v@2yu0F2LAqtZP#1*x56q1Wl6H8K4;uA}B6iN$Hplk)VAb($l zlFEYA;`rjioXnC`h0Uo_7L1H`ljli`Pv&J6oV=Emi>HbUp=I(uX@5Rv|4_dW4J}Ot z$6$rzyvc!5BAfMPQW%+i9U~@BlT}av(i+L}Kr3^=N^%n`z#JVe1t0)QZoVd4#tZ;H CEjGpg diff --git a/examples/SqliteExample/QuerySql.cs b/examples/SqliteExample/QuerySql.cs index aba1ab4c..1e444d7b 100644 --- a/examples/SqliteExample/QuerySql.cs +++ b/examples/SqliteExample/QuerySql.cs @@ -740,7 +740,7 @@ public async Task InsertSqliteTypesBatch(List args) } } - private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1"; + private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, created_at, datetime(updated_at, 'unixepoch') AS updated_at FROM types_sqlite LIMIT 1"; public readonly record struct GetSqliteTypesRow(int? CInteger, decimal? CReal, string? CText, byte[]? CBlob, DateTime CreatedAt, DateTime? UpdatedAt); public async Task GetSqliteTypes() { @@ -798,7 +798,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() { @@ -854,7 +854,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 fc41599f..be0bdc19 100644 --- a/examples/SqliteExample/request.json +++ b/examples/SqliteExample/request.json @@ -1115,7 +1115,7 @@ } }, { - "text": "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n created_at,\n datetime(updated_at, 'unixepoch') AS updated_at\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1177,19 +1177,16 @@ { "name": "updated_at", "length": -1, - "table": { - "name": "types_sqlite" - }, + "isFuncCall": true, "type": { - "name": "INTEGER" - }, - "originalName": "updated_at" + "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": [ @@ -1250,7 +1247,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": [ diff --git a/examples/SqliteExample/request.message b/examples/SqliteExample/request.message index 523a8bf775127058d4337b0ff13af813e99b9a9c..54f7bfe05bef77967e0735ae39b3e718a5937721 100644 GIT binary patch delta 154 zcmez6ILm3nMoE_M%v{qa_evH5D9#6%cYMoI4L%v@2yu0F2LAqtZ}iYaRAC?pr9CYGe8#3z>MD3lhYK-mgzLH@o9 zC6xuK#qq_3IhiG?3Y*=eEEpN>Cf7@gPp)N^=BeUBD4#rE+Mm_gKh!T|^JnQsMrL2f Vh{@%$3SfGctQ3geyj?b#8323oErb97 diff --git a/examples/SqliteLegacyExample/QuerySql.cs b/examples/SqliteLegacyExample/QuerySql.cs index 7ca7125f..2b9179f8 100644 --- a/examples/SqliteLegacyExample/QuerySql.cs +++ b/examples/SqliteLegacyExample/QuerySql.cs @@ -853,7 +853,7 @@ public async Task InsertSqliteTypesBatch(List args) } } - private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1"; + private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, created_at, datetime(updated_at, 'unixepoch') AS updated_at FROM types_sqlite LIMIT 1"; public class GetSqliteTypesRow { public int? CInteger { get; set; } @@ -919,7 +919,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; } @@ -982,7 +982,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 7dd1f01b..d41f94cf 100644 --- a/examples/SqliteLegacyExample/request.json +++ b/examples/SqliteLegacyExample/request.json @@ -1115,7 +1115,7 @@ } }, { - "text": "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1", + "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n created_at,\n datetime(updated_at, 'unixepoch') AS updated_at\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1177,19 +1177,16 @@ { "name": "updated_at", "length": -1, - "table": { - "name": "types_sqlite" - }, + "isFuncCall": true, "type": { - "name": "INTEGER" - }, - "originalName": "updated_at" + "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": [ @@ -1250,7 +1247,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": [ diff --git a/examples/SqliteLegacyExample/request.message b/examples/SqliteLegacyExample/request.message index d0bf072c53fd44e5cdfbe20ed8fe1320489e355c..b5dee346d2e40250283ca8253681d5372d1a208d 100644 GIT binary patch delta 145 zcmbQ^w8v?~QAw8X%v{qaFP65qOD;-HEJ;m?Pb|^lQUHP!Ag?4dH&vsw0K^1KD5#g_ zWmcpX Date: Thu, 25 Sep 2025 23:34:39 +0200 Subject: [PATCH 3/5] feat: add an option to override DateTime to Sqlite integer --- Drivers/ColumnMapping.cs | 5 +- Drivers/DbDriver.cs | 12 +- Drivers/Generators/CommonGen.cs | 4 +- Drivers/MySqlConnectorDriver.cs | 32 ++--- Drivers/NpgsqlDriver.cs | 113 +++++++++--------- Drivers/SqliteDriver.cs | 30 +++-- PluginOptions/DotnetFramework.cs | 5 + .../EndToEndScaffold/Templates/SqliteTests.cs | 50 ++++---- .../SqliteDapperTester.generated.cs | 45 ++++--- .../EndToEndTests/SqliteTester.generated.cs | 45 ++++--- .../SqliteDapperTester.generated.cs | 45 ++++--- .../SqliteTester.generated.cs | 45 ++++--- examples/SqliteDapperExample/Models.cs | 4 +- examples/SqliteDapperExample/QuerySql.cs | 12 +- examples/SqliteDapperExample/request.json | 48 ++++++-- examples/SqliteDapperExample/request.message | Bin 8490 -> 8947 bytes examples/SqliteDapperLegacyExample/Models.cs | 4 +- .../SqliteDapperLegacyExample/QuerySql.cs | 12 +- .../SqliteDapperLegacyExample/request.json | 48 ++++++-- .../SqliteDapperLegacyExample/request.message | Bin 8524 -> 8981 bytes examples/SqliteExample/Models.cs | 2 +- examples/SqliteExample/QuerySql.cs | 20 ++-- examples/SqliteExample/request.json | 48 ++++++-- examples/SqliteExample/request.message | Bin 8474 -> 8931 bytes examples/SqliteLegacyExample/Models.cs | 4 +- examples/SqliteLegacyExample/QuerySql.cs | 22 ++-- examples/SqliteLegacyExample/request.json | 48 ++++++-- examples/SqliteLegacyExample/request.message | Bin 8508 -> 8965 bytes examples/config/sqlite/types/query.sql | 16 ++- examples/config/sqlite/types/schema.sql | 14 +-- sqlc.ci.yaml | 24 ++-- sqlc.local.generated.yaml | 24 ++-- sqlc.request.generated.yaml | 24 ++-- 33 files changed, 485 insertions(+), 320 deletions(-) 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 0741b7ff..6a359104 100644 --- a/Drivers/DbDriver.cs +++ b/Drivers/DbDriver.cs @@ -339,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 7dd0b635..2bbcd12b 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,8 @@ public sealed partial class SqliteDriver( IList queries) : DbDriver(options, catalog, queries), IOne, IMany, IExec, IExecRows, IExecLastId, ICopyFrom { + private static readonly HashSet IntegerDbTypes = new() { "integer", "integernotnulldefaultunixepoch" }; + protected override Dictionary ColumnMappings { get; } = new() { @@ -22,14 +25,14 @@ public sealed partial class SqliteDriver( { {"blob", new()} }, - readerFn: ordinal => $"reader.GetFieldValue({ordinal})" + readerFn: (ordinal, _) => $"reader.GetFieldValue({ordinal})" ), ["string"] = new( new() { {"text", new()} }, - readerFn: ordinal => $"reader.GetString({ordinal})" + readerFn: (ordinal, _) => $"reader.GetString({ordinal})" ), ["int"] = new( new() @@ -37,7 +40,7 @@ public sealed partial class SqliteDriver( { "integer", new() }, { "integernotnulldefaultunixepoch", new() } }, - readerFn: ordinal => $"reader.GetInt32({ordinal})", + readerFn: (ordinal, _) => $"reader.GetInt32({ordinal})", convertFunc: x => $"Convert.ToInt32({x})" ), ["decimal"] = new( @@ -45,18 +48,31 @@ public sealed partial class SqliteDriver( { {"real", new()} }, - readerFn: ordinal => $"reader.GetDecimal({ordinal})" + readerFn: (ordinal, _) => $"reader.GetDecimal({ordinal})" ), ["DateTime"] = new( - new() { }, - readerFn: ordinal => $"DateTime.Parse(reader.GetString({ordinal}))" + [], + 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(\"yyyy-MM-dd HH:mm:ss\") : {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/end2end/EndToEndScaffold/Templates/SqliteTests.cs b/end2end/EndToEndScaffold/Templates/SqliteTests.cs index b1e242e0..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 @@ -33,8 +39,8 @@ await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs CReal = cReal, CText = cText, CBlob = cBlob, - CreatedAt = DateTime.UtcNow, - UpdatedAt = DateTime.UtcNow + CTextDatetimeOverride = cTextDatetimeOverride, + CIntegerDatetimeOverride = cIntegerDatetimeOverride }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}}); @@ -45,26 +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)); - AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt); - AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt); + AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); + AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); } void AssertDateTimeEquals(DateTime? x, DateTime? y) { - if (x.HasValue) - Assert.That(y.HasValue); - else - AssertDateTimeValueEquals(x.Value, y.Value); - } - - void AssertDateTimeValueEquals(DateTime x, DateTime y) - { - Assert.That(x.Year, Is.EqualTo(y.Year)); - Assert.That(x.Month, Is.EqualTo(y.Month)); - Assert.That(x.Day, Is.EqualTo(y.Day)); - Assert.That(x.Hour, Is.EqualTo(y.Hour)); - Assert.That(x.Minute, Is.EqualTo(y.Minute)); - Assert.That(x.Second, Is.EqualTo(y.Second)); + 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 af910d86..61967536 100644 --- a/end2end/EndToEndTests/SqliteDapperTester.generated.cs +++ b/end2end/EndToEndTests/SqliteDapperTester.generated.cs @@ -328,20 +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, - CreatedAt = DateTime.UtcNow, - UpdatedAt = DateTime.UtcNow + CTextDatetimeOverride = cTextDatetimeOverride, + CIntegerDatetimeOverride = cIntegerDatetimeOverride }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual); @@ -351,26 +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)); - AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt); - AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt); + AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); + AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); } void AssertDateTimeEquals(DateTime? x, DateTime? y) { - if (x.HasValue) - Assert.That(y.HasValue); - else - AssertDateTimeValueEquals(x.Value, y.Value); - } - - void AssertDateTimeValueEquals(DateTime x, DateTime y) - { - Assert.That(x.Year, Is.EqualTo(y.Year)); - Assert.That(x.Month, Is.EqualTo(y.Month)); - Assert.That(x.Day, Is.EqualTo(y.Day)); - Assert.That(x.Hour, Is.EqualTo(y.Hour)); - Assert.That(x.Minute, Is.EqualTo(y.Minute)); - Assert.That(x.Second, Is.EqualTo(y.Second)); + 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 cf10c43e..17aec6f6 100644 --- a/end2end/EndToEndTests/SqliteTester.generated.cs +++ b/end2end/EndToEndTests/SqliteTester.generated.cs @@ -328,20 +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, - CreatedAt = DateTime.UtcNow, - UpdatedAt = DateTime.UtcNow + CTextDatetimeOverride = cTextDatetimeOverride, + CIntegerDatetimeOverride = cIntegerDatetimeOverride }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual.Value); @@ -351,26 +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)); - AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt); - AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt); + AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); + AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); } void AssertDateTimeEquals(DateTime? x, DateTime? y) { - if (x.HasValue) - Assert.That(y.HasValue); - else - AssertDateTimeValueEquals(x.Value, y.Value); - } - - void AssertDateTimeValueEquals(DateTime x, DateTime y) - { - Assert.That(x.Year, Is.EqualTo(y.Year)); - Assert.That(x.Month, Is.EqualTo(y.Month)); - Assert.That(x.Day, Is.EqualTo(y.Day)); - Assert.That(x.Hour, Is.EqualTo(y.Hour)); - Assert.That(x.Minute, Is.EqualTo(y.Minute)); - Assert.That(x.Second, Is.EqualTo(y.Second)); + 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 14c452e3..586de9df 100644 --- a/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs @@ -328,20 +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, - CreatedAt = DateTime.UtcNow, - UpdatedAt = DateTime.UtcNow + CTextDatetimeOverride = cTextDatetimeOverride, + CIntegerDatetimeOverride = cIntegerDatetimeOverride }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual); @@ -351,26 +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)); - AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt); - AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt); + AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); + AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); } void AssertDateTimeEquals(DateTime? x, DateTime? y) { - if (x.HasValue) - Assert.That(y.HasValue); - else - AssertDateTimeValueEquals(x.Value, y.Value); - } - - void AssertDateTimeValueEquals(DateTime x, DateTime y) - { - Assert.That(x.Year, Is.EqualTo(y.Year)); - Assert.That(x.Month, Is.EqualTo(y.Month)); - Assert.That(x.Day, Is.EqualTo(y.Day)); - Assert.That(x.Hour, Is.EqualTo(y.Hour)); - Assert.That(x.Minute, Is.EqualTo(y.Minute)); - Assert.That(x.Second, Is.EqualTo(y.Second)); + 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 463a3331..0a16b355 100644 --- a/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs +++ b/end2end/EndToEndTestsLegacy/SqliteTester.generated.cs @@ -328,20 +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, - CreatedAt = DateTime.UtcNow, - UpdatedAt = DateTime.UtcNow + CTextDatetimeOverride = cTextDatetimeOverride, + CIntegerDatetimeOverride = cIntegerDatetimeOverride }; var actual = await QuerySql.GetSqliteTypes(); AssertSingularEquals(expected, actual); @@ -351,26 +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)); - AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt); - AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt); + AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride); + AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride); } void AssertDateTimeEquals(DateTime? x, DateTime? y) { - if (x.HasValue) - Assert.That(y.HasValue); - else - AssertDateTimeValueEquals(x.Value, y.Value); - } - - void AssertDateTimeValueEquals(DateTime x, DateTime y) - { - Assert.That(x.Year, Is.EqualTo(y.Year)); - Assert.That(x.Month, Is.EqualTo(y.Month)); - Assert.That(x.Day, Is.EqualTo(y.Day)); - Assert.That(x.Hour, Is.EqualTo(y.Hour)); - Assert.That(x.Minute, Is.EqualTo(y.Minute)); - Assert.That(x.Second, Is.EqualTo(y.Second)); + 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 a82eea7a..13186668 100644 --- a/examples/SqliteDapperExample/Models.cs +++ b/examples/SqliteDapperExample/Models.cs @@ -21,6 +21,6 @@ public class TypesSqlite public decimal? CReal { get; init; } public string? CText { get; init; } public byte[]? CBlob { get; init; } - public string? CreatedAt { get; init; } - public int? UpdatedAt { 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 95352c3b..0f812123 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,15 +579,15 @@ public async Task InsertSqliteTypesBatch(List args) } } - private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, created_at, datetime(updated_at, 'unixepoch') AS updated_at 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 required DateTime CreatedAt { get; init; } - public DateTime? UpdatedAt { get; init; } + public DateTime? CTextDatetimeOverride { get; init; } + public DateTime? CIntegerDatetimeOverride { get; init; } }; public async Task GetSqliteTypes() { diff --git a/examples/SqliteDapperExample/request.json b/examples/SqliteDapperExample/request.json index 3b6f1f99..fa822877 100644 --- a/examples/SqliteDapperExample/request.json +++ b/examples/SqliteDapperExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteDapperExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJEYXRlVGltZSJ9fV0sInRhcmdldEZyYW1ld29yayI6Im5ldDguMCIsInVzZURhcHBlciI6dHJ1ZX0=", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwidXNlRGFwcGVyIjp0cnVlfQ==", "process": { "cmd": "./dist/LocalRunner" } @@ -160,7 +160,7 @@ } }, { - "name": "created_at", + "name": "c_text_datetime_override", "length": -1, "table": { "name": "types_sqlite" @@ -170,7 +170,7 @@ } }, { - "name": "updated_at", + "name": "c_integer_datetime_override", "length": -1, "table": { "name": "types_sqlite" @@ -988,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(c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override) \nVALUES (?, ?, ?, ?, ?, ?)", "name": "InsertSqliteTypes", "cmd": ":exec", "parameters": [ @@ -1051,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", @@ -1115,7 +1145,7 @@ } }, { - "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n created_at,\n datetime(updated_at, 'unixepoch') AS updated_at\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 datetime(c_integer_datetime_override, 'unixepoch') AS c_integer_datetime_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1164,7 +1194,7 @@ "originalName": "c_blob" }, { - "name": "created_at", + "name": "c_text_datetime_override", "length": -1, "table": { "name": "types_sqlite" @@ -1172,10 +1202,10 @@ "type": { "name": "TEXT" }, - "originalName": "created_at" + "originalName": "c_text_datetime_override" }, { - "name": "updated_at", + "name": "c_integer_datetime_override", "length": -1, "isFuncCall": true, "type": { @@ -1286,5 +1316,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZURhcHBlckV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOnRydWUsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fV0sImRlYnVnUmVxdWVzdCI6ZmFsc2V9" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZURhcHBlckV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOnRydWUsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" } \ No newline at end of file diff --git a/examples/SqliteDapperExample/request.message b/examples/SqliteDapperExample/request.message index dea1ff080eca67bc0a4fac38295b04c4225bfde1..8b9ff758ece69d0ed7276b777a4da700b63052b6 100644 GIT binary patch delta 753 zcmZ4G^x2h(>)1r5%}kS6CvI0~yu9 iw=BNoqw&d`eEC>7!|YLvAb>@f1|DDQD5#g_WmcpX?}+`RFA9V2H^YGO%hN_=9;>ArcdUPcCdw; zsKccI1R#f$Wag%7Al#&*pkA7nS&>?hpPZqtso)r_0GFG*K~`k)S?S-r)>z!eDv9J? zB?V+>Znl@zU}k#7vN==XG;+W=DoRdHQ4*0WDJo5^t<|YkO3u$I&COG?Qqr=5TUs(1 LqD*@79VKx9WgUE5 diff --git a/examples/SqliteDapperLegacyExample/Models.cs b/examples/SqliteDapperLegacyExample/Models.cs index 608ef36b..ab4efc16 100644 --- a/examples/SqliteDapperLegacyExample/Models.cs +++ b/examples/SqliteDapperLegacyExample/Models.cs @@ -22,7 +22,7 @@ public class TypesSqlite public decimal? CReal { get; set; } public string CText { get; set; } public byte[] CBlob { get; set; } - public string CreatedAt { get; set; } - public int? UpdatedAt { 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 9983ec7f..445c79c1 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,15 +580,15 @@ public async Task InsertSqliteTypesBatch(List args) } } - private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, created_at, datetime(updated_at, 'unixepoch') AS updated_at 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 CreatedAt { get; set; } - public DateTime? UpdatedAt { get; set; } + public DateTime? CTextDatetimeOverride { get; set; } + public DateTime? CIntegerDatetimeOverride { get; set; } }; public async Task GetSqliteTypes() { diff --git a/examples/SqliteDapperLegacyExample/request.json b/examples/SqliteDapperLegacyExample/request.json index 0184ee9e..be8a2aac 100644 --- a/examples/SqliteDapperLegacyExample/request.json +++ b/examples/SqliteDapperLegacyExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteDapperLegacyExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJEYXRlVGltZSJ9fV0sInRhcmdldEZyYW1ld29yayI6Im5ldHN0YW5kYXJkMi4wIiwidXNlRGFwcGVyIjp0cnVlfQ==", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJ1c2VEYXBwZXIiOnRydWV9", "process": { "cmd": "./dist/LocalRunner" } @@ -160,7 +160,7 @@ } }, { - "name": "created_at", + "name": "c_text_datetime_override", "length": -1, "table": { "name": "types_sqlite" @@ -170,7 +170,7 @@ } }, { - "name": "updated_at", + "name": "c_integer_datetime_override", "length": -1, "table": { "name": "types_sqlite" @@ -988,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(c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override) \nVALUES (?, ?, ?, ?, ?, ?)", "name": "InsertSqliteTypes", "cmd": ":exec", "parameters": [ @@ -1051,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", @@ -1115,7 +1145,7 @@ } }, { - "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n created_at,\n datetime(updated_at, 'unixepoch') AS updated_at\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 datetime(c_integer_datetime_override, 'unixepoch') AS c_integer_datetime_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1164,7 +1194,7 @@ "originalName": "c_blob" }, { - "name": "created_at", + "name": "c_text_datetime_override", "length": -1, "table": { "name": "types_sqlite" @@ -1172,10 +1202,10 @@ "type": { "name": "TEXT" }, - "originalName": "created_at" + "originalName": "c_text_datetime_override" }, { - "name": "updated_at", + "name": "c_integer_datetime_override", "length": -1, "isFuncCall": true, "type": { @@ -1286,5 +1316,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6dHJ1ZSwib3ZlcnJpZGVEYXBwZXJWZXJzaW9uIjoiIiwib3ZlcnJpZGVzIjpbeyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiaW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9yZWFsIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImRlY2ltYWwiLCJub3ROdWxsIjp0cnVlfX0seyJjb2x1bW4iOiIqOmNyZWF0ZWRfYXQiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjp0cnVlfX0seyJjb2x1bW4iOiIqOnVwZGF0ZWRfYXQiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6dHJ1ZSwib3ZlcnJpZGVEYXBwZXJWZXJzaW9uIjoiIiwib3ZlcnJpZGVzIjpbeyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X2ludGVnZXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiaW50Iiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfdmFyY2hhciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJzdHJpbmciLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9yZWFsIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImRlY2ltYWwiLCJub3ROdWxsIjp0cnVlfX0seyJjb2x1bW4iOiIqOmNfdGV4dF9kYXRldGltZV9vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiIqOmNfaW50ZWdlcl9kYXRldGltZV9vdmVycmlkZSIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOmZhbHNlfX1dLCJkZWJ1Z1JlcXVlc3QiOmZhbHNlfQ==" } \ No newline at end of file diff --git a/examples/SqliteDapperLegacyExample/request.message b/examples/SqliteDapperLegacyExample/request.message index 42a1a2fa1b2a651aef36eddb292e5b649d5d97a1..f5f9e923684dc4975d86239106aadee3fa2fb9af 100644 GIT binary patch delta 718 zcmX@(G}VoX>()f3&5X+?Zqs9YxbbNVqj-EtYDGzWN@7WBNoHg4l` znv-WSNlGWjXXcfprl%I+RKq>_Ba<)pG*%&&+{Da0rC!#}p3Jt4jOQk|vz(E(<&sFo zWyM5RnaOgj9CFTF_-xrcku^b(bv7$kKjY-DVm9VF3b+ge$>4UZp}6Q~2XQq<1+7F5 zR-srt?)opG1aud>Z52+ZYh`h;38mq6_T>K(x-xkEl_rtJ$Z~~+>-gkz(hl`F0!fEU z0SI8xqk+eRItuEgd6^Zd1^LMt>Y56U!T3Uh%Pq*?SD~b`AhkHYxG*QPWOB09U+Hi> yfdYvvc1zrWqGX6SKsK+E)?j9u!Mgd1+)docj#1HM@=JLhSuHC(UY*RS=nViLzY6aF delta 336 zcmbR0cE*W`Yu7}k&5Ugmx9Kq+-1xMGk+Uc@u_QGmKCxtS1Cum!Nm1$K`Ao`Or3EPn zVUx*%%)Z>;S%g?}6EpLa-mz@XWVU5wTt9g^%NZVhF0N#l8Iu)RRe6lK5W0Z^vXgVA zxHf-dwGw3MW9AB)Y$|TUt*O8j=I9gZ8myqPd8fD*<0NUB&F3Wj7+JnEb4{PDAnjlW zGqFU6O92Q#jw#8^P1QiSOGiPyG%vFvwIDw^LtRtBF<1d1xA~kjA0v-7s>@U)s}L?N uQBpv5Ca;3x=3-e6W~Lu3n`;$rB8N(@lI~ args) } } - private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, created_at, datetime(updated_at, 'unixepoch') AS updated_at FROM types_sqlite LIMIT 1"; - public readonly record struct GetSqliteTypesRow(int? CInteger, decimal? CReal, string? CText, byte[]? CBlob, DateTime CreatedAt, DateTime? UpdatedAt); + 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) @@ -761,8 +765,8 @@ public async Task InsertSqliteTypesBatch(List args) CReal = reader.IsDBNull(1) ? null : reader.GetDecimal(1), CText = reader.IsDBNull(2) ? null : reader.GetString(2), CBlob = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), - CreatedAt = DateTime.Parse(reader.GetString(4)), - UpdatedAt = reader.IsDBNull(5) ? null : DateTime.Parse(reader.GetString(5)) + CTextDatetimeOverride = reader.IsDBNull(4) ? null : DateTime.Parse(reader.GetString(4)), + CIntegerDatetimeOverride = reader.IsDBNull(5) ? null : DateTime.Parse(reader.GetString(5)) }; } } @@ -788,8 +792,8 @@ public async Task InsertSqliteTypesBatch(List args) CReal = reader.IsDBNull(1) ? null : reader.GetDecimal(1), CText = reader.IsDBNull(2) ? null : reader.GetString(2), CBlob = reader.IsDBNull(3) ? null : reader.GetFieldValue(3), - CreatedAt = DateTime.Parse(reader.GetString(4)), - UpdatedAt = reader.IsDBNull(5) ? null : DateTime.Parse(reader.GetString(5)) + CTextDatetimeOverride = reader.IsDBNull(4) ? null : DateTime.Parse(reader.GetString(4)), + CIntegerDatetimeOverride = reader.IsDBNull(5) ? null : DateTime.Parse(reader.GetString(5)) }; } } diff --git a/examples/SqliteExample/request.json b/examples/SqliteExample/request.json index be0bdc19..cdd2830b 100644 --- a/examples/SqliteExample/request.json +++ b/examples/SqliteExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJEYXRlVGltZSJ9fV0sInRhcmdldEZyYW1ld29yayI6Im5ldDguMCIsInVzZURhcHBlciI6ZmFsc2V9", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwidXNlRGFwcGVyIjpmYWxzZX0=", "process": { "cmd": "./dist/LocalRunner" } @@ -160,7 +160,7 @@ } }, { - "name": "created_at", + "name": "c_text_datetime_override", "length": -1, "table": { "name": "types_sqlite" @@ -170,7 +170,7 @@ } }, { - "name": "updated_at", + "name": "c_integer_datetime_override", "length": -1, "table": { "name": "types_sqlite" @@ -988,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(c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override) \nVALUES (?, ?, ?, ?, ?, ?)", "name": "InsertSqliteTypes", "cmd": ":exec", "parameters": [ @@ -1051,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", @@ -1115,7 +1145,7 @@ } }, { - "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n created_at,\n datetime(updated_at, 'unixepoch') AS updated_at\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 datetime(c_integer_datetime_override, 'unixepoch') AS c_integer_datetime_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1164,7 +1194,7 @@ "originalName": "c_blob" }, { - "name": "created_at", + "name": "c_text_datetime_override", "length": -1, "table": { "name": "types_sqlite" @@ -1172,10 +1202,10 @@ "type": { "name": "TEXT" }, - "originalName": "created_at" + "originalName": "c_text_datetime_override" }, { - "name": "updated_at", + "name": "c_integer_datetime_override", "length": -1, "isFuncCall": true, "type": { @@ -1286,5 +1316,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZUV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOmZhbHNlLCJvdmVycmlkZURhcHBlclZlcnNpb24iOiIiLCJvdmVycmlkZXMiOlt7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfaW50ZWdlciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJpbnQiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3JlYWwiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiZGVjaW1hbCIsIm5vdE51bGwiOnRydWV9fSx7ImNvbHVtbiI6Iio6Y3JlYXRlZF9hdCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOnRydWV9fSx7ImNvbHVtbiI6Iio6dXBkYXRlZF9hdCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJEYXRlVGltZSIsIm5vdE51bGwiOmZhbHNlfX1dLCJkZWJ1Z1JlcXVlc3QiOmZhbHNlfQ==" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZUV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOmZhbHNlLCJvdmVycmlkZURhcHBlclZlcnNpb24iOiIiLCJvdmVycmlkZXMiOlt7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfaW50ZWdlciIsImNzaGFycF90eXBlIjp7InR5cGUiOiJpbnQiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF92YXJjaGFyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6InN0cmluZyIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3JlYWwiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiZGVjaW1hbCIsIm5vdE51bGwiOnRydWV9fSx7ImNvbHVtbiI6Iio6Y190ZXh0X2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6Iio6Y19pbnRlZ2VyX2RhdGV0aW1lX292ZXJyaWRlIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fV0sImRlYnVnUmVxdWVzdCI6ZmFsc2V9" } \ No newline at end of file diff --git a/examples/SqliteExample/request.message b/examples/SqliteExample/request.message index 54f7bfe05bef77967e0735ae39b3e718a5937721..33639aa31b7231c60ee71c28717c31646bbff157 100644 GIT binary patch delta 740 zcmbQ`^w^b&YxhK^%}njA6Spfep4)h{f>AuaB(J|(dvwInk)H9o&AwWugFC3Ug@ zll0^ROp=p(nfRoW<1_P0Qqxn5aH@;vp2jM~lAD;Br_{^3S&P}0k@4K*43;y}wp?`T(|LN1tVusYGO%hN_=9;WC13P$rG6*xk?LC5JJ+E zA27vpe`gV5$xY16Q+mg;*^Akhk#YUx4wf@K`dnPeF#VGo args) } } - private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, created_at, datetime(updated_at, 'unixepoch') AS updated_at 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 CreatedAt { get; set; } - public DateTime? UpdatedAt { get; set; } + public DateTime? CTextDatetimeOverride { get; set; } + public DateTime? CIntegerDatetimeOverride { get; set; } }; public async Task GetSqliteTypes() { @@ -882,8 +888,8 @@ public async Task GetSqliteTypes() 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), - CreatedAt = DateTime.Parse(reader.GetString(4)), - UpdatedAt = reader.IsDBNull(5) ? (DateTime? )null : DateTime.Parse(reader.GetString(5)) + CTextDatetimeOverride = reader.IsDBNull(4) ? (DateTime? )null : DateTime.Parse(reader.GetString(4)), + CIntegerDatetimeOverride = reader.IsDBNull(5) ? (DateTime? )null : DateTime.Parse(reader.GetString(5)) }; } } @@ -909,8 +915,8 @@ public async Task GetSqliteTypes() 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), - CreatedAt = DateTime.Parse(reader.GetString(4)), - UpdatedAt = reader.IsDBNull(5) ? (DateTime? )null : DateTime.Parse(reader.GetString(5)) + CTextDatetimeOverride = reader.IsDBNull(4) ? (DateTime? )null : DateTime.Parse(reader.GetString(4)), + CIntegerDatetimeOverride = reader.IsDBNull(5) ? (DateTime? )null : DateTime.Parse(reader.GetString(5)) }; } } diff --git a/examples/SqliteLegacyExample/request.json b/examples/SqliteLegacyExample/request.json index d41f94cf..5fba8e87 100644 --- a/examples/SqliteLegacyExample/request.json +++ b/examples/SqliteLegacyExample/request.json @@ -13,7 +13,7 @@ "codegen": { "out": "examples/SqliteLegacyExample", "plugin": "csharp", - "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJEYXRlVGltZSJ9fV0sInRhcmdldEZyYW1ld29yayI6Im5ldHN0YW5kYXJkMi4wIiwidXNlRGFwcGVyIjpmYWxzZX0=", + "options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6IkRhdGVUaW1lIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJ1c2VEYXBwZXIiOmZhbHNlfQ==", "process": { "cmd": "./dist/LocalRunner" } @@ -160,7 +160,7 @@ } }, { - "name": "created_at", + "name": "c_text_datetime_override", "length": -1, "table": { "name": "types_sqlite" @@ -170,7 +170,7 @@ } }, { - "name": "updated_at", + "name": "c_integer_datetime_override", "length": -1, "table": { "name": "types_sqlite" @@ -988,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(c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override) \nVALUES (?, ?, ?, ?, ?, ?)", "name": "InsertSqliteTypes", "cmd": ":exec", "parameters": [ @@ -1051,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", @@ -1115,7 +1145,7 @@ } }, { - "text": "SELECT\n c_integer,\n c_real,\n c_text,\n c_blob,\n created_at,\n datetime(updated_at, 'unixepoch') AS updated_at\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 datetime(c_integer_datetime_override, 'unixepoch') AS c_integer_datetime_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ @@ -1164,7 +1194,7 @@ "originalName": "c_blob" }, { - "name": "created_at", + "name": "c_text_datetime_override", "length": -1, "table": { "name": "types_sqlite" @@ -1172,10 +1202,10 @@ "type": { "name": "TEXT" }, - "originalName": "created_at" + "originalName": "c_text_datetime_override" }, { - "name": "updated_at", + "name": "c_integer_datetime_override", "length": -1, "isFuncCall": true, "type": { @@ -1286,5 +1316,5 @@ } ], "sqlc_version": "v1.30.0", - "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6ZmFsc2UsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fV0sImRlYnVnUmVxdWVzdCI6ZmFsc2V9" + "plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0c3RhbmRhcmQyLjAiLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlTGVnYWN5RXhhbXBsZUdlbiIsInVzZURhcHBlciI6ZmFsc2UsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjpjX3RleHRfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19LHsiY29sdW1uIjoiKjpjX2ludGVnZXJfZGF0ZXRpbWVfb3ZlcnJpZGUiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoiRGF0ZVRpbWUiLCJub3ROdWxsIjpmYWxzZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0=" } \ No newline at end of file diff --git a/examples/SqliteLegacyExample/request.message b/examples/SqliteLegacyExample/request.message index b5dee346d2e40250283ca8253681d5372d1a208d..da15d8b450f156a7a81ca558735246953210fc4f 100644 GIT binary patch delta 726 zcmdnv)au5>b$%k#W~SM!6Su1~-r0D+j!`_mB(J|(dvwInk)H9o&AwWugFC3W&f zCX>lCnfRoW<1_P0Qqxn5u&Qa|p2jM~lAD;Br_{^3*^b$kk@4K*8kRHCwp5zvb1a-I+fB+U}8hAXcqo7`zmsycoke{5PuBqS{j4yO1 z3(5#jj*|K<9gZg`Ad$yvfiozS4DklT=K0bZ%uJJ6H=mTdf;;tnR4|!*Q=Ugw%LvPFlYcRBPhP>q z$5mR8f{<$B{>~!AlAD;Br}U0xa~!iRBjftXb6C#s=yP!;!_1hRFQdXIWW6*M-l6W3zgyj(Jik>xux*YwFbvJQ4Ivr2Th z6o3Hagp$nMR1Jh{bQIJ}^D-+^3-XgQ)HM|xgB1{Rn-5F#G4fcWx=B?M;lvUp1!U)K k_K?+JX8O#sxk%v(a#+MF=}tCO5<&9F$?ufJ0seGt$N&HU diff --git a/examples/config/sqlite/types/query.sql b/examples/config/sqlite/types/query.sql index 20b1a872..2f566c2d 100644 --- a/examples/config/sqlite/types/query.sql +++ b/examples/config/sqlite/types/query.sql @@ -1,7 +1,14 @@ -- 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 (?, ?, ?); @@ -12,8 +19,9 @@ SELECT c_real, c_text, c_blob, - created_at, - datetime(updated_at, 'unixepoch') AS updated_at + c_text_datetime_override, + datetime(c_integer_datetime_override, 'unixepoch') + AS c_integer_datetime_override FROM types_sqlite LIMIT 1; diff --git a/examples/config/sqlite/types/schema.sql b/examples/config/sqlite/types/schema.sql index 62faf3cf..f90f33e8 100644 --- a/examples/config/sqlite/types/schema.sql +++ b/examples/config/sqlite/types/schema.sql @@ -1,8 +1,8 @@ CREATE TABLE types_sqlite ( - c_integer INTEGER, - c_real REAL, - c_text TEXT, - c_blob BLOB, - created_at TEXT DEFAULT (datetime('now')), - updated_at INTEGER DEFAULT (strftime('%s','now')) -); + 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 86ed0149..878fa495 100644 --- a/sqlc.ci.yaml +++ b/sqlc.ci.yaml @@ -322,11 +322,11 @@ sql: csharp_type: type: "decimal" notNull: true - - column: "*:created_at" + - column: "*:c_text_datetime_override" csharp_type: type: "DateTime" - notNull: true - - column: "*:updated_at" + notNull: false + - column: "*:c_integer_datetime_override" csharp_type: type: "DateTime" notNull: false @@ -354,11 +354,11 @@ sql: csharp_type: type: "decimal" notNull: true - - column: "*:created_at" + - column: "*:c_text_datetime_override" csharp_type: type: "DateTime" - notNull: true - - column: "*:updated_at" + notNull: false + - column: "*:c_integer_datetime_override" csharp_type: type: "DateTime" notNull: false @@ -386,11 +386,11 @@ sql: csharp_type: type: "decimal" notNull: true - - column: "*:created_at" + - column: "*:c_text_datetime_override" csharp_type: type: "DateTime" - notNull: true - - column: "*:updated_at" + notNull: false + - column: "*:c_integer_datetime_override" csharp_type: type: "DateTime" notNull: false @@ -418,11 +418,11 @@ sql: csharp_type: type: "decimal" notNull: true - - column: "*:created_at" + - column: "*:c_text_datetime_override" csharp_type: type: "DateTime" - notNull: true - - column: "*:updated_at" + 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 cd4e387a..5bcbae99 100644 --- a/sqlc.local.generated.yaml +++ b/sqlc.local.generated.yaml @@ -319,11 +319,11 @@ sql: csharp_type: type: "decimal" notNull: true - - column: "*:created_at" + - column: "*:c_text_datetime_override" csharp_type: type: "DateTime" - notNull: true - - column: "*:updated_at" + notNull: false + - column: "*:c_integer_datetime_override" csharp_type: type: "DateTime" notNull: false @@ -351,11 +351,11 @@ sql: csharp_type: type: "decimal" notNull: true - - column: "*:created_at" + - column: "*:c_text_datetime_override" csharp_type: type: "DateTime" - notNull: true - - column: "*:updated_at" + notNull: false + - column: "*:c_integer_datetime_override" csharp_type: type: "DateTime" notNull: false @@ -383,11 +383,11 @@ sql: csharp_type: type: "decimal" notNull: true - - column: "*:created_at" + - column: "*:c_text_datetime_override" csharp_type: type: "DateTime" - notNull: true - - column: "*:updated_at" + notNull: false + - column: "*:c_integer_datetime_override" csharp_type: type: "DateTime" notNull: false @@ -415,11 +415,11 @@ sql: csharp_type: type: "decimal" notNull: true - - column: "*:created_at" + - column: "*:c_text_datetime_override" csharp_type: type: "DateTime" - notNull: true - - column: "*:updated_at" + 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 1e301376..3467598e 100644 --- a/sqlc.request.generated.yaml +++ b/sqlc.request.generated.yaml @@ -327,11 +327,11 @@ sql: csharp_type: type: "decimal" notNull: true - - column: "*:created_at" + - column: "*:c_text_datetime_override" csharp_type: type: "DateTime" - notNull: true - - column: "*:updated_at" + notNull: false + - column: "*:c_integer_datetime_override" csharp_type: type: "DateTime" notNull: false @@ -360,11 +360,11 @@ sql: csharp_type: type: "decimal" notNull: true - - column: "*:created_at" + - column: "*:c_text_datetime_override" csharp_type: type: "DateTime" - notNull: true - - column: "*:updated_at" + notNull: false + - column: "*:c_integer_datetime_override" csharp_type: type: "DateTime" notNull: false @@ -393,11 +393,11 @@ sql: csharp_type: type: "decimal" notNull: true - - column: "*:created_at" + - column: "*:c_text_datetime_override" csharp_type: type: "DateTime" - notNull: true - - column: "*:updated_at" + notNull: false + - column: "*:c_integer_datetime_override" csharp_type: type: "DateTime" notNull: false @@ -426,11 +426,11 @@ sql: csharp_type: type: "decimal" notNull: true - - column: "*:created_at" + - column: "*:c_text_datetime_override" csharp_type: type: "DateTime" - notNull: true - - column: "*:updated_at" + notNull: false + - column: "*:c_integer_datetime_override" csharp_type: type: "DateTime" notNull: false From 66e7c6e3e67fb9876f263094e1ab1b4215ae80e3 Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Thu, 25 Sep 2025 23:40:13 +0200 Subject: [PATCH 4/5] fix: regenerate --- examples/SqliteDapperExample/QuerySql.cs | 2 +- examples/SqliteDapperExample/request.json | 4 ++-- examples/SqliteDapperExample/request.message | Bin 8947 -> 8981 bytes .../SqliteDapperLegacyExample/QuerySql.cs | 2 +- .../SqliteDapperLegacyExample/request.json | 4 ++-- .../SqliteDapperLegacyExample/request.message | Bin 8981 -> 9015 bytes examples/SqliteExample/QuerySql.cs | 2 +- examples/SqliteExample/request.json | 4 ++-- examples/SqliteExample/request.message | Bin 8931 -> 8965 bytes examples/SqliteLegacyExample/QuerySql.cs | 2 +- examples/SqliteLegacyExample/request.json | 4 ++-- examples/SqliteLegacyExample/request.message | Bin 8965 -> 8999 bytes 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/SqliteDapperExample/QuerySql.cs b/examples/SqliteDapperExample/QuerySql.cs index 0f812123..fea7c104 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 ) 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; } diff --git a/examples/SqliteDapperExample/request.json b/examples/SqliteDapperExample/request.json index fa822877..c6a11107 100644 --- a/examples/SqliteDapperExample/request.json +++ b/examples/SqliteDapperExample/request.json @@ -988,7 +988,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO types_sqlite \n(c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override) \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": [ @@ -1145,7 +1145,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') 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 datetime(c_integer_datetime_override, 'unixepoch')\n AS c_integer_datetime_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ diff --git a/examples/SqliteDapperExample/request.message b/examples/SqliteDapperExample/request.message index 8b9ff758ece69d0ed7276b777a4da700b63052b6..6bfed14c5b3e7377e9e3b1c0e2fd53c1f8fe3e11 100644 GIT binary patch delta 66 zcmezDI@N81j5y0yR<4zk6~tvGXUSSl_K}vIypUCzk!$l5@e*d1J1ku1C-X@6^KdCZ Pfn%@&NWtb^(w6K1rvDPy delta 68 zcmbR0_StoVj5y0|R<8cZ3gR-8KS@e*=_n+}C*|ZP=_pM8C?Ub9GkK!8%;t6CCCn^W YSh$W)R+H{$R&Wdkipp-jD{a9J00Vax1ONa4 diff --git a/examples/SqliteDapperLegacyExample/QuerySql.cs b/examples/SqliteDapperLegacyExample/QuerySql.cs index 445c79c1..49c65897 100644 --- a/examples/SqliteDapperLegacyExample/QuerySql.cs +++ b/examples/SqliteDapperLegacyExample/QuerySql.cs @@ -522,7 +522,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 ) 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; } diff --git a/examples/SqliteDapperLegacyExample/request.json b/examples/SqliteDapperLegacyExample/request.json index be8a2aac..228b58df 100644 --- a/examples/SqliteDapperLegacyExample/request.json +++ b/examples/SqliteDapperLegacyExample/request.json @@ -988,7 +988,7 @@ "filename": "query.sql" }, { - "text": "INSERT INTO types_sqlite \n(c_integer, c_real, c_text, c_blob, c_text_datetime_override, c_integer_datetime_override) \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": [ @@ -1145,7 +1145,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') 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 datetime(c_integer_datetime_override, 'unixepoch')\n AS c_integer_datetime_override\nFROM types_sqlite\nLIMIT 1", "name": "GetSqliteTypes", "cmd": ":one", "columns": [ diff --git a/examples/SqliteDapperLegacyExample/request.message b/examples/SqliteDapperLegacyExample/request.message index f5f9e923684dc4975d86239106aadee3fa2fb9af..e8aa55e84522141c157f9a7555e55f9e46329809 100644 GIT binary patch delta 82 zcmbR0w%u)mfw;m}R<4zdo_@iuK_LpBej)w}C6xuK#qq_3IhiG?3S1hK>trn_CrHaq iUaut0$hCQecnLGh9Tu+hlNF@q|;Aa&7JuFJWf6!@_lbGNW`q2bTf_Y@Q$;%nkrB1{dW3 delta 66 zcmZp5d+fSFP@Hu(D_1|`V*nOwN^-VpN!XP)U08cJUHs YmMbh=$0zGc_p>NC21A6ON;|Ow04DhslmGw# From 1421e67ea9850e75b62b837c9e6b28d3ea8f2bfa Mon Sep 17 00:00:00 2001 From: Ilan Uzan Date: Sat, 27 Sep 2025 16:10:09 +0200 Subject: [PATCH 5/5] fix: add doc for SQLite data types override --- Drivers/SqliteDriver.cs | 6 ++++-- docs/06_Sqlite.md | 11 +++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Drivers/SqliteDriver.cs b/Drivers/SqliteDriver.cs index 2bbcd12b..70c4b6fd 100644 --- a/Drivers/SqliteDriver.cs +++ b/Drivers/SqliteDriver.cs @@ -15,7 +15,9 @@ public sealed partial class SqliteDriver( IList queries) : DbDriver(options, catalog, queries), IOne, IMany, IExec, IExecRows, IExecLastId, ICopyFrom { - private static readonly HashSet IntegerDbTypes = new() { "integer", "integernotnulldefaultunixepoch" }; + 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() @@ -64,7 +66,7 @@ public sealed partial class SqliteDriver( 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(\"yyyy-MM-dd HH:mm:ss\") : {nullValue}"; + return $"{el} != null ? {elWithOptionalNull}.ToString(\"{DateTimeStringFormat}\") : {nullValue}"; } ), ["object"] = new( 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 | +