Skip to content

Commit 3f473ad

Browse files
committed
v0.2.2
1 parent 84a823a commit 3f473ad

File tree

9 files changed

+285
-168
lines changed

9 files changed

+285
-168
lines changed

samples/MoviesAppSample/DataAccess/MovieDal.cs

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,19 @@
22
using System.Data.Common;
33
using System.Data.SQLite;
44
using System.Diagnostics;
5-
using System.Text;
65

76
namespace MoviesAppSample.DataAccess
87
{
9-
internal sealed class MovieDal : SQLiteDalBase
8+
internal sealed class MovieDal(Func<SQLiteDbConnection> createConnection) : SQLiteDalBase(createConnection)
109
{
11-
private static readonly string[] s_columns = { "Id", "Title", "Description", "DateReleased" };
10+
private static readonly string[] s_columns = ["Id", "Title", "Description", "DateReleased"];
1211

13-
private static readonly string[] s_updateColumns = { "Title", "Description", "DateReleased" };
14-
15-
public MovieDal(Func<SQLiteDbConnection> createConnection) : base(createConnection)
16-
{
17-
}
12+
private static readonly string[] s_updateColumns = ["Title", "Description", "DateReleased"];
1813

1914
#region Properties
2015

2116
protected override string[] Columns => s_columns;
17+
2218
protected override string TableName => "Movies";
2319

2420
#endregion
@@ -41,7 +37,7 @@ public ValueTask<bool> DeleteMovieAsync(SQLiteDbContext? context, long id, Cance
4137

4238
using var command = ctx.Connection.CreateCommandDelete(TableName, "WHERE Id=@Id",
4339
DbType.Int64.CreateInputParam("@Id", id));
44-
int affected = ctx.Connection.ExecuteNonQuery(command);
40+
int affected = ctx.Connection.ExecuteNonQuery(command, cancellationToken);
4541
return affected == 1;
4642
}, cancellationToken);
4743
}
@@ -65,7 +61,7 @@ public ValueTask<bool> DeleteMoviesAsync(SQLiteDbContext? context, IEnumerable<l
6561
{
6662
bool result = await personDal.DeleteMoviePersonsAsync(ctx, id, cancellationToken);
6763
command.Parameters["@Id"].Value = id;
68-
affected += ctx.Connection.ExecuteNonQuery(command);
64+
affected += ctx.Connection.ExecuteNonQuery(command, cancellationToken);
6965
}
7066
return affected > 0;
7167
}, cancellationToken);
@@ -80,14 +76,14 @@ public ValueTask<bool> DeleteMoviesAsync(SQLiteDbContext? context, IEnumerable<l
8076
using var command = ctx.Connection.CreateCommandSelect(TableName, Columns, "WHERE Id=@Id LIMIT 1",
8177
DbType.Int64.CreateInputParam("@Id", id));
8278
MovieDto? dto = null;
79+
int count = ctx.Connection.ExecuteReader(command, Read, cancellationToken);
80+
Debug.Assert(1 == count);
81+
return dto;
82+
8383
void Read(SQLiteDataReader reader)
8484
{
85-
cancellationToken.ThrowIfCancellationRequested();
8685
dto = ReadMovie(reader);
8786
}
88-
int count = ctx.Connection.ExecuteReader(command, Read);
89-
Debug.Assert(1 == count);
90-
return dto;
9187
}, cancellationToken);
9288
}
9389

@@ -98,14 +94,14 @@ public ValueTask<List<MovieDto>> LoadMoviesAsync(SQLiteDbContext? context, Cance
9894
{
9995
using var command = ctx.Connection.CreateCommandSelect(TableName, Columns, "ORDER BY DateReleased");
10096
var list = new List<MovieDto>();
97+
int count = ctx.Connection.ExecuteReader(command, Read, cancellationToken);
98+
Debug.Assert(list.Count == count);
99+
return list;
100+
101101
void Read(SQLiteDataReader reader)
102102
{
103-
cancellationToken.ThrowIfCancellationRequested();
104103
list.Add(ReadMovie(reader));
105104
}
106-
int count = ctx.Connection.ExecuteReader(command, Read);
107-
Debug.Assert(list.Count == count);
108-
return list;
109105
}, cancellationToken);
110106
}
111107

@@ -142,7 +138,7 @@ private static MovieDto ReadMovie(DbDataReader reader)
142138
}
143139
using (command)
144140
{
145-
int affected = ctx.Connection.ExecuteNonQuery(command);
141+
int affected = ctx.Connection.ExecuteNonQuery(command, cancellationToken);
146142
Debug.Assert(affected == 1);
147143
}
148144
if (dto.Id <= 0)

