aboutsummaryrefslogtreecommitdiff
path: root/lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs
diff options
context:
space:
mode:
authorLibravatar vnugent <public@vaughnnugent.com>2023-08-28 21:51:11 -0400
committerLibravatar vnugent <public@vaughnnugent.com>2023-08-28 21:51:11 -0400
commitc68c7762ce9023af8b65ce58adee167fc9788ee1 (patch)
tree7fd1e335200e6872d3811b7a18ce81fd4d93d8f1 /lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs
parent9af5ea65f177bc3fa6e96ecc732251adf5482bfa (diff)
big data updates, secret file support,
Diffstat (limited to 'lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs')
-rw-r--r--lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs84
1 files changed, 64 insertions, 20 deletions
diff --git a/lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs b/lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs
index e06ac43..cbb9799 100644
--- a/lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs
+++ b/lib/VNLib.Plugins.Extensions.Data/src/TransactionalDbContext.cs
@@ -23,24 +23,31 @@
*/
using System;
+using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
+using VNLib.Utils;
+using VNLib.Plugins.Extensions.Data.Abstractions;
+
+
namespace VNLib.Plugins.Extensions.Data
{
/// <summary>
/// Abstract implementation of <see cref="ITransactionalDbContext"/> that provides a transactional context for database operations
/// </summary>
- public abstract class TransactionalDbContext : DbContext, IAsyncDisposable, ITransactionalDbContext
+ public abstract class TransactionalDbContext : DbContext, IAsyncDisposable, ITransactionalDbContext, IDbContextHandle
{
/// <summary>
/// <inheritdoc/>
/// </summary>
protected TransactionalDbContext()
{ }
+
/// <summary>
/// <inheritdoc/>
/// </summary>
@@ -50,46 +57,83 @@ namespace VNLib.Plugins.Extensions.Data
///<inheritdoc/>
public IDbContextTransaction? Transaction { get; set; }
+ ///<inheritdoc/>
+ public async Task OpenTransactionAsync(CancellationToken cancellationToken = default)
+ {
+ //open a new transaction on the current database
+ this.Transaction = await base.Database.BeginTransactionAsync(cancellationToken);
+ }
-#pragma warning disable CA1816 // Dispose methods should call SuppressFinalize, ignore because base.Dispose() is called
///<inheritdoc/>
- public sealed override void Dispose()
+ public Task CommitTransactionAsync(CancellationToken token = default)
{
- //dispose the transaction
- Transaction?.Dispose();
- base.Dispose();
+ return Transaction != null ? Transaction.CommitAsync(token) : Task.CompletedTask;
}
///<inheritdoc/>
- public override async ValueTask DisposeAsync()
+ public Task RollbackTransctionAsync(CancellationToken token = default)
{
- //If transaction has been created, dispose the transaction
- if (Transaction != null)
+ return Transaction != null ? Transaction.RollbackAsync(token) : Task.CompletedTask;
+ }
+
+ ///<inheritdoc/>
+ IQueryable<T> IDbContextHandle.Set<T>() => base.Set<T>();
+
+ ///<inheritdoc/>
+ void IDbContextHandle.Add<T>(T entity) => base.Add(entity);
+
+ ///<inheritdoc/>
+ void IDbContextHandle.Remove<T>(T entity) => base.Remove<T>(entity);
+
+ ///<inheritdoc/>
+ public virtual void AddRange<T>(IEnumerable<T> entities) where T : class
+ {
+ DbSet<T> set = base.Set<T>();
+ set.AddRange(entities);
+ }
+
+ ///<inheritdoc/>
+ public virtual async Task<ERRNO> SaveAndCloseAsync(bool commit, CancellationToken cancellation = default)
+ {
+ //Save db changes
+ ERRNO result = await base.SaveChangesAsync(cancellation);
+ if (commit)
{
- await Transaction.DisposeAsync();
+ await CommitTransactionAsync(cancellation);
}
- await base.DisposeAsync();
+ else
+ {
+ await RollbackTransctionAsync(cancellation);
+ }
+ return result;
}
-#pragma warning restore CA1816 // Dispose methods should call SuppressFinalize
///<inheritdoc/>
- public async Task OpenTransactionAsync(CancellationToken cancellationToken = default)
+ public virtual void RemoveRange<T>(IEnumerable<T> entities) where T : class
{
- //open a new transaction on the current database
- this.Transaction = await base.Database.BeginTransactionAsync(cancellationToken);
+ DbSet<T> set = base.Set<T>();
+ set.RemoveRange(entities);
}
+#pragma warning disable CA1816 // Dispose methods should call SuppressFinalize, ignore because base.Dispose() is called
///<inheritdoc/>
- public Task CommitTransactionAsync(CancellationToken token = default)
+ public sealed override void Dispose()
{
- return Transaction != null ? Transaction.CommitAsync(token) : Task.CompletedTask;
+ //dispose the transaction
+ Transaction?.Dispose();
+ base.Dispose();
}
///<inheritdoc/>
- public Task RollbackTransctionAsync(CancellationToken token = default)
+ public override async ValueTask DisposeAsync()
{
- return Transaction != null ? Transaction.RollbackAsync(token) : Task.CompletedTask;
+ //If transaction has been created, dispose the transaction
+ if (Transaction != null)
+ {
+ await Transaction.DisposeAsync();
+ }
+ await base.DisposeAsync();
}
-
+#pragma warning restore CA1816 // Dispose methods should call SuppressFinalize
}
} \ No newline at end of file