**** Merged r40732-r40872 from MCS ****
[mono.git] / mcs / class / System.Web / System.Web.UI / DataSourceView.cs
1 //
2 // System.Web.UI.DataSourceView
3 //
4 // Authors:
5 //      Ben Maurer (bmaurer@users.sourceforge.net)
6 //      Sanjay Gupta (gsanjay@novell.com)
7 //
8 // (C) 2003 Ben Maurer
9 // (C) 2004 Novell, Inc. (http://www.novell.com)
10 //
11
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
20 // 
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 // 
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 //
32
33 #if NET_2_0
34 using System.Collections;
35 using System.Collections.Specialized;
36 using System.Text;
37 using System.ComponentModel;
38
39 namespace System.Web.UI {
40         public abstract class DataSourceView
41         {
42                 IDataSource dataSourceOwner;
43                 string viewName = String.Empty;
44
45                 [MonoTODO ("Extra method to keep things compiling")]
46                 protected DataSourceView()
47                 {                       
48                 }
49
50                 protected DataSourceView(IDataSource owner, string viewName)
51                 {
52                         this.dataSourceOwner = owner;
53                         this.viewName = viewName;
54                 }
55
56                 public virtual void Delete (IDictionary keys, IDictionary values,
57                                                 DataSourceViewOperationCallback callBack)
58                 {
59                         if (callBack == null)
60                                 throw new ArgumentNullException ("callBack");
61
62                         int rowAffected = 0;
63                         Exception passOn = null;
64                         try {
65                                 rowAffected = ExecuteDelete (keys, values);
66                         } catch (Exception e) {
67                                 passOn = e;
68                         }
69
70                         callBack (rowAffected, passOn);
71                 }
72
73                 protected virtual int ExecuteDelete(IDictionary keys, IDictionary values)
74                 {
75                         throw new NotSupportedException ();
76                 }
77
78                 protected virtual int ExecuteInsert (IDictionary keys)
79                 {
80                         throw new NotSupportedException();
81                 }
82
83                 protected internal abstract IEnumerable ExecuteSelect (
84                                         DataSourceSelectArguments arguments);
85
86                 protected virtual int ExecuteUpdate (IDictionary keys, IDictionary values, 
87                                                                 IDictionary oldValues )
88                 {
89                         throw new NotSupportedException ();
90                 }
91
92                 public virtual void Insert (IDictionary values, 
93                                         DataSourceViewOperationCallback callBack)
94                 {
95                         if (callBack == null)
96                                 throw new ArgumentNullException("callBack");
97
98                         int rowAffected = 0;
99                         Exception passOn = null;
100                         try {
101                                 rowAffected = ExecuteInsert (values);
102                         } catch (Exception e) {
103                                 passOn = e;
104                         }
105
106                         callBack (rowAffected, passOn);
107                 }
108
109                 protected virtual void OnDataSourceViewChanged (EventArgs eventArgs)
110                 {
111                         EventHandler evtHandler = eventsList [EventDataSourceViewChanged] as EventHandler;
112                         if (evtHandler != null)
113                                 evtHandler(this, eventArgs);
114                 }
115                 
116                 protected internal virtual void RaiseUnsupportedCapabilityError (
117                                                 DataSourceCapabilities capability)
118                 {
119                         if ((capability & DataSourceCapabilities.Sort) != 0)
120                                 if (!CanSort)
121                                         throw new NotSupportedException ("Sort Capabilites");
122
123                         if ((capability & DataSourceCapabilities.Page) != 0)
124                                 if (!CanPage)
125                                         throw new NotSupportedException("Page Capabilites");
126
127                         if ((capability & DataSourceCapabilities.RetrieveTotalRowCount) != 0)
128                                 if (!CanRetrieveTotalRowCount)
129                                         throw new NotSupportedException("RetrieveTotalRowCount Capabilites");
130
131                         return;
132                 }
133
134                 public virtual void Select (DataSourceSelectArguments selectArgs,
135                                                 DataSourceViewSelectCallback callBack)
136                 {
137                         if (callBack == null)
138                                 throw new ArgumentNullException("callBack");
139
140                         selectArgs.RaiseUnsupportedCapabilitiesError (this);
141                         
142                         IEnumerable selectList = ExecuteSelect (selectArgs);
143                         callBack (selectList);
144                 }
145
146                 public virtual int Update(IDictionary keys, IDictionary values,
147                         IDictionary oldValues, DataSourceViewOperationCallback callBack)
148                 {
149                         if (callBack == null)
150                                 throw new ArgumentNullException ("callBack");
151
152                         int rowAffected = 0;
153                         Exception passOn = null;
154                         try {
155                                 rowAffected = ExecuteUpdate (keys, values, oldValues);
156                         } catch (Exception e) {
157                                 passOn = e;
158                         }
159
160                         callBack (rowAffected, passOn);
161                         return rowAffected;
162                 } 
163                 
164                 public virtual bool CanDelete { get { return false; } }
165                 public virtual bool CanInsert { get { return false; } }
166                 public virtual bool CanPage { get { return false; } }
167                 public virtual bool CanRetrieveTotalRowCount { get { return false; } }
168                 public virtual bool CanSort { get { return false; } }
169                 public virtual bool CanUpdate { get { return false; } }
170
171                 EventHandlerList eventsList;
172                 protected EventHandlerList Events {
173                         get {
174                                 if (eventsList == null)
175                                         eventsList = new EventHandlerList();
176
177                                 return eventsList;
178                         }
179                 }
180                 
181                 internal bool HasEvents ()
182                 {
183                         return eventsList != null;
184                 }
185
186                 public virtual string Name { 
187                         get { return viewName; } 
188                 }
189
190                 static readonly object EventDataSourceViewChanged = new object ();
191                                 
192                 public event EventHandler DataSourceViewChanged
193                 {
194                         add { Events.AddHandler (EventDataSourceViewChanged, value); }
195                         remove { Events.RemoveHandler (EventDataSourceViewChanged, value); }
196                 }
197                 
198         }
199         
200 }
201 #endif
202