samples/MoviesAppSample/DataAccess/PersonDal.cs

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,17 @@
44

55
namespace MoviesAppSample.DataAccess
66
{
7-
internal sealed class PersonDal : SQLiteDalBase
7+
internal sealed class PersonDal(Func<SQLiteDbConnection> createConnection) : SQLiteDalBase(createConnection)
88
{
9-
private static readonly string[] s_columns = { "Id", "Name" };
9+
private static readonly string[] s_columns = ["Id", "Name"];
1010

11-
private static readonly string[] s_idColumns = { "Id" };
11+
private static readonly string[] s_idColumns = ["Id"];
1212

13-
private static readonly string[] s_updateColumns = { "Name" };
13+
private static readonly string[] s_updateColumns = ["Name"];
1414

15-
private static readonly string[] s_relationshipColumns = { "MovieId", "PersonId" };
15+
private static readonly string[] s_relationshipColumns = ["MovieId", "PersonId"];
1616

17-
private static readonly string[] s_relationshipTables = { "MovieCasts", "MovieDirectors", "MovieWriters" };
18-
19-
public PersonDal(Func<SQLiteDbConnection> createConnection) : base(createConnection)
20-
{
21-
}
17+
private static readonly string[] s_relationshipTables = ["MovieCasts", "MovieDirectors", "MovieWriters"];
2218

2319
#region Properties
2420

@@ -40,7 +36,7 @@ public ValueTask<bool> DeleteMoviePersonsAsync(SQLiteDbContext context, long mov
4036
{
4137
using var command = ctx.Connection.CreateCommandDelete(tableName, "WHERE MovieId=@MovieId",
4238
DbType.Int64.CreateInputParam("@MovieId", movieId));
43-
affected += ctx.Connection.ExecuteNonQuery(command);
39+
affected += ctx.Connection.ExecuteNonQuery(command, cancellationToken);
4440
}
4541
return affected > 0;
4642
}, cancellationToken);
@@ -78,13 +74,12 @@ private ValueTask<List<PersonDto>> LoadMoviePersonsAsync(SQLiteDbContext context
7874
var list = new List<PersonDto>();
7975
void Read(SQLiteDataReader reader)
8076
{
81-
cancellationToken.ThrowIfCancellationRequested();
8277
list.Add(new PersonDto(
8378
reader.GetInt64(0),
8479
reader.GetString(1)
8580
));
8681
}
87-
int count = ctx.Connection.ExecuteReader(command, Read);
82+
int count = ctx.Connection.ExecuteReader(command, Read, cancellationToken);
8883
Debug.Assert(list.Count == count);
8984
return list;
9085
}, cancellationToken);
@@ -119,7 +114,7 @@ private ValueTask<bool> SaveMoviePersonsAsync(SQLiteDbContext context, string ta
119114
cancellationToken.ThrowIfCancellationRequested();
120115
return TryExecuteInDbContextAsync(context, ctx =>
121116
{
122-
var (adapter, table) = ctx.Connection.SelectForUpdate(tableName, s_relationshipColumns, "WHERE MovieId=@MovieId", true,
117+
var (adapter, table) = ctx.Connection.SelectForUpdate(tableName, s_relationshipColumns, "WHERE MovieId=@MovieId", true, cancellationToken,
123118
DbType.Int64.CreateInputParam("@MovieId", movieId));
124119
//table.PrimaryKey = new[] { table.Columns["MovieId"], table.Columns["PersonId"] };
125120
using (adapter)
@@ -146,7 +141,7 @@ private ValueTask<bool> SaveMoviePersonsAsync(SQLiteDbContext context, string ta
146141
int num = 0;
147142
if (table.HasChanges())
148143
{
149-
num = ctx.Connection.Update(adapter, table);
144+
num = ctx.Connection.Update(adapter, table, cancellationToken);
150145
}
151146
table.ClearAndDispose();
152147
return num > 0;
@@ -176,11 +171,11 @@ public ValueTask<bool> SavePersonsAsync(SQLiteDbContext context, List<PersonDto>
176171
{
177172
var dto = dtos[i];
178173
commandInsert.Parameters["@Name"].Value = dto.Name;
179-
var id = ctx.Connection.ExecuteScalar(commandInsert);
174+
var id = ctx.Connection.ExecuteScalar(commandInsert, cancellationToken);
180175
if (id is null)//person alreasy exists
181176
{
182177
commandSelect.Parameters["@Name"].Value = dto.Name;
183-
id = ctx.Connection.ExecuteScalar(commandSelect);
178+
id = ctx.Connection.ExecuteScalar(commandSelect, cancellationToken);
184179
Debug.Assert(id is not null);
185180
}
186181
Debug.Assert(id is long);

samples/MoviesAppSample/Services/MoviesService.cs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,35 @@
66

77
namespace MoviesAppSample.Services
88
{
9-
internal class MoviesService
9+
internal class MoviesService(string dataBasePath)
1010
{
11-
private static readonly SQLiteDbConverter[] s_moviesConverters = { new MoviesConverter10(), new MoviesConverter11() };
12-
13-
public MoviesService(string dataBasePath)
14-
{
15-
DataBasePath = dataBasePath ?? throw new ArgumentNullException(nameof(dataBasePath));
16-
}
11+
private static readonly SQLiteDbConverter[] s_moviesConverters = [new MoviesConverter10(), new MoviesConverter11()
12+
];
1713

1814
#region Properties
1915

20-
public string DataBasePath { get; }
16+
public string DataBasePath { get; } = dataBasePath ?? throw new ArgumentNullException(nameof(dataBasePath));
2117

2218
#endregion
2319

2420
#region Methods
2521

22+
private SQLiteDbConnection CreateConnection() => new(GetMoviesConnectionString());
23+
2624
public async ValueTask<bool> DeleteMovieAsync(long movieId, CancellationToken cancellationToken)
2725
{
28-
SQLiteDbConnection CreateConnection() => new(GetMoviesConnectionString());
2926
using var movieDal = new MovieDal(CreateConnection);
3027
return await movieDal.DeleteMovieAsync(null, movieId, cancellationToken);
3128
}
3229

3330
public async ValueTask<bool> DeleteMoviesAsync(List<Movie> moviesToDelete, CancellationToken cancellationToken)
3431
{
35-
SQLiteDbConnection CreateConnection() => new(GetMoviesConnectionString());
3632
using var movieDal = new MovieDal(CreateConnection);
3733
return await movieDal.DeleteMoviesAsync(null, moviesToDelete.Select(m => m.Id), cancellationToken);
3834
}
3935

4036
public async ValueTask<List<Movie>> GetAllMoviesAsync(CancellationToken cancellationToken = default)
4137
{
42-
SQLiteDbConnection CreateConnection() => new(GetMoviesConnectionString());
4338
using var connection = CreateConnection();
4439

4540
return await connection.AcquireLockAsync(async () =>
@@ -91,14 +86,12 @@ private string GetMoviesConnectionString()
9186

9287
public ValueTask InitializeAsync(CancellationToken cancellationToken = default)
9388
{
94-
SQLiteDbConnection CreateConnection() => new(GetMoviesConnectionString());
9589
s_moviesConverters.Initialize(CreateConnection, cancellationToken);
9690
return default;
9791
}
9892

9993
public async ValueTask<bool> SaveMovieAsync(Movie movie, CancellationToken cancellationToken = default)
10094
{
101-
SQLiteDbConnection CreateConnection() => new(GetMoviesConnectionString());
10295
using var connection = CreateConnection();
10396

10497
return await connection.AcquireLockAsync(async () =>

src/NuExt.System.Data.SQLite.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ System.Data.SQLite.SQLiteDbConnection
1414
System.Data.SQLite.SQLiteDbContext
1515
System.Data.SQLite.SQLiteDbConverter
1616
System.Data.SQLite.SQLiteDbTransaction</Description>
17-
<Version>0.2.1</Version>
17+
<Version>0.2.2</Version>
1818
<RootNamespace />
1919
<GenerateDocumentationFile>True</GenerateDocumentationFile>
2020
<NoWarn>$(NoWarn);1591</NoWarn>
@@ -28,7 +28,7 @@ System.Data.SQLite.SQLiteDbTransaction</Description>
2828
</ItemGroup>
2929

3030
<ItemGroup Condition="'$(UseNuExtPackages)' == 'true'">
31-
<PackageReference Include="NuExt.System.Data" Version="0.2.1" />
31+
<PackageReference Include="NuExt.System.Data" Version="0.2.2" />
3232
</ItemGroup>
3333

3434
<ItemGroup Condition="'$(UseNuExtPackages)' == 'false'">

0 commit comments

Comments
 (0)