refactor!: rename the project from Monitor to MoShiro [CI]
ci/woodpecker/push/main-amd64-build Pipeline was successful
ci/woodpecker/push/main-amd64-build Pipeline was successful
Namespaces, assemblies, solution, binaries, images, systemd units, config paths, environment variables, protocol methods and the Linux user are all renamed. Breaking: existing databases, node identities and installed units must be recreated.
This commit is contained in:
1 parent
27ac7fb787
commit
2e146d4da7
309 files changed
+1565
-1572
No files matched your search
@@ -0,0 +1,59 @@
|
||||
using Microsoft.Data.Sqlite;
|
||||
|
||||
namespace MoShiro.Backend.Storage.Sqlite;
|
||||
|
||||
/// <summary>手写的参数化 SQL 的小帮手:禁止字符串拼接值,所有值都经过参数。</summary>
|
||||
internal static class Sql
|
||||
{
|
||||
public static SqliteCommand Cmd(this SqliteConnection connection, string sql, params (string Name, object? Value)[] parameters)
|
||||
{
|
||||
SqliteCommand command = connection.CreateCommand();
|
||||
command.CommandText = sql;
|
||||
foreach ((string name, object? value) in parameters)
|
||||
{
|
||||
command.Parameters.AddWithValue(name, value ?? DBNull.Value);
|
||||
}
|
||||
|
||||
return command;
|
||||
}
|
||||
|
||||
public static int Exec(this SqliteConnection connection, string sql, params (string Name, object? Value)[] parameters)
|
||||
{
|
||||
using SqliteCommand command = connection.Cmd(sql, parameters);
|
||||
return command.ExecuteNonQuery();
|
||||
}
|
||||
|
||||
public static T? Scalar<T>(this SqliteConnection connection, string sql, params (string Name, object? Value)[] parameters)
|
||||
{
|
||||
using SqliteCommand command = connection.Cmd(sql, parameters);
|
||||
object? value = command.ExecuteScalar();
|
||||
return value is null or DBNull ? default : (T)Convert.ChangeType(value, Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T), System.Globalization.CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
public static List<T> Query<T>(this SqliteConnection connection, string sql, Func<SqliteDataReader, T> map, params (string Name, object? Value)[] parameters)
|
||||
{
|
||||
using SqliteCommand command = connection.Cmd(sql, parameters);
|
||||
using SqliteDataReader reader = command.ExecuteReader();
|
||||
var rows = new List<T>();
|
||||
while (reader.Read())
|
||||
{
|
||||
rows.Add(map(reader));
|
||||
}
|
||||
|
||||
return rows;
|
||||
}
|
||||
|
||||
public static T? QueryOne<T>(this SqliteConnection connection, string sql, Func<SqliteDataReader, T> map, params (string Name, object? Value)[] parameters)
|
||||
where T : class
|
||||
{
|
||||
using SqliteCommand command = connection.Cmd(sql, parameters);
|
||||
using SqliteDataReader reader = command.ExecuteReader();
|
||||
return reader.Read() ? map(reader) : null;
|
||||
}
|
||||
|
||||
public static long? NullableLong(this SqliteDataReader reader, int ordinal) => reader.IsDBNull(ordinal) ? null : reader.GetInt64(ordinal);
|
||||
|
||||
public static string? NullableString(this SqliteDataReader reader, int ordinal) => reader.IsDBNull(ordinal) ? null : reader.GetString(ordinal);
|
||||
|
||||
public static byte[] Bytes(this SqliteDataReader reader, int ordinal) => (byte[])reader.GetValue(ordinal);
|
||||
}
|
||||
Reference in new issue
Block a user