-
Notifications
You must be signed in to change notification settings - Fork 248
Expand file tree
/
Copy pathOracleDistributedReaderWriterLock.cs
More file actions
68 lines (60 loc) · 3.45 KB
/
Copy pathOracleDistributedReaderWriterLock.cs
File metadata and controls
68 lines (60 loc) · 3.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using Medallion.Threading.Internal;
using Medallion.Threading.Internal.Data;
using System.Data;
namespace Medallion.Threading.Oracle;
/// <summary>
/// Implements an upgradeable distributed reader-writer lock for the Oracle database using the DBMS_LOCK package.
/// </summary>
public sealed partial class OracleDistributedReaderWriterLock : IInternalDistributedUpgradeableReaderWriterLock<OracleDistributedReaderWriterLockHandle, OracleDistributedReaderWriterLockUpgradeableHandle>
{
private readonly IDbDistributedLock _internalLock;
/// <summary>
/// Constructs a new lock using the provided <paramref name="name"/>.
///
/// The provided <paramref name="connectionString"/> will be used to connect to the database.
///
/// Unless <paramref name="exactName"/> is specified, <paramref name="name"/> will be escaped/hashed to ensure name validity.
/// </summary>
public OracleDistributedReaderWriterLock(string name, string connectionString, Action<OracleConnectionOptionsBuilder>? options = null, bool exactName = false)
: this(name, exactName, n => OracleDistributedLock.CreateInternalLock(n, connectionString, options))
{
}
/// <summary>
/// Constructs a new lock using the provided <paramref name="name"/>.
///
/// The provided <paramref name="connection"/> will be used to connect to the database and will provide lock scope. It is assumed to be externally managed and
/// will not be opened or closed.
///
/// Unless <paramref name="exactName"/> is specified, <paramref name="name"/> will be escaped/hashed to ensure name validity.
/// </summary>
public OracleDistributedReaderWriterLock(string name, IDbConnection connection, bool exactName = false)
: this(name, exactName, n => OracleDistributedLock.CreateInternalLock(n, connection))
{
}
private OracleDistributedReaderWriterLock(string name, bool exactName, Func<string, IDbDistributedLock> internalLockFactory)
{
this.Name = OracleDistributedLock.GetName(name, exactName);
this._internalLock = internalLockFactory(this.Name);
}
/// <summary>
/// Implements <see cref="IDistributedLock.Name"/>
/// </summary>
public string Name { get; }
async ValueTask<OracleDistributedReaderWriterLockUpgradeableHandle?> IInternalDistributedUpgradeableReaderWriterLock<OracleDistributedReaderWriterLockHandle, OracleDistributedReaderWriterLockUpgradeableHandle>.InternalTryAcquireUpgradeableReadLockAsync(
TimeoutValue timeout,
CancellationToken cancellationToken)
{
var innerHandle = await this._internalLock
.TryAcquireAsync(timeout, OracleDbmsLock.UpdateLock, cancellationToken, contextHandle: null).ConfigureAwait(false);
return innerHandle != null ? new OracleDistributedReaderWriterLockUpgradeableHandle(innerHandle, this._internalLock) : null;
}
async ValueTask<OracleDistributedReaderWriterLockHandle?> IInternalDistributedReaderWriterLock<OracleDistributedReaderWriterLockHandle>.InternalTryAcquireAsync(
TimeoutValue timeout,
CancellationToken cancellationToken,
bool isWrite)
{
var innerHandle = await this._internalLock
.TryAcquireAsync(timeout, isWrite ? OracleDbmsLock.ExclusiveLock : OracleDbmsLock.SharedLock, cancellationToken, contextHandle: null).ConfigureAwait(false);
return innerHandle != null ? new OracleDistributedReaderWriterLockNonUpgradeableHandle(innerHandle) : null;
}
}