Skip to content

Commit 7712c7f

Browse files
feat: add option to override string to DateTime for Sqlite
1 parent d2f7883 commit 7712c7f

27 files changed

Lines changed: 439 additions & 37 deletions

Drivers/DbDriver.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,10 @@ protected bool CopyFromQueryExists()
257257
{
258258
if (query is null)
259259
return null;
260-
return Options.Overrides.FirstOrDefault(o =>
261-
o.Column == $"{query.Name}:{column.Name}" || o.Column == $"*:{column.Name}");
260+
foreach (var overrideOption in Options.Overrides)
261+
if (overrideOption.Column == $"{query.Name}:{column.Name}" || overrideOption.Column == $"*:{column.Name}")
262+
return overrideOption;
263+
return null;
262264
}
263265

264266
// If the column data type is overridden, we need to check for nulls in generated code

Drivers/SqliteDriver.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,30 +22,34 @@ public sealed partial class SqliteDriver(
2222
{
2323
{"blob", new()}
2424
},
25-
ordinal => $"reader.GetFieldValue<byte[]>({ordinal})"
25+
readerFn: ordinal => $"reader.GetFieldValue<byte[]>({ordinal})"
2626
),
2727
["string"] = new(
2828
new()
2929
{
3030
{"text", new()}
3131
},
32-
ordinal => $"reader.GetString({ordinal})"
32+
readerFn: ordinal => $"reader.GetString({ordinal})"
3333
),
3434
["int"] = new(
3535
new()
3636
{
3737
{ "integer", new() },
3838
{ "integernotnulldefaultunixepoch", new() }
3939
},
40-
ordinal => $"reader.GetInt32({ordinal})",
40+
readerFn: ordinal => $"reader.GetInt32({ordinal})",
4141
convertFunc: x => $"Convert.ToInt32({x})"
4242
),
4343
["decimal"] = new(
4444
new()
4545
{
4646
{"real", new()}
4747
},
48-
ordinal => $"reader.GetDecimal({ordinal})"
48+
readerFn: ordinal => $"reader.GetDecimal({ordinal})"
49+
),
50+
["DateTime"] = new(
51+
new() { },
52+
readerFn: ordinal => $"DateTime.Parse(reader.GetString({ordinal}))"
4953
),
5054
["object"] = new(
5155
new()

end2end/EndToEndScaffold/Templates/SqliteTests.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs
3232
CInteger = cInteger,
3333
CReal = cReal,
3434
CText = cText,
35-
CBlob = cBlob
35+
CBlob = cBlob,
36+
CreatedAt = DateTime.UtcNow,
37+
UpdatedAt = DateTime.UtcNow
3638
};
3739
var actual = await QuerySql.GetSqliteTypes();
3840
AssertSingularEquals(expected, actual{{Consts.UnknownRecordValuePlaceholder}});
@@ -43,6 +45,26 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR
4345
Assert.That(x.CReal, Is.EqualTo(y.CReal));
4446
Assert.That(x.CText, Is.EqualTo(y.CText));
4547
Assert.That(x.CBlob, Is.EqualTo(y.CBlob));
48+
AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt);
49+
AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt);
50+
}
51+
52+
void AssertDateTimeEquals(DateTime? x, DateTime? y)
53+
{
54+
if (x.HasValue)
55+
Assert.That(y.HasValue);
56+
else
57+
AssertDateTimeValueEquals(x.Value, y.Value);
58+
}
59+
60+
void AssertDateTimeValueEquals(DateTime x, DateTime y)
61+
{
62+
Assert.That(x.Year, Is.EqualTo(y.Year));
63+
Assert.That(x.Month, Is.EqualTo(y.Month));
64+
Assert.That(x.Day, Is.EqualTo(y.Day));
65+
Assert.That(x.Hour, Is.EqualTo(y.Hour));
66+
Assert.That(x.Minute, Is.EqualTo(y.Minute));
67+
Assert.That(x.Second, Is.EqualTo(y.Second));
4668
}
4769
}
4870
"""

end2end/EndToEndTests/SqliteDapperTester.generated.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,9 @@ public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, b
339339
CInteger = cInteger,
340340
CReal = cReal,
341341
CText = cText,
342-
CBlob = cBlob
342+
CBlob = cBlob,
343+
CreatedAt = DateTime.UtcNow,
344+
UpdatedAt = DateTime.UtcNow
343345
};
344346
var actual = await QuerySql.GetSqliteTypes();
345347
AssertSingularEquals(expected, actual);
@@ -349,6 +351,26 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR
349351
Assert.That(x.CReal, Is.EqualTo(y.CReal));
350352
Assert.That(x.CText, Is.EqualTo(y.CText));
351353
Assert.That(x.CBlob, Is.EqualTo(y.CBlob));
354+
AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt);
355+
AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt);
356+
}
357+
358+
void AssertDateTimeEquals(DateTime? x, DateTime? y)
359+
{
360+
if (x.HasValue)
361+
Assert.That(y.HasValue);
362+
else
363+
AssertDateTimeValueEquals(x.Value, y.Value);
364+
}
365+
366+
void AssertDateTimeValueEquals(DateTime x, DateTime y)
367+
{
368+
Assert.That(x.Year, Is.EqualTo(y.Year));
369+
Assert.That(x.Month, Is.EqualTo(y.Month));
370+
Assert.That(x.Day, Is.EqualTo(y.Day));
371+
Assert.That(x.Hour, Is.EqualTo(y.Hour));
372+
Assert.That(x.Minute, Is.EqualTo(y.Minute));
373+
Assert.That(x.Second, Is.EqualTo(y.Second));
352374
}
353375
}
354376

end2end/EndToEndTests/SqliteTester.generated.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,9 @@ public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, b
339339
CInteger = cInteger,
340340
CReal = cReal,
341341
CText = cText,
342-
CBlob = cBlob
342+
CBlob = cBlob,
343+
CreatedAt = DateTime.UtcNow,
344+
UpdatedAt = DateTime.UtcNow
343345
};
344346
var actual = await QuerySql.GetSqliteTypes();
345347
AssertSingularEquals(expected, actual.Value);
@@ -349,6 +351,26 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR
349351
Assert.That(x.CReal, Is.EqualTo(y.CReal));
350352
Assert.That(x.CText, Is.EqualTo(y.CText));
351353
Assert.That(x.CBlob, Is.EqualTo(y.CBlob));
354+
AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt);
355+
AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt);
356+
}
357+
358+
void AssertDateTimeEquals(DateTime? x, DateTime? y)
359+
{
360+
if (x.HasValue)
361+
Assert.That(y.HasValue);
362+
else
363+
AssertDateTimeValueEquals(x.Value, y.Value);
364+
}
365+
366+
void AssertDateTimeValueEquals(DateTime x, DateTime y)
367+
{
368+
Assert.That(x.Year, Is.EqualTo(y.Year));
369+
Assert.That(x.Month, Is.EqualTo(y.Month));
370+
Assert.That(x.Day, Is.EqualTo(y.Day));
371+
Assert.That(x.Hour, Is.EqualTo(y.Hour));
372+
Assert.That(x.Minute, Is.EqualTo(y.Minute));
373+
Assert.That(x.Second, Is.EqualTo(y.Second));
352374
}
353375
}
354376

end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,9 @@ public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, b
339339
CInteger = cInteger,
340340
CReal = cReal,
341341
CText = cText,
342-
CBlob = cBlob
342+
CBlob = cBlob,
343+
CreatedAt = DateTime.UtcNow,
344+
UpdatedAt = DateTime.UtcNow
343345
};
344346
var actual = await QuerySql.GetSqliteTypes();
345347
AssertSingularEquals(expected, actual);
@@ -349,6 +351,26 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR
349351
Assert.That(x.CReal, Is.EqualTo(y.CReal));
350352
Assert.That(x.CText, Is.EqualTo(y.CText));
351353
Assert.That(x.CBlob, Is.EqualTo(y.CBlob));
354+
AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt);
355+
AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt);
356+
}
357+
358+
void AssertDateTimeEquals(DateTime? x, DateTime? y)
359+
{
360+
if (x.HasValue)
361+
Assert.That(y.HasValue);
362+
else
363+
AssertDateTimeValueEquals(x.Value, y.Value);
364+
}
365+
366+
void AssertDateTimeValueEquals(DateTime x, DateTime y)
367+
{
368+
Assert.That(x.Year, Is.EqualTo(y.Year));
369+
Assert.That(x.Month, Is.EqualTo(y.Month));
370+
Assert.That(x.Day, Is.EqualTo(y.Day));
371+
Assert.That(x.Hour, Is.EqualTo(y.Hour));
372+
Assert.That(x.Minute, Is.EqualTo(y.Minute));
373+
Assert.That(x.Second, Is.EqualTo(y.Second));
352374
}
353375
}
354376

end2end/EndToEndTestsLegacy/SqliteTester.generated.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,9 @@ public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, b
339339
CInteger = cInteger,
340340
CReal = cReal,
341341
CText = cText,
342-
CBlob = cBlob
342+
CBlob = cBlob,
343+
CreatedAt = DateTime.UtcNow,
344+
UpdatedAt = DateTime.UtcNow
343345
};
344346
var actual = await QuerySql.GetSqliteTypes();
345347
AssertSingularEquals(expected, actual);
@@ -349,6 +351,26 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR
349351
Assert.That(x.CReal, Is.EqualTo(y.CReal));
350352
Assert.That(x.CText, Is.EqualTo(y.CText));
351353
Assert.That(x.CBlob, Is.EqualTo(y.CBlob));
354+
AssertDateTimeValueEquals(x.CreatedAt, y.CreatedAt);
355+
AssertDateTimeEquals(x.UpdatedAt, y.UpdatedAt);
356+
}
357+
358+
void AssertDateTimeEquals(DateTime? x, DateTime? y)
359+
{
360+
if (x.HasValue)
361+
Assert.That(y.HasValue);
362+
else
363+
AssertDateTimeValueEquals(x.Value, y.Value);
364+
}
365+
366+
void AssertDateTimeValueEquals(DateTime x, DateTime y)
367+
{
368+
Assert.That(x.Year, Is.EqualTo(y.Year));
369+
Assert.That(x.Month, Is.EqualTo(y.Month));
370+
Assert.That(x.Day, Is.EqualTo(y.Day));
371+
Assert.That(x.Hour, Is.EqualTo(y.Hour));
372+
Assert.That(x.Minute, Is.EqualTo(y.Minute));
373+
Assert.That(x.Second, Is.EqualTo(y.Second));
352374
}
353375
}
354376

examples/SqliteDapperExample/Models.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,6 @@ public class TypesSqlite
2121
public decimal? CReal { get; init; }
2222
public string? CText { get; init; }
2323
public byte[]? CBlob { get; init; }
24+
public string? CreatedAt { get; init; }
25+
public int? UpdatedAt { get; init; }
2426
};

examples/SqliteDapperExample/QuerySql.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -575,13 +575,15 @@ public async Task InsertSqliteTypesBatch(List<InsertSqliteTypesBatchArgs> args)
575575
}
576576
}
577577

578-
private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1";
578+
private const string GetSqliteTypesSql = "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1";
579579
public class GetSqliteTypesRow
580580
{
581581
public int? CInteger { get; init; }
582582
public decimal? CReal { get; init; }
583583
public string? CText { get; init; }
584584
public byte[]? CBlob { get; init; }
585+
public required DateTime CreatedAt { get; init; }
586+
public DateTime? UpdatedAt { get; init; }
585587
};
586588
public async Task<GetSqliteTypesRow?> GetSqliteTypes()
587589
{

examples/SqliteDapperExample/request.json

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"codegen": {
1414
"out": "examples/SqliteDapperExample",
1515
"plugin": "csharp",
16-
"options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19XSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwidXNlRGFwcGVyIjp0cnVlfQ==",
16+
"options": "eyJkZWJ1Z1JlcXVlc3QiOnRydWUsImdlbmVyYXRlQ3Nwcm9qIjp0cnVlLCJuYW1lc3BhY2VOYW1lIjoiU3FsaXRlRGFwcGVyRXhhbXBsZUdlbiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJpbnQifX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJub3ROdWxsIjpmYWxzZSwidHlwZSI6InN0cmluZyJ9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7Im5vdE51bGwiOnRydWUsInR5cGUiOiJkZWNpbWFsIn19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6dHJ1ZSwidHlwZSI6IkRhdGVUaW1lIn19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsibm90TnVsbCI6ZmFsc2UsInR5cGUiOiJEYXRlVGltZSJ9fV0sInRhcmdldEZyYW1ld29yayI6Im5ldDguMCIsInVzZURhcHBlciI6dHJ1ZX0=",
1717
"process": {
1818
"cmd": "./dist/LocalRunner"
1919
}
@@ -158,6 +158,26 @@
158158
"type": {
159159
"name": "BLOB"
160160
}
161+
},
162+
{
163+
"name": "created_at",
164+
"length": -1,
165+
"table": {
166+
"name": "types_sqlite"
167+
},
168+
"type": {
169+
"name": "TEXT"
170+
}
171+
},
172+
{
173+
"name": "updated_at",
174+
"length": -1,
175+
"table": {
176+
"name": "types_sqlite"
177+
},
178+
"type": {
179+
"name": "INTEGER"
180+
}
161181
}
162182
]
163183
}
@@ -1095,7 +1115,7 @@
10951115
}
10961116
},
10971117
{
1098-
"text": "SELECT c_integer, c_real, c_text, c_blob FROM types_sqlite LIMIT 1",
1118+
"text": "SELECT c_integer, c_real, c_text, c_blob, created_at, updated_at FROM types_sqlite LIMIT 1",
10991119
"name": "GetSqliteTypes",
11001120
"cmd": ":one",
11011121
"columns": [
@@ -1142,6 +1162,28 @@
11421162
"name": "BLOB"
11431163
},
11441164
"originalName": "c_blob"
1165+
},
1166+
{
1167+
"name": "created_at",
1168+
"length": -1,
1169+
"table": {
1170+
"name": "types_sqlite"
1171+
},
1172+
"type": {
1173+
"name": "TEXT"
1174+
},
1175+
"originalName": "created_at"
1176+
},
1177+
{
1178+
"name": "updated_at",
1179+
"length": -1,
1180+
"table": {
1181+
"name": "types_sqlite"
1182+
},
1183+
"type": {
1184+
"name": "INTEGER"
1185+
},
1186+
"originalName": "updated_at"
11451187
}
11461188
],
11471189
"filename": "query.sql"
@@ -1247,5 +1289,5 @@
12471289
}
12481290
],
12491291
"sqlc_version": "v1.30.0",
1250-
"plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZURhcHBlckV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOnRydWUsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19XSwiZGVidWdSZXF1ZXN0IjpmYWxzZX0="
1292+
"plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IlNxbGl0ZURhcHBlckV4YW1wbGVHZW4iLCJ1c2VEYXBwZXIiOnRydWUsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6W3siY29sdW1uIjoiR2V0U3FsaXRlRnVuY3Rpb25zOm1heF9pbnRlZ2VyIiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6ImludCIsIm5vdE51bGwiOmZhbHNlfX0seyJjb2x1bW4iOiJHZXRTcWxpdGVGdW5jdGlvbnM6bWF4X3ZhcmNoYXIiLCJjc2hhcnBfdHlwZSI6eyJ0eXBlIjoic3RyaW5nIiwibm90TnVsbCI6ZmFsc2V9fSx7ImNvbHVtbiI6IkdldFNxbGl0ZUZ1bmN0aW9uczptYXhfcmVhbCIsImNzaGFycF90eXBlIjp7InR5cGUiOiJkZWNpbWFsIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjpjcmVhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6dHJ1ZX19LHsiY29sdW1uIjoiKjp1cGRhdGVkX2F0IiwiY3NoYXJwX3R5cGUiOnsidHlwZSI6IkRhdGVUaW1lIiwibm90TnVsbCI6ZmFsc2V9fV0sImRlYnVnUmVxdWVzdCI6ZmFsc2V9"
12511293
}

0 commit comments

Comments
 (0)