-
Notifications
You must be signed in to change notification settings - Fork 934
/
Copy pathReplicationMode.cs
140 lines (124 loc) · 4.24 KB
/
ReplicationMode.cs
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
using System;
using System.Collections;
using NHibernate.Type;
namespace NHibernate
{
/// <summary>
/// Represents a replication strategy
/// </summary>
public abstract class ReplicationMode
{
private readonly int code;
private readonly string name;
private static readonly IDictionary Instances = new Hashtable();
/// <summary>
///
/// </summary>
/// <param name="level"></param>
/// <param name="name"></param>
public ReplicationMode(int level, string name)
{
this.code = level;
this.name = name;
}
/// <summary>
///
/// </summary>
/// <param name="entity"></param>
/// <param name="currentVersion"></param>
/// <param name="newVersion"></param>
/// <param name="versionType"></param>
/// <returns></returns>
public abstract bool ShouldOverwriteCurrentVersion(object entity, object currentVersion, object newVersion,
IVersionType versionType);
/// <summary></summary>
public static readonly ReplicationMode Exception = new ExceptionReplicationMode(0, "EXCEPTION");
private sealed class ExceptionReplicationMode : ReplicationMode
{
public ExceptionReplicationMode(int level, string name) : base(level, name)
{
}
/// <summary>
/// Throw an exception when a row already exists
/// </summary>
/// <param name="entity"></param>
/// <param name="currentVersion"></param>
/// <param name="newVersion"></param>
/// <param name="versionType"></param>
/// <returns></returns>
public override bool ShouldOverwriteCurrentVersion(object entity, object currentVersion, object newVersion,
IVersionType versionType)
{
throw new NotSupportedException("should not be called");
}
}
/// <summary></summary>
public static readonly ReplicationMode Ignore = new IgnoreReplicationMode(1, "IGNORE");
private sealed class IgnoreReplicationMode : ReplicationMode
{
public IgnoreReplicationMode(int level, string name) : base(level, name)
{
}
/// <summary>
/// Ignore replicated entities when a row already exists
/// </summary>
/// <param name="entity"></param>
/// <param name="currentVersion"></param>
/// <param name="newVersion"></param>
/// <param name="versionType"></param>
/// <returns></returns>
public override bool ShouldOverwriteCurrentVersion(object entity, object currentVersion, object newVersion,
IVersionType versionType)
{
return false;
}
}
/// <summary></summary>
public static readonly ReplicationMode Overwrite = new OverwriteReplicationMode(3, "OVERWRITE");
private sealed class OverwriteReplicationMode : ReplicationMode
{
public OverwriteReplicationMode(int level, string name) : base(level, name)
{
}
/// <summary>
/// Overwrite existing rows when a row already exists
/// </summary>
/// <param name="entity"></param>
/// <param name="currentVersion"></param>
/// <param name="newVersion"></param>
/// <param name="versionType"></param>
/// <returns></returns>
public override bool ShouldOverwriteCurrentVersion(object entity, object currentVersion, object newVersion,
IVersionType versionType)
{
return true;
}
}
/// <summary></summary>
public static readonly ReplicationMode LatestVersion = new LatestVersionReplicationMode(2, "LATEST_VERSION");
private sealed class LatestVersionReplicationMode : ReplicationMode
{
public LatestVersionReplicationMode(int level, string name) : base(level, name)
{
}
/// <summary>
/// When a row already exists, choose the latest version
/// </summary>
/// <param name="entity"></param>
/// <param name="currentVersion"></param>
/// <param name="newVersion"></param>
/// <param name="versionType"></param>
/// <returns></returns>
public override bool ShouldOverwriteCurrentVersion(object entity, object currentVersion, object newVersion,
IVersionType versionType)
{
if (versionType == null)
{
// always overwrite nonversioned data
return true;
}
return versionType.Comparator.Compare(currentVersion, newVersion) <= 0;
}
}
}
}