Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 44 additions & 8 deletions Drivers/SqliteDriver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,38 +27,38 @@ public sealed partial class SqliteDriver(
{
{"blob", new()}
},
readerFn: (ordinal, _) => $"reader.GetFieldValue<byte[]>({ordinal})"
readerFn: (ordinal, _) => $"{Variable.Reader.AsVarName()}.GetFieldValue<byte[]>({ordinal})"
),
["string"] = new(
new()
{
{"text", new()}
},
readerFn: (ordinal, _) => $"reader.GetString({ordinal})"
readerFn: (ordinal, _) => $"{Variable.Reader.AsVarName()}.GetString({ordinal})"
),
["int"] = new(
new()
{
{ "integer", new() },
{ "integernotnulldefaultunixepoch", new() }
},
readerFn: (ordinal, _) => $"reader.GetInt32({ordinal})",
readerFn: (ordinal, _) => $"{Variable.Reader.AsVarName()}.GetInt32({ordinal})",
convertFunc: x => $"Convert.ToInt32({x})"
),
["decimal"] = new(
new()
{
{"real", new()}
},
readerFn: (ordinal, _) => $"reader.GetDecimal({ordinal})"
readerFn: (ordinal, _) => $"{Variable.Reader.AsVarName()}.GetDecimal({ordinal})"
),
["DateTime"] = new(
[],
readerFn: (ordinal, dbType) =>
{
if (IntegerDbTypes.Contains(dbType))
return $"DateTime.UnixEpoch.AddSeconds(reader.GetInt32({ordinal}))";
return $"DateTime.Parse(reader.GetString({ordinal}))";
if (IntegerDbTypes.Contains(dbType.ToLower()))
return $"DateTimeOffset.FromUnixTimeSeconds({Variable.Reader.AsVarName()}.GetInt32({ordinal})).DateTime";
return $"DateTime.Parse({Variable.Reader.AsVarName()}.GetString({ordinal}))";
},
writerFn: (el, dbType, notNull, isDapper, isLegacy) =>
{
Expand All @@ -67,17 +67,53 @@ public sealed partial class SqliteDriver(
if (IntegerDbTypes.Contains(dbType.ToLower()))
return $"{el} != null ? (int?) new DateTimeOffset({elWithOptionalNull}.ToUniversalTime()).ToUnixTimeSeconds() : {nullValue}";
return $"{el} != null ? {elWithOptionalNull}.ToString(\"{DateTimeStringFormat}\") : {nullValue}";
},
sqlMapper: "SqlMapper.AddTypeHandler(typeof(DateTime), new DateTimeTypeHandler());",
sqlMapperImpl: DateTimeTypeHandler
),
["bool"] = new(
[],
readerFn: (ordinal, dbType) =>
{
var getFunc = IntegerDbTypes.Contains(dbType.ToLower()) ? "GetInt32" : "GetString";
return $"Convert.ToBoolean({Variable.Reader.AsVarName()}.{getFunc}({ordinal}))";
},
writerFn: (el, dbType, notNull, isDapper, isLegacy) =>
{
var nullValue = isDapper ? "null" : "(object)DBNull.Value";
var optionalCast = notNull ? string.Empty : "(int?)";
var convertFunc = IntegerDbTypes.Contains(dbType.ToLower()) ? $"{optionalCast} Convert.ToInt32" : "Convert.ToString";
return $"{el} != null ? {convertFunc}({el}) : {nullValue}";
}
),
["object"] = new(
new()
{
{ "any", new() }
},
readerFn: (ordinal, _) => $"reader.GetValue({ordinal})"
readerFn: (ordinal, _) => $"{Variable.Reader.AsVarName()}.GetValue({ordinal})"
)
};

private static readonly SqlMapperImplFunc DateTimeTypeHandler = _ => $$"""
private class DateTimeTypeHandler : SqlMapper.TypeHandler<DateTime>
{
public override DateTime Parse(object value)
{
if (value is string s)
return DateTime.Parse(s);
if (value is long l)
return DateTimeOffset.FromUnixTimeSeconds(l).DateTime;
throw new DataException($"Cannot convert {value?.GetType()} to DateTime");
}

public override void SetValue(IDbDataParameter parameter, DateTime value)
{
parameter.Value = value;
}
}
""";

public override string TransactionClassName => "SqliteTransaction";

