2006-02-17 Chris Toshok <toshok@ximian.com>
[mono.git] / mcs / class / System.Data / System.Data / Constraint.cs
1 //
2 // System.Data.Constraint.cs
3 //
4 // Author:
5 //      Franklin Wise <gracenote@earthlink.net>
6 //      Daniel Morgan
7 //      Tim Coleman (tim@timcoleman.com)
8 //   
9 //
10 // (C) Ximian, Inc. 2002
11 // Copyright (C) Tim Coleman, 2002
12 //
13
14 //
15 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
16 //
17 // Permission is hereby granted, free of charge, to any person obtaining
18 // a copy of this software and associated documentation files (the
19 // "Software"), to deal in the Software without restriction, including
20 // without limitation the rights to use, copy, modify, merge, publish,
21 // distribute, sublicense, and/or sell copies of the Software, and to
22 // permit persons to whom the Software is furnished to do so, subject to
23 // the following conditions:
24 // 
25 // The above copyright notice and this permission notice shall be
26 // included in all copies or substantial portions of the Software.
27 // 
28 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
29 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
30 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
31 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
32 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
33 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
34 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 //
36
37 using System;
38 using System.Collections;
39 using System.ComponentModel;
40 using System.Runtime.InteropServices;
41 using System.Runtime.Serialization;
42 using System.Data.Common;
43
44 namespace System.Data {
45         [Serializable]
46         internal delegate void DelegateConstraintNameChange (object sender, string newName);
47
48         [DefaultProperty ("ConstraintName")]    
49 #if !NET_2_0
50         [Serializable]
51 #endif
52         [TypeConverterAttribute (typeof (ConstraintConverter))]
53         public abstract class Constraint 
54         {
55                 internal event DelegateConstraintNameChange BeforeConstraintNameChange;
56
57                 //if constraintName is not set then a name is 
58                 //created when it is added to
59                 //the ConstraintCollection
60                 //it can not be set to null, empty or duplicate
61                 //once it has been added to the collection
62                 private string _constraintName;
63                 private PropertyCollection _properties;
64
65                 private Index _index;
66
67                 //Used for membership checking
68                 private ConstraintCollection _constraintCollection;
69
70                 DataSet dataSet;
71
72                 protected Constraint () 
73                 {
74                         dataSet = null;
75                         _properties = new PropertyCollection();
76                 }
77
78                 [CLSCompliant (false)]
79                 protected internal virtual DataSet _DataSet {
80                         get { return dataSet; }
81                 }
82
83                 [DataCategory ("Data")]
84                 [DataSysDescription ("Indicates the name of this constraint.")]
85                 [DefaultValue ("")]
86                 public virtual string ConstraintName {
87                         get{ return _constraintName == null ? "" : _constraintName; } 
88                         set{
89                                 //This should only throw an exception when it
90                                 //is a member of a ConstraintCollection which
91                                 //means we should let the ConstraintCollection
92                                 //handle exceptions when this value changes
93                                 _onConstraintNameChange(value);
94                                 _constraintName = value;
95                         }
96                 }
97
98                 [Browsable (false)]
99                 [DataCategory ("Data")]
100                 [DataSysDescription ("The collection that holds custom user information.")]
101                 public PropertyCollection ExtendedProperties {
102                         get { return _properties; }
103                 }
104
105                 [DataSysDescription ("Indicates the table of this constraint.")]
106                 public abstract DataTable Table {
107                         get;
108                 }
109
110                 internal ConstraintCollection ConstraintCollection {
111                         get{ return _constraintCollection; }
112                         set{ _constraintCollection = value; }
113                 }
114                 
115                 private void _onConstraintNameChange (string newName)
116                 {
117                         if (null != BeforeConstraintNameChange)
118                         {
119                                 BeforeConstraintNameChange (this, newName);
120                         }
121                 }
122
123                 //call once before adding a constraint to a collection
124                 //will throw an exception to prevent the add if a rule is broken
125                 internal abstract void AddToConstraintCollectionSetup (ConstraintCollection collection);
126                                         
127                 internal abstract bool IsConstraintViolated ();
128                 
129                 internal static void ThrowConstraintException(){
130                         throw new ConstraintException("Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints.");
131                 }
132
133                 internal void AssertConstraint() {
134                         if (IsConstraintViolated())
135                                 ThrowConstraintException();
136                 }
137
138                 internal abstract void AssertConstraint(DataRow row);
139
140                 internal virtual void RollbackAssert (DataRow row)
141                 {
142                 }
143
144                 //call once before removing a constraint to a collection
145                 //can throw an exception to prevent the removal
146                 internal abstract void RemoveFromConstraintCollectionCleanup (ConstraintCollection collection);
147
148                 [MonoTODO]
149                 protected void CheckStateForProperty ()
150                 {
151                         throw new NotImplementedException ();
152                 }
153
154                 protected internal void SetDataSet (DataSet dataSet)
155                 {
156                         this.dataSet = dataSet;
157                 }
158
159                 internal Index Index
160                 {
161                         get {
162                                 return _index;
163                         }
164                         set {
165                                 if (_index != null) {
166                                         _index.RemoveRef();
167                                         Table.DropIndex(_index);
168                                 }
169
170                                 _index = value;
171
172                                 if (_index != null) {
173                                         _index.AddRef();
174                                 }
175                         }
176                 }
177
178                 internal abstract bool IsColumnContained(DataColumn column);
179                 internal abstract bool CanRemoveFromCollection(ConstraintCollection col, bool shouldThrow);
180
181                 /// <summary>
182                 /// Gets the ConstraintName, if there is one, as a string. 
183                 /// </summary>
184                 public override string ToString () 
185                 {
186                         return _constraintName == null ? "" : _constraintName;
187                 }
188
189         }
190 }