public override ISet<string> GetUsingDirectivesForQueries()
Expand Down
21 changes: 16 additions & 5 deletions end2end/EndToEndScaffold/Templates/SqliteTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,32 @@ public static class SqliteTests
{
Impl = $$"""
[Test]
[TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, "2020-01-01 14:15:16", "2025-01-01 17:18:19")]
[TestCase(null, null, null, new byte[] { }, null, null)]
[TestCase(null, null, null, null, null, null)]
[TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, true, false, "2020-01-01 14:15:16", "2025-01-01 17:18:19")]
[TestCase(null, null, null, new byte[] { }, null, null, null, null)]
[TestCase(null, null, null, null, null, null, null, null)]
public async Task TestSqliteTypes(
int? cInteger,
decimal? cReal,
string cText,
byte[] cBlob,
DateTime cTextDatetimeOverride,
bool? cTextBoolOverride,
bool? cIntegerBoolOverride,
DateTime? cTextDatetimeOverride,
DateTime? cIntegerDatetimeOverride)
{
if (cTextDatetimeOverride.HasValue && cTextDatetimeOverride.Value.Kind != DateTimeKind.Utc)
cTextDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride.Value, DateTimeKind.Utc);
if (cIntegerDatetimeOverride.HasValue && cIntegerDatetimeOverride.Value.Kind != DateTimeKind.Utc)
cIntegerDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride, DateTimeKind.Utc);
cIntegerDatetimeOverride = DateTime.SpecifyKind(cIntegerDatetimeOverride.Value, DateTimeKind.Utc);

await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs
{
CInteger = cInteger,
CReal = cReal,
CText = cText,
CBlob = cBlob,
CTextBoolOverride = cTextBoolOverride,
CIntegerBoolOverride = cIntegerBoolOverride,
CTextDatetimeOverride = cTextDatetimeOverride,
CIntegerDatetimeOverride = cIntegerDatetimeOverride
});
Expand All @@ -39,6 +46,8 @@ await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs
CReal = cReal,
CText = cText,
CBlob = cBlob,
CTextBoolOverride = cTextBoolOverride,
CIntegerBoolOverride = cIntegerBoolOverride,
CTextDatetimeOverride = cTextDatetimeOverride,
CIntegerDatetimeOverride = cIntegerDatetimeOverride
};
Expand All @@ -51,6 +60,8 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR
Assert.That(x.CReal, Is.EqualTo(y.CReal));
Assert.That(x.CText, Is.EqualTo(y.CText));
Assert.That(x.CBlob, Is.EqualTo(y.CBlob));
Assert.That(x.CTextBoolOverride, Is.EqualTo(y.CTextBoolOverride));
Assert.That(x.CIntegerBoolOverride, Is.EqualTo(y.CIntegerBoolOverride));
AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride);
AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride);
}
Expand Down
18 changes: 12 additions & 6 deletions end2end/EndToEndTests/SqliteDapperTester.generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -328,20 +328,24 @@ void AssertSingularEquals(QuerySql.GetAuthorByNamePatternRow x, QuerySql.GetAuth
}

[Test]
[TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, "2020-01-01 14:15:16", "2025-01-01 17:18:19")]
[TestCase(null, null, null, new byte[] { }, null, null)]
[TestCase(null, null, null, null, null, null)]
public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, DateTime cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride)
[TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, true, false, "2020-01-01 14:15:16", "2025-01-01 17:18:19")]
[TestCase(null, null, null, new byte[] { }, null, null, null, null)]
[TestCase(null, null, null, null, null, null, null, null)]
public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, bool? cTextBoolOverride, bool? cIntegerBoolOverride, DateTime? cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride)
{
if (cTextDatetimeOverride.HasValue && cTextDatetimeOverride.Value.Kind != DateTimeKind.Utc)
cTextDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride.Value, DateTimeKind.Utc);
if (cIntegerDatetimeOverride.HasValue && cIntegerDatetimeOverride.Value.Kind != DateTimeKind.Utc)
cIntegerDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride, DateTimeKind.Utc);
await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride });
cIntegerDatetimeOverride = DateTime.SpecifyKind(cIntegerDatetimeOverride.Value, DateTimeKind.Utc);
await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextBoolOverride = cTextBoolOverride, CIntegerBoolOverride = cIntegerBoolOverride, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride });
var expected = new QuerySql.GetSqliteTypesRow
{
CInteger = cInteger,
CReal = cReal,
CText = cText,
CBlob = cBlob,
CTextBoolOverride = cTextBoolOverride,
CIntegerBoolOverride = cIntegerBoolOverride,
CTextDatetimeOverride = cTextDatetimeOverride,
CIntegerDatetimeOverride = cIntegerDatetimeOverride
};
Expand All @@ -353,6 +357,8 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR
Assert.That(x.CReal, Is.EqualTo(y.CReal));
Assert.That(x.CText, Is.EqualTo(y.CText));
Assert.That(x.CBlob, Is.EqualTo(y.CBlob));
Assert.That(x.CTextBoolOverride, Is.EqualTo(y.CTextBoolOverride));
Assert.That(x.CIntegerBoolOverride, Is.EqualTo(y.CIntegerBoolOverride));
AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride);
AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride);
}
Expand Down
18 changes: 12 additions & 6 deletions end2end/EndToEndTests/SqliteTester.generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -328,20 +328,24 @@ void AssertSingularEquals(QuerySql.GetAuthorByNamePatternRow x, QuerySql.GetAuth
}

[Test]
[TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, "2020-01-01 14:15:16", "2025-01-01 17:18:19")]
[TestCase(null, null, null, new byte[] { }, null, null)]
[TestCase(null, null, null, null, null, null)]
public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, DateTime cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride)
[TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, true, false, "2020-01-01 14:15:16", "2025-01-01 17:18:19")]
[TestCase(null, null, null, new byte[] { }, null, null, null, null)]
[TestCase(null, null, null, null, null, null, null, null)]
public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, bool? cTextBoolOverride, bool? cIntegerBoolOverride, DateTime? cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride)
{
if (cTextDatetimeOverride.HasValue && cTextDatetimeOverride.Value.Kind != DateTimeKind.Utc)
cTextDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride.Value, DateTimeKind.Utc);
if (cIntegerDatetimeOverride.HasValue && cIntegerDatetimeOverride.Value.Kind != DateTimeKind.Utc)
cIntegerDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride, DateTimeKind.Utc);
await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride });
cIntegerDatetimeOverride = DateTime.SpecifyKind(cIntegerDatetimeOverride.Value, DateTimeKind.Utc);
await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextBoolOverride = cTextBoolOverride, CIntegerBoolOverride = cIntegerBoolOverride, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride });
var expected = new QuerySql.GetSqliteTypesRow
{
CInteger = cInteger,
CReal = cReal,
CText = cText,
CBlob = cBlob,
CTextBoolOverride = cTextBoolOverride,
CIntegerBoolOverride = cIntegerBoolOverride,
CTextDatetimeOverride = cTextDatetimeOverride,
CIntegerDatetimeOverride = cIntegerDatetimeOverride
};
Expand All @@ -353,6 +357,8 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR
Assert.That(x.CReal, Is.EqualTo(y.CReal));
Assert.That(x.CText, Is.EqualTo(y.CText));
Assert.That(x.CBlob, Is.EqualTo(y.CBlob));
Assert.That(x.CTextBoolOverride, Is.EqualTo(y.CTextBoolOverride));
Assert.That(x.CIntegerBoolOverride, Is.EqualTo(y.CIntegerBoolOverride));
AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride);
AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride);
}
Expand Down
18 changes: 12 additions & 6 deletions end2end/EndToEndTestsLegacy/SqliteDapperTester.generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -328,20 +328,24 @@ void AssertSingularEquals(QuerySql.GetAuthorByNamePatternRow x, QuerySql.GetAuth
}

[Test]
[TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, "2020-01-01 14:15:16", "2025-01-01 17:18:19")]
[TestCase(null, null, null, new byte[] { }, null, null)]
[TestCase(null, null, null, null, null, null)]
public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, DateTime cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride)
[TestCase(-54355, 9787.66, "Songs of Love and Hate", new byte[] { 0x15, 0x20, 0x33 }, true, false, "2020-01-01 14:15:16", "2025-01-01 17:18:19")]
[TestCase(null, null, null, new byte[] { }, null, null, null, null)]
[TestCase(null, null, null, null, null, null, null, null)]
public async Task TestSqliteTypes(int? cInteger, decimal? cReal, string cText, byte[] cBlob, bool? cTextBoolOverride, bool? cIntegerBoolOverride, DateTime? cTextDatetimeOverride, DateTime? cIntegerDatetimeOverride)
{
if (cTextDatetimeOverride.HasValue && cTextDatetimeOverride.Value.Kind != DateTimeKind.Utc)
cTextDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride.Value, DateTimeKind.Utc);
if (cIntegerDatetimeOverride.HasValue && cIntegerDatetimeOverride.Value.Kind != DateTimeKind.Utc)
cIntegerDatetimeOverride = DateTime.SpecifyKind(cTextDatetimeOverride, DateTimeKind.Utc);
await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride });
cIntegerDatetimeOverride = DateTime.SpecifyKind(cIntegerDatetimeOverride.Value, DateTimeKind.Utc);
await QuerySql.InsertSqliteTypes(new QuerySql.InsertSqliteTypesArgs { CInteger = cInteger, CReal = cReal, CText = cText, CBlob = cBlob, CTextBoolOverride = cTextBoolOverride, CIntegerBoolOverride = cIntegerBoolOverride, CTextDatetimeOverride = cTextDatetimeOverride, CIntegerDatetimeOverride = cIntegerDatetimeOverride });
var expected = new QuerySql.GetSqliteTypesRow
{
CInteger = cInteger,
CReal = cReal,
CText = cText,
CBlob = cBlob,
CTextBoolOverride = cTextBoolOverride,
CIntegerBoolOverride = cIntegerBoolOverride,
CTextDatetimeOverride = cTextDatetimeOverride,
CIntegerDatetimeOverride = cIntegerDatetimeOverride
};
Expand All @@ -353,6 +357,8 @@ void AssertSingularEquals(QuerySql.GetSqliteTypesRow x, QuerySql.GetSqliteTypesR
Assert.That(x.CReal, Is.EqualTo(y.CReal));
Assert.That(x.CText, Is.EqualTo(y.CText));
Assert.That(x.CBlob, Is.EqualTo(y.CBlob));
Assert.That(x.CTextBoolOverride, Is.EqualTo(y.CTextBoolOverride));
Assert.That(x.CIntegerBoolOverride, Is.EqualTo(y.CIntegerBoolOverride));
AssertDateTimeEquals(x.CTextDatetimeOverride, y.CTextDatetimeOverride);
AssertDateTimeEquals(x.CIntegerDatetimeOverride, y.CIntegerDatetimeOverride);
}
Expand Down
Loading
Loading